14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/ruby_llm/providers/openrouter/models.rb', line 14
def parse_list_models_response(response, slug, _capabilities)
Array(response.body['data']).map do |model_data|
modalities = {
input: Array(model_data.dig('architecture', 'input_modalities')),
output: Array(model_data.dig('architecture', 'output_modalities'))
}
pricing = { text_tokens: { standard: {} } }
pricing_types = {
prompt: :input_per_million,
completion: :output_per_million,
input_cache_read: :cached_input_per_million,
internal_reasoning: :reasoning_output_per_million
}
pricing_types.each do |source_key, target_key|
value = model_data.dig('pricing', source_key.to_s).to_f
pricing[:text_tokens][:standard][target_key] = value * 1_000_000 if value.positive?
end
capabilities = supported_parameters_to_capabilities(model_data['supported_parameters'])
Model::Info.new(
id: model_data['id'],
name: model_data['name'],
provider: slug,
family: model_data['id'].split('/').first,
created_at: model_data['created'] ? Time.at(model_data['created']) : nil,
context_window: model_data['context_length'],
max_output_tokens: model_data.dig('top_provider', 'max_completion_tokens'),
modalities: modalities,
capabilities: capabilities,
pricing: pricing,
metadata: {
description: model_data['description'],
architecture: model_data['architecture'],
top_provider: model_data['top_provider'],
per_request_limits: model_data['per_request_limits'],
supported_parameters: model_data['supported_parameters']
}
)
end
end
|