Module: ActiveHarness::Pricing::ModelsDev
- Defined in:
- lib/active_harness/pricing/models_dev.rb
Overview
Fallback pricing source — fetches model data from models.dev.
Data source:
{project_root}/tmp/active_harness/pricing_models_dev.json — fetched cache (24h TTL)
Returns nil/empty if cache is missing and network is unavailable.
Usage:
Pricing::ModelsDev.find("gpt-4o")
Pricing::ModelsDev.all
Pricing::ModelsDev.update
Constant Summary collapse
- MODELS_DEV_URL =
"https://models.dev/api.json"- MEMORY_TTL =
3 days
3 * 86_400
- MODELS_DEV_PROVIDER_MAP =
{ "openai" => "openai", "anthropic" => "anthropic", "google" => "gemini", "google-vertex" => "vertexai", "amazon-bedrock" => "bedrock", "deepseek" => "deepseek", "mistral" => "mistral", "openrouter" => "openrouter", "perplexity" => "perplexity", "xai" => "xai", "groq" => "groq", "azure" => "azure" }.freeze
Class Method Summary collapse
- .all ⇒ Object
-
.available_providers ⇒ Object
Returns all providers known to this gem.
- .available_providers=(list) ⇒ Object
- .cache_file ⇒ Object
- .find(model_id) ⇒ Object
- .for_provider(name) ⇒ Object
-
.preload! ⇒ Object
Fetches fresh data from models.dev, writes to cache file, loads into memory.
- .provider_names ⇒ Object
- .providers ⇒ Object
- .reload! ⇒ Object
- .update ⇒ Object
Class Method Details
.all ⇒ Object
39 40 41 42 |
# File 'lib/active_harness/pricing/models_dev.rb', line 39 def all ensure_fresh_registry registry.map { |raw| build_cost(raw) } end |
.available_providers ⇒ Object
Returns all providers known to this gem. Can be overridden by assigning an explicit list:
ActiveHarness::Pricing::ModelsDev.available_providers = %w[openai anthropic]
103 104 105 |
# File 'lib/active_harness/pricing/models_dev.rb', line 103 def available_providers @available_providers ||= MODELS_DEV_PROVIDER_MAP.values.uniq end |
.available_providers=(list) ⇒ Object
107 108 109 |
# File 'lib/active_harness/pricing/models_dev.rb', line 107 def available_providers=(list) @available_providers = list end |
.cache_file ⇒ Object
96 97 98 |
# File 'lib/active_harness/pricing/models_dev.rb', line 96 def cache_file File.join(project_root, "tmp", "active_harness", "models_dev_pricing.json") end |
.find(model_id) ⇒ Object
44 45 46 47 48 |
# File 'lib/active_harness/pricing/models_dev.rb', line 44 def find(model_id) ensure_fresh_registry raw = registry.find { |m| m[:id] == model_id.to_s } raw ? build_cost(raw) : nil end |
.for_provider(name) ⇒ Object
54 55 56 57 58 59 |
# File 'lib/active_harness/pricing/models_dev.rb', line 54 def for_provider(name) ensure_fresh_registry registry .select { |m| m[:provider] == name.to_s } .map { |m| build_cost(m) } end |
.preload! ⇒ Object
Fetches fresh data from models.dev, writes to cache file, loads into memory. Called automatically when memory is stale. Can also be called explicitly.
70 71 72 73 74 75 76 77 78 |
# File 'lib/active_harness/pricing/models_dev.rb', line 70 def preload! update rescue StandardError nil ensure @registry = load_registry @loaded_at = @registry.empty? ? nil : Time.now @provider_names = nil end |
.provider_names ⇒ Object
61 62 63 64 65 66 |
# File 'lib/active_harness/pricing/models_dev.rb', line 61 def provider_names @provider_names ||= begin ensure_fresh_registry registry.map { |m| m[:provider] }.uniq.sort end end |
.providers ⇒ Object
50 51 52 |
# File 'lib/active_harness/pricing/models_dev.rb', line 50 def providers @providers_proxy ||= Pricing::ProvidersProxy.new(self) end |
.reload! ⇒ Object
89 90 91 92 93 94 |
# File 'lib/active_harness/pricing/models_dev.rb', line 89 def reload! @registry = nil @loaded_at = nil @provider_names = nil nil end |
.update ⇒ Object
80 81 82 83 84 85 86 87 |
# File 'lib/active_harness/pricing/models_dev.rb', line 80 def update raw_api = fetch_models_dev models = extract_models(raw_api) FileUtils.mkdir_p(File.dirname(cache_file)) File.write(cache_file, JSON.generate(models)) models.size end |