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"
CACHE_TTL =
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

Class Method Details

.allObject



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_providersObject



89
90
91
92
93
94
95
96
# File 'lib/active_harness/pricing/models_dev.rb', line 89

def available_providers
  @available_providers ||= begin
    providers_dir = File.expand_path("../providers", __dir__)
    Dir.glob("#{providers_dir}/*.rb")
      .map { |f| File.basename(f, ".rb") }
      .reject { |n| %w[base custom].include?(n) }
  end
end

.cache_fileObject



85
86
87
# File 'lib/active_harness/pricing/models_dev.rb', line 85

def cache_file
  File.join(project_root, "tmp", "active_harness", "pricing_models_dev.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

.provider_namesObject



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

.providersObject



50
51
52
# File 'lib/active_harness/pricing/models_dev.rb', line 50

def providers
  @providers_proxy ||= Pricing::ProvidersProxy.new(self)
end

.reload!Object



79
80
81
82
83
# File 'lib/active_harness/pricing/models_dev.rb', line 79

def reload!
  @registry       = nil
  @provider_names = nil
  nil
end

.updateObject



68
69
70
71
72
73
74
75
76
77
# File 'lib/active_harness/pricing/models_dev.rb', line 68

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))

  reload!
  models.size
end