Class: LittleGhost::Models::Catalog::ModelsDevSource

Inherits:
Source
  • Object
show all
Defined in:
lib/little_ghost/models/catalog/models_dev_source.rb

Overview

Refreshes normalized facts from the public models.dev catalog.

Constant Summary collapse

URL =

:nodoc:

URI("https://models.dev/api.json")
NAMESPACES =

:nodoc:

{ # :nodoc:
  "openai" => "openai", "openrouter" => "openrouter", "anthropic" => "anthropic",
  "gemini" => "google", "vertex_ai" => "google-vertex", "bedrock" => "amazon-bedrock"
}.freeze

Constants inherited from Source

Source::DEFAULT_ATTRIBUTE_MERGE_STRATEGIES

Instance Attribute Summary

Attributes inherited from Source

#name

Instance Method Summary collapse

Methods inherited from Source

#attribute_merge_strategies

Constructor Details

#initialize(provider_adapters:) ⇒ ModelsDevSource

Creates a source that maps application provider names to adapters.



20
21
22
23
# File 'lib/little_ghost/models/catalog/models_dev_source.rb', line 20

def initialize(provider_adapters:)
  super(name: "models.dev")
  @provider_adapters = provider_adapters.to_h.transform_keys(&:to_s)
end

Instance Method Details

#refresh(target: nil) ⇒ Object

Fetches normalized model facts, optionally for one canonical target.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/little_ghost/models/catalog/models_dev_source.rb', line 26

def refresh(target: nil)
  document = JSON.parse(
    Support::HTTPClient.new(open_timeout: 5, read_timeout: 30, max_response_bytes: MAX_CATALOG_BYTES)
      .request(uri: URL)
  )
  providers = target ? [target.provider] : @provider_adapters.keys
  providers.each_with_object({}) do |provider, result|
    namespace = NAMESPACES[@provider_adapters[provider]]
    next unless namespace && document[namespace]

    models = document.fetch(namespace).fetch("models")
    selected = target ? models.slice(target.model_id) : models
    selected.each { |id, value| result["#{provider}:#{id}"] = normalize(value) }
  end
rescue JSON::ParserError, KeyError => error
  raise ProviderError, "models.dev returned an invalid catalog: #{error.message}"
end