From 54ae4f50fa43a961cc21efeaf4f39ed0b784c3d5 Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 11 Nov 2025 13:10:20 -0500 Subject: [PATCH 01/52] First pass --- canonical_mapping_report.json | 4170 +++++++++++++++++ .../goose/examples/canonical_model_checker.rs | 307 ++ crates/goose/src/providers/base.rs | 7 + .../goose/src/providers/canonical/README.md | 115 + .../providers/canonical/canonical_models.json | 58 + crates/goose/src/providers/canonical/mod.rs | 31 + crates/goose/src/providers/canonical/model.rs | 152 + .../goose/src/providers/canonical/registry.rs | 125 + crates/goose/src/providers/mod.rs | 1 + 9 files changed, 4966 insertions(+) create mode 100644 canonical_mapping_report.json create mode 100644 crates/goose/examples/canonical_model_checker.rs create mode 100644 crates/goose/src/providers/canonical/README.md create mode 100644 crates/goose/src/providers/canonical/canonical_models.json create mode 100644 crates/goose/src/providers/canonical/mod.rs create mode 100644 crates/goose/src/providers/canonical/model.rs create mode 100644 crates/goose/src/providers/canonical/registry.rs diff --git a/canonical_mapping_report.json b/canonical_mapping_report.json new file mode 100644 index 000000000000..48eff69eceb4 --- /dev/null +++ b/canonical_mapping_report.json @@ -0,0 +1,4170 @@ +{ + "timestamp": "2025-11-10T18:00:30.074725+00:00", + "unmapped_models": [ + { + "provider": "openai", + "model": "ada:ft-square-2023-01-20-06-09-37" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-03-22-57-10" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-03-23-17-02" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-03-23-39-19" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-00-06-28" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-00-26-44" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-04-45" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-25-59" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-35-31" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-49-59" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-52-25" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-53-11" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-54-49" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-56-59" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-58-41" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-00-26" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-02-17" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-03-39" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-05-16" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-06-44" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-08-18" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-22-05-09-46" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-22-05-27-21" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-17-40-56" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-19-20-20" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-19-35-21" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-21-26-06" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-01-19-58-17" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-02-11-40-22" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-02-16-01-19" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-06-11-43-24" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-04-05-18-59-44" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-06-14-21-43-36" + }, + { + "provider": "openai", + "model": "ada:ft-square:ada-fine-tuned-pb-books-2023-06-10-01-41-30" + }, + { + "provider": "openai", + "model": "ada:ft-square:get-classify-test-1-2023-03-01-22-20-54" + }, + { + "provider": "openai", + "model": "ada:ft-square:get-classify-test-2-2023-03-01-23-00-30" + }, + { + "provider": "openai", + "model": "ada:ft-square:latha-2023-06-07-06-56-00" + }, + { + "provider": "openai", + "model": "ada:ft-square:mcc-from-items-2023-03-09-23-20-33" + }, + { + "provider": "openai", + "model": "ada:ft-square:mcc-from-items-2023-03-10-02-02-01" + }, + { + "provider": "openai", + "model": "ada:ft-square:sq-interview-rubrics-2023-03-01-23-25-00" + }, + { + "provider": "openai", + "model": "ada:ft-square:test-2023-06-07-07-05-04" + }, + { + "provider": "openai", + "model": "babbage-002" + }, + { + "provider": "openai", + "model": "babbage:ft-square-2023-02-28-14-48-38" + }, + { + "provider": "openai", + "model": "chatgpt-4o-latest" + }, + { + "provider": "openai", + "model": "codex-mini-latest" + }, + { + "provider": "openai", + "model": "computer-use-preview" + }, + { + "provider": "openai", + "model": "computer-use-preview-2025-03-11" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-01-04-00-17-01" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-20-54-03" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-22-00-22" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-12-33" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-38-15" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-50-25" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-56-35" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-04-00-10-16" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-04-00-30-47" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-04-01-10-58" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-14-03-10-35" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-14-05-13-05" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-12-25-24" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-13-42-34" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-16-41-35" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-18-12-55" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-27-22-00-27" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-28-12-28-40" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-28-16-08-29" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-28-23-14-48" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-02-01-48-30" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-02-13-12-20" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-02-16-17-24" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-06-14-16-22" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-09-04-37-07" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-04-05-19-33-31" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-04-05-23-44-20" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-05-01-19-30-51" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-05-02-16-19-15" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-08-20-11-11" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-12-14-33-09" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-22-55-22" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-23-23-37" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-23-25-31" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-23-37-23" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-15-14-24-56" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-15-15-16-31" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-15-15-21-41" + }, + { + "provider": "openai", + "model": "curie:ft-square:andrewbyers-iso-dates-2-2023-06-09-19-23-52" + }, + { + "provider": "openai", + "model": "curie:ft-square:andrewbyers-iso-dates-2023-06-09-16-22-54" + }, + { + "provider": "openai", + "model": "curie:ft-square:bartosz-2023-06-15-16-50-00" + }, + { + "provider": "openai", + "model": "curie:ft-square:bartosz-2023-06-15-17-40-30" + }, + { + "provider": "openai", + "model": "dall-e-2" + }, + { + "provider": "openai", + "model": "dall-e-3" + }, + { + "provider": "openai", + "model": "davinci-002" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-01-31-46" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-01-35-06" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-01-38-32" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-19-52-40" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-19-56-06" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-19-58-46" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-02-03" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-05-47" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-11-53" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-15-38" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-24-18-22-49" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-19-06-04" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-20-03-10" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-20-43-03" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-21-15-51" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-21-56-57" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-23-00-36" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-28-15-35-39" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-28-22-02-29" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-01-34-16" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-04-50-27" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-21-52-35" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-23-53-42" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-06-29-26" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-07-43-23" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-08-33-27" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-09-27-04" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-19-42-43" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-34-00" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-40-51" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-46-02" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-54-35" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-03-01-26-16" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-06-07-40-58" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-05-02-17-37-42" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-06-03-01-27-58" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-06-03-02-41-38" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-06-04-20-17-25" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-07-31-06-04-37" + }, + { + "provider": "openai", + "model": "davinci:ft-square:conversational-ordering-2023-03-01-03-35-26" + }, + { + "provider": "openai", + "model": "davinci:ft-square:conversational-ordering-2023-03-01-19-34-59" + }, + { + "provider": "openai", + "model": "davinci:ft-square:martech-fox-2023-07-03-12-08-51" + }, + { + "provider": "openai", + "model": "davinci:ft-square:ppg-1-2023-03-03-22-44-53" + }, + { + "provider": "openai", + "model": "davinci:ft-square:ppg-2-2023-03-04-00-09-06" + }, + { + "provider": "openai", + "model": "davinci:ft-square:product-descriptions-1-2023-02-18-02-01-38" + }, + { + "provider": "openai", + "model": "davinci:ft-square:product-descriptions-2023-02-18-01-37-53" + }, + { + "provider": "openai", + "model": "davinci:ft-square:sq-interview-rubrics-2023-03-01-06-12-57" + }, + { + "provider": "openai", + "model": "davinci:ft-square:test-2023-06-02-21-46-09" + }, + { + "provider": "openai", + "model": "davinci:ft-square:test-2023-06-07-07-18-50" + }, + { + "provider": "openai", + "model": "davinci:ft-square:testmodel-2023-06-09-06-33-46" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::979OeECc" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::979X87hI" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::979tUAKY" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ6utW" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ962b:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ9TI9:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ9yXw:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9f7y6Fq3:ckpt-step-132" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9f7y6d94:ckpt-step-66" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9f7y6tDo" + }, + { + "provider": "openai", + "model": "ft:davinci-002:square::8IHIFNF8" + }, + { + "provider": "openai", + "model": "ft:davinci-002:square::979av0Ca" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdO7p4k" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdO9dyB:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdOAZhy:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdOAzyd:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdjnxSh" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9Bdjq2HN:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdjqEL2:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdjqWL2:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYL14U" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYOIYz:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYOe1X:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYPJjH:ckpt-step-1593" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9dWw13R5:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9dWw21NB:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9dWw2Jmx" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9w2wKEHK:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9w2wKRUk" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9w2wKfxt:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wDsxF0M:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wDsxJU5" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wDsxcuJ:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wLTi98n:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wLTiHPk:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wLTiuf3" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A1oa308p:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A1oa4UVH:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A1oa4fY2" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A21LQ3B7:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A21LQjft:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A21LRYaU" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F6X0tu:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F6XYh7:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F6YGI4" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F7A46A:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F7AHaO:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F7AoD8" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIOxNBa" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIOxtLv:ckpt-step-499" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIOxz40:ckpt-step-998" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIbgGdy" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDM8mQGM" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDQoyuDs" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BPmNgoWc:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BPmNj3MY:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BPmNkBwY" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square:regex-generator:BV3pHd69" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square:regex-generator:BV3pHfFP:ckpt-step-608" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square:regex-generator:BV3pHz34:ckpt-step-304" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613:square::7xkXhz2F" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613:square:recipe-ner:8m9bUTJB" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square::8INlSFiD" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square::8IittuHW" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square::8VQq2h9i" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:presale-prod-update:A1VCz1Ng:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:presale-prod-update:A1VCz1dF" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:presale-prod-update:A1VCzSam:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9esUGGea:ckpt-step-1522" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9esUGnko" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f8il0PV" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f8iljLm:ckpt-step-1611" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f9O9vmz:ckpt-step-751" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f9OA72b:ckpt-step-1502" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f9OAsBX" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fAO711i:ckpt-step-753" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fAO71NV" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fAO7nhv:ckpt-step-1506" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fB61NQG" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fB61ZZn:ckpt-step-1520" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fB61cPW:ckpt-step-760" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fCbI5U9" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fCbICqK:ckpt-step-761" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-pm-35:9djnKK85:ckpt-step-1533" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-pm-35:9djnL0G0" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpIi1ah" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpIlVui:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpIle5X:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpImGbJ:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERwrnZ" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERyuVp:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERz6l4:ckpt-step-1593" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERzjIk:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9dWi6cve:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9dWi7AH4" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9dWi7d0k:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wGGcJwE:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wGGceZ1:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wGGcsCI" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wLlEcBS:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wLlFM71" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wLlFtmK:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wP6wXmY:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wP6xJ7K" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wP6xUW9:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9yR6Pmck:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9yR6Q01x" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9yR6QRCI:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9ySoC7vZ" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9ySoC9RL:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9ySoCHH9:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::A1os36ZY:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::A1os3SzM:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::A1os4RF0" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:g11n-helper:ALxGZf5Y:ckpt-step-54" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:g11n-helper:ALxGaifK:ckpt-step-72" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:g11n-helper:ALxGasbI" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:presale-prod-update:A1VkM3KW:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:presale-prod-update:A1VkMPxN:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:presale-prod-update:A1VkMugi" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9a8eE6A4:ckpt-step-763" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9a8eEWdX" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9a8eEkGS:ckpt-step-1526" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9aDzHMdR:ckpt-step-3054" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9aDzHdca:ckpt-step-1527" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9aDzI3c1" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9ckg06KE:ckpt-step-70636" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9ckg06yx:ckpt-step-35318" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9ckg1W41" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:hotel-sys-design:Bn8TRXx7:ckpt-step-77" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:hotel-sys-design:Bn8TSnvc" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:hotel-sys-design:Bn8TSuqu:ckpt-step-88" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:picasso-tbl:Be4ohJ5c:ckpt-step-555" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:picasso-tbl:Be4okWcV" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:picasso-tbl:Be4okcLm:ckpt-step-1110" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BmTIcrto:ckpt-step-666" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BmTIfHgD" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BmTIfv3N:ckpt-step-1332" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BwjlIHbe" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BwjlIMor:ckpt-step-1018" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-nano-2025-04-14:square:qliao-plathelp-v1:CRNAywx8" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eTWHHtG" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eTWHI2d:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eTWHWR7:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eoDA1QR:ckpt-step-32" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eoDARki" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eoDAkYo:ckpt-step-64" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eqA79i0:ckpt-step-59" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eqA8TBe:ckpt-step-118" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eqA8pCn" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9hgDsAHH:ckpt-step-66" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9hgDsHOi:ckpt-step-132" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9hgDtDpP" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9yPneKZF:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9yPnf26m:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9yPnfZ3w" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi-golang:9smel7hl:ckpt-step-434" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi-golang:9smelXOJ" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi-golang:9smeltpg:ckpt-step-217" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi:9sjuwq38:ckpt-step-505" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi:9sjux561" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi:9sjuxLbk:ckpt-step-1010" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e48jPvC:ckpt-step-1510" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e48kfSc" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e4FyHOk:ckpt-step-528" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e4FzikM:ckpt-step-1056" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e4Fzzq8" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e6FlhBM" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e6Flnjr:ckpt-step-1526" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e8EgHNk" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e8Egd2H:ckpt-step-1526" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9ePrc2Qr" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9ePrcUgW:ckpt-step-1524" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eSm4CmX:ckpt-step-1513" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eSm4Nvi" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eVTYdgL:ckpt-step-1513" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eVTZNWy" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9ellv805:ckpt-step-812" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9ellvsEx" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gCyNcoZ:ckpt-step-753" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gCyOII4" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gCyOTcP:ckpt-step-1506" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gEX8El2:ckpt-step-1552" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gEX9ft2" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmas:9eq84If3" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmas:9eq84hU9:ckpt-step-1522" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-full-meal:9e2Qax41:ckpt-step-528" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-full-meal:9e2Qb1sn" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-full-meal:9e2QbHP1:ckpt-step-1056" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-piece-meal:9dgu0Q1g:ckpt-step-1533" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-piece-meal:9dgu1KXd" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-pm-4o:9dkScYcs" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-pm-4o:9dkScysk:ckpt-step-1533" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin:9dfz3A8x" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:test-ft:9e4bJAtq:ckpt-step-27" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:test-ft:9e4bKBv0:ckpt-step-54" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:test-ft:9e4bKlvw" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:thunderbird:9bd8MQGp:ckpt-step-88" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:thunderbird:9bd8NB8K" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:thunderbird:9bd8NX77:ckpt-step-132" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:12-21-24:Ah0F4uLP:ckpt-step-185" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:12-21-24:Ah0FNFHQ:ckpt-step-370" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:12-21-24:Ah0FNFS1" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yOpXJbd:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yOpXVGv" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yOpXmyQ:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yWRL773:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yWRLeLB:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yWRM8Zn" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A1pIt632" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A1pItfDC:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A1pItofx:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A218TwmT:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A218UZjU:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A218UzZf" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A3FCYhcv:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A3FCYpNh:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A3FCZe3h" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A6lkYKvg:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A6lkYTPi:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A6lkZ4nA" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADYnVcKn:ckpt-step-153" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADYnWDpr:ckpt-step-306" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADYnWF7g" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADcZL13Y:ckpt-step-149" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADcZLJjk:ckpt-step-298" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADcZMaZB" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADdWL6S7:ckpt-step-149" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADdWLGiA:ckpt-step-298" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADdWLpNL" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADv4G9ED:ckpt-step-310" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADv4GfJI" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADv4GslV:ckpt-step-155" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AFvffbd6:ckpt-step-60" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AFvfgOvb" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AFvfgYxS:ckpt-step-75" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrPDXh4:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrPE1Jn:ckpt-step-84" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrPFDOA" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrRI7Py" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrRIbun:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrRIz3n:ckpt-step-84" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AJPMFYjn:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AJPMSMwR:ckpt-step-84" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AJPMTSQg" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZQz9s:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZbB0b:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZlhsT:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZrh8z:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZrhRU:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZrhWY:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZs4af" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZsBZ7" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZsiMB" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALelRGKV:ckpt-step-75" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALelRQjh:ckpt-step-50" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALelSl5l" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALfXG00U:ckpt-step-26" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALfXHUyM" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALfXHdnT:ckpt-step-52" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AM3Kk6bJ:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AM3Km10T:ckpt-step-114" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AM3KmncS" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMHzrhbX:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI02GZM:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0CTR7:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0MEJb:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0MZIn:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0MbSE:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NAKb:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NGtf" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NZqn:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NfHv" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0Nkxa" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NxXJ" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgDbCpJ:ckpt-step-61" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgDmR8i:ckpt-step-61" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgDwgwF:ckpt-step-61" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE01SL" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0Zqi" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0dya:ckpt-step-122" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0l6B" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0lmy:ckpt-step-122" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0x9A:ckpt-step-122" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhCPM4:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhNQrL:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhXvS0:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBheCpk:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBheHqF:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhelmB:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhfHg0" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhfP3K" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhfWTj" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANR81FlE:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANR8340Y" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANR83UMp:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxC4R0:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxMc5r:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxWkuX:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxb3ul" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbR1m:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbZ7u:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbueA:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbx9d" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxcbir" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTNQfB:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTXwXd:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTeBFW:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTeWRz" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTedmK:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTenB6" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2D506:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2OJoT:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2Ykg1:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2f35h:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2fWSn:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2fkPg:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2g1fc" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2g4RI" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2gT5D" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::BDcdETt3" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::BDgw3aRR:ckpt-step-770" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::BDgwAYDm" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLdLFo:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLdpp9:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLef0R" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025-733pm:Aln8wDEd:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025-733pm:Aln99EJs:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025-733pm:Aln99po1" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025:AljIGSIY:ckpt-step-114" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025:AljIUDTx:ckpt-step-228" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025:AljIUw1E" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2gb0ZW:ckpt-step-99" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2glfI3:ckpt-step-99" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2goBN9:ckpt-step-198" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2goRoo:ckpt-step-198" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2gpUkI" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2gpkQO" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uipath:AStGEJCN:ckpt-step-140" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uipath:AStGEPHu" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uipath:AStGErTc:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yQURl9e:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yQUS8UO" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yQUSboN:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yS9rcIf:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yS9sWBR:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yS9sZgG" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yYfNBYp" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yYfNYZR:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yYfNa27:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A1o0y9c3:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A1o0yYU0" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A1o0yoGv:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A20kHEh1:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A20kHL5C" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A20kHQH6:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A3Ew9LPO:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A3Ew9Pfa:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A3EwAWC6" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::C9PyMpaX:ckpt-step-926" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::C9PyNU6h" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLby6lj:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLc6ocQ:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLc6zzK" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-tokens:BUsD3Vq9" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:presale-prod-update:A1V43nWF:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:presale-prod-update:A1V44IqT" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:presale-prod-update:A1V44Vjp:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ql-plathelp-241:CRPREgy9:ckpt-step-241" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ql-plathelp-241:CRPRFEus:ckpt-step-482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ql-plathelp-241:CRPRGYXt" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-250:Ao0TXJT1:ckpt-step-250" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-250:Ao0TYWiG" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-250:Ao0TYf9o:ckpt-step-500" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-50:AnziWXoE:ckpt-step-50" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-50:AnziY3TM" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-50:AnziYbeg:ckpt-step-100" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9ozEIZnh:ckpt-step-1751" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9ozEMo2r" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qecJUHK:ckpt-step-2223" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qecJuVm" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qvs9txe:ckpt-step-2241" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qvsAbS8" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9rJTBC8M:ckpt-step-2241" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9rJTCzuI" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-0125" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-1106" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-16k" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-instruct" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-instruct-0914" + }, + { + "provider": "openai", + "model": "gpt-4" + }, + { + "provider": "openai", + "model": "gpt-4-0125-preview" + }, + { + "provider": "openai", + "model": "gpt-4-0314" + }, + { + "provider": "openai", + "model": "gpt-4-0613" + }, + { + "provider": "openai", + "model": "gpt-4-1106-preview" + }, + { + "provider": "openai", + "model": "gpt-4-turbo" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-preview" + }, + { + "provider": "openai", + "model": "gpt-4.1" + }, + { + "provider": "openai", + "model": "gpt-4.1-2025-04-14" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini-2025-04-14" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini-test-api-ev3" + }, + { + "provider": "openai", + "model": "gpt-4.1-nano" + }, + { + "provider": "openai", + "model": "gpt-4.1-nano-2025-04-14" + }, + { + "provider": "openai", + "model": "gpt-4o" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-05-13" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-08-06" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-11-20" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-10-01" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03" + }, + { + "provider": "openai", + "model": "gpt-4o-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-2024-07-18" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-audio-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-audio-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-search-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-search-preview-2025-03-11" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-transcribe" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-tts" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-10-01" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview-2025-06-03" + }, + { + "provider": "openai", + "model": "gpt-4o-search-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-search-preview-2025-03-11" + }, + { + "provider": "openai", + "model": "gpt-4o-transcribe" + }, + { + "provider": "openai", + "model": "gpt-4o-transcribe-diarize" + }, + { + "provider": "openai", + "model": "gpt-5" + }, + { + "provider": "openai", + "model": "gpt-5-2025-08-07" + }, + { + "provider": "openai", + "model": "gpt-5-chat-latest" + }, + { + "provider": "openai", + "model": "gpt-5-codex" + }, + { + "provider": "openai", + "model": "gpt-5-mini" + }, + { + "provider": "openai", + "model": "gpt-5-mini-2025-08-07" + }, + { + "provider": "openai", + "model": "gpt-5-nano" + }, + { + "provider": "openai", + "model": "gpt-5-nano-2025-08-07" + }, + { + "provider": "openai", + "model": "gpt-5-pro" + }, + { + "provider": "openai", + "model": "gpt-5-pro-2025-10-06" + }, + { + "provider": "openai", + "model": "gpt-5-search-api" + }, + { + "provider": "openai", + "model": "gpt-5-search-api-2025-10-14" + }, + { + "provider": "openai", + "model": "gpt-audio" + }, + { + "provider": "openai", + "model": "gpt-audio-2025-08-28" + }, + { + "provider": "openai", + "model": "gpt-audio-mini" + }, + { + "provider": "openai", + "model": "gpt-audio-mini-2025-10-06" + }, + { + "provider": "openai", + "model": "gpt-image-1" + }, + { + "provider": "openai", + "model": "gpt-image-1-mini" + }, + { + "provider": "openai", + "model": "gpt-realtime" + }, + { + "provider": "openai", + "model": "gpt-realtime-2025-08-28" + }, + { + "provider": "openai", + "model": "gpt-realtime-mini" + }, + { + "provider": "openai", + "model": "gpt-realtime-mini-2025-10-06" + }, + { + "provider": "openai", + "model": "o1" + }, + { + "provider": "openai", + "model": "o1-2024-12-17" + }, + { + "provider": "openai", + "model": "o1-mini" + }, + { + "provider": "openai", + "model": "o1-mini-2024-09-12" + }, + { + "provider": "openai", + "model": "o1-pro" + }, + { + "provider": "openai", + "model": "o1-pro-2025-03-19" + }, + { + "provider": "openai", + "model": "o3" + }, + { + "provider": "openai", + "model": "o3-2025-04-16" + }, + { + "provider": "openai", + "model": "o3-deep-research" + }, + { + "provider": "openai", + "model": "o3-deep-research-2025-06-26" + }, + { + "provider": "openai", + "model": "o3-mini" + }, + { + "provider": "openai", + "model": "o3-mini-2025-01-31" + }, + { + "provider": "openai", + "model": "o3-pro" + }, + { + "provider": "openai", + "model": "o3-pro-2025-06-10" + }, + { + "provider": "openai", + "model": "o4-mini" + }, + { + "provider": "openai", + "model": "o4-mini-2025-04-16" + }, + { + "provider": "openai", + "model": "o4-mini-deep-research" + }, + { + "provider": "openai", + "model": "o4-mini-deep-research-2025-06-26" + }, + { + "provider": "openai", + "model": "omni-moderation-2024-09-26" + }, + { + "provider": "openai", + "model": "omni-moderation-latest" + }, + { + "provider": "openai", + "model": "sora-2" + }, + { + "provider": "openai", + "model": "sora-2-pro" + }, + { + "provider": "openai", + "model": "text-embedding-3-large" + }, + { + "provider": "openai", + "model": "text-embedding-3-small" + }, + { + "provider": "openai", + "model": "text-embedding-ada-002" + }, + { + "provider": "openai", + "model": "tts-1" + }, + { + "provider": "openai", + "model": "tts-1-1106" + }, + { + "provider": "openai", + "model": "tts-1-hd" + }, + { + "provider": "openai", + "model": "tts-1-hd-1106" + }, + { + "provider": "openai", + "model": "whisper-1" + }, + { + "provider": "openrouter", + "model": "ai21/jamba-large-1.7" + }, + { + "provider": "openrouter", + "model": "ai21/jamba-mini-1.7" + }, + { + "provider": "openrouter", + "model": "alibaba/tongyi-deepresearch-30b-a3b" + }, + { + "provider": "openrouter", + "model": "alibaba/tongyi-deepresearch-30b-a3b:free" + }, + { + "provider": "openrouter", + "model": "amazon/nova-lite-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-micro-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-premier-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-pro-v1" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3-haiku" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3-opus" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku-20241022" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-sonnet" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-sonnet-20240620" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.7-sonnet" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.7-sonnet:thinking" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-haiku-4.5" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-opus-4" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-opus-4.1" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.5" + }, + { + "provider": "openrouter", + "model": "arcee-ai/virtuoso-large" + }, + { + "provider": "openrouter", + "model": "baidu/ernie-4.5-21b-a3b" + }, + { + "provider": "openrouter", + "model": "baidu/ernie-4.5-vl-28b-a3b" + }, + { + "provider": "openrouter", + "model": "cohere/command-r-08-2024" + }, + { + "provider": "openrouter", + "model": "cohere/command-r-plus-08-2024" + }, + { + "provider": "openrouter", + "model": "deepcogito/cogito-v2-preview-llama-109b-moe" + }, + { + "provider": "openrouter", + "model": "deepcogito/cogito-v2-preview-llama-405b" + }, + { + "provider": "openrouter", + "model": "deepcogito/cogito-v2-preview-llama-70b" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324:free" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3.1" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1-0528" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1-distill-llama-70b" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus:exacto" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2-exp" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-001" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-exp:free" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-lite-001" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-06-17" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-09-2025" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-preview-09-2025" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview-05-06" + }, + { + "provider": "openrouter", + "model": "google/gemma-3-27b-it" + }, + { + "provider": "openrouter", + "model": "inception/mercury" + }, + { + "provider": "openrouter", + "model": "inception/mercury-coder" + }, + { + "provider": "openrouter", + "model": "inclusionai/ling-1t" + }, + { + "provider": "openrouter", + "model": "inclusionai/ring-1t" + }, + { + "provider": "openrouter", + "model": "kwaipilot/kat-coder-pro:free" + }, + { + "provider": "openrouter", + "model": "meituan/longcat-flash-chat:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3-8b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-405b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-8b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.3-8b-instruct:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-scout" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-scout:free" + }, + { + "provider": "openrouter", + "model": "microsoft/phi-3-medium-128k-instruct" + }, + { + "provider": "openrouter", + "model": "microsoft/phi-3-mini-128k-instruct" + }, + { + "provider": "openrouter", + "model": "microsoft/phi-3.5-mini-128k-instruct" + }, + { + "provider": "openrouter", + "model": "minimax/minimax-m1" + }, + { + "provider": "openrouter", + "model": "minimax/minimax-m2" + }, + { + "provider": "openrouter", + "model": "minimax/minimax-m2:free" + }, + { + "provider": "openrouter", + "model": "mistralai/codestral-2501" + }, + { + "provider": "openrouter", + "model": "mistralai/codestral-2508" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-medium" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-small" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-small-2505" + }, + { + "provider": "openrouter", + "model": "mistralai/magistral-medium-2506" + }, + { + "provider": "openrouter", + "model": "mistralai/magistral-medium-2506:thinking" + }, + { + "provider": "openrouter", + "model": "mistralai/magistral-small-2506" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-3b" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-8b" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct-v0.1" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct-v0.3" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct:free" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2407" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2411" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-medium-3" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-medium-3.1" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-nemo" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-saba" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-24b-instruct-2501" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct:free" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct:free" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-tiny" + }, + { + "provider": "openrouter", + "model": "mistralai/mixtral-8x22b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mixtral-8x7b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/pixtral-12b" + }, + { + "provider": "openrouter", + "model": "mistralai/pixtral-large-2411" + }, + { + "provider": "openrouter", + "model": "mistralai/voxtral-small-24b-2507" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905:exacto" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2-thinking" + }, + { + "provider": "openrouter", + "model": "nousresearch/deephermes-3-mistral-24b-preview" + }, + { + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-70b" + }, + { + "provider": "openrouter", + "model": "nousresearch/hermes-4-405b" + }, + { + "provider": "openrouter", + "model": "nousresearch/hermes-4-70b" + }, + { + "provider": "openrouter", + "model": "nvidia/llama-3.1-nemotron-70b-instruct" + }, + { + "provider": "openrouter", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5" + }, + { + "provider": "openrouter", + "model": "nvidia/nemotron-nano-12b-v2-vl:free" + }, + { + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2" + }, + { + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2:free" + }, + { + "provider": "openrouter", + "model": "openai/codex-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-0613" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-16k" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-0314" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-1106-preview" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-turbo-preview" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1-nano" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-05-13" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-08-06" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-11-20" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-audio-preview" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-mini-2024-07-18" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o:extended" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-codex" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-image" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-image-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-nano" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-pro" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-120b" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-120b:exacto" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-20b" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-20b:free" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-safeguard-20b" + }, + { + "provider": "openrouter", + "model": "openai/o1" + }, + { + "provider": "openrouter", + "model": "openai/o3" + }, + { + "provider": "openrouter", + "model": "openai/o3-deep-research" + }, + { + "provider": "openrouter", + "model": "openai/o3-mini" + }, + { + "provider": "openrouter", + "model": "openai/o3-mini-high" + }, + { + "provider": "openrouter", + "model": "openai/o3-pro" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini-deep-research" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini-high" + }, + { + "provider": "openrouter", + "model": "openrouter/polaris-alpha" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-2.5-72b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-2.5-7b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28:thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-turbo" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-vl-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-14b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-thinking-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b:free" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-instruct-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-thinking-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-32b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-4b:free" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-8b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-flash" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-plus" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder:exacto" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder:free" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwq-32b" + }, + { + "provider": "openrouter", + "model": "sao10k/l3-euryale-70b" + }, + { + "provider": "openrouter", + "model": "sao10k/l3.1-euryale-70b" + }, + { + "provider": "openrouter", + "model": "stepfun-ai/step3" + }, + { + "provider": "openrouter", + "model": "thedrummer/rocinante-12b" + }, + { + "provider": "openrouter", + "model": "thedrummer/unslopnemo-12b" + }, + { + "provider": "openrouter", + "model": "tngtech/deepseek-r1t2-chimera" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3-beta" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3-mini" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3-mini-beta" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-4" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-4-fast" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-code-fast-1" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4-32b" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5-air" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5-air:free" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5v" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.6" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.6:exacto" + }, + { + "provider": "databricks", + "model": "baxen-migration-demo" + }, + { + "provider": "databricks", + "model": "big-hack" + }, + { + "provider": "databricks", + "model": "case_history_hackweek" + }, + { + "provider": "databricks", + "model": "case-history-checker" + }, + { + "provider": "databricks", + "model": "claude-3-5-haiku" + }, + { + "provider": "databricks", + "model": "claude-3-5-sonnet" + }, + { + "provider": "databricks", + "model": "claude-3-5-sonnet-2" + }, + { + "provider": "databricks", + "model": "claude-3-7-sonnet" + }, + { + "provider": "databricks", + "model": "claude-4" + }, + { + "provider": "databricks", + "model": "claude-4-opus" + }, + { + "provider": "databricks", + "model": "claude-haiku" + }, + { + "provider": "databricks", + "model": "claude-opus" + }, + { + "provider": "databricks", + "model": "claude-sonnet" + }, + { + "provider": "databricks", + "model": "cmg-test-iris" + }, + { + "provider": "databricks", + "model": "code-review-gpt-5" + }, + { + "provider": "databricks", + "model": "code-review-gpt-5-mini" + }, + { + "provider": "databricks", + "model": "codellama-7b-hf-ift" + }, + { + "provider": "databricks", + "model": "column-mapping-model-endpoint" + }, + { + "provider": "databricks", + "model": "column-mapping-model-endpoint-v2" + }, + { + "provider": "databricks", + "model": "dummy-model-ml-gp-endpoint" + }, + { + "provider": "databricks", + "model": "e5-large-v2" + }, + { + "provider": "databricks", + "model": "gemini-1-5-flash" + }, + { + "provider": "databricks", + "model": "gemini-1-5-pro" + }, + { + "provider": "databricks", + "model": "gemini-2-0-flash" + }, + { + "provider": "databricks", + "model": "gemini-2-5-flash" + }, + { + "provider": "databricks", + "model": "gemini-2-5-flash-latest" + }, + { + "provider": "databricks", + "model": "gemini-2-5-pro" + }, + { + "provider": "databricks", + "model": "gemini-2-5-pro-exp" + }, + { + "provider": "databricks", + "model": "gemini-flash-lite-latest" + }, + { + "provider": "databricks", + "model": "gemini-pro" + }, + { + "provider": "databricks", + "model": "goose" + }, + { + "provider": "databricks", + "model": "goose-claude-3-5-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-3-7-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-4-5-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-4-opus" + }, + { + "provider": "databricks", + "model": "goose-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-4-sonnet-bedrock" + }, + { + "provider": "databricks", + "model": "goose-gemini-2-5-pro" + }, + { + "provider": "databricks", + "model": "goose-gpt-4-1" + }, + { + "provider": "databricks", + "model": "goose-gpt-4o" + }, + { + "provider": "databricks", + "model": "goose-gpt-5" + }, + { + "provider": "databricks", + "model": "goose-gpt-oss" + }, + { + "provider": "databricks", + "model": "goose-o1" + }, + { + "provider": "databricks", + "model": "goose-o3" + }, + { + "provider": "databricks", + "model": "goose-o4-mini" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo-0125" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo-16k" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo-instruct" + }, + { + "provider": "databricks", + "model": "gpt-4" + }, + { + "provider": "databricks", + "model": "gpt-4-0125-preview" + }, + { + "provider": "databricks", + "model": "gpt-4-1-2025-04-14" + }, + { + "provider": "databricks", + "model": "gpt-4-1-mini" + }, + { + "provider": "databricks", + "model": "gpt-4-1-nano" + }, + { + "provider": "databricks", + "model": "gpt-4-turbo" + }, + { + "provider": "databricks", + "model": "gpt-4-turbo-2024-04-09" + }, + { + "provider": "databricks", + "model": "gpt-4-vision-preview" + }, + { + "provider": "databricks", + "model": "gpt-4o" + }, + { + "provider": "databricks", + "model": "gpt-4o-2024-05-13" + }, + { + "provider": "databricks", + "model": "gpt-4o-2024-11-20" + }, + { + "provider": "databricks", + "model": "gpt-4o-mini" + }, + { + "provider": "databricks", + "model": "gpt-4o-mini-2024-07-18" + }, + { + "provider": "databricks", + "model": "gpt-5" + }, + { + "provider": "databricks", + "model": "gpt-5-mini-high" + }, + { + "provider": "databricks", + "model": "gpt-5-nano" + }, + { + "provider": "databricks", + "model": "gpt-vision" + }, + { + "provider": "databricks", + "model": "hackweek-snowflake-gpt-query-generator" + }, + { + "provider": "databricks", + "model": "headless-goose" + }, + { + "provider": "databricks", + "model": "headless-goose-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "headless-goose-o3-mini" + }, + { + "provider": "databricks", + "model": "icg-poc" + }, + { + "provider": "databricks", + "model": "invoice_parser_test" + }, + { + "provider": "databricks", + "model": "jina-reranker-v1-turbo-en" + }, + { + "provider": "databricks", + "model": "kgoose-cashapp-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "kgoose-cashapp-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "kgoose-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "kgoose-claude-haiku-4-5" + }, + { + "provider": "databricks", + "model": "kgoose-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "kgoose-gemini-2-5-flash" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4-1" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4-1-mini" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4-1-nano" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4o" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-5" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-5-mini" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-5-nano" + }, + { + "provider": "databricks", + "model": "kgoose-o3" + }, + { + "provider": "databricks", + "model": "kgoose-o4-mini" + }, + { + "provider": "databricks", + "model": "korhan-openai-test" + }, + { + "provider": "databricks", + "model": "korhan-openai-wrapper" + }, + { + "provider": "databricks", + "model": "moderation" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-haiku-3-5" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-opus-4" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-opus-4-1" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-sonnet-3-7" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-sonnet-4" + }, + { + "provider": "databricks", + "model": "ng-tools-gpt-5-nano" + }, + { + "provider": "databricks", + "model": "o1" + }, + { + "provider": "databricks", + "model": "o1-2024-12-17" + }, + { + "provider": "databricks", + "model": "o1-mini" + }, + { + "provider": "databricks", + "model": "o1-preview" + }, + { + "provider": "databricks", + "model": "o3" + }, + { + "provider": "databricks", + "model": "o3-cdd-autopilot" + }, + { + "provider": "databricks", + "model": "o3-mini" + }, + { + "provider": "databricks", + "model": "optimized-llama2-7b" + }, + { + "provider": "databricks", + "model": "opus-mt-en-es" + }, + { + "provider": "databricks", + "model": "opus-mt-en-fr" + }, + { + "provider": "databricks", + "model": "opus-mt-en-ja" + }, + { + "provider": "databricks", + "model": "opus-mt-es-en" + }, + { + "provider": "databricks", + "model": "opus-mt-fr-en" + }, + { + "provider": "databricks", + "model": "opus-mt-ja-en" + }, + { + "provider": "databricks", + "model": "p2p-device-recovery-classify" + }, + { + "provider": "databricks", + "model": "picasso_embeddings" + }, + { + "provider": "databricks", + "model": "prime_model" + }, + { + "provider": "databricks", + "model": "reportiq_selector_1" + }, + { + "provider": "databricks", + "model": "reportiq_selector_md_file" + }, + { + "provider": "databricks", + "model": "snowflake-gpt-query-generator-v3" + }, + { + "provider": "databricks", + "model": "sq-bank-statement-classifier" + }, + { + "provider": "databricks", + "model": "sq-bank-statement-parser" + }, + { + "provider": "databricks", + "model": "support-article-intent-mapping" + }, + { + "provider": "databricks", + "model": "text-embedding-3-large" + }, + { + "provider": "databricks", + "model": "text-embedding-3-small" + }, + { + "provider": "databricks", + "model": "text-embedding-ada-002" + }, + { + "provider": "databricks", + "model": "databricks-gpt-5" + }, + { + "provider": "databricks", + "model": "databricks-gemini-2-5-flash" + }, + { + "provider": "databricks", + "model": "databricks-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "databricks-gpt-oss-120b" + }, + { + "provider": "databricks", + "model": "databricks-gpt-5-mini" + }, + { + "provider": "databricks", + "model": "databricks-gpt-5-nano" + }, + { + "provider": "databricks", + "model": "databricks-gemini-2-5-pro" + }, + { + "provider": "databricks", + "model": "databricks-gpt-oss-20b" + }, + { + "provider": "databricks", + "model": "databricks-llama-4-maverick" + }, + { + "provider": "databricks", + "model": "databricks-gemma-3-12b" + }, + { + "provider": "databricks", + "model": "databricks-meta-llama-3-1-8b-instruct" + }, + { + "provider": "databricks", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + { + "provider": "databricks", + "model": "databricks-claude-opus-4-1" + }, + { + "provider": "databricks", + "model": "databricks-claude-sonnet-4" + }, + { + "provider": "databricks", + "model": "databricks-claude-3-7-sonnet" + }, + { + "provider": "databricks", + "model": "databricks-gte-large-en" + }, + { + "provider": "databricks", + "model": "databricks-bge-large-en" + }, + { + "provider": "databricks", + "model": "databricks-meta-llama-3-1-405b-instruct" + }, + { + "provider": "databricks", + "model": "databricks-claude-opus-4" + }, + { + "provider": "google", + "model": "aqa" + }, + { + "provider": "google", + "model": "embedding-001" + }, + { + "provider": "google", + "model": "embedding-gecko-001" + }, + { + "provider": "google", + "model": "gemini-2.0-flash" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-001" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-exp" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-exp-image-generation" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-001" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-preview" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-preview-02-05" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-preview-image-generation" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp-01-21" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp-1219" + }, + { + "provider": "google", + "model": "gemini-2.0-pro-exp" + }, + { + "provider": "google", + "model": "gemini-2.0-pro-exp-02-05" + }, + { + "provider": "google", + "model": "gemini-2.5-computer-use-preview-10-2025" + }, + { + "provider": "google", + "model": "gemini-2.5-flash" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-image" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-image-preview" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-06-17" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-09-2025" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-preview-05-20" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-preview-09-2025" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-preview-tts" + }, + { + "provider": "google", + "model": "gemini-2.5-pro" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-03-25" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-05-06" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-06-05" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-tts" + }, + { + "provider": "google", + "model": "gemini-embedding-001" + }, + { + "provider": "google", + "model": "gemini-embedding-exp" + }, + { + "provider": "google", + "model": "gemini-embedding-exp-03-07" + }, + { + "provider": "google", + "model": "gemini-exp-1206" + }, + { + "provider": "google", + "model": "gemini-flash-latest" + }, + { + "provider": "google", + "model": "gemini-flash-lite-latest" + }, + { + "provider": "google", + "model": "gemini-pro-latest" + }, + { + "provider": "google", + "model": "gemini-robotics-er-1.5-preview" + }, + { + "provider": "google", + "model": "gemma-3-12b-it" + }, + { + "provider": "google", + "model": "gemma-3-1b-it" + }, + { + "provider": "google", + "model": "gemma-3-27b-it" + }, + { + "provider": "google", + "model": "gemma-3-4b-it" + }, + { + "provider": "google", + "model": "gemma-3n-e2b-it" + }, + { + "provider": "google", + "model": "gemma-3n-e4b-it" + }, + { + "provider": "google", + "model": "imagen-3.0-generate-002" + }, + { + "provider": "google", + "model": "imagen-4.0-generate-preview-06-06" + }, + { + "provider": "google", + "model": "learnlm-2.0-flash-experimental" + }, + { + "provider": "google", + "model": "text-embedding-004" + } + ], + "all_mappings": { + "tetrate": [], + "anthropic": [], + "openrouter": [], + "databricks": [], + "openai": [], + "google": [] + }, + "model_counts": { + "tetrate": 0, + "openai": 626, + "anthropic": 0, + "databricks": 142, + "openrouter": 219, + "google": 50 + }, + "canonical_models_used": [] +} \ No newline at end of file diff --git a/crates/goose/examples/canonical_model_checker.rs b/crates/goose/examples/canonical_model_checker.rs new file mode 100644 index 000000000000..df214648ca15 --- /dev/null +++ b/crates/goose/examples/canonical_model_checker.rs @@ -0,0 +1,307 @@ +/// Canonical Model Checker +/// +/// This script checks which models from top providers are properly mapped to canonical models. +/// It outputs a report showing: +/// - Models that are NOT mapped to canonical models +/// - Full list of (provider, model) <-> canonical-model mappings +/// - Comparison with previous runs (if available) +/// +/// Usage: +/// cargo run --example canonical_model_checker -- [--output report.json] +/// + +use anyhow::{Context, Result}; +use goose::providers::{ + canonical::ModelMapping, + create_with_named_model, +}; +use serde::{Deserialize, Serialize}; +use std::collections::{HashMap, HashSet}; +use std::path::PathBuf; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ProviderModelPair { + provider: String, + model: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct MappingReport { + /// Timestamp of this report + timestamp: String, + + /// Models that are NOT mapped to canonical models + unmapped_models: Vec, + + /// All mappings: (provider, model) -> canonical model + all_mappings: HashMap>, + + /// Total models checked per provider + model_counts: HashMap, + + /// Canonical models referenced + canonical_models_used: HashSet, +} + +impl MappingReport { + fn new() -> Self { + Self { + timestamp: chrono::Utc::now().to_rfc3339(), + unmapped_models: Vec::new(), + all_mappings: HashMap::new(), + model_counts: HashMap::new(), + canonical_models_used: HashSet::new(), + } + } + + fn add_provider_results( + &mut self, + provider_name: &str, + fetched_models: Vec, + mappings: Vec, + ) { + // Build a map of provider model -> canonical model + let mapping_map: HashMap = mappings + .iter() + .map(|m| (m.provider_model.clone(), m.canonical_model.clone())) + .collect(); + + // Find unmapped models + for model in &fetched_models { + if !mapping_map.contains_key(model) { + self.unmapped_models.push(ProviderModelPair { + provider: provider_name.to_string(), + model: model.clone(), + }); + } + } + + // Track canonical models used + for canonical in mapping_map.values() { + self.canonical_models_used.insert(canonical.clone()); + } + + // Store mappings and counts + self.all_mappings.insert(provider_name.to_string(), mappings); + self.model_counts.insert(provider_name.to_string(), fetched_models.len()); + } + + fn print_summary(&self) { + println!("\n{}", "=".repeat(80)); + println!("CANONICAL MODEL MAPPING REPORT"); + println!("{}", "=".repeat(80)); + println!("\nGenerated: {}\n", self.timestamp); + + // Print model counts per provider + println!("Models Checked Per Provider:"); + println!("{}", "-".repeat(80)); + let mut providers: Vec<_> = self.model_counts.iter().collect(); + providers.sort_by_key(|(name, _)| *name); + for (provider, count) in providers { + let mapped = self.all_mappings + .get(provider) + .map(|m| m.len()) + .unwrap_or(0); + let unmapped = count - mapped; + println!(" {:<20} Total: {:>3} Mapped: {:>3} Unmapped: {:>3}", + provider, count, mapped, unmapped); + } + + // Print unmapped models + println!("\n{}", "=".repeat(80)); + println!("UNMAPPED MODELS ({})", self.unmapped_models.len()); + println!("{}", "=".repeat(80)); + + if self.unmapped_models.is_empty() { + println!("✓ All models are mapped to canonical models!"); + } else { + let mut unmapped_by_provider: HashMap<&str, Vec<&str>> = HashMap::new(); + for pair in &self.unmapped_models { + unmapped_by_provider + .entry(pair.provider.as_str()) + .or_default() + .push(pair.model.as_str()); + } + + let mut providers: Vec<_> = unmapped_by_provider.keys().collect(); + providers.sort(); + + for provider in providers { + println!("\n{}:", provider); + let mut models = unmapped_by_provider[provider].to_vec(); + models.sort(); + for model in models { + println!(" - {}", model); + } + } + } + + // Print canonical models used + println!("\n{}", "=".repeat(80)); + println!("CANONICAL MODELS REFERENCED ({})", self.canonical_models_used.len()); + println!("{}", "=".repeat(80)); + if self.canonical_models_used.is_empty() { + println!(" (none yet)"); + } else { + let mut canonical: Vec<_> = self.canonical_models_used.iter().collect(); + canonical.sort(); + for model in canonical { + println!(" - {}", model); + } + } + + println!("\n{}", "=".repeat(80)); + } + + fn compare_with_previous(&self, previous: &MappingReport) { + println!("\n{}", "=".repeat(80)); + println!("CHANGES SINCE PREVIOUS RUN"); + println!("{}", "=".repeat(80)); + + // Find new unmapped models + let prev_unmapped: HashSet<_> = previous.unmapped_models + .iter() + .map(|p| (&p.provider, &p.model)) + .collect(); + let curr_unmapped: HashSet<_> = self.unmapped_models + .iter() + .map(|p| (&p.provider, &p.model)) + .collect(); + + let newly_mapped: Vec<_> = prev_unmapped.difference(&curr_unmapped).collect(); + let newly_unmapped: Vec<_> = curr_unmapped.difference(&prev_unmapped).collect(); + + if newly_mapped.is_empty() && newly_unmapped.is_empty() { + println!("\nNo changes in model mappings."); + } else { + if !newly_mapped.is_empty() { + println!("\n✓ Newly Mapped Models ({}):", newly_mapped.len()); + for (provider, model) in newly_mapped { + println!(" {} / {}", provider, model); + } + } + + if !newly_unmapped.is_empty() { + println!("\n✗ Newly Unmapped Models ({}):", newly_unmapped.len()); + for (provider, model) in newly_unmapped { + println!(" {} / {}", provider, model); + } + } + } + + println!("\n{}", "=".repeat(80)); + } + + fn save_to_file(&self, path: &PathBuf) -> Result<()> { + let json = serde_json::to_string_pretty(self) + .context("Failed to serialize report")?; + std::fs::write(path, json) + .context("Failed to write report file")?; + Ok(()) + } + + fn load_from_file(path: &PathBuf) -> Result { + let content = std::fs::read_to_string(path) + .context("Failed to read report file")?; + let report: MappingReport = serde_json::from_str(&content) + .context("Failed to parse report file")?; + Ok(report) + } +} + +async fn check_provider( + provider_name: &str, + model_for_init: &str, +) -> Result<(Vec, Vec)> { + println!("Checking provider: {}", provider_name); + + // Create provider instance (using a default model for initialization) + let provider = match create_with_named_model(provider_name, model_for_init).await { + Ok(p) => p, + Err(e) => { + println!(" ⚠ Failed to create provider: {}", e); + println!(" This is expected if credentials are not configured."); + return Ok((Vec::new(), Vec::new())); + } + }; + + // Fetch supported models + let fetched_models = match provider.fetch_supported_models().await { + Ok(Some(models)) => { + println!(" ✓ Fetched {} models", models.len()); + models + } + Ok(None) => { + println!(" ⚠ Provider does not support model listing"); + Vec::new() + } + Err(e) => { + println!(" ⚠ Failed to fetch models: {}", e); + println!(" This is expected if credentials are not configured."); + Vec::new() + } + }; + + // Get canonical mappings + let mappings = match provider.map_to_canonical_models().await { + Ok(m) => { + println!(" ✓ Found {} mappings", m.len()); + m + } + Err(e) => { + println!(" ⚠ Failed to get mappings: {}", e); + Vec::new() + } + }; + + Ok((fetched_models, mappings)) +} + +#[tokio::main] +async fn main() -> Result<()> { + println!("Canonical Model Checker"); + println!("Checking model mappings for top providers...\n"); + + // Define providers to check with their default models + let providers = vec![ + ("anthropic", "claude-3-5-sonnet-20241022"), + ("openai", "gpt-4"), + ("openrouter", "anthropic/claude-3.5-sonnet"), + ("databricks", "databricks-meta-llama-3-1-70b-instruct"), + ("google", "gemini-1.5-pro-002"), + ("tetrate", "claude-3-5-sonnet-computer-use"), + ]; + + let mut report = MappingReport::new(); + + // Check each provider + for (provider_name, default_model) in providers { + let (fetched, mappings) = check_provider(provider_name, default_model).await?; + report.add_provider_results(provider_name, fetched, mappings); + println!(); + } + + // Print summary + report.print_summary(); + + // Parse command line arguments + let args: Vec = std::env::args().collect(); + let output_path = if args.len() > 2 && args[1] == "--output" { + PathBuf::from(&args[2]) + } else { + PathBuf::from("canonical_mapping_report.json") + }; + + // Try to compare with previous run + if output_path.exists() { + if let Ok(previous) = MappingReport::load_from_file(&output_path) { + report.compare_with_previous(&previous); + } + } + + // Save report + report.save_to_file(&output_path)?; + println!("\n✓ Report saved to: {}", output_path.display()); + + Ok(()) +} diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index e908cd88c94f..21933540cbe6 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -415,6 +415,13 @@ pub trait Provider: Send + Sync { Ok(None) } + /// Map fetched provider models to canonical models + /// Returns a list of ModelMapping for each model this provider supports + /// Default implementation returns an empty list (no mappings configured yet) + async fn map_to_canonical_models(&self) -> Result, ProviderError> { + Ok(Vec::new()) + } + fn supports_embeddings(&self) -> bool { false } diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md new file mode 100644 index 000000000000..9a21959c5763 --- /dev/null +++ b/crates/goose/src/providers/canonical/README.md @@ -0,0 +1,115 @@ +# Canonical Model System + +This directory contains the canonical model infrastructure for standardizing model metadata across different providers. + +## Overview + +The canonical model system solves the problem that different LLM providers return varying levels of information about their models. Some providers only return model names, while others provide rich metadata. This system: + +1. **Maintains a canonical registry** of models with standardized metadata +2. **Provides a mapping layer** for providers to map their models to canonical models +3. **Enables model validation** to ensure proper metadata for all supported models + +## Components + +### `model.rs` + +Defines the core data structures: + +- `ModelType` enum: chat, voice, embedding, image, other +- `CanonicalModel`: Complete model metadata including: + - Basic info: name, type, context limit + - Capabilities: streaming, tools, vision, computer use + - Pricing: input/output token costs + - Additional features: cache control, custom metadata + +### `registry.rs` + +Provides model registry management: + +- `CanonicalModelRegistry`: In-memory registry of canonical models +- Load/save from/to JSON files +- Query and lookup operations + +### `canonical_models.json` + +JSON file containing the canonical model definitions. This is the source of truth for model metadata. + +## Usage + +### For Provider Implementors + +Implement the `map_to_canonical_models()` method in your provider: + +```rust +async fn map_to_canonical_models(&self) -> Result, ProviderError> { + let models = self.fetch_supported_models().await? + .unwrap_or_default(); + + let mut mappings = Vec::new(); + + for model in models { + // Map your provider's model name to canonical name + let canonical = match model.as_str() { + "claude-3-5-sonnet-20241022" => "claude-3-5-sonnet-20241022", + "gpt-4-turbo-2024-04-09" => "gpt-4-turbo", + // ... more mappings + _ => continue, // Skip unmapped models + }; + + mappings.push( + ModelMapping::new(model, canonical).verified() + ); + } + + Ok(mappings) +} +``` + +### Testing Your Mappings + +Use the `canonical_model_checker` example to test your mappings: + +```bash +cargo run --example canonical_model_checker +``` + +This will: +- Fetch models from all major providers +- Check which models are mapped to canonical models +- Report unmapped models +- Show canonical models in use +- Compare with previous runs + +**Note:** Requires proper provider credentials to be configured. + +### Adding New Canonical Models + +1. Add the model definition to `canonical_models.json` +2. Include all required metadata: + - name, model_type, context_limit (required) + - capabilities (streaming, tools, vision, etc.) + - pricing information +3. Run the test script to verify mappings + +## Model Metadata Fields + +- `name`: Canonical name for the model (e.g., "claude-3-5-sonnet-20241022") +- `model_type`: Type of model (chat, voice, embedding, image, other) +- `context_limit`: Maximum context window in tokens +- `supports_streaming`: Whether model supports streaming responses +- `supports_tools`: Whether model supports tool/function calling +- `supports_vision`: Whether model supports image inputs +- `supports_computer_use`: Whether model supports computer use/MCP +- `input_token_cost`: Cost per million input tokens (optional) +- `output_token_cost`: Cost per million output tokens (optional) +- `currency`: Currency for pricing (default: "USD") +- `supports_cache_control`: Whether model supports prompt caching +- `metadata`: Additional custom metadata as key-value pairs + +## Goals + +- **Consistency**: Standardized model information across providers +- **Validation**: Ensure all models have proper metadata +- **Tracking**: Monitor when providers add/remove models +- **Selection**: Filter models by capability (e.g., exclude voice models from chat UI) diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json new file mode 100644 index 000000000000..08236202b158 --- /dev/null +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -0,0 +1,58 @@ +[ + { + "name": "claude-3-5-sonnet-20241022", + "model_type": "chat", + "context_limit": 200000, + "supports_streaming": true, + "supports_tools": true, + "supports_vision": true, + "supports_computer_use": false, + "input_token_cost": 3.0, + "output_token_cost": 15.0, + "currency": "USD", + "supports_cache_control": true, + "metadata": {} + }, + { + "name": "claude-3-5-sonnet-computer-use", + "model_type": "chat", + "context_limit": 200000, + "supports_streaming": true, + "supports_tools": true, + "supports_vision": true, + "supports_computer_use": true, + "input_token_cost": 3.0, + "output_token_cost": 15.0, + "currency": "USD", + "supports_cache_control": true, + "metadata": {} + }, + { + "name": "gpt-4-turbo", + "model_type": "chat", + "context_limit": 128000, + "supports_streaming": true, + "supports_tools": true, + "supports_vision": true, + "supports_computer_use": false, + "input_token_cost": 10.0, + "output_token_cost": 30.0, + "currency": "USD", + "supports_cache_control": false, + "metadata": {} + }, + { + "name": "gpt-4o", + "model_type": "chat", + "context_limit": 128000, + "supports_streaming": true, + "supports_tools": true, + "supports_vision": true, + "supports_computer_use": false, + "input_token_cost": 2.5, + "output_token_cost": 10.0, + "currency": "USD", + "supports_cache_control": false, + "metadata": {} + } +] diff --git a/crates/goose/src/providers/canonical/mod.rs b/crates/goose/src/providers/canonical/mod.rs new file mode 100644 index 000000000000..d854cd186e20 --- /dev/null +++ b/crates/goose/src/providers/canonical/mod.rs @@ -0,0 +1,31 @@ +mod model; +mod registry; + +pub use model::{CanonicalModel, ModelType}; +pub use registry::CanonicalModelRegistry; + +/// Represents a mapping from a provider's model name to a canonical model +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ModelMapping { + /// The provider's model name/identifier + pub provider_model: String, + /// The canonical model name this maps to + pub canonical_model: String, + /// Whether this mapping is confirmed/verified + pub verified: bool, +} + +impl ModelMapping { + pub fn new(provider_model: impl Into, canonical_model: impl Into) -> Self { + Self { + provider_model: provider_model.into(), + canonical_model: canonical_model.into(), + verified: false, + } + } + + pub fn verified(mut self) -> Self { + self.verified = true; + self + } +} diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs new file mode 100644 index 000000000000..393b674588ee --- /dev/null +++ b/crates/goose/src/providers/canonical/model.rs @@ -0,0 +1,152 @@ +use serde::{Deserialize, Serialize}; + +/// The type of model (chat, voice, embedding, etc.) +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ModelType { + /// Text generation / chat completion model + Chat, + /// Voice/audio model + Voice, + /// Embedding model + Embedding, + /// Image generation model + Image, + /// Other/unknown type + Other, +} + +/// Canonical representation of a model with standardized metadata +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CanonicalModel { + /// Canonical name for this model (e.g., "claude-3-5-sonnet-20241022") + pub name: String, + + /// The type of model + pub model_type: ModelType, + + /// Maximum context window size in tokens + pub context_limit: usize, + + /// Whether the model supports streaming responses + pub supports_streaming: bool, + + /// Whether the model supports tool/function calling + pub supports_tools: bool, + + /// Whether the model supports vision/image inputs + pub supports_vision: bool, + + /// Whether the model supports computer use/MCP + pub supports_computer_use: bool, + + /// Cost per million input tokens + pub input_token_cost: Option, + + /// Cost per million output tokens + pub output_token_cost: Option, + + /// Currency for pricing (defaults to USD) + #[serde(default = "default_currency")] + pub currency: String, + + /// Whether the model supports prompt caching + #[serde(default)] + pub supports_cache_control: bool, + + /// Additional metadata as key-value pairs + #[serde(default)] + pub metadata: std::collections::HashMap, +} + +fn default_currency() -> String { + "USD".to_string() +} + +impl CanonicalModel { + /// Create a new canonical model with minimal required fields + pub fn new( + name: impl Into, + model_type: ModelType, + context_limit: usize, + ) -> Self { + Self { + name: name.into(), + model_type, + context_limit, + supports_streaming: false, + supports_tools: false, + supports_vision: false, + supports_computer_use: false, + input_token_cost: None, + output_token_cost: None, + currency: default_currency(), + supports_cache_control: false, + metadata: std::collections::HashMap::new(), + } + } + + /// Builder method to set streaming support + pub fn with_streaming(mut self, supports: bool) -> Self { + self.supports_streaming = supports; + self + } + + /// Builder method to set tool support + pub fn with_tools(mut self, supports: bool) -> Self { + self.supports_tools = supports; + self + } + + /// Builder method to set vision support + pub fn with_vision(mut self, supports: bool) -> Self { + self.supports_vision = supports; + self + } + + /// Builder method to set computer use support + pub fn with_computer_use(mut self, supports: bool) -> Self { + self.supports_computer_use = supports; + self + } + + /// Builder method to set pricing + pub fn with_pricing(mut self, input_cost: f64, output_cost: f64) -> Self { + self.input_token_cost = Some(input_cost); + self.output_token_cost = Some(output_cost); + self + } + + /// Builder method to set cache control support + pub fn with_cache_control(mut self, supports: bool) -> Self { + self.supports_cache_control = supports; + self + } + + /// Builder method to add custom metadata + pub fn with_metadata(mut self, key: impl Into, value: serde_json::Value) -> Self { + self.metadata.insert(key.into(), value); + self + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_canonical_model_builder() { + let model = CanonicalModel::new("test-model", ModelType::Chat, 8192) + .with_streaming(true) + .with_tools(true) + .with_pricing(1.0, 2.0); + + assert_eq!(model.name, "test-model"); + assert_eq!(model.model_type, ModelType::Chat); + assert_eq!(model.context_limit, 8192); + assert!(model.supports_streaming); + assert!(model.supports_tools); + assert_eq!(model.input_token_cost, Some(1.0)); + assert_eq!(model.output_token_cost, Some(2.0)); + } +} diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs new file mode 100644 index 000000000000..6239fb9e1479 --- /dev/null +++ b/crates/goose/src/providers/canonical/registry.rs @@ -0,0 +1,125 @@ +use super::CanonicalModel; +use anyhow::{Context, Result}; +use std::collections::HashMap; +use std::path::Path; + +/// Registry for managing canonical models +#[derive(Debug, Clone)] +pub struct CanonicalModelRegistry { + models: HashMap, +} + +impl CanonicalModelRegistry { + /// Create an empty registry + pub fn new() -> Self { + Self { + models: HashMap::new(), + } + } + + /// Load registry from a JSON file + pub fn from_file(path: impl AsRef) -> Result { + let content = std::fs::read_to_string(path.as_ref()) + .context("Failed to read canonical models file")?; + + let models: Vec = serde_json::from_str(&content) + .context("Failed to parse canonical models JSON")?; + + let mut registry = Self::new(); + for model in models { + registry.register(model); + } + + Ok(registry) + } + + /// Save registry to a JSON file + pub fn to_file(&self, path: impl AsRef) -> Result<()> { + let mut models: Vec<&CanonicalModel> = self.models.values().collect(); + models.sort_by(|a, b| a.name.cmp(&b.name)); + + let json = serde_json::to_string_pretty(&models) + .context("Failed to serialize canonical models")?; + + std::fs::write(path.as_ref(), json) + .context("Failed to write canonical models file")?; + + Ok(()) + } + + /// Register a canonical model + pub fn register(&mut self, model: CanonicalModel) { + self.models.insert(model.name.clone(), model); + } + + /// Look up a canonical model by name + pub fn get(&self, name: &str) -> Option<&CanonicalModel> { + self.models.get(name) + } + + /// Get all canonical models + pub fn all_models(&self) -> Vec<&CanonicalModel> { + self.models.values().collect() + } + + /// Get number of registered models + pub fn count(&self) -> usize { + self.models.len() + } + + /// Check if a model exists + pub fn contains(&self, name: &str) -> bool { + self.models.contains_key(name) + } +} + +impl Default for CanonicalModelRegistry { + fn default() -> Self { + Self::new() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::providers::canonical::ModelType; + + #[test] + fn test_registry_operations() { + let mut registry = CanonicalModelRegistry::new(); + + let model = CanonicalModel::new("test-model", ModelType::Chat, 8192); + registry.register(model); + + assert_eq!(registry.count(), 1); + assert!(registry.contains("test-model")); + assert!(registry.get("test-model").is_some()); + assert!(registry.get("nonexistent").is_none()); + } + + #[test] + fn test_registry_serialization() { + let mut registry = CanonicalModelRegistry::new(); + + let model1 = CanonicalModel::new("model-1", ModelType::Chat, 8192) + .with_streaming(true); + let model2 = CanonicalModel::new("model-2", ModelType::Voice, 4096); + + registry.register(model1); + registry.register(model2); + + let temp_dir = std::env::temp_dir(); + let file_path = temp_dir.join("test_registry.json"); + + // Save and load + registry.to_file(&file_path).unwrap(); + let loaded = CanonicalModelRegistry::from_file(&file_path).unwrap(); + + assert_eq!(loaded.count(), 2); + assert!(loaded.contains("model-1")); + assert!(loaded.contains("model-2")); + + // Cleanup + std::fs::remove_file(file_path).ok(); + } +} diff --git a/crates/goose/src/providers/mod.rs b/crates/goose/src/providers/mod.rs index dd554f3dc878..5ea7948a7578 100644 --- a/crates/goose/src/providers/mod.rs +++ b/crates/goose/src/providers/mod.rs @@ -4,6 +4,7 @@ pub mod azure; pub mod azureauth; pub mod base; pub mod bedrock; +pub mod canonical; pub mod claude_code; pub mod cursor_agent; pub mod databricks; From a72ba12093b43efa58fa167a5ac6b13861a40caf Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 11 Nov 2025 16:38:37 -0500 Subject: [PATCH 02/52] v2 --- .../goose/src/providers/canonical/README.md | 32 ++++++------ .../providers/canonical/canonical_models.json | 38 +++----------- crates/goose/src/providers/canonical/model.rs | 49 ++----------------- 3 files changed, 25 insertions(+), 94 deletions(-) diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 9a21959c5763..99149bb033c2 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -18,10 +18,10 @@ Defines the core data structures: - `ModelType` enum: chat, voice, embedding, image, other - `CanonicalModel`: Complete model metadata including: - - Basic info: name, type, context limit - - Capabilities: streaming, tools, vision, computer use - - Pricing: input/output token costs - - Additional features: cache control, custom metadata + - Basic info: name (provider/model-name format), type, context limit + - Capabilities: streaming, tools + - Pricing: input/output token costs (in USD) + - Additional features: cache control ### `registry.rs` @@ -51,8 +51,8 @@ async fn map_to_canonical_models(&self) -> Result, ProviderErr for model in models { // Map your provider's model name to canonical name let canonical = match model.as_str() { - "claude-3-5-sonnet-20241022" => "claude-3-5-sonnet-20241022", - "gpt-4-turbo-2024-04-09" => "gpt-4-turbo", + "claude-3-5-sonnet-20241022" => "anthropic/claude-3-5-sonnet", + "gpt-4-turbo-2024-04-09" => "openai/gpt-4-turbo", // ... more mappings _ => continue, // Skip unmapped models }; @@ -87,25 +87,23 @@ This will: 1. Add the model definition to `canonical_models.json` 2. Include all required metadata: - - name, model_type, context_limit (required) - - capabilities (streaming, tools, vision, etc.) - - pricing information + - name (provider/model-name format), model_type, context_limit (required) + - capabilities (streaming, tools, cache_control) + - pricing information (in USD) 3. Run the test script to verify mappings ## Model Metadata Fields -- `name`: Canonical name for the model (e.g., "claude-3-5-sonnet-20241022") +- `name`: Canonical name for the model using provider/model-name format (e.g., "anthropic/claude-3-5-sonnet", "openai/gpt-4o") - `model_type`: Type of model (chat, voice, embedding, image, other) - `context_limit`: Maximum context window in tokens - `supports_streaming`: Whether model supports streaming responses -- `supports_tools`: Whether model supports tool/function calling -- `supports_vision`: Whether model supports image inputs -- `supports_computer_use`: Whether model supports computer use/MCP -- `input_token_cost`: Cost per million input tokens (optional) -- `output_token_cost`: Cost per million output tokens (optional) -- `currency`: Currency for pricing (default: "USD") +- `supports_tools`: Whether model supports tool/function calling (includes MCP) +- `input_token_cost`: Cost per million input tokens in USD (optional) +- `output_token_cost`: Cost per million output tokens in USD (optional) - `supports_cache_control`: Whether model supports prompt caching -- `metadata`: Additional custom metadata as key-value pairs + +**Note:** Canonical models represent model families without datetime-specific versions. Provider-specific versioned models (e.g., "claude-3-5-sonnet-20241022") should be mapped to their canonical equivalents (e.g., "anthropic/claude-3-5-sonnet"). ## Goals diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json index 08236202b158..c9f5f9f966c7 100644 --- a/crates/goose/src/providers/canonical/canonical_models.json +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -1,58 +1,32 @@ [ { - "name": "claude-3-5-sonnet-20241022", + "name": "anthropic/claude-3-5-sonnet", "model_type": "chat", "context_limit": 200000, "supports_streaming": true, "supports_tools": true, - "supports_vision": true, - "supports_computer_use": false, "input_token_cost": 3.0, "output_token_cost": 15.0, - "currency": "USD", - "supports_cache_control": true, - "metadata": {} + "supports_cache_control": true }, { - "name": "claude-3-5-sonnet-computer-use", - "model_type": "chat", - "context_limit": 200000, - "supports_streaming": true, - "supports_tools": true, - "supports_vision": true, - "supports_computer_use": true, - "input_token_cost": 3.0, - "output_token_cost": 15.0, - "currency": "USD", - "supports_cache_control": true, - "metadata": {} - }, - { - "name": "gpt-4-turbo", + "name": "openai/gpt-4-turbo", "model_type": "chat", "context_limit": 128000, "supports_streaming": true, "supports_tools": true, - "supports_vision": true, - "supports_computer_use": false, "input_token_cost": 10.0, "output_token_cost": 30.0, - "currency": "USD", - "supports_cache_control": false, - "metadata": {} + "supports_cache_control": false }, { - "name": "gpt-4o", + "name": "openai/gpt-4o", "model_type": "chat", "context_limit": 128000, "supports_streaming": true, "supports_tools": true, - "supports_vision": true, - "supports_computer_use": false, "input_token_cost": 2.5, "output_token_cost": 10.0, - "currency": "USD", - "supports_cache_control": false, - "metadata": {} + "supports_cache_control": false } ] diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 393b674588ee..a6a9fe16f9df 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -19,7 +19,7 @@ pub enum ModelType { /// Canonical representation of a model with standardized metadata #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CanonicalModel { - /// Canonical name for this model (e.g., "claude-3-5-sonnet-20241022") + /// Canonical name for this model (e.g., "anthropic/claude-3-5-sonnet") pub name: String, /// The type of model @@ -34,33 +34,14 @@ pub struct CanonicalModel { /// Whether the model supports tool/function calling pub supports_tools: bool, - /// Whether the model supports vision/image inputs - pub supports_vision: bool, - - /// Whether the model supports computer use/MCP - pub supports_computer_use: bool, - - /// Cost per million input tokens + /// Cost per million input tokens (in USD) pub input_token_cost: Option, - /// Cost per million output tokens + /// Cost per million output tokens (in USD) pub output_token_cost: Option, - /// Currency for pricing (defaults to USD) - #[serde(default = "default_currency")] - pub currency: String, - /// Whether the model supports prompt caching - #[serde(default)] pub supports_cache_control: bool, - - /// Additional metadata as key-value pairs - #[serde(default)] - pub metadata: std::collections::HashMap, -} - -fn default_currency() -> String { - "USD".to_string() } impl CanonicalModel { @@ -76,13 +57,9 @@ impl CanonicalModel { context_limit, supports_streaming: false, supports_tools: false, - supports_vision: false, - supports_computer_use: false, input_token_cost: None, output_token_cost: None, - currency: default_currency(), supports_cache_control: false, - metadata: std::collections::HashMap::new(), } } @@ -98,19 +75,7 @@ impl CanonicalModel { self } - /// Builder method to set vision support - pub fn with_vision(mut self, supports: bool) -> Self { - self.supports_vision = supports; - self - } - - /// Builder method to set computer use support - pub fn with_computer_use(mut self, supports: bool) -> Self { - self.supports_computer_use = supports; - self - } - - /// Builder method to set pricing + /// Builder method to set pricing (in USD per million tokens) pub fn with_pricing(mut self, input_cost: f64, output_cost: f64) -> Self { self.input_token_cost = Some(input_cost); self.output_token_cost = Some(output_cost); @@ -122,12 +87,6 @@ impl CanonicalModel { self.supports_cache_control = supports; self } - - /// Builder method to add custom metadata - pub fn with_metadata(mut self, key: impl Into, value: serde_json::Value) -> Self { - self.metadata.insert(key.into(), value); - self - } } #[cfg(test)] From f1808607df1d7c6cd211dcd679c3726a388029a7 Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 11 Nov 2025 17:03:20 -0500 Subject: [PATCH 03/52] data fix --- canonical_mapping_report.json | 72 +++++++++++++------ crates/goose/src/providers/anthropic.rs | 2 +- crates/goose/src/providers/canonical/model.rs | 23 +----- 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/canonical_mapping_report.json b/canonical_mapping_report.json index 48eff69eceb4..5564167cb476 100644 --- a/canonical_mapping_report.json +++ b/canonical_mapping_report.json @@ -1,6 +1,42 @@ { - "timestamp": "2025-11-10T18:00:30.074725+00:00", + "timestamp": "2025-11-11T21:48:08.783638+00:00", "unmapped_models": [ + { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022" + }, + { + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219" + }, + { + "provider": "anthropic", + "model": "claude-3-haiku-20240307" + }, + { + "provider": "anthropic", + "model": "claude-3-opus-20240229" + }, + { + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-1-20250805" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-20250514" + }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-20250514" + }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929" + }, { "provider": "openai", "model": "ada:ft-square-2023-01-20-06-09-37" @@ -2181,10 +2217,6 @@ "provider": "openai", "model": "gpt-4.1-mini-2025-04-14" }, - { - "provider": "openai", - "model": "gpt-4.1-mini-test-api-ev3" - }, { "provider": "openai", "model": "gpt-4.1-nano" @@ -2857,10 +2889,6 @@ "provider": "openrouter", "model": "mistralai/mistral-7b-instruct-v0.1" }, - { - "provider": "openrouter", - "model": "mistralai/mistral-7b-instruct-v0.3" - }, { "provider": "openrouter", "model": "mistralai/mistral-7b-instruct:free" @@ -3837,6 +3865,10 @@ "provider": "databricks", "model": "prime_model" }, + { + "provider": "databricks", + "model": "raml-claude-sonnet-4-5" + }, { "provider": "databricks", "model": "reportiq_selector_1" @@ -4135,11 +4167,11 @@ }, { "provider": "google", - "model": "imagen-3.0-generate-002" + "model": "imagen-4.0-generate-preview-06-06" }, { "provider": "google", - "model": "imagen-4.0-generate-preview-06-06" + "model": "imagen-4.0-ultra-generate-preview-06-06" }, { "provider": "google", @@ -4151,20 +4183,20 @@ } ], "all_mappings": { + "google": [], + "openai": [], "tetrate": [], - "anthropic": [], "openrouter": [], - "databricks": [], - "openai": [], - "google": [] + "anthropic": [], + "databricks": [] }, "model_counts": { + "anthropic": 9, + "google": 50, "tetrate": 0, - "openai": 626, - "anthropic": 0, - "databricks": 142, - "openrouter": 219, - "google": 50 + "openai": 625, + "openrouter": 218, + "databricks": 143 }, "canonical_models_used": [] } \ No newline at end of file diff --git a/crates/goose/src/providers/anthropic.rs b/crates/goose/src/providers/anthropic.rs index 06dbd8fecfad..7f0d41be05f2 100644 --- a/crates/goose/src/providers/anthropic.rs +++ b/crates/goose/src/providers/anthropic.rs @@ -233,7 +233,7 @@ impl Provider for AnthropicProvider { } let json = response.payload.unwrap_or_default(); - let arr = match json.get("models").and_then(|v| v.as_array()) { + let arr = match json.get("data").and_then(|v| v.as_array()) { Some(arr) => arr, None => return Ok(None), }; diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index a6a9fe16f9df..97cae1fa5ba1 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -87,25 +87,4 @@ impl CanonicalModel { self.supports_cache_control = supports; self } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_canonical_model_builder() { - let model = CanonicalModel::new("test-model", ModelType::Chat, 8192) - .with_streaming(true) - .with_tools(true) - .with_pricing(1.0, 2.0); - - assert_eq!(model.name, "test-model"); - assert_eq!(model.model_type, ModelType::Chat); - assert_eq!(model.context_limit, 8192); - assert!(model.supports_streaming); - assert!(model.supports_tools); - assert_eq!(model.input_token_cost, Some(1.0)); - assert_eq!(model.output_token_cost, Some(2.0)); - } -} +} \ No newline at end of file From 1f86c03545a21b4fb489f4a14d45988c572a2238 Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 11 Nov 2025 17:14:18 -0500 Subject: [PATCH 04/52] Big refactor --- canonical_mapping_report.json | 16 +-- crates/goose/src/providers/canonical/mod.rs | 2 + .../src/providers/canonical/name_builder.rs | 132 ++++++++++++++++++ 3 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 crates/goose/src/providers/canonical/name_builder.rs diff --git a/canonical_mapping_report.json b/canonical_mapping_report.json index 5564167cb476..1693470ed92b 100644 --- a/canonical_mapping_report.json +++ b/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-11T21:48:08.783638+00:00", + "timestamp": "2025-11-11T22:13:04.957991+00:00", "unmapped_models": [ { "provider": "anthropic", @@ -4183,20 +4183,20 @@ } ], "all_mappings": { - "google": [], + "databricks": [], "openai": [], - "tetrate": [], "openrouter": [], - "anthropic": [], - "databricks": [] + "tetrate": [], + "google": [], + "anthropic": [] }, "model_counts": { - "anthropic": 9, + "databricks": 143, + "openai": 625, "google": 50, "tetrate": 0, - "openai": 625, "openrouter": 218, - "databricks": 143 + "anthropic": 9 }, "canonical_models_used": [] } \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/mod.rs b/crates/goose/src/providers/canonical/mod.rs index d854cd186e20..686243a53044 100644 --- a/crates/goose/src/providers/canonical/mod.rs +++ b/crates/goose/src/providers/canonical/mod.rs @@ -1,7 +1,9 @@ mod model; +mod name_builder; mod registry; pub use model::{CanonicalModel, ModelType}; +pub use name_builder::{canonical_name, strip_version_suffix}; pub use registry::CanonicalModelRegistry; /// Represents a mapping from a provider's model name to a canonical model diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs new file mode 100644 index 000000000000..17e92ccbf304 --- /dev/null +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -0,0 +1,132 @@ +/// Build canonical model name from provider and model identifiers +/// +/// This function handles different provider conventions: +/// - **OpenRouter**: Models are already in canonical format (e.g., "anthropic/claude-3.5-sonnet"), +/// so just strip version suffixes +/// - **Other providers** (Anthropic, OpenAI, Google, etc.): Prefix with provider name and strip +/// version suffixes +/// +/// Examples: +/// - `canonical_name("anthropic", "claude-3-5-sonnet-20241022")` → `"anthropic/claude-3-5-sonnet"` +/// - `canonical_name("openai", "gpt-4-turbo-2024-04-09")` → `"openai/gpt-4-turbo"` +/// - `canonical_name("google", "gemini-1.5-pro-002")` → `"google/gemini-1.5-pro"` +/// - `canonical_name("openrouter", "anthropic/claude-3.5-sonnet")` → `"anthropic/claude-3.5-sonnet"` +pub fn canonical_name(provider: &str, model: &str) -> String { + let model_base = strip_version_suffix(model); + + // OpenRouter models are already in canonical format + if provider == "openrouter" { + model_base + } else { + format!("{}/{}", provider, model_base) + } +} + +/// Strip version suffixes from model names +/// +/// Strips patterns like: +/// - `-20241022` (8-digit dates) +/// - `-2024-04-09` (YYYY-MM-DD dates) +/// - `-002` or `-v1.5` (version numbers) +/// +/// Examples: +/// - `strip_version_suffix("claude-3-5-sonnet-20241022")` → `"claude-3-5-sonnet"` +/// - `strip_version_suffix("gpt-4-turbo-2024-04-09")` → `"gpt-4-turbo"` +/// - `strip_version_suffix("gemini-1.5-pro-002")` → `"gemini-1.5-pro"` +pub fn strip_version_suffix(model: &str) -> String { + // Strip datetime suffixes like: + // - "-20241022" (8 digits) + // - "-2024-04-09" (YYYY-MM-DD) + // - "-v1.5" or "-002" (version numbers) + let patterns = [ + regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 + regex::Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), // -2024-04-09 + regex::Regex::new(r"-v?\d+(\.\d+)*$").unwrap(), // -v1.5 or -002 + ]; + + let mut result = model.to_string(); + for pattern in &patterns { + result = pattern.replace(&result, "").to_string(); + } + result +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_canonical_name_anthropic() { + assert_eq!( + canonical_name("anthropic", "claude-3-5-sonnet-20241022"), + "anthropic/claude-3-5-sonnet" + ); + } + + #[test] + fn test_canonical_name_openai() { + assert_eq!( + canonical_name("openai", "gpt-4-turbo-2024-04-09"), + "openai/gpt-4-turbo" + ); + } + + #[test] + fn test_canonical_name_google() { + assert_eq!( + canonical_name("google", "gemini-1.5-pro-002"), + "google/gemini-1.5-pro" + ); + } + + #[test] + fn test_canonical_name_no_version() { + assert_eq!( + canonical_name("anthropic", "claude-3-5-sonnet"), + "anthropic/claude-3-5-sonnet" + ); + } + + #[test] + fn test_canonical_name_openrouter() { + assert_eq!( + canonical_name("openrouter", "anthropic/claude-3.5-sonnet"), + "anthropic/claude-3.5-sonnet" + ); + } + + #[test] + fn test_canonical_name_openrouter_with_version() { + assert_eq!( + canonical_name("openrouter", "openai/gpt-4-turbo-2024-04-09"), + "openai/gpt-4-turbo" + ); + } + + #[test] + fn test_strip_version_suffix_8_digit() { + assert_eq!( + strip_version_suffix("claude-3-5-sonnet-20241022"), + "claude-3-5-sonnet" + ); + } + + #[test] + fn test_strip_version_suffix_date() { + assert_eq!( + strip_version_suffix("gpt-4-turbo-2024-04-09"), + "gpt-4-turbo" + ); + } + + #[test] + fn test_strip_version_suffix_version_number() { + assert_eq!(strip_version_suffix("gemini-1.5-pro-002"), "gemini-1.5-pro"); + assert_eq!(strip_version_suffix("model-v1.5"), "model"); + } + + #[test] + fn test_strip_version_suffix_no_suffix() { + assert_eq!(strip_version_suffix("claude-3-5-sonnet"), "claude-3-5-sonnet"); + } +} From c0c970f5ff9f74e613454babc3c4835bcca72e7b Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 11 Nov 2025 17:54:28 -0500 Subject: [PATCH 05/52] Swap to openrouter approach --- .../goose/examples/fetch_canonical_models.rs | 94 + .../goose/src/providers/canonical/README.md | 129 +- .../providers/canonical/canonical_models.json | 3420 ++++++++++++++++- crates/goose/src/providers/canonical/mod.rs | 2 +- crates/goose/src/providers/canonical/model.rs | 174 +- .../goose/src/providers/canonical/registry.rs | 42 +- 6 files changed, 3698 insertions(+), 163 deletions(-) create mode 100644 crates/goose/examples/fetch_canonical_models.rs diff --git a/crates/goose/examples/fetch_canonical_models.rs b/crates/goose/examples/fetch_canonical_models.rs new file mode 100644 index 000000000000..947310b50d80 --- /dev/null +++ b/crates/goose/examples/fetch_canonical_models.rs @@ -0,0 +1,94 @@ +/// Fetch Canonical Models from OpenRouter +/// +/// This script fetches model metadata from OpenRouter's API and generates +/// a canonical_models.json file with standardized model information. +/// +/// Usage: +/// cargo run --example fetch_canonical_models +/// +/// The generated file will be written to: +/// crates/goose/src/providers/canonical/canonical_models.json +/// + +use anyhow::{Context, Result}; +use goose::providers::canonical::{CanonicalModel, CanonicalModelRegistry}; +use serde::Deserialize; +use std::path::PathBuf; + +#[derive(Debug, Deserialize)] +struct OpenRouterResponse { + data: Vec, +} + +const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/models"; + +// Providers we want to include +const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai"]; + +#[tokio::main] +async fn main() -> Result<()> { + println!("Fetching models from OpenRouter API...\n"); + + // Fetch models from OpenRouter + let client = reqwest::Client::new(); + let response = client + .get(OPENROUTER_API_URL) + .header("User-Agent", "goose/canonical-fetcher") + .send() + .await + .context("Failed to fetch from OpenRouter API")?; + + let openrouter_response: OpenRouterResponse = response + .json() + .await + .context("Failed to parse OpenRouter response")?; + + println!("✓ Fetched {} models from OpenRouter\n", openrouter_response.data.len()); + + // Filter to only allowed providers + let filtered_models: Vec = openrouter_response + .data + .into_iter() + .filter(|model| { + if let Some(provider) = model.provider() { + ALLOWED_PROVIDERS.contains(&provider) + } else { + false + } + }) + .collect(); + + println!("Filtered to {} models from allowed providers:", filtered_models.len()); + + // Count models per provider + let mut provider_counts: std::collections::HashMap = std::collections::HashMap::new(); + for model in &filtered_models { + if let Some(provider) = model.provider() { + *provider_counts.entry(provider.to_string()).or_insert(0) += 1; + } + } + + let mut providers: Vec<_> = provider_counts.iter().collect(); + providers.sort_by_key(|(name, _)| *name); + for (provider, count) in providers { + println!(" {}: {} models", provider, count); + } + + // Create registry and add models + let mut registry = CanonicalModelRegistry::new(); + for model in filtered_models { + registry.register(model); + } + + // Determine output path + let output_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("src/providers/canonical/canonical_models.json"); + + // Save to file + registry.to_file(&output_path) + .context("Failed to save canonical models file")?; + + println!("\n✓ Saved {} models to: {}", registry.count(), output_path.display()); + + Ok(()) +} diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 99149bb033c2..2ae0475df23a 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -4,24 +4,25 @@ This directory contains the canonical model infrastructure for standardizing mod ## Overview -The canonical model system solves the problem that different LLM providers return varying levels of information about their models. Some providers only return model names, while others provide rich metadata. This system: +The canonical model system provides a unified view of model metadata across different LLM providers. It's based on OpenRouter's model schema and maintained through automated fetching: -1. **Maintains a canonical registry** of models with standardized metadata -2. **Provides a mapping layer** for providers to map their models to canonical models -3. **Enables model validation** to ensure proper metadata for all supported models +1. **Canonical registry** - Models with standardized metadata from OpenRouter +2. **Provider mapping layer** - Maps provider-specific model names to canonical models +3. **Automated updates** - Rust script to re-fetch models from OpenRouter's API ## Components ### `model.rs` -Defines the core data structures: +Defines the core data structures based on OpenRouter's schema: -- `ModelType` enum: chat, voice, embedding, image, other - `CanonicalModel`: Complete model metadata including: - - Basic info: name (provider/model-name format), type, context limit - - Capabilities: streaming, tools - - Pricing: input/output token costs (in USD) - - Additional features: cache control + - IDs: `id` (API identifier), `canonical_slug` (standardized reference) + - Basic info: name, description, context_length + - `Architecture`: Modality, input/output types, tokenizer info + - `Pricing`: Per-token costs (prompt, completion, cache read/write) + - `TopProvider`: Context limits and moderation status + - Supported parameters (for tools, temperature, etc.) ### `registry.rs` @@ -29,17 +30,38 @@ Provides model registry management: - `CanonicalModelRegistry`: In-memory registry of canonical models - Load/save from/to JSON files -- Query and lookup operations +- Query and lookup operations using `canonical_slug` ### `canonical_models.json` -JSON file containing the canonical model definitions. This is the source of truth for model metadata. +JSON file containing canonical model definitions fetched from OpenRouter. Currently includes models from: +- anthropic +- google +- openai + +## Updating Models + +To refresh the canonical models from OpenRouter's API: + +```bash +cargo run --example fetch_canonical_models +``` + +This script: +1. Fetches all models from OpenRouter's `/models` endpoint +2. Filters to only allowed providers (anthropic, google, openai) +3. Generates a new `canonical_models.json` file + +The generated file will be written to: +``` +crates/goose/src/providers/canonical/canonical_models.json +``` ## Usage ### For Provider Implementors -Implement the `map_to_canonical_models()` method in your provider: +Implement the `map_to_canonical_models()` method in your provider to map provider-specific model IDs to canonical slugs: ```rust async fn map_to_canonical_models(&self) -> Result, ProviderError> { @@ -49,16 +71,18 @@ async fn map_to_canonical_models(&self) -> Result, ProviderErr let mut mappings = Vec::new(); for model in models { - // Map your provider's model name to canonical name - let canonical = match model.as_str() { + // Map your provider's model ID to canonical slug + let canonical_slug = match model.as_str() { "claude-3-5-sonnet-20241022" => "anthropic/claude-3-5-sonnet", + "claude-3-5-sonnet-20250219" => "anthropic/claude-3-7-sonnet-20250219", "gpt-4-turbo-2024-04-09" => "openai/gpt-4-turbo", + "gemini-1.5-pro" => "google/gemini-1-5-pro", // ... more mappings _ => continue, // Skip unmapped models }; mappings.push( - ModelMapping::new(model, canonical).verified() + ModelMapping::new(model, canonical_slug).verified() ); } @@ -66,6 +90,30 @@ async fn map_to_canonical_models(&self) -> Result, ProviderErr } ``` +### Using Canonical Models + +```rust +use goose::providers::canonical::CanonicalModelRegistry; + +// Load the registry +let registry = CanonicalModelRegistry::from_file("canonical_models.json")?; + +// Look up a model by canonical slug +if let Some(model) = registry.get("anthropic/claude-3-5-sonnet") { + println!("Model: {}", model.name); + println!("Context: {} tokens", model.context_length); + println!("Supports tools: {}", model.supports_tools()); + println!("Supports vision: {}", model.supports_vision()); + + if let (Some(prompt_cost), Some(completion_cost)) = + (model.prompt_cost(), model.completion_cost()) { + println!("Pricing: ${}/1M prompt, ${}/1M completion", + prompt_cost * 1_000_000.0, + completion_cost * 1_000_000.0); + } +} +``` + ### Testing Your Mappings Use the `canonical_model_checker` example to test your mappings: @@ -83,27 +131,42 @@ This will: **Note:** Requires proper provider credentials to be configured. -### Adding New Canonical Models +### Adding New Providers -1. Add the model definition to `canonical_models.json` -2. Include all required metadata: - - name (provider/model-name format), model_type, context_limit (required) - - capabilities (streaming, tools, cache_control) - - pricing information (in USD) -3. Run the test script to verify mappings +To add support for a new provider (e.g., "mistral"): -## Model Metadata Fields +1. Update the `ALLOWED_PROVIDERS` list in `examples/fetch_canonical_models.rs`: + ```rust + const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai", "mistral"]; + ``` -- `name`: Canonical name for the model using provider/model-name format (e.g., "anthropic/claude-3-5-sonnet", "openai/gpt-4o") -- `model_type`: Type of model (chat, voice, embedding, image, other) -- `context_limit`: Maximum context window in tokens -- `supports_streaming`: Whether model supports streaming responses -- `supports_tools`: Whether model supports tool/function calling (includes MCP) -- `input_token_cost`: Cost per million input tokens in USD (optional) -- `output_token_cost`: Cost per million output tokens in USD (optional) -- `supports_cache_control`: Whether model supports prompt caching +2. Re-run the fetch script: + ```bash + cargo run --example fetch_canonical_models + ``` + +## Model Metadata Fields -**Note:** Canonical models represent model families without datetime-specific versions. Provider-specific versioned models (e.g., "claude-3-5-sonnet-20241022") should be mapped to their canonical equivalents (e.g., "anthropic/claude-3-5-sonnet"). +Fields from OpenRouter's schema: + +- **`id`**: OpenRouter's API identifier (e.g., "anthropic/claude-sonnet-4.5") +- **`canonical_slug`**: Standardized reference with version (e.g., "anthropic/claude-4.5-sonnet-20250929") + - This is our primary key for model lookups +- **`name`**: Human-readable name +- **`created`**: Unix timestamp of model creation +- **`description`**: Detailed model description +- **`context_length`**: Maximum context window in tokens +- **`architecture`**: Modality info, input/output types, tokenizer +- **`pricing`**: Per-token costs in USD (prompt, completion, cache read/write, images) +- **`top_provider`**: Context limits and moderation status from best provider +- **`supported_parameters`**: List of supported parameters (tools, temperature, etc.) + +Helper methods on `CanonicalModel`: +- `supports_tools()` - Check if model supports tool/function calling +- `supports_vision()` - Check if model supports image inputs +- `supports_cache()` - Check if model supports prompt caching +- `provider()` - Extract provider name from canonical slug +- `prompt_cost()` / `completion_cost()` - Parse pricing as f64 ## Goals diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json index c9f5f9f966c7..db1c2430f40a 100644 --- a/crates/goose/src/providers/canonical/canonical_models.json +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -1,32 +1,3394 @@ [ { - "name": "anthropic/claude-3-5-sonnet", - "model_type": "chat", - "context_limit": 200000, - "supports_streaming": true, - "supports_tools": true, - "input_token_cost": 3.0, - "output_token_cost": 15.0, - "supports_cache_control": true - }, - { - "name": "openai/gpt-4-turbo", - "model_type": "chat", - "context_limit": 128000, - "supports_streaming": true, - "supports_tools": true, - "input_token_cost": 10.0, - "output_token_cost": 30.0, - "supports_cache_control": false - }, - { - "name": "openai/gpt-4o", - "model_type": "chat", - "context_limit": 128000, - "supports_streaming": true, - "supports_tools": true, - "input_token_cost": 2.5, - "output_token_cost": 10.0, - "supports_cache_control": false + "id": "anthropic/claude-3.5-haiku", + "canonical_slug": "anthropic/claude-3-5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "created": 1730678400, + "description": "Claude 3.5 Haiku features offers enhanced capabilities in speed, coding accuracy, and tool use. Engineered to excel in real-time applications, it delivers quick response times that are essential for dynamic tasks such as chat interactions and immediate coding suggestions.\n\nThis makes it highly suitable for environments that demand both speed and precision, such as software development, customer service bots, and data management systems.\n\nThis model is currently pointing to [Claude 3.5 Haiku (2024-10-22)](/anthropic/claude-3-5-haiku-20241022).", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000008", + "completion": "0.000004", + "request": "0", + "image": "0", + "input_cache_read": "0.00000008", + "input_cache_write": "0.000001" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 8192, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-3.5-haiku-20241022", + "canonical_slug": "anthropic/claude-3-5-haiku-20241022", + "name": "Anthropic: Claude 3.5 Haiku (2024-10-22)", + "created": 1730678400, + "description": "Claude 3.5 Haiku features enhancements across all skill sets including coding, tool use, and reasoning. As the fastest model in the Anthropic lineup, it offers rapid response times suitable for applications that require high interactivity and low latency, such as user-facing chatbots and on-the-fly code completions. It also excels in specialized tasks like data extraction and real-time content moderation, making it a versatile tool for a broad range of industries.\n\nIt does not support image inputs.\n\nSee the launch announcement and benchmark results [here](https://www.anthropic.com/news/3-5-models-and-computer-use)", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000008", + "completion": "0.000004", + "request": "0", + "image": "0", + "input_cache_read": "0.00000008", + "input_cache_write": "0.000001" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 8192, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-3.7-sonnet", + "canonical_slug": "anthropic/claude-3-7-sonnet-20250219", + "name": "Anthropic: Claude 3.7 Sonnet", + "created": 1740422110, + "description": "Claude 3.7 Sonnet is an advanced large language model with improved reasoning, coding, and problem-solving capabilities. It introduces a hybrid reasoning approach, allowing users to choose between rapid responses and extended, step-by-step processing for complex tasks. The model demonstrates notable improvements in coding, particularly in front-end development and full-stack updates, and excels in agentic workflows, where it can autonomously navigate multi-step processes. \n\nClaude 3.7 Sonnet maintains performance parity with its predecessor in standard mode while offering an extended reasoning mode for enhanced accuracy in math, coding, and instruction-following tasks.\n\nRead more at the [blog post here](https://www.anthropic.com/news/claude-3-7-sonnet)", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "request": "0", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 64000, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-3-haiku", + "canonical_slug": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "created": 1710288000, + "description": "Claude 3 Haiku is Anthropic's fastest and most compact model for\nnear-instant responsiveness. Quick and accurate targeted performance.\n\nSee the launch announcement and benchmark results [here](https://www.anthropic.com/news/claude-3-haiku)\n\n#multimodal", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000025", + "completion": "0.00000125", + "request": "0", + "image": "0.0004", + "input_cache_read": "0.00000003", + "input_cache_write": "0.0000003" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-3-opus", + "canonical_slug": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "created": 1709596800, + "description": "Claude 3 Opus is Anthropic's most powerful model for highly complex tasks. It boasts top-level performance, intelligence, fluency, and understanding.\n\nSee the launch announcement and benchmark results [here](https://www.anthropic.com/news/claude-3-family)\n\n#multimodal", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "request": "0", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-3.5-sonnet", + "canonical_slug": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "created": 1729555200, + "description": "New Claude 3.5 Sonnet delivers better-than-Opus capabilities, faster-than-Sonnet speeds, at the same Sonnet prices. Sonnet is particularly good at:\n\n- Coding: Scores ~49% on SWE-Bench Verified, higher than the last best score, and without any fancy prompt scaffolding\n- Data science: Augments human data science expertise; navigates unstructured data while using multiple tools for insights\n- Visual processing: excelling at interpreting charts, graphs, and images, accurately transcribing text to derive insights beyond just the text alone\n- Agentic tasks: exceptional tool use, making it great at agentic tasks (i.e. complex, multi-step problem solving tasks that require engaging with other systems)\n\n#multimodal", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "request": "0", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 8192, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-3.5-sonnet-20240620", + "canonical_slug": "anthropic/claude-3.5-sonnet-20240620", + "name": "Anthropic: Claude 3.5 Sonnet (2024-06-20)", + "created": 1718841600, + "description": "Claude 3.5 Sonnet delivers better-than-Opus capabilities, faster-than-Sonnet speeds, at the same Sonnet prices. Sonnet is particularly good at:\n\n- Coding: Autonomously writes, edits, and runs code with reasoning and troubleshooting\n- Data science: Augments human data science expertise; navigates unstructured data while using multiple tools for insights\n- Visual processing: excelling at interpreting charts, graphs, and images, accurately transcribing text to derive insights beyond just the text alone\n- Agentic tasks: exceptional tool use, making it great at agentic tasks (i.e. complex, multi-step problem solving tasks that require engaging with other systems)\n\nFor the latest version (2024-10-23), check out [Claude 3.5 Sonnet](/anthropic/claude-3.5-sonnet).\n\n#multimodal", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "request": "0", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 8192, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-opus-4", + "canonical_slug": "anthropic/claude-4-opus-20250522", + "name": "Anthropic: Claude Opus 4", + "created": 1747931245, + "description": "Claude Opus 4 is benchmarked as the world’s best coding model, at time of release, bringing sustained performance on complex, long-running tasks and agent workflows. It sets new benchmarks in software engineering, achieving leading results on SWE-bench (72.5%) and Terminal-bench (43.2%). Opus 4 supports extended, agentic workflows, handling thousands of task steps continuously for hours without degradation. \n\nRead more at the [blog post here](https://www.anthropic.com/news/claude-4)", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "request": "0", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 32000, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-sonnet-4", + "canonical_slug": "anthropic/claude-4-sonnet-20250522", + "name": "Anthropic: Claude Sonnet 4", + "created": 1747930371, + "description": "Claude Sonnet 4 significantly enhances the capabilities of its predecessor, Sonnet 3.7, excelling in both coding and reasoning tasks with improved precision and controllability. Achieving state-of-the-art performance on SWE-bench (72.7%), Sonnet 4 balances capability and computational efficiency, making it suitable for a broad range of applications from routine coding tasks to complex software development projects. Key enhancements include improved autonomous codebase navigation, reduced error rates in agent-driven workflows, and increased reliability in following intricate instructions. Sonnet 4 is optimized for practical everyday use, providing advanced reasoning capabilities while maintaining efficiency and responsiveness in diverse internal and external scenarios.\n\nRead more at the [blog post here](https://www.anthropic.com/news/claude-4)", + "context_length": 1000000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "request": "0", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + }, + "top_provider": { + "context_length": 1000000, + "max_completion_tokens": 64000, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-opus-4.1", + "canonical_slug": "anthropic/claude-4.1-opus-20250805", + "name": "Anthropic: Claude Opus 4.1", + "created": 1754411591, + "description": "Claude Opus 4.1 is an updated version of Anthropic’s flagship model, offering improved performance in coding, reasoning, and agentic tasks. It achieves 74.5% on SWE-bench Verified and shows notable gains in multi-file code refactoring, debugging precision, and detail-oriented reasoning. The model supports extended thinking up to 64K tokens and is optimized for tasks involving research, data analysis, and tool-assisted reasoning.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "request": "0", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 32000, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-haiku-4.5", + "canonical_slug": "anthropic/claude-4.5-haiku-20251001", + "name": "Anthropic: Claude Haiku 4.5", + "created": 1760547638, + "description": "Claude Haiku 4.5 is Anthropic’s fastest and most efficient model, delivering near-frontier intelligence at a fraction of the cost and latency of larger Claude models. Matching Claude Sonnet 4’s performance across reasoning, coding, and computer-use tasks, Haiku 4.5 brings frontier-level capability to real-time and high-volume applications.\n\nIt introduces extended thinking to the Haiku line; enabling controllable reasoning depth, summarized or interleaved thought output, and tool-assisted workflows with full support for coding, bash, web search, and computer-use tools. Scoring >73% on SWE-bench Verified, Haiku 4.5 ranks among the world’s best coding models while maintaining exceptional responsiveness for sub-agents, parallelized execution, and scaled deployment.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000001", + "completion": "0.000005", + "request": "0", + "image": "0", + "input_cache_read": "0.0000001", + "input_cache_write": "0.00000125" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 64000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "anthropic/claude-sonnet-4.5", + "canonical_slug": "anthropic/claude-4.5-sonnet-20250929", + "name": "Anthropic: Claude Sonnet 4.5", + "created": 1759161676, + "description": "Claude Sonnet 4.5 is Anthropic’s most advanced Sonnet model to date, optimized for real-world agents and coding workflows. It delivers state-of-the-art performance on coding benchmarks such as SWE-bench Verified, with improvements across system design, code security, and specification adherence. The model is designed for extended autonomous operation, maintaining task continuity across sessions and providing fact-based progress tracking.\n\nSonnet 4.5 also introduces stronger agentic capabilities, including improved tool orchestration, speculative parallel execution, and more efficient context and memory management. With enhanced context tracking and awareness of token usage across tool calls, it is particularly well-suited for multi-context and long-running workflows. Use cases span software engineering, cybersecurity, financial analysis, research agents, and other domains requiring sustained reasoning and tool use.", + "context_length": 1000000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "request": "0", + "image": "0", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + }, + "top_provider": { + "context_length": 1000000, + "max_completion_tokens": 64000, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "stop", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "google/gemini-2.0-flash-001", + "canonical_slug": "google/gemini-2.0-flash-001", + "name": "Google: Gemini 2.0 Flash", + "created": 1738769413, + "description": "Gemini Flash 2.0 offers a significantly faster time to first token (TTFT) compared to [Gemini Flash 1.5](/google/gemini-flash-1.5), while maintaining quality on par with larger models like [Gemini Pro 1.5](/google/gemini-pro-1.5). It introduces notable enhancements in multimodal understanding, coding capabilities, complex instruction following, and function calling. These advancements come together to deliver more seamless and robust agentic experiences.", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "request": "0", + "image": "0.0000258", + "input_cache_read": "0.000000025", + "input_cache_write": "0.0000001833" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 8192, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.0-flash-exp:free", + "canonical_slug": "google/gemini-2.0-flash-exp", + "name": "Google: Gemini 2.0 Flash Experimental (free)", + "created": 1733937523, + "description": "Gemini Flash 2.0 offers a significantly faster time to first token (TTFT) compared to [Gemini Flash 1.5](/google/gemini-flash-1.5), while maintaining quality on par with larger models like [Gemini Pro 1.5](/google/gemini-pro-1.5). It introduces notable enhancements in multimodal understanding, coding capabilities, complex instruction following, and function calling. These advancements come together to deliver more seamless and robust agentic experiences.", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0", + "completion": "0", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 8192, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.0-flash-lite-001", + "canonical_slug": "google/gemini-2.0-flash-lite-001", + "name": "Google: Gemini 2.0 Flash Lite", + "created": 1740506212, + "description": "Gemini 2.0 Flash Lite offers a significantly faster time to first token (TTFT) compared to [Gemini Flash 1.5](/google/gemini-flash-1.5), while maintaining quality on par with larger models like [Gemini Pro 1.5](/google/gemini-pro-1.5), all at extremely economical token prices.", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000000075", + "completion": "0.0000003", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 8192, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash", + "canonical_slug": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "created": 1750172488, + "description": "Gemini 2.5 Flash is Google's state-of-the-art workhorse model, specifically designed for advanced reasoning, coding, mathematics, and scientific tasks. It includes built-in \"thinking\" capabilities, enabling it to provide responses with greater accuracy and nuanced context handling. \n\nAdditionally, Gemini 2.5 Flash is configurable through the \"max tokens for reasoning\" parameter, as described in the documentation (https://openrouter.ai/docs/use-cases/reasoning-tokens#max-tokens-for-reasoning).", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "file", + "image", + "text", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "request": "0", + "image": "0.001238", + "input_cache_read": "0.00000003", + "input_cache_write": "0.0000003833" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash-image", + "canonical_slug": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "created": 1759870431, + "description": "Gemini 2.5 Flash Image, a.k.a. \"Nano Banana,\" is now generally available. It is a state of the art image generation model with contextual understanding. It is capable of image generation, edits, and multi-turn conversations. Aspect ratios can be controlled with the [image_config API Parameter](https://openrouter.ai/docs/features/multimodal/image-generation#image-aspect-ratio-configuration)", + "context_length": 32768, + "architecture": { + "modality": "text+image->text+image", + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "request": "0", + "image": "0.001238" + }, + "top_provider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash-image-preview", + "canonical_slug": "google/gemini-2.5-flash-image-preview", + "name": "Google: Gemini 2.5 Flash Image Preview (Nano Banana)", + "created": 1756218977, + "description": "Gemini 2.5 Flash Image Preview, a.k.a. \"Nano Banana,\" is a state of the art image generation model with contextual understanding. It is capable of image generation, edits, and multi-turn conversations.", + "context_length": 32768, + "architecture": { + "modality": "text+image->text+image", + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "request": "0", + "image": "0.001238" + }, + "top_provider": { + "context_length": 32768, + "max_completion_tokens": 32768, + "is_moderated": false + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "temperature", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash-lite", + "canonical_slug": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "created": 1753200276, + "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance across common benchmarks compared to earlier Flash models. By default, \"thinking\" (i.e. multi-pass reasoning) is disabled to prioritize speed, but developers can enable it via the [Reasoning API parameter](https://openrouter.ai/docs/use-cases/reasoning-tokens) to selectively trade off cost for intelligence. ", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "request": "0", + "image": "0", + "input_cache_read": "0.00000001", + "input_cache_write": "0.0000001833" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical_slug": "google/gemini-2.5-flash-lite-preview-06-17", + "name": "Google: Gemini 2.5 Flash Lite Preview 06-17", + "created": 1750173831, + "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance across common benchmarks compared to earlier Flash models. By default, \"thinking\" (i.e. multi-pass reasoning) is disabled to prioritize speed, but developers can enable it via the [Reasoning API parameter](https://openrouter.ai/docs/use-cases/reasoning-tokens) to selectively trade off cost for intelligence. ", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "file", + "image", + "text", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "request": "0", + "image": "0", + "input_cache_read": "0.000000025", + "input_cache_write": "0.0000001833" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_slug": "google/gemini-2.5-flash-lite-preview-09-2025", + "name": "Google: Gemini 2.5 Flash Lite Preview 09-2025", + "created": 1758819686, + "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance across common benchmarks compared to earlier Flash models. By default, \"thinking\" (i.e. multi-pass reasoning) is disabled to prioritize speed, but developers can enable it via the [Reasoning API parameter](https://openrouter.ai/docs/use-cases/reasoning-tokens) to selectively trade off cost for intelligence. ", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-flash-preview-09-2025", + "canonical_slug": "google/gemini-2.5-flash-preview-09-2025", + "name": "Google: Gemini 2.5 Flash Preview 09-2025", + "created": 1758820178, + "description": "Gemini 2.5 Flash Preview September 2025 Checkpoint is Google's state-of-the-art workhorse model, specifically designed for advanced reasoning, coding, mathematics, and scientific tasks. It includes built-in \"thinking\" capabilities, enabling it to provide responses with greater accuracy and nuanced context handling. \n\nAdditionally, Gemini 2.5 Flash is configurable through the \"max tokens for reasoning\" parameter, as described in the documentation (https://openrouter.ai/docs/use-cases/reasoning-tokens#max-tokens-for-reasoning).", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "file", + "text", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "request": "0", + "image": "0.001238", + "input_cache_read": "0.000000075", + "input_cache_write": "0.0000003833" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-pro", + "canonical_slug": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "created": 1750169544, + "description": "Gemini 2.5 Pro is Google’s state-of-the-art AI model designed for advanced reasoning, coding, mathematics, and scientific tasks. It employs “thinking” capabilities, enabling it to reason through responses with enhanced accuracy and nuanced context handling. Gemini 2.5 Pro achieves top-tier performance on multiple benchmarks, including first-place positioning on the LMArena leaderboard, reflecting superior human-preference alignment and complex problem-solving abilities.", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0.00516", + "input_cache_read": "0.000000125", + "input_cache_write": "0.000001625" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-pro-preview-05-06", + "canonical_slug": "google/gemini-2.5-pro-preview-03-25", + "name": "Google: Gemini 2.5 Pro Preview 05-06", + "created": 1746578513, + "description": "Gemini 2.5 Pro is Google’s state-of-the-art AI model designed for advanced reasoning, coding, mathematics, and scientific tasks. It employs “thinking” capabilities, enabling it to reason through responses with enhanced accuracy and nuanced context handling. Gemini 2.5 Pro achieves top-tier performance on multiple benchmarks, including first-place positioning on the LMArena leaderboard, reflecting superior human-preference alignment and complex problem-solving abilities.", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0.00516", + "input_cache_read": "0.00000031", + "input_cache_write": "0.000001625" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65535, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemini-2.5-pro-preview", + "canonical_slug": "google/gemini-2.5-pro-preview-06-05", + "name": "Google: Gemini 2.5 Pro Preview 06-05", + "created": 1749137257, + "description": "Gemini 2.5 Pro is Google’s state-of-the-art AI model designed for advanced reasoning, coding, mathematics, and scientific tasks. It employs “thinking” capabilities, enabling it to reason through responses with enhanced accuracy and nuanced context handling. Gemini 2.5 Pro achieves top-tier performance on multiple benchmarks, including first-place positioning on the LMArena leaderboard, reflecting superior human-preference alignment and complex problem-solving abilities.\n", + "context_length": 1048576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "file", + "image", + "text", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0.00516", + "input_cache_read": "0.00000031", + "input_cache_write": "0.000001625" + }, + "top_provider": { + "context_length": 1048576, + "max_completion_tokens": 65536, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "google/gemma-2-27b-it", + "canonical_slug": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "created": 1720828800, + "description": "Gemma 2 27B by Google is an open model built from the same research and technology used to create the [Gemini models](/models?q=gemini).\n\nGemma models are well-suited for a variety of text generation tasks, including question answering, summarization, and reasoning.\n\nSee the [launch announcement](https://blog.google/technology/developers/google-gemma-2/) for more details. Usage of Gemma is subject to Google's [Gemma Terms of Use](https://ai.google.dev/gemma/terms).", + "context_length": 8192, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": "gemma" + }, + "pricing": { + "prompt": "0.00000065", + "completion": "0.00000065", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 8192, + "max_completion_tokens": null, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "stop", + "structured_outputs", + "temperature", + "top_p" + ] + }, + { + "id": "google/gemma-2-9b-it", + "canonical_slug": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "created": 1719532800, + "description": "Gemma 2 9B by Google is an advanced, open-source language model that sets a new standard for efficiency and performance in its size class.\n\nDesigned for a wide variety of tasks, it empowers developers and researchers to build innovative applications, while maintaining accessibility, safety, and cost-effectiveness.\n\nSee the [launch announcement](https://blog.google/technology/developers/google-gemma-2/) for more details. Usage of Gemma is subject to Google's [Gemma Terms of Use](https://ai.google.dev/gemma/terms).", + "context_length": 8192, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": "gemma" + }, + "pricing": { + "prompt": "0.00000003", + "completion": "0.00000009", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 8192, + "max_completion_tokens": null, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "repetition_penalty", + "temperature", + "top_k", + "top_p" + ] + }, + { + "id": "google/gemma-3-12b-it", + "canonical_slug": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "created": 1741902625, + "description": "Gemma 3 introduces multimodality, supporting vision-language input and text outputs. It handles context windows up to 128k tokens, understands over 140 languages, and offers improved math, reasoning, and chat capabilities, including structured outputs and function calling. Gemma 3 12B is the second largest in the family of Gemma 3 models after [Gemma 3 27B](google/gemma-3-27b-it)", + "context_length": 131072, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": "gemma" + }, + "pricing": { + "prompt": "0.00000003", + "completion": "0.0000001", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 131072, + "max_completion_tokens": 131072, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_k", + "top_p" + ] + }, + { + "id": "google/gemma-3-27b-it", + "canonical_slug": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "created": 1741756359, + "description": "Gemma 3 introduces multimodality, supporting vision-language input and text outputs. It handles context windows up to 128k tokens, understands over 140 languages, and offers improved math, reasoning, and chat capabilities, including structured outputs and function calling. Gemma 3 27B is Google's latest open source model, successor to [Gemma 2](google/gemma-2-27b-it)", + "context_length": 131072, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": "gemma" + }, + "pricing": { + "prompt": "0.00000009", + "completion": "0.00000016", + "request": "0", + "image": "0.0000256" + }, + "top_provider": { + "context_length": 131072, + "max_completion_tokens": 16384, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "google/gemma-3-4b-it", + "canonical_slug": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "created": 1741905510, + "description": "Gemma 3 introduces multimodality, supporting vision-language input and text outputs. It handles context windows up to 128k tokens, understands over 140 languages, and offers improved math, reasoning, and chat capabilities, including structured outputs and function calling.", + "context_length": 96000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "instruct_type": "gemma" + }, + "pricing": { + "prompt": "0.00000001703012", + "completion": "0.0000000681536", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 96000, + "max_completion_tokens": null, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_k", + "top_p" + ] + }, + { + "id": "google/gemma-3n-e2b-it:free", + "canonical_slug": "google/gemma-3n-e2b-it", + "name": "Google: Gemma 3n 2B (free)", + "created": 1752074904, + "description": "Gemma 3n E2B IT is a multimodal, instruction-tuned model developed by Google DeepMind, designed to operate efficiently at an effective parameter size of 2B while leveraging a 6B architecture. Based on the MatFormer architecture, it supports nested submodels and modular composition via the Mix-and-Match framework. Gemma 3n models are optimized for low-resource deployment, offering 32K context length and strong multilingual and reasoning performance across common benchmarks. This variant is trained on a diverse corpus including code, math, web, and multimodal data.", + "context_length": 8192, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Other", + "instruct_type": null + }, + "pricing": { + "prompt": "0", + "completion": "0", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 8192, + "max_completion_tokens": 2048, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "temperature", + "top_p" + ] + }, + { + "id": "google/gemma-3n-e4b-it", + "canonical_slug": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "created": 1747776824, + "description": "Gemma 3n E4B-it is optimized for efficient execution on mobile and low-resource devices, such as phones, laptops, and tablets. It supports multimodal inputs—including text, visual data, and audio—enabling diverse tasks such as text generation, speech recognition, translation, and image analysis. Leveraging innovations like Per-Layer Embedding (PLE) caching and the MatFormer architecture, Gemma 3n dynamically manages memory usage and computational load by selectively activating model parameters, significantly reducing runtime resource requirements.\n\nThis model supports a wide linguistic range (trained in over 140 languages) and features a flexible 32K token context window. Gemma 3n can selectively load parameters, optimizing memory and computational efficiency based on the task or device capabilities, making it well-suited for privacy-focused, offline-capable applications and on-device AI solutions. [Read more in the blog post](https://developers.googleblog.com/en/introducing-gemma-3n/)", + "context_length": 32768, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Other", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000002", + "completion": "0.00000004", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 32768, + "max_completion_tokens": null, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "repetition_penalty", + "stop", + "temperature", + "top_k", + "top_p" + ] + }, + { + "id": "openai/chatgpt-4o-latest", + "canonical_slug": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "created": 1723593600, + "description": "OpenAI ChatGPT 4o is continually updated by OpenAI to point to the current version of GPT-4o used by ChatGPT. It therefore differs slightly from the API version of [GPT-4o](/models/openai/gpt-4o) in that it has additional RLHF. It is intended for research and evaluation.\n\nOpenAI notes that this model is not suited for production use-cases as it may be removed or redirected to another model in the future.", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000005", + "completion": "0.000015", + "request": "0", + "image": "0.007225" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/codex-mini", + "canonical_slug": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "created": 1747409761, + "description": "codex-mini-latest is a fine-tuned version of o4-mini specifically for use in Codex CLI. For direct use in the API, we recommend starting with gpt-4.1.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000015", + "completion": "0.000006", + "request": "0", + "image": "0", + "input_cache_read": "0.000000375" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-3.5-turbo", + "canonical_slug": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "created": 1685232000, + "description": "GPT-3.5 Turbo is OpenAI's fastest model. It can understand and generate natural language or code, and is optimized for chat and traditional completion tasks.\n\nTraining data up to Sep 2021.", + "context_length": 16385, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000005", + "completion": "0.0000015", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 16385, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-3.5-turbo-0613", + "canonical_slug": "openai/gpt-3.5-turbo-0613", + "name": "OpenAI: GPT-3.5 Turbo (older v0613)", + "created": 1706140800, + "description": "GPT-3.5 Turbo is OpenAI's fastest model. It can understand and generate natural language or code, and is optimized for chat and traditional completion tasks.\n\nTraining data up to Sep 2021.", + "context_length": 4095, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000001", + "completion": "0.000002", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 4095, + "max_completion_tokens": 4096, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "canonical_slug": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "created": 1693180800, + "description": "This model offers four times the context length of gpt-3.5-turbo, allowing it to support approximately 20 pages of text in a single request at a higher cost. Training data: up to Sep 2021.", + "context_length": 16385, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000003", + "completion": "0.000004", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 16385, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "canonical_slug": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "created": 1695859200, + "description": "This model is a variant of GPT-3.5 Turbo tuned for instructional prompts and omitting chat-related optimizations. Training data: up to Sep 2021.", + "context_length": 4095, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": "chatml" + }, + "pricing": { + "prompt": "0.0000015", + "completion": "0.000002", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 4095, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4", + "canonical_slug": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "created": 1685232000, + "description": "OpenAI's flagship model, GPT-4 is a large-scale multimodal language model capable of solving difficult problems with greater accuracy than previous models due to its broader general knowledge and advanced reasoning capabilities. Training data: up to Sep 2021.", + "context_length": 8191, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00003", + "completion": "0.00006", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 8191, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4-0314", + "canonical_slug": "openai/gpt-4-0314", + "name": "OpenAI: GPT-4 (older v0314)", + "created": 1685232000, + "description": "GPT-4-0314 is the first version of GPT-4 released, with a context length of 8,192 tokens, and was supported until June 14. Training data: up to Sep 2021.", + "context_length": 8191, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00003", + "completion": "0.00006", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 8191, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4-1106-preview", + "canonical_slug": "openai/gpt-4-1106-preview", + "name": "OpenAI: GPT-4 Turbo (older v1106)", + "created": 1699228800, + "description": "The latest GPT-4 Turbo model with vision capabilities. Vision requests can now use JSON mode and function calling.\n\nTraining data: up to April 2023.", + "context_length": 128000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00001", + "completion": "0.00003", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4-turbo", + "canonical_slug": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "created": 1712620800, + "description": "The latest GPT-4 Turbo model with vision capabilities. Vision requests can now use JSON mode and function calling.\n\nTraining data: up to December 2023.", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00001", + "completion": "0.00003", + "request": "0", + "image": "0.01445" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4-turbo-preview", + "canonical_slug": "openai/gpt-4-turbo-preview", + "name": "OpenAI: GPT-4 Turbo Preview", + "created": 1706140800, + "description": "The preview GPT-4 model with improved instruction following, JSON mode, reproducible outputs, parallel function calling, and more. Training data: up to Dec 2023.\n\n**Note:** heavily rate limited by OpenAI while in preview.", + "context_length": 128000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00001", + "completion": "0.00003", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4.1", + "canonical_slug": "openai/gpt-4.1-2025-04-14", + "name": "OpenAI: GPT-4.1", + "created": 1744651385, + "description": "GPT-4.1 is a flagship large language model optimized for advanced instruction following, real-world software engineering, and long-context reasoning. It supports a 1 million token context window and outperforms GPT-4o and GPT-4.5 across coding (54.6% SWE-bench Verified), instruction compliance (87.4% IFEval), and multimodal understanding benchmarks. It is tuned for precise code diffs, agent reliability, and high recall in large document contexts, making it ideal for agents, IDE tooling, and enterprise knowledge retrieval.", + "context_length": 1047576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "request": "0", + "image": "0", + "input_cache_read": "0.0000005" + }, + "top_provider": { + "context_length": 1047576, + "max_completion_tokens": 32768, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-4.1-mini", + "canonical_slug": "openai/gpt-4.1-mini-2025-04-14", + "name": "OpenAI: GPT-4.1 Mini", + "created": 1744651381, + "description": "GPT-4.1 Mini is a mid-sized model delivering performance competitive with GPT-4o at substantially lower latency and cost. It retains a 1 million token context window and scores 45.1% on hard instruction evals, 35.8% on MultiChallenge, and 84.1% on IFEval. Mini also shows strong coding ability (e.g., 31.6% on Aider’s polyglot diff benchmark) and vision understanding, making it suitable for interactive applications with tight performance constraints.", + "context_length": 1047576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000004", + "completion": "0.0000016", + "request": "0", + "image": "0", + "input_cache_read": "0.0000001" + }, + "top_provider": { + "context_length": 1047576, + "max_completion_tokens": 32768, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-4.1-nano", + "canonical_slug": "openai/gpt-4.1-nano-2025-04-14", + "name": "OpenAI: GPT-4.1 Nano", + "created": 1744651369, + "description": "For tasks that demand low latency, GPT‑4.1 nano is the fastest and cheapest model in the GPT-4.1 series. It delivers exceptional performance at a small size with its 1 million token context window, and scores 80.1% on MMLU, 50.3% on GPQA, and 9.8% on Aider polyglot coding – even higher than GPT‑4o mini. It’s ideal for tasks like classification or autocompletion.", + "context_length": 1047576, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "request": "0", + "image": "0", + "input_cache_read": "0.000000025" + }, + "top_provider": { + "context_length": 1047576, + "max_completion_tokens": 32768, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-4o:extended", + "canonical_slug": "openai/gpt-4o", + "name": "OpenAI: GPT-4o (extended)", + "created": 1715558400, + "description": "GPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.\n\nFor benchmarking against other models, it was briefly called [\"im-also-a-good-gpt2-chatbot\"](https://twitter.com/LiamFedus/status/1790064963966370209)\n\n#multimodal", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000006", + "completion": "0.000018", + "request": "0", + "image": "0.007225" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 64000, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-2024-05-13", + "canonical_slug": "openai/gpt-4o-2024-05-13", + "name": "OpenAI: GPT-4o (2024-05-13)", + "created": 1715558400, + "description": "GPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.\n\nFor benchmarking against other models, it was briefly called [\"im-also-a-good-gpt2-chatbot\"](https://twitter.com/LiamFedus/status/1790064963966370209)\n\n#multimodal", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000005", + "completion": "0.000015", + "request": "0", + "image": "0.007225" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 4096, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-2024-08-06", + "canonical_slug": "openai/gpt-4o-2024-08-06", + "name": "OpenAI: GPT-4o (2024-08-06)", + "created": 1722902400, + "description": "The 2024-08-06 version of GPT-4o offers improved performance in structured outputs, with the ability to supply a JSON schema in the respone_format. Read more [here](https://openai.com/index/introducing-structured-outputs-in-the-api/).\n\nGPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.\n\nFor benchmarking against other models, it was briefly called [\"im-also-a-good-gpt2-chatbot\"](https://twitter.com/LiamFedus/status/1790064963966370209)", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "request": "0", + "image": "0.003613", + "input_cache_read": "0.00000125" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-2024-11-20", + "canonical_slug": "openai/gpt-4o-2024-11-20", + "name": "OpenAI: GPT-4o (2024-11-20)", + "created": 1732127594, + "description": "The 2024-11-20 version of GPT-4o offers a leveled-up creative writing ability with more natural, engaging, and tailored writing to improve relevance & readability. It’s also better at working with uploaded files, providing deeper insights & more thorough responses.\n\nGPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "request": "0", + "image": "0.003613", + "input_cache_read": "0.00000125" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-audio-preview", + "canonical_slug": "openai/gpt-4o-audio-preview", + "name": "OpenAI: GPT-4o Audio", + "created": 1755233061, + "description": "The gpt-4o-audio-preview model adds support for audio inputs as prompts. This enhancement allows the model to detect nuances within audio recordings and add depth to generated user experiences. Audio outputs are currently not supported. Audio tokens are priced at $40 per million input audio tokens.", + "context_length": 128000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "audio", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-4o-mini", + "canonical_slug": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "created": 1721260800, + "description": "GPT-4o mini is OpenAI's newest model after [GPT-4 Omni](/models/openai/gpt-4o), supporting both text and image inputs with text outputs.\n\nAs their most advanced small model, it is many multiples more affordable than other recent frontier models, and more than 60% cheaper than [GPT-3.5 Turbo](/models/openai/gpt-3.5-turbo). It maintains SOTA intelligence, while being significantly more cost-effective.\n\nGPT-4o mini achieves an 82% score on MMLU and presently ranks higher than GPT-4 on chat preferences [common leaderboards](https://arena.lmsys.org/).\n\nCheck out the [launch announcement](https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/) to learn more.\n\n#multimodal", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "request": "0", + "image": "0.000217", + "input_cache_read": "0.000000075" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-mini-2024-07-18", + "canonical_slug": "openai/gpt-4o-mini-2024-07-18", + "name": "OpenAI: GPT-4o-mini (2024-07-18)", + "created": 1721260800, + "description": "GPT-4o mini is OpenAI's newest model after [GPT-4 Omni](/models/openai/gpt-4o), supporting both text and image inputs with text outputs.\n\nAs their most advanced small model, it is many multiples more affordable than other recent frontier models, and more than 60% cheaper than [GPT-3.5 Turbo](/models/openai/gpt-3.5-turbo). It maintains SOTA intelligence, while being significantly more cost-effective.\n\nGPT-4o mini achieves an 82% score on MMLU and presently ranks higher than GPT-4 on chat preferences [common leaderboards](https://arena.lmsys.org/).\n\nCheck out the [launch announcement](https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/) to learn more.\n\n#multimodal", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "request": "0", + "image": "0.007225", + "input_cache_read": "0.000000075" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-mini-search-preview", + "canonical_slug": "openai/gpt-4o-mini-search-preview-2025-03-11", + "name": "OpenAI: GPT-4o-mini Search Preview", + "created": 1741818122, + "description": "GPT-4o mini Search Preview is a specialized model for web search in Chat Completions. It is trained to understand and execute web search queries.", + "context_length": 128000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "request": "0.0275", + "image": "0.000217" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "structured_outputs", + "web_search_options" + ] + }, + { + "id": "openai/gpt-4o-search-preview", + "canonical_slug": "openai/gpt-4o-search-preview-2025-03-11", + "name": "OpenAI: GPT-4o Search Preview", + "created": 1741817949, + "description": "GPT-4o Search Previewis a specialized model for web search in Chat Completions. It is trained to understand and execute web search queries.", + "context_length": 128000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "request": "0.035", + "image": "0.003613" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "structured_outputs", + "web_search_options" + ] + }, + { + "id": "openai/gpt-5", + "canonical_slug": "openai/gpt-5-2025-08-07", + "name": "OpenAI: GPT-5", + "created": 1754587413, + "description": "GPT-5 is OpenAI’s most advanced model, offering major improvements in reasoning, code quality, and user experience. It is optimized for complex tasks that require step-by-step reasoning, instruction following, and accuracy in high-stakes use cases. It supports test-time routing features and advanced prompt understanding, including user-specified intent like \"think hard about this.\" Improvements include reductions in hallucination, sycophancy, and better performance in coding, writing, and health-related tasks.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0", + "input_cache_read": "0.000000125" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-5-chat", + "canonical_slug": "openai/gpt-5-chat-2025-08-07", + "name": "OpenAI: GPT-5 Chat", + "created": 1754587837, + "description": "GPT-5 Chat is designed for advanced, natural, multimodal, and context-aware conversations for enterprise applications.", + "context_length": 128000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "file", + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0", + "input_cache_read": "0.000000125" + }, + "top_provider": { + "context_length": 128000, + "max_completion_tokens": 16384, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs" + ] + }, + { + "id": "openai/gpt-5-codex", + "canonical_slug": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "created": 1758643403, + "description": "GPT-5-Codex is a specialized version of GPT-5 optimized for software engineering and coding workflows. It is designed for both interactive development sessions and long, independent execution of complex engineering tasks. The model supports building projects from scratch, feature development, debugging, large-scale refactoring, and code review. Compared to GPT-5, Codex is more steerable, adheres closely to developer instructions, and produces cleaner, higher-quality code outputs. Reasoning effort can be adjusted with the `reasoning.effort` parameter. Read the [docs here](https://openrouter.ai/docs/use-cases/reasoning-tokens#reasoning-effort-level)\n\nCodex integrates into developer environments including the CLI, IDE extensions, GitHub, and cloud tasks. It adapts reasoning effort dynamically—providing fast responses for small tasks while sustaining extended multi-hour runs for large projects. The model is trained to perform structured code reviews, catching critical flaws by reasoning over dependencies and validating behavior against tests. It also supports multimodal inputs such as images or screenshots for UI development and integrates tool use for search, dependency installation, and environment setup. Codex is intended specifically for agentic coding applications.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0", + "input_cache_read": "0.000000125" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-5-image", + "canonical_slug": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "created": 1760447986, + "description": "[GPT-5](https://openrouter.ai/openai/gpt-5) Image combines OpenAI's most advanced language model with state-of-the-art image generation capabilities. It offers major improvements in reasoning, code quality, and user experience while incorporating GPT Image 1's superior instruction following, text rendering, and detailed image editing.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text+image", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00001", + "completion": "0.00001", + "request": "0", + "image": "0.00001", + "input_cache_read": "0.00000125" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-5-image-mini", + "canonical_slug": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "created": 1760624583, + "description": "GPT-5 Image Mini combines OpenAI's advanced language capabilities, powered by [GPT-5 Mini](https://openrouter.ai/openai/gpt-5-mini), with GPT Image 1 Mini for efficient image generation. This natively multimodal model features superior instruction following, text rendering, and detailed image editing with reduced latency and cost. It excels at high-quality visual creation while maintaining strong text understanding, making it ideal for applications that require both efficient image generation and text processing at scale.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text+image", + "input_modalities": [ + "file", + "image", + "text" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000025", + "completion": "0.000002", + "request": "0", + "image": "0.0000025", + "input_cache_read": "0.00000025" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/gpt-5-mini", + "canonical_slug": "openai/gpt-5-mini-2025-08-07", + "name": "OpenAI: GPT-5 Mini", + "created": 1754587407, + "description": "GPT-5 Mini is a compact version of GPT-5, designed to handle lighter-weight reasoning tasks. It provides the same instruction-following and safety-tuning benefits as GPT-5, but with reduced latency and cost. GPT-5 Mini is the successor to OpenAI's o4-mini model.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000025", + "completion": "0.000002", + "request": "0", + "image": "0", + "input_cache_read": "0.000000025" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-5-nano", + "canonical_slug": "openai/gpt-5-nano-2025-08-07", + "name": "OpenAI: GPT-5 Nano", + "created": 1754587402, + "description": "GPT-5-Nano is the smallest and fastest variant in the GPT-5 system, optimized for developer tools, rapid interactions, and ultra-low latency environments. While limited in reasoning depth compared to its larger counterparts, it retains key instruction-following and safety features. It is the successor to GPT-4.1-nano and offers a lightweight option for cost-sensitive or real-time applications.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000005", + "completion": "0.0000004", + "request": "0", + "image": "0", + "input_cache_read": "0.000000005" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-5-pro", + "canonical_slug": "openai/gpt-5-pro-2025-10-06", + "name": "OpenAI: GPT-5 Pro", + "created": 1759776663, + "description": "GPT-5 Pro is OpenAI’s most advanced model, offering major improvements in reasoning, code quality, and user experience. It is optimized for complex tasks that require step-by-step reasoning, instruction following, and accuracy in high-stakes use cases. It supports test-time routing features and advanced prompt understanding, including user-specified intent like \"think hard about this.\" Improvements include reductions in hallucination, sycophancy, and better performance in coding, writing, and health-related tasks.", + "context_length": 400000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000015", + "completion": "0.00012", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 400000, + "max_completion_tokens": 128000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/gpt-oss-120b:exacto", + "canonical_slug": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b (exacto)", + "created": 1754414231, + "description": "gpt-oss-120b is an open-weight, 117B-parameter Mixture-of-Experts (MoE) language model from OpenAI designed for high-reasoning, agentic, and general-purpose production use cases. It activates 5.1B parameters per forward pass and is optimized to run on a single H100 GPU with native MXFP4 quantization. The model supports configurable reasoning depth, full chain-of-thought access, and native tool use, including function calling, browsing, and structured output generation.", + "context_length": 131072, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000005", + "completion": "0.00000024", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "include_reasoning", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "openai/gpt-oss-20b", + "canonical_slug": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "created": 1754414229, + "description": "gpt-oss-20b is an open-weight 21B parameter model released by OpenAI under the Apache 2.0 license. It uses a Mixture-of-Experts (MoE) architecture with 3.6B active parameters per forward pass, optimized for lower-latency inference and deployability on consumer or single-GPU hardware. The model is trained in OpenAI’s Harmony response format and supports reasoning level configuration, fine-tuning, and agentic capabilities including function calling, tool use, and structured outputs.", + "context_length": 131072, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00000003", + "completion": "0.00000014", + "request": "0", + "image": "0" + }, + "top_provider": { + "context_length": 131072, + "max_completion_tokens": null, + "is_moderated": false + }, + "supported_parameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "max_tokens", + "min_p", + "presence_penalty", + "reasoning", + "repetition_penalty", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_k", + "top_p" + ] + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "canonical_slug": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "created": 1761752836, + "description": "gpt-oss-safeguard-20b is a safety reasoning model from OpenAI built upon gpt-oss-20b. This open-weight, 21B-parameter Mixture-of-Experts (MoE) model offers lower latency for safety tasks like content classification, LLM filtering, and trust & safety labeling.\n\nLearn more about this model in OpenAI's gpt-oss-safeguard [user guide](https://cookbook.openai.com/articles/gpt-oss-safeguard-guide).", + "context_length": 131072, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000000075", + "completion": "0.0000003", + "request": "0", + "image": "0", + "input_cache_read": "0.000000037" + }, + "top_provider": { + "context_length": 131072, + "max_completion_tokens": 65536, + "is_moderated": false + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "stop", + "temperature", + "tool_choice", + "tools", + "top_p" + ] + }, + { + "id": "openai/o1", + "canonical_slug": "openai/o1-2024-12-17", + "name": "OpenAI: o1", + "created": 1734459999, + "description": "The latest and strongest model family from OpenAI, o1 is designed to spend more time thinking before responding. The o1 model series is trained with large-scale reinforcement learning to reason using chain of thought. \n\nThe o1 models are optimized for math, science, programming, and other STEM-related tasks. They consistently exhibit PhD-level accuracy on benchmarks in physics, chemistry, and biology. Learn more in the [launch announcement](https://openai.com/o1).\n", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000015", + "completion": "0.00006", + "request": "0", + "image": "0.021675", + "input_cache_read": "0.0000075" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/o1-pro", + "canonical_slug": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "created": 1742423211, + "description": "The o1 series of models are trained with reinforcement learning to think before they answer and perform complex reasoning. The o1-pro model uses more compute to think harder and provide consistently better answers.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00015", + "completion": "0.0006", + "request": "0", + "image": "0.21675" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs" + ] + }, + { + "id": "openai/o3", + "canonical_slug": "openai/o3-2025-04-16", + "name": "OpenAI: o3", + "created": 1744823457, + "description": "o3 is a well-rounded and powerful model across domains. It sets a new standard for math, science, coding, and visual reasoning tasks. It also excels at technical writing and instruction-following. Use it to think through multi-step problems that involve analysis across text, code, and images. ", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "request": "0", + "image": "0.00153", + "input_cache_read": "0.0000005" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/o3-deep-research", + "canonical_slug": "openai/o3-deep-research-2025-06-26", + "name": "OpenAI: o3 Deep Research", + "created": 1760129661, + "description": "o3-deep-research is OpenAI's advanced model for deep research, designed to tackle complex, multi-step research tasks.\n\nNote: This model always uses the 'web_search' tool which adds additional cost.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00001", + "completion": "0.00004", + "request": "0", + "image": "0.00765", + "input_cache_read": "0.0000025" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/o3-mini", + "canonical_slug": "openai/o3-mini-2025-01-31", + "name": "OpenAI: o3 Mini", + "created": 1738351721, + "description": "OpenAI o3-mini is a cost-efficient language model optimized for STEM reasoning tasks, particularly excelling in science, mathematics, and coding.\n\nThis model supports the `reasoning_effort` parameter, which can be set to \"high\", \"medium\", or \"low\" to control the thinking time of the model. The default is \"medium\". OpenRouter also offers the model slug `openai/o3-mini-high` to default the parameter to \"high\".\n\nThe model features three adjustable reasoning effort levels and supports key developer capabilities including function calling, structured outputs, and streaming, though it does not include vision processing capabilities.\n\nThe model demonstrates significant improvements over its predecessor, with expert testers preferring its responses 56% of the time and noting a 39% reduction in major errors on complex questions. With medium reasoning effort settings, o3-mini matches the performance of the larger o1 model on challenging reasoning evaluations like AIME and GPQA, while maintaining lower latency and cost.", + "context_length": 200000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "request": "0", + "image": "0", + "input_cache_read": "0.00000055" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/o3-mini-high", + "canonical_slug": "openai/o3-mini-high-2025-01-31", + "name": "OpenAI: o3 Mini High", + "created": 1739372611, + "description": "OpenAI o3-mini-high is the same model as [o3-mini](/openai/o3-mini) with reasoning_effort set to high. \n\no3-mini is a cost-efficient language model optimized for STEM reasoning tasks, particularly excelling in science, mathematics, and coding. The model features three adjustable reasoning effort levels and supports key developer capabilities including function calling, structured outputs, and streaming, though it does not include vision processing capabilities.\n\nThe model demonstrates significant improvements over its predecessor, with expert testers preferring its responses 56% of the time and noting a 39% reduction in major errors on complex questions. With medium reasoning effort settings, o3-mini matches the performance of the larger o1 model on challenging reasoning evaluations like AIME and GPQA, while maintaining lower latency and cost.", + "context_length": 200000, + "architecture": { + "modality": "text->text", + "input_modalities": [ + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "request": "0", + "image": "0", + "input_cache_read": "0.00000055" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "max_tokens", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/o3-pro", + "canonical_slug": "openai/o3-pro-2025-06-10", + "name": "OpenAI: o3 Pro", + "created": 1749598352, + "description": "The o-series of models are trained with reinforcement learning to think before they answer and perform complex reasoning. The o3-pro model uses more compute to think harder and provide consistently better answers.\n\nNote that BYOK is required for this model. Set up here: https://openrouter.ai/settings/integrations", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "text", + "file", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.00002", + "completion": "0.00008", + "request": "0", + "image": "0.0153" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/o4-mini", + "canonical_slug": "openai/o4-mini-2025-04-16", + "name": "OpenAI: o4 Mini", + "created": 1744820942, + "description": "OpenAI o4-mini is a compact reasoning model in the o-series, optimized for fast, cost-efficient performance while retaining strong multimodal and agentic capabilities. It supports tool use and demonstrates competitive reasoning and coding performance across benchmarks like AIME (99.5% with Python) and SWE-bench, outperforming its predecessor o3-mini and even approaching o3 in some domains.\n\nDespite its smaller size, o4-mini exhibits high accuracy in STEM tasks, visual problem solving (e.g., MathVista, MMMU), and code editing. It is especially well-suited for high-throughput scenarios where latency or cost is critical. Thanks to its efficient architecture and refined reinforcement learning training, o4-mini can chain tools, generate structured outputs, and solve multi-step tasks with minimal delay—often in under a minute.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "request": "0", + "image": "0.0008415", + "input_cache_read": "0.000000275" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] + }, + { + "id": "openai/o4-mini-deep-research", + "canonical_slug": "openai/o4-mini-deep-research-2025-06-26", + "name": "OpenAI: o4 Mini Deep Research", + "created": 1760129642, + "description": "o4-mini-deep-research is OpenAI's faster, more affordable deep research model—ideal for tackling complex, multi-step research tasks.\n\nNote: This model always uses the 'web_search' tool which adds additional cost.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "file", + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "instruct_type": null + }, + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "request": "0", + "image": "0.00153", + "input_cache_read": "0.0000005" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "frequency_penalty", + "include_reasoning", + "logit_bias", + "logprobs", + "max_tokens", + "presence_penalty", + "reasoning", + "response_format", + "seed", + "stop", + "structured_outputs", + "temperature", + "tool_choice", + "tools", + "top_logprobs", + "top_p" + ] + }, + { + "id": "openai/o4-mini-high", + "canonical_slug": "openai/o4-mini-high-2025-04-16", + "name": "OpenAI: o4 Mini High", + "created": 1744824212, + "description": "OpenAI o4-mini-high is the same model as [o4-mini](/openai/o4-mini) with reasoning_effort set to high. \n\nOpenAI o4-mini is a compact reasoning model in the o-series, optimized for fast, cost-efficient performance while retaining strong multimodal and agentic capabilities. It supports tool use and demonstrates competitive reasoning and coding performance across benchmarks like AIME (99.5% with Python) and SWE-bench, outperforming its predecessor o3-mini and even approaching o3 in some domains.\n\nDespite its smaller size, o4-mini exhibits high accuracy in STEM tasks, visual problem solving (e.g., MathVista, MMMU), and code editing. It is especially well-suited for high-throughput scenarios where latency or cost is critical. Thanks to its efficient architecture and refined reinforcement learning training, o4-mini can chain tools, generate structured outputs, and solve multi-step tasks with minimal delay—often in under a minute.", + "context_length": 200000, + "architecture": { + "modality": "text+image->text", + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Other", + "instruct_type": null + }, + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "request": "0", + "image": "0.0008415", + "input_cache_read": "0.000000275" + }, + "top_provider": { + "context_length": 200000, + "max_completion_tokens": 100000, + "is_moderated": true + }, + "supported_parameters": [ + "include_reasoning", + "max_tokens", + "reasoning", + "response_format", + "seed", + "structured_outputs", + "tool_choice", + "tools" + ] } -] +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/mod.rs b/crates/goose/src/providers/canonical/mod.rs index 686243a53044..0659a3b31cf5 100644 --- a/crates/goose/src/providers/canonical/mod.rs +++ b/crates/goose/src/providers/canonical/mod.rs @@ -2,7 +2,7 @@ mod model; mod name_builder; mod registry; -pub use model::{CanonicalModel, ModelType}; +pub use model::{Architecture, CanonicalModel, Pricing, TopProvider}; pub use name_builder::{canonical_name, strip_version_suffix}; pub use registry::CanonicalModelRegistry; diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 97cae1fa5ba1..1b9891d45cac 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -1,90 +1,138 @@ use serde::{Deserialize, Serialize}; -/// The type of model (chat, voice, embedding, etc.) -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum ModelType { - /// Text generation / chat completion model - Chat, - /// Voice/audio model - Voice, - /// Embedding model - Embedding, - /// Image generation model - Image, - /// Other/unknown type - Other, +/// Architecture information for a model +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Architecture { + /// The modality of the model (e.g., "text->text", "text+image->text") + pub modality: String, + + /// Input modalities supported (e.g., ["text", "image"]) + #[serde(default)] + pub input_modalities: Vec, + + /// Output modalities supported (e.g., ["text"]) + #[serde(default)] + pub output_modalities: Vec, + + /// Tokenizer type + pub tokenizer: String, + + /// Instruction type, if applicable + pub instruct_type: Option, +} + +/// Pricing information for a model (all costs in USD) +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Pricing { + /// Cost per prompt token + pub prompt: String, + + /// Cost per completion token + pub completion: String, + + /// Cost per request + #[serde(default)] + pub request: String, + + /// Cost per image token + #[serde(default)] + pub image: String, + + /// Cost for input cache reads + #[serde(skip_serializing_if = "Option::is_none")] + pub input_cache_read: Option, + + /// Cost for input cache writes + #[serde(skip_serializing_if = "Option::is_none")] + pub input_cache_write: Option, } -/// Canonical representation of a model with standardized metadata +/// Top provider information for a model +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TopProvider { + /// Context length from the top provider (may be null for some models) + pub context_length: Option, + + /// Maximum completion tokens + #[serde(default)] + pub max_completion_tokens: Option, + + /// Whether the model is moderated + #[serde(default)] + pub is_moderated: bool, +} + +/// Canonical representation of a model based on OpenRouter's schema #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CanonicalModel { - /// Canonical name for this model (e.g., "anthropic/claude-3-5-sonnet") + /// OpenRouter's API identifier (e.g., "anthropic/claude-sonnet-4.5") + pub id: String, + + /// Canonical slug - standardized reference with version info (e.g., "anthropic/claude-4.5-sonnet-20250929") + /// This is our primary identifier for model mapping + pub canonical_slug: String, + + /// Human-readable name pub name: String, - /// The type of model - pub model_type: ModelType, + /// Unix timestamp of when the model was created + #[serde(default)] + pub created: Option, - /// Maximum context window size in tokens - pub context_limit: usize, + /// Description of the model + #[serde(default)] + pub description: String, - /// Whether the model supports streaming responses - pub supports_streaming: bool, + /// Maximum context window size in tokens + pub context_length: usize, - /// Whether the model supports tool/function calling - pub supports_tools: bool, + /// Architecture information + pub architecture: Architecture, - /// Cost per million input tokens (in USD) - pub input_token_cost: Option, + /// Pricing information (all in USD) + pub pricing: Pricing, - /// Cost per million output tokens (in USD) - pub output_token_cost: Option, + /// Top provider metadata + pub top_provider: TopProvider, - /// Whether the model supports prompt caching - pub supports_cache_control: bool, + /// List of supported parameters (e.g., "temperature", "top_p", "tools") + #[serde(default)] + pub supported_parameters: Vec, } impl CanonicalModel { - /// Create a new canonical model with minimal required fields - pub fn new( - name: impl Into, - model_type: ModelType, - context_limit: usize, - ) -> Self { - Self { - name: name.into(), - model_type, - context_limit, - supports_streaming: false, - supports_tools: false, - input_token_cost: None, - output_token_cost: None, - supports_cache_control: false, - } + /// Check if the model supports tool/function calling + pub fn supports_tools(&self) -> bool { + self.supported_parameters.iter().any(|p| p == "tools" || p == "tool_choice") + } + + /// Check if the model supports prompt caching + pub fn supports_cache(&self) -> bool { + self.pricing.input_cache_read.is_some() || self.pricing.input_cache_write.is_some() + } + + /// Check if the model supports vision/image inputs + pub fn supports_vision(&self) -> bool { + self.architecture.input_modalities.contains(&"image".to_string()) } - /// Builder method to set streaming support - pub fn with_streaming(mut self, supports: bool) -> Self { - self.supports_streaming = supports; - self + /// Get the provider name from the canonical slug (e.g., "anthropic" from "anthropic/claude-3-5-sonnet") + pub fn provider(&self) -> Option<&str> { + self.canonical_slug.split('/').next() } - /// Builder method to set tool support - pub fn with_tools(mut self, supports: bool) -> Self { - self.supports_tools = supports; - self + /// Get the model name without the provider prefix + pub fn model_name(&self) -> Option<&str> { + self.canonical_slug.split('/').nth(1) } - /// Builder method to set pricing (in USD per million tokens) - pub fn with_pricing(mut self, input_cost: f64, output_cost: f64) -> Self { - self.input_token_cost = Some(input_cost); - self.output_token_cost = Some(output_cost); - self + /// Parse prompt cost as f64 (cost per token) + pub fn prompt_cost(&self) -> Option { + self.pricing.prompt.parse().ok() } - /// Builder method to set cache control support - pub fn with_cache_control(mut self, supports: bool) -> Self { - self.supports_cache_control = supports; - self + /// Parse completion cost as f64 (cost per token) + pub fn completion_cost(&self) -> Option { + self.pricing.completion.parse().ok() } } \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs index 6239fb9e1479..60ff172be42d 100644 --- a/crates/goose/src/providers/canonical/registry.rs +++ b/crates/goose/src/providers/canonical/registry.rs @@ -36,7 +36,7 @@ impl CanonicalModelRegistry { /// Save registry to a JSON file pub fn to_file(&self, path: impl AsRef) -> Result<()> { let mut models: Vec<&CanonicalModel> = self.models.values().collect(); - models.sort_by(|a, b| a.name.cmp(&b.name)); + models.sort_by(|a, b| a.canonical_slug.cmp(&b.canonical_slug)); let json = serde_json::to_string_pretty(&models) .context("Failed to serialize canonical models")?; @@ -49,7 +49,7 @@ impl CanonicalModelRegistry { /// Register a canonical model pub fn register(&mut self, model: CanonicalModel) { - self.models.insert(model.name.clone(), model); + self.models.insert(model.canonical_slug.clone(), model); } /// Look up a canonical model by name @@ -82,44 +82,12 @@ impl Default for CanonicalModelRegistry { #[cfg(test)] mod tests { use super::*; - use crate::providers::canonical::ModelType; #[test] fn test_registry_operations() { - let mut registry = CanonicalModelRegistry::new(); - - let model = CanonicalModel::new("test-model", ModelType::Chat, 8192); - registry.register(model); - - assert_eq!(registry.count(), 1); - assert!(registry.contains("test-model")); - assert!(registry.get("test-model").is_some()); + let registry = CanonicalModelRegistry::new(); + assert_eq!(registry.count(), 0); + assert!(!registry.contains("test-model")); assert!(registry.get("nonexistent").is_none()); } - - #[test] - fn test_registry_serialization() { - let mut registry = CanonicalModelRegistry::new(); - - let model1 = CanonicalModel::new("model-1", ModelType::Chat, 8192) - .with_streaming(true); - let model2 = CanonicalModel::new("model-2", ModelType::Voice, 4096); - - registry.register(model1); - registry.register(model2); - - let temp_dir = std::env::temp_dir(); - let file_path = temp_dir.join("test_registry.json"); - - // Save and load - registry.to_file(&file_path).unwrap(); - let loaded = CanonicalModelRegistry::from_file(&file_path).unwrap(); - - assert_eq!(loaded.count(), 2); - assert!(loaded.contains("model-1")); - assert!(loaded.contains("model-2")); - - // Cleanup - std::fs::remove_file(file_path).ok(); - } } From 614e5b0ca8f34933b5835a46996acb7c24c12168 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 12 Nov 2025 01:54:46 -0500 Subject: [PATCH 06/52] Extra filtering/merging --- .../providers/canonical/canonical_models.json | 4486 +++++------------ crates/goose/src/providers/canonical/mod.rs | 2 +- crates/goose/src/providers/canonical/model.rs | 157 +- .../goose/src/providers/canonical/registry.rs | 4 +- 4 files changed, 1438 insertions(+), 3211 deletions(-) diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json index db1c2430f40a..cb97645fdb78 100644 --- a/crates/goose/src/providers/canonical/canonical_models.json +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -1,3394 +1,1620 @@ [ - { - "id": "anthropic/claude-3.5-haiku", - "canonical_slug": "anthropic/claude-3-5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "created": 1730678400, - "description": "Claude 3.5 Haiku features offers enhanced capabilities in speed, coding accuracy, and tool use. Engineered to excel in real-time applications, it delivers quick response times that are essential for dynamic tasks such as chat interactions and immediate coding suggestions.\n\nThis makes it highly suitable for environments that demand both speed and precision, such as software development, customer service bots, and data management systems.\n\nThis model is currently pointing to [Claude 3.5 Haiku (2024-10-22)](/anthropic/claude-3-5-haiku-20241022).", - "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000008", - "completion": "0.000004", - "request": "0", - "image": "0", - "input_cache_read": "0.00000008", - "input_cache_write": "0.000001" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 8192, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "anthropic/claude-3.5-haiku-20241022", - "canonical_slug": "anthropic/claude-3-5-haiku-20241022", - "name": "Anthropic: Claude 3.5 Haiku (2024-10-22)", - "created": 1730678400, - "description": "Claude 3.5 Haiku features enhancements across all skill sets including coding, tool use, and reasoning. As the fastest model in the Anthropic lineup, it offers rapid response times suitable for applications that require high interactivity and low latency, such as user-facing chatbots and on-the-fly code completions. It also excels in specialized tasks like data extraction and real-time content moderation, making it a versatile tool for a broad range of industries.\n\nIt does not support image inputs.\n\nSee the launch announcement and benchmark results [here](https://www.anthropic.com/news/3-5-models-and-computer-use)", - "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000008", - "completion": "0.000004", - "request": "0", - "image": "0", - "input_cache_read": "0.00000008", - "input_cache_write": "0.000001" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 8192, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "anthropic/claude-3.7-sonnet", - "canonical_slug": "anthropic/claude-3-7-sonnet-20250219", - "name": "Anthropic: Claude 3.7 Sonnet", - "created": 1740422110, - "description": "Claude 3.7 Sonnet is an advanced large language model with improved reasoning, coding, and problem-solving capabilities. It introduces a hybrid reasoning approach, allowing users to choose between rapid responses and extended, step-by-step processing for complex tasks. The model demonstrates notable improvements in coding, particularly in front-end development and full-stack updates, and excels in agentic workflows, where it can autonomously navigate multi-step processes. \n\nClaude 3.7 Sonnet maintains performance parity with its predecessor in standard mode while offering an extended reasoning mode for enhanced accuracy in math, coding, and instruction-following tasks.\n\nRead more at the [blog post here](https://www.anthropic.com/news/claude-3-7-sonnet)", - "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 64000, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, { "id": "anthropic/claude-3-haiku", - "canonical_slug": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "created": 1710288000, - "description": "Claude 3 Haiku is Anthropic's fastest and most compact model for\nnear-instant responsiveness. Quick and accurate targeted performance.\n\nSee the launch announcement and benchmark results [here](https://www.anthropic.com/news/claude-3-haiku)\n\n#multimodal", + "name": "Claude 3 Haiku", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000025", - "completion": "0.00000125", - "request": "0", - "image": "0.0004", - "input_cache_read": "0.00000003", - "input_cache_write": "0.0000003" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000025", + "completion": "0.00000125", + "image": "0.0004", + "input_cache_read": "0.00000003", + "input_cache_write": "0.0000003" + } + } ] }, { "id": "anthropic/claude-3-opus", - "canonical_slug": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "created": 1709596800, - "description": "Claude 3 Opus is Anthropic's most powerful model for highly complex tasks. It boasts top-level performance, intelligence, fluency, and understanding.\n\nSee the launch announcement and benchmark results [here](https://www.anthropic.com/news/claude-3-family)\n\n#multimodal", + "name": "Claude 3 Opus", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "request": "0", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + } + } ] }, { - "id": "anthropic/claude-3.5-sonnet", - "canonical_slug": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "created": 1729555200, - "description": "New Claude 3.5 Sonnet delivers better-than-Opus capabilities, faster-than-Sonnet speeds, at the same Sonnet prices. Sonnet is particularly good at:\n\n- Coding: Scores ~49% on SWE-Bench Verified, higher than the last best score, and without any fancy prompt scaffolding\n- Data science: Augments human data science expertise; navigates unstructured data while using multiple tools for insights\n- Visual processing: excelling at interpreting charts, graphs, and images, accurately transcribing text to derive insights beyond just the text alone\n- Agentic tasks: exceptional tool use, making it great at agentic tasks (i.e. complex, multi-step problem solving tasks that require engaging with other systems)\n\n#multimodal", + "id": "anthropic/claude-3.5-haiku", + "name": "Claude 3.5 Haiku (2024-10-22)", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 8192, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": 8192, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000008", + "completion": "0.000004", + "input_cache_read": "0.00000008", + "input_cache_write": "0.000001" + } + } ] }, { - "id": "anthropic/claude-3.5-sonnet-20240620", - "canonical_slug": "anthropic/claude-3.5-sonnet-20240620", - "name": "Anthropic: Claude 3.5 Sonnet (2024-06-20)", - "created": 1718841600, - "description": "Claude 3.5 Sonnet delivers better-than-Opus capabilities, faster-than-Sonnet speeds, at the same Sonnet prices. Sonnet is particularly good at:\n\n- Coding: Autonomously writes, edits, and runs code with reasoning and troubleshooting\n- Data science: Augments human data science expertise; navigates unstructured data while using multiple tools for insights\n- Visual processing: excelling at interpreting charts, graphs, and images, accurately transcribing text to derive insights beyond just the text alone\n- Agentic tasks: exceptional tool use, making it great at agentic tasks (i.e. complex, multi-step problem solving tasks that require engaging with other systems)\n\nFor the latest version (2024-10-23), check out [Claude 3.5 Sonnet](/anthropic/claude-3.5-sonnet).\n\n#multimodal", + "id": "anthropic/claude-3.5-sonnet", + "name": "Claude 3.5 Sonnet", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 8192, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": 8192, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } + } ] }, { - "id": "anthropic/claude-opus-4", - "canonical_slug": "anthropic/claude-4-opus-20250522", - "name": "Anthropic: Claude Opus 4", - "created": 1747931245, - "description": "Claude Opus 4 is benchmarked as the world’s best coding model, at time of release, bringing sustained performance on complex, long-running tasks and agent workflows. It sets new benchmarks in software engineering, achieving leading results on SWE-bench (72.5%) and Terminal-bench (43.2%). Opus 4 supports extended, agentic workflows, handling thousands of task steps continuously for hours without degradation. \n\nRead more at the [blog post here](https://www.anthropic.com/news/claude-4)", + "id": "anthropic/claude-3.7-sonnet", + "name": "Claude 3.7 Sonnet (thinking)", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "request": "0", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 32000, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "anthropic/claude-sonnet-4", - "canonical_slug": "anthropic/claude-4-sonnet-20250522", - "name": "Anthropic: Claude Sonnet 4", - "created": 1747930371, - "description": "Claude Sonnet 4 significantly enhances the capabilities of its predecessor, Sonnet 3.7, excelling in both coding and reasoning tasks with improved precision and controllability. Achieving state-of-the-art performance on SWE-bench (72.7%), Sonnet 4 balances capability and computational efficiency, making it suitable for a broad range of applications from routine coding tasks to complex software development projects. Key enhancements include improved autonomous codebase navigation, reduced error rates in agent-driven workflows, and increased reliability in following intricate instructions. Sonnet 4 is optimized for practical everyday use, providing advanced reasoning capabilities while maintaining efficiency and responsiveness in diverse internal and external scenarios.\n\nRead more at the [blog post here](https://www.anthropic.com/news/claude-4)", - "context_length": 1000000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - }, - "top_provider": { - "context_length": 1000000, - "max_completion_tokens": 64000, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "anthropic/claude-opus-4.1", - "canonical_slug": "anthropic/claude-4.1-opus-20250805", - "name": "Anthropic: Claude Opus 4.1", - "created": 1754411591, - "description": "Claude Opus 4.1 is an updated version of Anthropic’s flagship model, offering improved performance in coding, reasoning, and agentic tasks. It achieves 74.5% on SWE-bench Verified and shows notable gains in multi-file code refactoring, debugging precision, and detail-oriented reasoning. The model supports extended thinking up to 64K tokens and is optimized for tasks involving research, data analysis, and tool-assisted reasoning.", + "max_completion_tokens": 64000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } + }, + { + "variant": "thinking", + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } + } + ] + }, + { + "id": "anthropic/claude-haiku", + "name": "Claude Haiku 4.5", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "request": "0", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 32000, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "anthropic/claude-haiku-4.5", - "canonical_slug": "anthropic/claude-4.5-haiku-20251001", - "name": "Anthropic: Claude Haiku 4.5", - "created": 1760547638, - "description": "Claude Haiku 4.5 is Anthropic’s fastest and most efficient model, delivering near-frontier intelligence at a fraction of the cost and latency of larger Claude models. Matching Claude Sonnet 4’s performance across reasoning, coding, and computer-use tasks, Haiku 4.5 brings frontier-level capability to real-time and high-volume applications.\n\nIt introduces extended thinking to the Haiku line; enabling controllable reasoning depth, summarized or interleaved thought output, and tool-assisted workflows with full support for coding, bash, web search, and computer-use tools. Scoring >73% on SWE-bench Verified, Haiku 4.5 ranks among the world’s best coding models while maintaining exceptional responsiveness for sub-agents, parallelized execution, and scaled deployment.", + "max_completion_tokens": 64000, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000001", + "completion": "0.000005", + "input_cache_read": "0.0000001", + "input_cache_write": "0.00000125" + } + } + ] + }, + { + "id": "anthropic/claude-opus", + "name": "Claude Opus 4.1", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000001", - "completion": "0.000005", - "request": "0", - "image": "0", - "input_cache_read": "0.0000001", - "input_cache_write": "0.00000125" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 64000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "anthropic/claude-sonnet-4.5", - "canonical_slug": "anthropic/claude-4.5-sonnet-20250929", - "name": "Anthropic: Claude Sonnet 4.5", - "created": 1759161676, - "description": "Claude Sonnet 4.5 is Anthropic’s most advanced Sonnet model to date, optimized for real-world agents and coding workflows. It delivers state-of-the-art performance on coding benchmarks such as SWE-bench Verified, with improvements across system design, code security, and specification adherence. The model is designed for extended autonomous operation, maintaining task continuity across sessions and providing fact-based progress tracking.\n\nSonnet 4.5 also introduces stronger agentic capabilities, including improved tool orchestration, speculative parallel execution, and more efficient context and memory management. With enhanced context tracking and awareness of token usage across tool calls, it is particularly well-suited for multi-context and long-running workflows. Use cases span software engineering, cybersecurity, financial analysis, research agents, and other domains requiring sustained reasoning and tool use.", + "max_completion_tokens": 32000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + } + } + ] + }, + { + "id": "anthropic/claude-sonnet", + "name": "Claude Sonnet 4.5", "context_length": 1000000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - }, - "top_provider": { - "context_length": 1000000, - "max_completion_tokens": 64000, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "stop", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" - ] - }, - { - "id": "google/gemini-2.0-flash-001", - "canonical_slug": "google/gemini-2.0-flash-001", - "name": "Google: Gemini 2.0 Flash", - "created": 1738769413, - "description": "Gemini Flash 2.0 offers a significantly faster time to first token (TTFT) compared to [Gemini Flash 1.5](/google/gemini-flash-1.5), while maintaining quality on par with larger models like [Gemini Pro 1.5](/google/gemini-pro-1.5). It introduces notable enhancements in multimodal understanding, coding capabilities, complex instruction following, and function calling. These advancements come together to deliver more seamless and robust agentic experiences.", - "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file", - "audio" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0.0000258", - "input_cache_read": "0.000000025", - "input_cache_write": "0.0000001833" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 8192, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" - ] - }, - { - "id": "google/gemini-2.0-flash-exp:free", - "canonical_slug": "google/gemini-2.0-flash-exp", - "name": "Google: Gemini 2.0 Flash Experimental (free)", - "created": 1733937523, - "description": "Gemini Flash 2.0 offers a significantly faster time to first token (TTFT) compared to [Gemini Flash 1.5](/google/gemini-flash-1.5), while maintaining quality on par with larger models like [Gemini Pro 1.5](/google/gemini-pro-1.5). It introduces notable enhancements in multimodal understanding, coding capabilities, complex instruction following, and function calling. These advancements come together to deliver more seamless and robust agentic experiences.", + "max_completion_tokens": 64000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash", + "name": "Gemini 2.0 Flash", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0", - "completion": "0", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 8192, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "stop", - "temperature", - "tool_choice", - "tools", - "top_p" - ] - }, - { - "id": "google/gemini-2.0-flash-lite-001", - "canonical_slug": "google/gemini-2.0-flash-lite-001", - "name": "Google: Gemini 2.0 Flash Lite", - "created": 1740506212, - "description": "Gemini 2.0 Flash Lite offers a significantly faster time to first token (TTFT) compared to [Gemini Flash 1.5](/google/gemini-flash-1.5), while maintaining quality on par with larger models like [Gemini Pro 1.5](/google/gemini-pro-1.5), all at extremely economical token prices.", + "max_completion_tokens": 8192, + "input_modalities": [ + "text", + "image", + "file", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "image": "0.0000258", + "audio": "0.0000007", + "input_cache_read": "0.000000025", + "input_cache_write": "0.0000001833" + } + } + ] + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file", - "audio" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000000075", - "completion": "0.0000003", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 8192, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" + "max_completion_tokens": 8192, + "input_modalities": [ + "text", + "image", + "file", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000000075", + "completion": "0.0000003" + } + } ] }, { "id": "google/gemini-2.5-flash", - "canonical_slug": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "created": 1750172488, - "description": "Gemini 2.5 Flash is Google's state-of-the-art workhorse model, specifically designed for advanced reasoning, coding, mathematics, and scientific tasks. It includes built-in \"thinking\" capabilities, enabling it to provide responses with greater accuracy and nuanced context handling. \n\nAdditionally, Gemini 2.5 Flash is configurable through the \"max tokens for reasoning\" parameter, as described in the documentation (https://openrouter.ai/docs/use-cases/reasoning-tokens#max-tokens-for-reasoning).", + "name": "Gemini 2.5 Flash", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "file", - "image", - "text", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "request": "0", - "image": "0.001238", - "input_cache_read": "0.00000003", - "input_cache_write": "0.0000003833" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65535, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" + "max_completion_tokens": 65535, + "input_modalities": [ + "file", + "image", + "text", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238", + "input_cache_read": "0.00000003", + "input_cache_write": "0.0000003833" + } + } ] }, { "id": "google/gemini-2.5-flash-image", - "canonical_slug": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "created": 1759870431, - "description": "Gemini 2.5 Flash Image, a.k.a. \"Nano Banana,\" is now generally available. It is a state of the art image generation model with contextual understanding. It is capable of image generation, edits, and multi-turn conversations. Aspect ratios can be controlled with the [image_config API Parameter](https://openrouter.ai/docs/features/multimodal/image-generation#image-aspect-ratio-configuration)", + "name": "Gemini 2.5 Flash Image (Nano Banana)", "context_length": 32768, - "architecture": { - "modality": "text+image->text+image", - "input_modalities": [ - "image", - "text" - ], - "output_modalities": [ - "image", - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "request": "0", - "image": "0.001238" - }, - "top_provider": { - "context_length": 32768, - "max_completion_tokens": 32768, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "temperature", - "top_p" + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238" + } + } ] }, { "id": "google/gemini-2.5-flash-image-preview", - "canonical_slug": "google/gemini-2.5-flash-image-preview", - "name": "Google: Gemini 2.5 Flash Image Preview (Nano Banana)", - "created": 1756218977, - "description": "Gemini 2.5 Flash Image Preview, a.k.a. \"Nano Banana,\" is a state of the art image generation model with contextual understanding. It is capable of image generation, edits, and multi-turn conversations.", + "name": "Gemini 2.5 Flash Image Preview (Nano Banana)", "context_length": 32768, - "architecture": { - "modality": "text+image->text+image", - "input_modalities": [ - "image", - "text" - ], - "output_modalities": [ - "image", - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "request": "0", - "image": "0.001238" - }, - "top_provider": { - "context_length": 32768, - "max_completion_tokens": 32768, - "is_moderated": false - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "temperature", - "top_p" + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238" + } + } ] }, { "id": "google/gemini-2.5-flash-lite", - "canonical_slug": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "created": 1753200276, - "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance across common benchmarks compared to earlier Flash models. By default, \"thinking\" (i.e. multi-pass reasoning) is disabled to prioritize speed, but developers can enable it via the [Reasoning API parameter](https://openrouter.ai/docs/use-cases/reasoning-tokens) to selectively trade off cost for intelligence. ", + "name": "Gemini 2.5 Flash Lite", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0", - "input_cache_read": "0.00000001", - "input_cache_write": "0.0000001833" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65535, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" - ] - }, - { - "id": "google/gemini-2.5-flash-lite-preview-06-17", - "canonical_slug": "google/gemini-2.5-flash-lite-preview-06-17", - "name": "Google: Gemini 2.5 Flash Lite Preview 06-17", - "created": 1750173831, - "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance across common benchmarks compared to earlier Flash models. By default, \"thinking\" (i.e. multi-pass reasoning) is disabled to prioritize speed, but developers can enable it via the [Reasoning API parameter](https://openrouter.ai/docs/use-cases/reasoning-tokens) to selectively trade off cost for intelligence. ", + "max_completion_tokens": 65535, + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "input_cache_read": "0.00000001", + "input_cache_write": "0.0000001833" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-06", + "name": "Gemini 2.5 Flash Lite Preview 06-17", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "file", - "image", - "text", - "audio" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0", - "input_cache_read": "0.000000025", - "input_cache_write": "0.0000001833" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65535, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" - ] - }, - { - "id": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_slug": "google/gemini-2.5-flash-lite-preview-09-2025", - "name": "Google: Gemini 2.5 Flash Lite Preview 09-2025", - "created": 1758819686, - "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance across common benchmarks compared to earlier Flash models. By default, \"thinking\" (i.e. multi-pass reasoning) is disabled to prioritize speed, but developers can enable it via the [Reasoning API parameter](https://openrouter.ai/docs/use-cases/reasoning-tokens) to selectively trade off cost for intelligence. ", + "max_completion_tokens": 65535, + "input_modalities": [ + "file", + "image", + "text", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "audio": "0.0000003", + "input_cache_read": "0.000000025", + "input_cache_write": "0.0000001833" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-lite-preview-09", + "name": "Gemini 2.5 Flash Lite Preview 09-2025", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65536, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" - ] - }, - { - "id": "google/gemini-2.5-flash-preview-09-2025", - "canonical_slug": "google/gemini-2.5-flash-preview-09-2025", - "name": "Google: Gemini 2.5 Flash Preview 09-2025", - "created": 1758820178, - "description": "Gemini 2.5 Flash Preview September 2025 Checkpoint is Google's state-of-the-art workhorse model, specifically designed for advanced reasoning, coding, mathematics, and scientific tasks. It includes built-in \"thinking\" capabilities, enabling it to provide responses with greater accuracy and nuanced context handling. \n\nAdditionally, Gemini 2.5 Flash is configurable through the \"max tokens for reasoning\" parameter, as described in the documentation (https://openrouter.ai/docs/use-cases/reasoning-tokens#max-tokens-for-reasoning).", + "max_completion_tokens": 65536, + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004" + } + } + ] + }, + { + "id": "google/gemini-2.5-flash-preview-09", + "name": "Gemini 2.5 Flash Preview 09-2025", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "file", - "text", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "request": "0", - "image": "0.001238", - "input_cache_read": "0.000000075", - "input_cache_write": "0.0000003833" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65536, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" + "max_completion_tokens": 65536, + "input_modalities": [ + "image", + "file", + "text", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238", + "audio": "0.000001", + "input_cache_read": "0.000000075", + "input_cache_write": "0.0000003833" + } + } ] }, { "id": "google/gemini-2.5-pro", - "canonical_slug": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "created": 1750169544, - "description": "Gemini 2.5 Pro is Google’s state-of-the-art AI model designed for advanced reasoning, coding, mathematics, and scientific tasks. It employs “thinking” capabilities, enabling it to reason through responses with enhanced accuracy and nuanced context handling. Gemini 2.5 Pro achieves top-tier performance on multiple benchmarks, including first-place positioning on the LMArena leaderboard, reflecting superior human-preference alignment and complex problem-solving abilities.", + "name": "Gemini 2.5 Pro", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0.00516", - "input_cache_read": "0.000000125", - "input_cache_write": "0.000001625" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65536, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" - ] - }, - { - "id": "google/gemini-2.5-pro-preview-05-06", - "canonical_slug": "google/gemini-2.5-pro-preview-03-25", - "name": "Google: Gemini 2.5 Pro Preview 05-06", - "created": 1746578513, - "description": "Gemini 2.5 Pro is Google’s state-of-the-art AI model designed for advanced reasoning, coding, mathematics, and scientific tasks. It employs “thinking” capabilities, enabling it to reason through responses with enhanced accuracy and nuanced context handling. Gemini 2.5 Pro achieves top-tier performance on multiple benchmarks, including first-place positioning on the LMArena leaderboard, reflecting superior human-preference alignment and complex problem-solving abilities.", - "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0.00516", - "input_cache_read": "0.00000031", - "input_cache_write": "0.000001625" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65535, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" + "max_completion_tokens": 65536, + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "image": "0.00516", + "input_cache_read": "0.000000125", + "input_cache_write": "0.000001625" + } + } ] }, { "id": "google/gemini-2.5-pro-preview", - "canonical_slug": "google/gemini-2.5-pro-preview-06-05", - "name": "Google: Gemini 2.5 Pro Preview 06-05", - "created": 1749137257, - "description": "Gemini 2.5 Pro is Google’s state-of-the-art AI model designed for advanced reasoning, coding, mathematics, and scientific tasks. It employs “thinking” capabilities, enabling it to reason through responses with enhanced accuracy and nuanced context handling. Gemini 2.5 Pro achieves top-tier performance on multiple benchmarks, including first-place positioning on the LMArena leaderboard, reflecting superior human-preference alignment and complex problem-solving abilities.\n", + "name": "Gemini 2.5 Pro Preview 06-05", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "file", + "image", + "text", + "audio" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "image": "0.00516", + "input_cache_read": "0.00000031", + "input_cache_write": "0.000001625" + } + } + ] + }, + { + "id": "google/gemini-2.5-pro-preview-05", + "name": "Gemini 2.5 Pro Preview 05-06", "context_length": 1048576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "file", - "image", - "text", - "audio" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0.00516", - "input_cache_read": "0.00000031", - "input_cache_write": "0.000001625" - }, - "top_provider": { - "context_length": 1048576, - "max_completion_tokens": 65536, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_p" + "max_completion_tokens": 65535, + "input_modalities": [ + "text", + "image", + "file", + "audio", + "video" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "image": "0.00516", + "input_cache_read": "0.00000031", + "input_cache_write": "0.000001625" + } + } ] }, { "id": "google/gemma-2-27b-it", - "canonical_slug": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "created": 1720828800, - "description": "Gemma 2 27B by Google is an open model built from the same research and technology used to create the [Gemini models](/models?q=gemini).\n\nGemma models are well-suited for a variety of text generation tasks, including question answering, summarization, and reasoning.\n\nSee the [launch announcement](https://blog.google/technology/developers/google-gemma-2/) for more details. Usage of Gemma is subject to Google's [Gemma Terms of Use](https://ai.google.dev/gemma/terms).", + "name": "Gemma 2 27B", "context_length": 8192, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": "gemma" - }, - "pricing": { - "prompt": "0.00000065", - "completion": "0.00000065", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 8192, - "max_completion_tokens": null, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "max_tokens", - "presence_penalty", - "response_format", - "stop", - "structured_outputs", - "temperature", - "top_p" + "max_completion_tokens": null, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000065", + "completion": "0.00000065" + } + } ] }, { "id": "google/gemma-2-9b-it", - "canonical_slug": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "created": 1719532800, - "description": "Gemma 2 9B by Google is an advanced, open-source language model that sets a new standard for efficiency and performance in its size class.\n\nDesigned for a wide variety of tasks, it empowers developers and researchers to build innovative applications, while maintaining accessibility, safety, and cost-effectiveness.\n\nSee the [launch announcement](https://blog.google/technology/developers/google-gemma-2/) for more details. Usage of Gemma is subject to Google's [Gemma Terms of Use](https://ai.google.dev/gemma/terms).", + "name": "Gemma 2 9B", "context_length": 8192, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": "gemma" - }, - "pricing": { - "prompt": "0.00000003", - "completion": "0.00000009", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 8192, - "max_completion_tokens": null, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "max_tokens", - "presence_penalty", - "repetition_penalty", - "temperature", - "top_k", - "top_p" + "max_completion_tokens": null, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000003", + "completion": "0.00000009" + } + } ] }, { "id": "google/gemma-3-12b-it", - "canonical_slug": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "created": 1741902625, - "description": "Gemma 3 introduces multimodality, supporting vision-language input and text outputs. It handles context windows up to 128k tokens, understands over 140 languages, and offers improved math, reasoning, and chat capabilities, including structured outputs and function calling. Gemma 3 12B is the second largest in the family of Gemma 3 models after [Gemma 3 27B](google/gemma-3-27b-it)", + "name": "Gemma 3 12B", "context_length": 131072, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": "gemma" - }, - "pricing": { - "prompt": "0.00000003", - "completion": "0.0000001", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 131072, - "max_completion_tokens": 131072, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "max_tokens", - "min_p", - "presence_penalty", - "repetition_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "top_k", - "top_p" + "max_completion_tokens": 131072, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000003", + "completion": "0.0000001" + } + } ] }, { "id": "google/gemma-3-27b-it", - "canonical_slug": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "created": 1741756359, - "description": "Gemma 3 introduces multimodality, supporting vision-language input and text outputs. It handles context windows up to 128k tokens, understands over 140 languages, and offers improved math, reasoning, and chat capabilities, including structured outputs and function calling. Gemma 3 27B is Google's latest open source model, successor to [Gemma 2](google/gemma-2-27b-it)", + "name": "Gemma 3 27B", "context_length": 131072, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": "gemma" - }, - "pricing": { - "prompt": "0.00000009", - "completion": "0.00000016", - "request": "0", - "image": "0.0000256" - }, - "top_provider": { - "context_length": 131072, - "max_completion_tokens": 16384, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "max_tokens", - "min_p", - "presence_penalty", - "repetition_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000009", + "completion": "0.00000016", + "image": "0.0000256" + } + } ] }, { "id": "google/gemma-3-4b-it", - "canonical_slug": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "created": 1741905510, - "description": "Gemma 3 introduces multimodality, supporting vision-language input and text outputs. It handles context windows up to 128k tokens, understands over 140 languages, and offers improved math, reasoning, and chat capabilities, including structured outputs and function calling.", + "name": "Gemma 3 4B", "context_length": 96000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "instruct_type": "gemma" - }, - "pricing": { - "prompt": "0.00000001703012", - "completion": "0.0000000681536", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 96000, - "max_completion_tokens": null, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "max_tokens", - "min_p", - "presence_penalty", - "repetition_penalty", - "response_format", - "seed", - "stop", - "temperature", - "top_k", - "top_p" - ] - }, - { - "id": "google/gemma-3n-e2b-it:free", - "canonical_slug": "google/gemma-3n-e2b-it", - "name": "Google: Gemma 3n 2B (free)", - "created": 1752074904, - "description": "Gemma 3n E2B IT is a multimodal, instruction-tuned model developed by Google DeepMind, designed to operate efficiently at an effective parameter size of 2B while leveraging a 6B architecture. Based on the MatFormer architecture, it supports nested submodels and modular composition via the Mix-and-Match framework. Gemma 3n models are optimized for low-resource deployment, offering 32K context length and strong multilingual and reasoning performance across common benchmarks. This variant is trained on a diverse corpus including code, math, web, and multimodal data.", - "context_length": 8192, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Other", - "instruct_type": null - }, - "pricing": { - "prompt": "0", - "completion": "0", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 8192, - "max_completion_tokens": 2048, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "temperature", - "top_p" + "max_completion_tokens": null, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000001703012", + "completion": "0.0000000681536" + } + } ] }, { "id": "google/gemma-3n-e4b-it", - "canonical_slug": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "created": 1747776824, - "description": "Gemma 3n E4B-it is optimized for efficient execution on mobile and low-resource devices, such as phones, laptops, and tablets. It supports multimodal inputs—including text, visual data, and audio—enabling diverse tasks such as text generation, speech recognition, translation, and image analysis. Leveraging innovations like Per-Layer Embedding (PLE) caching and the MatFormer architecture, Gemma 3n dynamically manages memory usage and computational load by selectively activating model parameters, significantly reducing runtime resource requirements.\n\nThis model supports a wide linguistic range (trained in over 140 languages) and features a flexible 32K token context window. Gemma 3n can selectively load parameters, optimizing memory and computational efficiency based on the task or device capabilities, making it well-suited for privacy-focused, offline-capable applications and on-device AI solutions. [Read more in the blog post](https://developers.googleblog.com/en/introducing-gemma-3n/)", + "name": "Gemma 3n 4B", "context_length": 32768, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Other", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000002", - "completion": "0.00000004", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 32768, - "max_completion_tokens": null, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "max_tokens", - "min_p", - "presence_penalty", - "repetition_penalty", - "stop", - "temperature", - "top_k", - "top_p" + "max_completion_tokens": null, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Other", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000002", + "completion": "0.00000004" + } + } ] }, { "id": "openai/chatgpt-4o-latest", - "canonical_slug": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "created": 1723593600, - "description": "OpenAI ChatGPT 4o is continually updated by OpenAI to point to the current version of GPT-4o used by ChatGPT. It therefore differs slightly from the API version of [GPT-4o](/models/openai/gpt-4o) in that it has additional RLHF. It is intended for research and evaluation.\n\nOpenAI notes that this model is not suited for production use-cases as it may be removed or redirected to another model in the future.", + "name": "ChatGPT-4o", "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000005", - "completion": "0.000015", - "request": "0", - "image": "0.007225" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "top_logprobs", - "top_p" + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000005", + "completion": "0.000015", + "image": "0.007225" + } + } ] }, { "id": "openai/codex-mini", - "canonical_slug": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "created": 1747409761, - "description": "codex-mini-latest is a fine-tuned version of o4-mini specifically for use in Codex CLI. For direct use in the API, we recommend starting with gpt-4.1.", + "name": "Codex Mini", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000015", - "completion": "0.000006", - "request": "0", - "image": "0", - "input_cache_read": "0.000000375" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000015", + "completion": "0.000006", + "input_cache_read": "0.000000375" + } + } + ] + }, + { + "id": "openai/gpt", + "name": "GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "web_search": "0.01", + "input_cache_read": "0.0000005" + } + } ] }, { "id": "openai/gpt-3.5-turbo", - "canonical_slug": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "created": 1685232000, - "description": "GPT-3.5 Turbo is OpenAI's fastest model. It can understand and generate natural language or code, and is optimized for chat and traditional completion tasks.\n\nTraining data up to Sep 2021.", + "name": "GPT-3.5 Turbo", "context_length": 16385, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000005", - "completion": "0.0000015", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 16385, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" - ] - }, - { - "id": "openai/gpt-3.5-turbo-0613", - "canonical_slug": "openai/gpt-3.5-turbo-0613", - "name": "OpenAI: GPT-3.5 Turbo (older v0613)", - "created": 1706140800, - "description": "GPT-3.5 Turbo is OpenAI's fastest model. It can understand and generate natural language or code, and is optimized for chat and traditional completion tasks.\n\nTraining data up to Sep 2021.", - "context_length": 4095, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000001", - "completion": "0.000002", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 4095, - "max_completion_tokens": 4096, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000005", + "completion": "0.0000015" + } + } ] }, { "id": "openai/gpt-3.5-turbo-16k", - "canonical_slug": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "created": 1693180800, - "description": "This model offers four times the context length of gpt-3.5-turbo, allowing it to support approximately 20 pages of text in a single request at a higher cost. Training data: up to Sep 2021.", + "name": "GPT-3.5 Turbo 16k", "context_length": 16385, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000003", - "completion": "0.000004", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 16385, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000003", + "completion": "0.000004" + } + } ] }, { "id": "openai/gpt-3.5-turbo-instruct", - "canonical_slug": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "created": 1695859200, - "description": "This model is a variant of GPT-3.5 Turbo tuned for instructional prompts and omitting chat-related optimizations. Training data: up to Sep 2021.", + "name": "GPT-3.5 Turbo Instruct", "context_length": 4095, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": "chatml" - }, - "pricing": { - "prompt": "0.0000015", - "completion": "0.000002", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 4095, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "top_logprobs", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000015", + "completion": "0.000002" + } + } ] }, { "id": "openai/gpt-4", - "canonical_slug": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "created": 1685232000, - "description": "OpenAI's flagship model, GPT-4 is a large-scale multimodal language model capable of solving difficult problems with greater accuracy than previous models due to its broader general knowledge and advanced reasoning capabilities. Training data: up to Sep 2021.", - "context_length": 8191, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00003", - "completion": "0.00006", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 8191, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" - ] - }, - { - "id": "openai/gpt-4-0314", - "canonical_slug": "openai/gpt-4-0314", - "name": "OpenAI: GPT-4 (older v0314)", - "created": 1685232000, - "description": "GPT-4-0314 is the first version of GPT-4 released, with a context length of 8,192 tokens, and was supported until June 14. Training data: up to Sep 2021.", + "name": "GPT-4 (older v0314)", "context_length": 8191, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00003", - "completion": "0.00006", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 8191, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00003", + "completion": "0.00006" + } + } ] }, { "id": "openai/gpt-4-1106-preview", - "canonical_slug": "openai/gpt-4-1106-preview", - "name": "OpenAI: GPT-4 Turbo (older v1106)", - "created": 1699228800, - "description": "The latest GPT-4 Turbo model with vision capabilities. Vision requests can now use JSON mode and function calling.\n\nTraining data: up to April 2023.", + "name": "GPT-4 Turbo (older v1106)", "context_length": 128000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00001", - "completion": "0.00003", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00001", + "completion": "0.00003" + } + } ] }, { "id": "openai/gpt-4-turbo", - "canonical_slug": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "created": 1712620800, - "description": "The latest GPT-4 Turbo model with vision capabilities. Vision requests can now use JSON mode and function calling.\n\nTraining data: up to December 2023.", + "name": "GPT-4 Turbo", "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00001", - "completion": "0.00003", - "request": "0", - "image": "0.01445" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 4096, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00001", + "completion": "0.00003", + "image": "0.01445" + } + } ] }, { "id": "openai/gpt-4-turbo-preview", - "canonical_slug": "openai/gpt-4-turbo-preview", - "name": "OpenAI: GPT-4 Turbo Preview", - "created": 1706140800, - "description": "The preview GPT-4 model with improved instruction following, JSON mode, reproducible outputs, parallel function calling, and more. Training data: up to Dec 2023.\n\n**Note:** heavily rate limited by OpenAI while in preview.", + "name": "GPT-4 Turbo Preview", "context_length": 128000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00001", - "completion": "0.00003", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" - ] - }, - { - "id": "openai/gpt-4.1", - "canonical_slug": "openai/gpt-4.1-2025-04-14", - "name": "OpenAI: GPT-4.1", - "created": 1744651385, - "description": "GPT-4.1 is a flagship large language model optimized for advanced instruction following, real-world software engineering, and long-context reasoning. It supports a 1 million token context window and outperforms GPT-4o and GPT-4.5 across coding (54.6% SWE-bench Verified), instruction compliance (87.4% IFEval), and multimodal understanding benchmarks. It is tuned for precise code diffs, agent reliability, and high recall in large document contexts, making it ideal for agents, IDE tooling, and enterprise knowledge retrieval.", - "context_length": 1047576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "request": "0", - "image": "0", - "input_cache_read": "0.0000005" - }, - "top_provider": { - "context_length": 1047576, - "max_completion_tokens": 32768, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00001", + "completion": "0.00003" + } + } ] }, { "id": "openai/gpt-4.1-mini", - "canonical_slug": "openai/gpt-4.1-mini-2025-04-14", - "name": "OpenAI: GPT-4.1 Mini", - "created": 1744651381, - "description": "GPT-4.1 Mini is a mid-sized model delivering performance competitive with GPT-4o at substantially lower latency and cost. It retains a 1 million token context window and scores 45.1% on hard instruction evals, 35.8% on MultiChallenge, and 84.1% on IFEval. Mini also shows strong coding ability (e.g., 31.6% on Aider’s polyglot diff benchmark) and vision understanding, making it suitable for interactive applications with tight performance constraints.", + "name": "GPT-4.1 Mini", "context_length": 1047576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000004", - "completion": "0.0000016", - "request": "0", - "image": "0", - "input_cache_read": "0.0000001" - }, - "top_provider": { - "context_length": 1047576, - "max_completion_tokens": 32768, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000004", + "completion": "0.0000016", + "web_search": "0.01", + "input_cache_read": "0.0000001" + } + } ] }, { "id": "openai/gpt-4.1-nano", - "canonical_slug": "openai/gpt-4.1-nano-2025-04-14", - "name": "OpenAI: GPT-4.1 Nano", - "created": 1744651369, - "description": "For tasks that demand low latency, GPT‑4.1 nano is the fastest and cheapest model in the GPT-4.1 series. It delivers exceptional performance at a small size with its 1 million token context window, and scores 80.1% on MMLU, 50.3% on GPQA, and 9.8% on Aider polyglot coding – even higher than GPT‑4o mini. It’s ideal for tasks like classification or autocompletion.", + "name": "GPT-4.1 Nano", "context_length": 1047576, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0", - "input_cache_read": "0.000000025" - }, - "top_provider": { - "context_length": 1047576, - "max_completion_tokens": 32768, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" - ] - }, - { - "id": "openai/gpt-4o:extended", - "canonical_slug": "openai/gpt-4o", - "name": "OpenAI: GPT-4o (extended)", - "created": 1715558400, - "description": "GPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.\n\nFor benchmarking against other models, it was briefly called [\"im-also-a-good-gpt2-chatbot\"](https://twitter.com/LiamFedus/status/1790064963966370209)\n\n#multimodal", - "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000006", - "completion": "0.000018", - "request": "0", - "image": "0.007225" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 64000, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p", - "web_search_options" - ] - }, - { - "id": "openai/gpt-4o-2024-05-13", - "canonical_slug": "openai/gpt-4o-2024-05-13", - "name": "OpenAI: GPT-4o (2024-05-13)", - "created": 1715558400, - "description": "GPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.\n\nFor benchmarking against other models, it was briefly called [\"im-also-a-good-gpt2-chatbot\"](https://twitter.com/LiamFedus/status/1790064963966370209)\n\n#multimodal", - "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000005", - "completion": "0.000015", - "request": "0", - "image": "0.007225" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 4096, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p", - "web_search_options" - ] - }, - { - "id": "openai/gpt-4o-2024-08-06", - "canonical_slug": "openai/gpt-4o-2024-08-06", - "name": "OpenAI: GPT-4o (2024-08-06)", - "created": 1722902400, - "description": "The 2024-08-06 version of GPT-4o offers improved performance in structured outputs, with the ability to supply a JSON schema in the respone_format. Read more [here](https://openai.com/index/introducing-structured-outputs-in-the-api/).\n\nGPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.\n\nFor benchmarking against other models, it was briefly called [\"im-also-a-good-gpt2-chatbot\"](https://twitter.com/LiamFedus/status/1790064963966370209)", - "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0", - "image": "0.003613", - "input_cache_read": "0.00000125" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p", - "web_search_options" - ] - }, - { - "id": "openai/gpt-4o-2024-11-20", - "canonical_slug": "openai/gpt-4o-2024-11-20", - "name": "OpenAI: GPT-4o (2024-11-20)", - "created": 1732127594, - "description": "The 2024-11-20 version of GPT-4o offers a leveled-up creative writing ability with more natural, engaging, and tailored writing to improve relevance & readability. It’s also better at working with uploaded files, providing deeper insights & more thorough responses.\n\nGPT-4o (\"o\" for \"omni\") is OpenAI's latest AI model, supporting both text and image inputs with text outputs. It maintains the intelligence level of [GPT-4 Turbo](/models/openai/gpt-4-turbo) while being twice as fast and 50% more cost-effective. GPT-4o also offers improved performance in processing non-English languages and enhanced visual capabilities.", + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "web_search": "0.01", + "input_cache_read": "0.000000025" + } + } + ] + }, + { + "id": "openai/gpt-4o", + "name": "GPT-4o (2024-11-20)", "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0", - "image": "0.003613", - "input_cache_read": "0.00000125" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p", - "web_search_options" + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "image": "0.003613", + "input_cache_read": "0.00000125" + } + }, + { + "variant": "extended", + "pricing": { + "prompt": "0.000006", + "completion": "0.000018", + "image": "0.007225" + } + } ] }, { "id": "openai/gpt-4o-audio-preview", - "canonical_slug": "openai/gpt-4o-audio-preview", - "name": "OpenAI: GPT-4o Audio", - "created": 1755233061, - "description": "The gpt-4o-audio-preview model adds support for audio inputs as prompts. This enhancement allows the model to detect nuances within audio recordings and add depth to generated user experiences. Audio outputs are currently not supported. Audio tokens are priced at $40 per million input audio tokens.", + "name": "GPT-4o Audio", "context_length": 128000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "audio", - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 16384, + "input_modalities": [ + "audio", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "audio": "0.00004" + } + } ] }, { "id": "openai/gpt-4o-mini", - "canonical_slug": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "created": 1721260800, - "description": "GPT-4o mini is OpenAI's newest model after [GPT-4 Omni](/models/openai/gpt-4o), supporting both text and image inputs with text outputs.\n\nAs their most advanced small model, it is many multiples more affordable than other recent frontier models, and more than 60% cheaper than [GPT-3.5 Turbo](/models/openai/gpt-3.5-turbo). It maintains SOTA intelligence, while being significantly more cost-effective.\n\nGPT-4o mini achieves an 82% score on MMLU and presently ranks higher than GPT-4 on chat preferences [common leaderboards](https://arena.lmsys.org/).\n\nCheck out the [launch announcement](https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/) to learn more.\n\n#multimodal", - "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "request": "0", - "image": "0.000217", - "input_cache_read": "0.000000075" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p", - "web_search_options" - ] - }, - { - "id": "openai/gpt-4o-mini-2024-07-18", - "canonical_slug": "openai/gpt-4o-mini-2024-07-18", - "name": "OpenAI: GPT-4o-mini (2024-07-18)", - "created": 1721260800, - "description": "GPT-4o mini is OpenAI's newest model after [GPT-4 Omni](/models/openai/gpt-4o), supporting both text and image inputs with text outputs.\n\nAs their most advanced small model, it is many multiples more affordable than other recent frontier models, and more than 60% cheaper than [GPT-3.5 Turbo](/models/openai/gpt-3.5-turbo). It maintains SOTA intelligence, while being significantly more cost-effective.\n\nGPT-4o mini achieves an 82% score on MMLU and presently ranks higher than GPT-4 on chat preferences [common leaderboards](https://arena.lmsys.org/).\n\nCheck out the [launch announcement](https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence/) to learn more.\n\n#multimodal", + "name": "GPT-4o-mini (2024-07-18)", "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "request": "0", - "image": "0.007225", - "input_cache_read": "0.000000075" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p", - "web_search_options" + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "image": "0.007225", + "input_cache_read": "0.000000075" + } + } ] }, { "id": "openai/gpt-4o-mini-search-preview", - "canonical_slug": "openai/gpt-4o-mini-search-preview-2025-03-11", - "name": "OpenAI: GPT-4o-mini Search Preview", - "created": 1741818122, - "description": "GPT-4o mini Search Preview is a specialized model for web search in Chat Completions. It is trained to understand and execute web search queries.", + "name": "GPT-4o-mini Search Preview", "context_length": 128000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "request": "0.0275", - "image": "0.000217" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "structured_outputs", - "web_search_options" + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "image": "0.000217", + "request": "0.0275" + } + } ] }, { "id": "openai/gpt-4o-search-preview", - "canonical_slug": "openai/gpt-4o-search-preview-2025-03-11", - "name": "OpenAI: GPT-4o Search Preview", - "created": 1741817949, - "description": "GPT-4o Search Previewis a specialized model for web search in Chat Completions. It is trained to understand and execute web search queries.", + "name": "GPT-4o Search Preview", "context_length": 128000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0.035", - "image": "0.003613" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "structured_outputs", - "web_search_options" - ] - }, - { - "id": "openai/gpt-5", - "canonical_slug": "openai/gpt-5-2025-08-07", - "name": "OpenAI: GPT-5", - "created": 1754587413, - "description": "GPT-5 is OpenAI’s most advanced model, offering major improvements in reasoning, code quality, and user experience. It is optimized for complex tasks that require step-by-step reasoning, instruction following, and accuracy in high-stakes use cases. It supports test-time routing features and advanced prompt understanding, including user-specified intent like \"think hard about this.\" Improvements include reductions in hallucination, sycophancy, and better performance in coding, writing, and health-related tasks.", - "context_length": 400000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0", - "input_cache_read": "0.000000125" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "image": "0.003613", + "request": "0.035" + } + } ] }, { "id": "openai/gpt-5-chat", - "canonical_slug": "openai/gpt-5-chat-2025-08-07", - "name": "OpenAI: GPT-5 Chat", - "created": 1754587837, - "description": "GPT-5 Chat is designed for advanced, natural, multimodal, and context-aware conversations for enterprise applications.", + "name": "GPT-5 Chat", "context_length": 128000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "file", - "image", - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0", - "input_cache_read": "0.000000125" - }, - "top_provider": { - "context_length": 128000, - "max_completion_tokens": 16384, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs" + "max_completion_tokens": 16384, + "input_modalities": [ + "file", + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "web_search": "0.01", + "input_cache_read": "0.000000125" + } + } ] }, { "id": "openai/gpt-5-codex", - "canonical_slug": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "created": 1758643403, - "description": "GPT-5-Codex is a specialized version of GPT-5 optimized for software engineering and coding workflows. It is designed for both interactive development sessions and long, independent execution of complex engineering tasks. The model supports building projects from scratch, feature development, debugging, large-scale refactoring, and code review. Compared to GPT-5, Codex is more steerable, adheres closely to developer instructions, and produces cleaner, higher-quality code outputs. Reasoning effort can be adjusted with the `reasoning.effort` parameter. Read the [docs here](https://openrouter.ai/docs/use-cases/reasoning-tokens#reasoning-effort-level)\n\nCodex integrates into developer environments including the CLI, IDE extensions, GitHub, and cloud tasks. It adapts reasoning effort dynamically—providing fast responses for small tasks while sustaining extended multi-hour runs for large projects. The model is trained to perform structured code reviews, catching critical flaws by reasoning over dependencies and validating behavior against tests. It also supports multimodal inputs such as images or screenshots for UI development and integrates tool use for search, dependency installation, and environment setup. Codex is intended specifically for agentic coding applications.", + "name": "GPT-5 Codex", "context_length": 400000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0", - "input_cache_read": "0.000000125" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 128000, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "input_cache_read": "0.000000125" + } + } ] }, { "id": "openai/gpt-5-image", - "canonical_slug": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "created": 1760447986, - "description": "[GPT-5](https://openrouter.ai/openai/gpt-5) Image combines OpenAI's most advanced language model with state-of-the-art image generation capabilities. It offers major improvements in reasoning, code quality, and user experience while incorporating GPT Image 1's superior instruction following, text rendering, and detailed image editing.", + "name": "GPT-5 Image", "context_length": 400000, - "architecture": { - "modality": "text+image->text+image", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "image", - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00001", - "completion": "0.00001", - "request": "0", - "image": "0.00001", - "input_cache_read": "0.00000125" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "include_reasoning", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 128000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00001", + "completion": "0.00001", + "image": "0.00001", + "web_search": "0.01", + "input_cache_read": "0.00000125" + } + } ] }, { "id": "openai/gpt-5-image-mini", - "canonical_slug": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "created": 1760624583, - "description": "GPT-5 Image Mini combines OpenAI's advanced language capabilities, powered by [GPT-5 Mini](https://openrouter.ai/openai/gpt-5-mini), with GPT Image 1 Mini for efficient image generation. This natively multimodal model features superior instruction following, text rendering, and detailed image editing with reduced latency and cost. It excels at high-quality visual creation while maintaining strong text understanding, making it ideal for applications that require both efficient image generation and text processing at scale.", + "name": "GPT-5 Image Mini", "context_length": 400000, - "architecture": { - "modality": "text+image->text+image", - "input_modalities": [ - "file", - "image", - "text" - ], - "output_modalities": [ - "image", - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000025", - "completion": "0.000002", - "request": "0", - "image": "0.0000025", - "input_cache_read": "0.00000025" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "include_reasoning", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 128000, + "input_modalities": [ + "file", + "image", + "text" + ], + "output_modalities": [ + "image", + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000025", + "completion": "0.000002", + "image": "0.0000025", + "web_search": "0.01", + "input_cache_read": "0.00000025" + } + } ] }, { "id": "openai/gpt-5-mini", - "canonical_slug": "openai/gpt-5-mini-2025-08-07", - "name": "OpenAI: GPT-5 Mini", - "created": 1754587407, - "description": "GPT-5 Mini is a compact version of GPT-5, designed to handle lighter-weight reasoning tasks. It provides the same instruction-following and safety-tuning benefits as GPT-5, but with reduced latency and cost. GPT-5 Mini is the successor to OpenAI's o4-mini model.", + "name": "GPT-5 Mini", "context_length": 400000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000025", - "completion": "0.000002", - "request": "0", - "image": "0", - "input_cache_read": "0.000000025" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 128000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000025", + "completion": "0.000002", + "web_search": "0.01", + "input_cache_read": "0.000000025" + } + } ] }, { "id": "openai/gpt-5-nano", - "canonical_slug": "openai/gpt-5-nano-2025-08-07", - "name": "OpenAI: GPT-5 Nano", - "created": 1754587402, - "description": "GPT-5-Nano is the smallest and fastest variant in the GPT-5 system, optimized for developer tools, rapid interactions, and ultra-low latency environments. While limited in reasoning depth compared to its larger counterparts, it retains key instruction-following and safety features. It is the successor to GPT-4.1-nano and offers a lightweight option for cost-sensitive or real-time applications.", + "name": "GPT-5 Nano", "context_length": 400000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000005", - "completion": "0.0000004", - "request": "0", - "image": "0", - "input_cache_read": "0.000000005" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 128000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000005", + "completion": "0.0000004", + "web_search": "0.01", + "input_cache_read": "0.000000005" + } + } ] }, { "id": "openai/gpt-5-pro", - "canonical_slug": "openai/gpt-5-pro-2025-10-06", - "name": "OpenAI: GPT-5 Pro", - "created": 1759776663, - "description": "GPT-5 Pro is OpenAI’s most advanced model, offering major improvements in reasoning, code quality, and user experience. It is optimized for complex tasks that require step-by-step reasoning, instruction following, and accuracy in high-stakes use cases. It supports test-time routing features and advanced prompt understanding, including user-specified intent like \"think hard about this.\" Improvements include reductions in hallucination, sycophancy, and better performance in coding, writing, and health-related tasks.", + "name": "GPT-5 Pro", "context_length": 400000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000015", - "completion": "0.00012", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 400000, - "max_completion_tokens": 128000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" - ] - }, - { - "id": "openai/gpt-oss-120b:exacto", - "canonical_slug": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b (exacto)", - "created": 1754414231, - "description": "gpt-oss-120b is an open-weight, 117B-parameter Mixture-of-Experts (MoE) language model from OpenAI designed for high-reasoning, agentic, and general-purpose production use cases. It activates 5.1B parameters per forward pass and is optimized to run on a single H100 GPU with native MXFP4 quantization. The model supports configurable reasoning depth, full chain-of-thought access, and native tool use, including function calling, browsing, and structured output generation.", + "max_completion_tokens": 128000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000015", + "completion": "0.00012", + "web_search": "0.01" + } + } + ] + }, + { + "id": "openai/gpt-oss-120b", + "name": "gpt-oss-120b", "context_length": 131072, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000005", - "completion": "0.00000024", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 131072, - "max_completion_tokens": null, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "include_reasoning", - "max_tokens", - "min_p", - "presence_penalty", - "reasoning", - "repetition_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000004", + "completion": "0.0000004" + } + }, + { + "variant": "exacto", + "pricing": { + "prompt": "0.00000005", + "completion": "0.00000024" + } + } ] }, { "id": "openai/gpt-oss-20b", - "canonical_slug": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "created": 1754414229, - "description": "gpt-oss-20b is an open-weight 21B parameter model released by OpenAI under the Apache 2.0 license. It uses a Mixture-of-Experts (MoE) architecture with 3.6B active parameters per forward pass, optimized for lower-latency inference and deployability on consumer or single-GPU hardware. The model is trained in OpenAI’s Harmony response format and supports reasoning level configuration, fine-tuning, and agentic capabilities including function calling, tool use, and structured outputs.", + "name": "gpt-oss-20b", "context_length": 131072, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00000003", - "completion": "0.00000014", - "request": "0", - "image": "0" - }, - "top_provider": { - "context_length": 131072, - "max_completion_tokens": null, - "is_moderated": false - }, - "supported_parameters": [ - "frequency_penalty", - "include_reasoning", - "logit_bias", - "max_tokens", - "min_p", - "presence_penalty", - "reasoning", - "repetition_penalty", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_k", - "top_p" + "max_completion_tokens": null, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00000003", + "completion": "0.00000014" + } + } ] }, { "id": "openai/gpt-oss-safeguard-20b", - "canonical_slug": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "created": 1761752836, - "description": "gpt-oss-safeguard-20b is a safety reasoning model from OpenAI built upon gpt-oss-20b. This open-weight, 21B-parameter Mixture-of-Experts (MoE) model offers lower latency for safety tasks like content classification, LLM filtering, and trust & safety labeling.\n\nLearn more about this model in OpenAI's gpt-oss-safeguard [user guide](https://cookbook.openai.com/articles/gpt-oss-safeguard-guide).", + "name": "gpt-oss-safeguard-20b", "context_length": 131072, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000000075", - "completion": "0.0000003", - "request": "0", - "image": "0", - "input_cache_read": "0.000000037" - }, - "top_provider": { - "context_length": 131072, - "max_completion_tokens": 65536, - "is_moderated": false - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "stop", - "temperature", - "tool_choice", - "tools", - "top_p" + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000000075", + "completion": "0.0000003", + "input_cache_read": "0.000000037" + } + } ] }, { "id": "openai/o1", - "canonical_slug": "openai/o1-2024-12-17", - "name": "OpenAI: o1", - "created": 1734459999, - "description": "The latest and strongest model family from OpenAI, o1 is designed to spend more time thinking before responding. The o1 model series is trained with large-scale reinforcement learning to reason using chain of thought. \n\nThe o1 models are optimized for math, science, programming, and other STEM-related tasks. They consistently exhibit PhD-level accuracy on benchmarks in physics, chemistry, and biology. Learn more in the [launch announcement](https://openai.com/o1).\n", + "name": "o1", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000015", - "completion": "0.00006", - "request": "0", - "image": "0.021675", - "input_cache_read": "0.0000075" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000015", + "completion": "0.00006", + "image": "0.021675", + "input_cache_read": "0.0000075" + } + } ] }, { "id": "openai/o1-pro", - "canonical_slug": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "created": 1742423211, - "description": "The o1 series of models are trained with reinforcement learning to think before they answer and perform complex reasoning. The o1-pro model uses more compute to think harder and provide consistently better answers.", + "name": "o1-pro", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "image", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00015", - "completion": "0.0006", - "request": "0", - "image": "0.21675" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs" + "max_completion_tokens": 100000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00015", + "completion": "0.0006", + "image": "0.21675" + } + } ] }, { "id": "openai/o3", - "canonical_slug": "openai/o3-2025-04-16", - "name": "OpenAI: o3", - "created": 1744823457, - "description": "o3 is a well-rounded and powerful model across domains. It sets a new standard for math, science, coding, and visual reasoning tasks. It also excels at technical writing and instruction-following. Use it to think through multi-step problems that involve analysis across text, code, and images. ", + "name": "o3", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "request": "0", - "image": "0.00153", - "input_cache_read": "0.0000005" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "image": "0.00153", + "web_search": "0.01", + "input_cache_read": "0.0000005" + } + } ] }, { "id": "openai/o3-deep-research", - "canonical_slug": "openai/o3-deep-research-2025-06-26", - "name": "OpenAI: o3 Deep Research", - "created": 1760129661, - "description": "o3-deep-research is OpenAI's advanced model for deep research, designed to tackle complex, multi-step research tasks.\n\nNote: This model always uses the 'web_search' tool which adds additional cost.", + "name": "o3 Deep Research", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00001", - "completion": "0.00004", - "request": "0", - "image": "0.00765", - "input_cache_read": "0.0000025" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "include_reasoning", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 100000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00001", + "completion": "0.00004", + "image": "0.00765", + "web_search": "0.01", + "input_cache_read": "0.0000025" + } + } ] }, { "id": "openai/o3-mini", - "canonical_slug": "openai/o3-mini-2025-01-31", - "name": "OpenAI: o3 Mini", - "created": 1738351721, - "description": "OpenAI o3-mini is a cost-efficient language model optimized for STEM reasoning tasks, particularly excelling in science, mathematics, and coding.\n\nThis model supports the `reasoning_effort` parameter, which can be set to \"high\", \"medium\", or \"low\" to control the thinking time of the model. The default is \"medium\". OpenRouter also offers the model slug `openai/o3-mini-high` to default the parameter to \"high\".\n\nThe model features three adjustable reasoning effort levels and supports key developer capabilities including function calling, structured outputs, and streaming, though it does not include vision processing capabilities.\n\nThe model demonstrates significant improvements over its predecessor, with expert testers preferring its responses 56% of the time and noting a 39% reduction in major errors on complex questions. With medium reasoning effort settings, o3-mini matches the performance of the larger o1 model on challenging reasoning evaluations like AIME and GPQA, while maintaining lower latency and cost.", + "name": "o3 Mini", "context_length": 200000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0", - "input_cache_read": "0.00000055" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "input_cache_read": "0.00000055" + } + } ] }, { "id": "openai/o3-mini-high", - "canonical_slug": "openai/o3-mini-high-2025-01-31", - "name": "OpenAI: o3 Mini High", - "created": 1739372611, - "description": "OpenAI o3-mini-high is the same model as [o3-mini](/openai/o3-mini) with reasoning_effort set to high. \n\no3-mini is a cost-efficient language model optimized for STEM reasoning tasks, particularly excelling in science, mathematics, and coding. The model features three adjustable reasoning effort levels and supports key developer capabilities including function calling, structured outputs, and streaming, though it does not include vision processing capabilities.\n\nThe model demonstrates significant improvements over its predecessor, with expert testers preferring its responses 56% of the time and noting a 39% reduction in major errors on complex questions. With medium reasoning effort settings, o3-mini matches the performance of the larger o1 model on challenging reasoning evaluations like AIME and GPQA, while maintaining lower latency and cost.", + "name": "o3 Mini High", "context_length": 200000, - "architecture": { - "modality": "text->text", - "input_modalities": [ - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0", - "input_cache_read": "0.00000055" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "max_tokens", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "input_cache_read": "0.00000055" + } + } ] }, { "id": "openai/o3-pro", - "canonical_slug": "openai/o3-pro-2025-06-10", - "name": "OpenAI: o3 Pro", - "created": 1749598352, - "description": "The o-series of models are trained with reinforcement learning to think before they answer and perform complex reasoning. The o3-pro model uses more compute to think harder and provide consistently better answers.\n\nNote that BYOK is required for this model. Set up here: https://openrouter.ai/settings/integrations", + "name": "o3 Pro", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "text", - "file", - "image" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.00002", - "completion": "0.00008", - "request": "0", - "image": "0.0153" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "text", + "file", + "image" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.00002", + "completion": "0.00008", + "image": "0.0153", + "web_search": "0.01" + } + } ] }, { "id": "openai/o4-mini", - "canonical_slug": "openai/o4-mini-2025-04-16", - "name": "OpenAI: o4 Mini", - "created": 1744820942, - "description": "OpenAI o4-mini is a compact reasoning model in the o-series, optimized for fast, cost-efficient performance while retaining strong multimodal and agentic capabilities. It supports tool use and demonstrates competitive reasoning and coding performance across benchmarks like AIME (99.5% with Python) and SWE-bench, outperforming its predecessor o3-mini and even approaching o3 in some domains.\n\nDespite its smaller size, o4-mini exhibits high accuracy in STEM tasks, visual problem solving (e.g., MathVista, MMMU), and code editing. It is especially well-suited for high-throughput scenarios where latency or cost is critical. Thanks to its efficient architecture and refined reinforcement learning training, o4-mini can chain tools, generate structured outputs, and solve multi-step tasks with minimal delay—often in under a minute.", + "name": "o4 Mini", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0.0008415", - "input_cache_read": "0.000000275" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "image": "0.0008415", + "web_search": "0.01", + "input_cache_read": "0.000000275" + } + } ] }, { "id": "openai/o4-mini-deep-research", - "canonical_slug": "openai/o4-mini-deep-research-2025-06-26", - "name": "OpenAI: o4 Mini Deep Research", - "created": 1760129642, - "description": "o4-mini-deep-research is OpenAI's faster, more affordable deep research model—ideal for tackling complex, multi-step research tasks.\n\nNote: This model always uses the 'web_search' tool which adds additional cost.", + "name": "o4 Mini Deep Research", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "file", - "image", - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "instruct_type": null - }, - "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "request": "0", - "image": "0.00153", - "input_cache_read": "0.0000005" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "frequency_penalty", - "include_reasoning", - "logit_bias", - "logprobs", - "max_tokens", - "presence_penalty", - "reasoning", - "response_format", - "seed", - "stop", - "structured_outputs", - "temperature", - "tool_choice", - "tools", - "top_logprobs", - "top_p" + "max_completion_tokens": 100000, + "input_modalities": [ + "file", + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "image": "0.00153", + "web_search": "0.01", + "input_cache_read": "0.0000005" + } + } ] }, { "id": "openai/o4-mini-high", - "canonical_slug": "openai/o4-mini-high-2025-04-16", - "name": "OpenAI: o4 Mini High", - "created": 1744824212, - "description": "OpenAI o4-mini-high is the same model as [o4-mini](/openai/o4-mini) with reasoning_effort set to high. \n\nOpenAI o4-mini is a compact reasoning model in the o-series, optimized for fast, cost-efficient performance while retaining strong multimodal and agentic capabilities. It supports tool use and demonstrates competitive reasoning and coding performance across benchmarks like AIME (99.5% with Python) and SWE-bench, outperforming its predecessor o3-mini and even approaching o3 in some domains.\n\nDespite its smaller size, o4-mini exhibits high accuracy in STEM tasks, visual problem solving (e.g., MathVista, MMMU), and code editing. It is especially well-suited for high-throughput scenarios where latency or cost is critical. Thanks to its efficient architecture and refined reinforcement learning training, o4-mini can chain tools, generate structured outputs, and solve multi-step tasks with minimal delay—often in under a minute.", + "name": "o4 Mini High", "context_length": 200000, - "architecture": { - "modality": "text+image->text", - "input_modalities": [ - "image", - "text", - "file" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Other", - "instruct_type": null - }, - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0.0008415", - "input_cache_read": "0.000000275" - }, - "top_provider": { - "context_length": 200000, - "max_completion_tokens": 100000, - "is_moderated": true - }, - "supported_parameters": [ - "include_reasoning", - "max_tokens", - "reasoning", - "response_format", - "seed", - "structured_outputs", - "tool_choice", - "tools" + "max_completion_tokens": 100000, + "input_modalities": [ + "image", + "text", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Other", + "variants": [ + { + "variant": "", + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "image": "0.0008415", + "web_search": "0.01", + "input_cache_read": "0.000000275" + } + } ] } ] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/mod.rs b/crates/goose/src/providers/canonical/mod.rs index 0659a3b31cf5..c402bed2fe3f 100644 --- a/crates/goose/src/providers/canonical/mod.rs +++ b/crates/goose/src/providers/canonical/mod.rs @@ -2,7 +2,7 @@ mod model; mod name_builder; mod registry; -pub use model::{Architecture, CanonicalModel, Pricing, TopProvider}; +pub use model::{CanonicalModel, ModelVariant, Pricing}; pub use name_builder::{canonical_name, strip_version_suffix}; pub use registry::CanonicalModelRegistry; diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 1b9891d45cac..1d3ef8b5723e 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -1,42 +1,35 @@ use serde::{Deserialize, Serialize}; -/// Architecture information for a model -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Architecture { - /// The modality of the model (e.g., "text->text", "text+image->text") - pub modality: String, - - /// Input modalities supported (e.g., ["text", "image"]) - #[serde(default)] - pub input_modalities: Vec, - - /// Output modalities supported (e.g., ["text"]) - #[serde(default)] - pub output_modalities: Vec, - - /// Tokenizer type - pub tokenizer: String, - - /// Instruction type, if applicable - pub instruct_type: Option, -} - -/// Pricing information for a model (all costs in USD) +/// Pricing information for a model variant (all costs in USD per token as strings) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Pricing { /// Cost per prompt token - pub prompt: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub prompt: Option, /// Cost per completion token - pub completion: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub completion: Option, /// Cost per request - #[serde(default)] - pub request: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub request: Option, - /// Cost per image token - #[serde(default)] - pub image: String, + /// Cost per image + #[serde(skip_serializing_if = "Option::is_none")] + pub image: Option, + + /// Cost per audio token/unit + #[serde(skip_serializing_if = "Option::is_none")] + pub audio: Option, + + /// Cost for web search + #[serde(skip_serializing_if = "Option::is_none")] + pub web_search: Option, + + /// Cost for internal reasoning tokens + #[serde(skip_serializing_if = "Option::is_none")] + pub internal_reasoning: Option, /// Cost for input cache reads #[serde(skip_serializing_if = "Option::is_none")] @@ -47,92 +40,100 @@ pub struct Pricing { pub input_cache_write: Option, } -/// Top provider information for a model -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TopProvider { - /// Context length from the top provider (may be null for some models) - pub context_length: Option, +impl Pricing { + /// Parse prompt cost as f64 (cost per token) + pub fn prompt_cost(&self) -> Option { + self.prompt.as_ref().and_then(|s| s.parse().ok()) + } - /// Maximum completion tokens - #[serde(default)] - pub max_completion_tokens: Option, + /// Parse completion cost as f64 (cost per token) + pub fn completion_cost(&self) -> Option { + self.completion.as_ref().and_then(|s| s.parse().ok()) + } +} - /// Whether the model is moderated - #[serde(default)] - pub is_moderated: bool, +/// A pricing variant for a model (e.g., base, extended, thinking) +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ModelVariant { + /// Variant name (empty string "" for base model, or "extended", "thinking", etc.) + pub variant: String, + + /// Pricing for this variant + pub pricing: Pricing, } -/// Canonical representation of a model based on OpenRouter's schema +/// Canonical representation of a model #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CanonicalModel { - /// OpenRouter's API identifier (e.g., "anthropic/claude-sonnet-4.5") + /// Model identifier (e.g., "anthropic/claude-3-5-sonnet") pub id: String, - /// Canonical slug - standardized reference with version info (e.g., "anthropic/claude-4.5-sonnet-20250929") - /// This is our primary identifier for model mapping - pub canonical_slug: String, - - /// Human-readable name + /// Human-readable name (e.g., "Claude 3.5 Sonnet") pub name: String, - /// Unix timestamp of when the model was created - #[serde(default)] - pub created: Option, - - /// Description of the model - #[serde(default)] - pub description: String, - /// Maximum context window size in tokens pub context_length: usize, - /// Architecture information - pub architecture: Architecture, - - /// Pricing information (all in USD) - pub pricing: Pricing, + /// Maximum completion tokens + #[serde(skip_serializing_if = "Option::is_none")] + pub max_completion_tokens: Option, - /// Top provider metadata - pub top_provider: TopProvider, + /// Input modalities supported (e.g., ["text", "image"]) + #[serde(default)] + pub input_modalities: Vec, - /// List of supported parameters (e.g., "temperature", "top_p", "tools") + /// Output modalities supported (e.g., ["text"]) #[serde(default)] - pub supported_parameters: Vec, + pub output_modalities: Vec, + + /// Tokenizer type (e.g., "GPT", "Claude", "Gemini") + pub tokenizer: String, + + /// Pricing variants for this model (base variant has variant = "") + pub variants: Vec, } impl CanonicalModel { - /// Check if the model supports tool/function calling - pub fn supports_tools(&self) -> bool { - self.supported_parameters.iter().any(|p| p == "tools" || p == "tool_choice") + /// Get the base variant (variant = "") + pub fn base_variant(&self) -> Option<&ModelVariant> { + self.variants.iter().find(|v| v.variant.is_empty()) + } + + /// Get a specific variant by name + pub fn get_variant(&self, variant: &str) -> Option<&ModelVariant> { + self.variants.iter().find(|v| v.variant == variant) } - /// Check if the model supports prompt caching + /// Check if the model supports prompt caching (any variant has cache pricing) pub fn supports_cache(&self) -> bool { - self.pricing.input_cache_read.is_some() || self.pricing.input_cache_write.is_some() + self.variants.iter().any(|v| { + v.pricing.input_cache_read.is_some() || v.pricing.input_cache_write.is_some() + }) } /// Check if the model supports vision/image inputs pub fn supports_vision(&self) -> bool { - self.architecture.input_modalities.contains(&"image".to_string()) + self.input_modalities.contains(&"image".to_string()) } - /// Get the provider name from the canonical slug (e.g., "anthropic" from "anthropic/claude-3-5-sonnet") + /// Get the provider name from the id (e.g., "anthropic" from "anthropic/claude-3-5-sonnet") pub fn provider(&self) -> Option<&str> { - self.canonical_slug.split('/').next() + self.id.split('/').next() } /// Get the model name without the provider prefix pub fn model_name(&self) -> Option<&str> { - self.canonical_slug.split('/').nth(1) + self.id.split('/').nth(1) } - /// Parse prompt cost as f64 (cost per token) + /// Get base variant prompt cost as f64 (cost per token) pub fn prompt_cost(&self) -> Option { - self.pricing.prompt.parse().ok() + self.base_variant().and_then(|v| v.pricing.prompt_cost()) } - /// Parse completion cost as f64 (cost per token) + /// Get base variant completion cost as f64 (cost per token) pub fn completion_cost(&self) -> Option { - self.pricing.completion.parse().ok() + self.base_variant() + .and_then(|v| v.pricing.completion_cost()) } -} \ No newline at end of file +} diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs index 60ff172be42d..daa790103956 100644 --- a/crates/goose/src/providers/canonical/registry.rs +++ b/crates/goose/src/providers/canonical/registry.rs @@ -36,7 +36,7 @@ impl CanonicalModelRegistry { /// Save registry to a JSON file pub fn to_file(&self, path: impl AsRef) -> Result<()> { let mut models: Vec<&CanonicalModel> = self.models.values().collect(); - models.sort_by(|a, b| a.canonical_slug.cmp(&b.canonical_slug)); + models.sort_by(|a, b| a.id.cmp(&b.id)); let json = serde_json::to_string_pretty(&models) .context("Failed to serialize canonical models")?; @@ -49,7 +49,7 @@ impl CanonicalModelRegistry { /// Register a canonical model pub fn register(&mut self, model: CanonicalModel) { - self.models.insert(model.canonical_slug.clone(), model); + self.models.insert(model.id.clone(), model); } /// Look up a canonical model by name From 239743a7e585c154edefdd6e0dffab8f00b42621 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 12 Nov 2025 11:52:45 -0500 Subject: [PATCH 07/52] rm varieants --- .../providers/canonical/canonical_models.json | 1113 ++++++----------- crates/goose/src/providers/canonical/mod.rs | 2 +- crates/goose/src/providers/canonical/model.rs | 59 +- 3 files changed, 442 insertions(+), 732 deletions(-) diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json index cb97645fdb78..a2017ceb08c5 100644 --- a/crates/goose/src/providers/canonical/canonical_models.json +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -12,18 +12,13 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000025", - "completion": "0.00000125", - "image": "0.0004", - "input_cache_read": "0.00000003", - "input_cache_write": "0.0000003" - } - } - ] + "pricing": { + "prompt": "0.00000025", + "completion": "0.00000125", + "image": "0.0004", + "input_cache_read": "0.00000003", + "input_cache_write": "0.0000003" + } }, { "id": "anthropic/claude-3-opus", @@ -38,18 +33,13 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" - } - } - ] + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + } }, { "id": "anthropic/claude-3.5-haiku", @@ -65,17 +55,12 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000008", - "completion": "0.000004", - "input_cache_read": "0.00000008", - "input_cache_write": "0.000001" - } - } - ] + "pricing": { + "prompt": "0.0000008", + "completion": "0.000004", + "input_cache_read": "0.00000008", + "input_cache_write": "0.000001" + } }, { "id": "anthropic/claude-3.5-sonnet", @@ -91,21 +76,38 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - } - } - ] + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } }, { "id": "anthropic/claude-3.7-sonnet", + "name": "Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", "name": "Claude 3.7 Sonnet (thinking)", "context_length": 200000, "max_completion_tokens": 64000, @@ -118,28 +120,13 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - } - }, - { - "variant": "thinking", - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - } - } - ] + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "image": "0.0048", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } }, { "id": "anthropic/claude-haiku", @@ -154,17 +141,12 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000001", - "completion": "0.000005", - "input_cache_read": "0.0000001", - "input_cache_write": "0.00000125" - } - } - ] + "pricing": { + "prompt": "0.000001", + "completion": "0.000005", + "input_cache_read": "0.0000001", + "input_cache_write": "0.00000125" + } }, { "id": "anthropic/claude-opus", @@ -180,18 +162,13 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" - } - } - ] + "pricing": { + "prompt": "0.000015", + "completion": "0.000075", + "image": "0.024", + "input_cache_read": "0.0000015", + "input_cache_write": "0.00001875" + } }, { "id": "anthropic/claude-sonnet", @@ -207,17 +184,12 @@ "text" ], "tokenizer": "Claude", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" - } - } - ] + "pricing": { + "prompt": "0.000003", + "completion": "0.000015", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375" + } }, { "id": "google/gemini-2.0-flash", @@ -234,19 +206,14 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "image": "0.0000258", - "audio": "0.0000007", - "input_cache_read": "0.000000025", - "input_cache_write": "0.0000001833" - } - } - ] + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "image": "0.0000258", + "audio": "0.0000007", + "input_cache_read": "0.000000025", + "input_cache_write": "0.0000001833" + } }, { "id": "google/gemini-2.0-flash-lite", @@ -263,15 +230,10 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000000075", - "completion": "0.0000003" - } - } - ] + "pricing": { + "prompt": "0.000000075", + "completion": "0.0000003" + } }, { "id": "google/gemini-2.5-flash", @@ -289,18 +251,13 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "image": "0.001238", - "input_cache_read": "0.00000003", - "input_cache_write": "0.0000003833" - } - } - ] + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238", + "input_cache_read": "0.00000003", + "input_cache_write": "0.0000003833" + } }, { "id": "google/gemini-2.5-flash-image", @@ -316,16 +273,11 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "image": "0.001238" - } - } - ] + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238" + } }, { "id": "google/gemini-2.5-flash-image-preview", @@ -341,16 +293,11 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "image": "0.001238" - } - } - ] + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238" + } }, { "id": "google/gemini-2.5-flash-lite", @@ -368,17 +315,12 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "input_cache_read": "0.00000001", - "input_cache_write": "0.0000001833" - } - } - ] + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "input_cache_read": "0.00000001", + "input_cache_write": "0.0000001833" + } }, { "id": "google/gemini-2.5-flash-lite-preview-06", @@ -395,18 +337,13 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "audio": "0.0000003", - "input_cache_read": "0.000000025", - "input_cache_write": "0.0000001833" - } - } - ] + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "audio": "0.0000003", + "input_cache_read": "0.000000025", + "input_cache_write": "0.0000001833" + } }, { "id": "google/gemini-2.5-flash-lite-preview-09", @@ -424,15 +361,10 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004" - } - } - ] + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004" + } }, { "id": "google/gemini-2.5-flash-preview-09", @@ -450,19 +382,14 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "image": "0.001238", - "audio": "0.000001", - "input_cache_read": "0.000000075", - "input_cache_write": "0.0000003833" - } - } - ] + "pricing": { + "prompt": "0.0000003", + "completion": "0.0000025", + "image": "0.001238", + "audio": "0.000001", + "input_cache_read": "0.000000075", + "input_cache_write": "0.0000003833" + } }, { "id": "google/gemini-2.5-pro", @@ -480,18 +407,13 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "image": "0.00516", - "input_cache_read": "0.000000125", - "input_cache_write": "0.000001625" - } - } - ] + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "image": "0.00516", + "input_cache_read": "0.000000125", + "input_cache_write": "0.000001625" + } }, { "id": "google/gemini-2.5-pro-preview", @@ -508,18 +430,13 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "image": "0.00516", - "input_cache_read": "0.00000031", - "input_cache_write": "0.000001625" - } - } - ] + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "image": "0.00516", + "input_cache_read": "0.00000031", + "input_cache_write": "0.000001625" + } }, { "id": "google/gemini-2.5-pro-preview-05", @@ -537,18 +454,13 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "image": "0.00516", - "input_cache_read": "0.00000031", - "input_cache_write": "0.000001625" - } - } - ] + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "image": "0.00516", + "input_cache_read": "0.00000031", + "input_cache_write": "0.000001625" + } }, { "id": "google/gemma-2-27b-it", @@ -562,15 +474,10 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000065", - "completion": "0.00000065" - } - } - ] + "pricing": { + "prompt": "0.00000065", + "completion": "0.00000065" + } }, { "id": "google/gemma-2-9b-it", @@ -584,15 +491,10 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000003", - "completion": "0.00000009" - } - } - ] + "pricing": { + "prompt": "0.00000003", + "completion": "0.00000009" + } }, { "id": "google/gemma-3-12b-it", @@ -607,15 +509,10 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000003", - "completion": "0.0000001" - } - } - ] + "pricing": { + "prompt": "0.00000003", + "completion": "0.0000001" + } }, { "id": "google/gemma-3-27b-it", @@ -630,16 +527,11 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000009", - "completion": "0.00000016", - "image": "0.0000256" - } - } - ] + "pricing": { + "prompt": "0.00000009", + "completion": "0.00000016", + "image": "0.0000256" + } }, { "id": "google/gemma-3-4b-it", @@ -654,15 +546,10 @@ "text" ], "tokenizer": "Gemini", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000001703012", - "completion": "0.0000000681536" - } - } - ] + "pricing": { + "prompt": "0.00000001703012", + "completion": "0.0000000681536" + } }, { "id": "google/gemma-3n-e4b-it", @@ -676,15 +563,10 @@ "text" ], "tokenizer": "Other", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000002", - "completion": "0.00000004" - } - } - ] + "pricing": { + "prompt": "0.00000002", + "completion": "0.00000004" + } }, { "id": "openai/chatgpt-4o-latest", @@ -699,16 +581,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000005", - "completion": "0.000015", - "image": "0.007225" - } - } - ] + "pricing": { + "prompt": "0.000005", + "completion": "0.000015", + "image": "0.007225" + } }, { "id": "openai/codex-mini", @@ -723,16 +600,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000015", - "completion": "0.000006", - "input_cache_read": "0.000000375" - } - } - ] + "pricing": { + "prompt": "0.0000015", + "completion": "0.000006", + "input_cache_read": "0.000000375" + } }, { "id": "openai/gpt", @@ -748,17 +620,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "web_search": "0.01", - "input_cache_read": "0.0000005" - } - } - ] + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "web_search": "0.01", + "input_cache_read": "0.0000005" + } }, { "id": "openai/gpt-3.5-turbo", @@ -772,15 +639,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000005", - "completion": "0.0000015" - } - } - ] + "pricing": { + "prompt": "0.0000005", + "completion": "0.0000015" + } }, { "id": "openai/gpt-3.5-turbo-16k", @@ -794,15 +656,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000003", - "completion": "0.000004" - } - } - ] + "pricing": { + "prompt": "0.000003", + "completion": "0.000004" + } }, { "id": "openai/gpt-3.5-turbo-instruct", @@ -816,15 +673,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000015", - "completion": "0.000002" - } - } - ] + "pricing": { + "prompt": "0.0000015", + "completion": "0.000002" + } }, { "id": "openai/gpt-4", @@ -838,15 +690,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00003", - "completion": "0.00006" - } - } - ] + "pricing": { + "prompt": "0.00003", + "completion": "0.00006" + } }, { "id": "openai/gpt-4-1106-preview", @@ -860,15 +707,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00001", - "completion": "0.00003" - } - } - ] + "pricing": { + "prompt": "0.00001", + "completion": "0.00003" + } }, { "id": "openai/gpt-4-turbo", @@ -883,16 +725,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00001", - "completion": "0.00003", - "image": "0.01445" - } - } - ] + "pricing": { + "prompt": "0.00001", + "completion": "0.00003", + "image": "0.01445" + } }, { "id": "openai/gpt-4-turbo-preview", @@ -906,15 +743,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00001", - "completion": "0.00003" - } - } - ] + "pricing": { + "prompt": "0.00001", + "completion": "0.00003" + } }, { "id": "openai/gpt-4.1-mini", @@ -930,17 +762,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000004", - "completion": "0.0000016", - "web_search": "0.01", - "input_cache_read": "0.0000001" - } - } - ] + "pricing": { + "prompt": "0.0000004", + "completion": "0.0000016", + "web_search": "0.01", + "input_cache_read": "0.0000001" + } }, { "id": "openai/gpt-4.1-nano", @@ -956,17 +783,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "web_search": "0.01", - "input_cache_read": "0.000000025" - } - } - ] + "pricing": { + "prompt": "0.0000001", + "completion": "0.0000004", + "web_search": "0.01", + "input_cache_read": "0.000000025" + } }, { "id": "openai/gpt-4o", @@ -982,25 +804,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "image": "0.003613", - "input_cache_read": "0.00000125" - } - }, - { - "variant": "extended", - "pricing": { - "prompt": "0.000006", - "completion": "0.000018", - "image": "0.007225" - } - } - ] + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "image": "0.003613", + "input_cache_read": "0.00000125" + } }, { "id": "openai/gpt-4o-audio-preview", @@ -1015,20 +824,15 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "audio": "0.00004" - } - } - ] + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "audio": "0.00004" + } }, { "id": "openai/gpt-4o-mini", - "name": "GPT-4o-mini (2024-07-18)", + "name": "GPT-4o-mini", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ @@ -1040,17 +844,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "image": "0.007225", - "input_cache_read": "0.000000075" - } - } - ] + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "image": "0.000217", + "input_cache_read": "0.000000075" + } }, { "id": "openai/gpt-4o-mini-search-preview", @@ -1064,17 +863,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "image": "0.000217", - "request": "0.0275" - } - } - ] + "pricing": { + "prompt": "0.00000015", + "completion": "0.0000006", + "image": "0.000217", + "request": "0.0275" + } }, { "id": "openai/gpt-4o-search-preview", @@ -1088,17 +882,32 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "image": "0.003613", - "request": "0.035" - } - } - ] + "pricing": { + "prompt": "0.0000025", + "completion": "0.00001", + "image": "0.003613", + "request": "0.035" + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text", + "image", + "file" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "pricing": { + "prompt": "0.000006", + "completion": "0.000018", + "image": "0.007225" + } }, { "id": "openai/gpt-5-chat", @@ -1114,17 +923,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "web_search": "0.01", - "input_cache_read": "0.000000125" - } - } - ] + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "web_search": "0.01", + "input_cache_read": "0.000000125" + } }, { "id": "openai/gpt-5-codex", @@ -1139,16 +943,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "input_cache_read": "0.000000125" - } - } - ] + "pricing": { + "prompt": "0.00000125", + "completion": "0.00001", + "input_cache_read": "0.000000125" + } }, { "id": "openai/gpt-5-image", @@ -1165,18 +964,13 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00001", - "completion": "0.00001", - "image": "0.00001", - "web_search": "0.01", - "input_cache_read": "0.00000125" - } - } - ] + "pricing": { + "prompt": "0.00001", + "completion": "0.00001", + "image": "0.00001", + "web_search": "0.01", + "input_cache_read": "0.00000125" + } }, { "id": "openai/gpt-5-image-mini", @@ -1193,18 +987,13 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000025", - "completion": "0.000002", - "image": "0.0000025", - "web_search": "0.01", - "input_cache_read": "0.00000025" - } - } - ] + "pricing": { + "prompt": "0.0000025", + "completion": "0.000002", + "image": "0.0000025", + "web_search": "0.01", + "input_cache_read": "0.00000025" + } }, { "id": "openai/gpt-5-mini", @@ -1220,17 +1009,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000025", - "completion": "0.000002", - "web_search": "0.01", - "input_cache_read": "0.000000025" - } - } - ] + "pricing": { + "prompt": "0.00000025", + "completion": "0.000002", + "web_search": "0.01", + "input_cache_read": "0.000000025" + } }, { "id": "openai/gpt-5-nano", @@ -1246,17 +1030,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000005", - "completion": "0.0000004", - "web_search": "0.01", - "input_cache_read": "0.000000005" - } - } - ] + "pricing": { + "prompt": "0.00000005", + "completion": "0.0000004", + "web_search": "0.01", + "input_cache_read": "0.000000005" + } }, { "id": "openai/gpt-5-pro", @@ -1272,16 +1051,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000015", - "completion": "0.00012", - "web_search": "0.01" - } - } - ] + "pricing": { + "prompt": "0.000015", + "completion": "0.00012", + "web_search": "0.01" + } }, { "id": "openai/gpt-oss-120b", @@ -1295,22 +1069,27 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000004", - "completion": "0.0000004" - } - }, - { - "variant": "exacto", - "pricing": { - "prompt": "0.00000005", - "completion": "0.00000024" - } - } - ] + "pricing": { + "prompt": "0.00000004", + "completion": "0.0000004" + } + }, + { + "id": "openai/gpt-oss-120b:exacto", + "name": "gpt-oss-120b (exacto)", + "context_length": 131072, + "max_completion_tokens": null, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "pricing": { + "prompt": "0.00000005", + "completion": "0.00000024" + } }, { "id": "openai/gpt-oss-20b", @@ -1324,15 +1103,10 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00000003", - "completion": "0.00000014" - } - } - ] + "pricing": { + "prompt": "0.00000003", + "completion": "0.00000014" + } }, { "id": "openai/gpt-oss-safeguard-20b", @@ -1346,16 +1120,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000000075", - "completion": "0.0000003", - "input_cache_read": "0.000000037" - } - } - ] + "pricing": { + "prompt": "0.000000075", + "completion": "0.0000003", + "input_cache_read": "0.000000037" + } }, { "id": "openai/o1", @@ -1371,17 +1140,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000015", - "completion": "0.00006", - "image": "0.021675", - "input_cache_read": "0.0000075" - } - } - ] + "pricing": { + "prompt": "0.000015", + "completion": "0.00006", + "image": "0.021675", + "input_cache_read": "0.0000075" + } }, { "id": "openai/o1-pro", @@ -1397,16 +1161,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00015", - "completion": "0.0006", - "image": "0.21675" - } - } - ] + "pricing": { + "prompt": "0.00015", + "completion": "0.0006", + "image": "0.21675" + } }, { "id": "openai/o3", @@ -1422,18 +1181,13 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "image": "0.00153", - "web_search": "0.01", - "input_cache_read": "0.0000005" - } - } - ] + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "image": "0.00153", + "web_search": "0.01", + "input_cache_read": "0.0000005" + } }, { "id": "openai/o3-deep-research", @@ -1449,18 +1203,13 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00001", - "completion": "0.00004", - "image": "0.00765", - "web_search": "0.01", - "input_cache_read": "0.0000025" - } - } - ] + "pricing": { + "prompt": "0.00001", + "completion": "0.00004", + "image": "0.00765", + "web_search": "0.01", + "input_cache_read": "0.0000025" + } }, { "id": "openai/o3-mini", @@ -1475,16 +1224,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "input_cache_read": "0.00000055" - } - } - ] + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "input_cache_read": "0.00000055" + } }, { "id": "openai/o3-mini-high", @@ -1499,16 +1243,11 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "input_cache_read": "0.00000055" - } - } - ] + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "input_cache_read": "0.00000055" + } }, { "id": "openai/o3-pro", @@ -1524,17 +1263,12 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.00002", - "completion": "0.00008", - "image": "0.0153", - "web_search": "0.01" - } - } - ] + "pricing": { + "prompt": "0.00002", + "completion": "0.00008", + "image": "0.0153", + "web_search": "0.01" + } }, { "id": "openai/o4-mini", @@ -1550,18 +1284,13 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "image": "0.0008415", - "web_search": "0.01", - "input_cache_read": "0.000000275" - } - } - ] + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "image": "0.0008415", + "web_search": "0.01", + "input_cache_read": "0.000000275" + } }, { "id": "openai/o4-mini-deep-research", @@ -1577,18 +1306,13 @@ "text" ], "tokenizer": "GPT", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "image": "0.00153", - "web_search": "0.01", - "input_cache_read": "0.0000005" - } - } - ] + "pricing": { + "prompt": "0.000002", + "completion": "0.000008", + "image": "0.00153", + "web_search": "0.01", + "input_cache_read": "0.0000005" + } }, { "id": "openai/o4-mini-high", @@ -1604,17 +1328,12 @@ "text" ], "tokenizer": "Other", - "variants": [ - { - "variant": "", - "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "image": "0.0008415", - "web_search": "0.01", - "input_cache_read": "0.000000275" - } - } - ] + "pricing": { + "prompt": "0.0000011", + "completion": "0.0000044", + "image": "0.0008415", + "web_search": "0.01", + "input_cache_read": "0.000000275" + } } ] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/mod.rs b/crates/goose/src/providers/canonical/mod.rs index c402bed2fe3f..b9356ecca7b3 100644 --- a/crates/goose/src/providers/canonical/mod.rs +++ b/crates/goose/src/providers/canonical/mod.rs @@ -2,7 +2,7 @@ mod model; mod name_builder; mod registry; -pub use model::{CanonicalModel, ModelVariant, Pricing}; +pub use model::{CanonicalModel, Pricing}; pub use name_builder::{canonical_name, strip_version_suffix}; pub use registry::CanonicalModelRegistry; diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 1d3ef8b5723e..c093fe7a43c5 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -/// Pricing information for a model variant (all costs in USD per token as strings) +/// Pricing information for a model (all costs in USD per token as strings) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Pricing { /// Cost per prompt token @@ -52,20 +52,10 @@ impl Pricing { } } -/// A pricing variant for a model (e.g., base, extended, thinking) -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ModelVariant { - /// Variant name (empty string "" for base model, or "extended", "thinking", etc.) - pub variant: String, - - /// Pricing for this variant - pub pricing: Pricing, -} - /// Canonical representation of a model #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CanonicalModel { - /// Model identifier (e.g., "anthropic/claude-3-5-sonnet") + /// Model identifier (e.g., "anthropic/claude-3-5-sonnet" or "openai/gpt-4o:extended") pub id: String, /// Human-readable name (e.g., "Claude 3.5 Sonnet") @@ -89,26 +79,14 @@ pub struct CanonicalModel { /// Tokenizer type (e.g., "GPT", "Claude", "Gemini") pub tokenizer: String, - /// Pricing variants for this model (base variant has variant = "") - pub variants: Vec, + /// Pricing for this model + pub pricing: Pricing, } impl CanonicalModel { - /// Get the base variant (variant = "") - pub fn base_variant(&self) -> Option<&ModelVariant> { - self.variants.iter().find(|v| v.variant.is_empty()) - } - - /// Get a specific variant by name - pub fn get_variant(&self, variant: &str) -> Option<&ModelVariant> { - self.variants.iter().find(|v| v.variant == variant) - } - - /// Check if the model supports prompt caching (any variant has cache pricing) + /// Check if the model supports prompt caching pub fn supports_cache(&self) -> bool { - self.variants.iter().any(|v| { - v.pricing.input_cache_read.is_some() || v.pricing.input_cache_write.is_some() - }) + self.pricing.input_cache_read.is_some() || self.pricing.input_cache_write.is_some() } /// Check if the model supports vision/image inputs @@ -121,19 +99,32 @@ impl CanonicalModel { self.id.split('/').next() } - /// Get the model name without the provider prefix + /// Get the model name without the provider prefix (may include variant like ":extended") pub fn model_name(&self) -> Option<&str> { self.id.split('/').nth(1) } - /// Get base variant prompt cost as f64 (cost per token) + /// Get the base model ID without variant (e.g., "anthropic/claude-3.7-sonnet:thinking" -> "anthropic/claude-3.7-sonnet") + pub fn base_model_id(&self) -> String { + if let Some(pos) = self.id.rfind(':') { + self.id[..pos].to_string() + } else { + self.id.clone() + } + } + + /// Get the variant suffix if present (e.g., "thinking" from "claude-3.7-sonnet:thinking") + pub fn variant(&self) -> Option<&str> { + self.id.split(':').nth(1) + } + + /// Get prompt cost as f64 (cost per token) pub fn prompt_cost(&self) -> Option { - self.base_variant().and_then(|v| v.pricing.prompt_cost()) + self.pricing.prompt_cost() } - /// Get base variant completion cost as f64 (cost per token) + /// Get completion cost as f64 (cost per token) pub fn completion_cost(&self) -> Option { - self.base_variant() - .and_then(|v| v.pricing.completion_cost()) + self.pricing.completion_cost() } } From dd5c916e2e1d9de1c8db73a56c2dedcd8a02be17 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 12 Nov 2025 14:03:20 -0500 Subject: [PATCH 08/52] more mapping improvements --- canonical_mapping_report.json | 1487 +++--- crates/goose/canonical_mapping_report.json | 4413 +++++++++++++++++ .../goose/examples/build_canonical_models.rs | 164 + .../goose/examples/canonical_model_checker.rs | 25 +- crates/goose/src/providers/anthropic.rs | 12 + crates/goose/src/providers/base.rs | 10 +- .../providers/canonical/canonical_models.json | 702 +-- .../src/providers/canonical/name_builder.rs | 103 +- .../goose/src/providers/canonical/registry.rs | 29 + crates/goose/src/providers/google.rs | 12 + crates/goose/src/providers/openai.rs | 12 + crates/goose/src/providers/openrouter.rs | 13 + 12 files changed, 5834 insertions(+), 1148 deletions(-) create mode 100644 crates/goose/canonical_mapping_report.json create mode 100644 crates/goose/examples/build_canonical_models.rs diff --git a/canonical_mapping_report.json b/canonical_mapping_report.json index 1693470ed92b..155edc944dbc 100644 --- a/canonical_mapping_report.json +++ b/canonical_mapping_report.json @@ -1,42 +1,6 @@ { - "timestamp": "2025-11-11T22:13:04.957991+00:00", + "timestamp": "2025-11-12T19:02:28.386534+00:00", "unmapped_models": [ - { - "provider": "anthropic", - "model": "claude-3-5-haiku-20241022" - }, - { - "provider": "anthropic", - "model": "claude-3-7-sonnet-20250219" - }, - { - "provider": "anthropic", - "model": "claude-3-haiku-20240307" - }, - { - "provider": "anthropic", - "model": "claude-3-opus-20240229" - }, - { - "provider": "anthropic", - "model": "claude-haiku-4-5-20251001" - }, - { - "provider": "anthropic", - "model": "claude-opus-4-1-20250805" - }, - { - "provider": "anthropic", - "model": "claude-opus-4-20250514" - }, - { - "provider": "anthropic", - "model": "claude-sonnet-4-20250514" - }, - { - "provider": "anthropic", - "model": "claude-sonnet-4-5-20250929" - }, { "provider": "openai", "model": "ada:ft-square-2023-01-20-06-09-37" @@ -209,10 +173,6 @@ "provider": "openai", "model": "babbage:ft-square-2023-02-28-14-48-38" }, - { - "provider": "openai", - "model": "chatgpt-4o-latest" - }, { "provider": "openai", "model": "codex-mini-latest" @@ -2145,126 +2105,6 @@ "provider": "openai", "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9rJTCzuI" }, - { - "provider": "openai", - "model": "gpt-3.5-turbo" - }, - { - "provider": "openai", - "model": "gpt-3.5-turbo-0125" - }, - { - "provider": "openai", - "model": "gpt-3.5-turbo-1106" - }, - { - "provider": "openai", - "model": "gpt-3.5-turbo-16k" - }, - { - "provider": "openai", - "model": "gpt-3.5-turbo-instruct" - }, - { - "provider": "openai", - "model": "gpt-3.5-turbo-instruct-0914" - }, - { - "provider": "openai", - "model": "gpt-4" - }, - { - "provider": "openai", - "model": "gpt-4-0125-preview" - }, - { - "provider": "openai", - "model": "gpt-4-0314" - }, - { - "provider": "openai", - "model": "gpt-4-0613" - }, - { - "provider": "openai", - "model": "gpt-4-1106-preview" - }, - { - "provider": "openai", - "model": "gpt-4-turbo" - }, - { - "provider": "openai", - "model": "gpt-4-turbo-2024-04-09" - }, - { - "provider": "openai", - "model": "gpt-4-turbo-preview" - }, - { - "provider": "openai", - "model": "gpt-4.1" - }, - { - "provider": "openai", - "model": "gpt-4.1-2025-04-14" - }, - { - "provider": "openai", - "model": "gpt-4.1-mini" - }, - { - "provider": "openai", - "model": "gpt-4.1-mini-2025-04-14" - }, - { - "provider": "openai", - "model": "gpt-4.1-nano" - }, - { - "provider": "openai", - "model": "gpt-4.1-nano-2025-04-14" - }, - { - "provider": "openai", - "model": "gpt-4o" - }, - { - "provider": "openai", - "model": "gpt-4o-2024-05-13" - }, - { - "provider": "openai", - "model": "gpt-4o-2024-08-06" - }, - { - "provider": "openai", - "model": "gpt-4o-2024-11-20" - }, - { - "provider": "openai", - "model": "gpt-4o-audio-preview" - }, - { - "provider": "openai", - "model": "gpt-4o-audio-preview-2024-10-01" - }, - { - "provider": "openai", - "model": "gpt-4o-audio-preview-2024-12-17" - }, - { - "provider": "openai", - "model": "gpt-4o-audio-preview-2025-06-03" - }, - { - "provider": "openai", - "model": "gpt-4o-mini" - }, - { - "provider": "openai", - "model": "gpt-4o-mini-2024-07-18" - }, { "provider": "openai", "model": "gpt-4o-mini-audio-preview" @@ -2281,14 +2121,6 @@ "provider": "openai", "model": "gpt-4o-mini-realtime-preview-2024-12-17" }, - { - "provider": "openai", - "model": "gpt-4o-mini-search-preview" - }, - { - "provider": "openai", - "model": "gpt-4o-mini-search-preview-2025-03-11" - }, { "provider": "openai", "model": "gpt-4o-mini-transcribe" @@ -2313,14 +2145,6 @@ "provider": "openai", "model": "gpt-4o-realtime-preview-2025-06-03" }, - { - "provider": "openai", - "model": "gpt-4o-search-preview" - }, - { - "provider": "openai", - "model": "gpt-4o-search-preview-2025-03-11" - }, { "provider": "openai", "model": "gpt-4o-transcribe" @@ -2329,46 +2153,10 @@ "provider": "openai", "model": "gpt-4o-transcribe-diarize" }, - { - "provider": "openai", - "model": "gpt-5" - }, - { - "provider": "openai", - "model": "gpt-5-2025-08-07" - }, { "provider": "openai", "model": "gpt-5-chat-latest" }, - { - "provider": "openai", - "model": "gpt-5-codex" - }, - { - "provider": "openai", - "model": "gpt-5-mini" - }, - { - "provider": "openai", - "model": "gpt-5-mini-2025-08-07" - }, - { - "provider": "openai", - "model": "gpt-5-nano" - }, - { - "provider": "openai", - "model": "gpt-5-nano-2025-08-07" - }, - { - "provider": "openai", - "model": "gpt-5-pro" - }, - { - "provider": "openai", - "model": "gpt-5-pro-2025-10-06" - }, { "provider": "openai", "model": "gpt-5-search-api" @@ -2417,14 +2205,6 @@ "provider": "openai", "model": "gpt-realtime-mini-2025-10-06" }, - { - "provider": "openai", - "model": "o1" - }, - { - "provider": "openai", - "model": "o1-2024-12-17" - }, { "provider": "openai", "model": "o1-mini" @@ -2433,62 +2213,6 @@ "provider": "openai", "model": "o1-mini-2024-09-12" }, - { - "provider": "openai", - "model": "o1-pro" - }, - { - "provider": "openai", - "model": "o1-pro-2025-03-19" - }, - { - "provider": "openai", - "model": "o3" - }, - { - "provider": "openai", - "model": "o3-2025-04-16" - }, - { - "provider": "openai", - "model": "o3-deep-research" - }, - { - "provider": "openai", - "model": "o3-deep-research-2025-06-26" - }, - { - "provider": "openai", - "model": "o3-mini" - }, - { - "provider": "openai", - "model": "o3-mini-2025-01-31" - }, - { - "provider": "openai", - "model": "o3-pro" - }, - { - "provider": "openai", - "model": "o3-pro-2025-06-10" - }, - { - "provider": "openai", - "model": "o4-mini" - }, - { - "provider": "openai", - "model": "o4-mini-2025-04-16" - }, - { - "provider": "openai", - "model": "o4-mini-deep-research" - }, - { - "provider": "openai", - "model": "o4-mini-deep-research-2025-06-26" - }, { "provider": "openai", "model": "omni-moderation-2024-09-26" @@ -2569,58 +2293,6 @@ "provider": "openrouter", "model": "amazon/nova-pro-v1" }, - { - "provider": "openrouter", - "model": "anthropic/claude-3-haiku" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3-opus" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku-20241022" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet-20240620" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet:thinking" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-haiku-4.5" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-opus-4" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-opus-4.1" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-sonnet-4" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-sonnet-4.5" - }, { "provider": "openrouter", "model": "arcee-ai/virtuoso-large" @@ -2693,54 +2365,10 @@ "provider": "openrouter", "model": "deepseek/deepseek-v3.2-exp" }, - { - "provider": "openrouter", - "model": "google/gemini-2.0-flash-001" - }, { "provider": "openrouter", "model": "google/gemini-2.0-flash-exp:free" }, - { - "provider": "openrouter", - "model": "google/gemini-2.0-flash-lite-001" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-flash" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-06-17" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-09-2025" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-preview-09-2025" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-pro" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview" - }, - { - "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview-05-06" - }, - { - "provider": "openrouter", - "model": "google/gemma-3-27b-it" - }, { "provider": "openrouter", "model": "inception/mercury" @@ -2837,10 +2465,6 @@ "provider": "openrouter", "model": "minimax/minimax-m2" }, - { - "provider": "openrouter", - "model": "minimax/minimax-m2:free" - }, { "provider": "openrouter", "model": "mistralai/codestral-2501" @@ -3021,170 +2645,10 @@ "provider": "openrouter", "model": "nvidia/nemotron-nano-9b-v2:free" }, - { - "provider": "openrouter", - "model": "openai/codex-mini" - }, - { - "provider": "openrouter", - "model": "openai/gpt-3.5-turbo" - }, - { - "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-0613" - }, - { - "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-16k" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4-0314" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4-1106-preview" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4-turbo" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4-turbo-preview" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4.1" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4.1-mini" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4.1-nano" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o-2024-05-13" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o-2024-08-06" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o-2024-11-20" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o-audio-preview" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o-mini" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o-mini-2024-07-18" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4o:extended" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5-codex" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5-image" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5-image-mini" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5-mini" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5-nano" - }, - { - "provider": "openrouter", - "model": "openai/gpt-5-pro" - }, - { - "provider": "openrouter", - "model": "openai/gpt-oss-120b" - }, - { - "provider": "openrouter", - "model": "openai/gpt-oss-120b:exacto" - }, - { - "provider": "openrouter", - "model": "openai/gpt-oss-20b" - }, { "provider": "openrouter", "model": "openai/gpt-oss-20b:free" }, - { - "provider": "openrouter", - "model": "openai/gpt-oss-safeguard-20b" - }, - { - "provider": "openrouter", - "model": "openai/o1" - }, - { - "provider": "openrouter", - "model": "openai/o3" - }, - { - "provider": "openrouter", - "model": "openai/o3-deep-research" - }, - { - "provider": "openrouter", - "model": "openai/o3-mini" - }, - { - "provider": "openrouter", - "model": "openai/o3-mini-high" - }, - { - "provider": "openrouter", - "model": "openai/o3-pro" - }, - { - "provider": "openrouter", - "model": "openai/o4-mini" - }, - { - "provider": "openrouter", - "model": "openai/o4-mini-deep-research" - }, - { - "provider": "openrouter", - "model": "openai/o4-mini-high" - }, { "provider": "openrouter", "model": "openrouter/polaris-alpha" @@ -3993,38 +3457,10 @@ "provider": "google", "model": "embedding-gecko-001" }, - { - "provider": "google", - "model": "gemini-2.0-flash" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-001" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-exp" - }, { "provider": "google", "model": "gemini-2.0-flash-exp-image-generation" }, - { - "provider": "google", - "model": "gemini-2.0-flash-lite" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-lite-001" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-lite-preview" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-lite-preview-02-05" - }, { "provider": "google", "model": "gemini-2.0-flash-preview-image-generation" @@ -4053,58 +3489,10 @@ "provider": "google", "model": "gemini-2.5-computer-use-preview-10-2025" }, - { - "provider": "google", - "model": "gemini-2.5-flash" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-image" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-image-preview" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-lite" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-lite-preview-06-17" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-lite-preview-09-2025" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-preview-05-20" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-preview-09-2025" - }, { "provider": "google", "model": "gemini-2.5-flash-preview-tts" }, - { - "provider": "google", - "model": "gemini-2.5-pro" - }, - { - "provider": "google", - "model": "gemini-2.5-pro-preview-03-25" - }, - { - "provider": "google", - "model": "gemini-2.5-pro-preview-05-06" - }, - { - "provider": "google", - "model": "gemini-2.5-pro-preview-06-05" - }, { "provider": "google", "model": "gemini-2.5-pro-preview-tts" @@ -4141,30 +3529,14 @@ "provider": "google", "model": "gemini-robotics-er-1.5-preview" }, - { - "provider": "google", - "model": "gemma-3-12b-it" - }, { "provider": "google", "model": "gemma-3-1b-it" }, - { - "provider": "google", - "model": "gemma-3-27b-it" - }, - { - "provider": "google", - "model": "gemma-3-4b-it" - }, { "provider": "google", "model": "gemma-3n-e2b-it" }, - { - "provider": "google", - "model": "gemma-3n-e4b-it" - }, { "provider": "google", "model": "imagen-4.0-generate-preview-06-06" @@ -4183,20 +3555,859 @@ } ], "all_mappings": { - "databricks": [], - "openai": [], - "openrouter": [], + "anthropic": [ + { + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "claude-3-haiku-20240307", + "canonical_model": "anthropic/claude-3-haiku", + "verified": true + }, + { + "provider_model": "claude-3-opus-20240229", + "canonical_model": "anthropic/claude-3-opus", + "verified": true + }, + { + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku", + "verified": true + }, + { + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + }, + { + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + } + ], "tetrate": [], - "google": [], - "anthropic": [] + "openrouter": [ + { + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-sonnet-20240620", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "verified": true + }, + { + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + }, + { + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", + "verified": true + }, + { + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", + "verified": true + }, + { + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", + "verified": true + }, + { + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", + "verified": true + }, + { + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", + "verified": true + }, + { + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b:exacto", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", + "verified": true + }, + { + "provider_model": "openai/o1", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "openai/o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", + "verified": true + }, + { + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "openai/o4-mini", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "openai/o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + }, + { + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", + "verified": true + } + ], + "openai": [ + { + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", + "verified": true + }, + { + "provider_model": "gpt-4", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview-2024-10-01", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", + "verified": true + }, + { + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", + "verified": true + }, + { + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", + "verified": true + }, + { + "provider_model": "gpt-5", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", + "verified": true + }, + { + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "o1", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", + "verified": true + }, + { + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", + "verified": true + }, + { + "provider_model": "o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "o3-deep-research", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "o3-pro", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + } + ], + "google": [ + { + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-exp", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-preview", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-preview-02-05", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-image", + "canonical_model": "google/gemini-2.5-flash-image", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-image-preview", + "canonical_model": "google/gemini-2.5-flash-image", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-preview-05-20", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro-preview-03-25", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro-preview-06-05", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemma-3-12b-it", + "canonical_model": "google/gemma-3-12b-it", + "verified": true + }, + { + "provider_model": "gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", + "verified": true + }, + { + "provider_model": "gemma-3-4b-it", + "canonical_model": "google/gemma-3-4b-it", + "verified": true + }, + { + "provider_model": "gemma-3n-e4b-it", + "canonical_model": "google/gemma-3n-e4b-it", + "verified": true + } + ], + "databricks": [] }, "model_counts": { - "databricks": 143, "openai": 625, + "openrouter": 217, "google": 50, + "anthropic": 9, "tetrate": 0, - "openrouter": 218, - "anthropic": 9 + "databricks": 143 }, - "canonical_models_used": [] + "canonical_models_used": [ + "openai/gpt-oss-20b", + "anthropic/claude-3.5-sonnet", + "anthropic/claude-3-haiku", + "openai/gpt-4o-audio", + "google/gemma-3-4b-it", + "openai/gpt-4.1-nano", + "google/gemini-2.5-flash-image", + "google/gemini-2.5-flash", + "anthropic/claude-haiku", + "openai/gpt-5-image", + "openai/gpt-3.5-turbo-16k", + "anthropic/claude-sonnet", + "openai/o3-deep-research", + "anthropic/claude-3-opus", + "openai/chatgpt-4o-latest", + "openai/gpt-4-turbo", + "anthropic/claude-3.5-haiku", + "openai/gpt-4o-search", + "openai/gpt-3.5-turbo-instruct", + "openai/gpt", + "openai/o4-mini", + "openai/gpt-5-mini", + "openai/gpt-4o:extended", + "openai/gpt-oss-120b:exacto", + "openai/o4-mini-high", + "openai/gpt-oss-safeguard-20b", + "openai/gpt-4o-mini", + "openai/gpt-4o-mini-search", + "google/gemini-2.0-flash", + "openai/o3-mini-high", + "google/gemma-3-12b-it", + "openai/gpt-5-nano", + "openai/gpt-3.5-turbo", + "google/gemma-3n-e4b-it", + "openai/o3-mini", + "google/gemini-2.5-flash-lite", + "openai/gpt-5-codex", + "openai/o3", + "anthropic/claude-opus", + "openai/o3-pro", + "openai/o1-pro", + "google/gemini-2.0-flash-lite", + "openai/gpt-4o", + "google/gemma-3-27b-it", + "openai/gpt-oss-120b", + "openai/o4-mini-deep-research", + "google/gemini-2.5-pro", + "openai/gpt-4.1-mini", + "openai/gpt-5-image-mini", + "openai/codex-mini", + "anthropic/claude-3.7-sonnet", + "openai/gpt-5-pro", + "anthropic/claude-3.7-sonnet:thinking", + "openai/o1" + ] } \ No newline at end of file diff --git a/crates/goose/canonical_mapping_report.json b/crates/goose/canonical_mapping_report.json new file mode 100644 index 000000000000..79c03c3b9e8c --- /dev/null +++ b/crates/goose/canonical_mapping_report.json @@ -0,0 +1,4413 @@ +{ + "timestamp": "2025-11-12T18:31:21.379526+00:00", + "unmapped_models": [ + { + "provider": "openai", + "model": "ada:ft-square-2023-01-20-06-09-37" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-03-22-57-10" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-03-23-17-02" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-03-23-39-19" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-00-06-28" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-00-26-44" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-04-45" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-25-59" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-35-31" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-49-59" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-52-25" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-53-11" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-54-49" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-56-59" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-01-58-41" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-00-26" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-02-17" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-03-39" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-05-16" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-06-44" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-04-02-08-18" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-22-05-09-46" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-22-05-27-21" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-17-40-56" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-19-20-20" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-19-35-21" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-02-27-21-26-06" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-01-19-58-17" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-02-11-40-22" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-02-16-01-19" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-03-06-11-43-24" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-04-05-18-59-44" + }, + { + "provider": "openai", + "model": "ada:ft-square-2023-06-14-21-43-36" + }, + { + "provider": "openai", + "model": "ada:ft-square:ada-fine-tuned-pb-books-2023-06-10-01-41-30" + }, + { + "provider": "openai", + "model": "ada:ft-square:get-classify-test-1-2023-03-01-22-20-54" + }, + { + "provider": "openai", + "model": "ada:ft-square:get-classify-test-2-2023-03-01-23-00-30" + }, + { + "provider": "openai", + "model": "ada:ft-square:latha-2023-06-07-06-56-00" + }, + { + "provider": "openai", + "model": "ada:ft-square:mcc-from-items-2023-03-09-23-20-33" + }, + { + "provider": "openai", + "model": "ada:ft-square:mcc-from-items-2023-03-10-02-02-01" + }, + { + "provider": "openai", + "model": "ada:ft-square:sq-interview-rubrics-2023-03-01-23-25-00" + }, + { + "provider": "openai", + "model": "ada:ft-square:test-2023-06-07-07-05-04" + }, + { + "provider": "openai", + "model": "babbage-002" + }, + { + "provider": "openai", + "model": "babbage:ft-square-2023-02-28-14-48-38" + }, + { + "provider": "openai", + "model": "codex-mini-latest" + }, + { + "provider": "openai", + "model": "computer-use-preview" + }, + { + "provider": "openai", + "model": "computer-use-preview-2025-03-11" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-01-04-00-17-01" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-20-54-03" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-22-00-22" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-12-33" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-38-15" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-50-25" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-03-23-56-35" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-04-00-10-16" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-04-00-30-47" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-04-01-10-58" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-14-03-10-35" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-14-05-13-05" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-12-25-24" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-13-42-34" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-16-41-35" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-24-18-12-55" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-27-22-00-27" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-28-12-28-40" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-28-16-08-29" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-02-28-23-14-48" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-02-01-48-30" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-02-13-12-20" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-02-16-17-24" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-06-14-16-22" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-03-09-04-37-07" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-04-05-19-33-31" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-04-05-23-44-20" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-05-01-19-30-51" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-05-02-16-19-15" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-08-20-11-11" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-12-14-33-09" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-22-55-22" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-23-23-37" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-23-25-31" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-14-23-37-23" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-15-14-24-56" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-15-15-16-31" + }, + { + "provider": "openai", + "model": "curie:ft-square-2023-06-15-15-21-41" + }, + { + "provider": "openai", + "model": "curie:ft-square:andrewbyers-iso-dates-2-2023-06-09-19-23-52" + }, + { + "provider": "openai", + "model": "curie:ft-square:andrewbyers-iso-dates-2023-06-09-16-22-54" + }, + { + "provider": "openai", + "model": "curie:ft-square:bartosz-2023-06-15-16-50-00" + }, + { + "provider": "openai", + "model": "curie:ft-square:bartosz-2023-06-15-17-40-30" + }, + { + "provider": "openai", + "model": "dall-e-2" + }, + { + "provider": "openai", + "model": "dall-e-3" + }, + { + "provider": "openai", + "model": "davinci-002" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-01-31-46" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-01-35-06" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-01-38-32" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-19-52-40" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-19-56-06" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-19-58-46" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-02-03" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-05-47" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-11-53" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-03-20-15-38" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-24-18-22-49" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-19-06-04" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-20-03-10" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-20-43-03" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-21-15-51" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-21-56-57" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-27-23-00-36" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-28-15-35-39" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-02-28-22-02-29" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-01-34-16" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-04-50-27" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-21-52-35" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-01-23-53-42" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-06-29-26" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-07-43-23" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-08-33-27" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-09-27-04" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-19-42-43" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-34-00" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-40-51" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-46-02" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-02-23-54-35" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-03-01-26-16" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-03-06-07-40-58" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-05-02-17-37-42" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-06-03-01-27-58" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-06-03-02-41-38" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-06-04-20-17-25" + }, + { + "provider": "openai", + "model": "davinci:ft-square-2023-07-31-06-04-37" + }, + { + "provider": "openai", + "model": "davinci:ft-square:conversational-ordering-2023-03-01-03-35-26" + }, + { + "provider": "openai", + "model": "davinci:ft-square:conversational-ordering-2023-03-01-19-34-59" + }, + { + "provider": "openai", + "model": "davinci:ft-square:martech-fox-2023-07-03-12-08-51" + }, + { + "provider": "openai", + "model": "davinci:ft-square:ppg-1-2023-03-03-22-44-53" + }, + { + "provider": "openai", + "model": "davinci:ft-square:ppg-2-2023-03-04-00-09-06" + }, + { + "provider": "openai", + "model": "davinci:ft-square:product-descriptions-1-2023-02-18-02-01-38" + }, + { + "provider": "openai", + "model": "davinci:ft-square:product-descriptions-2023-02-18-01-37-53" + }, + { + "provider": "openai", + "model": "davinci:ft-square:sq-interview-rubrics-2023-03-01-06-12-57" + }, + { + "provider": "openai", + "model": "davinci:ft-square:test-2023-06-02-21-46-09" + }, + { + "provider": "openai", + "model": "davinci:ft-square:test-2023-06-07-07-18-50" + }, + { + "provider": "openai", + "model": "davinci:ft-square:testmodel-2023-06-09-06-33-46" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::979OeECc" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::979X87hI" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::979tUAKY" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ6utW" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ962b:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ9TI9:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9BaZ9yXw:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9f7y6Fq3:ckpt-step-132" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9f7y6d94:ckpt-step-66" + }, + { + "provider": "openai", + "model": "ft:babbage-002:square::9f7y6tDo" + }, + { + "provider": "openai", + "model": "ft:davinci-002:square::8IHIFNF8" + }, + { + "provider": "openai", + "model": "ft:davinci-002:square::979av0Ca" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdO7p4k" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdO9dyB:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdOAZhy:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdOAzyd:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdjnxSh" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9Bdjq2HN:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdjqEL2:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9BdjqWL2:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYL14U" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYOIYz:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYOe1X:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9CBYPJjH:ckpt-step-1593" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9dWw13R5:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9dWw21NB:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9dWw2Jmx" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9w2wKEHK:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9w2wKRUk" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9w2wKfxt:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wDsxF0M:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wDsxJU5" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wDsxcuJ:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wLTi98n:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wLTiHPk:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::9wLTiuf3" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A1oa308p:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A1oa4UVH:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A1oa4fY2" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A21LQ3B7:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A21LQjft:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A21LRYaU" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F6X0tu:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F6XYh7:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F6YGI4" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F7A46A:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F7AHaO:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::A3F7AoD8" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIOxNBa" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIOxtLv:ckpt-step-499" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIOxz40:ckpt-step-998" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDIbgGdy" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDM8mQGM" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BDQoyuDs" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BPmNgoWc:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BPmNj3MY:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square::BPmNkBwY" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square:regex-generator:BV3pHd69" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square:regex-generator:BV3pHfFP:ckpt-step-608" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0125:square:regex-generator:BV3pHz34:ckpt-step-304" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613:square::7xkXhz2F" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-0613:square:recipe-ner:8m9bUTJB" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square::8INlSFiD" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square::8IittuHW" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square::8VQq2h9i" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:presale-prod-update:A1VCz1Ng:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:presale-prod-update:A1VCz1dF" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:presale-prod-update:A1VCzSam:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9esUGGea:ckpt-step-1522" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9esUGnko" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f8il0PV" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f8iljLm:ckpt-step-1611" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f9O9vmz:ckpt-step-751" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f9OA72b:ckpt-step-1502" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9f9OAsBX" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fAO711i:ckpt-step-753" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fAO71NV" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fAO7nhv:ckpt-step-1506" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fB61NQG" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fB61ZZn:ckpt-step-1520" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fB61cPW:ckpt-step-760" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fCbI5U9" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-fmac:9fCbICqK:ckpt-step-761" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-pm-35:9djnKK85:ckpt-step-1533" + }, + { + "provider": "openai", + "model": "ft:gpt-3.5-turbo-1106:square:tarkin-pm-35:9djnL0G0" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpIi1ah" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpIlVui:ckpt-step-418" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpIle5X:ckpt-step-836" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9BpImGbJ:ckpt-step-1254" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERwrnZ" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERyuVp:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERz6l4:ckpt-step-1593" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9CERzjIk:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9dWi6cve:ckpt-step-531" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9dWi7AH4" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9dWi7d0k:ckpt-step-1062" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wGGcJwE:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wGGceZ1:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wGGcsCI" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wLlEcBS:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wLlFM71" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wLlFtmK:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wP6wXmY:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wP6xJ7K" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9wP6xUW9:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9yR6Pmck:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9yR6Q01x" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9yR6QRCI:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9ySoC7vZ" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9ySoC9RL:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::9ySoCHH9:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::A1os36ZY:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::A1os3SzM:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square::A1os4RF0" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:g11n-helper:ALxGZf5Y:ckpt-step-54" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:g11n-helper:ALxGaifK:ckpt-step-72" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:g11n-helper:ALxGasbI" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:presale-prod-update:A1VkM3KW:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:presale-prod-update:A1VkMPxN:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:presale-prod-update:A1VkMugi" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9a8eE6A4:ckpt-step-763" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9a8eEWdX" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9a8eEkGS:ckpt-step-1526" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9aDzHMdR:ckpt-step-3054" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9aDzHdca:ckpt-step-1527" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9aDzI3c1" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9ckg06KE:ckpt-step-70636" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9ckg06yx:ckpt-step-35318" + }, + { + "provider": "openai", + "model": "ft:gpt-4-0613:square:tarkin:9ckg1W41" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:hotel-sys-design:Bn8TRXx7:ckpt-step-77" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:hotel-sys-design:Bn8TSnvc" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:hotel-sys-design:Bn8TSuqu:ckpt-step-88" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:picasso-tbl:Be4ohJ5c:ckpt-step-555" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:picasso-tbl:Be4okWcV" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-2025-04-14:square:picasso-tbl:Be4okcLm:ckpt-step-1110" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BmTIcrto:ckpt-step-666" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BmTIfHgD" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BmTIfv3N:ckpt-step-1332" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BwjlIHbe" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-mini-2025-04-14:square::BwjlIMor:ckpt-step-1018" + }, + { + "provider": "openai", + "model": "ft:gpt-4.1-nano-2025-04-14:square:qliao-plathelp-v1:CRNAywx8" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eTWHHtG" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eTWHI2d:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eTWHWR7:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eoDA1QR:ckpt-step-32" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eoDARki" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eoDAkYo:ckpt-step-64" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eqA79i0:ckpt-step-59" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eqA8TBe:ckpt-step-118" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9eqA8pCn" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9hgDsAHH:ckpt-step-66" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9hgDsHOi:ckpt-step-132" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9hgDtDpP" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9yPneKZF:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9yPnf26m:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square::9yPnfZ3w" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi-golang:9smel7hl:ckpt-step-434" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi-golang:9smelXOJ" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi-golang:9smeltpg:ckpt-step-217" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi:9sjuwq38:ckpt-step-505" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi:9sjux561" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:pfi:9sjuxLbk:ckpt-step-1010" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e48jPvC:ckpt-step-1510" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e48kfSc" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e4FyHOk:ckpt-step-528" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e4FzikM:ckpt-step-1056" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e4Fzzq8" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e6FlhBM" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e6Flnjr:ckpt-step-1526" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e8EgHNk" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9e8Egd2H:ckpt-step-1526" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9ePrc2Qr" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fma:9ePrcUgW:ckpt-step-1524" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eSm4CmX:ckpt-step-1513" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eSm4Nvi" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eVTYdgL:ckpt-step-1513" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9eVTZNWy" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9ellv805:ckpt-step-812" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmac:9ellvsEx" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gCyNcoZ:ckpt-step-753" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gCyOII4" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gCyOTcP:ckpt-step-1506" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gEX8El2:ckpt-step-1552" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmar:9gEX9ft2" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmas:9eq84If3" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-fmas:9eq84hU9:ckpt-step-1522" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-full-meal:9e2Qax41:ckpt-step-528" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-full-meal:9e2Qb1sn" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-full-meal:9e2QbHP1:ckpt-step-1056" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-piece-meal:9dgu0Q1g:ckpt-step-1533" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-piece-meal:9dgu1KXd" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-pm-4o:9dkScYcs" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin-pm-4o:9dkScysk:ckpt-step-1533" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:tarkin:9dfz3A8x" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:test-ft:9e4bJAtq:ckpt-step-27" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:test-ft:9e4bKBv0:ckpt-step-54" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:test-ft:9e4bKlvw" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:thunderbird:9bd8MQGp:ckpt-step-88" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:thunderbird:9bd8NB8K" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-05-13:square:thunderbird:9bd8NX77:ckpt-step-132" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:12-21-24:Ah0F4uLP:ckpt-step-185" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:12-21-24:Ah0FNFHQ:ckpt-step-370" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:12-21-24:Ah0FNFS1" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yOpXJbd:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yOpXVGv" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yOpXmyQ:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yWRL773:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yWRLeLB:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::9yWRM8Zn" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A1pIt632" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A1pItfDC:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A1pItofx:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A218TwmT:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A218UZjU:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A218UzZf" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A3FCYhcv:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A3FCYpNh:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A3FCZe3h" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A6lkYKvg:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A6lkYTPi:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::A6lkZ4nA" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADYnVcKn:ckpt-step-153" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADYnWDpr:ckpt-step-306" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADYnWF7g" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADcZL13Y:ckpt-step-149" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADcZLJjk:ckpt-step-298" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADcZMaZB" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADdWL6S7:ckpt-step-149" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADdWLGiA:ckpt-step-298" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADdWLpNL" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADv4G9ED:ckpt-step-310" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADv4GfJI" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ADv4GslV:ckpt-step-155" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AFvffbd6:ckpt-step-60" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AFvfgOvb" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AFvfgYxS:ckpt-step-75" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrPDXh4:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrPE1Jn:ckpt-step-84" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrPFDOA" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrRI7Py" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrRIbun:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AIrRIz3n:ckpt-step-84" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AJPMFYjn:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AJPMSMwR:ckpt-step-84" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AJPMTSQg" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZQz9s:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZbB0b:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZlhsT:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZrh8z:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZrhRU:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZrhWY:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZs4af" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZsBZ7" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALDZsiMB" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALelRGKV:ckpt-step-75" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALelRQjh:ckpt-step-50" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALelSl5l" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALfXG00U:ckpt-step-26" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALfXHUyM" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ALfXHdnT:ckpt-step-52" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AM3Kk6bJ:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AM3Km10T:ckpt-step-114" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AM3KmncS" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMHzrhbX:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI02GZM:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0CTR7:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0MEJb:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0MZIn:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0MbSE:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NAKb:ckpt-step-116" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NGtf" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NZqn:ckpt-step-58" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NfHv" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0Nkxa" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMI0NxXJ" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgDbCpJ:ckpt-step-61" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgDmR8i:ckpt-step-61" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgDwgwF:ckpt-step-61" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE01SL" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0Zqi" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0dya:ckpt-step-122" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0l6B" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0lmy:ckpt-step-122" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::AMgE0x9A:ckpt-step-122" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhCPM4:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhNQrL:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhXvS0:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBheCpk:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBheHqF:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhelmB:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhfHg0" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhfP3K" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANBhfWTj" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANR81FlE:ckpt-step-71" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANR8340Y" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANR83UMp:ckpt-step-142" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxC4R0:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxMc5r:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxWkuX:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxb3ul" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbR1m:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbZ7u:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbueA:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxbx9d" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANWxcbir" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTNQfB:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTXwXd:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTeBFW:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTeWRz" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTedmK:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANnTenB6" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2D506:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2OJoT:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2Ykg1:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2f35h:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2fWSn:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2fkPg:ckpt-step-152" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2g1fc" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2g4RI" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::ANq2gT5D" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::BDcdETt3" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::BDgw3aRR:ckpt-step-770" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::BDgwAYDm" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLdLFo:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLdpp9:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLef0R" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025-733pm:Aln8wDEd:ckpt-step-57" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025-733pm:Aln99EJs:ckpt-step-76" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025-733pm:Aln99po1" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025:AljIGSIY:ckpt-step-114" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025:AljIUDTx:ckpt-step-228" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-1-3-2025:AljIUw1E" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2gb0ZW:ckpt-step-99" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2glfI3:ckpt-step-99" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2goBN9:ckpt-step-198" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2goRoo:ckpt-step-198" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2gpUkI" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uip-4o-beta1:AU2gpkQO" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uipath:AStGEJCN:ckpt-step-140" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uipath:AStGEPHu" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square:uipath:AStGErTc:ckpt-step-70" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yQURl9e:ckpt-step-702" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yQUS8UO" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yQUSboN:ckpt-step-1404" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yS9rcIf:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yS9sWBR:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yS9sZgG" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yYfNBYp" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yYfNYZR:ckpt-step-741" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::9yYfNa27:ckpt-step-1482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A1o0y9c3:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A1o0yYU0" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A1o0yoGv:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A20kHEh1:ckpt-step-1536" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A20kHL5C" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A20kHQH6:ckpt-step-768" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A3Ew9LPO:ckpt-step-1812" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A3Ew9Pfa:ckpt-step-906" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::A3EwAWC6" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::C9PyMpaX:ckpt-step-926" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square::C9PyNU6h" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLby6lj:ckpt-step-80" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLc6ocQ:ckpt-step-90" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLc6zzK" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-tokens:BUsD3Vq9" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:presale-prod-update:A1V43nWF:ckpt-step-772" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:presale-prod-update:A1V44IqT" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:presale-prod-update:A1V44Vjp:ckpt-step-1544" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ql-plathelp-241:CRPREgy9:ckpt-step-241" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ql-plathelp-241:CRPRFEus:ckpt-step-482" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ql-plathelp-241:CRPRGYXt" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-250:Ao0TXJT1:ckpt-step-250" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-250:Ao0TYWiG" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-250:Ao0TYf9o:ckpt-step-500" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-50:AnziWXoE:ckpt-step-50" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-50:AnziY3TM" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:support-50:AnziYbeg:ckpt-step-100" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9ozEIZnh:ckpt-step-1751" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9ozEMo2r" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qecJUHK:ckpt-step-2223" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qecJuVm" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qvs9txe:ckpt-step-2241" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9qvsAbS8" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9rJTBC8M:ckpt-step-2241" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:tarkin:9rJTCzuI" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-audio-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-audio-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-realtime-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-transcribe" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-tts" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-10-01" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview-2024-12-17" + }, + { + "provider": "openai", + "model": "gpt-4o-realtime-preview-2025-06-03" + }, + { + "provider": "openai", + "model": "gpt-4o-transcribe" + }, + { + "provider": "openai", + "model": "gpt-4o-transcribe-diarize" + }, + { + "provider": "openai", + "model": "gpt-5-chat-latest" + }, + { + "provider": "openai", + "model": "gpt-5-search-api" + }, + { + "provider": "openai", + "model": "gpt-5-search-api-2025-10-14" + }, + { + "provider": "openai", + "model": "gpt-audio" + }, + { + "provider": "openai", + "model": "gpt-audio-2025-08-28" + }, + { + "provider": "openai", + "model": "gpt-audio-mini" + }, + { + "provider": "openai", + "model": "gpt-audio-mini-2025-10-06" + }, + { + "provider": "openai", + "model": "gpt-image-1" + }, + { + "provider": "openai", + "model": "gpt-image-1-mini" + }, + { + "provider": "openai", + "model": "gpt-realtime" + }, + { + "provider": "openai", + "model": "gpt-realtime-2025-08-28" + }, + { + "provider": "openai", + "model": "gpt-realtime-mini" + }, + { + "provider": "openai", + "model": "gpt-realtime-mini-2025-10-06" + }, + { + "provider": "openai", + "model": "o1-mini" + }, + { + "provider": "openai", + "model": "o1-mini-2024-09-12" + }, + { + "provider": "openai", + "model": "omni-moderation-2024-09-26" + }, + { + "provider": "openai", + "model": "omni-moderation-latest" + }, + { + "provider": "openai", + "model": "sora-2" + }, + { + "provider": "openai", + "model": "sora-2-pro" + }, + { + "provider": "openai", + "model": "text-embedding-3-large" + }, + { + "provider": "openai", + "model": "text-embedding-3-small" + }, + { + "provider": "openai", + "model": "text-embedding-ada-002" + }, + { + "provider": "openai", + "model": "tts-1" + }, + { + "provider": "openai", + "model": "tts-1-1106" + }, + { + "provider": "openai", + "model": "tts-1-hd" + }, + { + "provider": "openai", + "model": "tts-1-hd-1106" + }, + { + "provider": "openai", + "model": "whisper-1" + }, + { + "provider": "openrouter", + "model": "ai21/jamba-large-1.7" + }, + { + "provider": "openrouter", + "model": "ai21/jamba-mini-1.7" + }, + { + "provider": "openrouter", + "model": "alibaba/tongyi-deepresearch-30b-a3b" + }, + { + "provider": "openrouter", + "model": "alibaba/tongyi-deepresearch-30b-a3b:free" + }, + { + "provider": "openrouter", + "model": "amazon/nova-lite-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-micro-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-premier-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-pro-v1" + }, + { + "provider": "openrouter", + "model": "arcee-ai/virtuoso-large" + }, + { + "provider": "openrouter", + "model": "baidu/ernie-4.5-21b-a3b" + }, + { + "provider": "openrouter", + "model": "baidu/ernie-4.5-vl-28b-a3b" + }, + { + "provider": "openrouter", + "model": "cohere/command-r-08-2024" + }, + { + "provider": "openrouter", + "model": "cohere/command-r-plus-08-2024" + }, + { + "provider": "openrouter", + "model": "deepcogito/cogito-v2-preview-llama-109b-moe" + }, + { + "provider": "openrouter", + "model": "deepcogito/cogito-v2-preview-llama-405b" + }, + { + "provider": "openrouter", + "model": "deepcogito/cogito-v2-preview-llama-70b" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324:free" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3.1" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1-0528" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1-distill-llama-70b" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus:exacto" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2-exp" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-exp:free" + }, + { + "provider": "openrouter", + "model": "inception/mercury" + }, + { + "provider": "openrouter", + "model": "inception/mercury-coder" + }, + { + "provider": "openrouter", + "model": "inclusionai/ling-1t" + }, + { + "provider": "openrouter", + "model": "inclusionai/ring-1t" + }, + { + "provider": "openrouter", + "model": "kwaipilot/kat-coder-pro:free" + }, + { + "provider": "openrouter", + "model": "meituan/longcat-flash-chat:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3-8b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-405b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-8b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.3-8b-instruct:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick:free" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-scout" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-scout:free" + }, + { + "provider": "openrouter", + "model": "microsoft/phi-3-medium-128k-instruct" + }, + { + "provider": "openrouter", + "model": "microsoft/phi-3-mini-128k-instruct" + }, + { + "provider": "openrouter", + "model": "microsoft/phi-3.5-mini-128k-instruct" + }, + { + "provider": "openrouter", + "model": "minimax/minimax-m1" + }, + { + "provider": "openrouter", + "model": "minimax/minimax-m2" + }, + { + "provider": "openrouter", + "model": "mistralai/codestral-2501" + }, + { + "provider": "openrouter", + "model": "mistralai/codestral-2508" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-medium" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-small" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-small-2505" + }, + { + "provider": "openrouter", + "model": "mistralai/magistral-medium-2506" + }, + { + "provider": "openrouter", + "model": "mistralai/magistral-medium-2506:thinking" + }, + { + "provider": "openrouter", + "model": "mistralai/magistral-small-2506" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-3b" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-8b" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct-v0.1" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct:free" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2407" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2411" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-medium-3" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-medium-3.1" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-nemo" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-saba" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-24b-instruct-2501" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct:free" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct:free" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-tiny" + }, + { + "provider": "openrouter", + "model": "mistralai/mixtral-8x22b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mixtral-8x7b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/pixtral-12b" + }, + { + "provider": "openrouter", + "model": "mistralai/pixtral-large-2411" + }, + { + "provider": "openrouter", + "model": "mistralai/voxtral-small-24b-2507" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2-0905:exacto" + }, + { + "provider": "openrouter", + "model": "moonshotai/kimi-k2-thinking" + }, + { + "provider": "openrouter", + "model": "nousresearch/deephermes-3-mistral-24b-preview" + }, + { + "provider": "openrouter", + "model": "nousresearch/hermes-3-llama-3.1-70b" + }, + { + "provider": "openrouter", + "model": "nousresearch/hermes-4-405b" + }, + { + "provider": "openrouter", + "model": "nousresearch/hermes-4-70b" + }, + { + "provider": "openrouter", + "model": "nvidia/llama-3.1-nemotron-70b-instruct" + }, + { + "provider": "openrouter", + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5" + }, + { + "provider": "openrouter", + "model": "nvidia/nemotron-nano-12b-v2-vl:free" + }, + { + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2" + }, + { + "provider": "openrouter", + "model": "nvidia/nemotron-nano-9b-v2:free" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-20b:free" + }, + { + "provider": "openrouter", + "model": "openrouter/polaris-alpha" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-2.5-72b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-2.5-7b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28:thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-turbo" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-vl-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-14b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-thinking-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b:free" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-instruct-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-thinking-2507" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-32b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-4b:free" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-8b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-flash" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-plus" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder:exacto" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder:free" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwq-32b" + }, + { + "provider": "openrouter", + "model": "sao10k/l3-euryale-70b" + }, + { + "provider": "openrouter", + "model": "sao10k/l3.1-euryale-70b" + }, + { + "provider": "openrouter", + "model": "stepfun-ai/step3" + }, + { + "provider": "openrouter", + "model": "thedrummer/rocinante-12b" + }, + { + "provider": "openrouter", + "model": "thedrummer/unslopnemo-12b" + }, + { + "provider": "openrouter", + "model": "tngtech/deepseek-r1t2-chimera" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3-beta" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3-mini" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3-mini-beta" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-4" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-4-fast" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-code-fast-1" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4-32b" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5-air" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5-air:free" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.5v" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.6" + }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.6:exacto" + }, + { + "provider": "databricks", + "model": "baxen-migration-demo" + }, + { + "provider": "databricks", + "model": "big-hack" + }, + { + "provider": "databricks", + "model": "case_history_hackweek" + }, + { + "provider": "databricks", + "model": "case-history-checker" + }, + { + "provider": "databricks", + "model": "claude-3-5-haiku" + }, + { + "provider": "databricks", + "model": "claude-3-5-sonnet" + }, + { + "provider": "databricks", + "model": "claude-3-5-sonnet-2" + }, + { + "provider": "databricks", + "model": "claude-3-7-sonnet" + }, + { + "provider": "databricks", + "model": "claude-4" + }, + { + "provider": "databricks", + "model": "claude-4-opus" + }, + { + "provider": "databricks", + "model": "claude-haiku" + }, + { + "provider": "databricks", + "model": "claude-opus" + }, + { + "provider": "databricks", + "model": "claude-sonnet" + }, + { + "provider": "databricks", + "model": "cmg-test-iris" + }, + { + "provider": "databricks", + "model": "code-review-gpt-5" + }, + { + "provider": "databricks", + "model": "code-review-gpt-5-mini" + }, + { + "provider": "databricks", + "model": "codellama-7b-hf-ift" + }, + { + "provider": "databricks", + "model": "column-mapping-model-endpoint" + }, + { + "provider": "databricks", + "model": "column-mapping-model-endpoint-v2" + }, + { + "provider": "databricks", + "model": "dummy-model-ml-gp-endpoint" + }, + { + "provider": "databricks", + "model": "e5-large-v2" + }, + { + "provider": "databricks", + "model": "gemini-1-5-flash" + }, + { + "provider": "databricks", + "model": "gemini-1-5-pro" + }, + { + "provider": "databricks", + "model": "gemini-2-0-flash" + }, + { + "provider": "databricks", + "model": "gemini-2-5-flash" + }, + { + "provider": "databricks", + "model": "gemini-2-5-flash-latest" + }, + { + "provider": "databricks", + "model": "gemini-2-5-pro" + }, + { + "provider": "databricks", + "model": "gemini-2-5-pro-exp" + }, + { + "provider": "databricks", + "model": "gemini-flash-lite-latest" + }, + { + "provider": "databricks", + "model": "gemini-pro" + }, + { + "provider": "databricks", + "model": "goose" + }, + { + "provider": "databricks", + "model": "goose-claude-3-5-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-3-7-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-4-5-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-4-opus" + }, + { + "provider": "databricks", + "model": "goose-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "goose-claude-4-sonnet-bedrock" + }, + { + "provider": "databricks", + "model": "goose-gemini-2-5-pro" + }, + { + "provider": "databricks", + "model": "goose-gpt-4-1" + }, + { + "provider": "databricks", + "model": "goose-gpt-4o" + }, + { + "provider": "databricks", + "model": "goose-gpt-5" + }, + { + "provider": "databricks", + "model": "goose-gpt-oss" + }, + { + "provider": "databricks", + "model": "goose-o1" + }, + { + "provider": "databricks", + "model": "goose-o3" + }, + { + "provider": "databricks", + "model": "goose-o4-mini" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo-0125" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo-16k" + }, + { + "provider": "databricks", + "model": "gpt-3-5-turbo-instruct" + }, + { + "provider": "databricks", + "model": "gpt-4" + }, + { + "provider": "databricks", + "model": "gpt-4-0125-preview" + }, + { + "provider": "databricks", + "model": "gpt-4-1-2025-04-14" + }, + { + "provider": "databricks", + "model": "gpt-4-1-mini" + }, + { + "provider": "databricks", + "model": "gpt-4-1-nano" + }, + { + "provider": "databricks", + "model": "gpt-4-turbo" + }, + { + "provider": "databricks", + "model": "gpt-4-turbo-2024-04-09" + }, + { + "provider": "databricks", + "model": "gpt-4-vision-preview" + }, + { + "provider": "databricks", + "model": "gpt-4o" + }, + { + "provider": "databricks", + "model": "gpt-4o-2024-05-13" + }, + { + "provider": "databricks", + "model": "gpt-4o-2024-11-20" + }, + { + "provider": "databricks", + "model": "gpt-4o-mini" + }, + { + "provider": "databricks", + "model": "gpt-4o-mini-2024-07-18" + }, + { + "provider": "databricks", + "model": "gpt-5" + }, + { + "provider": "databricks", + "model": "gpt-5-mini-high" + }, + { + "provider": "databricks", + "model": "gpt-5-nano" + }, + { + "provider": "databricks", + "model": "gpt-vision" + }, + { + "provider": "databricks", + "model": "hackweek-snowflake-gpt-query-generator" + }, + { + "provider": "databricks", + "model": "headless-goose" + }, + { + "provider": "databricks", + "model": "headless-goose-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "headless-goose-o3-mini" + }, + { + "provider": "databricks", + "model": "icg-poc" + }, + { + "provider": "databricks", + "model": "invoice_parser_test" + }, + { + "provider": "databricks", + "model": "jina-reranker-v1-turbo-en" + }, + { + "provider": "databricks", + "model": "kgoose-cashapp-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "kgoose-cashapp-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "kgoose-claude-4-sonnet" + }, + { + "provider": "databricks", + "model": "kgoose-claude-haiku-4-5" + }, + { + "provider": "databricks", + "model": "kgoose-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "kgoose-gemini-2-5-flash" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4-1" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4-1-mini" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4-1-nano" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-4o" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-5" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-5-mini" + }, + { + "provider": "databricks", + "model": "kgoose-gpt-5-nano" + }, + { + "provider": "databricks", + "model": "kgoose-o3" + }, + { + "provider": "databricks", + "model": "kgoose-o4-mini" + }, + { + "provider": "databricks", + "model": "korhan-openai-test" + }, + { + "provider": "databricks", + "model": "korhan-openai-wrapper" + }, + { + "provider": "databricks", + "model": "moderation" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-haiku-3-5" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-opus-4" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-opus-4-1" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-sonnet-3-7" + }, + { + "provider": "databricks", + "model": "ng-tools-claude-sonnet-4" + }, + { + "provider": "databricks", + "model": "ng-tools-gpt-5-nano" + }, + { + "provider": "databricks", + "model": "o1" + }, + { + "provider": "databricks", + "model": "o1-2024-12-17" + }, + { + "provider": "databricks", + "model": "o1-mini" + }, + { + "provider": "databricks", + "model": "o1-preview" + }, + { + "provider": "databricks", + "model": "o3" + }, + { + "provider": "databricks", + "model": "o3-cdd-autopilot" + }, + { + "provider": "databricks", + "model": "o3-mini" + }, + { + "provider": "databricks", + "model": "optimized-llama2-7b" + }, + { + "provider": "databricks", + "model": "opus-mt-en-es" + }, + { + "provider": "databricks", + "model": "opus-mt-en-fr" + }, + { + "provider": "databricks", + "model": "opus-mt-en-ja" + }, + { + "provider": "databricks", + "model": "opus-mt-es-en" + }, + { + "provider": "databricks", + "model": "opus-mt-fr-en" + }, + { + "provider": "databricks", + "model": "opus-mt-ja-en" + }, + { + "provider": "databricks", + "model": "p2p-device-recovery-classify" + }, + { + "provider": "databricks", + "model": "picasso_embeddings" + }, + { + "provider": "databricks", + "model": "prime_model" + }, + { + "provider": "databricks", + "model": "raml-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "reportiq_selector_1" + }, + { + "provider": "databricks", + "model": "reportiq_selector_md_file" + }, + { + "provider": "databricks", + "model": "snowflake-gpt-query-generator-v3" + }, + { + "provider": "databricks", + "model": "sq-bank-statement-classifier" + }, + { + "provider": "databricks", + "model": "sq-bank-statement-parser" + }, + { + "provider": "databricks", + "model": "support-article-intent-mapping" + }, + { + "provider": "databricks", + "model": "text-embedding-3-large" + }, + { + "provider": "databricks", + "model": "text-embedding-3-small" + }, + { + "provider": "databricks", + "model": "text-embedding-ada-002" + }, + { + "provider": "databricks", + "model": "databricks-gpt-5" + }, + { + "provider": "databricks", + "model": "databricks-gemini-2-5-flash" + }, + { + "provider": "databricks", + "model": "databricks-claude-sonnet-4-5" + }, + { + "provider": "databricks", + "model": "databricks-gpt-oss-120b" + }, + { + "provider": "databricks", + "model": "databricks-gpt-5-mini" + }, + { + "provider": "databricks", + "model": "databricks-gpt-5-nano" + }, + { + "provider": "databricks", + "model": "databricks-gemini-2-5-pro" + }, + { + "provider": "databricks", + "model": "databricks-gpt-oss-20b" + }, + { + "provider": "databricks", + "model": "databricks-llama-4-maverick" + }, + { + "provider": "databricks", + "model": "databricks-gemma-3-12b" + }, + { + "provider": "databricks", + "model": "databricks-meta-llama-3-1-8b-instruct" + }, + { + "provider": "databricks", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + { + "provider": "databricks", + "model": "databricks-claude-opus-4-1" + }, + { + "provider": "databricks", + "model": "databricks-claude-sonnet-4" + }, + { + "provider": "databricks", + "model": "databricks-claude-3-7-sonnet" + }, + { + "provider": "databricks", + "model": "databricks-gte-large-en" + }, + { + "provider": "databricks", + "model": "databricks-bge-large-en" + }, + { + "provider": "databricks", + "model": "databricks-meta-llama-3-1-405b-instruct" + }, + { + "provider": "databricks", + "model": "databricks-claude-opus-4" + }, + { + "provider": "google", + "model": "aqa" + }, + { + "provider": "google", + "model": "embedding-001" + }, + { + "provider": "google", + "model": "embedding-gecko-001" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-exp-image-generation" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-preview-image-generation" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp-01-21" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-thinking-exp-1219" + }, + { + "provider": "google", + "model": "gemini-2.0-pro-exp" + }, + { + "provider": "google", + "model": "gemini-2.0-pro-exp-02-05" + }, + { + "provider": "google", + "model": "gemini-2.5-computer-use-preview-10-2025" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-preview-tts" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-tts" + }, + { + "provider": "google", + "model": "gemini-embedding-001" + }, + { + "provider": "google", + "model": "gemini-embedding-exp" + }, + { + "provider": "google", + "model": "gemini-embedding-exp-03-07" + }, + { + "provider": "google", + "model": "gemini-exp-1206" + }, + { + "provider": "google", + "model": "gemini-flash-latest" + }, + { + "provider": "google", + "model": "gemini-flash-lite-latest" + }, + { + "provider": "google", + "model": "gemini-pro-latest" + }, + { + "provider": "google", + "model": "gemini-robotics-er-1.5-preview" + }, + { + "provider": "google", + "model": "gemma-3-1b-it" + }, + { + "provider": "google", + "model": "gemma-3n-e2b-it" + }, + { + "provider": "google", + "model": "imagen-4.0-generate-preview-06-06" + }, + { + "provider": "google", + "model": "imagen-4.0-ultra-generate-preview-06-06" + }, + { + "provider": "google", + "model": "learnlm-2.0-flash-experimental" + }, + { + "provider": "google", + "model": "text-embedding-004" + } + ], + "all_mappings": { + "openrouter": [ + { + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-sonnet-20240620", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "verified": true + }, + { + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + }, + { + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", + "verified": true + }, + { + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", + "verified": true + }, + { + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", + "verified": true + }, + { + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", + "verified": true + }, + { + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", + "verified": true + }, + { + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b:exacto", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", + "verified": true + }, + { + "provider_model": "openai/o1", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "openai/o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", + "verified": true + }, + { + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "openai/o4-mini", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "openai/o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + }, + { + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", + "verified": true + } + ], + "anthropic": [ + { + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "claude-3-haiku-20240307", + "canonical_model": "anthropic/claude-3-haiku", + "verified": true + }, + { + "provider_model": "claude-3-opus-20240229", + "canonical_model": "anthropic/claude-3-opus", + "verified": true + }, + { + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku", + "verified": true + }, + { + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus", + "verified": true + }, + { + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + }, + { + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + } + ], + "openai": [ + { + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", + "verified": true + }, + { + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", + "verified": true + }, + { + "provider_model": "gpt-4", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview-2024-10-01", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", + "verified": true + }, + { + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", + "verified": true + }, + { + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", + "verified": true + }, + { + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", + "verified": true + }, + { + "provider_model": "gpt-5", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt", + "verified": true + }, + { + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", + "verified": true + }, + { + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "o1", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", + "verified": true + }, + { + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", + "verified": true + }, + { + "provider_model": "o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "o3-deep-research", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "o3-pro", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + } + ], + "google": [ + { + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-exp", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-preview", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-preview-02-05", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-image", + "canonical_model": "google/gemini-2.5-flash-image", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-image-preview", + "canonical_model": "google/gemini-2.5-flash-image", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-preview-05-20", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro-preview-03-25", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro-preview-06-05", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemma-3-12b-it", + "canonical_model": "google/gemma-3-12b-it", + "verified": true + }, + { + "provider_model": "gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", + "verified": true + }, + { + "provider_model": "gemma-3-4b-it", + "canonical_model": "google/gemma-3-4b-it", + "verified": true + }, + { + "provider_model": "gemma-3n-e4b-it", + "canonical_model": "google/gemma-3n-e4b-it", + "verified": true + } + ], + "databricks": [], + "tetrate": [] + }, + "model_counts": { + "openrouter": 217, + "anthropic": 9, + "openai": 625, + "tetrate": 0, + "databricks": 143, + "google": 50 + }, + "canonical_models_used": [ + "openai/gpt-5-image-mini", + "google/gemini-2.5-flash-image", + "openai/gpt-4.1-mini", + "openai/o4-mini-high", + "google/gemini-2.5-flash-lite", + "openai/gpt-4-turbo", + "anthropic/claude-sonnet", + "openai/gpt-4o-mini", + "google/gemma-3-4b-it", + "openai/gpt-3.5-turbo-instruct", + "openai/gpt-3.5-turbo-16k", + "google/gemma-3n-e4b-it", + "anthropic/claude-3-opus", + "google/gemma-3-12b-it", + "openai/o3", + "openai/gpt-oss-safeguard-20b", + "anthropic/claude-3.5-haiku", + "openai/o1-pro", + "openai/o3-mini", + "openai/chatgpt-4o-latest", + "openai/gpt-3.5-turbo", + "anthropic/claude-3-haiku", + "openai/gpt", + "openai/gpt-5-codex", + "openai/o3-deep-research", + "anthropic/claude-3.7-sonnet:thinking", + "anthropic/claude-haiku", + "anthropic/claude-3.7-sonnet", + "openai/gpt-4.1-nano", + "openai/o4-mini", + "openai/o3-mini-high", + "openai/o4-mini-deep-research", + "openai/gpt-oss-120b", + "openai/gpt-4o-audio", + "openai/o3-pro", + "openai/gpt-5-image", + "google/gemini-2.5-flash", + "google/gemma-3-27b-it", + "openai/gpt-oss-20b", + "google/gemini-2.5-pro", + "anthropic/claude-3.5-sonnet", + "openai/o1", + "openai/gpt-oss-120b:exacto", + "openai/gpt-4o-mini-search", + "openai/gpt-5-pro", + "openai/gpt-4o", + "openai/codex-mini", + "google/gemini-2.0-flash-lite", + "anthropic/claude-opus", + "openai/gpt-4o:extended", + "google/gemini-2.0-flash", + "openai/gpt-5-mini", + "openai/gpt-5-nano", + "openai/gpt-4o-search" + ] +} \ No newline at end of file diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs new file mode 100644 index 000000000000..192ba663a283 --- /dev/null +++ b/crates/goose/examples/build_canonical_models.rs @@ -0,0 +1,164 @@ +/// Build canonical models from OpenRouter API +/// +/// This script fetches models from OpenRouter and converts them to canonical format. +/// Usage: +/// cargo run --example build_canonical_models +/// +use anyhow::{Context, Result}; +use goose::providers::canonical::{canonical_name, CanonicalModel, CanonicalModelRegistry, Pricing}; +use serde_json::Value; +use std::collections::HashMap; + +fn main() -> Result<()> { + println!("Building canonical models from OpenRouter..."); + + // Read the fetched OpenRouter models + let content = std::fs::read_to_string("/tmp/openrouter_models.json") + .context("Failed to read /tmp/openrouter_models.json")?; + + let models: Vec = serde_json::from_str(&content) + .context("Failed to parse OpenRouter models")?; + + println!("Processing {} models from OpenRouter...", models.len()); + + // First pass: Group models by canonical ID and track the one with shortest name + let mut canonical_groups: HashMap = HashMap::new(); + let mut shortest_names: HashMap = HashMap::new(); + + for model in &models { + let id = model["id"].as_str().unwrap(); + let name = model["name"].as_str().unwrap_or(id); + let canonical_id = canonical_name("openrouter", id); + + // Check if we've seen this canonical ID before + if let Some(existing_name) = shortest_names.get(&canonical_id) { + if name.len() < existing_name.len() { + println!(" Updating {} to use shorter name: '{}' (len {}) -> '{}' (len {})", + canonical_id, existing_name, existing_name.len(), name, name.len()); + shortest_names.insert(canonical_id.clone(), name.to_string()); + canonical_groups.insert(canonical_id, model); + } else { + println!(" Skipping duplicate {}: keeping shorter name '{}'", id, existing_name); + } + } else { + println!(" Adding: {} (from {})", canonical_id, id); + shortest_names.insert(canonical_id.clone(), name.to_string()); + canonical_groups.insert(canonical_id, model); + } + } + + // Second pass: Build the registry with the selected models + let mut registry = CanonicalModelRegistry::new(); + + for (canonical_id, model) in canonical_groups.iter() { + let name = shortest_names.get(canonical_id).unwrap(); + + // Parse context length + let context_length = model["context_length"].as_u64().unwrap_or(128_000) as usize; + + // Parse max completion tokens (if available) + let max_completion_tokens = model + .get("top_provider") + .and_then(|tp| tp.get("max_completion_tokens")) + .and_then(|v| v.as_u64()) + .map(|v| v as usize); + + // Parse modalities + let input_modalities: Vec = model + .get("supported_parameters") + .and_then(|v| v.as_array()) + .map(|arr| { + let mut mods = vec!["text".to_string()]; + for param in arr { + if let Some(s) = param.as_str() { + match s { + "image" | "image_url" => { + if !mods.contains(&"image".to_string()) { + mods.push("image".to_string()); + } + } + "audio" => { + if !mods.contains(&"audio".to_string()) { + mods.push("audio".to_string()); + } + } + "video" => { + if !mods.contains(&"video".to_string()) { + mods.push("video".to_string()); + } + } + _ => {} + } + } + } + // Check if model has file support + if model.get("architecture").and_then(|a| a.get("multimodality")).is_some() { + if !mods.contains(&"file".to_string()) { + mods.push("file".to_string()); + } + } + mods + }) + .unwrap_or_else(|| vec!["text".to_string()]); + + let output_modalities = vec!["text".to_string()]; + + // Determine tokenizer based on provider + let tokenizer = if canonical_id.starts_with("anthropic/") { + "Claude" + } else if canonical_id.starts_with("openai/") { + "GPT" + } else if canonical_id.starts_with("google/") { + "Gemini" + } else { + "Unknown" + } + .to_string(); + + // Parse pricing + let pricing_obj = model.get("pricing").unwrap(); + let pricing = Pricing { + prompt: pricing_obj + .get("prompt") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()), + completion: pricing_obj + .get("completion") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()), + request: pricing_obj + .get("request") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()), + image: pricing_obj + .get("image") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()), + audio: None, // Not in OpenRouter API + web_search: None, // Not in OpenRouter API + internal_reasoning: None, // Not in OpenRouter API + input_cache_read: None, // Not in OpenRouter API + input_cache_write: None, // Not in OpenRouter API + }; + + let canonical_model = CanonicalModel { + id: canonical_id.clone(), + name: name.to_string(), + context_length, + max_completion_tokens, + input_modalities, + output_modalities, + tokenizer, + pricing, + }; + + registry.register(canonical_model); + } + + // Write to file + let output_path = "src/providers/canonical/canonical_models.json"; + registry.to_file(output_path)?; + println!("\n✓ Wrote {} models to {}", registry.count(), output_path); + + Ok(()) +} diff --git a/crates/goose/examples/canonical_model_checker.rs b/crates/goose/examples/canonical_model_checker.rs index df214648ca15..2a250de8fb62 100644 --- a/crates/goose/examples/canonical_model_checker.rs +++ b/crates/goose/examples/canonical_model_checker.rs @@ -242,17 +242,22 @@ async fn check_provider( } }; - // Get canonical mappings - let mappings = match provider.map_to_canonical_models().await { - Ok(m) => { - println!(" ✓ Found {} mappings", m.len()); - m - } - Err(e) => { - println!(" ⚠ Failed to get mappings: {}", e); - Vec::new() + // Map each fetched model to canonical model + let mut mappings = Vec::new(); + for model in &fetched_models { + match provider.map_to_canonical_model(model).await { + Ok(Some(canonical)) => { + mappings.push(ModelMapping::new(model.clone(), canonical).verified()); + } + Ok(None) => { + // No mapping found for this model + } + Err(e) => { + println!(" ⚠ Failed to map model '{}': {}", model, e); + } } - }; + } + println!(" ✓ Found {} mappings", mappings.len()); Ok((fetched_models, mappings)) } diff --git a/crates/goose/src/providers/anthropic.rs b/crates/goose/src/providers/anthropic.rs index 7f0d41be05f2..2c5c24c70851 100644 --- a/crates/goose/src/providers/anthropic.rs +++ b/crates/goose/src/providers/anthropic.rs @@ -10,6 +10,7 @@ use tokio_util::io::StreamReader; use super::api_client::{ApiClient, ApiResponse, AuthMethod}; use super::base::{ConfigKey, MessageStream, ModelInfo, Provider, ProviderMetadata, ProviderUsage}; +use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::formats::anthropic::{ create_request, get_usage, response_to_message, response_to_streaming_message, @@ -254,6 +255,17 @@ impl Provider for AnthropicProvider { Ok(Some(models)) } + async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { + let canonical = canonical_name("anthropic", provider_model); + + // Check if this canonical model exists in our registry + if CanonicalModelRegistry::bundled_contains(&canonical)? { + Ok(Some(canonical)) + } else { + Ok(None) + } + } + async fn stream( &self, system: &str, diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index 21933540cbe6..beba273ead5b 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -415,11 +415,11 @@ pub trait Provider: Send + Sync { Ok(None) } - /// Map fetched provider models to canonical models - /// Returns a list of ModelMapping for each model this provider supports - /// Default implementation returns an empty list (no mappings configured yet) - async fn map_to_canonical_models(&self) -> Result, ProviderError> { - Ok(Vec::new()) + /// Map a provider-specific model name to a canonical model ID + /// Returns the canonical model ID (e.g., "anthropic/claude-3-5-sonnet") if a mapping exists + /// Default implementation returns None (no mapping configured) + async fn map_to_canonical_model(&self, _provider_model: &str) -> Result, ProviderError> { + Ok(None) } fn supports_embeddings(&self) -> bool { diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json index a2017ceb08c5..e8b79e44672a 100644 --- a/crates/goose/src/providers/canonical/canonical_models.json +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -1,12 +1,11 @@ [ { "id": "anthropic/claude-3-haiku", - "name": "Claude 3 Haiku", + "name": "Anthropic: Claude 3 Haiku", "context_length": 200000, "max_completion_tokens": 4096, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -15,19 +14,17 @@ "pricing": { "prompt": "0.00000025", "completion": "0.00000125", - "image": "0.0004", - "input_cache_read": "0.00000003", - "input_cache_write": "0.0000003" + "request": "0", + "image": "0.0004" } }, { "id": "anthropic/claude-3-opus", - "name": "Claude 3 Opus", + "name": "Anthropic: Claude 3 Opus", "context_length": 200000, "max_completion_tokens": 4096, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -36,20 +33,17 @@ "pricing": { "prompt": "0.000015", "completion": "0.000075", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" + "request": "0", + "image": "0.024" } }, { "id": "anthropic/claude-3.5-haiku", - "name": "Claude 3.5 Haiku (2024-10-22)", + "name": "Anthropic: Claude 3.5 Haiku", "context_length": 200000, "max_completion_tokens": 8192, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -58,19 +52,17 @@ "pricing": { "prompt": "0.0000008", "completion": "0.000004", - "input_cache_read": "0.00000008", - "input_cache_write": "0.000001" + "request": "0", + "image": "0" } }, { "id": "anthropic/claude-3.5-sonnet", - "name": "Claude 3.5 Sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", "context_length": 200000, "max_completion_tokens": 8192, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -79,20 +71,17 @@ "pricing": { "prompt": "0.000003", "completion": "0.000015", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" + "request": "0", + "image": "0.0048" } }, { "id": "anthropic/claude-3.7-sonnet", - "name": "Claude 3.7 Sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", "context_length": 200000, "max_completion_tokens": 64000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -101,20 +90,17 @@ "pricing": { "prompt": "0.000003", "completion": "0.000015", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" + "request": "0", + "image": "0.0048" } }, { "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Claude 3.7 Sonnet (thinking)", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", "context_length": 200000, "max_completion_tokens": 64000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -123,18 +109,16 @@ "pricing": { "prompt": "0.000003", "completion": "0.000015", - "image": "0.0048", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" + "request": "0", + "image": "0.0048" } }, { "id": "anthropic/claude-haiku", - "name": "Claude Haiku 4.5", + "name": "Anthropic: Claude Haiku 4.5", "context_length": 200000, "max_completion_tokens": 64000, "input_modalities": [ - "image", "text" ], "output_modalities": [ @@ -144,19 +128,17 @@ "pricing": { "prompt": "0.000001", "completion": "0.000005", - "input_cache_read": "0.0000001", - "input_cache_write": "0.00000125" + "request": "0", + "image": "0" } }, { "id": "anthropic/claude-opus", - "name": "Claude Opus 4.1", + "name": "Anthropic: Claude Opus 4", "context_length": 200000, "max_completion_tokens": 32000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -165,20 +147,17 @@ "pricing": { "prompt": "0.000015", "completion": "0.000075", - "image": "0.024", - "input_cache_read": "0.0000015", - "input_cache_write": "0.00001875" + "request": "0", + "image": "0.024" } }, { "id": "anthropic/claude-sonnet", - "name": "Claude Sonnet 4.5", + "name": "Anthropic: Claude Sonnet 4", "context_length": 1000000, "max_completion_tokens": 64000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -187,20 +166,17 @@ "pricing": { "prompt": "0.000003", "completion": "0.000015", - "input_cache_read": "0.0000003", - "input_cache_write": "0.00000375" + "request": "0", + "image": "0.0048" } }, { "id": "google/gemini-2.0-flash", - "name": "Gemini 2.0 Flash", + "name": "Google: Gemini 2.0 Flash", "context_length": 1048576, "max_completion_tokens": 8192, "input_modalities": [ - "text", - "image", - "file", - "audio" + "text" ], "output_modalities": [ "text" @@ -209,22 +185,17 @@ "pricing": { "prompt": "0.0000001", "completion": "0.0000004", - "image": "0.0000258", - "audio": "0.0000007", - "input_cache_read": "0.000000025", - "input_cache_write": "0.0000001833" + "request": "0", + "image": "0.0000258" } }, { "id": "google/gemini-2.0-flash-lite", - "name": "Gemini 2.0 Flash Lite", + "name": "Google: Gemini 2.0 Flash Lite", "context_length": 1048576, "max_completion_tokens": 8192, "input_modalities": [ - "text", - "image", - "file", - "audio" + "text" ], "output_modalities": [ "text" @@ -232,107 +203,57 @@ "tokenizer": "Gemini", "pricing": { "prompt": "0.000000075", - "completion": "0.0000003" + "completion": "0.0000003", + "request": "0", + "image": "0" } }, { "id": "google/gemini-2.5-flash", - "name": "Gemini 2.5 Flash", + "name": "Google: Gemini 2.5 Flash", "context_length": 1048576, "max_completion_tokens": 65535, "input_modalities": [ - "file", - "image", - "text", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "image": "0.001238", - "input_cache_read": "0.00000003", - "input_cache_write": "0.0000003833" - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "image", "text" ], "output_modalities": [ - "image", "text" ], "tokenizer": "Gemini", "pricing": { "prompt": "0.0000003", "completion": "0.0000025", + "request": "0", "image": "0.001238" } }, { - "id": "google/gemini-2.5-flash-image-preview", - "name": "Gemini 2.5 Flash Image Preview (Nano Banana)", + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", "context_length": 32768, "max_completion_tokens": 32768, "input_modalities": [ - "image", "text" ], "output_modalities": [ - "image", "text" ], "tokenizer": "Gemini", "pricing": { "prompt": "0.0000003", "completion": "0.0000025", + "request": "0", "image": "0.001238" } }, { "id": "google/gemini-2.5-flash-lite", - "name": "Gemini 2.5 Flash Lite", + "name": "Google: Gemini 2.5 Flash Lite", "context_length": 1048576, "max_completion_tokens": 65535, "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ "text" ], - "tokenizer": "Gemini", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "input_cache_read": "0.00000001", - "input_cache_write": "0.0000001833" - } - }, - { - "id": "google/gemini-2.5-flash-lite-preview-06", - "name": "Gemini 2.5 Flash Lite Preview 06-17", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "file", - "image", - "text", - "audio" - ], "output_modalities": [ "text" ], @@ -340,116 +261,18 @@ "pricing": { "prompt": "0.0000001", "completion": "0.0000004", - "audio": "0.0000003", - "input_cache_read": "0.000000025", - "input_cache_write": "0.0000001833" - } - }, - { - "id": "google/gemini-2.5-flash-lite-preview-09", - "name": "Gemini 2.5 Flash Lite Preview 09-2025", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004" - } - }, - { - "id": "google/gemini-2.5-flash-preview-09", - "name": "Gemini 2.5 Flash Preview 09-2025", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "image", - "file", - "text", - "audio", - "video" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "image": "0.001238", - "audio": "0.000001", - "input_cache_read": "0.000000075", - "input_cache_write": "0.0000003833" + "request": "0", + "image": "0" } }, { "id": "google/gemini-2.5-pro", - "name": "Gemini 2.5 Pro", + "name": "Google: Gemini 2.5 Pro", "context_length": 1048576, "max_completion_tokens": 65536, "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], - "output_modalities": [ "text" ], - "tokenizer": "Gemini", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "image": "0.00516", - "input_cache_read": "0.000000125", - "input_cache_write": "0.000001625" - } - }, - { - "id": "google/gemini-2.5-pro-preview", - "name": "Gemini 2.5 Pro Preview 06-05", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "file", - "image", - "text", - "audio" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "image": "0.00516", - "input_cache_read": "0.00000031", - "input_cache_write": "0.000001625" - } - }, - { - "id": "google/gemini-2.5-pro-preview-05", - "name": "Gemini 2.5 Pro Preview 05-06", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text", - "image", - "file", - "audio", - "video" - ], "output_modalities": [ "text" ], @@ -457,16 +280,14 @@ "pricing": { "prompt": "0.00000125", "completion": "0.00001", - "image": "0.00516", - "input_cache_read": "0.00000031", - "input_cache_write": "0.000001625" + "request": "0", + "image": "0.00516" } }, { "id": "google/gemma-2-27b-it", - "name": "Gemma 2 27B", + "name": "Google: Gemma 2 27B", "context_length": 8192, - "max_completion_tokens": null, "input_modalities": [ "text" ], @@ -476,14 +297,15 @@ "tokenizer": "Gemini", "pricing": { "prompt": "0.00000065", - "completion": "0.00000065" + "completion": "0.00000065", + "request": "0", + "image": "0" } }, { "id": "google/gemma-2-9b-it", - "name": "Gemma 2 9B", + "name": "Google: Gemma 2 9B", "context_length": 8192, - "max_completion_tokens": null, "input_modalities": [ "text" ], @@ -493,17 +315,18 @@ "tokenizer": "Gemini", "pricing": { "prompt": "0.00000003", - "completion": "0.00000009" + "completion": "0.00000009", + "request": "0", + "image": "0" } }, { "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B", + "name": "Google: Gemma 3 12B", "context_length": 131072, "max_completion_tokens": 131072, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -511,17 +334,18 @@ "tokenizer": "Gemini", "pricing": { "prompt": "0.00000003", - "completion": "0.0000001" + "completion": "0.0000001", + "request": "0", + "image": "0" } }, { "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B", + "name": "Google: Gemma 3 27B", "context_length": 131072, "max_completion_tokens": 16384, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -530,17 +354,16 @@ "pricing": { "prompt": "0.00000009", "completion": "0.00000016", + "request": "0", "image": "0.0000256" } }, { "id": "google/gemma-3-4b-it", - "name": "Gemma 3 4B", + "name": "Google: Gemma 3 4B", "context_length": 96000, - "max_completion_tokens": null, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -548,34 +371,36 @@ "tokenizer": "Gemini", "pricing": { "prompt": "0.00000001703012", - "completion": "0.0000000681536" + "completion": "0.0000000681536", + "request": "0", + "image": "0" } }, { "id": "google/gemma-3n-e4b-it", - "name": "Gemma 3n 4B", + "name": "Google: Gemma 3n 4B", "context_length": 32768, - "max_completion_tokens": null, "input_modalities": [ "text" ], "output_modalities": [ "text" ], - "tokenizer": "Other", + "tokenizer": "Gemini", "pricing": { "prompt": "0.00000002", - "completion": "0.00000004" + "completion": "0.00000004", + "request": "0", + "image": "0" } }, { "id": "openai/chatgpt-4o-latest", - "name": "ChatGPT-4o", + "name": "OpenAI: ChatGPT-4o", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -584,16 +409,16 @@ "pricing": { "prompt": "0.000005", "completion": "0.000015", + "request": "0", "image": "0.007225" } }, { "id": "openai/codex-mini", - "name": "Codex Mini", + "name": "OpenAI: Codex Mini", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "image", "text" ], "output_modalities": [ @@ -603,33 +428,32 @@ "pricing": { "prompt": "0.0000015", "completion": "0.000006", - "input_cache_read": "0.000000375" + "request": "0", + "image": "0" } }, { "id": "openai/gpt", - "name": "GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" ], "tokenizer": "GPT", "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "web_search": "0.01", - "input_cache_read": "0.0000005" + "prompt": "0.00000125", + "completion": "0.00001", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-3.5-turbo", - "name": "GPT-3.5 Turbo", + "name": "OpenAI: GPT-3.5 Turbo", "context_length": 16385, "max_completion_tokens": 4096, "input_modalities": [ @@ -641,12 +465,14 @@ "tokenizer": "GPT", "pricing": { "prompt": "0.0000005", - "completion": "0.0000015" + "completion": "0.0000015", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-3.5-turbo-16k", - "name": "GPT-3.5 Turbo 16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", "context_length": 16385, "max_completion_tokens": 4096, "input_modalities": [ @@ -658,12 +484,14 @@ "tokenizer": "GPT", "pricing": { "prompt": "0.000003", - "completion": "0.000004" + "completion": "0.000004", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-3.5-turbo-instruct", - "name": "GPT-3.5 Turbo Instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", "context_length": 4095, "max_completion_tokens": 4096, "input_modalities": [ @@ -675,51 +503,18 @@ "tokenizer": "GPT", "pricing": { "prompt": "0.0000015", - "completion": "0.000002" - } - }, - { - "id": "openai/gpt-4", - "name": "GPT-4 (older v0314)", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "pricing": { - "prompt": "0.00003", - "completion": "0.00006" - } - }, - { - "id": "openai/gpt-4-1106-preview", - "name": "GPT-4 Turbo (older v1106)", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "pricing": { - "prompt": "0.00001", - "completion": "0.00003" + "completion": "0.000002", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-4-turbo", - "name": "GPT-4 Turbo", + "name": "OpenAI: GPT-4 Turbo", "context_length": 128000, "max_completion_tokens": 4096, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -728,35 +523,17 @@ "pricing": { "prompt": "0.00001", "completion": "0.00003", + "request": "0", "image": "0.01445" } }, - { - "id": "openai/gpt-4-turbo-preview", - "name": "GPT-4 Turbo Preview", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "pricing": { - "prompt": "0.00001", - "completion": "0.00003" - } - }, { "id": "openai/gpt-4.1-mini", - "name": "GPT-4.1 Mini", + "name": "OpenAI: GPT-4.1 Mini", "context_length": 1047576, "max_completion_tokens": 32768, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -765,19 +542,17 @@ "pricing": { "prompt": "0.0000004", "completion": "0.0000016", - "web_search": "0.01", - "input_cache_read": "0.0000001" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-4.1-nano", - "name": "GPT-4.1 Nano", + "name": "OpenAI: GPT-4.1 Nano", "context_length": 1047576, "max_completion_tokens": 32768, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -786,19 +561,17 @@ "pricing": { "prompt": "0.0000001", "completion": "0.0000004", - "web_search": "0.01", - "input_cache_read": "0.000000025" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-4o", - "name": "GPT-4o (2024-11-20)", + "name": "OpenAI: GPT-4o", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -807,17 +580,16 @@ "pricing": { "prompt": "0.0000025", "completion": "0.00001", - "image": "0.003613", - "input_cache_read": "0.00000125" + "request": "0", + "image": "0.003613" } }, { - "id": "openai/gpt-4o-audio-preview", - "name": "GPT-4o Audio", + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "audio", "text" ], "output_modalities": [ @@ -827,18 +599,17 @@ "pricing": { "prompt": "0.0000025", "completion": "0.00001", - "audio": "0.00004" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-4o-mini", - "name": "GPT-4o-mini", + "name": "OpenAI: GPT-4o-mini", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -847,13 +618,13 @@ "pricing": { "prompt": "0.00000015", "completion": "0.0000006", - "image": "0.000217", - "input_cache_read": "0.000000075" + "request": "0", + "image": "0.000217" } }, { - "id": "openai/gpt-4o-mini-search-preview", - "name": "GPT-4o-mini Search Preview", + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ @@ -866,13 +637,13 @@ "pricing": { "prompt": "0.00000015", "completion": "0.0000006", - "image": "0.000217", - "request": "0.0275" + "request": "0.0275", + "image": "0.000217" } }, { - "id": "openai/gpt-4o-search-preview", - "name": "GPT-4o Search Preview", + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ @@ -885,19 +656,17 @@ "pricing": { "prompt": "0.0000025", "completion": "0.00001", - "image": "0.003613", - "request": "0.035" + "request": "0.035", + "image": "0.003613" } }, { "id": "openai/gpt-4o:extended", - "name": "GPT-4o (extended)", + "name": "OpenAI: GPT-4o (extended)", "context_length": 128000, "max_completion_tokens": 64000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -906,17 +675,16 @@ "pricing": { "prompt": "0.000006", "completion": "0.000018", + "request": "0", "image": "0.007225" } }, { "id": "openai/gpt-5-chat", - "name": "GPT-5 Chat", + "name": "OpenAI: GPT-5 Chat", "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "file", - "image", "text" ], "output_modalities": [ @@ -926,18 +694,17 @@ "pricing": { "prompt": "0.00000125", "completion": "0.00001", - "web_search": "0.01", - "input_cache_read": "0.000000125" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-5-codex", - "name": "GPT-5 Codex", + "name": "OpenAI: GPT-5 Codex", "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text", - "image" + "text" ], "output_modalities": [ "text" @@ -946,64 +713,55 @@ "pricing": { "prompt": "0.00000125", "completion": "0.00001", - "input_cache_read": "0.000000125" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-5-image", - "name": "GPT-5 Image", + "name": "OpenAI: GPT-5 Image", "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ - "image", "text" ], "tokenizer": "GPT", "pricing": { "prompt": "0.00001", "completion": "0.00001", - "image": "0.00001", - "web_search": "0.01", - "input_cache_read": "0.00000125" + "request": "0", + "image": "0.00001" } }, { "id": "openai/gpt-5-image-mini", - "name": "GPT-5 Image Mini", + "name": "OpenAI: GPT-5 Image Mini", "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "file", - "image", "text" ], "output_modalities": [ - "image", "text" ], "tokenizer": "GPT", "pricing": { "prompt": "0.0000025", "completion": "0.000002", - "image": "0.0000025", - "web_search": "0.01", - "input_cache_read": "0.00000025" + "request": "0", + "image": "0.0000025" } }, { "id": "openai/gpt-5-mini", - "name": "GPT-5 Mini", + "name": "OpenAI: GPT-5 Mini", "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -1012,19 +770,17 @@ "pricing": { "prompt": "0.00000025", "completion": "0.000002", - "web_search": "0.01", - "input_cache_read": "0.000000025" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-5-nano", - "name": "GPT-5 Nano", + "name": "OpenAI: GPT-5 Nano", "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -1033,19 +789,17 @@ "pricing": { "prompt": "0.00000005", "completion": "0.0000004", - "web_search": "0.01", - "input_cache_read": "0.000000005" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-5-pro", - "name": "GPT-5 Pro", + "name": "OpenAI: GPT-5 Pro", "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -1054,12 +808,13 @@ "pricing": { "prompt": "0.000015", "completion": "0.00012", - "web_search": "0.01" + "request": "0", + "image": "0" } }, { "id": "openai/gpt-oss-120b", - "name": "gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", "context_length": 131072, "max_completion_tokens": 131072, "input_modalities": [ @@ -1071,14 +826,15 @@ "tokenizer": "GPT", "pricing": { "prompt": "0.00000004", - "completion": "0.0000004" + "completion": "0.0000004", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-oss-120b:exacto", - "name": "gpt-oss-120b (exacto)", + "name": "OpenAI: gpt-oss-120b (exacto)", "context_length": 131072, - "max_completion_tokens": null, "input_modalities": [ "text" ], @@ -1088,14 +844,15 @@ "tokenizer": "GPT", "pricing": { "prompt": "0.00000005", - "completion": "0.00000024" + "completion": "0.00000024", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-oss-20b", - "name": "gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", "context_length": 131072, - "max_completion_tokens": null, "input_modalities": [ "text" ], @@ -1105,12 +862,14 @@ "tokenizer": "GPT", "pricing": { "prompt": "0.00000003", - "completion": "0.00000014" + "completion": "0.00000014", + "request": "0", + "image": "0" } }, { "id": "openai/gpt-oss-safeguard-20b", - "name": "gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", "context_length": 131072, "max_completion_tokens": 65536, "input_modalities": [ @@ -1123,18 +882,17 @@ "pricing": { "prompt": "0.000000075", "completion": "0.0000003", - "input_cache_read": "0.000000037" + "request": "0", + "image": "0" } }, { "id": "openai/o1", - "name": "o1", + "name": "OpenAI: o1", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -1143,19 +901,17 @@ "pricing": { "prompt": "0.000015", "completion": "0.00006", - "image": "0.021675", - "input_cache_read": "0.0000075" + "request": "0", + "image": "0.021675" } }, { "id": "openai/o1-pro", - "name": "o1-pro", + "name": "OpenAI: o1-pro", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text", - "image", - "file" + "text" ], "output_modalities": [ "text" @@ -1164,18 +920,17 @@ "pricing": { "prompt": "0.00015", "completion": "0.0006", + "request": "0", "image": "0.21675" } }, { "id": "openai/o3", - "name": "o3", + "name": "OpenAI: o3", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -1184,20 +939,17 @@ "pricing": { "prompt": "0.000002", "completion": "0.000008", - "image": "0.00153", - "web_search": "0.01", - "input_cache_read": "0.0000005" + "request": "0", + "image": "0.00153" } }, { "id": "openai/o3-deep-research", - "name": "o3 Deep Research", + "name": "OpenAI: o3 Deep Research", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -1206,19 +958,17 @@ "pricing": { "prompt": "0.00001", "completion": "0.00004", - "image": "0.00765", - "web_search": "0.01", - "input_cache_read": "0.0000025" + "request": "0", + "image": "0.00765" } }, { "id": "openai/o3-mini", - "name": "o3 Mini", + "name": "OpenAI: o3 Mini", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -1227,17 +977,17 @@ "pricing": { "prompt": "0.0000011", "completion": "0.0000044", - "input_cache_read": "0.00000055" + "request": "0", + "image": "0" } }, { "id": "openai/o3-mini-high", - "name": "o3 Mini High", + "name": "OpenAI: o3 Mini High", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -1246,18 +996,17 @@ "pricing": { "prompt": "0.0000011", "completion": "0.0000044", - "input_cache_read": "0.00000055" + "request": "0", + "image": "0" } }, { "id": "openai/o3-pro", - "name": "o3 Pro", + "name": "OpenAI: o3 Pro", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text", - "file", - "image" + "text" ], "output_modalities": [ "text" @@ -1266,19 +1015,17 @@ "pricing": { "prompt": "0.00002", "completion": "0.00008", - "image": "0.0153", - "web_search": "0.01" + "request": "0", + "image": "0.0153" } }, { "id": "openai/o4-mini", - "name": "o4 Mini", + "name": "OpenAI: o4 Mini", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" @@ -1287,19 +1034,16 @@ "pricing": { "prompt": "0.0000011", "completion": "0.0000044", - "image": "0.0008415", - "web_search": "0.01", - "input_cache_read": "0.000000275" + "request": "0", + "image": "0.0008415" } }, { "id": "openai/o4-mini-deep-research", - "name": "o4 Mini Deep Research", + "name": "OpenAI: o4 Mini Deep Research", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "file", - "image", "text" ], "output_modalities": [ @@ -1309,31 +1053,27 @@ "pricing": { "prompt": "0.000002", "completion": "0.000008", - "image": "0.00153", - "web_search": "0.01", - "input_cache_read": "0.0000005" + "request": "0", + "image": "0.00153" } }, { "id": "openai/o4-mini-high", - "name": "o4 Mini High", + "name": "OpenAI: o4 Mini High", "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "image", - "text", - "file" + "text" ], "output_modalities": [ "text" ], - "tokenizer": "Other", + "tokenizer": "GPT", "pricing": { "prompt": "0.0000011", "completion": "0.0000044", - "image": "0.0008415", - "web_search": "0.01", - "input_cache_read": "0.000000275" + "request": "0", + "image": "0.0008415" } } ] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index 17e92ccbf304..c90f3d003bc8 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -22,31 +22,44 @@ pub fn canonical_name(provider: &str, model: &str) -> String { } } -/// Strip version suffixes from model names +/// Strip version suffixes from model names and normalize version numbers /// -/// Strips patterns like: +/// First normalizes version numbers (e.g., `-3-5-` → `-3.5-`), then strips: /// - `-20241022` (8-digit dates) /// - `-2024-04-09` (YYYY-MM-DD dates) /// - `-002` or `-v1.5` (version numbers) +/// - `-exp`, `-exp-1219`, `-exp-01-21` (experimental suffixes) +/// - `-preview`, `-preview-09`, `-preview-05-20` (preview suffixes) /// /// Examples: -/// - `strip_version_suffix("claude-3-5-sonnet-20241022")` → `"claude-3-5-sonnet"` +/// - `strip_version_suffix("claude-3-5-sonnet-20241022")` → `"claude-3.5-sonnet"` /// - `strip_version_suffix("gpt-4-turbo-2024-04-09")` → `"gpt-4-turbo"` /// - `strip_version_suffix("gemini-1.5-pro-002")` → `"gemini-1.5-pro"` +/// - `strip_version_suffix("gemini-2.0-flash-exp")` → `"gemini-2.0-flash"` +/// - `strip_version_suffix("gemini-2.5-flash-preview-05-20")` → `"gemini-2.5-flash"` pub fn strip_version_suffix(model: &str) -> String { - // Strip datetime suffixes like: - // - "-20241022" (8 digits) - // - "-2024-04-09" (YYYY-MM-DD) - // - "-v1.5" or "-002" (version numbers) + // First, normalize version numbers: convert -X-Y- to -X.Y- (e.g., -3-5- to -3.5-) + // This handles cases where Anthropic uses dashes (claude-3-5-haiku) but OpenRouter uses dots (claude-3.5-haiku) + let normalize_version = regex::Regex::new(r"-(\d)-(\d)(-|$)").unwrap(); + let mut result = normalize_version.replace_all(model, "-$1.$2$3").to_string(); + + // Strip datetime, version, and preview/exp suffixes let patterns = [ + regex::Regex::new(r"-preview(-\d+)*$").unwrap(), // -preview, -preview-09, -preview-05-20 + regex::Regex::new(r"-exp(-\d+)*$").unwrap(), // -exp, -exp-1219, -exp-01-21 regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 regex::Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), // -2024-04-09 regex::Regex::new(r"-v?\d+(\.\d+)*$").unwrap(), // -v1.5 or -002 ]; - let mut result = model.to_string(); - for pattern in &patterns { - result = pattern.replace(&result, "").to_string(); + // Apply patterns multiple times to handle cases like "-preview-09-2025" + let mut changed = true; + while changed { + let before = result.clone(); + for pattern in &patterns { + result = pattern.replace(&result, "").to_string(); + } + changed = result != before; } result } @@ -59,7 +72,7 @@ mod tests { fn test_canonical_name_anthropic() { assert_eq!( canonical_name("anthropic", "claude-3-5-sonnet-20241022"), - "anthropic/claude-3-5-sonnet" + "anthropic/claude-3.5-sonnet" ); } @@ -83,7 +96,7 @@ mod tests { fn test_canonical_name_no_version() { assert_eq!( canonical_name("anthropic", "claude-3-5-sonnet"), - "anthropic/claude-3-5-sonnet" + "anthropic/claude-3.5-sonnet" ); } @@ -107,7 +120,7 @@ mod tests { fn test_strip_version_suffix_8_digit() { assert_eq!( strip_version_suffix("claude-3-5-sonnet-20241022"), - "claude-3-5-sonnet" + "claude-3.5-sonnet" ); } @@ -127,6 +140,68 @@ mod tests { #[test] fn test_strip_version_suffix_no_suffix() { - assert_eq!(strip_version_suffix("claude-3-5-sonnet"), "claude-3-5-sonnet"); + assert_eq!(strip_version_suffix("claude-3-5-sonnet"), "claude-3.5-sonnet"); + } + + #[test] + fn test_strip_version_suffix_exp() { + assert_eq!(strip_version_suffix("gemini-2.0-flash-exp"), "gemini-2.0-flash"); + assert_eq!( + strip_version_suffix("gemini-2.0-flash-thinking-exp-01-21"), + "gemini-2.0-flash-thinking" + ); + } + + #[test] + fn test_strip_version_suffix_preview() { + assert_eq!(strip_version_suffix("gemini-2.5-flash-preview"), "gemini-2.5-flash"); + assert_eq!( + strip_version_suffix("gemini-2.5-flash-preview-05-20"), + "gemini-2.5-flash" + ); + assert_eq!( + strip_version_suffix("gemini-2.5-flash-lite-preview-09"), + "gemini-2.5-flash-lite" + ); + } + + #[test] + fn test_strip_version_suffix_multiple_patterns() { + // Should handle preview followed by date + assert_eq!( + strip_version_suffix("gemini-2.5-pro-preview-03-25"), + "gemini-2.5-pro" + ); + } + + #[test] + fn test_normalize_version_numbers() { + // Anthropic models use dashes (3-5) while OpenRouter uses dots (3.5) + assert_eq!(strip_version_suffix("claude-3-5-haiku"), "claude-3.5-haiku"); + assert_eq!(strip_version_suffix("claude-3-7-sonnet"), "claude-3.7-sonnet"); + // When model name ends with version like "claude-haiku-4-5", it normalizes to 4.5 then strips it + assert_eq!(strip_version_suffix("claude-haiku-4-5"), "claude-haiku"); + assert_eq!(strip_version_suffix("claude-opus-4-1"), "claude-opus"); + } + + #[test] + fn test_normalize_and_strip() { + // Should normalize version numbers AND strip date suffixes + assert_eq!( + strip_version_suffix("claude-3-5-haiku-20241022"), + "claude-3.5-haiku" + ); + assert_eq!( + strip_version_suffix("claude-3-7-sonnet-20250219"), + "claude-3.7-sonnet" + ); + assert_eq!( + strip_version_suffix("claude-haiku-4-5-20251001"), + "claude-haiku" + ); + assert_eq!( + strip_version_suffix("claude-sonnet-4-5-20250929"), + "claude-sonnet" + ); } } diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs index daa790103956..9df3b3cd90b7 100644 --- a/crates/goose/src/providers/canonical/registry.rs +++ b/crates/goose/src/providers/canonical/registry.rs @@ -1,8 +1,24 @@ use super::CanonicalModel; use anyhow::{Context, Result}; +use once_cell::sync::Lazy; use std::collections::HashMap; use std::path::Path; +/// Cached bundled canonical model registry +static BUNDLED_REGISTRY: Lazy> = Lazy::new(|| { + const CANONICAL_MODELS_JSON: &str = include_str!("canonical_models.json"); + + let models: Vec = serde_json::from_str(CANONICAL_MODELS_JSON) + .context("Failed to parse bundled canonical models JSON")?; + + let mut registry = CanonicalModelRegistry::new(); + for model in models { + registry.register(model); + } + + Ok(registry) +}); + /// Registry for managing canonical models #[derive(Debug, Clone)] pub struct CanonicalModelRegistry { @@ -17,6 +33,19 @@ impl CanonicalModelRegistry { } } + /// Load registry from the bundled canonical_models.json file + /// This uses a cached version for performance + pub fn bundled() -> Result { + BUNDLED_REGISTRY.as_ref().map(|r| r.clone()).map_err(|e| anyhow::anyhow!("{}", e)) + } + + /// Check if a canonical model exists in the bundled registry (faster than loading the whole registry) + pub fn bundled_contains(name: &str) -> Result { + BUNDLED_REGISTRY.as_ref() + .map(|r| r.contains(name)) + .map_err(|e| anyhow::anyhow!("{}", e)) + } + /// Load registry from a JSON file pub fn from_file(path: impl AsRef) -> Result { let content = std::fs::read_to_string(path.as_ref()) diff --git a/crates/goose/src/providers/google.rs b/crates/goose/src/providers/google.rs index 6f73268aa5e2..f2800315150f 100644 --- a/crates/goose/src/providers/google.rs +++ b/crates/goose/src/providers/google.rs @@ -1,4 +1,5 @@ use super::api_client::{ApiClient, AuthMethod}; +use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::retry::ProviderRetry; use super::utils::{handle_response_google_compat, unescape_json_values, RequestLog}; @@ -147,4 +148,15 @@ impl Provider for GoogleProvider { models.sort(); Ok(Some(models)) } + + async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { + let canonical = canonical_name("google", provider_model); + + // Check if this canonical model exists in our registry + if CanonicalModelRegistry::bundled_contains(&canonical)? { + Ok(Some(canonical)) + } else { + Ok(None) + } + } } diff --git a/crates/goose/src/providers/openai.rs b/crates/goose/src/providers/openai.rs index dca3c0c6bdd7..9e667dcbfcff 100644 --- a/crates/goose/src/providers/openai.rs +++ b/crates/goose/src/providers/openai.rs @@ -13,6 +13,7 @@ use tokio_util::io::StreamReader; use super::api_client::{ApiClient, AuthMethod}; use super::base::{ConfigKey, ModelInfo, Provider, ProviderMetadata, ProviderUsage, Usage}; +use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::embedding::{EmbeddingCapable, EmbeddingRequest, EmbeddingResponse}; use super::errors::ProviderError; use super::formats::openai::{create_request, get_usage, response_to_message}; @@ -299,6 +300,17 @@ impl Provider for OpenAiProvider { Ok(Some(models)) } + async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { + let canonical = canonical_name("openai", provider_model); + + // Check if this canonical model exists in our registry + if CanonicalModelRegistry::bundled_contains(&canonical)? { + Ok(Some(canonical)) + } else { + Ok(None) + } + } + fn supports_embeddings(&self) -> bool { true } diff --git a/crates/goose/src/providers/openrouter.rs b/crates/goose/src/providers/openrouter.rs index 9869584d1bfb..73cc6b311002 100644 --- a/crates/goose/src/providers/openrouter.rs +++ b/crates/goose/src/providers/openrouter.rs @@ -4,6 +4,7 @@ use serde_json::{json, Value}; use super::api_client::{ApiClient, AuthMethod}; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage}; +use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::retry::ProviderRetry; use super::utils::{ @@ -366,6 +367,18 @@ impl Provider for OpenRouterProvider { Ok(Some(models)) } + async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { + // OpenRouter models are already in canonical format (e.g., "anthropic/claude-3-5-sonnet") + let canonical = canonical_name("openrouter", provider_model); + + // Check if this canonical model exists in our registry + if CanonicalModelRegistry::bundled_contains(&canonical)? { + Ok(Some(canonical)) + } else { + Ok(None) + } + } + async fn supports_cache_control(&self) -> bool { self.model .model_name From 0b442b3688ee1e77e167496cd3690483befd273b Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 12 Nov 2025 17:37:44 -0500 Subject: [PATCH 09/52] more parsing fixes --- canonical_mapping_report.json | 650 +++++++++--------- .../goose/examples/build_canonical_models.rs | 22 +- .../providers/canonical/canonical_models.json | 623 ++++++++++------- crates/goose/src/providers/canonical/model.rs | 40 +- .../src/providers/canonical/name_builder.rs | 38 +- 5 files changed, 769 insertions(+), 604 deletions(-) diff --git a/canonical_mapping_report.json b/canonical_mapping_report.json index 155edc944dbc..d6335c989fa1 100644 --- a/canonical_mapping_report.json +++ b/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-12T19:02:28.386534+00:00", + "timestamp": "2025-11-12T19:12:39.449555+00:00", "unmapped_models": [ { "provider": "openai", @@ -3555,675 +3555,675 @@ } ], "all_mappings": { - "anthropic": [ + "openai": [ { - "provider_model": "claude-3-5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", "verified": true }, { - "provider_model": "claude-3-7-sonnet-20250219", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "claude-3-haiku-20240307", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "claude-3-opus-20240229", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "claude-haiku-4-5-20251001", - "canonical_model": "anthropic/claude-haiku", + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "claude-opus-4-1-20250805", - "canonical_model": "anthropic/claude-opus", + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "claude-opus-4-20250514", - "canonical_model": "anthropic/claude-opus", + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "claude-sonnet-4-20250514", - "canonical_model": "anthropic/claude-sonnet", + "provider_model": "gpt-4", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "claude-sonnet-4-5-20250929", - "canonical_model": "anthropic/claude-sonnet", + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt", "verified": true - } - ], - "tetrate": [], - "openrouter": [ + }, { - "provider_model": "anthropic/claude-3-haiku", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "anthropic/claude-3-opus", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet-20240620", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet:thinking", - "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "anthropic/claude-haiku", + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "anthropic/claude-opus", + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "anthropic/claude-opus", + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet", + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "anthropic/claude-sonnet", + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4o-audio-preview-2024-10-01", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/codex-mini", - "canonical_model": "openai/codex-mini", + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-0613", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-5", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "openai/gpt-4", - "canonical_model": "openai/gpt", + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "openai/gpt-4-0314", - "canonical_model": "openai/gpt", + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-4-1106-preview", - "canonical_model": "openai/gpt", + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openai/gpt", + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/gpt-4o:extended", - "canonical_model": "openai/gpt-4o:extended", + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openai/gpt", + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openai/gpt-5-image", + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/gpt-5-image-mini", - "canonical_model": "openai/gpt-5-image-mini", + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "openai/gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + } + ], + "databricks": [], + "anthropic": [ + { + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openai/gpt-oss-120b:exacto", + "provider_model": "claude-3-haiku-20240307", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openai/gpt-oss-20b", + "provider_model": "claude-3-opus-20240229", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openai/gpt-oss-safeguard-20b", + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku", "verified": true }, { - "provider_model": "openai/o1", - "canonical_model": "openai/o1", + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus", "verified": true }, { - "provider_model": "openai/o3", - "canonical_model": "openai/o3", + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus", "verified": true }, { - "provider_model": "openai/o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet", "verified": true }, { - "provider_model": "openai/o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet", + "verified": true + } + ], + "openrouter": [ + { + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "openai/o3-mini-high", - "canonical_model": "openai/o3-mini-high", + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "openai/o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "openai/o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "openai/o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "openai/o4-mini-high", - "canonical_model": "openai/o4-mini-high", + "provider_model": "anthropic/claude-3.5-sonnet-20240620", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true - } - ], - "openai": [ + }, { - "provider_model": "chatgpt-4o-latest", - "canonical_model": "openai/chatgpt-4o-latest", + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", "verified": true }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus", "verified": true }, { - "provider_model": "gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct-0914", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet", "verified": true }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "gpt-4-0125-preview", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4-1106-preview", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt", + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt", + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", "verified": true }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-10-01", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-12-17", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2025-06-03", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "gpt-4o-search-preview", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-4o-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt", + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", "verified": true }, { - "provider_model": "gpt-5-2025-08-07", + "provider_model": "openai/gpt-5", "canonical_model": "openai/gpt", "verified": true }, { - "provider_model": "gpt-5-codex", + "provider_model": "openai/gpt-5-codex", "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", "verified": true }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", "verified": true }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "gpt-5-nano-2025-08-07", + "provider_model": "openai/gpt-5-nano", "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", - "verified": true - }, - { - "provider_model": "gpt-5-pro-2025-10-06", + "provider_model": "openai/gpt-5-pro", "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "o1", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b:exacto", "verified": true }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", "verified": true }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", "verified": true }, { - "provider_model": "o3", - "canonical_model": "openai/o3", + "provider_model": "openai/o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "o3-2025-04-16", + "provider_model": "openai/o3", "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research", - "verified": true - }, - { - "provider_model": "o3-deep-research-2025-06-26", + "provider_model": "openai/o3-deep-research", "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini", - "verified": true - }, - { - "provider_model": "o3-mini-2025-01-31", + "provider_model": "openai/o3-mini", "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", "verified": true }, { - "provider_model": "o3-pro-2025-06-10", + "provider_model": "openai/o3-pro", "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini", - "verified": true - }, - { - "provider_model": "o4-mini-2025-04-16", + "provider_model": "openai/o4-mini", "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "o4-mini-deep-research", + "provider_model": "openai/o4-mini-deep-research", "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", "verified": true } ], @@ -4344,70 +4344,70 @@ "verified": true } ], - "databricks": [] + "tetrate": [] }, "model_counts": { - "openai": 625, - "openrouter": 217, - "google": 50, "anthropic": 9, + "databricks": 143, "tetrate": 0, - "databricks": 143 + "openai": 625, + "openrouter": 217, + "google": 50 }, "canonical_models_used": [ + "openai/o1", + "openai/o1-pro", + "openai/gpt-4-turbo", + "google/gemini-2.5-pro", + "openai/chatgpt-4o-latest", + "openai/o4-mini", + "anthropic/claude-haiku", + "openai/gpt-4.1-mini", + "openai/gpt-3.5-turbo-instruct", + "google/gemini-2.5-flash-lite", "openai/gpt-oss-20b", - "anthropic/claude-3.5-sonnet", - "anthropic/claude-3-haiku", + "openai/o3-mini", + "openai/o3-pro", "openai/gpt-4o-audio", - "google/gemma-3-4b-it", - "openai/gpt-4.1-nano", - "google/gemini-2.5-flash-image", - "google/gemini-2.5-flash", - "anthropic/claude-haiku", - "openai/gpt-5-image", - "openai/gpt-3.5-turbo-16k", - "anthropic/claude-sonnet", - "openai/o3-deep-research", + "openai/gpt-oss-safeguard-20b", + "google/gemma-3-12b-it", "anthropic/claude-3-opus", - "openai/chatgpt-4o-latest", - "openai/gpt-4-turbo", + "anthropic/claude-sonnet", + "anthropic/claude-opus", + "anthropic/claude-3.7-sonnet", + "openai/o4-mini-deep-research", "anthropic/claude-3.5-haiku", - "openai/gpt-4o-search", - "openai/gpt-3.5-turbo-instruct", "openai/gpt", - "openai/o4-mini", - "openai/gpt-5-mini", - "openai/gpt-4o:extended", - "openai/gpt-oss-120b:exacto", - "openai/o4-mini-high", - "openai/gpt-oss-safeguard-20b", + "openai/gpt-4o-search", + "openai/gpt-4.1-nano", + "openai/gpt-3.5-turbo-16k", + "anthropic/claude-3.7-sonnet:thinking", + "anthropic/claude-3.5-sonnet", + "openai/gpt-4o", + "anthropic/claude-3-haiku", "openai/gpt-4o-mini", - "openai/gpt-4o-mini-search", - "google/gemini-2.0-flash", - "openai/o3-mini-high", - "google/gemma-3-12b-it", + "openai/o3", "openai/gpt-5-nano", - "openai/gpt-3.5-turbo", - "google/gemma-3n-e4b-it", - "openai/o3-mini", - "google/gemini-2.5-flash-lite", + "openai/gpt-5-image-mini", + "openai/codex-mini", + "openai/o3-mini-high", "openai/gpt-5-codex", - "openai/o3", - "anthropic/claude-opus", - "openai/o3-pro", - "openai/o1-pro", - "google/gemini-2.0-flash-lite", - "openai/gpt-4o", "google/gemma-3-27b-it", "openai/gpt-oss-120b", - "openai/o4-mini-deep-research", - "google/gemini-2.5-pro", - "openai/gpt-4.1-mini", - "openai/gpt-5-image-mini", - "openai/codex-mini", - "anthropic/claude-3.7-sonnet", + "google/gemma-3-4b-it", + "google/gemma-3n-e4b-it", + "openai/o4-mini-high", + "openai/o3-deep-research", + "google/gemini-2.0-flash-lite", + "openai/gpt-oss-120b:exacto", + "google/gemini-2.5-flash", "openai/gpt-5-pro", - "anthropic/claude-3.7-sonnet:thinking", - "openai/o1" + "openai/gpt-4o:extended", + "openai/gpt-5-image", + "google/gemini-2.0-flash", + "openai/gpt-3.5-turbo", + "google/gemini-2.5-flash-image", + "openai/gpt-4o-mini-search", + "openai/gpt-5-mini" ] } \ No newline at end of file diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 192ba663a283..f2b42d8f97fd 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -115,25 +115,36 @@ fn main() -> Result<()> { } .to_string(); - // Parse pricing + // Check if model supports tool calling + let supports_tools = model + .get("supported_parameters") + .and_then(|v| v.as_array()) + .map(|params| { + params + .iter() + .any(|param| param.as_str() == Some("tools")) + }) + .unwrap_or(false); + + // Parse pricing (convert strings to f64) let pricing_obj = model.get("pricing").unwrap(); let pricing = Pricing { prompt: pricing_obj .get("prompt") .and_then(|v| v.as_str()) - .map(|s| s.to_string()), + .and_then(|s| s.parse().ok()), completion: pricing_obj .get("completion") .and_then(|v| v.as_str()) - .map(|s| s.to_string()), + .and_then(|s| s.parse().ok()), request: pricing_obj .get("request") .and_then(|v| v.as_str()) - .map(|s| s.to_string()), + .and_then(|s| s.parse().ok()), image: pricing_obj .get("image") .and_then(|v| v.as_str()) - .map(|s| s.to_string()), + .and_then(|s| s.parse().ok()), audio: None, // Not in OpenRouter API web_search: None, // Not in OpenRouter API internal_reasoning: None, // Not in OpenRouter API @@ -149,6 +160,7 @@ fn main() -> Result<()> { input_modalities, output_modalities, tokenizer, + supports_tools, pricing, }; diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/canonical_models.json index e8b79e44672a..20378d0c3ea1 100644 --- a/crates/goose/src/providers/canonical/canonical_models.json +++ b/crates/goose/src/providers/canonical/canonical_models.json @@ -11,11 +11,12 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.00000025", - "completion": "0.00000125", - "request": "0", - "image": "0.0004" + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 } }, { @@ -30,11 +31,12 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "request": "0", - "image": "0.024" + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 } }, { @@ -49,11 +51,12 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.0000008", - "completion": "0.000004", - "request": "0", - "image": "0" + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 } }, { @@ -68,11 +71,12 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048" + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 } }, { @@ -87,11 +91,12 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048" + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 } }, { @@ -106,15 +111,16 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048" + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 } }, { - "id": "anthropic/claude-haiku", + "id": "anthropic/claude-haiku-4.5", "name": "Anthropic: Claude Haiku 4.5", "context_length": 200000, "max_completion_tokens": 64000, @@ -125,15 +131,16 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000001", - "completion": "0.000005", - "request": "0", - "image": "0" + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 } }, { - "id": "anthropic/claude-opus", + "id": "anthropic/claude-opus-4", "name": "Anthropic: Claude Opus 4", "context_length": 200000, "max_completion_tokens": 32000, @@ -144,15 +151,36 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000015", - "completion": "0.000075", - "request": "0", - "image": "0.024" + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 } }, { - "id": "anthropic/claude-sonnet", + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", "name": "Anthropic: Claude Sonnet 4", "context_length": 1000000, "max_completion_tokens": 64000, @@ -163,11 +191,32 @@ "text" ], "tokenizer": "Claude", + "supports_tools": true, "pricing": { - "prompt": "0.000003", - "completion": "0.000015", - "request": "0", - "image": "0.0048" + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 } }, { @@ -182,11 +231,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": true, "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0.0000258" + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 } }, { @@ -201,11 +251,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": true, "pricing": { - "prompt": "0.000000075", - "completion": "0.0000003", - "request": "0", - "image": "0" + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -220,11 +271,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": true, "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "request": "0", - "image": "0.001238" + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 } }, { @@ -239,11 +291,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": false, "pricing": { - "prompt": "0.0000003", - "completion": "0.0000025", - "request": "0", - "image": "0.001238" + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 } }, { @@ -258,11 +311,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": true, "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0" + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -277,11 +331,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": true, "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0.00516" + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 } }, { @@ -295,11 +350,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": false, "pricing": { - "prompt": "0.00000065", - "completion": "0.00000065", - "request": "0", - "image": "0" + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -313,11 +369,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": false, "pricing": { - "prompt": "0.00000003", - "completion": "0.00000009", - "request": "0", - "image": "0" + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 } }, { @@ -332,11 +389,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": false, "pricing": { - "prompt": "0.00000003", - "completion": "0.0000001", - "request": "0", - "image": "0" + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -351,11 +409,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": true, "pricing": { - "prompt": "0.00000009", - "completion": "0.00000016", - "request": "0", - "image": "0.0000256" + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 } }, { @@ -369,11 +428,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": false, "pricing": { - "prompt": "0.00000001703012", - "completion": "0.0000000681536", - "request": "0", - "image": "0" + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 } }, { @@ -387,11 +447,12 @@ "text" ], "tokenizer": "Gemini", + "supports_tools": false, "pricing": { - "prompt": "0.00000002", - "completion": "0.00000004", - "request": "0", - "image": "0" + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 } }, { @@ -406,11 +467,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": false, "pricing": { - "prompt": "0.000005", - "completion": "0.000015", - "request": "0", - "image": "0.007225" + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 } }, { @@ -425,18 +487,19 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000015", - "completion": "0.000006", - "request": "0", - "image": "0" + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 } }, { - "id": "openai/gpt", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, "input_modalities": [ "text" ], @@ -444,16 +507,17 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0" + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 } }, { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", "context_length": 16385, "max_completion_tokens": 4096, "input_modalities": [ @@ -463,17 +527,18 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000005", - "completion": "0.0000015", - "request": "0", - "image": "0" + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 } }, { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, "max_completion_tokens": 4096, "input_modalities": [ "text" @@ -482,17 +547,18 @@ "text" ], "tokenizer": "GPT", + "supports_tools": false, "pricing": { - "prompt": "0.000003", - "completion": "0.000004", - "request": "0", - "image": "0" + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 } }, { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, "max_completion_tokens": 4096, "input_modalities": [ "text" @@ -501,11 +567,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000015", - "completion": "0.000002", - "request": "0", - "image": "0" + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 } }, { @@ -520,11 +587,32 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00001", - "completion": "0.00003", - "request": "0", - "image": "0.01445" + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 } }, { @@ -539,11 +627,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000004", - "completion": "0.0000016", - "request": "0", - "image": "0" + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 } }, { @@ -558,11 +647,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000001", - "completion": "0.0000004", - "request": "0", - "image": "0" + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -577,11 +667,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0", - "image": "0.003613" + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 } }, { @@ -596,11 +687,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0", - "image": "0" + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 } }, { @@ -615,11 +707,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "request": "0", - "image": "0.000217" + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 } }, { @@ -634,11 +727,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": false, "pricing": { - "prompt": "0.00000015", - "completion": "0.0000006", - "request": "0.0275", - "image": "0.000217" + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 } }, { @@ -653,11 +747,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": false, "pricing": { - "prompt": "0.0000025", - "completion": "0.00001", - "request": "0.035", - "image": "0.003613" + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 } }, { @@ -672,11 +767,32 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.000006", - "completion": "0.000018", - "request": "0", - "image": "0.007225" + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 } }, { @@ -691,11 +807,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": false, "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0" + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 } }, { @@ -710,11 +827,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000125", - "completion": "0.00001", - "request": "0", - "image": "0" + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 } }, { @@ -729,11 +847,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00001", - "completion": "0.00001", - "request": "0", - "image": "0.00001" + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 } }, { @@ -748,11 +867,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000025", - "completion": "0.000002", - "request": "0", - "image": "0.0000025" + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 } }, { @@ -767,11 +887,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000025", - "completion": "0.000002", - "request": "0", - "image": "0" + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 } }, { @@ -786,11 +907,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000005", - "completion": "0.0000004", - "request": "0", - "image": "0" + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -805,11 +927,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.000015", - "completion": "0.00012", - "request": "0", - "image": "0" + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 } }, { @@ -824,11 +947,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000004", - "completion": "0.0000004", - "request": "0", - "image": "0" + "prompt": 4e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -842,11 +966,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000005", - "completion": "0.00000024", - "request": "0", - "image": "0" + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -860,11 +985,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00000003", - "completion": "0.00000014", - "request": "0", - "image": "0" + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -879,11 +1005,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.000000075", - "completion": "0.0000003", - "request": "0", - "image": "0" + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 } }, { @@ -898,11 +1025,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.000015", - "completion": "0.00006", - "request": "0", - "image": "0.021675" + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 } }, { @@ -917,11 +1045,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": false, "pricing": { - "prompt": "0.00015", - "completion": "0.0006", - "request": "0", - "image": "0.21675" + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 } }, { @@ -936,11 +1065,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "request": "0", - "image": "0.00153" + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 } }, { @@ -955,11 +1085,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00001", - "completion": "0.00004", - "request": "0", - "image": "0.00765" + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 } }, { @@ -974,11 +1105,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0" + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 } }, { @@ -993,11 +1125,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0" + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 } }, { @@ -1012,11 +1145,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.00002", - "completion": "0.00008", - "request": "0", - "image": "0.0153" + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 } }, { @@ -1031,11 +1165,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0.0008415" + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 } }, { @@ -1050,11 +1185,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.000002", - "completion": "0.000008", - "request": "0", - "image": "0.00153" + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 } }, { @@ -1069,11 +1205,12 @@ "text" ], "tokenizer": "GPT", + "supports_tools": true, "pricing": { - "prompt": "0.0000011", - "completion": "0.0000044", - "request": "0", - "image": "0.0008415" + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 } } ] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index c093fe7a43c5..c4f48dda3e87 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -1,55 +1,43 @@ use serde::{Deserialize, Serialize}; -/// Pricing information for a model (all costs in USD per token as strings) +/// Pricing information for a model (all costs in USD per token) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Pricing { /// Cost per prompt token #[serde(skip_serializing_if = "Option::is_none")] - pub prompt: Option, + pub prompt: Option, /// Cost per completion token #[serde(skip_serializing_if = "Option::is_none")] - pub completion: Option, + pub completion: Option, /// Cost per request #[serde(skip_serializing_if = "Option::is_none")] - pub request: Option, + pub request: Option, /// Cost per image #[serde(skip_serializing_if = "Option::is_none")] - pub image: Option, + pub image: Option, /// Cost per audio token/unit #[serde(skip_serializing_if = "Option::is_none")] - pub audio: Option, + pub audio: Option, /// Cost for web search #[serde(skip_serializing_if = "Option::is_none")] - pub web_search: Option, + pub web_search: Option, /// Cost for internal reasoning tokens #[serde(skip_serializing_if = "Option::is_none")] - pub internal_reasoning: Option, + pub internal_reasoning: Option, /// Cost for input cache reads #[serde(skip_serializing_if = "Option::is_none")] - pub input_cache_read: Option, + pub input_cache_read: Option, /// Cost for input cache writes #[serde(skip_serializing_if = "Option::is_none")] - pub input_cache_write: Option, -} - -impl Pricing { - /// Parse prompt cost as f64 (cost per token) - pub fn prompt_cost(&self) -> Option { - self.prompt.as_ref().and_then(|s| s.parse().ok()) - } - - /// Parse completion cost as f64 (cost per token) - pub fn completion_cost(&self) -> Option { - self.completion.as_ref().and_then(|s| s.parse().ok()) - } + pub input_cache_write: Option, } /// Canonical representation of a model @@ -79,6 +67,10 @@ pub struct CanonicalModel { /// Tokenizer type (e.g., "GPT", "Claude", "Gemini") pub tokenizer: String, + /// Whether the model supports tool calling + #[serde(default)] + pub supports_tools: bool, + /// Pricing for this model pub pricing: Pricing, } @@ -120,11 +112,11 @@ impl CanonicalModel { /// Get prompt cost as f64 (cost per token) pub fn prompt_cost(&self) -> Option { - self.pricing.prompt_cost() + self.pricing.prompt } /// Get completion cost as f64 (cost per token) pub fn completion_cost(&self) -> Option { - self.pricing.completion_cost() + self.pricing.completion } } diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index c90f3d003bc8..f7fb7626ba76 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -27,12 +27,14 @@ pub fn canonical_name(provider: &str, model: &str) -> String { /// First normalizes version numbers (e.g., `-3-5-` → `-3.5-`), then strips: /// - `-20241022` (8-digit dates) /// - `-2024-04-09` (YYYY-MM-DD dates) -/// - `-002` or `-v1.5` (version numbers) +/// - `-002`, `-001` (patch versions: 3+ digits only, preserves model family like `-4`, `-4.5`) +/// - `-v1.5` (semantic versions with "v" prefix) /// - `-exp`, `-exp-1219`, `-exp-01-21` (experimental suffixes) /// - `-preview`, `-preview-09`, `-preview-05-20` (preview suffixes) /// /// Examples: /// - `strip_version_suffix("claude-3-5-sonnet-20241022")` → `"claude-3.5-sonnet"` +/// - `strip_version_suffix("claude-sonnet-4.5")` → `"claude-sonnet-4.5"` (preserves model family) /// - `strip_version_suffix("gpt-4-turbo-2024-04-09")` → `"gpt-4-turbo"` /// - `strip_version_suffix("gemini-1.5-pro-002")` → `"gemini-1.5-pro"` /// - `strip_version_suffix("gemini-2.0-flash-exp")` → `"gemini-2.0-flash"` @@ -49,7 +51,8 @@ pub fn strip_version_suffix(model: &str) -> String { regex::Regex::new(r"-exp(-\d+)*$").unwrap(), // -exp, -exp-1219, -exp-01-21 regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 regex::Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), // -2024-04-09 - regex::Regex::new(r"-v?\d+(\.\d+)*$").unwrap(), // -v1.5 or -002 + regex::Regex::new(r"-v\d+(\.\d+)*$").unwrap(), // -v1.5 (semantic versions with "v" prefix) + regex::Regex::new(r"-\d{3,}$").unwrap(), // -002, -001 (patch versions: 3+ digits only) ]; // Apply patterns multiple times to handle cases like "-preview-09-2025" @@ -134,8 +137,12 @@ mod tests { #[test] fn test_strip_version_suffix_version_number() { + // Patch versions (3+ digits) are stripped assert_eq!(strip_version_suffix("gemini-1.5-pro-002"), "gemini-1.5-pro"); + assert_eq!(strip_version_suffix("gemini-1.5-pro-001"), "gemini-1.5-pro"); + // Semantic versions with "v" prefix are stripped assert_eq!(strip_version_suffix("model-v1.5"), "model"); + assert_eq!(strip_version_suffix("model-v2.0"), "model"); } #[test] @@ -179,9 +186,11 @@ mod tests { // Anthropic models use dashes (3-5) while OpenRouter uses dots (3.5) assert_eq!(strip_version_suffix("claude-3-5-haiku"), "claude-3.5-haiku"); assert_eq!(strip_version_suffix("claude-3-7-sonnet"), "claude-3.7-sonnet"); - // When model name ends with version like "claude-haiku-4-5", it normalizes to 4.5 then strips it - assert_eq!(strip_version_suffix("claude-haiku-4-5"), "claude-haiku"); - assert_eq!(strip_version_suffix("claude-opus-4-1"), "claude-opus"); + // Model family numbers are preserved (not stripped) + assert_eq!(strip_version_suffix("claude-haiku-4-5"), "claude-haiku-4.5"); + assert_eq!(strip_version_suffix("claude-opus-4-1"), "claude-opus-4.1"); + assert_eq!(strip_version_suffix("claude-sonnet-4-5"), "claude-sonnet-4.5"); + assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); } #[test] @@ -195,13 +204,28 @@ mod tests { strip_version_suffix("claude-3-7-sonnet-20250219"), "claude-3.7-sonnet" ); + // Model family numbers are preserved, only dates stripped assert_eq!( strip_version_suffix("claude-haiku-4-5-20251001"), - "claude-haiku" + "claude-haiku-4.5" ); assert_eq!( strip_version_suffix("claude-sonnet-4-5-20250929"), - "claude-sonnet" + "claude-sonnet-4.5" ); } + + #[test] + fn test_preserve_model_family_versions() { + // Model family identifiers (1-2 digits) should be preserved + assert_eq!(strip_version_suffix("claude-sonnet-4.5"), "claude-sonnet-4.5"); + assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); + assert_eq!(strip_version_suffix("claude-haiku-4.5"), "claude-haiku-4.5"); + assert_eq!(strip_version_suffix("gpt-4-turbo"), "gpt-4-turbo"); + assert_eq!(strip_version_suffix("gpt-3.5-turbo"), "gpt-3.5-turbo"); + + // But patch versions (3+ digits) are still stripped + assert_eq!(strip_version_suffix("model-002"), "model"); + assert_eq!(strip_version_suffix("model-123"), "model"); + } } From 2233f11a4c00e9131e4091983a0cebb93cdc544f Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 13 Nov 2025 00:53:00 -0500 Subject: [PATCH 10/52] del old script --- .../goose/examples/fetch_canonical_models.rs | 94 ------------------- .../goose/src/providers/canonical/README.md | 16 ++-- 2 files changed, 10 insertions(+), 100 deletions(-) delete mode 100644 crates/goose/examples/fetch_canonical_models.rs diff --git a/crates/goose/examples/fetch_canonical_models.rs b/crates/goose/examples/fetch_canonical_models.rs deleted file mode 100644 index 947310b50d80..000000000000 --- a/crates/goose/examples/fetch_canonical_models.rs +++ /dev/null @@ -1,94 +0,0 @@ -/// Fetch Canonical Models from OpenRouter -/// -/// This script fetches model metadata from OpenRouter's API and generates -/// a canonical_models.json file with standardized model information. -/// -/// Usage: -/// cargo run --example fetch_canonical_models -/// -/// The generated file will be written to: -/// crates/goose/src/providers/canonical/canonical_models.json -/// - -use anyhow::{Context, Result}; -use goose::providers::canonical::{CanonicalModel, CanonicalModelRegistry}; -use serde::Deserialize; -use std::path::PathBuf; - -#[derive(Debug, Deserialize)] -struct OpenRouterResponse { - data: Vec, -} - -const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/models"; - -// Providers we want to include -const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai"]; - -#[tokio::main] -async fn main() -> Result<()> { - println!("Fetching models from OpenRouter API...\n"); - - // Fetch models from OpenRouter - let client = reqwest::Client::new(); - let response = client - .get(OPENROUTER_API_URL) - .header("User-Agent", "goose/canonical-fetcher") - .send() - .await - .context("Failed to fetch from OpenRouter API")?; - - let openrouter_response: OpenRouterResponse = response - .json() - .await - .context("Failed to parse OpenRouter response")?; - - println!("✓ Fetched {} models from OpenRouter\n", openrouter_response.data.len()); - - // Filter to only allowed providers - let filtered_models: Vec = openrouter_response - .data - .into_iter() - .filter(|model| { - if let Some(provider) = model.provider() { - ALLOWED_PROVIDERS.contains(&provider) - } else { - false - } - }) - .collect(); - - println!("Filtered to {} models from allowed providers:", filtered_models.len()); - - // Count models per provider - let mut provider_counts: std::collections::HashMap = std::collections::HashMap::new(); - for model in &filtered_models { - if let Some(provider) = model.provider() { - *provider_counts.entry(provider.to_string()).or_insert(0) += 1; - } - } - - let mut providers: Vec<_> = provider_counts.iter().collect(); - providers.sort_by_key(|(name, _)| *name); - for (provider, count) in providers { - println!(" {}: {} models", provider, count); - } - - // Create registry and add models - let mut registry = CanonicalModelRegistry::new(); - for model in filtered_models { - registry.register(model); - } - - // Determine output path - let output_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("src/providers/canonical/canonical_models.json"); - - // Save to file - registry.to_file(&output_path) - .context("Failed to save canonical models file")?; - - println!("\n✓ Saved {} models to: {}", registry.count(), output_path.display()); - - Ok(()) -} diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 2ae0475df23a..81320d08de21 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -44,13 +44,17 @@ JSON file containing canonical model definitions fetched from OpenRouter. Curren To refresh the canonical models from OpenRouter's API: ```bash -cargo run --example fetch_canonical_models +cargo run --example build_canonical_models ``` This script: 1. Fetches all models from OpenRouter's `/models` endpoint -2. Filters to only allowed providers (anthropic, google, openai) -3. Generates a new `canonical_models.json` file +2. Transforms the data into our canonical format: + - Strips version suffixes while preserving model family versions + - Detects tool support from `supported_parameters` + - Converts pricing strings to numeric types +3. Filters to only allowed providers (anthropic, google, openai) +4. Generates a new `canonical_models.json` file The generated file will be written to: ``` @@ -135,14 +139,14 @@ This will: To add support for a new provider (e.g., "mistral"): -1. Update the `ALLOWED_PROVIDERS` list in `examples/fetch_canonical_models.rs`: +1. Update the `ALLOWED_PROVIDERS` list in `examples/build_canonical_models.rs`: ```rust const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai", "mistral"]; ``` -2. Re-run the fetch script: +2. Re-run the build script: ```bash - cargo run --example fetch_canonical_models + cargo run --example build_canonical_models ``` ## Model Metadata Fields From 9662095cf1e181512049b0bbd6991ec3f9375d48 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 13 Nov 2025 12:31:03 -0500 Subject: [PATCH 11/52] move models --- .../goose/examples/build_canonical_models.rs | 46 +++++++++++++------ crates/goose/src/providers/anthropic.rs | 12 ----- crates/goose/src/providers/base.rs | 14 ++++-- .../goose/src/providers/canonical/README.md | 5 +- .../{ => data}/canonical_models.json | 0 crates/goose/src/providers/canonical/model.rs | 25 ---------- .../goose/src/providers/canonical/registry.rs | 2 +- crates/goose/src/providers/google.rs | 12 ----- crates/goose/src/providers/openai.rs | 12 ----- crates/goose/src/providers/openrouter.rs | 13 ------ 10 files changed, 46 insertions(+), 95 deletions(-) rename crates/goose/src/providers/canonical/{ => data}/canonical_models.json (100%) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index f2b42d8f97fd..00a04175cb33 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -9,15 +9,30 @@ use goose::providers::canonical::{canonical_name, CanonicalModel, CanonicalModel use serde_json::Value; use std::collections::HashMap; -fn main() -> Result<()> { - println!("Building canonical models from OpenRouter..."); - - // Read the fetched OpenRouter models - let content = std::fs::read_to_string("/tmp/openrouter_models.json") - .context("Failed to read /tmp/openrouter_models.json")?; - - let models: Vec = serde_json::from_str(&content) - .context("Failed to parse OpenRouter models")?; +const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/models"; + +#[tokio::main] +async fn main() -> Result<()> { + println!("Fetching models from OpenRouter API..."); + + // Fetch models from OpenRouter + let client = reqwest::Client::new(); + let response = client + .get(OPENROUTER_API_URL) + .header("User-Agent", "goose/canonical-builder") + .send() + .await + .context("Failed to fetch from OpenRouter API")?; + + let json: Value = response + .json() + .await + .context("Failed to parse OpenRouter response")?; + + let models = json["data"] + .as_array() + .context("Expected 'data' array in OpenRouter response")? + .clone(); println!("Processing {} models from OpenRouter...", models.len()); @@ -145,11 +160,6 @@ fn main() -> Result<()> { .get("image") .and_then(|v| v.as_str()) .and_then(|s| s.parse().ok()), - audio: None, // Not in OpenRouter API - web_search: None, // Not in OpenRouter API - internal_reasoning: None, // Not in OpenRouter API - input_cache_read: None, // Not in OpenRouter API - input_cache_write: None, // Not in OpenRouter API }; let canonical_model = CanonicalModel { @@ -168,9 +178,15 @@ fn main() -> Result<()> { } // Write to file - let output_path = "src/providers/canonical/canonical_models.json"; + let output_path = "src/providers/canonical/data/canonical_models.json"; registry.to_file(output_path)?; println!("\n✓ Wrote {} models to {}", registry.count(), output_path); + // Also write a timestamped report + let timestamp = chrono::Local::now().format("%Y%m%d_%H%M%S"); + let report_path = format!("src/providers/canonical/data/report_{}.json", timestamp); + registry.to_file(&report_path)?; + println!("✓ Wrote report to {}", report_path); + Ok(()) } diff --git a/crates/goose/src/providers/anthropic.rs b/crates/goose/src/providers/anthropic.rs index 2c5c24c70851..7f0d41be05f2 100644 --- a/crates/goose/src/providers/anthropic.rs +++ b/crates/goose/src/providers/anthropic.rs @@ -10,7 +10,6 @@ use tokio_util::io::StreamReader; use super::api_client::{ApiClient, ApiResponse, AuthMethod}; use super::base::{ConfigKey, MessageStream, ModelInfo, Provider, ProviderMetadata, ProviderUsage}; -use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::formats::anthropic::{ create_request, get_usage, response_to_message, response_to_streaming_message, @@ -255,17 +254,6 @@ impl Provider for AnthropicProvider { Ok(Some(models)) } - async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { - let canonical = canonical_name("anthropic", provider_model); - - // Check if this canonical model exists in our registry - if CanonicalModelRegistry::bundled_contains(&canonical)? { - Ok(Some(canonical)) - } else { - Ok(None) - } - } - async fn stream( &self, system: &str, diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index beba273ead5b..02777623676c 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -2,6 +2,7 @@ use anyhow::Result; use futures::Stream; use serde::{Deserialize, Serialize}; +use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::retry::RetryConfig; use crate::config::base::ConfigValue; @@ -417,9 +418,16 @@ pub trait Provider: Send + Sync { /// Map a provider-specific model name to a canonical model ID /// Returns the canonical model ID (e.g., "anthropic/claude-3-5-sonnet") if a mapping exists - /// Default implementation returns None (no mapping configured) - async fn map_to_canonical_model(&self, _provider_model: &str) -> Result, ProviderError> { - Ok(None) + /// Default implementation uses the provider's name and canonical_name() function + async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { + let canonical = canonical_name(self.get_name(), provider_model); + + // Check if this canonical model exists in our registry + if CanonicalModelRegistry::bundled_contains(&canonical)? { + Ok(Some(canonical)) + } else { + Ok(None) + } } fn supports_embeddings(&self) -> bool { diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 81320d08de21..4fd72a00a7aa 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -56,9 +56,10 @@ This script: 3. Filters to only allowed providers (anthropic, google, openai) 4. Generates a new `canonical_models.json` file -The generated file will be written to: +The generated files will be written to: ``` -crates/goose/src/providers/canonical/canonical_models.json +crates/goose/src/providers/canonical/data/canonical_models.json +crates/goose/src/providers/canonical/data/report_YYYYMMDD_HHMMSS.json ``` ## Usage diff --git a/crates/goose/src/providers/canonical/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json similarity index 100% rename from crates/goose/src/providers/canonical/canonical_models.json rename to crates/goose/src/providers/canonical/data/canonical_models.json diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index c4f48dda3e87..188effe9b262 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -18,26 +18,6 @@ pub struct Pricing { /// Cost per image #[serde(skip_serializing_if = "Option::is_none")] pub image: Option, - - /// Cost per audio token/unit - #[serde(skip_serializing_if = "Option::is_none")] - pub audio: Option, - - /// Cost for web search - #[serde(skip_serializing_if = "Option::is_none")] - pub web_search: Option, - - /// Cost for internal reasoning tokens - #[serde(skip_serializing_if = "Option::is_none")] - pub internal_reasoning: Option, - - /// Cost for input cache reads - #[serde(skip_serializing_if = "Option::is_none")] - pub input_cache_read: Option, - - /// Cost for input cache writes - #[serde(skip_serializing_if = "Option::is_none")] - pub input_cache_write: Option, } /// Canonical representation of a model @@ -76,11 +56,6 @@ pub struct CanonicalModel { } impl CanonicalModel { - /// Check if the model supports prompt caching - pub fn supports_cache(&self) -> bool { - self.pricing.input_cache_read.is_some() || self.pricing.input_cache_write.is_some() - } - /// Check if the model supports vision/image inputs pub fn supports_vision(&self) -> bool { self.input_modalities.contains(&"image".to_string()) diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs index 9df3b3cd90b7..f6ca32de7f24 100644 --- a/crates/goose/src/providers/canonical/registry.rs +++ b/crates/goose/src/providers/canonical/registry.rs @@ -6,7 +6,7 @@ use std::path::Path; /// Cached bundled canonical model registry static BUNDLED_REGISTRY: Lazy> = Lazy::new(|| { - const CANONICAL_MODELS_JSON: &str = include_str!("canonical_models.json"); + const CANONICAL_MODELS_JSON: &str = include_str!("data/canonical_models.json"); let models: Vec = serde_json::from_str(CANONICAL_MODELS_JSON) .context("Failed to parse bundled canonical models JSON")?; diff --git a/crates/goose/src/providers/google.rs b/crates/goose/src/providers/google.rs index f2800315150f..6f73268aa5e2 100644 --- a/crates/goose/src/providers/google.rs +++ b/crates/goose/src/providers/google.rs @@ -1,5 +1,4 @@ use super::api_client::{ApiClient, AuthMethod}; -use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::retry::ProviderRetry; use super::utils::{handle_response_google_compat, unescape_json_values, RequestLog}; @@ -148,15 +147,4 @@ impl Provider for GoogleProvider { models.sort(); Ok(Some(models)) } - - async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { - let canonical = canonical_name("google", provider_model); - - // Check if this canonical model exists in our registry - if CanonicalModelRegistry::bundled_contains(&canonical)? { - Ok(Some(canonical)) - } else { - Ok(None) - } - } } diff --git a/crates/goose/src/providers/openai.rs b/crates/goose/src/providers/openai.rs index 9e667dcbfcff..dca3c0c6bdd7 100644 --- a/crates/goose/src/providers/openai.rs +++ b/crates/goose/src/providers/openai.rs @@ -13,7 +13,6 @@ use tokio_util::io::StreamReader; use super::api_client::{ApiClient, AuthMethod}; use super::base::{ConfigKey, ModelInfo, Provider, ProviderMetadata, ProviderUsage, Usage}; -use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::embedding::{EmbeddingCapable, EmbeddingRequest, EmbeddingResponse}; use super::errors::ProviderError; use super::formats::openai::{create_request, get_usage, response_to_message}; @@ -300,17 +299,6 @@ impl Provider for OpenAiProvider { Ok(Some(models)) } - async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { - let canonical = canonical_name("openai", provider_model); - - // Check if this canonical model exists in our registry - if CanonicalModelRegistry::bundled_contains(&canonical)? { - Ok(Some(canonical)) - } else { - Ok(None) - } - } - fn supports_embeddings(&self) -> bool { true } diff --git a/crates/goose/src/providers/openrouter.rs b/crates/goose/src/providers/openrouter.rs index 73cc6b311002..9869584d1bfb 100644 --- a/crates/goose/src/providers/openrouter.rs +++ b/crates/goose/src/providers/openrouter.rs @@ -4,7 +4,6 @@ use serde_json::{json, Value}; use super::api_client::{ApiClient, AuthMethod}; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage}; -use super::canonical::{canonical_name, CanonicalModelRegistry}; use super::errors::ProviderError; use super::retry::ProviderRetry; use super::utils::{ @@ -367,18 +366,6 @@ impl Provider for OpenRouterProvider { Ok(Some(models)) } - async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { - // OpenRouter models are already in canonical format (e.g., "anthropic/claude-3-5-sonnet") - let canonical = canonical_name("openrouter", provider_model); - - // Check if this canonical model exists in our registry - if CanonicalModelRegistry::bundled_contains(&canonical)? { - Ok(Some(canonical)) - } else { - Ok(None) - } - } - async fn supports_cache_control(&self) -> bool { self.model .model_name From 0d3948c950feaf54cac7b76d29550db53ec08870 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 13 Nov 2025 12:33:39 -0500 Subject: [PATCH 12/52] atest mapping run --- canonical_mapping_report.json | 640 +++++++++++++++++----------------- 1 file changed, 322 insertions(+), 318 deletions(-) diff --git a/canonical_mapping_report.json b/canonical_mapping_report.json index d6335c989fa1..125b311a5389 100644 --- a/canonical_mapping_report.json +++ b/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-12T19:12:39.449555+00:00", + "timestamp": "2025-11-13T17:32:30.830102+00:00", "unmapped_models": [ { "provider": "openai", @@ -3555,309 +3555,329 @@ } ], "all_mappings": { - "openai": [ + "tetrate": [], + "openrouter": [ { - "provider_model": "chatgpt-4o-latest", - "canonical_model": "openai/chatgpt-4o-latest", + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "anthropic/claude-3.5-sonnet-20240620", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct-0914", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt", + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", "verified": true }, { - "provider_model": "gpt-4-0125-preview", - "canonical_model": "openai/gpt", + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt", + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt", + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { - "provider_model": "gpt-4-1106-preview", - "canonical_model": "openai/gpt", + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet-4.5", "verified": true }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt", + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", "verified": true }, { - "provider_model": "gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-10-01", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-12-17", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2025-06-03", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-4o-search-preview", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "gpt-4o-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt", + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt", + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-5-pro-2025-10-06", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", "verified": true }, { - "provider_model": "o1", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", "verified": true }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", "verified": true }, { - "provider_model": "o3", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "o3-deep-research-2025-06-26", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b:exacto", "verified": true }, { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", "verified": true }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", "verified": true }, { - "provider_model": "o3-pro-2025-06-10", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "o4-mini-2025-04-16", + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", + "verified": true + }, + { + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "openai/o4-mini", "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "o4-mini-deep-research", + "provider_model": "openai/o4-mini-deep-research", "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", "verified": true } ], - "databricks": [], "anthropic": [ { "provider_model": "claude-3-5-haiku-20241022", @@ -3881,352 +3901,333 @@ }, { "provider_model": "claude-haiku-4-5-20251001", - "canonical_model": "anthropic/claude-haiku", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { "provider_model": "claude-opus-4-1-20250805", - "canonical_model": "anthropic/claude-opus", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { "provider_model": "claude-opus-4-20250514", - "canonical_model": "anthropic/claude-opus", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { "provider_model": "claude-sonnet-4-20250514", - "canonical_model": "anthropic/claude-sonnet", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { "provider_model": "claude-sonnet-4-5-20250929", - "canonical_model": "anthropic/claude-sonnet", + "canonical_model": "anthropic/claude-sonnet-4.5", "verified": true } ], - "openrouter": [ - { - "provider_model": "anthropic/claude-3-haiku", - "canonical_model": "anthropic/claude-3-haiku", - "verified": true - }, - { - "provider_model": "anthropic/claude-3-opus", - "canonical_model": "anthropic/claude-3-opus", - "verified": true - }, - { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku", - "verified": true - }, - { - "provider_model": "anthropic/claude-3.5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", - "verified": true - }, - { - "provider_model": "anthropic/claude-3.5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet", - "verified": true - }, - { - "provider_model": "anthropic/claude-3.5-sonnet-20240620", - "canonical_model": "anthropic/claude-3.5-sonnet", - "verified": true - }, - { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet", - "verified": true - }, - { - "provider_model": "anthropic/claude-3.7-sonnet:thinking", - "canonical_model": "anthropic/claude-3.7-sonnet:thinking", - "verified": true - }, + "openai": [ { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "anthropic/claude-haiku", + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", "verified": true }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "anthropic/claude-opus", + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "anthropic/claude-opus", + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet", + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "anthropic/claude-sonnet", + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "openai/codex-mini", - "canonical_model": "openai/codex-mini", + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-0613", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "openai/gpt-4", - "canonical_model": "openai/gpt", + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "openai/gpt-4-0314", - "canonical_model": "openai/gpt", + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-1106-preview", - "canonical_model": "openai/gpt", + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openai/gpt", + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "gpt-4o-audio-preview-2024-10-01", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4o:extended", - "canonical_model": "openai/gpt-4o:extended", + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openai/gpt", + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-5-codex", + "provider_model": "gpt-5-codex", "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openai/gpt-5-image", + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-5-image-mini", - "canonical_model": "openai/gpt-5-image-mini", + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-5-nano", + "provider_model": "gpt-5-nano-2025-08-07", "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-5-pro", + "provider_model": "gpt-5-pro", "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openai/gpt-oss-120b:exacto", + "provider_model": "o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openai/gpt-oss-20b", + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openai/gpt-oss-safeguard-20b", + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/o1", - "canonical_model": "openai/o1", + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/o3", + "provider_model": "o3", "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/o3-deep-research", + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "o3-deep-research", "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/o3-mini", + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-mini", "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-mini-high", - "canonical_model": "openai/o3-mini-high", + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-pro", + "provider_model": "o3-pro", "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/o4-mini", + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o4-mini", "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o4-mini-deep-research", + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research", "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "openai/o4-mini-high", - "canonical_model": "openai/o4-mini-high", + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", "verified": true } ], + "databricks": [], "google": [ { "provider_model": "gemini-2.0-flash", @@ -4343,71 +4344,74 @@ "canonical_model": "google/gemma-3n-e4b-it", "verified": true } - ], - "tetrate": [] + ] }, "model_counts": { - "anthropic": 9, "databricks": 143, - "tetrate": 0, "openai": 625, + "anthropic": 9, "openrouter": 217, + "tetrate": 0, "google": 50 }, "canonical_models_used": [ - "openai/o1", - "openai/o1-pro", - "openai/gpt-4-turbo", - "google/gemini-2.5-pro", - "openai/chatgpt-4o-latest", - "openai/o4-mini", - "anthropic/claude-haiku", - "openai/gpt-4.1-mini", - "openai/gpt-3.5-turbo-instruct", - "google/gemini-2.5-flash-lite", - "openai/gpt-oss-20b", - "openai/o3-mini", - "openai/o3-pro", - "openai/gpt-4o-audio", - "openai/gpt-oss-safeguard-20b", - "google/gemma-3-12b-it", - "anthropic/claude-3-opus", - "anthropic/claude-sonnet", - "anthropic/claude-opus", - "anthropic/claude-3.7-sonnet", + "openai/gpt-5-mini", "openai/o4-mini-deep-research", - "anthropic/claude-3.5-haiku", - "openai/gpt", - "openai/gpt-4o-search", "openai/gpt-4.1-nano", + "openai/gpt-5-codex", + "google/gemini-2.0-flash", + "openai/gpt-oss-120b:exacto", + "anthropic/claude-3.7-sonnet", + "google/gemini-2.5-flash", + "openai/gpt-5-pro", + "openai/gpt-5-image-mini", + "openai/gpt-oss-120b", + "anthropic/claude-opus-4.1", + "anthropic/claude-3-opus", + "anthropic/claude-opus-4", + "openai/gpt-3.5-turbo", + "openai/gpt-4o-search", + "openai/gpt-4.1", + "openai/o3", + "google/gemini-2.5-flash-image", + "openai/gpt-4-turbo", + "openai/o3-mini", + "openai/gpt-4o:extended", + "openai/codex-mini", + "openai/o1-pro", "openai/gpt-3.5-turbo-16k", - "anthropic/claude-3.7-sonnet:thinking", - "anthropic/claude-3.5-sonnet", + "openai/gpt-4o-audio", "openai/gpt-4o", - "anthropic/claude-3-haiku", - "openai/gpt-4o-mini", - "openai/o3", + "google/gemma-3-12b-it", + "openai/gpt-3.5-turbo-instruct", "openai/gpt-5-nano", - "openai/gpt-5-image-mini", - "openai/codex-mini", - "openai/o3-mini-high", - "openai/gpt-5-codex", + "openai/o1", + "openai/gpt-oss-safeguard-20b", + "openai/gpt-5-image", + "openai/gpt-4", "google/gemma-3-27b-it", - "openai/gpt-oss-120b", - "google/gemma-3-4b-it", + "openai/gpt-4.1-mini", + "openai/chatgpt-4o-latest", + "openai/o4-mini", + "openai/gpt-oss-20b", "google/gemma-3n-e4b-it", + "google/gemini-2.5-pro", + "anthropic/claude-3.5-haiku", "openai/o4-mini-high", - "openai/o3-deep-research", "google/gemini-2.0-flash-lite", - "openai/gpt-oss-120b:exacto", - "google/gemini-2.5-flash", - "openai/gpt-5-pro", - "openai/gpt-4o:extended", - "openai/gpt-5-image", - "google/gemini-2.0-flash", - "openai/gpt-3.5-turbo", - "google/gemini-2.5-flash-image", + "openai/o3-mini-high", + "anthropic/claude-3-haiku", + "anthropic/claude-haiku-4.5", + "anthropic/claude-sonnet-4.5", + "openai/o3-pro", + "google/gemini-2.5-flash-lite", + "anthropic/claude-3.5-sonnet", + "google/gemma-3-4b-it", "openai/gpt-4o-mini-search", - "openai/gpt-5-mini" + "openai/gpt-4o-mini", + "openai/o3-deep-research", + "anthropic/claude-sonnet-4", + "anthropic/claude-3.7-sonnet:thinking", + "openai/gpt-5" ] } \ No newline at end of file From 5ac213e1096b4172160b14c681ab5fff8cada10e Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 13 Nov 2025 12:55:43 -0500 Subject: [PATCH 13/52] fix exacto bug --- .../goose/examples/build_canonical_models.rs | 95 +- .../canonical/data/canonical_models.json | 20 - .../data/report_20251113_123821.json | 6131 +++++++++++++++++ .../data/report_20251113_124204.json | 1215 ++++ .../data/report_20251113_124438.json | 1215 ++++ .../data/report_20251113_124636.json | 1196 ++++ .../data/report_20251113_125357.json | 1196 ++++ .../data/report_20251113_125535.json | 1196 ++++ .../src/providers/canonical/name_builder.rs | 1 + 9 files changed, 12232 insertions(+), 33 deletions(-) create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_123821.json create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_124204.json create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_124438.json create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_124636.json create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_125357.json create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_125535.json diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 00a04175cb33..fc73e1d62016 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -11,6 +11,9 @@ use std::collections::HashMap; const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/models"; +// Providers we want to include +const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai"]; + #[tokio::main] async fn main() -> Result<()> { println!("Fetching models from OpenRouter API..."); @@ -43,20 +46,82 @@ async fn main() -> Result<()> { for model in &models { let id = model["id"].as_str().unwrap(); let name = model["name"].as_str().unwrap_or(id); + + // Skip OpenRouter-specific pricing variants (:free, :nitro) + // Keep :extended since it has different context length + // :exacto will be stripped to map to base model + if id.contains(":free") || id.contains(":nitro") { + continue; + } + let canonical_id = canonical_name("openrouter", id); + // Filter to only allowed providers + let provider = canonical_id.split('/').next().unwrap_or(""); + if !ALLOWED_PROVIDERS.contains(&provider) { + continue; + } + + // Get pricing info for this model + let prompt_cost = model + .get("pricing") + .and_then(|p| p.get("prompt")) + .and_then(|v| v.as_str()) + .and_then(|s| s.parse::().ok()) + .unwrap_or(0.0); + + let completion_cost = model + .get("pricing") + .and_then(|p| p.get("completion")) + .and_then(|v| v.as_str()) + .and_then(|s| s.parse::().ok()) + .unwrap_or(0.0); + + let has_paid_pricing = prompt_cost > 0.0 || completion_cost > 0.0; + // Check if we've seen this canonical ID before - if let Some(existing_name) = shortest_names.get(&canonical_id) { - if name.len() < existing_name.len() { - println!(" Updating {} to use shorter name: '{}' (len {}) -> '{}' (len {})", - canonical_id, existing_name, existing_name.len(), name, name.len()); - shortest_names.insert(canonical_id.clone(), name.to_string()); - canonical_groups.insert(canonical_id, model); + if let Some(existing_model) = canonical_groups.get(&canonical_id) { + let existing_name = shortest_names.get(&canonical_id).unwrap(); + + // Get existing pricing info + let existing_prompt = existing_model + .get("pricing") + .and_then(|p| p.get("prompt")) + .and_then(|v| v.as_str()) + .and_then(|s| s.parse::().ok()) + .unwrap_or(0.0); + + let existing_completion = existing_model + .get("pricing") + .and_then(|p| p.get("completion")) + .and_then(|v| v.as_str()) + .and_then(|s| s.parse::().ok()) + .unwrap_or(0.0); + + let existing_has_paid = existing_prompt > 0.0 || existing_completion > 0.0; + + // Prefer paid pricing over free, otherwise prefer shorter name + let should_replace = if has_paid_pricing != existing_has_paid { + has_paid_pricing // Prefer the one with paid pricing } else { - println!(" Skipping duplicate {}: keeping shorter name '{}'", id, existing_name); + name.len() < existing_name.len() // Both same pricing tier, prefer shorter name + }; + + if should_replace { + println!(" Updating {} from '{}' (paid: {}) to '{}' (paid: {})", + canonical_id, existing_model["id"].as_str().unwrap(), existing_has_paid, id, has_paid_pricing); + // Keep the shorter name, but use the new model data (for pricing) + if name.len() >= existing_name.len() { + // New model's name is longer or equal, keep the existing shorter name + // (Don't update shortest_names) + } else { + // New model's name is shorter, update it + shortest_names.insert(canonical_id.clone(), name.to_string()); + } + canonical_groups.insert(canonical_id, model); } } else { - println!(" Adding: {} (from {})", canonical_id, id); + println!(" Adding: {} (from {}, paid: {})", canonical_id, id, has_paid_pricing); shortest_names.insert(canonical_id.clone(), name.to_string()); canonical_groups.insert(canonical_id, model); } @@ -178,15 +243,19 @@ async fn main() -> Result<()> { } // Write to file - let output_path = "src/providers/canonical/data/canonical_models.json"; - registry.to_file(output_path)?; - println!("\n✓ Wrote {} models to {}", registry.count(), output_path); + use std::path::PathBuf; + + let output_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("src/providers/canonical/data/canonical_models.json"); + registry.to_file(&output_path)?; + println!("\n✓ Wrote {} models to {}", registry.count(), output_path.display()); // Also write a timestamped report let timestamp = chrono::Local::now().format("%Y%m%d_%H%M%S"); - let report_path = format!("src/providers/canonical/data/report_{}.json", timestamp); + let report_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join(format!("src/providers/canonical/data/report_{}.json", timestamp)); registry.to_file(&report_path)?; - println!("✓ Wrote report to {}", report_path); + println!("✓ Wrote report to {}", report_path.display()); Ok(()) } diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 20378d0c3ea1..8db3d32d82f5 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -939,26 +939,6 @@ "id": "openai/gpt-oss-120b", "name": "OpenAI: gpt-oss-120b", "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b:exacto", - "name": "OpenAI: gpt-oss-120b (exacto)", - "context_length": 131072, "input_modalities": [ "text" ], diff --git a/crates/goose/src/providers/canonical/data/report_20251113_123821.json b/crates/goose/src/providers/canonical/data/report_20251113_123821.json new file mode 100644 index 000000000000..47f4d8b516ab --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_123821.json @@ -0,0 +1,6131 @@ +[ + { + "id": "agentica-org/deepcoder-14b", + "name": "Agentica: Deepcoder 14B Preview", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-8, + "completion": 1.5e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "agentica-org/deepcoder-14b-preview:free", + "name": "Agentica: Deepcoder 14B Preview (free)", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "ai21/jamba-large-1.7", + "name": "AI21: Jamba Large 1.7", + "context_length": 256000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "ai21/jamba-mini-1.7", + "name": "AI21: Jamba Mini 1.7", + "context_length": 256000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "aion-labs/aion-1.0", + "name": "AionLabs: Aion-1.0", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "aion-labs/aion-1.0-mini", + "name": "AionLabs: Aion-1.0-Mini", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 7e-7, + "completion": 1.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "AionLabs: Aion-RP 1.0 (8B)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "alfredpros/codellama-7b-instruct-solidity", + "name": "AlfredPros: CodeLLaMa 7B Instruct Solidity", + "context_length": 4096, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 8e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "alibaba/tongyi-deepresearch-30b-a3b", + "name": "Tongyi DeepResearch 30B A3B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "alibaba/tongyi-deepresearch-30b-a3b:free", + "name": "Tongyi DeepResearch 30B A3B (free)", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "allenai/olmo-2-0325-32b-instruct", + "name": "AllenAI: Olmo 2 32B Instruct", + "context_length": 4096, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 3.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "alpindale/goliath-120b", + "name": "Goliath 120B", + "context_length": 6144, + "max_completion_tokens": 1024, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 6e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "amazon/nova-lite", + "name": "Amazon: Nova Lite 1.0", + "context_length": 300000, + "max_completion_tokens": 5120, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.00009 + } + }, + { + "id": "amazon/nova-micro", + "name": "Amazon: Nova Micro 1.0", + "context_length": 128000, + "max_completion_tokens": 5120, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.5e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "amazon/nova-premier", + "name": "Amazon: Nova Premier 1.0", + "context_length": 1000000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.0000125, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "amazon/nova-pro", + "name": "Amazon: Nova Pro 1.0", + "context_length": 300000, + "max_completion_tokens": 5120, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 3.2e-6, + "request": 0.0, + "image": 0.0012 + } + }, + { + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "context_length": 16384, + "max_completion_tokens": 2048, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arcee-ai/afm-4.5b", + "name": "Arcee AI: AFM 4.5B", + "context_length": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4.8e-8, + "completion": 1.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arcee-ai/coder-large", + "name": "Arcee AI: Coder Large", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-7, + "completion": 8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arcee-ai/maestro-reasoning", + "name": "Arcee AI: Maestro Reasoning", + "context_length": 131072, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 9e-7, + "completion": 3.3e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arcee-ai/spotlight", + "name": "Arcee AI: Spotlight", + "context_length": 131072, + "max_completion_tokens": 65537, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.8e-7, + "completion": 1.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arcee-ai/virtuoso-large", + "name": "Arcee AI: Virtuoso Large", + "context_length": 131072, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arliai/qwq-32b-arliai-rpr", + "name": "ArliAI: QwQ 32B RpR v1", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1.1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "arliai/qwq-32b-arliai-rpr-v1:free", + "name": "ArliAI: QwQ 32B RpR v1 (free)", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "baidu/ernie-4.5-21b-a3b", + "name": "Baidu: ERNIE 4.5 21B A3B", + "context_length": 120000, + "max_completion_tokens": 8000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 7e-8, + "completion": 2.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "baidu/ernie-4.5-21b-a3b-thinking", + "name": "Baidu: ERNIE 4.5 21B A3B Thinking", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 7e-8, + "completion": 2.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "baidu/ernie-4.5-300b-a47b", + "name": "Baidu: ERNIE 4.5 300B A47B ", + "context_length": 123000, + "max_completion_tokens": 12000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.8e-7, + "completion": 1.1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "baidu/ernie-4.5-vl-28b-a3b", + "name": "Baidu: ERNIE 4.5 VL 28B A3B", + "context_length": 30000, + "max_completion_tokens": 8000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.4e-7, + "completion": 5.6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "baidu/ernie-4.5-vl-424b-a47b", + "name": "Baidu: ERNIE 4.5 VL 424B A47B ", + "context_length": 123000, + "max_completion_tokens": 16000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4.2e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "bytedance/ui-tars-1.5-7b", + "name": "ByteDance: UI-TARS 7B ", + "context_length": 128000, + "max_completion_tokens": 2048, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", + "name": "Venice: Uncensored (free)", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-a", + "name": "Cohere: Command A", + "context_length": 256000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-r-08", + "name": "Cohere: Command R (08-2024)", + "context_length": 128000, + "max_completion_tokens": 4000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-r-plus-08", + "name": "Cohere: Command R+ (08-2024)", + "context_length": 128000, + "max_completion_tokens": 4000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-r7b-12", + "name": "Cohere: Command R7B (12-2024)", + "context_length": 128000, + "max_completion_tokens": 4000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3.75e-8, + "completion": 1.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepcogito/cogito-v2-preview-deepseek-671b", + "name": "Deep Cogito: Cogito V2 Preview Deepseek 671B", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepcogito/cogito-v2-preview-llama-109b-moe", + "name": "Cogito V2 Preview Llama 109B", + "context_length": 32767, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.8e-7, + "completion": 5.9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepcogito/cogito-v2-preview-llama-405b", + "name": "Deep Cogito: Cogito V2 Preview Llama 405B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.5e-6, + "completion": 3.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepcogito/cogito-v2-preview-llama-70b", + "name": "Deep Cogito: Cogito V2 Preview Llama 70B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 8.8e-7, + "completion": 8.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek", + "name": "DeepSeek: DeepSeek V3.2 Exp", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.7e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-chat", + "name": "DeepSeek: DeepSeek V3", + "context_length": 163840, + "max_completion_tokens": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-chat-v3-0324:free", + "name": "DeepSeek: DeepSeek V3 0324 (free)", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-chat-v3.1:free", + "name": "DeepSeek: DeepSeek V3.1 (free)", + "context_length": 163800, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-prover", + "name": "DeepSeek: DeepSeek Prover V2", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-7, + "completion": 2.18e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1", + "name": "DeepSeek: R1", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-0528-qwen3-8b", + "name": "DeepSeek: DeepSeek R1 0528 Qwen3 8B", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-0528-qwen3-8b:free", + "name": "DeepSeek: DeepSeek R1 0528 Qwen3 8B (free)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-0528:free", + "name": "DeepSeek: R1 0528 (free)", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek: R1 Distill Llama 70B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-llama-70b:free", + "name": "DeepSeek: R1 Distill Llama 70B (free)", + "context_length": 8192, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-14b", + "name": "DeepSeek: R1 Distill Qwen 14B", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 1.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-32b", + "name": "DeepSeek: R1 Distill Qwen 32B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.7e-7, + "completion": 2.7e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1:free", + "name": "DeepSeek: R1 (free)", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek: DeepSeek V3.1 Terminus", + "context_length": 163840, + "max_completion_tokens": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.3e-7, + "completion": 9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-v3.1-terminus:exacto", + "name": "DeepSeek: DeepSeek V3.1 Terminus (exacto)", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.7e-7, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "eleutherai/llemma_7b", + "name": "EleutherAI: Llemma 7b", + "context_length": 4096, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 8e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-exp:free", + "name": "Google: Gemini 2.0 Flash Experimental (free)", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it:free", + "name": "Google: Gemma 3 12B (free)", + "context_length": 32768, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-27b-it:free", + "name": "Google: Gemma 3 27B (free)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-4b-it:free", + "name": "Google: Gemma 3 4B (free)", + "context_length": 32768, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e2b-it:free", + "name": "Google: Gemma 3n 2B (free)", + "context_length": 8192, + "max_completion_tokens": 2048, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it:free", + "name": "Google: Gemma 3n 4B (free)", + "context_length": 8192, + "max_completion_tokens": 2048, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "gryphe/mythomax-l2-13b", + "name": "MythoMax 13B", + "context_length": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 6e-8, + "completion": 6e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "ibm-granite/granite-4.0-h-micro", + "name": "IBM: Granite 4.0 Micro", + "context_length": 131000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.7e-8, + "completion": 1.1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "inception/mercury", + "name": "Inception: Mercury", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "inception/mercury-coder", + "name": "Inception: Mercury Coder", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "inclusionai/ling-1t", + "name": "inclusionAI: Ling-1T", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5.7e-7, + "completion": 2.28e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "inclusionai/ring-1t", + "name": "inclusionAI: Ring 1T", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5.7e-7, + "completion": 2.28e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "inflection/inflection-3-pi", + "name": "Inflection: Inflection 3 Pi", + "context_length": 8000, + "max_completion_tokens": 1024, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "inflection/inflection-3-productivity", + "name": "Inflection: Inflection 3 Productivity", + "context_length": 8000, + "max_completion_tokens": 1024, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "kwaipilot/kat-coder-pro:free", + "name": "Kwaipilot: KAT-Coder-Pro V1 (free)", + "context_length": 256000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "liquid/lfm-2.2-6b", + "name": "LiquidAI/LFM2-2.6B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "liquid/lfm2-8b-a1b", + "name": "LiquidAI/LFM2-8B-A1B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mancer/weaver", + "name": "Mancer: Weaver (alpha)", + "context_length": 8000, + "max_completion_tokens": 2000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.125e-6, + "completion": 1.125e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meituan/longcat-flash-chat", + "name": "Meituan: LongCat Flash Chat", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 7.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meituan/longcat-flash-chat:free", + "name": "Meituan: LongCat Flash Chat (free)", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3-70b-instruct", + "name": "Meta: Llama 3 70B Instruct", + "context_length": 8192, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3-8b-instruct", + "name": "Meta: Llama 3 8B Instruct", + "context_length": 8192, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 6e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-405b", + "name": "Meta: Llama 3.1 405B (base)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-405b-instruct", + "name": "Meta: Llama 3.1 405B Instruct", + "context_length": 130815, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.5e-6, + "completion": 3.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-70b-instruct", + "name": "Meta: Llama 3.1 70B Instruct", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Meta: Llama 3.1 8B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-8, + "completion": 3e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-11b-vision-instruct", + "name": "Meta: Llama 3.2 11B Vision Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4.9e-8, + "completion": 4.9e-8, + "request": 0.0, + "image": 0.00007948 + } + }, + { + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Meta: Llama 3.2 1B Instruct", + "context_length": 60000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.7e-8, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Meta: Llama 3.2 3B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-8, + "completion": 2e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-3b-instruct:free", + "name": "Meta: Llama 3.2 3B Instruct (free)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-90b-vision-instruct", + "name": "Meta: Llama 3.2 90B Vision Instruct", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3.5e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0005058 + } + }, + { + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Meta: Llama 3.3 70B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.3e-7, + "completion": 3.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.3-70b-instruct:free", + "name": "Meta: Llama 3.3 70B Instruct (free)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.3-8b-instruct:free", + "name": "Meta: Llama 3.3 8B Instruct (free)", + "context_length": 128000, + "max_completion_tokens": 4028, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-4-maverick", + "name": "Meta: Llama 4 Maverick", + "context_length": 1048576, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0006684 + } + }, + { + "id": "meta-llama/llama-4-maverick:free", + "name": "Meta: Llama 4 Maverick (free)", + "context_length": 128000, + "max_completion_tokens": 4028, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-4-scout", + "name": "Meta: Llama 4 Scout", + "context_length": 327680, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 8e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0003342 + } + }, + { + "id": "meta-llama/llama-4-scout:free", + "name": "Meta: Llama 4 Scout (free)", + "context_length": 128000, + "max_completion_tokens": 4028, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-guard-2-8b", + "name": "Meta: LlamaGuard 2 8B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-guard-3-8b", + "name": "Llama Guard 3 8B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 6e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-guard-4-12b", + "name": "Meta: Llama Guard 4 12B", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.8e-7, + "completion": 1.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/mai-ds-r1", + "name": "Microsoft: MAI DS R1", + "context_length": 163840, + "max_completion_tokens": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/mai-ds-r1:free", + "name": "Microsoft: MAI DS R1 (free)", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/phi-3-medium-128k-instruct", + "name": "Microsoft: Phi-3 Medium 128K Instruct", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/phi-3-mini-128k-instruct", + "name": "Microsoft: Phi-3 Mini 128K Instruct", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/phi-3.5-mini-128k-instruct", + "name": "Microsoft: Phi-3.5 Mini 128K Instruct", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/phi-4", + "name": "Microsoft: Phi 4", + "context_length": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 6e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/phi-4-multimodal-instruct", + "name": "Microsoft: Phi 4 Multimodal Instruct", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.00017685 + } + }, + { + "id": "microsoft/phi-4-reasoning-plus", + "name": "Microsoft: Phi 4 Reasoning Plus", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 7e-8, + "completion": 3.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "microsoft/wizardlm-2-8x22b", + "name": "WizardLM-2 8x22B", + "context_length": 65536, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4.8e-7, + "completion": 4.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "minimax/minimax-01", + "name": "MiniMax: MiniMax-01", + "context_length": 1000192, + "max_completion_tokens": 1000192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 1.1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "minimax/minimax-m1", + "name": "MiniMax: MiniMax M1", + "context_length": 1000000, + "max_completion_tokens": 40000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "minimax/minimax-m2", + "name": "MiniMax: MiniMax M2", + "context_length": 204800, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.55e-7, + "completion": 1.02e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/codestral", + "name": "Mistral: Codestral 2508", + "context_length": 256000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/devstral-medium", + "name": "Mistral: Devstral Medium", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/devstral-small", + "name": "Mistral: Devstral Small 1.1", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 7e-8, + "completion": 2.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/magistral-medium", + "name": "Mistral: Magistral Medium 2506", + "context_length": 40960, + "max_completion_tokens": 40000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/magistral-medium-2506:thinking", + "name": "Mistral: Magistral Medium 2506 (thinking)", + "context_length": 40960, + "max_completion_tokens": 40000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/magistral-small", + "name": "Mistral: Magistral Small 2506", + "context_length": 40000, + "max_completion_tokens": 40000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/ministral-3b", + "name": "Mistral: Ministral 3B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/ministral-8b", + "name": "Mistral: Ministral 8B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-7b-instruct", + "name": "Mistral: Mistral 7B Instruct", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.8e-8, + "completion": 5.4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-7b-instruct:free", + "name": "Mistral: Mistral 7B Instruct (free)", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-large", + "name": "Mistral Large", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-medium-3", + "name": "Mistral: Mistral Medium 3", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral: Mistral Medium 3.1", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-nemo", + "name": "Mistral: Mistral Nemo", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-nemo:free", + "name": "Mistral: Mistral Nemo (free)", + "context_length": 131072, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-saba", + "name": "Mistral: Saba", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small", + "name": "Mistral Small", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-24b-instruct", + "name": "Mistral: Mistral Small 3", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 8e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-24b-instruct-2501:free", + "name": "Mistral: Mistral Small 3 (free)", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral: Mistral Small 3.1 24B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-3.1-24b-instruct:free", + "name": "Mistral: Mistral Small 3.1 24B (free)", + "context_length": 96000, + "max_completion_tokens": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral: Mistral Small 3.2 24B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 1.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-3.2-24b-instruct:free", + "name": "Mistral: Mistral Small 3.2 24B (free)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-tiny", + "name": "Mistral Tiny", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mistral: Mixtral 8x22B Instruct", + "context_length": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mixtral-8x7b-instruct", + "name": "Mistral: Mixtral 8x7B Instruct", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5.4e-7, + "completion": 5.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/pixtral-12b", + "name": "Mistral: Pixtral 12B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0001445 + } + }, + { + "id": "mistralai/pixtral-large", + "name": "Mistral: Pixtral Large 2411", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.002888 + } + }, + { + "id": "mistralai/voxtral-small-24b", + "name": "Mistral: Voxtral Small 24B 2507", + "context_length": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "moonshotai/kimi-dev-72b", + "name": "MoonshotAI: Kimi Dev 72B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.9e-7, + "completion": 1.15e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "moonshotai/kimi-k2", + "name": "MoonshotAI: Kimi K2 0905", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.9e-7, + "completion": 1.9e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "moonshotai/kimi-k2-0905:exacto", + "name": "MoonshotAI: Kimi K2 0905 (exacto)", + "context_length": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "moonshotai/kimi-k2-thinking", + "name": "MoonshotAI: Kimi K2 Thinking", + "context_length": 262144, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5.5e-7, + "completion": 2.25e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "moonshotai/kimi-k2:free", + "name": "MoonshotAI: Kimi K2 0711 (free)", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "moonshotai/kimi-linear-48b-a3b-instruct", + "name": "MoonshotAI: Kimi Linear 48B A3B Instruct", + "context_length": 1048576, + "max_completion_tokens": 1048576, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "morph/morph-v3-fast", + "name": "Morph: Morph V3 Fast", + "context_length": 81920, + "max_completion_tokens": 38000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 8e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "morph/morph-v3-large", + "name": "Morph: Morph V3 Large", + "context_length": 262144, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 9e-7, + "completion": 1.9e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "neversleep/llama-3.1-lumimaid-8b", + "name": "NeverSleep: Lumimaid v0.2 8B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 9e-8, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "neversleep/noromaid-20b", + "name": "Noromaid 20B", + "context_length": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1e-6, + "completion": 1.75e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/deephermes-3-mistral-24b", + "name": "Nous: DeepHermes 3 Mistral 24B Preview", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 5.9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/hermes-2-pro-llama-3-8b", + "name": "NousResearch: Hermes 2 Pro - Llama-3 8B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-8, + "completion": 8e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/hermes-3-llama-3.1-405b", + "name": "Nous: Hermes 3 405B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1e-6, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/hermes-3-llama-3.1-405b:free", + "name": "Nous: Hermes 3 405B Instruct (free)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/hermes-3-llama-3.1-70b", + "name": "Nous: Hermes 3 70B Instruct", + "context_length": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/hermes-4-405b", + "name": "Nous: Hermes 4 405B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nousresearch/hermes-4-70b", + "name": "Nous: Hermes 4 70B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-7, + "completion": 3.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/llama-3.1-nemotron-70b-instruct", + "name": "NVIDIA: Llama 3.1 Nemotron 70B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/llama-3.1-nemotron-ultra-253b", + "name": "NVIDIA: Llama 3.1 Nemotron Ultra 253B v1", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 6e-7, + "completion": 1.8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/llama-3.3-nemotron-super-49b", + "name": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/nemotron-nano-12b-v2-vl", + "name": "NVIDIA: Nemotron Nano 12B 2 VL", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/nemotron-nano-12b-v2-vl:free", + "name": "NVIDIA: Nemotron Nano 12B 2 VL (free)", + "context_length": 128000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/nemotron-nano-9b", + "name": "NVIDIA: Nemotron Nano 9B V2", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "nvidia/nemotron-nano-9b-v2:free", + "name": "NVIDIA: Nemotron Nano 9B V2 (free)", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b:exacto", + "name": "OpenAI: gpt-oss-120b (exacto)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b:free", + "name": "OpenAI: gpt-oss-20b (free)", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "opengvlab/internvl3-78b", + "name": "OpenGVLab: InternVL3 78B", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 7e-8, + "completion": 2.6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openrouter/auto", + "name": "Auto Router", + "context_length": 2000000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": -1.0, + "completion": -1.0 + } + }, + { + "id": "openrouter/polaris-alpha", + "name": "Polaris Alpha", + "context_length": 256000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "perplexity/sonar", + "name": "Perplexity: Sonar", + "context_length": 127072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1e-6, + "completion": 1e-6, + "request": 0.005, + "image": 0.0 + } + }, + { + "id": "perplexity/sonar-deep-research", + "name": "Perplexity: Sonar Deep Research", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "perplexity/sonar-pro", + "name": "Perplexity: Sonar Pro", + "context_length": 200000, + "max_completion_tokens": 8000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "perplexity/sonar-pro-search", + "name": "Perplexity: Sonar Pro Search", + "context_length": 200000, + "max_completion_tokens": 8000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.018, + "image": 0.0 + } + }, + { + "id": "perplexity/sonar-reasoning", + "name": "Perplexity: Sonar Reasoning", + "context_length": 127000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.005, + "image": 0.0 + } + }, + { + "id": "perplexity/sonar-reasoning-pro", + "name": "Perplexity: Sonar Reasoning Pro", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 7e-8, + "completion": 2.6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-72b-instruct:free", + "name": "Qwen2.5 72B Instruct (free)", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-7b-instruct", + "name": "Qwen: Qwen2.5 7B Instruct", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-coder-32b-instruct:free", + "name": "Qwen2.5 Coder 32B Instruct (free)", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-vl-7b-instruct", + "name": "Qwen: Qwen2.5-VL 7B Instruct", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0001445 + } + }, + { + "id": "qwen/qwen-max", + "name": "Qwen: Qwen-Max ", + "context_length": 32768, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.6e-6, + "completion": 6.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-plus", + "name": "Qwen: Qwen-Plus", + "context_length": 131072, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-plus-2025-07-28:thinking", + "name": "Qwen: Qwen Plus 0728 (thinking)", + "context_length": 1000000, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-turbo", + "name": "Qwen: Qwen-Turbo", + "context_length": 1000000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-vl-max", + "name": "Qwen: Qwen VL Max", + "context_length": 131072, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 3.2e-6, + "request": 0.0, + "image": 0.001024 + } + }, + { + "id": "qwen/qwen-vl-plus", + "name": "Qwen: Qwen VL Plus", + "context_length": 7500, + "max_completion_tokens": 1500, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 2.1e-7, + "completion": 6.3e-7, + "request": 0.0, + "image": 0.0002688 + } + }, + { + "id": "qwen/qwen2.5-coder-7b-instruct", + "name": "Qwen: Qwen2.5 Coder 7B Instruct", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen2.5-vl-32b-instruct", + "name": "Qwen: Qwen2.5 VL 32B Instruct", + "context_length": 16384, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen2.5-vl-32b-instruct:free", + "name": "Qwen: Qwen2.5 VL 32B Instruct (free)", + "context_length": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen: Qwen2.5 VL 72B Instruct", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 8e-8, + "completion": 3.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-14b", + "name": "Qwen: Qwen3 14B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-14b:free", + "name": "Qwen: Qwen3 14B (free)", + "context_length": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen: Qwen3 235B A22B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.8e-7, + "completion": 5.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-235b-a22b-thinking", + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-235b-a22b:free", + "name": "Qwen: Qwen3 235B A22B (free)", + "context_length": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen: Qwen3 30B A3B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b-instruct", + "name": "Qwen: Qwen3 30B A3B Instruct 2507", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 8e-8, + "completion": 3.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b-thinking", + "name": "Qwen: Qwen3 30B A3B Thinking 2507", + "context_length": 262144, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b:free", + "name": "Qwen: Qwen3 30B A3B (free)", + "context_length": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-32b", + "name": "Qwen: Qwen3 32B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-4b:free", + "name": "Qwen: Qwen3 4B (free)", + "context_length": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-8b", + "name": "Qwen: Qwen3 8B", + "context_length": 128000, + "max_completion_tokens": 20000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.5e-8, + "completion": 1.38e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder", + "name": "Qwen: Qwen3 Coder 480B A35B", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.2e-7, + "completion": 9.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen: Qwen3 Coder 30B A3B Instruct", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 2.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder-flash", + "name": "Qwen: Qwen3 Coder Flash", + "context_length": 128000, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder-plus", + "name": "Qwen: Qwen3 Coder Plus", + "context_length": 128000, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder:exacto", + "name": "Qwen: Qwen3 Coder 480B A35B (exacto)", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.8e-7, + "completion": 1.53e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder:free", + "name": "Qwen: Qwen3 Coder 480B A35B (free)", + "context_length": 262000, + "max_completion_tokens": 262000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-max", + "name": "Qwen: Qwen3 Max", + "context_length": 256000, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen: Qwen3 Next 80B A3B Instruct", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen: Qwen3 Next 80B A3B Thinking", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen: Qwen3 VL 235B A22B Instruct", + "context_length": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2.2e-7, + "completion": 8.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen: Qwen3 VL 235B A22B Thinking", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "context_length": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-30b-a3b-thinking", + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-8b-instruct", + "name": "Qwen: Qwen3 VL 8B Instruct", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 8e-8, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-8b-thinking", + "name": "Qwen: Qwen3 VL 8B Thinking", + "context_length": 256000, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.8e-7, + "completion": 2.1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwq-32b", + "name": "Qwen: QwQ 32B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "raifle/sorcererlm-8x22b", + "name": "SorcererLM 8x22B", + "context_length": 16000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4.5e-6, + "completion": 4.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "relace/relace-apply-3", + "name": "Relace: Relace Apply 3", + "context_length": 256000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 8.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "sao10k/l3-euryale-70b", + "name": "Sao10k: Llama 3 Euryale 70B v2.1", + "context_length": 8192, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.48e-6, + "completion": 1.48e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "sao10k/l3-lunaris-8b", + "name": "Sao10K: Llama 3 8B Lunaris", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4e-8, + "completion": 5e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "sao10k/l3.1-70b-hanami-x1", + "name": "Sao10K: Llama 3.1 70B Hanami x1", + "context_length": 16000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-6, + "completion": 3e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "sao10k/l3.1-euryale-70b", + "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6.5e-7, + "completion": 7.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "sao10k/l3.3-euryale-70b", + "name": "Sao10K: Llama 3.3 Euryale 70B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 7.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "stepfun-ai/step3", + "name": "StepFun: Step3", + "context_length": 65536, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 5.7e-7, + "completion": 1.42e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "switchpoint/router", + "name": "Switchpoint Router", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 8.5e-7, + "completion": 3.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "tencent/hunyuan-a13b-instruct", + "name": "Tencent: Hunyuan A13B Instruct", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 1.4e-7, + "completion": 5.7e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "thedrummer/anubis-70b", + "name": "TheDrummer: Anubis 70B V1.1", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "thedrummer/cydonia-24b", + "name": "TheDrummer: Cydonia 24B V4.1", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "thedrummer/rocinante-12b", + "name": "TheDrummer: Rocinante 12B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.7e-7, + "completion": 4.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "thedrummer/skyfall-36b", + "name": "TheDrummer: Skyfall 36B V2", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 5e-7, + "completion": 8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "thedrummer/unslopnemo-12b", + "name": "TheDrummer: UnslopNemo 12B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "thudm/glm-4.1v-9b-thinking", + "name": "THUDM: GLM 4.1V 9B Thinking", + "context_length": 65536, + "max_completion_tokens": 8000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3.5e-8, + "completion": 1.38e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "tngtech/deepseek-r1t-chimera", + "name": "TNG: DeepSeek R1T Chimera", + "context_length": 163840, + "max_completion_tokens": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "tngtech/deepseek-r1t-chimera:free", + "name": "TNG: DeepSeek R1T Chimera (free)", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "tngtech/deepseek-r1t2-chimera", + "name": "TNG: DeepSeek R1T2 Chimera", + "context_length": 163840, + "max_completion_tokens": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "tngtech/deepseek-r1t2-chimera:free", + "name": "TNG: DeepSeek R1T2 Chimera (free)", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "context_length": 6144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": false, + "pricing": { + "prompt": 4.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-3", + "name": "xAI: Grok 3", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-3-beta", + "name": "xAI: Grok 3 Beta", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-3-mini", + "name": "xAI: Grok 3 Mini", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-3-mini-beta", + "name": "xAI: Grok 3 Mini Beta", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-4", + "name": "xAI: Grok 4", + "context_length": 256000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-4-fast", + "name": "xAI: Grok 4 Fast", + "context_length": 2000000, + "max_completion_tokens": 30000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-code-fast-1", + "name": "xAI: Grok Code Fast 1", + "context_length": 256000, + "max_completion_tokens": 10000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4-32b", + "name": "Z.AI: GLM 4 32B ", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4.5", + "name": "Z.AI: GLM 4.5", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 3.5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4.5-air", + "name": "Z.AI: GLM 4.5 Air", + "context_length": 131072, + "max_completion_tokens": 98304, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 1.3e-7, + "completion": 8.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4.5-air:free", + "name": "Z.AI: GLM 4.5 Air (free)", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4.5v", + "name": "Z.AI: GLM 4.5V", + "context_length": 65536, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-7, + "completion": 1.8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4.6", + "name": "Z.AI: GLM 4.6", + "context_length": 202752, + "max_completion_tokens": 202752, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.75e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "z-ai/glm-4.6:exacto", + "name": "Z.AI: GLM 4.6 (exacto)", + "context_length": 204800, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Unknown", + "supports_tools": true, + "pricing": { + "prompt": 6e-7, + "completion": 2.2e-6, + "request": 0.0, + "image": 0.0 + } + } +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_124204.json b/crates/goose/src/providers/canonical/data/report_20251113_124204.json new file mode 100644 index 000000000000..cf624e5cc9b4 --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_124204.json @@ -0,0 +1,1215 @@ +[ + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b:exacto", + "name": "OpenAI: gpt-oss-120b (exacto)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + } +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_124438.json b/crates/goose/src/providers/canonical/data/report_20251113_124438.json new file mode 100644 index 000000000000..cf624e5cc9b4 --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_124438.json @@ -0,0 +1,1215 @@ +[ + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.0, + "completion": 0.0, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b:exacto", + "name": "OpenAI: gpt-oss-120b (exacto)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + } +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_124636.json b/crates/goose/src/providers/canonical/data/report_20251113_124636.json new file mode 100644 index 000000000000..9b958636ec9a --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_124636.json @@ -0,0 +1,1196 @@ +[ + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b:exacto", + "name": "OpenAI: gpt-oss-120b (exacto)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + } +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_125357.json b/crates/goose/src/providers/canonical/data/report_20251113_125357.json new file mode 100644 index 000000000000..e563d699cb16 --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_125357.json @@ -0,0 +1,1196 @@ +[ + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b (exacto)", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + } +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_125535.json b/crates/goose/src/providers/canonical/data/report_20251113_125535.json new file mode 100644 index 000000000000..8db3d32d82f5 --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_125535.json @@ -0,0 +1,1196 @@ +[ + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + } +] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index f7fb7626ba76..ada8d2f8f81c 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -49,6 +49,7 @@ pub fn strip_version_suffix(model: &str) -> String { let patterns = [ regex::Regex::new(r"-preview(-\d+)*$").unwrap(), // -preview, -preview-09, -preview-05-20 regex::Regex::new(r"-exp(-\d+)*$").unwrap(), // -exp, -exp-1219, -exp-01-21 + regex::Regex::new(r":exacto$").unwrap(), // :exacto (OpenRouter provider suffix) regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 regex::Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), // -2024-04-09 regex::Regex::new(r"-v\d+(\.\d+)*$").unwrap(), // -v1.5 (semantic versions with "v" prefix) From aad353fe146b8571ce1b55cacb721faa33d87b57 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 13 Nov 2025 12:56:05 -0500 Subject: [PATCH 14/52] rm useless reports --- .../data/report_20251113_123821.json | 6131 ----------------- .../data/report_20251113_124204.json | 1215 ---- .../data/report_20251113_124438.json | 1215 ---- .../data/report_20251113_124636.json | 1196 ---- .../data/report_20251113_125357.json | 1196 ---- .../data/report_20251113_125535.json | 1196 ---- 6 files changed, 12149 deletions(-) delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_123821.json delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_124204.json delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_124438.json delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_124636.json delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_125357.json delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_125535.json diff --git a/crates/goose/src/providers/canonical/data/report_20251113_123821.json b/crates/goose/src/providers/canonical/data/report_20251113_123821.json deleted file mode 100644 index 47f4d8b516ab..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_123821.json +++ /dev/null @@ -1,6131 +0,0 @@ -[ - { - "id": "agentica-org/deepcoder-14b", - "name": "Agentica: Deepcoder 14B Preview", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-8, - "completion": 1.5e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "agentica-org/deepcoder-14b-preview:free", - "name": "Agentica: Deepcoder 14B Preview (free)", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "ai21/jamba-large-1.7", - "name": "AI21: Jamba Large 1.7", - "context_length": 256000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "ai21/jamba-mini-1.7", - "name": "AI21: Jamba Mini 1.7", - "context_length": 256000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "aion-labs/aion-1.0", - "name": "AionLabs: Aion-1.0", - "context_length": 131072, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "aion-labs/aion-1.0-mini", - "name": "AionLabs: Aion-1.0-Mini", - "context_length": 131072, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 7e-7, - "completion": 1.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "aion-labs/aion-rp-llama-3.1-8b", - "name": "AionLabs: Aion-RP 1.0 (8B)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-7, - "completion": 2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "alfredpros/codellama-7b-instruct-solidity", - "name": "AlfredPros: CodeLLaMa 7B Instruct Solidity", - "context_length": 4096, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 8e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "alibaba/tongyi-deepresearch-30b-a3b", - "name": "Tongyi DeepResearch 30B A3B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "alibaba/tongyi-deepresearch-30b-a3b:free", - "name": "Tongyi DeepResearch 30B A3B (free)", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "allenai/olmo-2-0325-32b-instruct", - "name": "AllenAI: Olmo 2 32B Instruct", - "context_length": 4096, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-7, - "completion": 3.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "alpindale/goliath-120b", - "name": "Goliath 120B", - "context_length": 6144, - "max_completion_tokens": 1024, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 6e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "amazon/nova-lite", - "name": "Amazon: Nova Lite 1.0", - "context_length": 300000, - "max_completion_tokens": 5120, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.00009 - } - }, - { - "id": "amazon/nova-micro", - "name": "Amazon: Nova Micro 1.0", - "context_length": 128000, - "max_completion_tokens": 5120, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.5e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "amazon/nova-premier", - "name": "Amazon: Nova Premier 1.0", - "context_length": 1000000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.0000125, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "amazon/nova-pro", - "name": "Amazon: Nova Pro 1.0", - "context_length": 300000, - "max_completion_tokens": 5120, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 3.2e-6, - "request": 0.0, - "image": 0.0012 - } - }, - { - "id": "anthracite-org/magnum-v4-72b", - "name": "Magnum v4 72B", - "context_length": 16384, - "max_completion_tokens": 2048, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arcee-ai/afm-4.5b", - "name": "Arcee AI: AFM 4.5B", - "context_length": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4.8e-8, - "completion": 1.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arcee-ai/coder-large", - "name": "Arcee AI: Coder Large", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-7, - "completion": 8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arcee-ai/maestro-reasoning", - "name": "Arcee AI: Maestro Reasoning", - "context_length": 131072, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 9e-7, - "completion": 3.3e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arcee-ai/spotlight", - "name": "Arcee AI: Spotlight", - "context_length": 131072, - "max_completion_tokens": 65537, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.8e-7, - "completion": 1.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arcee-ai/virtuoso-large", - "name": "Arcee AI: Virtuoso Large", - "context_length": 131072, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arliai/qwq-32b-arliai-rpr", - "name": "ArliAI: QwQ 32B RpR v1", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1.1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "arliai/qwq-32b-arliai-rpr-v1:free", - "name": "ArliAI: QwQ 32B RpR v1 (free)", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "baidu/ernie-4.5-21b-a3b", - "name": "Baidu: ERNIE 4.5 21B A3B", - "context_length": 120000, - "max_completion_tokens": 8000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 7e-8, - "completion": 2.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "baidu/ernie-4.5-21b-a3b-thinking", - "name": "Baidu: ERNIE 4.5 21B A3B Thinking", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 7e-8, - "completion": 2.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "baidu/ernie-4.5-300b-a47b", - "name": "Baidu: ERNIE 4.5 300B A47B ", - "context_length": 123000, - "max_completion_tokens": 12000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.8e-7, - "completion": 1.1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "baidu/ernie-4.5-vl-28b-a3b", - "name": "Baidu: ERNIE 4.5 VL 28B A3B", - "context_length": 30000, - "max_completion_tokens": 8000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.4e-7, - "completion": 5.6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "baidu/ernie-4.5-vl-424b-a47b", - "name": "Baidu: ERNIE 4.5 VL 424B A47B ", - "context_length": 123000, - "max_completion_tokens": 16000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4.2e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "bytedance/ui-tars-1.5-7b", - "name": "ByteDance: UI-TARS 7B ", - "context_length": 128000, - "max_completion_tokens": 2048, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1e-7, - "completion": 2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free", - "name": "Venice: Uncensored (free)", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "cohere/command-a", - "name": "Cohere: Command A", - "context_length": 256000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "cohere/command-r-08", - "name": "Cohere: Command R (08-2024)", - "context_length": 128000, - "max_completion_tokens": 4000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "cohere/command-r-plus-08", - "name": "Cohere: Command R+ (08-2024)", - "context_length": 128000, - "max_completion_tokens": 4000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "cohere/command-r7b-12", - "name": "Cohere: Command R7B (12-2024)", - "context_length": 128000, - "max_completion_tokens": 4000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3.75e-8, - "completion": 1.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepcogito/cogito-v2-preview-deepseek-671b", - "name": "Deep Cogito: Cogito V2 Preview Deepseek 671B", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepcogito/cogito-v2-preview-llama-109b-moe", - "name": "Cogito V2 Preview Llama 109B", - "context_length": 32767, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.8e-7, - "completion": 5.9e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepcogito/cogito-v2-preview-llama-405b", - "name": "Deep Cogito: Cogito V2 Preview Llama 405B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.5e-6, - "completion": 3.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepcogito/cogito-v2-preview-llama-70b", - "name": "Deep Cogito: Cogito V2 Preview Llama 70B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 8.8e-7, - "completion": 8.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek", - "name": "DeepSeek: DeepSeek V3.2 Exp", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.7e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-chat", - "name": "DeepSeek: DeepSeek V3", - "context_length": 163840, - "max_completion_tokens": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-chat-v3-0324:free", - "name": "DeepSeek: DeepSeek V3 0324 (free)", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-chat-v3.1:free", - "name": "DeepSeek: DeepSeek V3.1 (free)", - "context_length": 163800, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-prover", - "name": "DeepSeek: DeepSeek Prover V2", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-7, - "completion": 2.18e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1", - "name": "DeepSeek: R1", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-0528-qwen3-8b", - "name": "DeepSeek: DeepSeek R1 0528 Qwen3 8B", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-0528-qwen3-8b:free", - "name": "DeepSeek: DeepSeek R1 0528 Qwen3 8B (free)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-0528:free", - "name": "DeepSeek: R1 0528 (free)", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-distill-llama-70b", - "name": "DeepSeek: R1 Distill Llama 70B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-distill-llama-70b:free", - "name": "DeepSeek: R1 Distill Llama 70B (free)", - "context_length": 8192, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-distill-qwen-14b", - "name": "DeepSeek: R1 Distill Qwen 14B", - "context_length": 32768, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 1.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1-distill-qwen-32b", - "name": "DeepSeek: R1 Distill Qwen 32B", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.7e-7, - "completion": 2.7e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-r1:free", - "name": "DeepSeek: R1 (free)", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-v3.1-terminus", - "name": "DeepSeek: DeepSeek V3.1 Terminus", - "context_length": 163840, - "max_completion_tokens": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.3e-7, - "completion": 9e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "deepseek/deepseek-v3.1-terminus:exacto", - "name": "DeepSeek: DeepSeek V3.1 Terminus (exacto)", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.7e-7, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "eleutherai/llemma_7b", - "name": "EleutherAI: Llemma 7b", - "context_length": 4096, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 8e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-exp:free", - "name": "Google: Gemini 2.0 Flash Experimental (free)", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it:free", - "name": "Google: Gemma 3 12B (free)", - "context_length": 32768, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-27b-it:free", - "name": "Google: Gemma 3 27B (free)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-4b-it:free", - "name": "Google: Gemma 3 4B (free)", - "context_length": 32768, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e2b-it:free", - "name": "Google: Gemma 3n 2B (free)", - "context_length": 8192, - "max_completion_tokens": 2048, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it:free", - "name": "Google: Gemma 3n 4B (free)", - "context_length": 8192, - "max_completion_tokens": 2048, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "gryphe/mythomax-l2-13b", - "name": "MythoMax 13B", - "context_length": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 6e-8, - "completion": 6e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "ibm-granite/granite-4.0-h-micro", - "name": "IBM: Granite 4.0 Micro", - "context_length": 131000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.7e-8, - "completion": 1.1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "inception/mercury", - "name": "Inception: Mercury", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "inception/mercury-coder", - "name": "Inception: Mercury Coder", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "inclusionai/ling-1t", - "name": "inclusionAI: Ling-1T", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5.7e-7, - "completion": 2.28e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "inclusionai/ring-1t", - "name": "inclusionAI: Ring 1T", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5.7e-7, - "completion": 2.28e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "inflection/inflection-3-pi", - "name": "Inflection: Inflection 3 Pi", - "context_length": 8000, - "max_completion_tokens": 1024, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "inflection/inflection-3-productivity", - "name": "Inflection: Inflection 3 Productivity", - "context_length": 8000, - "max_completion_tokens": 1024, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "kwaipilot/kat-coder-pro:free", - "name": "Kwaipilot: KAT-Coder-Pro V1 (free)", - "context_length": 256000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "liquid/lfm-2.2-6b", - "name": "LiquidAI/LFM2-2.6B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "liquid/lfm2-8b-a1b", - "name": "LiquidAI/LFM2-8B-A1B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mancer/weaver", - "name": "Mancer: Weaver (alpha)", - "context_length": 8000, - "max_completion_tokens": 2000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.125e-6, - "completion": 1.125e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meituan/longcat-flash-chat", - "name": "Meituan: LongCat Flash Chat", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 7.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meituan/longcat-flash-chat:free", - "name": "Meituan: LongCat Flash Chat (free)", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3-70b-instruct", - "name": "Meta: Llama 3 70B Instruct", - "context_length": 8192, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3-8b-instruct", - "name": "Meta: Llama 3 8B Instruct", - "context_length": 8192, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 6e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.1-405b", - "name": "Meta: Llama 3.1 405B (base)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.1-405b-instruct", - "name": "Meta: Llama 3.1 405B Instruct", - "context_length": 130815, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.5e-6, - "completion": 3.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.1-70b-instruct", - "name": "Meta: Llama 3.1 70B Instruct", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.1-8b-instruct", - "name": "Meta: Llama 3.1 8B Instruct", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-8, - "completion": 3e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.2-11b-vision-instruct", - "name": "Meta: Llama 3.2 11B Vision Instruct", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4.9e-8, - "completion": 4.9e-8, - "request": 0.0, - "image": 0.00007948 - } - }, - { - "id": "meta-llama/llama-3.2-1b-instruct", - "name": "Meta: Llama 3.2 1B Instruct", - "context_length": 60000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.7e-8, - "completion": 2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.2-3b-instruct", - "name": "Meta: Llama 3.2 3B Instruct", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-8, - "completion": 2e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.2-3b-instruct:free", - "name": "Meta: Llama 3.2 3B Instruct (free)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.2-90b-vision-instruct", - "name": "Meta: Llama 3.2 90B Vision Instruct", - "context_length": 32768, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3.5e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0005058 - } - }, - { - "id": "meta-llama/llama-3.3-70b-instruct", - "name": "Meta: Llama 3.3 70B Instruct", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.3e-7, - "completion": 3.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.3-70b-instruct:free", - "name": "Meta: Llama 3.3 70B Instruct (free)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-3.3-8b-instruct:free", - "name": "Meta: Llama 3.3 8B Instruct (free)", - "context_length": 128000, - "max_completion_tokens": 4028, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-4-maverick", - "name": "Meta: Llama 4 Maverick", - "context_length": 1048576, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0006684 - } - }, - { - "id": "meta-llama/llama-4-maverick:free", - "name": "Meta: Llama 4 Maverick (free)", - "context_length": 128000, - "max_completion_tokens": 4028, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-4-scout", - "name": "Meta: Llama 4 Scout", - "context_length": 327680, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 8e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0003342 - } - }, - { - "id": "meta-llama/llama-4-scout:free", - "name": "Meta: Llama 4 Scout (free)", - "context_length": 128000, - "max_completion_tokens": 4028, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-guard-2-8b", - "name": "Meta: LlamaGuard 2 8B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-7, - "completion": 2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-guard-3-8b", - "name": "Llama Guard 3 8B", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 6e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "meta-llama/llama-guard-4-12b", - "name": "Meta: Llama Guard 4 12B", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.8e-7, - "completion": 1.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/mai-ds-r1", - "name": "Microsoft: MAI DS R1", - "context_length": 163840, - "max_completion_tokens": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/mai-ds-r1:free", - "name": "Microsoft: MAI DS R1 (free)", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/phi-3-medium-128k-instruct", - "name": "Microsoft: Phi-3 Medium 128K Instruct", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/phi-3-mini-128k-instruct", - "name": "Microsoft: Phi-3 Mini 128K Instruct", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/phi-3.5-mini-128k-instruct", - "name": "Microsoft: Phi-3.5 Mini 128K Instruct", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/phi-4", - "name": "Microsoft: Phi 4", - "context_length": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 6e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/phi-4-multimodal-instruct", - "name": "Microsoft: Phi 4 Multimodal Instruct", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.00017685 - } - }, - { - "id": "microsoft/phi-4-reasoning-plus", - "name": "Microsoft: Phi 4 Reasoning Plus", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 7e-8, - "completion": 3.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "microsoft/wizardlm-2-8x22b", - "name": "WizardLM-2 8x22B", - "context_length": 65536, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4.8e-7, - "completion": 4.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "minimax/minimax-01", - "name": "MiniMax: MiniMax-01", - "context_length": 1000192, - "max_completion_tokens": 1000192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-7, - "completion": 1.1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "minimax/minimax-m1", - "name": "MiniMax: MiniMax M1", - "context_length": 1000000, - "max_completion_tokens": 40000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 2.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "minimax/minimax-m2", - "name": "MiniMax: MiniMax M2", - "context_length": 204800, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.55e-7, - "completion": 1.02e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/codestral", - "name": "Mistral: Codestral 2508", - "context_length": 256000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 9e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/devstral-medium", - "name": "Mistral: Devstral Medium", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/devstral-small", - "name": "Mistral: Devstral Small 1.1", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 7e-8, - "completion": 2.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/magistral-medium", - "name": "Mistral: Magistral Medium 2506", - "context_length": 40960, - "max_completion_tokens": 40000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/magistral-medium-2506:thinking", - "name": "Mistral: Magistral Medium 2506 (thinking)", - "context_length": 40960, - "max_completion_tokens": 40000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/magistral-small", - "name": "Mistral: Magistral Small 2506", - "context_length": 40000, - "max_completion_tokens": 40000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/ministral-3b", - "name": "Mistral: Ministral 3B", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/ministral-8b", - "name": "Mistral: Ministral 8B", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-7b-instruct", - "name": "Mistral: Mistral 7B Instruct", - "context_length": 32768, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.8e-8, - "completion": 5.4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-7b-instruct:free", - "name": "Mistral: Mistral 7B Instruct (free)", - "context_length": 32768, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-large", - "name": "Mistral Large", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-medium-3", - "name": "Mistral: Mistral Medium 3", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-medium-3.1", - "name": "Mistral: Mistral Medium 3.1", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-nemo", - "name": "Mistral: Mistral Nemo", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-nemo:free", - "name": "Mistral: Mistral Nemo (free)", - "context_length": 131072, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-saba", - "name": "Mistral: Saba", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small", - "name": "Mistral Small", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small-24b-instruct", - "name": "Mistral: Mistral Small 3", - "context_length": 32768, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 8e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small-24b-instruct-2501:free", - "name": "Mistral: Mistral Small 3 (free)", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small-3.1-24b-instruct", - "name": "Mistral: Mistral Small 3.1 24B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small-3.1-24b-instruct:free", - "name": "Mistral: Mistral Small 3.1 24B (free)", - "context_length": 96000, - "max_completion_tokens": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small-3.2-24b-instruct", - "name": "Mistral: Mistral Small 3.2 24B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-8, - "completion": 1.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-small-3.2-24b-instruct:free", - "name": "Mistral: Mistral Small 3.2 24B (free)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mistral-tiny", - "name": "Mistral Tiny", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mixtral-8x22b-instruct", - "name": "Mistral: Mixtral 8x22B Instruct", - "context_length": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/mixtral-8x7b-instruct", - "name": "Mistral: Mixtral 8x7B Instruct", - "context_length": 32768, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5.4e-7, - "completion": 5.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "mistralai/pixtral-12b", - "name": "Mistral: Pixtral 12B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 1e-7, - "request": 0.0, - "image": 0.0001445 - } - }, - { - "id": "mistralai/pixtral-large", - "name": "Mistral: Pixtral Large 2411", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.002888 - } - }, - { - "id": "mistralai/voxtral-small-24b", - "name": "Mistral: Voxtral Small 24B 2507", - "context_length": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "moonshotai/kimi-dev-72b", - "name": "MoonshotAI: Kimi Dev 72B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.9e-7, - "completion": 1.15e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "moonshotai/kimi-k2", - "name": "MoonshotAI: Kimi K2 0905", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.9e-7, - "completion": 1.9e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "moonshotai/kimi-k2-0905:exacto", - "name": "MoonshotAI: Kimi K2 0905 (exacto)", - "context_length": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "moonshotai/kimi-k2-thinking", - "name": "MoonshotAI: Kimi K2 Thinking", - "context_length": 262144, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5.5e-7, - "completion": 2.25e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "moonshotai/kimi-k2:free", - "name": "MoonshotAI: Kimi K2 0711 (free)", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "moonshotai/kimi-linear-48b-a3b-instruct", - "name": "MoonshotAI: Kimi Linear 48B A3B Instruct", - "context_length": 1048576, - "max_completion_tokens": 1048576, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "morph/morph-v3-fast", - "name": "Morph: Morph V3 Fast", - "context_length": 81920, - "max_completion_tokens": 38000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 8e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "morph/morph-v3-large", - "name": "Morph: Morph V3 Large", - "context_length": 262144, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 9e-7, - "completion": 1.9e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "neversleep/llama-3.1-lumimaid-8b", - "name": "NeverSleep: Lumimaid v0.2 8B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 9e-8, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "neversleep/noromaid-20b", - "name": "Noromaid 20B", - "context_length": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1e-6, - "completion": 1.75e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/deephermes-3-mistral-24b", - "name": "Nous: DeepHermes 3 Mistral 24B Preview", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 5.9e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/hermes-2-pro-llama-3-8b", - "name": "NousResearch: Hermes 2 Pro - Llama-3 8B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-8, - "completion": 8e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/hermes-3-llama-3.1-405b", - "name": "Nous: Hermes 3 405B Instruct", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1e-6, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/hermes-3-llama-3.1-405b:free", - "name": "Nous: Hermes 3 405B Instruct (free)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/hermes-3-llama-3.1-70b", - "name": "Nous: Hermes 3 70B Instruct", - "context_length": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/hermes-4-405b", - "name": "Nous: Hermes 4 405B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nousresearch/hermes-4-70b", - "name": "Nous: Hermes 4 70B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-7, - "completion": 3.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/llama-3.1-nemotron-70b-instruct", - "name": "NVIDIA: Llama 3.1 Nemotron 70B Instruct", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/llama-3.1-nemotron-ultra-253b", - "name": "NVIDIA: Llama 3.1 Nemotron Ultra 253B v1", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 6e-7, - "completion": 1.8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/llama-3.3-nemotron-super-49b", - "name": "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/nemotron-nano-12b-v2-vl", - "name": "NVIDIA: Nemotron Nano 12B 2 VL", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/nemotron-nano-12b-v2-vl:free", - "name": "NVIDIA: Nemotron Nano 12B 2 VL (free)", - "context_length": 128000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/nemotron-nano-9b", - "name": "NVIDIA: Nemotron Nano 9B V2", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "nvidia/nemotron-nano-9b-v2:free", - "name": "NVIDIA: Nemotron Nano 9B V2 (free)", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b:exacto", - "name": "OpenAI: gpt-oss-120b (exacto)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b:free", - "name": "OpenAI: gpt-oss-20b (free)", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "opengvlab/internvl3-78b", - "name": "OpenGVLab: InternVL3 78B", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 7e-8, - "completion": 2.6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openrouter/auto", - "name": "Auto Router", - "context_length": 2000000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": -1.0, - "completion": -1.0 - } - }, - { - "id": "openrouter/polaris-alpha", - "name": "Polaris Alpha", - "context_length": 256000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "perplexity/sonar", - "name": "Perplexity: Sonar", - "context_length": 127072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1e-6, - "completion": 1e-6, - "request": 0.005, - "image": 0.0 - } - }, - { - "id": "perplexity/sonar-deep-research", - "name": "Perplexity: Sonar Deep Research", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "perplexity/sonar-pro", - "name": "Perplexity: Sonar Pro", - "context_length": 200000, - "max_completion_tokens": 8000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "perplexity/sonar-pro-search", - "name": "Perplexity: Sonar Pro Search", - "context_length": 200000, - "max_completion_tokens": 8000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.018, - "image": 0.0 - } - }, - { - "id": "perplexity/sonar-reasoning", - "name": "Perplexity: Sonar Reasoning", - "context_length": 127000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.005, - "image": 0.0 - } - }, - { - "id": "perplexity/sonar-reasoning-pro", - "name": "Perplexity: Sonar Reasoning Pro", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-2.5-72b-instruct", - "name": "Qwen2.5 72B Instruct", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 7e-8, - "completion": 2.6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-2.5-72b-instruct:free", - "name": "Qwen2.5 72B Instruct (free)", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-2.5-7b-instruct", - "name": "Qwen: Qwen2.5 7B Instruct", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-2.5-coder-32b-instruct", - "name": "Qwen2.5 Coder 32B Instruct", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-2.5-coder-32b-instruct:free", - "name": "Qwen2.5 Coder 32B Instruct (free)", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-2.5-vl-7b-instruct", - "name": "Qwen: Qwen2.5-VL 7B Instruct", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2e-7, - "completion": 2e-7, - "request": 0.0, - "image": 0.0001445 - } - }, - { - "id": "qwen/qwen-max", - "name": "Qwen: Qwen-Max ", - "context_length": 32768, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.6e-6, - "completion": 6.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-plus", - "name": "Qwen: Qwen-Plus", - "context_length": 131072, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-plus-2025-07-28:thinking", - "name": "Qwen: Qwen Plus 0728 (thinking)", - "context_length": 1000000, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-turbo", - "name": "Qwen: Qwen-Turbo", - "context_length": 1000000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen-vl-max", - "name": "Qwen: Qwen VL Max", - "context_length": 131072, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 3.2e-6, - "request": 0.0, - "image": 0.001024 - } - }, - { - "id": "qwen/qwen-vl-plus", - "name": "Qwen: Qwen VL Plus", - "context_length": 7500, - "max_completion_tokens": 1500, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 2.1e-7, - "completion": 6.3e-7, - "request": 0.0, - "image": 0.0002688 - } - }, - { - "id": "qwen/qwen2.5-coder-7b-instruct", - "name": "Qwen: Qwen2.5 Coder 7B Instruct", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen2.5-vl-32b-instruct", - "name": "Qwen: Qwen2.5 VL 32B Instruct", - "context_length": 16384, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-8, - "completion": 2.2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen2.5-vl-32b-instruct:free", - "name": "Qwen: Qwen2.5 VL 32B Instruct (free)", - "context_length": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen2.5-vl-72b-instruct", - "name": "Qwen: Qwen2.5 VL 72B Instruct", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 8e-8, - "completion": 3.3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-14b", - "name": "Qwen: Qwen3 14B", - "context_length": 40960, - "max_completion_tokens": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-14b:free", - "name": "Qwen: Qwen3 14B (free)", - "context_length": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-235b-a22b", - "name": "Qwen: Qwen3 235B A22B", - "context_length": 40960, - "max_completion_tokens": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.8e-7, - "completion": 5.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-235b-a22b-thinking", - "name": "Qwen: Qwen3 235B A22B Thinking 2507", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-235b-a22b:free", - "name": "Qwen: Qwen3 235B A22B (free)", - "context_length": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-30b-a3b", - "name": "Qwen: Qwen3 30B A3B", - "context_length": 40960, - "max_completion_tokens": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-8, - "completion": 2.2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-30b-a3b-instruct", - "name": "Qwen: Qwen3 30B A3B Instruct 2507", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 8e-8, - "completion": 3.3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-30b-a3b-thinking", - "name": "Qwen: Qwen3 30B A3B Thinking 2507", - "context_length": 262144, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-30b-a3b:free", - "name": "Qwen: Qwen3 30B A3B (free)", - "context_length": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-32b", - "name": "Qwen: Qwen3 32B", - "context_length": 40960, - "max_completion_tokens": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-4b:free", - "name": "Qwen: Qwen3 4B (free)", - "context_length": 40960, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-8b", - "name": "Qwen: Qwen3 8B", - "context_length": 128000, - "max_completion_tokens": 20000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.5e-8, - "completion": 1.38e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-coder", - "name": "Qwen: Qwen3 Coder 480B A35B", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.2e-7, - "completion": 9.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-coder-30b-a3b-instruct", - "name": "Qwen: Qwen3 Coder 30B A3B Instruct", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-8, - "completion": 2.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-coder-flash", - "name": "Qwen: Qwen3 Coder Flash", - "context_length": 128000, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-coder-plus", - "name": "Qwen: Qwen3 Coder Plus", - "context_length": 128000, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-coder:exacto", - "name": "Qwen: Qwen3 Coder 480B A35B (exacto)", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.8e-7, - "completion": 1.53e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-coder:free", - "name": "Qwen: Qwen3 Coder 480B A35B (free)", - "context_length": 262000, - "max_completion_tokens": 262000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-max", - "name": "Qwen: Qwen3 Max", - "context_length": 256000, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.2e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-next-80b-a3b-instruct", - "name": "Qwen: Qwen3 Next 80B A3B Instruct", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-next-80b-a3b-thinking", - "name": "Qwen: Qwen3 Next 80B A3B Thinking", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-vl-235b-a22b-instruct", - "name": "Qwen: Qwen3 VL 235B A22B Instruct", - "context_length": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2.2e-7, - "completion": 8.8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-vl-235b-a22b-thinking", - "name": "Qwen: Qwen3 VL 235B A22B Thinking", - "context_length": 262144, - "max_completion_tokens": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-vl-30b-a3b-instruct", - "name": "Qwen: Qwen3 VL 30B A3B Instruct", - "context_length": 262144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-vl-30b-a3b-thinking", - "name": "Qwen: Qwen3 VL 30B A3B Thinking", - "context_length": 131072, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-7, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-vl-8b-instruct", - "name": "Qwen: Qwen3 VL 8B Instruct", - "context_length": 131072, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 8e-8, - "completion": 5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwen3-vl-8b-thinking", - "name": "Qwen: Qwen3 VL 8B Thinking", - "context_length": 256000, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.8e-7, - "completion": 2.1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "qwen/qwq-32b", - "name": "Qwen: QwQ 32B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "raifle/sorcererlm-8x22b", - "name": "SorcererLM 8x22B", - "context_length": 16000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4.5e-6, - "completion": 4.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "relace/relace-apply-3", - "name": "Relace: Relace Apply 3", - "context_length": 256000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 8.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "sao10k/l3-euryale-70b", - "name": "Sao10k: Llama 3 Euryale 70B v2.1", - "context_length": 8192, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.48e-6, - "completion": 1.48e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "sao10k/l3-lunaris-8b", - "name": "Sao10K: Llama 3 8B Lunaris", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4e-8, - "completion": 5e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "sao10k/l3.1-70b-hanami-x1", - "name": "Sao10K: Llama 3.1 70B Hanami x1", - "context_length": 16000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-6, - "completion": 3e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "sao10k/l3.1-euryale-70b", - "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6.5e-7, - "completion": 7.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "sao10k/l3.3-euryale-70b", - "name": "Sao10K: Llama 3.3 Euryale 70B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 7.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "stepfun-ai/step3", - "name": "StepFun: Step3", - "context_length": 65536, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 5.7e-7, - "completion": 1.42e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "switchpoint/router", - "name": "Switchpoint Router", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 8.5e-7, - "completion": 3.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "tencent/hunyuan-a13b-instruct", - "name": "Tencent: Hunyuan A13B Instruct", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 1.4e-7, - "completion": 5.7e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "thedrummer/anubis-70b", - "name": "TheDrummer: Anubis 70B V1.1", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 1e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "thedrummer/cydonia-24b", - "name": "TheDrummer: Cydonia 24B V4.1", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "thedrummer/rocinante-12b", - "name": "TheDrummer: Rocinante 12B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.7e-7, - "completion": 4.3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "thedrummer/skyfall-36b", - "name": "TheDrummer: Skyfall 36B V2", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 5e-7, - "completion": 8e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "thedrummer/unslopnemo-12b", - "name": "TheDrummer: UnslopNemo 12B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "thudm/glm-4.1v-9b-thinking", - "name": "THUDM: GLM 4.1V 9B Thinking", - "context_length": 65536, - "max_completion_tokens": 8000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3.5e-8, - "completion": 1.38e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "tngtech/deepseek-r1t-chimera", - "name": "TNG: DeepSeek R1T Chimera", - "context_length": 163840, - "max_completion_tokens": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "tngtech/deepseek-r1t-chimera:free", - "name": "TNG: DeepSeek R1T Chimera (free)", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "tngtech/deepseek-r1t2-chimera", - "name": "TNG: DeepSeek R1T2 Chimera", - "context_length": 163840, - "max_completion_tokens": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 1.2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "tngtech/deepseek-r1t2-chimera:free", - "name": "TNG: DeepSeek R1T2 Chimera (free)", - "context_length": 163840, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "undi95/remm-slerp-l2-13b", - "name": "ReMM SLERP 13B", - "context_length": 6144, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": false, - "pricing": { - "prompt": 4.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-3", - "name": "xAI: Grok 3", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-3-beta", - "name": "xAI: Grok 3 Beta", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-3-mini", - "name": "xAI: Grok 3 Mini", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-3-mini-beta", - "name": "xAI: Grok 3 Mini Beta", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-4", - "name": "xAI: Grok 4", - "context_length": 256000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-4-fast", - "name": "xAI: Grok 4 Fast", - "context_length": 2000000, - "max_completion_tokens": 30000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-7, - "completion": 5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "x-ai/grok-code-fast-1", - "name": "xAI: Grok Code Fast 1", - "context_length": 256000, - "max_completion_tokens": 10000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 2e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4-32b", - "name": "Z.AI: GLM 4 32B ", - "context_length": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4.5", - "name": "Z.AI: GLM 4.5", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 3.5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4.5-air", - "name": "Z.AI: GLM 4.5 Air", - "context_length": 131072, - "max_completion_tokens": 98304, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 1.3e-7, - "completion": 8.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4.5-air:free", - "name": "Z.AI: GLM 4.5 Air (free)", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4.5v", - "name": "Z.AI: GLM 4.5V", - "context_length": 65536, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-7, - "completion": 1.8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4.6", - "name": "Z.AI: GLM 4.6", - "context_length": 202752, - "max_completion_tokens": 202752, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.75e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "z-ai/glm-4.6:exacto", - "name": "Z.AI: GLM 4.6 (exacto)", - "context_length": 204800, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Unknown", - "supports_tools": true, - "pricing": { - "prompt": 6e-7, - "completion": 2.2e-6, - "request": 0.0, - "image": 0.0 - } - } -] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_124204.json b/crates/goose/src/providers/canonical/data/report_20251113_124204.json deleted file mode 100644 index cf624e5cc9b4..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_124204.json +++ /dev/null @@ -1,1215 +0,0 @@ -[ - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b:exacto", - "name": "OpenAI: gpt-oss-120b (exacto)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - } -] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_124438.json b/crates/goose/src/providers/canonical/data/report_20251113_124438.json deleted file mode 100644 index cf624e5cc9b4..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_124438.json +++ /dev/null @@ -1,1215 +0,0 @@ -[ - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.0, - "completion": 0.0, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b:exacto", - "name": "OpenAI: gpt-oss-120b (exacto)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - } -] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_124636.json b/crates/goose/src/providers/canonical/data/report_20251113_124636.json deleted file mode 100644 index 9b958636ec9a..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_124636.json +++ /dev/null @@ -1,1196 +0,0 @@ -[ - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b:exacto", - "name": "OpenAI: gpt-oss-120b (exacto)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - } -] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_125357.json b/crates/goose/src/providers/canonical/data/report_20251113_125357.json deleted file mode 100644 index e563d699cb16..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_125357.json +++ /dev/null @@ -1,1196 +0,0 @@ -[ - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b (exacto)", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - } -] \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_125535.json b/crates/goose/src/providers/canonical/data/report_20251113_125535.json deleted file mode 100644 index 8db3d32d82f5..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_125535.json +++ /dev/null @@ -1,1196 +0,0 @@ -[ - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - } -] \ No newline at end of file From 894e97963672ff83c6616b185839471b817588ea Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 13 Nov 2025 14:58:53 -0500 Subject: [PATCH 15/52] pick up gpt5 --- .../canonical/data/canonical_models.json | 80 ++ .../data/report_20251113_145809.json | 1276 +++++++++++++++++ 2 files changed, 1356 insertions(+) create mode 100644 crates/goose/src/providers/canonical/data/report_20251113_145809.json diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 8db3d32d82f5..b66993dc006c 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -935,6 +935,86 @@ "image": 0.0 } }, + { + "id": "openai/gpt-5.1", + "name": "OpenAI: GPT-5.1", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1-chat", + "name": "OpenAI: GPT-5.1 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1-codex", + "name": "OpenAI: GPT-5.1-Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1-codex-mini", + "name": "OpenAI: GPT-5.1-Codex-Mini", + "context_length": 400000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, { "id": "openai/gpt-oss-120b", "name": "OpenAI: gpt-oss-120b", diff --git a/crates/goose/src/providers/canonical/data/report_20251113_145809.json b/crates/goose/src/providers/canonical/data/report_20251113_145809.json new file mode 100644 index 000000000000..b66993dc006c --- /dev/null +++ b/crates/goose/src/providers/canonical/data/report_20251113_145809.json @@ -0,0 +1,1276 @@ +[ + { + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 1.25e-6, + "request": 0.0, + "image": 0.0004 + } + }, + { + "id": "anthropic/claude-3-opus", + "name": "Anthropic: Claude 3 Opus", + "context_length": 200000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-3.5-haiku", + "name": "Anthropic: Claude 3.5 Haiku", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-3.5-sonnet", + "name": "Anthropic: Claude 3.5 Sonnet", + "context_length": 200000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet", + "name": "Anthropic: Claude 3.7 Sonnet", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-3.7-sonnet:thinking", + "name": "Anthropic: Claude 3.7 Sonnet (thinking)", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "context_length": 200000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "anthropic/claude-opus-4", + "name": "Anthropic: Claude Opus 4", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.000075, + "request": 0.0, + "image": 0.024 + } + }, + { + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0048 + } + }, + { + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "context_length": 1000000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.0-flash", + "name": "Google: Gemini 2.0 Flash", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0000258 + } + }, + { + "id": "google/gemini-2.0-flash-lite", + "name": "Google: Gemini 2.0 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-image", + "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-7, + "completion": 2.5e-6, + "request": 0.0, + "image": 0.001238 + } + }, + { + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "context_length": 1048576, + "max_completion_tokens": 65535, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.00516 + } + }, + { + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 6.5e-7, + "completion": 6.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-2-9b-it", + "name": "Google: Gemma 2 9B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 9e-8, + "completion": 1.6e-7, + "request": 0.0, + "image": 0.0000256 + } + }, + { + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "context_length": 96000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 1.703012e-8, + "completion": 6.81536e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "google/gemma-3n-e4b-it", + "name": "Google: Gemma 3n 4B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/chatgpt-4o-latest", + "name": "OpenAI: ChatGPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 5e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/codex-mini", + "name": "OpenAI: Codex Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "context_length": 16385, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "context_length": 4095, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "context_length": 8191, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00003, + "completion": 0.00006, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "context_length": 128000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00003, + "request": 0.0, + "image": 0.01445 + } + }, + { + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "context_length": 1047576, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o-audio", + "name": "OpenAI: GPT-4o Audio", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-mini-search", + "name": "OpenAI: GPT-4o-mini Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0275, + "image": 0.000217 + } + }, + { + "id": "openai/gpt-4o-search", + "name": "OpenAI: GPT-4o Search Preview", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.035, + "image": 0.003613 + } + }, + { + "id": "openai/gpt-4o:extended", + "name": "OpenAI: GPT-4o (extended)", + "context_length": 128000, + "max_completion_tokens": 64000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 6e-6, + "completion": 0.000018, + "request": 0.0, + "image": 0.007225 + } + }, + { + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-chat", + "name": "OpenAI: GPT-5 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-codex", + "name": "OpenAI: GPT-5 Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00001, + "request": 0.0, + "image": 0.00001 + } + }, + { + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 2e-6, + "request": 0.0, + "image": 2.5e-6 + } + }, + { + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00012, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1", + "name": "OpenAI: GPT-5.1", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1-chat", + "name": "OpenAI: GPT-5.1 Chat", + "context_length": 128000, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1-codex", + "name": "OpenAI: GPT-5.1-Codex", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-5.1-codex-mini", + "name": "OpenAI: GPT-5.1-Codex-Mini", + "context_length": 400000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.5e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "context_length": 131072, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 7.5e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o1", + "name": "OpenAI: o1", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.000015, + "completion": 0.00006, + "request": 0.0, + "image": 0.021675 + } + }, + { + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": false, + "pricing": { + "prompt": 0.00015, + "completion": 0.0006, + "request": 0.0, + "image": 0.21675 + } + }, + { + "id": "openai/o3", + "name": "OpenAI: o3", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o3-deep-research", + "name": "OpenAI: o3 Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00001, + "completion": 0.00004, + "request": 0.0, + "image": 0.00765 + } + }, + { + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 0.00002, + "completion": 0.00008, + "request": 0.0, + "image": 0.0153 + } + }, + { + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + }, + { + "id": "openai/o4-mini-deep-research", + "name": "OpenAI: o4 Mini Deep Research", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.00153 + } + }, + { + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "context_length": 200000, + "max_completion_tokens": 100000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.1e-6, + "completion": 4.4e-6, + "request": 0.0, + "image": 0.0008415 + } + } +] \ No newline at end of file From 1a80ee13bc69ea4c413c9d9c53317159fe6a67b2 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 14 Nov 2025 01:38:03 -0500 Subject: [PATCH 16/52] Cleanup diff script --- .../goose/examples/build_canonical_models.rs | 7 - .../goose/examples/canonical_model_checker.rs | 120 +- .../goose/src/providers/canonical/README.md | 12 +- .../data/canonical_mapping_report.json | 1524 +++++++++++++---- .../data/report_20251113_145809.json | 1276 -------------- 5 files changed, 1294 insertions(+), 1645 deletions(-) rename canonical_mapping_report.json => crates/goose/src/providers/canonical/data/canonical_mapping_report.json (83%) delete mode 100644 crates/goose/src/providers/canonical/data/report_20251113_145809.json diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index fc73e1d62016..45d47f607c4a 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -250,12 +250,5 @@ async fn main() -> Result<()> { registry.to_file(&output_path)?; println!("\n✓ Wrote {} models to {}", registry.count(), output_path.display()); - // Also write a timestamped report - let timestamp = chrono::Local::now().format("%Y%m%d_%H%M%S"); - let report_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join(format!("src/providers/canonical/data/report_{}.json", timestamp)); - registry.to_file(&report_path)?; - println!("✓ Wrote report to {}", report_path.display()); - Ok(()) } diff --git a/crates/goose/examples/canonical_model_checker.rs b/crates/goose/examples/canonical_model_checker.rs index 2a250de8fb62..c9564a6ac9b7 100644 --- a/crates/goose/examples/canonical_model_checker.rs +++ b/crates/goose/examples/canonical_model_checker.rs @@ -1,13 +1,22 @@ /// Canonical Model Checker /// /// This script checks which models from top providers are properly mapped to canonical models. -/// It outputs a report showing: +/// It maintains a lock file of mappings and detects changes between runs. +/// +/// Outputs: /// - Models that are NOT mapped to canonical models /// - Full list of (provider, model) <-> canonical-model mappings -/// - Comparison with previous runs (if available) +/// - Diff report showing mapping changes since last run: +/// * Changed mappings (model now maps to a different canonical model) +/// * Added mappings (model gained a canonical mapping) +/// * Removed mappings (model lost its canonical mapping) +/// +/// Output File: +/// - src/providers/canonical/data/canonical_mapping_report.json +/// Contains full report with mapping data (acts as a lock file) /// /// Usage: -/// cargo run --example canonical_model_checker -- [--output report.json] +/// cargo run --example canonical_model_checker -- [--output custom_path.json] /// use anyhow::{Context, Result}; @@ -19,12 +28,19 @@ use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] struct ProviderModelPair { provider: String, model: String, } +#[derive(Debug, Clone, Serialize, Deserialize)] +struct MappingEntry { + provider: String, + model: String, + canonical: String, +} + #[derive(Debug, Clone, Serialize, Deserialize)] struct MappingReport { /// Timestamp of this report @@ -34,8 +50,12 @@ struct MappingReport { unmapped_models: Vec, /// All mappings: (provider, model) -> canonical model + /// Stored per provider for backward compatibility all_mappings: HashMap>, + /// Flat list of all mappings for easier comparison (lock file format) + mapped_models: Vec, + /// Total models checked per provider model_counts: HashMap, @@ -49,6 +69,7 @@ impl MappingReport { timestamp: chrono::Utc::now().to_rfc3339(), unmapped_models: Vec::new(), all_mappings: HashMap::new(), + mapped_models: Vec::new(), model_counts: HashMap::new(), canonical_models_used: HashSet::new(), } @@ -76,9 +97,14 @@ impl MappingReport { } } - // Track canonical models used - for canonical in mapping_map.values() { + // Track canonical models used and build flat mapping list + for (model, canonical) in &mapping_map { self.canonical_models_used.insert(canonical.clone()); + self.mapped_models.push(MappingEntry { + provider: provider_name.to_string(), + model: model.clone(), + canonical: canonical.clone(), + }); } // Store mappings and counts @@ -158,33 +184,74 @@ impl MappingReport { println!("CHANGES SINCE PREVIOUS RUN"); println!("{}", "=".repeat(80)); - // Find new unmapped models - let prev_unmapped: HashSet<_> = previous.unmapped_models - .iter() - .map(|p| (&p.provider, &p.model)) - .collect(); - let curr_unmapped: HashSet<_> = self.unmapped_models - .iter() - .map(|p| (&p.provider, &p.model)) - .collect(); + // Build lookup maps for current and previous mappings + // Key: (provider, model), Value: canonical model + let mut prev_map: HashMap<(String, String), String> = HashMap::new(); + for entry in &previous.mapped_models { + prev_map.insert((entry.provider.clone(), entry.model.clone()), entry.canonical.clone()); + } - let newly_mapped: Vec<_> = prev_unmapped.difference(&curr_unmapped).collect(); - let newly_unmapped: Vec<_> = curr_unmapped.difference(&prev_unmapped).collect(); + let mut curr_map: HashMap<(String, String), String> = HashMap::new(); + for entry in &self.mapped_models { + curr_map.insert((entry.provider.clone(), entry.model.clone()), entry.canonical.clone()); + } + + // Find changes + let mut changed_mappings = Vec::new(); + let mut added_mappings = Vec::new(); + let mut removed_mappings = Vec::new(); + + // Check current mappings against previous + for (key @ (provider, model), canonical) in &curr_map { + match prev_map.get(key) { + Some(prev_canonical) if prev_canonical != canonical => { + // Mapping changed + changed_mappings.push((provider.clone(), model.clone(), prev_canonical.clone(), canonical.clone())); + } + None => { + // New mapping + added_mappings.push((provider.clone(), model.clone(), canonical.clone())); + } + _ => { + // No change + } + } + } - if newly_mapped.is_empty() && newly_unmapped.is_empty() { + // Check for removed mappings + for (key @ (provider, model), canonical) in &prev_map { + if !curr_map.contains_key(key) { + removed_mappings.push((provider.clone(), model.clone(), canonical.clone())); + } + } + + // Print changes + if changed_mappings.is_empty() && added_mappings.is_empty() && removed_mappings.is_empty() { println!("\nNo changes in model mappings."); } else { - if !newly_mapped.is_empty() { - println!("\n✓ Newly Mapped Models ({}):", newly_mapped.len()); - for (provider, model) in newly_mapped { + if !changed_mappings.is_empty() { + println!("\n⚠ Changed Mappings ({}):", changed_mappings.len()); + println!(" (Models that now map to a different canonical model)"); + for (provider, model, old_canonical, new_canonical) in changed_mappings { println!(" {} / {}", provider, model); + println!(" WAS: {}", old_canonical); + println!(" NOW: {}", new_canonical); } } - if !newly_unmapped.is_empty() { - println!("\n✗ Newly Unmapped Models ({}):", newly_unmapped.len()); - for (provider, model) in newly_unmapped { - println!(" {} / {}", provider, model); + if !added_mappings.is_empty() { + println!("\n✓ Added Mappings ({}):", added_mappings.len()); + println!(" (Models that gained a canonical mapping)"); + for (provider, model, canonical) in added_mappings { + println!(" {} / {} -> {}", provider, model, canonical); + } + } + + if !removed_mappings.is_empty() { + println!("\n✗ Removed Mappings ({}):", removed_mappings.len()); + println!(" (Models that lost their canonical mapping)"); + for (provider, model, canonical) in removed_mappings { + println!(" {} / {} (was: {})", provider, model, canonical); } } } @@ -294,7 +361,8 @@ async fn main() -> Result<()> { let output_path = if args.len() > 2 && args[1] == "--output" { PathBuf::from(&args[2]) } else { - PathBuf::from("canonical_mapping_report.json") + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("src/providers/canonical/data/canonical_mapping_report.json") }; // Try to compare with previous run diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 4fd72a00a7aa..2c0b6658b73a 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -132,7 +132,17 @@ This will: - Check which models are mapped to canonical models - Report unmapped models - Show canonical models in use -- Compare with previous runs +- Compare with previous runs to detect mapping changes +- Generate output file: `src/providers/canonical/data/canonical_mapping_report.json` + +**Lock File / Diff Functionality:** + +The checker maintains `canonical_mapping_report.json` which stores all (provider, model) -> canonical model mappings along with the full report. On subsequent runs, it compares against this file and reports: +- **Changed Mappings**: Models that now map to a different canonical model +- **Added Mappings**: Models that gained a canonical mapping +- **Removed Mappings**: Models that lost their canonical mapping + +This helps you track changes in model mappings over time, similar to how package lock files work. **Note:** Requires proper provider credentials to be configured. diff --git a/canonical_mapping_report.json b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json similarity index 83% rename from canonical_mapping_report.json rename to crates/goose/src/providers/canonical/data/canonical_mapping_report.json index 125b311a5389..bdf57804bbd0 100644 --- a/canonical_mapping_report.json +++ b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-13T17:32:30.830102+00:00", + "timestamp": "2025-11-14T06:37:19.570393+00:00", "unmapped_models": [ { "provider": "openai", @@ -2165,6 +2165,10 @@ "provider": "openai", "model": "gpt-5-search-api-2025-10-14" }, + { + "provider": "openai", + "model": "gpt-5.1-chat-latest" + }, { "provider": "openai", "model": "gpt-audio" @@ -2649,10 +2653,6 @@ "provider": "openrouter", "model": "openai/gpt-oss-20b:free" }, - { - "provider": "openrouter", - "model": "openrouter/polaris-alpha" - }, { "provider": "openrouter", "model": "qwen/qwen-2.5-72b-instruct" @@ -3555,326 +3555,326 @@ } ], "all_mappings": { - "tetrate": [], - "openrouter": [ + "databricks": [], + "openai": [ { - "provider_model": "anthropic/claude-3-haiku", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", "verified": true }, { - "provider_model": "anthropic/claude-3-opus", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet-20240620", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet:thinking", - "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "anthropic/claude-haiku-4.5", + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "anthropic/claude-opus-4", + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "anthropic/claude-opus-4.1", + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet-4", + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "anthropic/claude-sonnet-4.5", + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/codex-mini", - "canonical_model": "openai/codex-mini", + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-0613", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4o-audio-preview-2024-10-01", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-4o:extended", - "canonical_model": "openai/gpt-4o:extended", + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "gpt-5.1-2025-11-13", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openai/gpt-5-image", + "provider_model": "gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", "verified": true }, { - "provider_model": "openai/gpt-5-image-mini", - "canonical_model": "openai/gpt-5-image-mini", + "provider_model": "gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openai/gpt-oss-120b:exacto", + "provider_model": "o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openai/gpt-oss-20b", + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openai/gpt-oss-safeguard-20b", + "provider_model": "o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/o1", - "canonical_model": "openai/o1", + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/o3", - "canonical_model": "openai/o3", + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/o3-mini-high", - "canonical_model": "openai/o3-mini-high", + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o4-mini", + "provider_model": "o4-mini-2025-04-16", "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o4-mini-deep-research", + "provider_model": "o4-mini-deep-research", "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "openai/o4-mini-high", - "canonical_model": "openai/o4-mini-high", + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", "verified": true } ], @@ -3925,333 +3925,368 @@ "verified": true } ], - "openai": [ + "openrouter": [ { - "provider_model": "chatgpt-4o-latest", - "canonical_model": "openai/chatgpt-4o-latest", + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "anthropic/claude-3.5-sonnet-20240620", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct-0914", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", "verified": true }, { - "provider_model": "gpt-4-0125-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { - "provider_model": "gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet-4.5", "verified": true }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt-4.1", + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", "verified": true }, { - "provider_model": "gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-10-01", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-12-17", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2025-06-03", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-4o-search-preview", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "gpt-4o-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt-5", + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-5-pro-2025-10-06", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", "verified": true }, { - "provider_model": "o1", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", "verified": true }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", "verified": true }, { - "provider_model": "o3", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "o3-deep-research-2025-06-26", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", "verified": true }, { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "o3-pro-2025-06-10", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", "verified": true }, { - "provider_model": "o4-mini-2025-04-16", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", "verified": true }, { - "provider_model": "o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/o3", + "canonical_model": "openai/o3", "verified": true - } - ], - "databricks": [], - "google": [ + }, { - "provider_model": "gemini-2.0-flash", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "gemini-2.0-flash-exp", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "openai/o4-mini", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "openai/o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", + "verified": true + }, + { + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", + "verified": true + } + ], + "tetrate": [], + "google": [ + { + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-exp", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { @@ -4346,72 +4381,891 @@ } ] }, - "model_counts": { - "databricks": 143, - "openai": 625, - "anthropic": 9, - "openrouter": 217, - "tetrate": 0, - "google": 50 - }, - "canonical_models_used": [ - "openai/gpt-5-mini", - "openai/o4-mini-deep-research", - "openai/gpt-4.1-nano", - "openai/gpt-5-codex", - "google/gemini-2.0-flash", - "openai/gpt-oss-120b:exacto", - "anthropic/claude-3.7-sonnet", - "google/gemini-2.5-flash", - "openai/gpt-5-pro", - "openai/gpt-5-image-mini", - "openai/gpt-oss-120b", - "anthropic/claude-opus-4.1", - "anthropic/claude-3-opus", - "anthropic/claude-opus-4", - "openai/gpt-3.5-turbo", - "openai/gpt-4o-search", - "openai/gpt-4.1", - "openai/o3", - "google/gemini-2.5-flash-image", - "openai/gpt-4-turbo", - "openai/o3-mini", - "openai/gpt-4o:extended", - "openai/codex-mini", - "openai/o1-pro", - "openai/gpt-3.5-turbo-16k", - "openai/gpt-4o-audio", - "openai/gpt-4o", - "google/gemma-3-12b-it", - "openai/gpt-3.5-turbo-instruct", - "openai/gpt-5-nano", - "openai/o1", - "openai/gpt-oss-safeguard-20b", - "openai/gpt-5-image", - "openai/gpt-4", - "google/gemma-3-27b-it", - "openai/gpt-4.1-mini", - "openai/chatgpt-4o-latest", - "openai/o4-mini", - "openai/gpt-oss-20b", - "google/gemma-3n-e4b-it", - "google/gemini-2.5-pro", - "anthropic/claude-3.5-haiku", - "openai/o4-mini-high", - "google/gemini-2.0-flash-lite", - "openai/o3-mini-high", - "anthropic/claude-3-haiku", - "anthropic/claude-haiku-4.5", - "anthropic/claude-sonnet-4.5", - "openai/o3-pro", - "google/gemini-2.5-flash-lite", - "anthropic/claude-3.5-sonnet", - "google/gemma-3-4b-it", - "openai/gpt-4o-mini-search", - "openai/gpt-4o-mini", - "openai/o3-deep-research", - "anthropic/claude-sonnet-4", - "anthropic/claude-3.7-sonnet:thinking", - "openai/gpt-5" + "mapped_models": [ + { + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "canonical": "anthropic/claude-3-haiku" + }, + { + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "canonical": "anthropic/claude-3-opus" + }, + { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-20250514", + "canonical": "anthropic/claude-opus-4" + }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "canonical": "anthropic/claude-sonnet-4" + }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", + "canonical": "anthropic/claude-sonnet-4.5" + }, + { + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "canonical": "anthropic/claude-3.7-sonnet" + }, + { + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "canonical": "anthropic/claude-haiku-4.5" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "canonical": "anthropic/claude-opus-4.1" + }, + { + "provider": "openai", + "model": "gpt-5", + "canonical": "openai/gpt-5" + }, + { + "provider": "openai", + "model": "gpt-4-0613", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openai", + "model": "gpt-5-codex", + "canonical": "openai/gpt-5-codex" + }, + { + "provider": "openai", + "model": "o3", + "canonical": "openai/o3" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "gpt-5-pro-2025-10-06", + "canonical": "openai/gpt-5-pro" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-4.1", + "canonical": "openai/gpt-4.1" + }, + { + "provider": "openai", + "model": "o3-mini", + "canonical": "openai/o3-mini" + }, + { + "provider": "openai", + "model": "o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "o1", + "canonical": "openai/o1" + }, + { + "provider": "openai", + "model": "gpt-4-1106-preview", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" + }, + { + "provider": "openai", + "model": "o3-pro-2025-06-10", + "canonical": "openai/o3-pro" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-10-01", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-mini-search" + }, + { + "provider": "openai", + "model": "o3-deep-research", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openai", + "model": "o4-mini", + "canonical": "openai/o4-mini" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" + }, + { + "provider": "openai", + "model": "gpt-4o-search-preview", + "canonical": "openai/gpt-4o-search" + }, + { + "provider": "openai", + "model": "gpt-4o", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "gpt-5.1-2025-11-13", + "canonical": "openai/gpt-5.1" + }, + { + "provider": "openai", + "model": "o3-deep-research-2025-06-26", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openai", + "model": "gpt-5-2025-08-07", + "canonical": "openai/gpt-5" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-search-preview", + "canonical": "openai/gpt-4o-mini-search" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-1106", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-4.1-2025-04-14", + "canonical": "openai/gpt-4.1" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini-2025-04-14", + "canonical": "openai/gpt-4.1-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "o1-2024-12-17", + "canonical": "openai/o1" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" + }, + { + "provider": "openai", + "model": "o3-mini-2025-01-31", + "canonical": "openai/o3-mini" + }, + { + "provider": "openai", + "model": "o3-pro", + "canonical": "openai/o3-pro" + }, + { + "provider": "openai", + "model": "gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" + }, + { + "provider": "openai", + "model": "gpt-4-0314", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "o1-pro", + "canonical": "openai/o1-pro" + }, + { + "provider": "openai", + "model": "chatgpt-4o-latest", + "canonical": "openai/chatgpt-4o-latest" + }, + { + "provider": "openai", + "model": "gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "o3-2025-04-16", + "canonical": "openai/o3" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-0125", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-4-0125-preview", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "gpt-5.1", + "canonical": "openai/gpt-5.1" + }, + { + "provider": "openai", + "model": "gpt-4.1-nano-2025-04-14", + "canonical": "openai/gpt-4.1-nano" + }, + { + "provider": "openai", + "model": "gpt-5-mini-2025-08-07", + "canonical": "openai/gpt-5-mini" + }, + { + "provider": "openai", + "model": "gpt-5-mini", + "canonical": "openai/gpt-5-mini" + }, + { + "provider": "openai", + "model": "o1-pro-2025-03-19", + "canonical": "openai/o1-pro" + }, + { + "provider": "openai", + "model": "gpt-5-nano", + "canonical": "openai/gpt-5-nano" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-instruct-0914", + "canonical": "openai/gpt-3.5-turbo-instruct" + }, + { + "provider": "openai", + "model": "gpt-5-nano-2025-08-07", + "canonical": "openai/gpt-5-nano" + }, + { + "provider": "openai", + "model": "gpt-5-pro", + "canonical": "openai/gpt-5-pro" + }, + { + "provider": "openai", + "model": "o4-mini-deep-research-2025-06-26", + "canonical": "openai/o4-mini-deep-research" + }, + { + "provider": "openai", + "model": "gpt-4", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "o4-mini-2025-04-16", + "canonical": "openai/o4-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-search" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-instruct", + "canonical": "openai/gpt-3.5-turbo-instruct" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-codex", + "canonical": "openai/gpt-5-codex" + }, + { + "provider": "openrouter", + "model": "openai/o1", + "canonical": "openai/o1" + }, + { + "provider": "openrouter", + "model": "openai/o3-mini-high", + "canonical": "openai/o3-mini-high" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5", + "canonical": "openai/gpt-5" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openrouter", + "model": "openai/o3-pro", + "canonical": "openai/o3-pro" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3-opus", + "canonical": "anthropic/claude-3-opus" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-0314", + "canonical": "openai/gpt-4" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini", + "canonical": "openai/o4-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1", + "canonical": "openai/gpt-5.1" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-safeguard-20b", + "canonical": "openai/gpt-oss-safeguard-20b" + }, + { + "provider": "openrouter", + "model": "openai/o3", + "canonical": "openai/o3" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-sonnet-20240620", + "canonical": "anthropic/claude-3.5-sonnet" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview-05-06", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o:extended", + "canonical": "openai/gpt-4o:extended" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-mini", + "canonical": "openai/gpt-5-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-1106-preview", + "canonical": "openai/gpt-4" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.7-sonnet:thinking", + "canonical": "anthropic/claude-3.7-sonnet:thinking" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "google/gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-image-mini", + "canonical": "openai/gpt-5-image-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-120b:exacto", + "canonical": "openai/gpt-oss-120b" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini-high", + "canonical": "openai/o4-mini-high" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-001", + "canonical": "google/gemini-2.0-flash" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-120b", + "canonical": "openai/gpt-oss-120b" + }, + { + "provider": "openrouter", + "model": "openai/o3-deep-research", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-opus-4", + "canonical": "anthropic/claude-opus-4" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-haiku-4.5", + "canonical": "anthropic/claude-haiku-4.5" + }, + { + "provider": "openrouter", + "model": "openai/o3-mini", + "canonical": "openai/o3-mini" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.5", + "canonical": "anthropic/claude-sonnet-4.5" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-20b", + "canonical": "openai/gpt-oss-20b" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3-haiku", + "canonical": "anthropic/claude-3-haiku" + }, + { + "provider": "openrouter", + "model": "openai/codex-mini", + "canonical": "openai/codex-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-nano", + "canonical": "openai/gpt-5-nano" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1", + "canonical": "openai/gpt-4.1" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-image", + "canonical": "openai/gpt-5-image" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-06-17", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4", + "canonical": "openai/gpt-4" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-pro", + "canonical": "openai/gpt-5-pro" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-opus-4.1", + "canonical": "anthropic/claude-opus-4.1" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-0613", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku", + "canonical": "anthropic/claude-3.5-haiku" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-preview-02-05", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-image-preview", + "canonical": "google/gemini-2.5-flash-image" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-06-17", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-001", + "canonical": "google/gemini-2.0-flash" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-05-06", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-03-25", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-preview-05-20", + "canonical": "google/gemini-2.5-flash" + }, + { + "provider": "google", + "model": "gemma-3n-e4b-it", + "canonical": "google/gemma-3n-e4b-it" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-exp", + "canonical": "google/gemini-2.0-flash" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-image", + "canonical": "google/gemini-2.5-flash-image" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "google", + "model": "gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" + }, + { + "provider": "google", + "model": "gemma-3-4b-it", + "canonical": "google/gemma-3-4b-it" + }, + { + "provider": "google", + "model": "gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" + }, + { + "provider": "google", + "model": "gemini-2.5-pro-preview-06-05", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" + }, + { + "provider": "google", + "model": "gemini-2.0-flash-lite-preview", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "google", + "model": "gemini-2.0-flash", + "canonical": "google/gemini-2.0-flash" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "google", + "model": "gemma-3-12b-it", + "canonical": "google/gemma-3-12b-it" + } + ], + "model_counts": { + "openai": 630, + "anthropic": 9, + "openrouter": 219, + "databricks": 143, + "google": 50, + "tetrate": 0 + }, + "canonical_models_used": [ + "openai/gpt-5.1-codex", + "openai/gpt-5-pro", + "openai/gpt-4.1", + "openai/o3-pro", + "openai/o4-mini-high", + "openai/gpt-4", + "anthropic/claude-opus-4.1", + "openai/codex-mini", + "openai/gpt-3.5-turbo-instruct", + "openai/gpt-oss-20b", + "google/gemma-3-12b-it", + "google/gemini-2.5-flash", + "openai/gpt-4.1-mini", + "anthropic/claude-sonnet-4.5", + "openai/gpt-4o-mini", + "openai/gpt-4.1-nano", + "google/gemma-3-27b-it", + "anthropic/claude-haiku-4.5", + "openai/gpt-3.5-turbo-16k", + "anthropic/claude-3.5-sonnet", + "google/gemini-2.0-flash", + "google/gemma-3n-e4b-it", + "openai/o3-deep-research", + "openai/gpt-5-image-mini", + "google/gemini-2.5-pro", + "anthropic/claude-3.5-haiku", + "openai/gpt-4o-mini-search", + "openai/gpt-5.1", + "openai/gpt-4o:extended", + "openai/gpt-3.5-turbo", + "google/gemini-2.5-flash-image", + "openai/gpt-5-mini", + "openai/gpt-oss-120b", + "openai/gpt-4-turbo", + "openai/o3-mini-high", + "openai/gpt-4o-search", + "openai/o4-mini-deep-research", + "openai/o1", + "openai/gpt-5-codex", + "openai/gpt-4o-audio", + "google/gemma-3-4b-it", + "openai/o1-pro", + "openai/gpt-oss-safeguard-20b", + "anthropic/claude-3.7-sonnet:thinking", + "openai/gpt-5", + "anthropic/claude-sonnet-4", + "openai/gpt-5-nano", + "openai/o3", + "anthropic/claude-3-haiku", + "google/gemini-2.5-flash-lite", + "openai/gpt-4o", + "openai/gpt-5.1-codex-mini", + "anthropic/claude-3-opus", + "openai/o3-mini", + "openai/chatgpt-4o-latest", + "google/gemini-2.0-flash-lite", + "openai/gpt-5-image", + "anthropic/claude-3.7-sonnet", + "openai/o4-mini", + "anthropic/claude-opus-4" ] } \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/report_20251113_145809.json b/crates/goose/src/providers/canonical/data/report_20251113_145809.json deleted file mode 100644 index b66993dc006c..000000000000 --- a/crates/goose/src/providers/canonical/data/report_20251113_145809.json +++ /dev/null @@ -1,1276 +0,0 @@ -[ - { - "id": "anthropic/claude-3-haiku", - "name": "Anthropic: Claude 3 Haiku", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 1.25e-6, - "request": 0.0, - "image": 0.0004 - } - }, - { - "id": "anthropic/claude-3-opus", - "name": "Anthropic: Claude 3 Opus", - "context_length": 200000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-3.5-haiku", - "name": "Anthropic: Claude 3.5 Haiku", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 8e-7, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-3.5-sonnet", - "name": "Anthropic: Claude 3.5 Sonnet", - "context_length": 200000, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet", - "name": "Anthropic: Claude 3.7 Sonnet", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-3.7-sonnet:thinking", - "name": "Anthropic: Claude 3.7 Sonnet (thinking)", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-haiku-4.5", - "name": "Anthropic: Claude Haiku 4.5", - "context_length": 200000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 1e-6, - "completion": 5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "anthropic/claude-opus-4", - "name": "Anthropic: Claude Opus 4", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-opus-4.1", - "name": "Anthropic: Claude Opus 4.1", - "context_length": 200000, - "max_completion_tokens": 32000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.000075, - "request": 0.0, - "image": 0.024 - } - }, - { - "id": "anthropic/claude-sonnet-4", - "name": "Anthropic: Claude Sonnet 4", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0048 - } - }, - { - "id": "anthropic/claude-sonnet-4.5", - "name": "Anthropic: Claude Sonnet 4.5", - "context_length": 1000000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Claude", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.0-flash", - "name": "Google: Gemini 2.0 Flash", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0000258 - } - }, - { - "id": "google/gemini-2.0-flash-lite", - "name": "Google: Gemini 2.0 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-flash", - "name": "Google: Gemini 2.5 Flash", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-image", - "name": "Google: Gemini 2.5 Flash Image (Nano Banana)", - "context_length": 32768, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-7, - "completion": 2.5e-6, - "request": 0.0, - "image": 0.001238 - } - }, - { - "id": "google/gemini-2.5-flash-lite", - "name": "Google: Gemini 2.5 Flash Lite", - "context_length": 1048576, - "max_completion_tokens": 65535, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemini-2.5-pro", - "name": "Google: Gemini 2.5 Pro", - "context_length": 1048576, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.00516 - } - }, - { - "id": "google/gemma-2-27b-it", - "name": "Google: Gemma 2 27B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 6.5e-7, - "completion": 6.5e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-2-9b-it", - "name": "Google: Gemma 2 9B", - "context_length": 8192, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 9e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-12b-it", - "name": "Google: Gemma 3 12B", - "context_length": 131072, - "max_completion_tokens": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 3e-8, - "completion": 1e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3-27b-it", - "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": true, - "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, - "request": 0.0, - "image": 0.0000256 - } - }, - { - "id": "google/gemma-3-4b-it", - "name": "Google: Gemma 3 4B", - "context_length": 96000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 1.703012e-8, - "completion": 6.81536e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "google/gemma-3n-e4b-it", - "name": "Google: Gemma 3n 4B", - "context_length": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "Gemini", - "supports_tools": false, - "pricing": { - "prompt": 2e-8, - "completion": 4e-8, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/chatgpt-4o-latest", - "name": "OpenAI: ChatGPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 5e-6, - "completion": 0.000015, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/codex-mini", - "name": "OpenAI: Codex Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo", - "name": "OpenAI: GPT-3.5 Turbo", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-7, - "completion": 1.5e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-16k", - "name": "OpenAI: GPT-3.5 Turbo 16k", - "context_length": 16385, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-6, - "completion": 4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-3.5-turbo-instruct", - "name": "OpenAI: GPT-3.5 Turbo Instruct", - "context_length": 4095, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4", - "name": "OpenAI: GPT-4", - "context_length": 8191, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00003, - "completion": 0.00006, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4-turbo", - "name": "OpenAI: GPT-4 Turbo", - "context_length": 128000, - "max_completion_tokens": 4096, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00003, - "request": 0.0, - "image": 0.01445 - } - }, - { - "id": "openai/gpt-4.1", - "name": "OpenAI: GPT-4.1", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-mini", - "name": "OpenAI: GPT-4.1 Mini", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 4e-7, - "completion": 1.6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4.1-nano", - "name": "OpenAI: GPT-4.1 Nano", - "context_length": 1047576, - "max_completion_tokens": 32768, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1e-7, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o", - "name": "OpenAI: GPT-4o", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o-audio", - "name": "OpenAI: GPT-4o Audio", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-4o-mini", - "name": "OpenAI: GPT-4o-mini", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-mini-search", - "name": "OpenAI: GPT-4o-mini Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.5e-7, - "completion": 6e-7, - "request": 0.0275, - "image": 0.000217 - } - }, - { - "id": "openai/gpt-4o-search", - "name": "OpenAI: GPT-4o Search Preview", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 2.5e-6, - "completion": 0.00001, - "request": 0.035, - "image": 0.003613 - } - }, - { - "id": "openai/gpt-4o:extended", - "name": "OpenAI: GPT-4o (extended)", - "context_length": 128000, - "max_completion_tokens": 64000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 6e-6, - "completion": 0.000018, - "request": 0.0, - "image": 0.007225 - } - }, - { - "id": "openai/gpt-5", - "name": "OpenAI: GPT-5", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-chat", - "name": "OpenAI: GPT-5 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-codex", - "name": "OpenAI: GPT-5 Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-image", - "name": "OpenAI: GPT-5 Image", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00001, - "request": 0.0, - "image": 0.00001 - } - }, - { - "id": "openai/gpt-5-image-mini", - "name": "OpenAI: GPT-5 Image Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-6, - "completion": 2e-6, - "request": 0.0, - "image": 2.5e-6 - } - }, - { - "id": "openai/gpt-5-mini", - "name": "OpenAI: GPT-5 Mini", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2.5e-7, - "completion": 2e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-nano", - "name": "OpenAI: GPT-5 Nano", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5-pro", - "name": "OpenAI: GPT-5 Pro", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00012, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5.1", - "name": "OpenAI: GPT-5.1", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5.1-chat", - "name": "OpenAI: GPT-5.1 Chat", - "context_length": 128000, - "max_completion_tokens": 16384, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5.1-codex", - "name": "OpenAI: GPT-5.1-Codex", - "context_length": 400000, - "max_completion_tokens": 128000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.25e-6, - "completion": 0.00001, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-5.1-codex-mini", - "name": "OpenAI: GPT-5.1-Codex-Mini", - "context_length": 400000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-120b", - "name": "OpenAI: gpt-oss-120b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-20b", - "name": "OpenAI: gpt-oss-20b", - "context_length": 131072, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 3e-8, - "completion": 1.4e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/gpt-oss-safeguard-20b", - "name": "OpenAI: gpt-oss-safeguard-20b", - "context_length": 131072, - "max_completion_tokens": 65536, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 7.5e-8, - "completion": 3e-7, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o1", - "name": "OpenAI: o1", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.000015, - "completion": 0.00006, - "request": 0.0, - "image": 0.021675 - } - }, - { - "id": "openai/o1-pro", - "name": "OpenAI: o1-pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": false, - "pricing": { - "prompt": 0.00015, - "completion": 0.0006, - "request": 0.0, - "image": 0.21675 - } - }, - { - "id": "openai/o3", - "name": "OpenAI: o3", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o3-deep-research", - "name": "OpenAI: o3 Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00001, - "completion": 0.00004, - "request": 0.0, - "image": 0.00765 - } - }, - { - "id": "openai/o3-mini", - "name": "OpenAI: o3 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-mini-high", - "name": "OpenAI: o3 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0 - } - }, - { - "id": "openai/o3-pro", - "name": "OpenAI: o3 Pro", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 0.00002, - "completion": 0.00008, - "request": 0.0, - "image": 0.0153 - } - }, - { - "id": "openai/o4-mini", - "name": "OpenAI: o4 Mini", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - }, - { - "id": "openai/o4-mini-deep-research", - "name": "OpenAI: o4 Mini Deep Research", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 2e-6, - "completion": 8e-6, - "request": 0.0, - "image": 0.00153 - } - }, - { - "id": "openai/o4-mini-high", - "name": "OpenAI: o4 Mini High", - "context_length": 200000, - "max_completion_tokens": 100000, - "input_modalities": [ - "text" - ], - "output_modalities": [ - "text" - ], - "tokenizer": "GPT", - "supports_tools": true, - "pricing": { - "prompt": 1.1e-6, - "completion": 4.4e-6, - "request": 0.0, - "image": 0.0008415 - } - } -] \ No newline at end of file From 19d65b5a931ac19ce0af1ed7c1a2f126256a8afc Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 14 Nov 2025 01:47:00 -0500 Subject: [PATCH 17/52] nuke a bunch of comments --- .../goose/examples/build_canonical_models.rs | 21 ----------------- .../goose/examples/canonical_model_checker.rs | 23 ------------------- 2 files changed, 44 deletions(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 45d47f607c4a..93e08dab65ee 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -10,15 +10,12 @@ use serde_json::Value; use std::collections::HashMap; const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/models"; - -// Providers we want to include const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai"]; #[tokio::main] async fn main() -> Result<()> { println!("Fetching models from OpenRouter API..."); - // Fetch models from OpenRouter let client = reqwest::Client::new(); let response = client .get(OPENROUTER_API_URL) @@ -49,20 +46,17 @@ async fn main() -> Result<()> { // Skip OpenRouter-specific pricing variants (:free, :nitro) // Keep :extended since it has different context length - // :exacto will be stripped to map to base model if id.contains(":free") || id.contains(":nitro") { continue; } let canonical_id = canonical_name("openrouter", id); - // Filter to only allowed providers let provider = canonical_id.split('/').next().unwrap_or(""); if !ALLOWED_PROVIDERS.contains(&provider) { continue; } - // Get pricing info for this model let prompt_cost = model .get("pricing") .and_then(|p| p.get("prompt")) @@ -79,11 +73,9 @@ async fn main() -> Result<()> { let has_paid_pricing = prompt_cost > 0.0 || completion_cost > 0.0; - // Check if we've seen this canonical ID before if let Some(existing_model) = canonical_groups.get(&canonical_id) { let existing_name = shortest_names.get(&canonical_id).unwrap(); - // Get existing pricing info let existing_prompt = existing_model .get("pricing") .and_then(|p| p.get("prompt")) @@ -100,7 +92,6 @@ async fn main() -> Result<()> { let existing_has_paid = existing_prompt > 0.0 || existing_completion > 0.0; - // Prefer paid pricing over free, otherwise prefer shorter name let should_replace = if has_paid_pricing != existing_has_paid { has_paid_pricing // Prefer the one with paid pricing } else { @@ -110,12 +101,8 @@ async fn main() -> Result<()> { if should_replace { println!(" Updating {} from '{}' (paid: {}) to '{}' (paid: {})", canonical_id, existing_model["id"].as_str().unwrap(), existing_has_paid, id, has_paid_pricing); - // Keep the shorter name, but use the new model data (for pricing) if name.len() >= existing_name.len() { - // New model's name is longer or equal, keep the existing shorter name - // (Don't update shortest_names) } else { - // New model's name is shorter, update it shortest_names.insert(canonical_id.clone(), name.to_string()); } canonical_groups.insert(canonical_id, model); @@ -133,17 +120,14 @@ async fn main() -> Result<()> { for (canonical_id, model) in canonical_groups.iter() { let name = shortest_names.get(canonical_id).unwrap(); - // Parse context length let context_length = model["context_length"].as_u64().unwrap_or(128_000) as usize; - // Parse max completion tokens (if available) let max_completion_tokens = model .get("top_provider") .and_then(|tp| tp.get("max_completion_tokens")) .and_then(|v| v.as_u64()) .map(|v| v as usize); - // Parse modalities let input_modalities: Vec = model .get("supported_parameters") .and_then(|v| v.as_array()) @@ -171,7 +155,6 @@ async fn main() -> Result<()> { } } } - // Check if model has file support if model.get("architecture").and_then(|a| a.get("multimodality")).is_some() { if !mods.contains(&"file".to_string()) { mods.push("file".to_string()); @@ -183,7 +166,6 @@ async fn main() -> Result<()> { let output_modalities = vec!["text".to_string()]; - // Determine tokenizer based on provider let tokenizer = if canonical_id.starts_with("anthropic/") { "Claude" } else if canonical_id.starts_with("openai/") { @@ -195,7 +177,6 @@ async fn main() -> Result<()> { } .to_string(); - // Check if model supports tool calling let supports_tools = model .get("supported_parameters") .and_then(|v| v.as_array()) @@ -206,7 +187,6 @@ async fn main() -> Result<()> { }) .unwrap_or(false); - // Parse pricing (convert strings to f64) let pricing_obj = model.get("pricing").unwrap(); let pricing = Pricing { prompt: pricing_obj @@ -242,7 +222,6 @@ async fn main() -> Result<()> { registry.register(canonical_model); } - // Write to file use std::path::PathBuf; let output_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) diff --git a/crates/goose/examples/canonical_model_checker.rs b/crates/goose/examples/canonical_model_checker.rs index c9564a6ac9b7..f97e9608e6e2 100644 --- a/crates/goose/examples/canonical_model_checker.rs +++ b/crates/goose/examples/canonical_model_checker.rs @@ -81,13 +81,11 @@ impl MappingReport { fetched_models: Vec, mappings: Vec, ) { - // Build a map of provider model -> canonical model let mapping_map: HashMap = mappings .iter() .map(|m| (m.provider_model.clone(), m.canonical_model.clone())) .collect(); - // Find unmapped models for model in &fetched_models { if !mapping_map.contains_key(model) { self.unmapped_models.push(ProviderModelPair { @@ -97,7 +95,6 @@ impl MappingReport { } } - // Track canonical models used and build flat mapping list for (model, canonical) in &mapping_map { self.canonical_models_used.insert(canonical.clone()); self.mapped_models.push(MappingEntry { @@ -107,7 +104,6 @@ impl MappingReport { }); } - // Store mappings and counts self.all_mappings.insert(provider_name.to_string(), mappings); self.model_counts.insert(provider_name.to_string(), fetched_models.len()); } @@ -118,7 +114,6 @@ impl MappingReport { println!("{}", "=".repeat(80)); println!("\nGenerated: {}\n", self.timestamp); - // Print model counts per provider println!("Models Checked Per Provider:"); println!("{}", "-".repeat(80)); let mut providers: Vec<_> = self.model_counts.iter().collect(); @@ -133,7 +128,6 @@ impl MappingReport { provider, count, mapped, unmapped); } - // Print unmapped models println!("\n{}", "=".repeat(80)); println!("UNMAPPED MODELS ({})", self.unmapped_models.len()); println!("{}", "=".repeat(80)); @@ -162,7 +156,6 @@ impl MappingReport { } } - // Print canonical models used println!("\n{}", "=".repeat(80)); println!("CANONICAL MODELS REFERENCED ({})", self.canonical_models_used.len()); println!("{}", "=".repeat(80)); @@ -184,8 +177,6 @@ impl MappingReport { println!("CHANGES SINCE PREVIOUS RUN"); println!("{}", "=".repeat(80)); - // Build lookup maps for current and previous mappings - // Key: (provider, model), Value: canonical model let mut prev_map: HashMap<(String, String), String> = HashMap::new(); for entry in &previous.mapped_models { prev_map.insert((entry.provider.clone(), entry.model.clone()), entry.canonical.clone()); @@ -196,20 +187,16 @@ impl MappingReport { curr_map.insert((entry.provider.clone(), entry.model.clone()), entry.canonical.clone()); } - // Find changes let mut changed_mappings = Vec::new(); let mut added_mappings = Vec::new(); let mut removed_mappings = Vec::new(); - // Check current mappings against previous for (key @ (provider, model), canonical) in &curr_map { match prev_map.get(key) { Some(prev_canonical) if prev_canonical != canonical => { - // Mapping changed changed_mappings.push((provider.clone(), model.clone(), prev_canonical.clone(), canonical.clone())); } None => { - // New mapping added_mappings.push((provider.clone(), model.clone(), canonical.clone())); } _ => { @@ -218,14 +205,12 @@ impl MappingReport { } } - // Check for removed mappings for (key @ (provider, model), canonical) in &prev_map { if !curr_map.contains_key(key) { removed_mappings.push((provider.clone(), model.clone(), canonical.clone())); } } - // Print changes if changed_mappings.is_empty() && added_mappings.is_empty() && removed_mappings.is_empty() { println!("\nNo changes in model mappings."); } else { @@ -282,7 +267,6 @@ async fn check_provider( ) -> Result<(Vec, Vec)> { println!("Checking provider: {}", provider_name); - // Create provider instance (using a default model for initialization) let provider = match create_with_named_model(provider_name, model_for_init).await { Ok(p) => p, Err(e) => { @@ -292,7 +276,6 @@ async fn check_provider( } }; - // Fetch supported models let fetched_models = match provider.fetch_supported_models().await { Ok(Some(models)) => { println!(" ✓ Fetched {} models", models.len()); @@ -309,7 +292,6 @@ async fn check_provider( } }; - // Map each fetched model to canonical model let mut mappings = Vec::new(); for model in &fetched_models { match provider.map_to_canonical_model(model).await { @@ -346,17 +328,14 @@ async fn main() -> Result<()> { let mut report = MappingReport::new(); - // Check each provider for (provider_name, default_model) in providers { let (fetched, mappings) = check_provider(provider_name, default_model).await?; report.add_provider_results(provider_name, fetched, mappings); println!(); } - // Print summary report.print_summary(); - // Parse command line arguments let args: Vec = std::env::args().collect(); let output_path = if args.len() > 2 && args[1] == "--output" { PathBuf::from(&args[2]) @@ -365,14 +344,12 @@ async fn main() -> Result<()> { .join("src/providers/canonical/data/canonical_mapping_report.json") }; - // Try to compare with previous run if output_path.exists() { if let Ok(previous) = MappingReport::load_from_file(&output_path) { report.compare_with_previous(&previous); } } - // Save report report.save_to_file(&output_path)?; println!("\n✓ Report saved to: {}", output_path.display()); From 38134bbfc95811a8b85e67aabd2218182dde9168 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 14 Nov 2025 01:56:50 -0500 Subject: [PATCH 18/52] more cleanup --- crates/goose/src/providers/base.rs | 4 - .../goose/src/providers/canonical/README.md | 191 +----------------- crates/goose/src/providers/canonical/model.rs | 40 ---- .../src/providers/canonical/name_builder.rs | 181 +++-------------- .../goose/src/providers/canonical/registry.rs | 25 --- 5 files changed, 39 insertions(+), 402 deletions(-) diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index 02777623676c..d8720f7160e9 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -416,13 +416,9 @@ pub trait Provider: Send + Sync { Ok(None) } - /// Map a provider-specific model name to a canonical model ID - /// Returns the canonical model ID (e.g., "anthropic/claude-3-5-sonnet") if a mapping exists - /// Default implementation uses the provider's name and canonical_name() function async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { let canonical = canonical_name(self.get_name(), provider_model); - // Check if this canonical model exists in our registry if CanonicalModelRegistry::bundled_contains(&canonical)? { Ok(Some(canonical)) } else { diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 2c0b6658b73a..8befaf04f15f 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -1,191 +1,22 @@ # Canonical Model System -This directory contains the canonical model infrastructure for standardizing model metadata across different providers. +Provides a unified view of model metadata (pricing, capabilities, context limits) across different LLM providers. Normalizes provider-specific model names (e.g., `claude-3-5-sonnet-20241022`) to canonical IDs (e.g., `anthropic/claude-3.5-sonnet`). -## Overview - -The canonical model system provides a unified view of model metadata across different LLM providers. It's based on OpenRouter's model schema and maintained through automated fetching: - -1. **Canonical registry** - Models with standardized metadata from OpenRouter -2. **Provider mapping layer** - Maps provider-specific model names to canonical models -3. **Automated updates** - Rust script to re-fetch models from OpenRouter's API - -## Components - -### `model.rs` - -Defines the core data structures based on OpenRouter's schema: - -- `CanonicalModel`: Complete model metadata including: - - IDs: `id` (API identifier), `canonical_slug` (standardized reference) - - Basic info: name, description, context_length - - `Architecture`: Modality, input/output types, tokenizer info - - `Pricing`: Per-token costs (prompt, completion, cache read/write) - - `TopProvider`: Context limits and moderation status - - Supported parameters (for tools, temperature, etc.) - -### `registry.rs` - -Provides model registry management: - -- `CanonicalModelRegistry`: In-memory registry of canonical models -- Load/save from/to JSON files -- Query and lookup operations using `canonical_slug` - -### `canonical_models.json` - -JSON file containing canonical model definitions fetched from OpenRouter. Currently includes models from: -- anthropic -- google -- openai - -## Updating Models - -To refresh the canonical models from OpenRouter's API: +## Scripts +### Build Canonical Models +Fetches latest model metadata from OpenRouter and updates the registry: ```bash cargo run --example build_canonical_models ``` +Writes to: `src/providers/canonical/data/canonical_models.json` -This script: -1. Fetches all models from OpenRouter's `/models` endpoint -2. Transforms the data into our canonical format: - - Strips version suffixes while preserving model family versions - - Detects tool support from `supported_parameters` - - Converts pricing strings to numeric types -3. Filters to only allowed providers (anthropic, google, openai) -4. Generates a new `canonical_models.json` file - -The generated files will be written to: -``` -crates/goose/src/providers/canonical/data/canonical_models.json -crates/goose/src/providers/canonical/data/report_YYYYMMDD_HHMMSS.json -``` - -## Usage - -### For Provider Implementors - -Implement the `map_to_canonical_models()` method in your provider to map provider-specific model IDs to canonical slugs: - -```rust -async fn map_to_canonical_models(&self) -> Result, ProviderError> { - let models = self.fetch_supported_models().await? - .unwrap_or_default(); - - let mut mappings = Vec::new(); - - for model in models { - // Map your provider's model ID to canonical slug - let canonical_slug = match model.as_str() { - "claude-3-5-sonnet-20241022" => "anthropic/claude-3-5-sonnet", - "claude-3-5-sonnet-20250219" => "anthropic/claude-3-7-sonnet-20250219", - "gpt-4-turbo-2024-04-09" => "openai/gpt-4-turbo", - "gemini-1.5-pro" => "google/gemini-1-5-pro", - // ... more mappings - _ => continue, // Skip unmapped models - }; - - mappings.push( - ModelMapping::new(model, canonical_slug).verified() - ); - } - - Ok(mappings) -} -``` - -### Using Canonical Models - -```rust -use goose::providers::canonical::CanonicalModelRegistry; - -// Load the registry -let registry = CanonicalModelRegistry::from_file("canonical_models.json")?; - -// Look up a model by canonical slug -if let Some(model) = registry.get("anthropic/claude-3-5-sonnet") { - println!("Model: {}", model.name); - println!("Context: {} tokens", model.context_length); - println!("Supports tools: {}", model.supports_tools()); - println!("Supports vision: {}", model.supports_vision()); - - if let (Some(prompt_cost), Some(completion_cost)) = - (model.prompt_cost(), model.completion_cost()) { - println!("Pricing: ${}/1M prompt, ${}/1M completion", - prompt_cost * 1_000_000.0, - completion_cost * 1_000_000.0); - } -} -``` - -### Testing Your Mappings - -Use the `canonical_model_checker` example to test your mappings: - +### Check Model Mappings +Tests provider model mappings and tracks changes over time: ```bash cargo run --example canonical_model_checker ``` - -This will: -- Fetch models from all major providers -- Check which models are mapped to canonical models -- Report unmapped models -- Show canonical models in use -- Compare with previous runs to detect mapping changes -- Generate output file: `src/providers/canonical/data/canonical_mapping_report.json` - -**Lock File / Diff Functionality:** - -The checker maintains `canonical_mapping_report.json` which stores all (provider, model) -> canonical model mappings along with the full report. On subsequent runs, it compares against this file and reports: -- **Changed Mappings**: Models that now map to a different canonical model -- **Added Mappings**: Models that gained a canonical mapping -- **Removed Mappings**: Models that lost their canonical mapping - -This helps you track changes in model mappings over time, similar to how package lock files work. - -**Note:** Requires proper provider credentials to be configured. - -### Adding New Providers - -To add support for a new provider (e.g., "mistral"): - -1. Update the `ALLOWED_PROVIDERS` list in `examples/build_canonical_models.rs`: - ```rust - const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai", "mistral"]; - ``` - -2. Re-run the build script: - ```bash - cargo run --example build_canonical_models - ``` - -## Model Metadata Fields - -Fields from OpenRouter's schema: - -- **`id`**: OpenRouter's API identifier (e.g., "anthropic/claude-sonnet-4.5") -- **`canonical_slug`**: Standardized reference with version (e.g., "anthropic/claude-4.5-sonnet-20250929") - - This is our primary key for model lookups -- **`name`**: Human-readable name -- **`created`**: Unix timestamp of model creation -- **`description`**: Detailed model description -- **`context_length`**: Maximum context window in tokens -- **`architecture`**: Modality info, input/output types, tokenizer -- **`pricing`**: Per-token costs in USD (prompt, completion, cache read/write, images) -- **`top_provider`**: Context limits and moderation status from best provider -- **`supported_parameters`**: List of supported parameters (tools, temperature, etc.) - -Helper methods on `CanonicalModel`: -- `supports_tools()` - Check if model supports tool/function calling -- `supports_vision()` - Check if model supports image inputs -- `supports_cache()` - Check if model supports prompt caching -- `provider()` - Extract provider name from canonical slug -- `prompt_cost()` / `completion_cost()` - Parse pricing as f64 - -## Goals - -- **Consistency**: Standardized model information across providers -- **Validation**: Ensure all models have proper metadata -- **Tracking**: Monitor when providers add/remove models -- **Selection**: Filter models by capability (e.g., exclude voice models from chat UI) +- Reports unmapped models +- Compares with previous runs (like a lock file) +- Shows changed/added/removed mappings +- Writes to: `src/providers/canonical/data/canonical_mapping_report.json` diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 188effe9b262..6791eca190f1 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -55,43 +55,3 @@ pub struct CanonicalModel { pub pricing: Pricing, } -impl CanonicalModel { - /// Check if the model supports vision/image inputs - pub fn supports_vision(&self) -> bool { - self.input_modalities.contains(&"image".to_string()) - } - - /// Get the provider name from the id (e.g., "anthropic" from "anthropic/claude-3-5-sonnet") - pub fn provider(&self) -> Option<&str> { - self.id.split('/').next() - } - - /// Get the model name without the provider prefix (may include variant like ":extended") - pub fn model_name(&self) -> Option<&str> { - self.id.split('/').nth(1) - } - - /// Get the base model ID without variant (e.g., "anthropic/claude-3.7-sonnet:thinking" -> "anthropic/claude-3.7-sonnet") - pub fn base_model_id(&self) -> String { - if let Some(pos) = self.id.rfind(':') { - self.id[..pos].to_string() - } else { - self.id.clone() - } - } - - /// Get the variant suffix if present (e.g., "thinking" from "claude-3.7-sonnet:thinking") - pub fn variant(&self) -> Option<&str> { - self.id.split(':').nth(1) - } - - /// Get prompt cost as f64 (cost per token) - pub fn prompt_cost(&self) -> Option { - self.pricing.prompt - } - - /// Get completion cost as f64 (cost per token) - pub fn completion_cost(&self) -> Option { - self.pricing.completion - } -} diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index ada8d2f8f81c..6d9eddc8f8cb 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -1,16 +1,4 @@ /// Build canonical model name from provider and model identifiers -/// -/// This function handles different provider conventions: -/// - **OpenRouter**: Models are already in canonical format (e.g., "anthropic/claude-3.5-sonnet"), -/// so just strip version suffixes -/// - **Other providers** (Anthropic, OpenAI, Google, etc.): Prefix with provider name and strip -/// version suffixes -/// -/// Examples: -/// - `canonical_name("anthropic", "claude-3-5-sonnet-20241022")` → `"anthropic/claude-3-5-sonnet"` -/// - `canonical_name("openai", "gpt-4-turbo-2024-04-09")` → `"openai/gpt-4-turbo"` -/// - `canonical_name("google", "gemini-1.5-pro-002")` → `"google/gemini-1.5-pro"` -/// - `canonical_name("openrouter", "anthropic/claude-3.5-sonnet")` → `"anthropic/claude-3.5-sonnet"` pub fn canonical_name(provider: &str, model: &str) -> String { let model_base = strip_version_suffix(model); @@ -23,22 +11,6 @@ pub fn canonical_name(provider: &str, model: &str) -> String { } /// Strip version suffixes from model names and normalize version numbers -/// -/// First normalizes version numbers (e.g., `-3-5-` → `-3.5-`), then strips: -/// - `-20241022` (8-digit dates) -/// - `-2024-04-09` (YYYY-MM-DD dates) -/// - `-002`, `-001` (patch versions: 3+ digits only, preserves model family like `-4`, `-4.5`) -/// - `-v1.5` (semantic versions with "v" prefix) -/// - `-exp`, `-exp-1219`, `-exp-01-21` (experimental suffixes) -/// - `-preview`, `-preview-09`, `-preview-05-20` (preview suffixes) -/// -/// Examples: -/// - `strip_version_suffix("claude-3-5-sonnet-20241022")` → `"claude-3.5-sonnet"` -/// - `strip_version_suffix("claude-sonnet-4.5")` → `"claude-sonnet-4.5"` (preserves model family) -/// - `strip_version_suffix("gpt-4-turbo-2024-04-09")` → `"gpt-4-turbo"` -/// - `strip_version_suffix("gemini-1.5-pro-002")` → `"gemini-1.5-pro"` -/// - `strip_version_suffix("gemini-2.0-flash-exp")` → `"gemini-2.0-flash"` -/// - `strip_version_suffix("gemini-2.5-flash-preview-05-20")` → `"gemini-2.5-flash"` pub fn strip_version_suffix(model: &str) -> String { // First, normalize version numbers: convert -X-Y- to -X.Y- (e.g., -3-5- to -3.5-) // This handles cases where Anthropic uses dashes (claude-3-5-haiku) but OpenRouter uses dots (claude-3.5-haiku) @@ -73,159 +45,62 @@ mod tests { use super::*; #[test] - fn test_canonical_name_anthropic() { - assert_eq!( - canonical_name("anthropic", "claude-3-5-sonnet-20241022"), - "anthropic/claude-3.5-sonnet" - ); - } - - #[test] - fn test_canonical_name_openai() { - assert_eq!( - canonical_name("openai", "gpt-4-turbo-2024-04-09"), - "openai/gpt-4-turbo" - ); - } - - #[test] - fn test_canonical_name_google() { - assert_eq!( - canonical_name("google", "gemini-1.5-pro-002"), - "google/gemini-1.5-pro" - ); - } - - #[test] - fn test_canonical_name_no_version() { - assert_eq!( - canonical_name("anthropic", "claude-3-5-sonnet"), - "anthropic/claude-3.5-sonnet" - ); - } + fn test_canonical_names() { + // canonical_name tests + assert_eq!(canonical_name("anthropic", "claude-3-5-sonnet-20241022"), "anthropic/claude-3.5-sonnet"); + assert_eq!(canonical_name("openai", "gpt-4-turbo-2024-04-09"), "openai/gpt-4-turbo"); + assert_eq!(canonical_name("google", "gemini-1.5-pro-002"), "google/gemini-1.5-pro"); + assert_eq!(canonical_name("anthropic", "claude-3-5-sonnet"), "anthropic/claude-3.5-sonnet"); + assert_eq!(canonical_name("openrouter", "anthropic/claude-3.5-sonnet"), "anthropic/claude-3.5-sonnet"); + assert_eq!(canonical_name("openrouter", "openai/gpt-4-turbo-2024-04-09"), "openai/gpt-4-turbo"); - #[test] - fn test_canonical_name_openrouter() { - assert_eq!( - canonical_name("openrouter", "anthropic/claude-3.5-sonnet"), - "anthropic/claude-3.5-sonnet" - ); - } - - #[test] - fn test_canonical_name_openrouter_with_version() { - assert_eq!( - canonical_name("openrouter", "openai/gpt-4-turbo-2024-04-09"), - "openai/gpt-4-turbo" - ); - } - - #[test] - fn test_strip_version_suffix_8_digit() { - assert_eq!( - strip_version_suffix("claude-3-5-sonnet-20241022"), - "claude-3.5-sonnet" - ); - } + // strip_version_suffix - 8 digit dates + assert_eq!(strip_version_suffix("claude-3-5-sonnet-20241022"), "claude-3.5-sonnet"); - #[test] - fn test_strip_version_suffix_date() { - assert_eq!( - strip_version_suffix("gpt-4-turbo-2024-04-09"), - "gpt-4-turbo" - ); - } + // strip_version_suffix - YYYY-MM-DD dates + assert_eq!(strip_version_suffix("gpt-4-turbo-2024-04-09"), "gpt-4-turbo"); - #[test] - fn test_strip_version_suffix_version_number() { - // Patch versions (3+ digits) are stripped + // strip_version_suffix - patch versions (3+ digits) and semantic versions assert_eq!(strip_version_suffix("gemini-1.5-pro-002"), "gemini-1.5-pro"); assert_eq!(strip_version_suffix("gemini-1.5-pro-001"), "gemini-1.5-pro"); - // Semantic versions with "v" prefix are stripped assert_eq!(strip_version_suffix("model-v1.5"), "model"); assert_eq!(strip_version_suffix("model-v2.0"), "model"); - } - #[test] - fn test_strip_version_suffix_no_suffix() { + // strip_version_suffix - no suffix assert_eq!(strip_version_suffix("claude-3-5-sonnet"), "claude-3.5-sonnet"); - } - #[test] - fn test_strip_version_suffix_exp() { + // strip_version_suffix - exp suffix assert_eq!(strip_version_suffix("gemini-2.0-flash-exp"), "gemini-2.0-flash"); - assert_eq!( - strip_version_suffix("gemini-2.0-flash-thinking-exp-01-21"), - "gemini-2.0-flash-thinking" - ); - } + assert_eq!(strip_version_suffix("gemini-2.0-flash-thinking-exp-01-21"), "gemini-2.0-flash-thinking"); - #[test] - fn test_strip_version_suffix_preview() { + // strip_version_suffix - preview suffix assert_eq!(strip_version_suffix("gemini-2.5-flash-preview"), "gemini-2.5-flash"); - assert_eq!( - strip_version_suffix("gemini-2.5-flash-preview-05-20"), - "gemini-2.5-flash" - ); - assert_eq!( - strip_version_suffix("gemini-2.5-flash-lite-preview-09"), - "gemini-2.5-flash-lite" - ); - } + assert_eq!(strip_version_suffix("gemini-2.5-flash-preview-05-20"), "gemini-2.5-flash"); + assert_eq!(strip_version_suffix("gemini-2.5-flash-lite-preview-09"), "gemini-2.5-flash-lite"); - #[test] - fn test_strip_version_suffix_multiple_patterns() { - // Should handle preview followed by date - assert_eq!( - strip_version_suffix("gemini-2.5-pro-preview-03-25"), - "gemini-2.5-pro" - ); - } + // strip_version_suffix - multiple patterns + assert_eq!(strip_version_suffix("gemini-2.5-pro-preview-03-25"), "gemini-2.5-pro"); - #[test] - fn test_normalize_version_numbers() { - // Anthropic models use dashes (3-5) while OpenRouter uses dots (3.5) + // normalize version numbers (dashes to dots) assert_eq!(strip_version_suffix("claude-3-5-haiku"), "claude-3.5-haiku"); assert_eq!(strip_version_suffix("claude-3-7-sonnet"), "claude-3.7-sonnet"); - // Model family numbers are preserved (not stripped) assert_eq!(strip_version_suffix("claude-haiku-4-5"), "claude-haiku-4.5"); assert_eq!(strip_version_suffix("claude-opus-4-1"), "claude-opus-4.1"); assert_eq!(strip_version_suffix("claude-sonnet-4-5"), "claude-sonnet-4.5"); assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); - } - #[test] - fn test_normalize_and_strip() { - // Should normalize version numbers AND strip date suffixes - assert_eq!( - strip_version_suffix("claude-3-5-haiku-20241022"), - "claude-3.5-haiku" - ); - assert_eq!( - strip_version_suffix("claude-3-7-sonnet-20250219"), - "claude-3.7-sonnet" - ); - // Model family numbers are preserved, only dates stripped - assert_eq!( - strip_version_suffix("claude-haiku-4-5-20251001"), - "claude-haiku-4.5" - ); - assert_eq!( - strip_version_suffix("claude-sonnet-4-5-20250929"), - "claude-sonnet-4.5" - ); - } + // normalize and strip combined + assert_eq!(strip_version_suffix("claude-3-5-haiku-20241022"), "claude-3.5-haiku"); + assert_eq!(strip_version_suffix("claude-3-7-sonnet-20250219"), "claude-3.7-sonnet"); + assert_eq!(strip_version_suffix("claude-haiku-4-5-20251001"), "claude-haiku-4.5"); + assert_eq!(strip_version_suffix("claude-sonnet-4-5-20250929"), "claude-sonnet-4.5"); - #[test] - fn test_preserve_model_family_versions() { - // Model family identifiers (1-2 digits) should be preserved + // preserve model family versions (1-2 digits) assert_eq!(strip_version_suffix("claude-sonnet-4.5"), "claude-sonnet-4.5"); assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); assert_eq!(strip_version_suffix("claude-haiku-4.5"), "claude-haiku-4.5"); assert_eq!(strip_version_suffix("gpt-4-turbo"), "gpt-4-turbo"); assert_eq!(strip_version_suffix("gpt-3.5-turbo"), "gpt-3.5-turbo"); - - // But patch versions (3+ digits) are still stripped assert_eq!(strip_version_suffix("model-002"), "model"); assert_eq!(strip_version_suffix("model-123"), "model"); } diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs index f6ca32de7f24..318dc1be8574 100644 --- a/crates/goose/src/providers/canonical/registry.rs +++ b/crates/goose/src/providers/canonical/registry.rs @@ -19,34 +19,28 @@ static BUNDLED_REGISTRY: Lazy> = Lazy::new(|| { Ok(registry) }); -/// Registry for managing canonical models #[derive(Debug, Clone)] pub struct CanonicalModelRegistry { models: HashMap, } impl CanonicalModelRegistry { - /// Create an empty registry pub fn new() -> Self { Self { models: HashMap::new(), } } - /// Load registry from the bundled canonical_models.json file - /// This uses a cached version for performance pub fn bundled() -> Result { BUNDLED_REGISTRY.as_ref().map(|r| r.clone()).map_err(|e| anyhow::anyhow!("{}", e)) } - /// Check if a canonical model exists in the bundled registry (faster than loading the whole registry) pub fn bundled_contains(name: &str) -> Result { BUNDLED_REGISTRY.as_ref() .map(|r| r.contains(name)) .map_err(|e| anyhow::anyhow!("{}", e)) } - /// Load registry from a JSON file pub fn from_file(path: impl AsRef) -> Result { let content = std::fs::read_to_string(path.as_ref()) .context("Failed to read canonical models file")?; @@ -62,7 +56,6 @@ impl CanonicalModelRegistry { Ok(registry) } - /// Save registry to a JSON file pub fn to_file(&self, path: impl AsRef) -> Result<()> { let mut models: Vec<&CanonicalModel> = self.models.values().collect(); models.sort_by(|a, b| a.id.cmp(&b.id)); @@ -76,27 +69,22 @@ impl CanonicalModelRegistry { Ok(()) } - /// Register a canonical model pub fn register(&mut self, model: CanonicalModel) { self.models.insert(model.id.clone(), model); } - /// Look up a canonical model by name pub fn get(&self, name: &str) -> Option<&CanonicalModel> { self.models.get(name) } - /// Get all canonical models pub fn all_models(&self) -> Vec<&CanonicalModel> { self.models.values().collect() } - /// Get number of registered models pub fn count(&self) -> usize { self.models.len() } - /// Check if a model exists pub fn contains(&self, name: &str) -> bool { self.models.contains_key(name) } @@ -107,16 +95,3 @@ impl Default for CanonicalModelRegistry { Self::new() } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_registry_operations() { - let registry = CanonicalModelRegistry::new(); - assert_eq!(registry.count(), 0); - assert!(!registry.contains("test-model")); - assert!(registry.get("nonexistent").is_none()); - } -} From 20806bb0537e85074cd4b39b5e5b95464db41079 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 14 Nov 2025 01:57:32 -0500 Subject: [PATCH 19/52] fmt --- .../goose/examples/build_canonical_models.rs | 41 ++++-- .../goose/examples/canonical_model_checker.rs | 56 ++++---- crates/goose/src/providers/base.rs | 5 +- .../goose/src/providers/canonical/README.md | 4 +- crates/goose/src/providers/canonical/model.rs | 1 - .../src/providers/canonical/name_builder.rs | 122 ++++++++++++++---- .../goose/src/providers/canonical/registry.rs | 15 ++- 7 files changed, 172 insertions(+), 72 deletions(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 93e08dab65ee..7c05c77cb1de 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -5,7 +5,9 @@ /// cargo run --example build_canonical_models /// use anyhow::{Context, Result}; -use goose::providers::canonical::{canonical_name, CanonicalModel, CanonicalModelRegistry, Pricing}; +use goose::providers::canonical::{ + canonical_name, CanonicalModel, CanonicalModelRegistry, Pricing, +}; use serde_json::Value; use std::collections::HashMap; @@ -93,14 +95,20 @@ async fn main() -> Result<()> { let existing_has_paid = existing_prompt > 0.0 || existing_completion > 0.0; let should_replace = if has_paid_pricing != existing_has_paid { - has_paid_pricing // Prefer the one with paid pricing + has_paid_pricing // Prefer the one with paid pricing } else { - name.len() < existing_name.len() // Both same pricing tier, prefer shorter name + name.len() < existing_name.len() // Both same pricing tier, prefer shorter name }; if should_replace { - println!(" Updating {} from '{}' (paid: {}) to '{}' (paid: {})", - canonical_id, existing_model["id"].as_str().unwrap(), existing_has_paid, id, has_paid_pricing); + println!( + " Updating {} from '{}' (paid: {}) to '{}' (paid: {})", + canonical_id, + existing_model["id"].as_str().unwrap(), + existing_has_paid, + id, + has_paid_pricing + ); if name.len() >= existing_name.len() { } else { shortest_names.insert(canonical_id.clone(), name.to_string()); @@ -108,7 +116,10 @@ async fn main() -> Result<()> { canonical_groups.insert(canonical_id, model); } } else { - println!(" Adding: {} (from {}, paid: {})", canonical_id, id, has_paid_pricing); + println!( + " Adding: {} (from {}, paid: {})", + canonical_id, id, has_paid_pricing + ); shortest_names.insert(canonical_id.clone(), name.to_string()); canonical_groups.insert(canonical_id, model); } @@ -155,7 +166,11 @@ async fn main() -> Result<()> { } } } - if model.get("architecture").and_then(|a| a.get("multimodality")).is_some() { + if model + .get("architecture") + .and_then(|a| a.get("multimodality")) + .is_some() + { if !mods.contains(&"file".to_string()) { mods.push("file".to_string()); } @@ -180,11 +195,7 @@ async fn main() -> Result<()> { let supports_tools = model .get("supported_parameters") .and_then(|v| v.as_array()) - .map(|params| { - params - .iter() - .any(|param| param.as_str() == Some("tools")) - }) + .map(|params| params.iter().any(|param| param.as_str() == Some("tools"))) .unwrap_or(false); let pricing_obj = model.get("pricing").unwrap(); @@ -227,7 +238,11 @@ async fn main() -> Result<()> { let output_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .join("src/providers/canonical/data/canonical_models.json"); registry.to_file(&output_path)?; - println!("\n✓ Wrote {} models to {}", registry.count(), output_path.display()); + println!( + "\n✓ Wrote {} models to {}", + registry.count(), + output_path.display() + ); Ok(()) } diff --git a/crates/goose/examples/canonical_model_checker.rs b/crates/goose/examples/canonical_model_checker.rs index f97e9608e6e2..10b02d427bb2 100644 --- a/crates/goose/examples/canonical_model_checker.rs +++ b/crates/goose/examples/canonical_model_checker.rs @@ -18,12 +18,8 @@ /// Usage: /// cargo run --example canonical_model_checker -- [--output custom_path.json] /// - use anyhow::{Context, Result}; -use goose::providers::{ - canonical::ModelMapping, - create_with_named_model, -}; +use goose::providers::{canonical::ModelMapping, create_with_named_model}; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; @@ -104,8 +100,10 @@ impl MappingReport { }); } - self.all_mappings.insert(provider_name.to_string(), mappings); - self.model_counts.insert(provider_name.to_string(), fetched_models.len()); + self.all_mappings + .insert(provider_name.to_string(), mappings); + self.model_counts + .insert(provider_name.to_string(), fetched_models.len()); } fn print_summary(&self) { @@ -119,13 +117,16 @@ impl MappingReport { let mut providers: Vec<_> = self.model_counts.iter().collect(); providers.sort_by_key(|(name, _)| *name); for (provider, count) in providers { - let mapped = self.all_mappings + let mapped = self + .all_mappings .get(provider) .map(|m| m.len()) .unwrap_or(0); let unmapped = count - mapped; - println!(" {:<20} Total: {:>3} Mapped: {:>3} Unmapped: {:>3}", - provider, count, mapped, unmapped); + println!( + " {:<20} Total: {:>3} Mapped: {:>3} Unmapped: {:>3}", + provider, count, mapped, unmapped + ); } println!("\n{}", "=".repeat(80)); @@ -157,7 +158,10 @@ impl MappingReport { } println!("\n{}", "=".repeat(80)); - println!("CANONICAL MODELS REFERENCED ({})", self.canonical_models_used.len()); + println!( + "CANONICAL MODELS REFERENCED ({})", + self.canonical_models_used.len() + ); println!("{}", "=".repeat(80)); if self.canonical_models_used.is_empty() { println!(" (none yet)"); @@ -179,12 +183,18 @@ impl MappingReport { let mut prev_map: HashMap<(String, String), String> = HashMap::new(); for entry in &previous.mapped_models { - prev_map.insert((entry.provider.clone(), entry.model.clone()), entry.canonical.clone()); + prev_map.insert( + (entry.provider.clone(), entry.model.clone()), + entry.canonical.clone(), + ); } let mut curr_map: HashMap<(String, String), String> = HashMap::new(); for entry in &self.mapped_models { - curr_map.insert((entry.provider.clone(), entry.model.clone()), entry.canonical.clone()); + curr_map.insert( + (entry.provider.clone(), entry.model.clone()), + entry.canonical.clone(), + ); } let mut changed_mappings = Vec::new(); @@ -194,7 +204,12 @@ impl MappingReport { for (key @ (provider, model), canonical) in &curr_map { match prev_map.get(key) { Some(prev_canonical) if prev_canonical != canonical => { - changed_mappings.push((provider.clone(), model.clone(), prev_canonical.clone(), canonical.clone())); + changed_mappings.push(( + provider.clone(), + model.clone(), + prev_canonical.clone(), + canonical.clone(), + )); } None => { added_mappings.push((provider.clone(), model.clone(), canonical.clone())); @@ -245,18 +260,15 @@ impl MappingReport { } fn save_to_file(&self, path: &PathBuf) -> Result<()> { - let json = serde_json::to_string_pretty(self) - .context("Failed to serialize report")?; - std::fs::write(path, json) - .context("Failed to write report file")?; + let json = serde_json::to_string_pretty(self).context("Failed to serialize report")?; + std::fs::write(path, json).context("Failed to write report file")?; Ok(()) } fn load_from_file(path: &PathBuf) -> Result { - let content = std::fs::read_to_string(path) - .context("Failed to read report file")?; - let report: MappingReport = serde_json::from_str(&content) - .context("Failed to parse report file")?; + let content = std::fs::read_to_string(path).context("Failed to read report file")?; + let report: MappingReport = + serde_json::from_str(&content).context("Failed to parse report file")?; Ok(report) } } diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index d8720f7160e9..3ff121693b41 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -416,7 +416,10 @@ pub trait Provider: Send + Sync { Ok(None) } - async fn map_to_canonical_model(&self, provider_model: &str) -> Result, ProviderError> { + async fn map_to_canonical_model( + &self, + provider_model: &str, + ) -> Result, ProviderError> { let canonical = canonical_name(self.get_name(), provider_model); if CanonicalModelRegistry::bundled_contains(&canonical)? { diff --git a/crates/goose/src/providers/canonical/README.md b/crates/goose/src/providers/canonical/README.md index 8befaf04f15f..61bf29ccdd9c 100644 --- a/crates/goose/src/providers/canonical/README.md +++ b/crates/goose/src/providers/canonical/README.md @@ -1,6 +1,8 @@ # Canonical Model System -Provides a unified view of model metadata (pricing, capabilities, context limits) across different LLM providers. Normalizes provider-specific model names (e.g., `claude-3-5-sonnet-20241022`) to canonical IDs (e.g., `anthropic/claude-3.5-sonnet`). +Provides a unified view of model metadata (pricing, capabilities, context limits) across different LLM providers. +Normalizes provider-specific model names (e.g., `claude-3-5-sonnet-20241022`) +to canonical IDs (e.g., `anthropic/claude-3.5-sonnet`). ## Scripts diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 6791eca190f1..0ffecc985edf 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -54,4 +54,3 @@ pub struct CanonicalModel { /// Pricing for this model pub pricing: Pricing, } - diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index 6d9eddc8f8cb..1606bf301c76 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -19,13 +19,13 @@ pub fn strip_version_suffix(model: &str) -> String { // Strip datetime, version, and preview/exp suffixes let patterns = [ - regex::Regex::new(r"-preview(-\d+)*$").unwrap(), // -preview, -preview-09, -preview-05-20 - regex::Regex::new(r"-exp(-\d+)*$").unwrap(), // -exp, -exp-1219, -exp-01-21 - regex::Regex::new(r":exacto$").unwrap(), // :exacto (OpenRouter provider suffix) - regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 + regex::Regex::new(r"-preview(-\d+)*$").unwrap(), // -preview, -preview-09, -preview-05-20 + regex::Regex::new(r"-exp(-\d+)*$").unwrap(), // -exp, -exp-1219, -exp-01-21 + regex::Regex::new(r":exacto$").unwrap(), // :exacto (OpenRouter provider suffix) + regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 regex::Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), // -2024-04-09 - regex::Regex::new(r"-v\d+(\.\d+)*$").unwrap(), // -v1.5 (semantic versions with "v" prefix) - regex::Regex::new(r"-\d{3,}$").unwrap(), // -002, -001 (patch versions: 3+ digits only) + regex::Regex::new(r"-v\d+(\.\d+)*$").unwrap(), // -v1.5 (semantic versions with "v" prefix) + regex::Regex::new(r"-\d{3,}$").unwrap(), // -002, -001 (patch versions: 3+ digits only) ]; // Apply patterns multiple times to handle cases like "-preview-09-2025" @@ -47,18 +47,42 @@ mod tests { #[test] fn test_canonical_names() { // canonical_name tests - assert_eq!(canonical_name("anthropic", "claude-3-5-sonnet-20241022"), "anthropic/claude-3.5-sonnet"); - assert_eq!(canonical_name("openai", "gpt-4-turbo-2024-04-09"), "openai/gpt-4-turbo"); - assert_eq!(canonical_name("google", "gemini-1.5-pro-002"), "google/gemini-1.5-pro"); - assert_eq!(canonical_name("anthropic", "claude-3-5-sonnet"), "anthropic/claude-3.5-sonnet"); - assert_eq!(canonical_name("openrouter", "anthropic/claude-3.5-sonnet"), "anthropic/claude-3.5-sonnet"); - assert_eq!(canonical_name("openrouter", "openai/gpt-4-turbo-2024-04-09"), "openai/gpt-4-turbo"); + assert_eq!( + canonical_name("anthropic", "claude-3-5-sonnet-20241022"), + "anthropic/claude-3.5-sonnet" + ); + assert_eq!( + canonical_name("openai", "gpt-4-turbo-2024-04-09"), + "openai/gpt-4-turbo" + ); + assert_eq!( + canonical_name("google", "gemini-1.5-pro-002"), + "google/gemini-1.5-pro" + ); + assert_eq!( + canonical_name("anthropic", "claude-3-5-sonnet"), + "anthropic/claude-3.5-sonnet" + ); + assert_eq!( + canonical_name("openrouter", "anthropic/claude-3.5-sonnet"), + "anthropic/claude-3.5-sonnet" + ); + assert_eq!( + canonical_name("openrouter", "openai/gpt-4-turbo-2024-04-09"), + "openai/gpt-4-turbo" + ); // strip_version_suffix - 8 digit dates - assert_eq!(strip_version_suffix("claude-3-5-sonnet-20241022"), "claude-3.5-sonnet"); + assert_eq!( + strip_version_suffix("claude-3-5-sonnet-20241022"), + "claude-3.5-sonnet" + ); // strip_version_suffix - YYYY-MM-DD dates - assert_eq!(strip_version_suffix("gpt-4-turbo-2024-04-09"), "gpt-4-turbo"); + assert_eq!( + strip_version_suffix("gpt-4-turbo-2024-04-09"), + "gpt-4-turbo" + ); // strip_version_suffix - patch versions (3+ digits) and semantic versions assert_eq!(strip_version_suffix("gemini-1.5-pro-002"), "gemini-1.5-pro"); @@ -67,36 +91,78 @@ mod tests { assert_eq!(strip_version_suffix("model-v2.0"), "model"); // strip_version_suffix - no suffix - assert_eq!(strip_version_suffix("claude-3-5-sonnet"), "claude-3.5-sonnet"); + assert_eq!( + strip_version_suffix("claude-3-5-sonnet"), + "claude-3.5-sonnet" + ); // strip_version_suffix - exp suffix - assert_eq!(strip_version_suffix("gemini-2.0-flash-exp"), "gemini-2.0-flash"); - assert_eq!(strip_version_suffix("gemini-2.0-flash-thinking-exp-01-21"), "gemini-2.0-flash-thinking"); + assert_eq!( + strip_version_suffix("gemini-2.0-flash-exp"), + "gemini-2.0-flash" + ); + assert_eq!( + strip_version_suffix("gemini-2.0-flash-thinking-exp-01-21"), + "gemini-2.0-flash-thinking" + ); // strip_version_suffix - preview suffix - assert_eq!(strip_version_suffix("gemini-2.5-flash-preview"), "gemini-2.5-flash"); - assert_eq!(strip_version_suffix("gemini-2.5-flash-preview-05-20"), "gemini-2.5-flash"); - assert_eq!(strip_version_suffix("gemini-2.5-flash-lite-preview-09"), "gemini-2.5-flash-lite"); + assert_eq!( + strip_version_suffix("gemini-2.5-flash-preview"), + "gemini-2.5-flash" + ); + assert_eq!( + strip_version_suffix("gemini-2.5-flash-preview-05-20"), + "gemini-2.5-flash" + ); + assert_eq!( + strip_version_suffix("gemini-2.5-flash-lite-preview-09"), + "gemini-2.5-flash-lite" + ); // strip_version_suffix - multiple patterns - assert_eq!(strip_version_suffix("gemini-2.5-pro-preview-03-25"), "gemini-2.5-pro"); + assert_eq!( + strip_version_suffix("gemini-2.5-pro-preview-03-25"), + "gemini-2.5-pro" + ); // normalize version numbers (dashes to dots) assert_eq!(strip_version_suffix("claude-3-5-haiku"), "claude-3.5-haiku"); - assert_eq!(strip_version_suffix("claude-3-7-sonnet"), "claude-3.7-sonnet"); + assert_eq!( + strip_version_suffix("claude-3-7-sonnet"), + "claude-3.7-sonnet" + ); assert_eq!(strip_version_suffix("claude-haiku-4-5"), "claude-haiku-4.5"); assert_eq!(strip_version_suffix("claude-opus-4-1"), "claude-opus-4.1"); - assert_eq!(strip_version_suffix("claude-sonnet-4-5"), "claude-sonnet-4.5"); + assert_eq!( + strip_version_suffix("claude-sonnet-4-5"), + "claude-sonnet-4.5" + ); assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); // normalize and strip combined - assert_eq!(strip_version_suffix("claude-3-5-haiku-20241022"), "claude-3.5-haiku"); - assert_eq!(strip_version_suffix("claude-3-7-sonnet-20250219"), "claude-3.7-sonnet"); - assert_eq!(strip_version_suffix("claude-haiku-4-5-20251001"), "claude-haiku-4.5"); - assert_eq!(strip_version_suffix("claude-sonnet-4-5-20250929"), "claude-sonnet-4.5"); + assert_eq!( + strip_version_suffix("claude-3-5-haiku-20241022"), + "claude-3.5-haiku" + ); + assert_eq!( + strip_version_suffix("claude-3-7-sonnet-20250219"), + "claude-3.7-sonnet" + ); + assert_eq!( + strip_version_suffix("claude-haiku-4-5-20251001"), + "claude-haiku-4.5" + ); + assert_eq!( + strip_version_suffix("claude-sonnet-4-5-20250929"), + "claude-sonnet-4.5" + ); // preserve model family versions (1-2 digits) - assert_eq!(strip_version_suffix("claude-sonnet-4.5"), "claude-sonnet-4.5"); + assert_eq!( + strip_version_suffix("claude-sonnet-4.5"), + "claude-sonnet-4.5" + ); assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); assert_eq!(strip_version_suffix("claude-haiku-4.5"), "claude-haiku-4.5"); assert_eq!(strip_version_suffix("gpt-4-turbo"), "gpt-4-turbo"); diff --git a/crates/goose/src/providers/canonical/registry.rs b/crates/goose/src/providers/canonical/registry.rs index 318dc1be8574..274eb7f40a99 100644 --- a/crates/goose/src/providers/canonical/registry.rs +++ b/crates/goose/src/providers/canonical/registry.rs @@ -32,11 +32,15 @@ impl CanonicalModelRegistry { } pub fn bundled() -> Result { - BUNDLED_REGISTRY.as_ref().map(|r| r.clone()).map_err(|e| anyhow::anyhow!("{}", e)) + BUNDLED_REGISTRY + .as_ref() + .map(|r| r.clone()) + .map_err(|e| anyhow::anyhow!("{}", e)) } pub fn bundled_contains(name: &str) -> Result { - BUNDLED_REGISTRY.as_ref() + BUNDLED_REGISTRY + .as_ref() .map(|r| r.contains(name)) .map_err(|e| anyhow::anyhow!("{}", e)) } @@ -45,8 +49,8 @@ impl CanonicalModelRegistry { let content = std::fs::read_to_string(path.as_ref()) .context("Failed to read canonical models file")?; - let models: Vec = serde_json::from_str(&content) - .context("Failed to parse canonical models JSON")?; + let models: Vec = + serde_json::from_str(&content).context("Failed to parse canonical models JSON")?; let mut registry = Self::new(); for model in models { @@ -63,8 +67,7 @@ impl CanonicalModelRegistry { let json = serde_json::to_string_pretty(&models) .context("Failed to serialize canonical models")?; - std::fs::write(path.as_ref(), json) - .context("Failed to write canonical models file")?; + std::fs::write(path.as_ref(), json).context("Failed to write canonical models file")?; Ok(()) } From ae23e1df6c706ceda5aa3be5a40e887c049fbc37 Mon Sep 17 00:00:00 2001 From: David Katz Date: Sat, 15 Nov 2025 14:29:18 -0500 Subject: [PATCH 20/52] fix clippy --- crates/goose/examples/build_canonical_models.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 7c05c77cb1de..4cb98d903546 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -170,10 +170,9 @@ async fn main() -> Result<()> { .get("architecture") .and_then(|a| a.get("multimodality")) .is_some() + && !mods.contains(&"file".to_string()) { - if !mods.contains(&"file".to_string()) { - mods.push("file".to_string()); - } + mods.push("file".to_string()); } mods }) From 2db336a00f411ffaa50c9d058ea02bb2ef1ed17f Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 9 Dec 2025 12:57:42 -0500 Subject: [PATCH 21/52] refetch canonical models --- .../canonical/data/canonical_models.json | 106 +++++++++++++++--- 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index b66993dc006c..deb2d390e5f9 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -73,10 +73,10 @@ "tokenizer": "Claude", "supports_tools": true, "pricing": { - "prompt": 3e-6, - "completion": 0.000015, + "prompt": 6e-6, + "completion": 0.00003, "request": 0.0, - "image": 0.0048 + "image": 0.0 } }, { @@ -179,6 +179,26 @@ "image": 0.024 } }, + { + "id": "anthropic/claude-opus-4.5", + "name": "Anthropic: Claude Opus 4.5", + "context_length": 200000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Claude", + "supports_tools": true, + "pricing": { + "prompt": 5e-6, + "completion": 0.000025, + "request": 0.0, + "image": 0.0 + } + }, { "id": "anthropic/claude-sonnet-4", "name": "Anthropic: Claude Sonnet 4", @@ -339,6 +359,46 @@ "image": 0.00516 } }, + { + "id": "google/gemini-3-pro", + "name": "Google: Gemini 3 Pro Preview", + "context_length": 1048576, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 0.000012, + "request": 0.0, + "image": 0.008256 + } + }, + { + "id": "google/gemini-3-pro-image", + "name": "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", + "context_length": 65536, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "Gemini", + "supports_tools": false, + "pricing": { + "prompt": 2e-6, + "completion": 0.000012, + "request": 0.0, + "image": 0.067 + } + }, { "id": "google/gemma-2-27b-it", "name": "Google: Gemma 2 27B", @@ -400,8 +460,8 @@ { "id": "google/gemma-3-27b-it", "name": "Google: Gemma 3 27B", - "context_length": 131072, - "max_completion_tokens": 16384, + "context_length": 96000, + "max_completion_tokens": 96000, "input_modalities": [ "text" ], @@ -411,10 +471,10 @@ "tokenizer": "Gemini", "supports_tools": true, "pricing": { - "prompt": 9e-8, - "completion": 1.6e-7, + "prompt": 4e-8, + "completion": 1.5e-7, "request": 0.0, - "image": 0.0000256 + "image": 0.0 } }, { @@ -967,7 +1027,7 @@ "text" ], "tokenizer": "GPT", - "supports_tools": false, + "supports_tools": true, "pricing": { "prompt": 1.25e-6, "completion": 0.00001, @@ -995,6 +1055,26 @@ "image": 0.0 } }, + { + "id": "openai/gpt-5.1-codex-max", + "name": "OpenAI: GPT-5.1-Codex-Max", + "context_length": 400000, + "max_completion_tokens": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "tokenizer": "GPT", + "supports_tools": true, + "pricing": { + "prompt": 1.25e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, { "id": "openai/gpt-5.1-codex-mini", "name": "OpenAI: GPT-5.1-Codex-Mini", @@ -1009,8 +1089,8 @@ "tokenizer": "GPT", "supports_tools": true, "pricing": { - "prompt": 1.5e-6, - "completion": 6e-6, + "prompt": 2.5e-7, + "completion": 2e-6, "request": 0.0, "image": 0.0 } @@ -1028,8 +1108,8 @@ "tokenizer": "GPT", "supports_tools": true, "pricing": { - "prompt": 5e-8, - "completion": 2.4e-7, + "prompt": 3.9e-8, + "completion": 1.9e-7, "request": 0.0, "image": 0.0 } From 01ddf1e92a1f2bb12fa0a4c1c2e9b199c3964f0c Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 9 Dec 2025 12:58:47 -0500 Subject: [PATCH 22/52] mapping changes audit --- .../data/canonical_mapping_report.json | 1573 +++++++++-------- 1 file changed, 817 insertions(+), 756 deletions(-) diff --git a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json index bdf57804bbd0..f8f1044e4b9f 100644 --- a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json +++ b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-11-14T06:37:19.570393+00:00", + "timestamp": "2025-12-09T17:58:02.776903+00:00", "unmapped_models": [ { "provider": "openai", @@ -2009,6 +2009,18 @@ "provider": "openai", "model": "ft:gpt-4o-mini-2024-07-18:square::C9PyNU6h" }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ading-test:CjZH4S3Z:ckpt-step-10" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ading-test:CjZH51lQ:ckpt-step-20" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-mini-2024-07-18:square:ading-test:CjZH5Os2" + }, { "provider": "openai", "model": "ft:gpt-4o-mini-2024-07-18:square:merchant-mappings-v1:BVLby6lj:ckpt-step-80" @@ -2133,10 +2145,6 @@ "provider": "openai", "model": "gpt-4o-realtime-preview" }, - { - "provider": "openai", - "model": "gpt-4o-realtime-preview-2024-10-01" - }, { "provider": "openai", "model": "gpt-4o-realtime-preview-2024-12-17" @@ -2209,14 +2217,6 @@ "provider": "openai", "model": "gpt-realtime-mini-2025-10-06" }, - { - "provider": "openai", - "model": "o1-mini" - }, - { - "provider": "openai", - "model": "o1-mini-2024-09-12" - }, { "provider": "openai", "model": "omni-moderation-2024-09-26" @@ -2281,6 +2281,18 @@ "provider": "openrouter", "model": "alibaba/tongyi-deepresearch-30b-a3b:free" }, + { + "provider": "openrouter", + "model": "allenai/olmo-3-7b-instruct" + }, + { + "provider": "openrouter", + "model": "amazon/nova-2-lite-v1" + }, + { + "provider": "openrouter", + "model": "amazon/nova-2-lite-v1:free" + }, { "provider": "openrouter", "model": "amazon/nova-lite-v1" @@ -2297,6 +2309,14 @@ "provider": "openrouter", "model": "amazon/nova-pro-v1" }, + { + "provider": "openrouter", + "model": "arcee-ai/trinity-mini" + }, + { + "provider": "openrouter", + "model": "arcee-ai/trinity-mini:free" + }, { "provider": "openrouter", "model": "arcee-ai/virtuoso-large" @@ -2337,10 +2357,6 @@ "provider": "openrouter", "model": "deepseek/deepseek-chat-v3-0324" }, - { - "provider": "openrouter", - "model": "deepseek/deepseek-chat-v3-0324:free" - }, { "provider": "openrouter", "model": "deepseek/deepseek-chat-v3.1" @@ -2365,6 +2381,10 @@ "provider": "openrouter", "model": "deepseek/deepseek-v3.1-terminus:exacto" }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2" + }, { "provider": "openrouter", "model": "deepseek/deepseek-v3.2-exp" @@ -2381,14 +2401,6 @@ "provider": "openrouter", "model": "inception/mercury-coder" }, - { - "provider": "openrouter", - "model": "inclusionai/ling-1t" - }, - { - "provider": "openrouter", - "model": "inclusionai/ring-1t" - }, { "provider": "openrouter", "model": "kwaipilot/kat-coder-pro:free" @@ -2429,26 +2441,14 @@ "provider": "openrouter", "model": "meta-llama/llama-3.3-70b-instruct:free" }, - { - "provider": "openrouter", - "model": "meta-llama/llama-3.3-8b-instruct:free" - }, { "provider": "openrouter", "model": "meta-llama/llama-4-maverick" }, - { - "provider": "openrouter", - "model": "meta-llama/llama-4-maverick:free" - }, { "provider": "openrouter", "model": "meta-llama/llama-4-scout" }, - { - "provider": "openrouter", - "model": "meta-llama/llama-4-scout:free" - }, { "provider": "openrouter", "model": "microsoft/phi-3-medium-128k-instruct" @@ -2469,10 +2469,6 @@ "provider": "openrouter", "model": "minimax/minimax-m2" }, - { - "provider": "openrouter", - "model": "mistralai/codestral-2501" - }, { "provider": "openrouter", "model": "mistralai/codestral-2508" @@ -2487,23 +2483,15 @@ }, { "provider": "openrouter", - "model": "mistralai/devstral-small-2505" - }, - { - "provider": "openrouter", - "model": "mistralai/magistral-medium-2506" - }, - { - "provider": "openrouter", - "model": "mistralai/magistral-medium-2506:thinking" + "model": "mistralai/ministral-14b-2512" }, { "provider": "openrouter", - "model": "mistralai/magistral-small-2506" + "model": "mistralai/ministral-3b" }, { "provider": "openrouter", - "model": "mistralai/ministral-3b" + "model": "mistralai/ministral-3b-2512" }, { "provider": "openrouter", @@ -2511,11 +2499,11 @@ }, { "provider": "openrouter", - "model": "mistralai/mistral-7b-instruct" + "model": "mistralai/ministral-8b-2512" }, { "provider": "openrouter", - "model": "mistralai/mistral-7b-instruct-v0.1" + "model": "mistralai/mistral-7b-instruct" }, { "provider": "openrouter", @@ -2533,6 +2521,10 @@ "provider": "openrouter", "model": "mistralai/mistral-large-2411" }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2512" + }, { "provider": "openrouter", "model": "mistralai/mistral-medium-3" @@ -2549,10 +2541,6 @@ "provider": "openrouter", "model": "mistralai/mistral-saba" }, - { - "provider": "openrouter", - "model": "mistralai/mistral-small" - }, { "provider": "openrouter", "model": "mistralai/mistral-small-24b-instruct-2501" @@ -2569,10 +2557,6 @@ "provider": "openrouter", "model": "mistralai/mistral-small-3.2-24b-instruct" }, - { - "provider": "openrouter", - "model": "mistralai/mistral-small-3.2-24b-instruct:free" - }, { "provider": "openrouter", "model": "mistralai/mistral-tiny" @@ -2617,10 +2601,6 @@ "provider": "openrouter", "model": "nousresearch/deephermes-3-mistral-24b-preview" }, - { - "provider": "openrouter", - "model": "nousresearch/hermes-3-llama-3.1-70b" - }, { "provider": "openrouter", "model": "nousresearch/hermes-4-405b" @@ -2649,17 +2629,21 @@ "provider": "openrouter", "model": "nvidia/nemotron-nano-9b-v2:free" }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-120b:free" + }, { "provider": "openrouter", "model": "openai/gpt-oss-20b:free" }, { "provider": "openrouter", - "model": "qwen/qwen-2.5-72b-instruct" + "model": "prime-intellect/intellect-3" }, { "provider": "openrouter", - "model": "qwen/qwen-2.5-7b-instruct" + "model": "qwen/qwen-2.5-72b-instruct" }, { "provider": "openrouter", @@ -2793,6 +2777,10 @@ "provider": "openrouter", "model": "qwen/qwq-32b" }, + { + "provider": "openrouter", + "model": "relace/relace-search" + }, { "provider": "openrouter", "model": "sao10k/l3-euryale-70b" @@ -2817,6 +2805,14 @@ "provider": "openrouter", "model": "tngtech/deepseek-r1t2-chimera" }, + { + "provider": "openrouter", + "model": "tngtech/tng-r1t-chimera" + }, + { + "provider": "openrouter", + "model": "tngtech/tng-r1t-chimera:free" + }, { "provider": "openrouter", "model": "x-ai/grok-3" @@ -2841,6 +2837,10 @@ "provider": "openrouter", "model": "x-ai/grok-4-fast" }, + { + "provider": "openrouter", + "model": "x-ai/grok-4.1-fast" + }, { "provider": "openrouter", "model": "x-ai/grok-code-fast-1" @@ -2873,6 +2873,10 @@ "provider": "openrouter", "model": "z-ai/glm-4.6:exacto" }, + { + "provider": "openrouter", + "model": "z-ai/glm-4.6v" + }, { "provider": "databricks", "model": "baxen-migration-demo" @@ -3005,6 +3009,14 @@ "provider": "databricks", "model": "goose-claude-3-7-sonnet" }, + { + "provider": "databricks", + "model": "goose-claude-4-5-haiku" + }, + { + "provider": "databricks", + "model": "goose-claude-4-5-opus" + }, { "provider": "databricks", "model": "goose-claude-4-5-sonnet" @@ -3025,6 +3037,10 @@ "provider": "databricks", "model": "goose-gemini-2-5-pro" }, + { + "provider": "databricks", + "model": "goose-gemini-3-pro" + }, { "provider": "databricks", "model": "goose-gpt-4-1" @@ -3233,6 +3249,10 @@ "provider": "databricks", "model": "korhan-openai-wrapper" }, + { + "provider": "databricks", + "model": "lfc_mml_er_bge_m3" + }, { "provider": "databricks", "model": "moderation" @@ -3261,6 +3281,10 @@ "provider": "databricks", "model": "ng-tools-gpt-5-nano" }, + { + "provider": "databricks", + "model": "ng-tools-int-claude-sonnet-4-5" + }, { "provider": "databricks", "model": "o1" @@ -3325,10 +3349,22 @@ "provider": "databricks", "model": "picasso_embeddings" }, + { + "provider": "databricks", + "model": "pii-redactor" + }, + { + "provider": "databricks", + "model": "pii-redactor-prod" + }, { "provider": "databricks", "model": "prime_model" }, + { + "provider": "databricks", + "model": "raml-claude-opus-4-5" + }, { "provider": "databricks", "model": "raml-claude-sonnet-4-5" @@ -3369,6 +3405,14 @@ "provider": "databricks", "model": "text-embedding-ada-002" }, + { + "provider": "databricks", + "model": "databricks-gpt-5-1" + }, + { + "provider": "databricks", + "model": "databricks-gemini-3-pro" + }, { "provider": "databricks", "model": "databricks-gpt-5" @@ -3417,6 +3461,10 @@ "provider": "databricks", "model": "databricks-meta-llama-3-3-70b-instruct" }, + { + "provider": "databricks", + "model": "databricks-claude-opus-4-5" + }, { "provider": "databricks", "model": "databricks-claude-opus-4-1" @@ -3441,10 +3489,6 @@ "provider": "databricks", "model": "databricks-meta-llama-3-1-405b-instruct" }, - { - "provider": "databricks", - "model": "databricks-claude-opus-4" - }, { "provider": "google", "model": "aqa" @@ -3463,27 +3507,7 @@ }, { "provider": "google", - "model": "gemini-2.0-flash-preview-image-generation" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-thinking-exp" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-thinking-exp-01-21" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-thinking-exp-1219" - }, - { - "provider": "google", - "model": "gemini-2.0-pro-exp" - }, - { - "provider": "google", - "model": "gemini-2.0-pro-exp-02-05" + "model": "gemini-2.0-flash-live-001" }, { "provider": "google", @@ -3537,732 +3561,778 @@ "provider": "google", "model": "gemma-3n-e2b-it" }, + { + "provider": "google", + "model": "imagen-4.0-fast-generate-001" + }, + { + "provider": "google", + "model": "imagen-4.0-generate-001" + }, { "provider": "google", "model": "imagen-4.0-generate-preview-06-06" }, + { + "provider": "google", + "model": "imagen-4.0-ultra-generate-001" + }, { "provider": "google", "model": "imagen-4.0-ultra-generate-preview-06-06" }, { "provider": "google", - "model": "learnlm-2.0-flash-experimental" + "model": "nano-banana-pro-preview" }, { "provider": "google", "model": "text-embedding-004" + }, + { + "provider": "google", + "model": "veo-2.0-generate-001" + }, + { + "provider": "google", + "model": "veo-3.0-fast-generate-001" + }, + { + "provider": "google", + "model": "veo-3.0-generate-001" + }, + { + "provider": "google", + "model": "veo-3.1-fast-generate-preview" + }, + { + "provider": "google", + "model": "veo-3.1-generate-preview" } ], "all_mappings": { - "databricks": [], - "openai": [ + "anthropic": [ { - "provider_model": "chatgpt-4o-latest", - "canonical_model": "openai/chatgpt-4o-latest", + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "claude-3-haiku-20240307", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "claude-3-opus-20240229", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct-0914", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "claude-opus-4-5-20251101", + "canonical_model": "anthropic/claude-opus-4.5", "verified": true }, { - "provider_model": "gpt-4-0125-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet-4.5", "verified": true - }, + } + ], + "openrouter": [ { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt-4.1", + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", "verified": true }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "anthropic/claude-opus-4.5", + "canonical_model": "anthropic/claude-opus-4.5", "verified": true }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet-4.5", "verified": true }, { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-10-01", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-12-17", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2025-06-03", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "google/gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro", "verified": true }, { - "provider_model": "gpt-4o-search-preview", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "gpt-4o-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", "verified": true }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt-5", + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-5-pro-2025-10-06", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "gpt-5.1", - "canonical_model": "openai/gpt-5.1", + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "gpt-5.1-2025-11-13", - "canonical_model": "openai/gpt-5.1", + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "gpt-5.1-codex", - "canonical_model": "openai/gpt-5.1-codex", + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-5.1-codex-mini", - "canonical_model": "openai/gpt-5.1-codex-mini", + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o1", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "o3", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", "verified": true }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "o3-deep-research-2025-06-26", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", "verified": true }, { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", "verified": true }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "o3-pro-2025-06-10", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "o4-mini-2025-04-16", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/gpt-5.1-chat", + "canonical_model": "openai/gpt-5.1-chat", "verified": true }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", "verified": true - } - ], - "anthropic": [ + }, { - "provider_model": "claude-3-5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "openai/gpt-5.1-codex-max", + "canonical_model": "openai/gpt-5.1-codex-max", "verified": true }, { - "provider_model": "claude-3-7-sonnet-20250219", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "openai/gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "claude-3-haiku-20240307", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "claude-3-opus-20240229", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "claude-haiku-4-5-20251001", - "canonical_model": "anthropic/claude-haiku-4.5", + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", "verified": true }, { - "provider_model": "claude-opus-4-1-20250805", - "canonical_model": "anthropic/claude-opus-4.1", + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", "verified": true }, { - "provider_model": "claude-opus-4-20250514", - "canonical_model": "anthropic/claude-opus-4", + "provider_model": "openai/o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "claude-sonnet-4-20250514", - "canonical_model": "anthropic/claude-sonnet-4", + "provider_model": "openai/o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "claude-sonnet-4-5-20250929", - "canonical_model": "anthropic/claude-sonnet-4.5", + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true - } - ], - "openrouter": [ + }, { - "provider_model": "anthropic/claude-3-haiku", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "anthropic/claude-3-opus", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "openai/o4-mini", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "openai/o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet-20240620", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", "verified": true - }, + } + ], + "databricks": [], + "openai": [ { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet:thinking", - "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "anthropic/claude-haiku-4.5", + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "anthropic/claude-opus-4", + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "anthropic/claude-opus-4.1", + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet-4", + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "anthropic/claude-sonnet-4.5", + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-06-17", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "openai/codex-mini", - "canonical_model": "openai/codex-mini", + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-0613", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "openai/gpt-4o:extended", - "canonical_model": "openai/gpt-4o:extended", + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openai/gpt-5-image", + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-5-image-mini", - "canonical_model": "openai/gpt-5-image-mini", + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "gpt-5.1-2025-11-13", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5.1", - "canonical_model": "openai/gpt-5.1", + "provider_model": "gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex", - "canonical_model": "openai/gpt-5.1-codex", + "provider_model": "gpt-5.1-codex-max", + "canonical_model": "openai/gpt-5.1-codex-max", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex-mini", + "provider_model": "gpt-5.1-codex-mini", "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openai/gpt-oss-20b", + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openai/gpt-oss-safeguard-20b", + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/o1", - "canonical_model": "openai/o1", + "provider_model": "o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/o3", + "provider_model": "o3-2025-04-16", "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/o3-deep-research", + "provider_model": "o3-deep-research", "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/o3-mini", + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-mini", "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-mini-high", - "canonical_model": "openai/o3-mini-high", + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-pro", + "provider_model": "o3-pro", "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/o4-mini", + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o4-mini", "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o4-mini-deep-research", + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research", "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "openai/o4-mini-high", - "canonical_model": "openai/o4-mini-high", + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", "verified": true } ], - "tetrate": [], "google": [ { "provider_model": "gemini-2.0-flash", @@ -4319,21 +4389,11 @@ "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, - { - "provider_model": "gemini-2.5-flash-lite-preview-06-17", - "canonical_model": "google/gemini-2.5-flash-lite", - "verified": true - }, { "provider_model": "gemini-2.5-flash-lite-preview-09-2025", "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, - { - "provider_model": "gemini-2.5-flash-preview-05-20", - "canonical_model": "google/gemini-2.5-flash", - "verified": true - }, { "provider_model": "gemini-2.5-flash-preview-09-2025", "canonical_model": "google/gemini-2.5-flash", @@ -4345,18 +4405,13 @@ "verified": true }, { - "provider_model": "gemini-2.5-pro-preview-03-25", - "canonical_model": "google/gemini-2.5-pro", - "verified": true - }, - { - "provider_model": "gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gemini-3-pro-image-preview", + "canonical_model": "google/gemini-3-pro-image", "verified": true }, { - "provider_model": "gemini-2.5-pro-preview-06-05", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro", "verified": true }, { @@ -4379,28 +4434,29 @@ "canonical_model": "google/gemma-3n-e4b-it", "verified": true } - ] + ], + "tetrate": [] }, "mapped_models": [ { "provider": "anthropic", - "model": "claude-3-haiku-20240307", - "canonical": "anthropic/claude-3-haiku" + "model": "claude-opus-4-5-20251101", + "canonical": "anthropic/claude-opus-4.5" }, { "provider": "anthropic", - "model": "claude-3-opus-20240229", - "canonical": "anthropic/claude-3-opus" + "model": "claude-opus-4-20250514", + "canonical": "anthropic/claude-opus-4" }, { "provider": "anthropic", - "model": "claude-3-5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku" + "model": "claude-haiku-4-5-20251001", + "canonical": "anthropic/claude-haiku-4.5" }, { "provider": "anthropic", - "model": "claude-opus-4-20250514", - "canonical": "anthropic/claude-opus-4" + "model": "claude-3-7-sonnet-20250219", + "canonical": "anthropic/claude-3.7-sonnet" }, { "provider": "anthropic", @@ -4414,13 +4470,18 @@ }, { "provider": "anthropic", - "model": "claude-3-7-sonnet-20250219", - "canonical": "anthropic/claude-3.7-sonnet" + "model": "claude-3-5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "anthropic", - "model": "claude-haiku-4-5-20251001", - "canonical": "anthropic/claude-haiku-4.5" + "model": "claude-3-haiku-20240307", + "canonical": "anthropic/claude-3-haiku" + }, + { + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "canonical": "anthropic/claude-3-opus" }, { "provider": "anthropic", @@ -4429,113 +4490,133 @@ }, { "provider": "openai", - "model": "gpt-5", - "canonical": "openai/gpt-5" + "model": "o4-mini-2025-04-16", + "canonical": "openai/o4-mini" }, { "provider": "openai", - "model": "gpt-4-0613", + "model": "gpt-4o-search-preview", + "canonical": "openai/gpt-4o-search" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-1106", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "o3-deep-research", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openai", + "model": "gpt-4-0314", "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "model": "gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { "provider": "openai", - "model": "gpt-5-codex", - "canonical": "openai/gpt-5-codex" + "model": "gpt-4o-mini-search-preview", + "canonical": "openai/gpt-4o-mini-search" }, { "provider": "openai", - "model": "o3", - "canonical": "openai/o3" + "model": "gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "model": "gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" }, { "provider": "openai", - "model": "gpt-5-pro-2025-10-06", - "canonical": "openai/gpt-5-pro" + "model": "gpt-4.1-mini-2025-04-14", + "canonical": "openai/gpt-4.1-mini" }, { "provider": "openai", - "model": "gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "model": "gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openai", - "model": "gpt-4.1", - "canonical": "openai/gpt-4.1" + "model": "gpt-4o-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-search" }, { "provider": "openai", - "model": "o3-mini", - "canonical": "openai/o3-mini" + "model": "gpt-3.5-turbo-0125", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", - "model": "o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "model": "o3-pro", + "canonical": "openai/o3-pro" }, { "provider": "openai", - "model": "gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "model": "o3-2025-04-16", + "canonical": "openai/o3" }, { "provider": "openai", - "model": "o1", - "canonical": "openai/o1" + "model": "gpt-3.5-turbo-instruct", + "canonical": "openai/gpt-3.5-turbo-instruct" }, { "provider": "openai", - "model": "gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "model": "gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { "provider": "openai", - "model": "gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "model": "o3-mini-2025-01-31", + "canonical": "openai/o3-mini" }, { "provider": "openai", - "model": "o3-pro-2025-06-10", - "canonical": "openai/o3-pro" + "model": "gpt-4-0125-preview", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4o-audio-preview-2024-10-01", - "canonical": "openai/gpt-4o-audio" + "model": "gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-mini-search" + "model": "gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "o3-deep-research", - "canonical": "openai/o3-deep-research" + "model": "gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", - "model": "o4-mini", - "canonical": "openai/o4-mini" + "model": "gpt-5-pro", + "canonical": "openai/gpt-5-pro" }, { "provider": "openai", - "model": "gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "model": "gpt-3.5-turbo-instruct-0914", + "canonical": "openai/gpt-3.5-turbo-instruct" }, { "provider": "openai", - "model": "gpt-4o-search-preview", - "canonical": "openai/gpt-4o-search" + "model": "gpt-5-2025-08-07", + "canonical": "openai/gpt-5" }, { "provider": "openai", @@ -4544,8 +4625,8 @@ }, { "provider": "openai", - "model": "gpt-5.1-2025-11-13", - "canonical": "openai/gpt-5.1" + "model": "gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openai", @@ -4554,38 +4635,38 @@ }, { "provider": "openai", - "model": "gpt-5-2025-08-07", - "canonical": "openai/gpt-5" + "model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-mini-search" }, { "provider": "openai", - "model": "gpt-4o-mini-search-preview", - "canonical": "openai/gpt-4o-mini-search" + "model": "gpt-4-turbo-2024-04-09", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "gpt-3.5-turbo-1106", - "canonical": "openai/gpt-3.5-turbo" + "model": "o3-pro-2025-06-10", + "canonical": "openai/o3-pro" }, { "provider": "openai", - "model": "gpt-4.1-2025-04-14", - "canonical": "openai/gpt-4.1" + "model": "gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openai", - "model": "gpt-4.1-mini-2025-04-14", - "canonical": "openai/gpt-4.1-mini" + "model": "gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { "provider": "openai", - "model": "gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "model": "gpt-5-pro-2025-10-06", + "canonical": "openai/gpt-5-pro" }, { "provider": "openai", - "model": "o1-2024-12-17", - "canonical": "openai/o1" + "model": "gpt-5", + "canonical": "openai/gpt-5" }, { "provider": "openai", @@ -4599,38 +4680,38 @@ }, { "provider": "openai", - "model": "o3-mini-2025-01-31", - "canonical": "openai/o3-mini" + "model": "gpt-5-nano-2025-08-07", + "canonical": "openai/gpt-5-nano" }, { "provider": "openai", - "model": "o3-pro", - "canonical": "openai/o3-pro" + "model": "gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "model": "gpt-4-1106-preview", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4-0314", - "canonical": "openai/gpt-4" + "model": "gpt-5.1", + "canonical": "openai/gpt-5.1" }, { "provider": "openai", - "model": "o1-pro", + "model": "o1-pro-2025-03-19", "canonical": "openai/o1-pro" }, { "provider": "openai", - "model": "chatgpt-4o-latest", - "canonical": "openai/chatgpt-4o-latest" + "model": "o4-mini-deep-research-2025-06-26", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openai", - "model": "gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "model": "o1", + "canonical": "openai/o1" }, { "provider": "openai", @@ -4639,38 +4720,33 @@ }, { "provider": "openai", - "model": "gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" - }, - { - "provider": "openai", - "model": "o3-2025-04-16", - "canonical": "openai/o3" + "model": "gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", - "model": "gpt-3.5-turbo-0125", - "canonical": "openai/gpt-3.5-turbo" + "model": "o1-2024-12-17", + "canonical": "openai/o1" }, { "provider": "openai", - "model": "gpt-4-0125-preview", - "canonical": "openai/gpt-4" + "model": "o3-mini", + "canonical": "openai/o3-mini" }, { "provider": "openai", - "model": "gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "model": "o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openai", - "model": "gpt-4-turbo-2024-04-09", - "canonical": "openai/gpt-4-turbo" + "model": "gpt-4", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-5.1", - "canonical": "openai/gpt-5.1" + "model": "gpt-4-0613", + "canonical": "openai/gpt-4" }, { "provider": "openai", @@ -4679,73 +4755,68 @@ }, { "provider": "openai", - "model": "gpt-5-mini-2025-08-07", - "canonical": "openai/gpt-5-mini" + "model": "gpt-4.1", + "canonical": "openai/gpt-4.1" }, { "provider": "openai", - "model": "gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "model": "o1-pro", + "canonical": "openai/o1-pro" }, { "provider": "openai", - "model": "o1-pro-2025-03-19", - "canonical": "openai/o1-pro" + "model": "gpt-4.1-2025-04-14", + "canonical": "openai/gpt-4.1" }, { "provider": "openai", - "model": "gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "model": "gpt-5-codex", + "canonical": "openai/gpt-5-codex" }, { "provider": "openai", - "model": "gpt-4o-audio-preview-2025-06-03", - "canonical": "openai/gpt-4o-audio" + "model": "chatgpt-4o-latest", + "canonical": "openai/chatgpt-4o-latest" }, { "provider": "openai", - "model": "gpt-3.5-turbo-instruct-0914", - "canonical": "openai/gpt-3.5-turbo-instruct" + "model": "gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "gpt-5-nano-2025-08-07", - "canonical": "openai/gpt-5-nano" + "model": "gpt-5-mini-2025-08-07", + "canonical": "openai/gpt-5-mini" }, { "provider": "openai", - "model": "gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "model": "gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" }, { "provider": "openai", - "model": "o4-mini-deep-research-2025-06-26", - "canonical": "openai/o4-mini-deep-research" + "model": "gpt-5.1-2025-11-13", + "canonical": "openai/gpt-5.1" }, { "provider": "openai", - "model": "gpt-4", - "canonical": "openai/gpt-4" + "model": "o3", + "canonical": "openai/o3" }, { "provider": "openai", - "model": "o4-mini-2025-04-16", + "model": "o4-mini", "canonical": "openai/o4-mini" }, { - "provider": "openai", - "model": "gpt-4o-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-search" + "provider": "openrouter", + "model": "openai/gpt-5.1-chat", + "canonical": "openai/gpt-5.1-chat" }, { - "provider": "openai", - "model": "gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" - }, - { - "provider": "openai", - "model": "gpt-3.5-turbo-instruct", - "canonical": "openai/gpt-3.5-turbo-instruct" + "provider": "openrouter", + "model": "anthropic/claude-opus-4.5", + "canonical": "anthropic/claude-opus-4.5" }, { "provider": "openrouter", @@ -4754,118 +4825,118 @@ }, { "provider": "openrouter", - "model": "openai/o1", - "canonical": "openai/o1" + "model": "google/gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "openrouter", - "model": "openai/o3-mini-high", - "canonical": "openai/o3-mini-high" + "model": "openai/gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "openai/gpt-oss-120b", + "canonical": "openai/gpt-oss-120b" }, { "provider": "openrouter", - "model": "openai/gpt-5", - "canonical": "openai/gpt-5" + "model": "openai/gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "google/gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" + "model": "openai/o4-mini-high", + "canonical": "openai/o4-mini-high" }, { "provider": "openrouter", - "model": "openai/gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "model": "openai/gpt-4-0314", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "openai/o3-pro", - "canonical": "openai/o3-pro" + "model": "openai/gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "anthropic/claude-sonnet-4", - "canonical": "anthropic/claude-sonnet-4" + "model": "openai/gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openrouter", - "model": "openai/gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "model": "openai/o3", + "canonical": "openai/o3" }, { "provider": "openrouter", - "model": "anthropic/claude-3-opus", - "canonical": "anthropic/claude-3-opus" + "model": "anthropic/claude-3.7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" }, { "provider": "openrouter", - "model": "openai/gpt-4-0314", - "canonical": "openai/gpt-4" + "model": "anthropic/claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" }, { "provider": "openrouter", - "model": "openai/o4-mini", - "canonical": "openai/o4-mini" + "model": "google/gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { "provider": "openrouter", - "model": "openai/gpt-5.1", - "canonical": "openai/gpt-5.1" + "model": "openai/gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" }, { "provider": "openrouter", - "model": "openai/gpt-oss-safeguard-20b", - "canonical": "openai/gpt-oss-safeguard-20b" + "model": "openai/gpt-5-pro", + "canonical": "openai/gpt-5-pro" }, { "provider": "openrouter", - "model": "openai/o3", - "canonical": "openai/o3" + "model": "openai/gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "model": "openai/gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet-20240620", - "canonical": "anthropic/claude-3.5-sonnet" + "model": "openai/gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview-05-06", - "canonical": "google/gemini-2.5-pro" + "model": "openai/gpt-oss-20b", + "canonical": "openai/gpt-oss-20b" }, { "provider": "openrouter", - "model": "openai/gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "model": "anthropic/claude-3-haiku", + "canonical": "anthropic/claude-3-haiku" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "model": "openai/gpt-4.1", + "canonical": "openai/gpt-4.1" }, { "provider": "openrouter", - "model": "openai/gpt-4o:extended", - "canonical": "openai/gpt-4o:extended" + "model": "anthropic/claude-3-opus", + "canonical": "anthropic/claude-3-opus" }, { "provider": "openrouter", - "model": "openai/gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "model": "anthropic/claude-sonnet-4.5", + "canonical": "anthropic/claude-sonnet-4.5" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "model": "google/gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "openrouter", @@ -4874,23 +4945,28 @@ }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "model": "openai/gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku" + "model": "anthropic/claude-haiku-4.5", + "canonical": "anthropic/claude-haiku-4.5" }, { "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet" + "model": "anthropic/claude-opus-4.1", + "canonical": "anthropic/claude-opus-4.1" }, { "provider": "openrouter", - "model": "openai/o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "model": "openai/gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openrouter", + "model": "openai/o3-deep-research", + "canonical": "openai/o3-deep-research" }, { "provider": "openrouter", @@ -4899,53 +4975,53 @@ }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet", - "canonical": "anthropic/claude-3.5-sonnet" + "model": "openai/o3-pro", + "canonical": "openai/o3-pro" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "openai/gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview", - "canonical": "google/gemini-2.5-pro" + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "openrouter", - "model": "openai/gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "model": "openai/gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openrouter", - "model": "openai/gpt-4o", - "canonical": "openai/gpt-4o" + "model": "openai/gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openrouter", - "model": "google/gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" + "model": "openai/gpt-5", + "canonical": "openai/gpt-5" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "model": "openai/o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openrouter", - "model": "openai/gpt-5-image-mini", - "canonical": "openai/gpt-5-image-mini" + "model": "openai/gpt-4o", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "openai/gpt-oss-120b:exacto", - "canonical": "openai/gpt-oss-120b" + "model": "openai/gpt-4o:extended", + "canonical": "openai/gpt-4o:extended" }, { "provider": "openrouter", - "model": "openai/o4-mini-high", - "canonical": "openai/o4-mini-high" + "model": "openai/o4-mini", + "canonical": "openai/o4-mini" }, { "provider": "openrouter", @@ -4954,33 +5030,28 @@ }, { "provider": "openrouter", - "model": "openai/gpt-oss-120b", - "canonical": "openai/gpt-oss-120b" - }, - { - "provider": "openrouter", - "model": "openai/o3-deep-research", - "canonical": "openai/o3-deep-research" + "model": "openai/gpt-5-image", + "canonical": "openai/gpt-5-image" }, { "provider": "openrouter", - "model": "anthropic/claude-opus-4", - "canonical": "anthropic/claude-opus-4" + "model": "google/gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "openrouter", - "model": "openai/gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "model": "openai/codex-mini", + "canonical": "openai/codex-mini" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "model": "google/gemini-2.5-pro-preview", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "anthropic/claude-haiku-4.5", - "canonical": "anthropic/claude-haiku-4.5" + "model": "openai/o3-mini-high", + "canonical": "openai/o3-mini-high" }, { "provider": "openrouter", @@ -4989,83 +5060,83 @@ }, { "provider": "openrouter", - "model": "anthropic/claude-sonnet-4.5", - "canonical": "anthropic/claude-sonnet-4.5" + "model": "openai/gpt-4", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "model": "google/gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { "provider": "openrouter", - "model": "openai/gpt-oss-20b", - "canonical": "openai/gpt-oss-20b" + "model": "openai/gpt-5.1", + "canonical": "openai/gpt-5.1" }, { "provider": "openrouter", - "model": "anthropic/claude-3-haiku", - "canonical": "anthropic/claude-3-haiku" + "model": "anthropic/claude-3.5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" }, { "provider": "openrouter", - "model": "openai/codex-mini", - "canonical": "openai/codex-mini" + "model": "openai/gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openrouter", - "model": "openai/gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "model": "openai/gpt-oss-safeguard-20b", + "canonical": "openai/gpt-oss-safeguard-20b" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "model": "anthropic/claude-opus-4", + "canonical": "anthropic/claude-opus-4" }, { "provider": "openrouter", - "model": "openai/gpt-4.1", - "canonical": "openai/gpt-4.1" + "model": "openai/gpt-oss-120b:exacto", + "canonical": "openai/gpt-oss-120b" }, { "provider": "openrouter", - "model": "openai/gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "model": "openai/gpt-5-image-mini", + "canonical": "openai/gpt-5-image-mini" }, { "provider": "openrouter", - "model": "openai/gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "model": "google/gemini-2.5-pro-preview-05-06", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "openai/gpt-5-image", - "canonical": "openai/gpt-5-image" + "model": "google/gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-06-17", - "canonical": "google/gemini-2.5-flash-lite" + "model": "openai/gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" }, { "provider": "openrouter", - "model": "openai/gpt-4", - "canonical": "openai/gpt-4" + "model": "anthropic/claude-3.5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "openrouter", - "model": "openai/gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "model": "openai/o1", + "canonical": "openai/o1" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "model": "anthropic/claude-3.5-haiku", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "openrouter", - "model": "anthropic/claude-opus-4.1", - "canonical": "anthropic/claude-opus-4.1" + "model": "google/gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", @@ -5074,23 +5145,23 @@ }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-11-20", + "model": "openai/gpt-4o-2024-08-06", "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku", - "canonical": "anthropic/claude-3.5-haiku" + "model": "openai/gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-preview-02-05", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", - "model": "gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", @@ -5099,43 +5170,43 @@ }, { "provider": "google", - "model": "gemini-2.5-flash-lite-preview-06-17", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemma-3n-e4b-it", + "canonical": "google/gemma-3n-e4b-it" }, { "provider": "google", - "model": "gemini-2.0-flash-001", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "google", - "model": "gemini-2.5-pro-preview-05-06", - "canonical": "google/gemini-2.5-pro" + "model": "gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemini-2.0-flash-lite-preview", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.5-pro-preview-03-25", - "canonical": "google/gemini-2.5-pro" + "model": "gemini-2.5-flash-image", + "canonical": "google/gemini-2.5-flash-image" }, { "provider": "google", - "model": "gemini-2.5-flash-preview-05-20", - "canonical": "google/gemini-2.5-flash" + "model": "gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", - "model": "gemma-3n-e4b-it", - "canonical": "google/gemma-3n-e4b-it" + "model": "gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", - "model": "gemini-2.0-flash-lite", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.0-flash", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", @@ -5144,128 +5215,118 @@ }, { "provider": "google", - "model": "gemini-2.5-flash-image", - "canonical": "google/gemini-2.5-flash-image" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" - }, - { - "provider": "google", - "model": "gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" - }, - { - "provider": "google", - "model": "gemma-3-4b-it", - "canonical": "google/gemma-3-4b-it" + "model": "gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "google", - "model": "gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "model": "gemini-2.0-flash-001", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", - "model": "gemini-2.5-pro-preview-06-05", - "canonical": "google/gemini-2.5-pro" + "model": "gemini-2.0-flash-lite", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "model": "gemma-3-12b-it", + "canonical": "google/gemma-3-12b-it" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-preview", + "model": "gemini-2.0-flash-lite-preview-02-05", "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.0-flash", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-3-pro-image-preview", + "canonical": "google/gemini-3-pro-image" }, { "provider": "google", - "model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { "provider": "google", - "model": "gemma-3-12b-it", - "canonical": "google/gemma-3-12b-it" + "model": "gemma-3-4b-it", + "canonical": "google/gemma-3-4b-it" } ], "model_counts": { + "databricks": 153, + "tetrate": 0, + "openrouter": 222, "openai": 630, - "anthropic": 9, - "openrouter": 219, - "databricks": 143, "google": 50, - "tetrate": 0 + "anthropic": 10 }, "canonical_models_used": [ - "openai/gpt-5.1-codex", - "openai/gpt-5-pro", - "openai/gpt-4.1", - "openai/o3-pro", - "openai/o4-mini-high", - "openai/gpt-4", - "anthropic/claude-opus-4.1", - "openai/codex-mini", - "openai/gpt-3.5-turbo-instruct", - "openai/gpt-oss-20b", + "anthropic/claude-sonnet-4", + "anthropic/claude-opus-4", "google/gemma-3-12b-it", - "google/gemini-2.5-flash", - "openai/gpt-4.1-mini", - "anthropic/claude-sonnet-4.5", + "openai/gpt-oss-120b", + "openai/chatgpt-4o-latest", + "openai/gpt-5.1-codex-mini", + "openai/gpt-oss-20b", + "google/gemini-2.5-flash-image", "openai/gpt-4o-mini", - "openai/gpt-4.1-nano", + "google/gemini-2.5-flash-lite", + "openai/gpt-4-turbo", + "openai/gpt-5-image", + "openai/o3-pro", + "openai/gpt-4o", + "openai/gpt-5.1", + "openai/o1-pro", + "openai/gpt-5-mini", + "openai/gpt-4o-audio", + "openai/gpt-4.1", + "anthropic/claude-3.7-sonnet:thinking", + "google/gemma-3-4b-it", + "openai/gpt-3.5-turbo-16k", "google/gemma-3-27b-it", + "openai/gpt-3.5-turbo", + "openai/gpt-5", + "openai/gpt-5.1-codex", + "openai/gpt-oss-safeguard-20b", "anthropic/claude-haiku-4.5", - "openai/gpt-3.5-turbo-16k", + "openai/o3", + "openai/gpt-4.1-mini", "anthropic/claude-3.5-sonnet", - "google/gemini-2.0-flash", - "google/gemma-3n-e4b-it", - "openai/o3-deep-research", "openai/gpt-5-image-mini", - "google/gemini-2.5-pro", - "anthropic/claude-3.5-haiku", - "openai/gpt-4o-mini-search", - "openai/gpt-5.1", "openai/gpt-4o:extended", - "openai/gpt-3.5-turbo", - "google/gemini-2.5-flash-image", - "openai/gpt-5-mini", - "openai/gpt-oss-120b", - "openai/gpt-4-turbo", - "openai/o3-mini-high", + "anthropic/claude-3-haiku", + "google/gemini-2.0-flash-lite", "openai/gpt-4o-search", - "openai/o4-mini-deep-research", "openai/o1", + "openai/gpt-5.1-chat", + "google/gemini-2.0-flash", + "openai/o3-mini-high", + "openai/gpt-4", + "openai/o4-mini-high", "openai/gpt-5-codex", - "openai/gpt-4o-audio", - "google/gemma-3-4b-it", - "openai/o1-pro", - "openai/gpt-oss-safeguard-20b", - "anthropic/claude-3.7-sonnet:thinking", - "openai/gpt-5", - "anthropic/claude-sonnet-4", + "google/gemini-2.5-pro", + "openai/codex-mini", + "openai/gpt-4o-mini-search", + "anthropic/claude-opus-4.5", + "anthropic/claude-sonnet-4.5", + "openai/gpt-5.1-codex-max", + "anthropic/claude-3.7-sonnet", + "google/gemini-2.5-flash", + "openai/gpt-5-pro", + "google/gemini-3-pro-image", + "google/gemini-3-pro", + "anthropic/claude-3.5-haiku", + "openai/o4-mini-deep-research", "openai/gpt-5-nano", - "openai/o3", - "anthropic/claude-3-haiku", - "google/gemini-2.5-flash-lite", - "openai/gpt-4o", - "openai/gpt-5.1-codex-mini", + "google/gemma-3n-e4b-it", + "openai/gpt-4.1-nano", + "openai/o3-deep-research", + "openai/gpt-3.5-turbo-instruct", + "openai/o4-mini", "anthropic/claude-3-opus", "openai/o3-mini", - "openai/chatgpt-4o-latest", - "google/gemini-2.0-flash-lite", - "openai/gpt-5-image", - "anthropic/claude-3.7-sonnet", - "openai/o4-mini", - "anthropic/claude-opus-4" + "anthropic/claude-opus-4.1" ] } \ No newline at end of file From 74a47466aaeb39a685bb34e53be3bbf75e1fd36b Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 9 Dec 2025 19:38:40 -0500 Subject: [PATCH 23/52] Fix input modalities --- .../goose/examples/build_canonical_models.rs | 51 +- .../data/canonical_mapping_report.json | 1384 +++++++++-------- .../canonical/data/canonical_models.json | 199 ++- 3 files changed, 871 insertions(+), 763 deletions(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 4cb98d903546..12215e595c29 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -140,45 +140,28 @@ async fn main() -> Result<()> { .map(|v| v as usize); let input_modalities: Vec = model - .get("supported_parameters") + .get("architecture") + .and_then(|arch| arch.get("input_modalities")) .and_then(|v| v.as_array()) .map(|arr| { - let mut mods = vec!["text".to_string()]; - for param in arr { - if let Some(s) = param.as_str() { - match s { - "image" | "image_url" => { - if !mods.contains(&"image".to_string()) { - mods.push("image".to_string()); - } - } - "audio" => { - if !mods.contains(&"audio".to_string()) { - mods.push("audio".to_string()); - } - } - "video" => { - if !mods.contains(&"video".to_string()) { - mods.push("video".to_string()); - } - } - _ => {} - } - } - } - if model - .get("architecture") - .and_then(|a| a.get("multimodality")) - .is_some() - && !mods.contains(&"file".to_string()) - { - mods.push("file".to_string()); - } - mods + arr.iter() + .filter_map(|v| v.as_str()) + .map(|s| s.to_string()) + .collect() }) .unwrap_or_else(|| vec!["text".to_string()]); - let output_modalities = vec!["text".to_string()]; + let output_modalities: Vec = model + .get("architecture") + .and_then(|arch| arch.get("output_modalities")) + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str()) + .map(|s| s.to_string()) + .collect() + }) + .unwrap_or_else(|| vec!["text".to_string()]); let tokenizer = if canonical_id.starts_with("anthropic/") { "Claude" diff --git a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json index f8f1044e4b9f..3af83e1e3f54 100644 --- a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json +++ b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-09T17:58:02.776903+00:00", + "timestamp": "2025-12-10T00:38:10.636782+00:00", "unmapped_models": [ { "provider": "openai", @@ -1857,6 +1857,18 @@ "provider": "openai", "model": "ft:gpt-4o-2024-08-06:square::BDgwAYDm" }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::Cl22v5JX:ckpt-step-50" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::Cl22ws6P" + }, + { + "provider": "openai", + "model": "ft:gpt-4o-2024-08-06:square::Cl22ww03:ckpt-step-100" + }, { "provider": "openai", "model": "ft:gpt-4o-2024-08-06:square:presale-prod-update:A1VLdLFo:ckpt-step-772" @@ -2473,6 +2485,10 @@ "provider": "openrouter", "model": "mistralai/codestral-2508" }, + { + "provider": "openrouter", + "model": "mistralai/devstral-2512:free" + }, { "provider": "openrouter", "model": "mistralai/devstral-medium" @@ -3663,779 +3679,779 @@ "verified": true } ], - "openrouter": [ + "openai": [ { - "provider_model": "anthropic/claude-3-haiku", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o-latest", "verified": true }, { - "provider_model": "anthropic/claude-3-opus", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet:thinking", - "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "anthropic/claude-haiku-4.5", + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "anthropic/claude-opus-4", + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "anthropic/claude-opus-4.1", + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.5", - "canonical_model": "anthropic/claude-opus-4.5", + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet-4", + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "anthropic/claude-sonnet-4.5", + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemini-3-pro-preview", - "canonical_model": "google/gemini-3-pro", + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/codex-mini", - "canonical_model": "openai/codex-mini", + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-0613", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "gpt-5-nano-2025-08-07", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-4o:extended", - "canonical_model": "openai/gpt-4o:extended", + "provider_model": "gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "gpt-5.1-2025-11-13", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", "verified": true }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openai/gpt-5-image", + "provider_model": "gpt-5.1-codex-max", + "canonical_model": "openai/gpt-5.1-codex-max", "verified": true }, { - "provider_model": "openai/gpt-5-image-mini", - "canonical_model": "openai/gpt-5-image-mini", + "provider_model": "gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-5.1", - "canonical_model": "openai/gpt-5.1", + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-5.1-chat", - "canonical_model": "openai/gpt-5.1-chat", + "provider_model": "o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex", - "canonical_model": "openai/gpt-5.1-codex", + "provider_model": "o3-2025-04-16", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex-max", - "canonical_model": "openai/gpt-5.1-codex-max", + "provider_model": "o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex-mini", - "canonical_model": "openai/gpt-5.1-codex-mini", + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openai/gpt-oss-20b", + "provider_model": "o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openai/gpt-oss-safeguard-20b", + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/o1", - "canonical_model": "openai/o1", + "provider_model": "o4-mini", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o3", - "canonical_model": "openai/o3", + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "openai/o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", "verified": true - }, + } + ], + "tetrate": [], + "google": [ { - "provider_model": "openai/o3-mini-high", - "canonical_model": "openai/o3-mini-high", + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "openai/o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "openai/o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "gemini-2.0-flash-exp", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "openai/o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "openai/o4-mini-high", - "canonical_model": "openai/o4-mini-high", + "provider_model": "gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true - } - ], - "databricks": [], - "openai": [ + }, { - "provider_model": "chatgpt-4o-latest", - "canonical_model": "openai/chatgpt-4o-latest", + "provider_model": "gemini-2.0-flash-lite-preview", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gemini-2.0-flash-lite-preview-02-05", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gemini-2.5-flash-image", + "canonical_model": "google/gemini-2.5-flash-image", "verified": true }, { - "provider_model": "gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gemini-2.5-flash-image-preview", + "canonical_model": "google/gemini-2.5-flash-image", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct-0914", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4-0125-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "gemini-3-pro-image-preview", + "canonical_model": "google/gemini-3-pro-image", "verified": true }, { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt-4", + "provider_model": "gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro", "verified": true }, { - "provider_model": "gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "gemma-3-12b-it", + "canonical_model": "google/gemma-3-12b-it", "verified": true }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gemma-3-4b-it", + "canonical_model": "google/gemma-3-4b-it", "verified": true }, { - "provider_model": "gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gemma-3n-e4b-it", + "canonical_model": "google/gemma-3n-e4b-it", "verified": true - }, + } + ], + "openrouter": [ { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt-4.1", + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", "verified": true }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", "verified": true }, { - "provider_model": "gpt-4.1-nano-2025-04-14", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", "verified": true }, { - "provider_model": "gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", "verified": true }, { - "provider_model": "gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { - "provider_model": "gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { - "provider_model": "gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { - "provider_model": "gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "anthropic/claude-opus-4.5", + "canonical_model": "anthropic/claude-opus-4.5", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-12-17", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2025-06-03", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet-4.5", "verified": true }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", "verified": true }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4o-search-preview", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", "verified": true }, { - "provider_model": "gpt-4o-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", "verified": true }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt-5", + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "google/gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro", "verified": true }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", "verified": true }, { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "gpt-5-pro-2025-10-06", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "gpt-5.1", - "canonical_model": "openai/gpt-5.1", + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-5.1-2025-11-13", - "canonical_model": "openai/gpt-5.1", + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-5.1-codex", - "canonical_model": "openai/gpt-5.1-codex", + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "gpt-5.1-codex-max", - "canonical_model": "openai/gpt-5.1-codex-max", + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "gpt-5.1-codex-mini", - "canonical_model": "openai/gpt-5.1-codex-mini", + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "o1", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1", + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro", + "provider_model": "openai/gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o3", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3", + "provider_model": "openai/gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "o3-deep-research-2025-06-26", - "canonical_model": "openai/o3-deep-research", + "provider_model": "openai/gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini", + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", "verified": true }, { - "provider_model": "o3-pro-2025-06-10", - "canonical_model": "openai/o3-pro", + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "o4-mini-2025-04-16", - "canonical_model": "openai/o4-mini", + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", "verified": true }, { - "provider_model": "o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", "verified": true }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true - } - ], - "google": [ + }, { - "provider_model": "gemini-2.0-flash", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "gemini-2.0-flash-exp", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "openai/gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "openai/gpt-5.1-chat", + "canonical_model": "openai/gpt-5.1-chat", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "openai/gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-preview", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "openai/gpt-5.1-codex-max", + "canonical_model": "openai/gpt-5.1-codex-max", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-preview-02-05", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "openai/gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "gemini-2.5-flash-image", - "canonical_model": "google/gemini-2.5-flash-image", + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b", "verified": true }, { - "provider_model": "gemini-2.5-flash-image-preview", - "canonical_model": "google/gemini-2.5-flash-image", + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", "verified": true }, { - "provider_model": "gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", "verified": true }, { - "provider_model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "openai/o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "openai/o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "gemini-3-pro-image-preview", - "canonical_model": "google/gemini-3-pro-image", + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "gemini-3-pro-preview", - "canonical_model": "google/gemini-3-pro", + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", "verified": true }, { - "provider_model": "gemma-3-12b-it", - "canonical_model": "google/gemma-3-12b-it", + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "openai/o4-mini", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "gemma-3-4b-it", - "canonical_model": "google/gemma-3-4b-it", + "provider_model": "openai/o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "gemma-3n-e4b-it", - "canonical_model": "google/gemma-3n-e4b-it", + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", "verified": true } ], - "tetrate": [] + "databricks": [] }, "mapped_models": [ { @@ -4445,23 +4461,23 @@ }, { "provider": "anthropic", - "model": "claude-opus-4-20250514", - "canonical": "anthropic/claude-opus-4" + "model": "claude-sonnet-4-20250514", + "canonical": "anthropic/claude-sonnet-4" }, { "provider": "anthropic", - "model": "claude-haiku-4-5-20251001", - "canonical": "anthropic/claude-haiku-4.5" + "model": "claude-opus-4-1-20250805", + "canonical": "anthropic/claude-opus-4.1" }, { "provider": "anthropic", - "model": "claude-3-7-sonnet-20250219", - "canonical": "anthropic/claude-3.7-sonnet" + "model": "claude-3-opus-20240229", + "canonical": "anthropic/claude-3-opus" }, { "provider": "anthropic", - "model": "claude-sonnet-4-20250514", - "canonical": "anthropic/claude-sonnet-4" + "model": "claude-haiku-4-5-20251001", + "canonical": "anthropic/claude-haiku-4.5" }, { "provider": "anthropic", @@ -4475,43 +4491,43 @@ }, { "provider": "anthropic", - "model": "claude-3-haiku-20240307", - "canonical": "anthropic/claude-3-haiku" + "model": "claude-opus-4-20250514", + "canonical": "anthropic/claude-opus-4" }, { "provider": "anthropic", - "model": "claude-3-opus-20240229", - "canonical": "anthropic/claude-3-opus" + "model": "claude-3-7-sonnet-20250219", + "canonical": "anthropic/claude-3.7-sonnet" }, { "provider": "anthropic", - "model": "claude-opus-4-1-20250805", - "canonical": "anthropic/claude-opus-4.1" + "model": "claude-3-haiku-20240307", + "canonical": "anthropic/claude-3-haiku" }, { "provider": "openai", - "model": "o4-mini-2025-04-16", - "canonical": "openai/o4-mini" + "model": "gpt-4o", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-4o-search-preview", - "canonical": "openai/gpt-4o-search" + "model": "gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" }, { "provider": "openai", - "model": "gpt-3.5-turbo-1106", - "canonical": "openai/gpt-3.5-turbo" + "model": "gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openai", - "model": "gpt-4o-audio-preview-2025-06-03", - "canonical": "openai/gpt-4o-audio" + "model": "gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" }, { "provider": "openai", - "model": "o3-deep-research", - "canonical": "openai/o3-deep-research" + "model": "o4-mini", + "canonical": "openai/o4-mini" }, { "provider": "openai", @@ -4520,23 +4536,33 @@ }, { "provider": "openai", - "model": "gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "model": "gpt-5.1-2025-11-13", + "canonical": "openai/gpt-5.1" }, { "provider": "openai", - "model": "gpt-4o-mini-search-preview", - "canonical": "openai/gpt-4o-mini-search" + "model": "o3-mini", + "canonical": "openai/o3-mini" }, { "provider": "openai", - "model": "gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "model": "o3-mini-2025-01-31", + "canonical": "openai/o3-mini" }, { "provider": "openai", - "model": "gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "model": "gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", @@ -4545,13 +4571,13 @@ }, { "provider": "openai", - "model": "gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "model": "gpt-5-codex", + "canonical": "openai/gpt-5-codex" }, { "provider": "openai", - "model": "gpt-4o-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-search" + "model": "gpt-5-pro", + "canonical": "openai/gpt-5-pro" }, { "provider": "openai", @@ -4560,53 +4586,48 @@ }, { "provider": "openai", - "model": "o3-pro", - "canonical": "openai/o3-pro" + "model": "gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { "provider": "openai", - "model": "o3-2025-04-16", - "canonical": "openai/o3" + "model": "gpt-5.1", + "canonical": "openai/gpt-5.1" }, { "provider": "openai", - "model": "gpt-3.5-turbo-instruct", - "canonical": "openai/gpt-3.5-turbo-instruct" + "model": "gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", - "model": "gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "model": "o3-2025-04-16", + "canonical": "openai/o3" }, { "provider": "openai", - "model": "o3-mini-2025-01-31", - "canonical": "openai/o3-mini" + "model": "gpt-5-2025-08-07", + "canonical": "openai/gpt-5" }, { "provider": "openai", - "model": "gpt-4-0125-preview", + "model": "gpt-4-0613", "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" - }, - { - "provider": "openai", - "model": "gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "model": "gpt-4o-audio-preview-2025-06-03", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openai", - "model": "gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "model": "gpt-4.1-nano-2025-04-14", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openai", - "model": "gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "model": "chatgpt-4o-latest", + "canonical": "openai/chatgpt-4o-latest" }, { "provider": "openai", @@ -4615,53 +4636,48 @@ }, { "provider": "openai", - "model": "gpt-5-2025-08-07", - "canonical": "openai/gpt-5" + "model": "gpt-4", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4o", - "canonical": "openai/gpt-4o" - }, - { - "provider": "openai", - "model": "gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "model": "o1", + "canonical": "openai/o1" }, { "provider": "openai", - "model": "o3-deep-research-2025-06-26", - "canonical": "openai/o3-deep-research" + "model": "gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" }, { "provider": "openai", - "model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-mini-search" + "model": "gpt-5-nano-2025-08-07", + "canonical": "openai/gpt-5-nano" }, { "provider": "openai", - "model": "gpt-4-turbo-2024-04-09", - "canonical": "openai/gpt-4-turbo" + "model": "o1-pro", + "canonical": "openai/o1-pro" }, { "provider": "openai", - "model": "o3-pro-2025-06-10", - "canonical": "openai/o3-pro" + "model": "gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { "provider": "openai", - "model": "gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "model": "gpt-4.1", + "canonical": "openai/gpt-4.1" }, { "provider": "openai", - "model": "gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "model": "gpt-4o-search-preview", + "canonical": "openai/gpt-4o-search" }, { "provider": "openai", - "model": "gpt-5-pro-2025-10-06", - "canonical": "openai/gpt-5-pro" + "model": "gpt-4.1-2025-04-14", + "canonical": "openai/gpt-4.1" }, { "provider": "openai", @@ -4670,297 +4686,287 @@ }, { "provider": "openai", - "model": "gpt-4o-audio-preview-2024-12-17", - "canonical": "openai/gpt-4o-audio" + "model": "o1-2024-12-17", + "canonical": "openai/o1" }, { "provider": "openai", - "model": "gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "model": "gpt-4o-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-search" }, { "provider": "openai", - "model": "gpt-5-nano-2025-08-07", - "canonical": "openai/gpt-5-nano" + "model": "gpt-4-1106-preview", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "model": "gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", - "model": "gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "model": "o3", + "canonical": "openai/o3" }, { "provider": "openai", - "model": "gpt-5.1", - "canonical": "openai/gpt-5.1" + "model": "gpt-4-0125-preview", + "canonical": "openai/gpt-4" }, { "provider": "openai", - "model": "o1-pro-2025-03-19", - "canonical": "openai/o1-pro" + "model": "o3-pro-2025-06-10", + "canonical": "openai/o3-pro" }, { "provider": "openai", - "model": "o4-mini-deep-research-2025-06-26", + "model": "o4-mini-deep-research", "canonical": "openai/o4-mini-deep-research" }, { "provider": "openai", - "model": "o1", - "canonical": "openai/o1" + "model": "gpt-3.5-turbo-1106", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openai", - "model": "gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "model": "gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "model": "gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "o1-2024-12-17", - "canonical": "openai/o1" + "model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-mini-search" }, { "provider": "openai", - "model": "o3-mini", - "canonical": "openai/o3-mini" + "model": "gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" }, { "provider": "openai", - "model": "o4-mini-deep-research", + "model": "o4-mini-deep-research-2025-06-26", "canonical": "openai/o4-mini-deep-research" }, { "provider": "openai", - "model": "gpt-4", - "canonical": "openai/gpt-4" + "model": "gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openai", - "model": "gpt-4-0613", - "canonical": "openai/gpt-4" + "model": "o3-deep-research", + "canonical": "openai/o3-deep-research" }, { "provider": "openai", - "model": "gpt-4.1-nano-2025-04-14", - "canonical": "openai/gpt-4.1-nano" + "model": "gpt-5-mini-2025-08-07", + "canonical": "openai/gpt-5-mini" }, { "provider": "openai", - "model": "gpt-4.1", - "canonical": "openai/gpt-4.1" + "model": "gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { "provider": "openai", - "model": "o1-pro", - "canonical": "openai/o1-pro" + "model": "gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { "provider": "openai", - "model": "gpt-4.1-2025-04-14", - "canonical": "openai/gpt-4.1" + "model": "o4-mini-2025-04-16", + "canonical": "openai/o4-mini" }, { "provider": "openai", - "model": "gpt-5-codex", - "canonical": "openai/gpt-5-codex" + "model": "gpt-3.5-turbo-instruct", + "canonical": "openai/gpt-3.5-turbo-instruct" }, { "provider": "openai", - "model": "chatgpt-4o-latest", - "canonical": "openai/chatgpt-4o-latest" + "model": "o1-pro-2025-03-19", + "canonical": "openai/o1-pro" }, { "provider": "openai", - "model": "gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "model": "gpt-4o-mini-search-preview", + "canonical": "openai/gpt-4o-mini-search" }, { "provider": "openai", - "model": "gpt-5-mini-2025-08-07", - "canonical": "openai/gpt-5-mini" + "model": "gpt-5-pro-2025-10-06", + "canonical": "openai/gpt-5-pro" }, { "provider": "openai", - "model": "gpt-5.1-codex-max", - "canonical": "openai/gpt-5.1-codex-max" + "model": "gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openai", - "model": "gpt-5.1-2025-11-13", - "canonical": "openai/gpt-5.1" + "model": "o3-deep-research-2025-06-26", + "canonical": "openai/o3-deep-research" }, { "provider": "openai", - "model": "o3", - "canonical": "openai/o3" + "model": "o3-pro", + "canonical": "openai/o3-pro" }, { "provider": "openai", - "model": "o4-mini", - "canonical": "openai/o4-mini" + "model": "gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-chat", - "canonical": "openai/gpt-5.1-chat" + "model": "google/gemini-2.5-pro-preview-05-06", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "anthropic/claude-opus-4.5", - "canonical": "anthropic/claude-opus-4.5" + "model": "openai/codex-mini", + "canonical": "openai/codex-mini" }, { "provider": "openrouter", - "model": "openai/gpt-5-codex", - "canonical": "openai/gpt-5-codex" + "model": "openai/o3-pro", + "canonical": "openai/o3-pro" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "model": "google/gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "openrouter", - "model": "openai/gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "model": "anthropic/claude-3.5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "openrouter", - "model": "openai/gpt-oss-120b", - "canonical": "openai/gpt-oss-120b" + "model": "anthropic/claude-3-haiku", + "canonical": "anthropic/claude-3-haiku" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "model": "openai/gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" }, { "provider": "openrouter", - "model": "openai/o4-mini-high", - "canonical": "openai/o4-mini-high" + "model": "anthropic/claude-haiku-4.5", + "canonical": "anthropic/claude-haiku-4.5" }, { "provider": "openrouter", - "model": "openai/gpt-4-0314", - "canonical": "openai/gpt-4" + "model": "openai/gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "model": "openai/o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" }, { "provider": "openrouter", - "model": "openai/gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "model": "openai/gpt-5-codex", + "canonical": "openai/gpt-5-codex" }, { "provider": "openrouter", - "model": "openai/o3", - "canonical": "openai/o3" + "model": "anthropic/claude-3.7-sonnet:thinking", + "canonical": "anthropic/claude-3.7-sonnet:thinking" }, { "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet" + "model": "openai/gpt-5.1-chat", + "canonical": "openai/gpt-5.1-chat" }, { "provider": "openrouter", - "model": "anthropic/claude-sonnet-4", - "canonical": "anthropic/claude-sonnet-4" + "model": "openai/o3-mini-high", + "canonical": "openai/o3-mini-high" }, { "provider": "openrouter", - "model": "google/gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" + "model": "google/gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "model": "openai/gpt-5-image", + "canonical": "openai/gpt-5-image" }, { "provider": "openrouter", - "model": "openai/gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "model": "openai/gpt-oss-120b:exacto", + "canonical": "openai/gpt-oss-120b" }, { "provider": "openrouter", - "model": "openai/gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "model": "anthropic/claude-3.5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" }, { "provider": "openrouter", - "model": "openai/gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "model": "google/gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex-max", - "canonical": "openai/gpt-5.1-codex-max" + "model": "openai/gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "openai/gpt-oss-20b", - "canonical": "openai/gpt-oss-20b" + "model": "openai/gpt-4", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "anthropic/claude-3-haiku", - "canonical": "anthropic/claude-3-haiku" + "model": "google/gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { "provider": "openrouter", - "model": "openai/gpt-4.1", - "canonical": "openai/gpt-4.1" + "model": "google/gemini-2.5-pro-preview", + "canonical": "google/gemini-2.5-pro" }, { "provider": "openrouter", - "model": "anthropic/claude-3-opus", - "canonical": "anthropic/claude-3-opus" + "model": "openai/gpt-4o", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "anthropic/claude-sonnet-4.5", - "canonical": "anthropic/claude-sonnet-4.5" + "model": "openai/gpt-5", + "canonical": "openai/gpt-5" }, { "provider": "openrouter", - "model": "google/gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" + "model": "openai/o1", + "canonical": "openai/o1" }, { "provider": "openrouter", - "model": "openai/gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "model": "openai/gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "openai/gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "model": "google/gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "openrouter", - "model": "anthropic/claude-haiku-4.5", - "canonical": "anthropic/claude-haiku-4.5" - }, - { - "provider": "openrouter", - "model": "anthropic/claude-opus-4.1", - "canonical": "anthropic/claude-opus-4.1" - }, - { - "provider": "openrouter", - "model": "openai/gpt-4-turbo", + "model": "openai/gpt-4-turbo-preview", "canonical": "openai/gpt-4-turbo" }, { @@ -4970,218 +4976,218 @@ }, { "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet:thinking", - "canonical": "anthropic/claude-3.7-sonnet:thinking" + "model": "openai/o3", + "canonical": "openai/o3" }, { "provider": "openrouter", - "model": "openai/o3-pro", - "canonical": "openai/o3-pro" + "model": "anthropic/claude-opus-4.5", + "canonical": "anthropic/claude-opus-4.5" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "model": "anthropic/claude-3.7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "model": "anthropic/claude-3.5-haiku", + "canonical": "anthropic/claude-3.5-haiku" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "model": "openai/gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" }, { "provider": "openrouter", - "model": "openai/gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "model": "openai/gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { "provider": "openrouter", - "model": "openai/gpt-5", - "canonical": "openai/gpt-5" + "model": "openai/gpt-4o:extended", + "canonical": "openai/gpt-4o:extended" }, { "provider": "openrouter", - "model": "openai/o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "openrouter", - "model": "openai/gpt-4o", - "canonical": "openai/gpt-4o" + "model": "openai/gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" }, { "provider": "openrouter", - "model": "openai/gpt-4o:extended", - "canonical": "openai/gpt-4o:extended" + "model": "openai/gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { "provider": "openrouter", - "model": "openai/o4-mini", - "canonical": "openai/o4-mini" + "model": "anthropic/claude-opus-4.1", + "canonical": "anthropic/claude-opus-4.1" }, { "provider": "openrouter", - "model": "google/gemini-2.0-flash-001", - "canonical": "google/gemini-2.0-flash" + "model": "openai/gpt-oss-safeguard-20b", + "canonical": "openai/gpt-oss-safeguard-20b" }, { "provider": "openrouter", - "model": "openai/gpt-5-image", - "canonical": "openai/gpt-5-image" + "model": "openai/gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "openai/gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" }, { "provider": "openrouter", - "model": "openai/codex-mini", - "canonical": "openai/codex-mini" + "model": "anthropic/claude-sonnet-4.5", + "canonical": "anthropic/claude-sonnet-4.5" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview", - "canonical": "google/gemini-2.5-pro" + "model": "openai/o3-mini", + "canonical": "openai/o3-mini" }, { "provider": "openrouter", - "model": "openai/o3-mini-high", - "canonical": "openai/o3-mini-high" + "model": "openai/gpt-4-0314", + "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "openai/o3-mini", - "canonical": "openai/o3-mini" + "model": "anthropic/claude-opus-4", + "canonical": "anthropic/claude-opus-4" }, { "provider": "openrouter", - "model": "openai/gpt-4", + "model": "openai/gpt-4-1106-preview", "canonical": "openai/gpt-4" }, { "provider": "openrouter", - "model": "google/gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "model": "openai/gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" }, { "provider": "openrouter", - "model": "openai/gpt-5.1", - "canonical": "openai/gpt-5.1" + "model": "openai/gpt-oss-120b", + "canonical": "openai/gpt-oss-120b" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet", - "canonical": "anthropic/claude-3.5-sonnet" + "model": "openai/gpt-3.5-turbo-0613", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openrouter", - "model": "openai/gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "model": "openai/o4-mini", + "canonical": "openai/o4-mini" }, { "provider": "openrouter", - "model": "openai/gpt-oss-safeguard-20b", - "canonical": "openai/gpt-oss-safeguard-20b" + "model": "openai/gpt-4.1", + "canonical": "openai/gpt-4.1" }, { "provider": "openrouter", - "model": "anthropic/claude-opus-4", - "canonical": "anthropic/claude-opus-4" + "model": "openai/gpt-5-pro", + "canonical": "openai/gpt-5-pro" }, { "provider": "openrouter", - "model": "openai/gpt-oss-120b:exacto", - "canonical": "openai/gpt-oss-120b" + "model": "anthropic/claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" }, { "provider": "openrouter", - "model": "openai/gpt-5-image-mini", - "canonical": "openai/gpt-5-image-mini" + "model": "anthropic/claude-3-opus", + "canonical": "anthropic/claude-3-opus" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview-05-06", - "canonical": "google/gemini-2.5-pro" + "model": "openai/gpt-oss-20b", + "canonical": "openai/gpt-oss-20b" }, { "provider": "openrouter", - "model": "google/gemini-3-pro-preview", - "canonical": "google/gemini-3-pro" + "model": "google/gemini-2.0-flash-001", + "canonical": "google/gemini-2.0-flash" }, { "provider": "openrouter", - "model": "openai/gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "model": "openai/gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku" + "model": "google/gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "openrouter", - "model": "openai/o1", - "canonical": "openai/o1" + "model": "openai/gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku", - "canonical": "anthropic/claude-3.5-haiku" + "model": "openai/gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" }, { "provider": "openrouter", - "model": "google/gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "openai/gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-0613", - "canonical": "openai/gpt-3.5-turbo" + "model": "openai/gpt-5-image-mini", + "canonical": "openai/gpt-5-image-mini" }, { "provider": "openrouter", - "model": "openai/gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "model": "openai/gpt-5.1", + "canonical": "openai/gpt-5.1" }, { "provider": "openrouter", - "model": "openai/gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "model": "openai/gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" }, { - "provider": "google", - "model": "gemini-2.5-flash-lite-preview-09-2025", + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite", "canonical": "google/gemini-2.5-flash-lite" }, { - "provider": "google", - "model": "gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "provider": "openrouter", + "model": "openai/o4-mini-high", + "canonical": "openai/o4-mini-high" }, { "provider": "google", - "model": "gemini-2.5-flash-image-preview", - "canonical": "google/gemini-2.5-flash-image" + "model": "gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemma-3n-e4b-it", - "canonical": "google/gemma-3n-e4b-it" + "model": "gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", - "model": "gemini-3-pro-preview", - "canonical": "google/gemini-3-pro" + "model": "gemini-2.5-flash-image-preview", + "canonical": "google/gemini-2.5-flash-image" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.0-flash", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", @@ -5195,28 +5201,33 @@ }, { "provider": "google", - "model": "gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemini-3-pro-image-preview", + "canonical": "google/gemini-3-pro-image" }, { "provider": "google", - "model": "gemini-2.5-flash-preview-09-2025", + "model": "gemma-3n-e4b-it", + "canonical": "google/gemma-3n-e4b-it" + }, + { + "provider": "google", + "model": "gemini-2.5-flash", "canonical": "google/gemini-2.5-flash" }, { "provider": "google", - "model": "gemini-2.0-flash", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "google", - "model": "gemini-2.0-flash-exp", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-2.0-flash-lite", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "gemma-3-4b-it", + "canonical": "google/gemma-3-4b-it" }, { "provider": "google", @@ -5225,108 +5236,113 @@ }, { "provider": "google", - "model": "gemini-2.0-flash-lite", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.0-flash-exp", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", - "model": "gemma-3-12b-it", - "canonical": "google/gemma-3-12b-it" + "model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-preview-02-05", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "google", - "model": "gemini-3-pro-image-preview", - "canonical": "google/gemini-3-pro-image" + "model": "gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { "provider": "google", - "model": "gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" + "model": "gemini-2.0-flash-lite-preview-02-05", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemma-3-4b-it", - "canonical": "google/gemma-3-4b-it" + "model": "gemma-3-12b-it", + "canonical": "google/gemma-3-12b-it" + }, + { + "provider": "google", + "model": "gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" } ], "model_counts": { - "databricks": 153, - "tetrate": 0, - "openrouter": 222, - "openai": 630, + "openrouter": 223, "google": 50, - "anthropic": 10 + "openai": 633, + "anthropic": 10, + "tetrate": 0, + "databricks": 153 }, "canonical_models_used": [ - "anthropic/claude-sonnet-4", - "anthropic/claude-opus-4", - "google/gemma-3-12b-it", - "openai/gpt-oss-120b", - "openai/chatgpt-4o-latest", + "anthropic/claude-sonnet-4.5", + "google/gemini-3-pro-image", + "anthropic/claude-3.7-sonnet", + "openai/gpt-4o-search", + "openai/gpt-5-image-mini", + "openai/gpt-3.5-turbo-16k", + "openai/o3-pro", + "anthropic/claude-3.5-sonnet", + "google/gemini-2.0-flash-lite", "openai/gpt-5.1-codex-mini", + "openai/gpt-4o-mini", + "anthropic/claude-opus-4.5", + "openai/chatgpt-4o-latest", + "openai/gpt-4o-audio", + "openai/gpt-5.1-codex-max", + "openai/gpt-4o-mini-search", + "openai/gpt-5-image", "openai/gpt-oss-20b", "google/gemini-2.5-flash-image", - "openai/gpt-4o-mini", - "google/gemini-2.5-flash-lite", + "openai/o4-mini", + "anthropic/claude-haiku-4.5", + "openai/gpt-5-pro", + "anthropic/claude-opus-4.1", + "openai/o3", + "openai/gpt-5", "openai/gpt-4-turbo", - "openai/gpt-5-image", - "openai/o3-pro", - "openai/gpt-4o", - "openai/gpt-5.1", - "openai/o1-pro", - "openai/gpt-5-mini", - "openai/gpt-4o-audio", - "openai/gpt-4.1", + "openai/gpt-4.1-mini", + "openai/gpt-5-nano", + "openai/gpt-4", + "google/gemma-3-12b-it", + "openai/o3-deep-research", "anthropic/claude-3.7-sonnet:thinking", - "google/gemma-3-4b-it", - "openai/gpt-3.5-turbo-16k", + "openai/codex-mini", + "openai/o3-mini-high", + "openai/o3-mini", "google/gemma-3-27b-it", + "openai/gpt-5-mini", + "openai/o4-mini-deep-research", + "google/gemma-3n-e4b-it", + "google/gemma-3-4b-it", "openai/gpt-3.5-turbo", - "openai/gpt-5", - "openai/gpt-5.1-codex", "openai/gpt-oss-safeguard-20b", - "anthropic/claude-haiku-4.5", - "openai/o3", - "openai/gpt-4.1-mini", - "anthropic/claude-3.5-sonnet", - "openai/gpt-5-image-mini", - "openai/gpt-4o:extended", "anthropic/claude-3-haiku", - "google/gemini-2.0-flash-lite", - "openai/gpt-4o-search", - "openai/o1", + "openai/gpt-4.1", "openai/gpt-5.1-chat", - "google/gemini-2.0-flash", - "openai/o3-mini-high", - "openai/gpt-4", - "openai/o4-mini-high", - "openai/gpt-5-codex", - "google/gemini-2.5-pro", - "openai/codex-mini", - "openai/gpt-4o-mini-search", - "anthropic/claude-opus-4.5", - "anthropic/claude-sonnet-4.5", - "openai/gpt-5.1-codex-max", - "anthropic/claude-3.7-sonnet", - "google/gemini-2.5-flash", - "openai/gpt-5-pro", - "google/gemini-3-pro-image", "google/gemini-3-pro", - "anthropic/claude-3.5-haiku", - "openai/o4-mini-deep-research", - "openai/gpt-5-nano", - "google/gemma-3n-e4b-it", "openai/gpt-4.1-nano", - "openai/o3-deep-research", - "openai/gpt-3.5-turbo-instruct", - "openai/o4-mini", + "openai/o4-mini-high", + "google/gemini-2.0-flash", + "openai/gpt-4o:extended", + "openai/o1-pro", + "anthropic/claude-sonnet-4", + "google/gemini-2.5-flash", + "google/gemini-2.5-flash-lite", + "openai/gpt-5.1", "anthropic/claude-3-opus", - "openai/o3-mini", - "anthropic/claude-opus-4.1" + "anthropic/claude-3.5-haiku", + "openai/gpt-5.1-codex", + "google/gemini-2.5-pro", + "openai/gpt-5-codex", + "openai/o1", + "openai/gpt-oss-120b", + "openai/gpt-4o", + "anthropic/claude-opus-4", + "openai/gpt-3.5-turbo-instruct" ] } \ No newline at end of file diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index deb2d390e5f9..7b4af5cfe0bb 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -5,7 +5,8 @@ "context_length": 200000, "max_completion_tokens": 4096, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -25,7 +26,8 @@ "context_length": 200000, "max_completion_tokens": 4096, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -45,7 +47,8 @@ "context_length": 200000, "max_completion_tokens": 8192, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -65,7 +68,9 @@ "context_length": 200000, "max_completion_tokens": 8192, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -85,7 +90,9 @@ "context_length": 200000, "max_completion_tokens": 64000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -105,7 +112,9 @@ "context_length": 200000, "max_completion_tokens": 64000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -125,6 +134,7 @@ "context_length": 200000, "max_completion_tokens": 64000, "input_modalities": [ + "image", "text" ], "output_modalities": [ @@ -145,7 +155,9 @@ "context_length": 200000, "max_completion_tokens": 32000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -165,7 +177,9 @@ "context_length": 200000, "max_completion_tokens": 32000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -185,6 +199,8 @@ "context_length": 200000, "max_completion_tokens": 32000, "input_modalities": [ + "file", + "image", "text" ], "output_modalities": [ @@ -205,7 +221,9 @@ "context_length": 1000000, "max_completion_tokens": 64000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -225,7 +243,9 @@ "context_length": 1000000, "max_completion_tokens": 64000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -245,7 +265,11 @@ "context_length": 1048576, "max_completion_tokens": 8192, "input_modalities": [ - "text" + "text", + "image", + "file", + "audio", + "video" ], "output_modalities": [ "text" @@ -265,7 +289,11 @@ "context_length": 1048576, "max_completion_tokens": 8192, "input_modalities": [ - "text" + "text", + "image", + "file", + "audio", + "video" ], "output_modalities": [ "text" @@ -285,7 +313,11 @@ "context_length": 1048576, "max_completion_tokens": 65535, "input_modalities": [ - "text" + "file", + "image", + "text", + "audio", + "video" ], "output_modalities": [ "text" @@ -305,9 +337,11 @@ "context_length": 32768, "max_completion_tokens": 32768, "input_modalities": [ + "image", "text" ], "output_modalities": [ + "image", "text" ], "tokenizer": "Gemini", @@ -325,7 +359,11 @@ "context_length": 1048576, "max_completion_tokens": 65535, "input_modalities": [ - "text" + "text", + "image", + "file", + "audio", + "video" ], "output_modalities": [ "text" @@ -345,7 +383,11 @@ "context_length": 1048576, "max_completion_tokens": 65536, "input_modalities": [ - "text" + "text", + "image", + "file", + "audio", + "video" ], "output_modalities": [ "text" @@ -365,7 +407,11 @@ "context_length": 1048576, "max_completion_tokens": 65536, "input_modalities": [ - "text" + "text", + "image", + "file", + "audio", + "video" ], "output_modalities": [ "text" @@ -385,9 +431,11 @@ "context_length": 65536, "max_completion_tokens": 32768, "input_modalities": [ + "image", "text" ], "output_modalities": [ + "image", "text" ], "tokenizer": "Gemini", @@ -443,7 +491,8 @@ "context_length": 131072, "max_completion_tokens": 131072, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -463,7 +512,8 @@ "context_length": 96000, "max_completion_tokens": 96000, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -482,7 +532,8 @@ "name": "Google: Gemma 3 4B", "context_length": 96000, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -521,7 +572,8 @@ "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -541,6 +593,7 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ + "image", "text" ], "output_modalities": [ @@ -641,7 +694,8 @@ "context_length": 128000, "max_completion_tokens": 4096, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -661,7 +715,9 @@ "context_length": 1047576, "max_completion_tokens": 32768, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -681,7 +737,9 @@ "context_length": 1047576, "max_completion_tokens": 32768, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -701,7 +759,9 @@ "context_length": 1047576, "max_completion_tokens": 32768, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -721,7 +781,9 @@ "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -741,6 +803,7 @@ "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ + "audio", "text" ], "output_modalities": [ @@ -761,7 +824,9 @@ "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -821,7 +886,9 @@ "context_length": 128000, "max_completion_tokens": 64000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -841,7 +908,9 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -861,6 +930,8 @@ "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ + "file", + "image", "text" ], "output_modalities": [ @@ -881,7 +952,8 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -901,9 +973,12 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ + "image", "text" ], "tokenizer": "GPT", @@ -921,9 +996,12 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ + "file", + "image", "text" ], "output_modalities": [ + "image", "text" ], "tokenizer": "GPT", @@ -941,7 +1019,9 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -961,7 +1041,9 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -981,7 +1063,9 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -1001,7 +1085,9 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -1021,6 +1107,8 @@ "context_length": 128000, "max_completion_tokens": 16384, "input_modalities": [ + "file", + "image", "text" ], "output_modalities": [ @@ -1041,7 +1129,8 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -1061,7 +1150,8 @@ "context_length": 400000, "max_completion_tokens": 128000, "input_modalities": [ - "text" + "text", + "image" ], "output_modalities": [ "text" @@ -1081,6 +1171,7 @@ "context_length": 400000, "max_completion_tokens": 100000, "input_modalities": [ + "image", "text" ], "output_modalities": [ @@ -1159,7 +1250,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -1179,7 +1272,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "text", + "image", + "file" ], "output_modalities": [ "text" @@ -1199,7 +1294,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -1219,7 +1316,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -1239,7 +1338,8 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "text", + "file" ], "output_modalities": [ "text" @@ -1259,7 +1359,8 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "text", + "file" ], "output_modalities": [ "text" @@ -1279,7 +1380,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "text", + "file", + "image" ], "output_modalities": [ "text" @@ -1299,7 +1402,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" @@ -1319,6 +1424,8 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ + "file", + "image", "text" ], "output_modalities": [ @@ -1339,7 +1446,9 @@ "context_length": 200000, "max_completion_tokens": 100000, "input_modalities": [ - "text" + "image", + "text", + "file" ], "output_modalities": [ "text" From 43ae0d38d6997c15715273eadbf3f65019381df2 Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 9 Dec 2025 20:59:12 -0500 Subject: [PATCH 24/52] fuzzy matching and pricing comparison --- crates/goose/src/providers/base.rs | 18 +- .../canonical/data/canonical_models.json | 2 +- crates/goose/src/providers/canonical/mod.rs | 2 +- .../src/providers/canonical/name_builder.rs | 402 +++++++++++++++++- crates/goose/tests/analyze_missing_models.rs | 158 +++++++ crates/goose/tests/debug_databricks_models.rs | 88 ++++ crates/goose/tests/debug_openrouter_models.rs | 108 +++++ .../goose/tests/test_canonical_vs_pricing.rs | 122 ++++++ crates/goose/tests/test_pricing_hit_rate.rs | 102 +++++ .../tests/test_pricing_with_real_providers.rs | 171 ++++++++ 10 files changed, 1163 insertions(+), 10 deletions(-) create mode 100644 crates/goose/tests/analyze_missing_models.rs create mode 100644 crates/goose/tests/debug_databricks_models.rs create mode 100644 crates/goose/tests/debug_openrouter_models.rs create mode 100644 crates/goose/tests/test_canonical_vs_pricing.rs create mode 100644 crates/goose/tests/test_pricing_hit_rate.rs create mode 100644 crates/goose/tests/test_pricing_with_real_providers.rs diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index 3ff121693b41..e0c35670989e 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -2,7 +2,7 @@ use anyhow::Result; use futures::Stream; use serde::{Deserialize, Serialize}; -use super::canonical::{canonical_name, CanonicalModelRegistry}; +use super::canonical::CanonicalModelRegistry; use super::errors::ProviderError; use super::retry::RetryConfig; use crate::config::base::ConfigValue; @@ -420,13 +420,19 @@ pub trait Provider: Send + Sync { &self, provider_model: &str, ) -> Result, ProviderError> { - let canonical = canonical_name(self.get_name(), provider_model); + use super::canonical::fuzzy_canonical_name; - if CanonicalModelRegistry::bundled_contains(&canonical)? { - Ok(Some(canonical)) - } else { - Ok(None) + // Try fuzzy matching - this generates multiple candidates + let candidates = fuzzy_canonical_name(self.get_name(), provider_model); + + // Return the first candidate that exists in the registry + for candidate in candidates { + if CanonicalModelRegistry::bundled_contains(&candidate)? { + return Ok(Some(candidate)); + } } + + Ok(None) } fn supports_embeddings(&self) -> bool { diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 7b4af5cfe0bb..0661c82426c4 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -567,7 +567,7 @@ } }, { - "id": "openai/chatgpt-4o-latest", + "id": "openai/chatgpt-4o", "name": "OpenAI: ChatGPT-4o", "context_length": 128000, "max_completion_tokens": 16384, diff --git a/crates/goose/src/providers/canonical/mod.rs b/crates/goose/src/providers/canonical/mod.rs index b9356ecca7b3..141856bf87c1 100644 --- a/crates/goose/src/providers/canonical/mod.rs +++ b/crates/goose/src/providers/canonical/mod.rs @@ -3,7 +3,7 @@ mod name_builder; mod registry; pub use model::{CanonicalModel, Pricing}; -pub use name_builder::{canonical_name, strip_version_suffix}; +pub use name_builder::{canonical_name, fuzzy_canonical_name, strip_version_suffix}; pub use registry::CanonicalModelRegistry; /// Represents a mapping from a provider's model name to a canonical model diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index 1606bf301c76..1f6e79cabe1d 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -10,6 +10,201 @@ pub fn canonical_name(provider: &str, model: &str) -> String { } } +/// Try to map a provider/model pair to a canonical model with fuzzy matching +/// This handles: +/// - Prefixed models (goose-claude-4-5-opus → anthropic/claude-4.5-opus) +/// - Hosting providers (databricks returning claude-3-5-sonnet → anthropic/claude-3.5-sonnet) +/// - Provider-prefixed models (databricks-meta-llama → meta-llama/llama) +/// - Word order variations (claude-4-opus ↔ claude-opus-4) +pub fn fuzzy_canonical_name(provider: &str, model: &str) -> Vec { + let mut candidates = Vec::new(); + + // Always try the standard canonical name first + candidates.push(canonical_name(provider, model)); + + // Strip common prefixes and try again + let model_stripped = strip_common_prefixes(model); + if model_stripped != model { + candidates.push(canonical_name(provider, &model_stripped)); + } + + // Try word-order swapping for Claude models (claude-4-opus ↔ claude-opus-4) + if let Some(swapped) = swap_claude_word_order(&model_stripped) { + candidates.push(canonical_name(provider, &swapped)); + + // For hosting providers, also try with inferred provider + if is_hosting_provider(provider) { + if let Some(inferred) = infer_provider_from_model(&swapped) { + candidates.push(canonical_name(inferred, &swapped)); + } + } + } + + // For hosting providers, try to infer the real provider from model name patterns + if is_hosting_provider(provider) { + if let Some(inferred_provider) = infer_provider_from_model(&model_stripped) { + candidates.push(canonical_name(inferred_provider, &model_stripped)); + } + + // Also try without any provider context + if let Some(inferred) = infer_provider_from_model(model) { + candidates.push(canonical_name(inferred, model)); + } + } + + // For provider-prefixed models like "databricks-meta-llama-3-1-70b" + // Extract the real provider and model + if let Some((extracted_provider, extracted_model)) = extract_provider_prefix(&model_stripped) { + candidates.push(canonical_name(extracted_provider, extracted_model)); + } + + candidates +} + +/// Swap word order for Claude models to handle both naming conventions +/// Claude 3: claude-3.5-sonnet ↔ claude-sonnet-3.5 +/// Claude 4: claude-4-opus ↔ claude-opus-4 +fn swap_claude_word_order(model: &str) -> Option { + if !model.starts_with("claude-") { + return None; + } + + // Pattern: claude-{version}-{size} → claude-{size}-{version} + // Examples: claude-3-5-sonnet → claude-sonnet-3-5, claude-4-opus → claude-opus-4 + // Handle both dots and dashes in version numbers: 3.5 or 3-5 + let size_patterns = ["sonnet", "opus", "haiku"]; + + for size in &size_patterns { + // Match: claude-{digits/dots/dashes}-{size} + // Accepts: claude-3.5-sonnet, claude-3-5-sonnet + let pattern = format!("claude-([0-9.-]+)-{}", size); + let re = regex::Regex::new(&pattern).unwrap(); + + if let Some(captures) = re.captures(model) { + let version = &captures[1]; + return Some(format!("claude-{}-{}", size, version)); + } + + // Also try reverse: claude-{size}-{digits/dots/dashes} + // Accepts: claude-sonnet-3.5, claude-haiku-3-5 + let reverse_pattern = format!("claude-{}-([0-9.-]+)", size); + let re_reverse = regex::Regex::new(&reverse_pattern).unwrap(); + + if let Some(captures) = re_reverse.captures(model) { + let version = &captures[1]; + return Some(format!("claude-{}-{}", version, size)); + } + } + + None +} + +/// Check if provider is a hosting provider that can serve models from other providers +fn is_hosting_provider(provider: &str) -> bool { + matches!(provider, "databricks" | "openrouter" | "azure" | "bedrock") +} + +/// Infer the real provider from model name patterns +fn infer_provider_from_model(model: &str) -> Option<&'static str> { + let model_lower = model.to_lowercase(); + + // Claude models → Anthropic + if model_lower.starts_with("claude-") || model_lower.contains("claude") { + return Some("anthropic"); + } + + // GPT, O1, O3, ChatGPT models → OpenAI + if model_lower.starts_with("gpt-") + || model_lower.starts_with("o1") + || model_lower.starts_with("o3") + || model_lower.starts_with("chatgpt-") { + return Some("openai"); + } + + // Gemini, Gemma models → Google + if model_lower.starts_with("gemini-") || model_lower.starts_with("gemma-") { + return Some("google"); + } + + // Llama models → meta-llama + if model_lower.contains("llama") { + return Some("meta-llama"); + } + + // Mistral models → mistralai + if model_lower.starts_with("mistral-") || model_lower.contains("mixtral") { + return Some("mistralai"); + } + + None +} + +/// Strip common prefixes from model names using pattern matching +/// Looks for known model family patterns and strips everything before them +fn strip_common_prefixes(model: &str) -> String { + // Known model family patterns (in order of specificity) + let model_patterns = [ + "meta-llama-", // Keep meta-llama prefix + "claude-", + "gpt-", + "gemini-", + "gemma-", + "o1-", + "o1", // Just "o1" without hyphen + "o3-", + "o3", + "o4-", + "mistral-", + "mixtral-", + "chatgpt-", + ]; + + // Find the first occurrence of any known model pattern + let mut earliest_pos = None; + + for pattern in &model_patterns { + if let Some(pos) = model.to_lowercase().find(pattern) { + if earliest_pos.is_none() || pos < earliest_pos.unwrap() { + earliest_pos = Some(pos); + } + } + } + + // If we found a pattern, strip everything before it + if let Some(pos) = earliest_pos { + // Extract from the position of the matched pattern + return model[pos..].to_string(); + } + + model.to_string() +} + +/// Try to extract provider prefix from model names like "databricks-meta-llama-3-1-70b" +/// Returns (provider, model) tuple if found +fn extract_provider_prefix(model: &str) -> Option<(&'static str, &str)> { + let known_providers = [ + "anthropic", + "openai", + "google", + "meta-llama", + "mistralai", + "cohere", + "ai21", + "amazon", + ]; + + for provider in &known_providers { + let prefix = format!("{}-", provider); + if model.starts_with(&prefix) { + if let Some(model_part) = model.strip_prefix(&prefix) { + return Some((provider, model_part)); + } + } + } + + None +} + /// Strip version suffixes from model names and normalize version numbers pub fn strip_version_suffix(model: &str) -> String { // First, normalize version numbers: convert -X-Y- to -X.Y- (e.g., -3-5- to -3.5-) @@ -19,13 +214,15 @@ pub fn strip_version_suffix(model: &str) -> String { // Strip datetime, version, and preview/exp suffixes let patterns = [ + regex::Regex::new(r"-latest$").unwrap(), // -latest regex::Regex::new(r"-preview(-\d+)*$").unwrap(), // -preview, -preview-09, -preview-05-20 regex::Regex::new(r"-exp(-\d+)*$").unwrap(), // -exp, -exp-1219, -exp-01-21 regex::Regex::new(r":exacto$").unwrap(), // :exacto (OpenRouter provider suffix) regex::Regex::new(r"-\d{8}$").unwrap(), // -20241022 regex::Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), // -2024-04-09 - regex::Regex::new(r"-v\d+(\.\d+)*$").unwrap(), // -v1.5 (semantic versions with "v" prefix) - regex::Regex::new(r"-\d{3,}$").unwrap(), // -002, -001 (patch versions: 3+ digits only) + regex::Regex::new(r"-v\d+(\.\d+)*$").unwrap(), // -v1.5 (semantic versions with "v" prefix) + regex::Regex::new(r"-\d{3,}$").unwrap(), // -002, -001 (patch versions: 3+ digits only) + regex::Regex::new(r"-bedrock$").unwrap(), // -bedrock (platform suffixes) ]; // Apply patterns multiple times to handle cases like "-preview-09-2025" @@ -37,6 +234,7 @@ pub fn strip_version_suffix(model: &str) -> String { } changed = result != before; } + result } @@ -169,5 +367,205 @@ mod tests { assert_eq!(strip_version_suffix("gpt-3.5-turbo"), "gpt-3.5-turbo"); assert_eq!(strip_version_suffix("model-002"), "model"); assert_eq!(strip_version_suffix("model-123"), "model"); + + // strip -latest suffix + assert_eq!( + strip_version_suffix("claude-3.5-sonnet-latest"), + "claude-3.5-sonnet" + ); + assert_eq!(strip_version_suffix("gpt-4o-latest"), "gpt-4o"); + assert_eq!( + strip_version_suffix("chatgpt-4o-latest"), + "chatgpt-4o" + ); + } + + #[test] + fn test_fuzzy_canonical_name() { + // Test hosting provider with direct model names (Databricks pattern) + let candidates = fuzzy_canonical_name("databricks", "claude-3-5-sonnet"); + assert!(candidates.contains(&"anthropic/claude-3.5-sonnet".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "gpt-4o"); + assert!(candidates.contains(&"openai/gpt-4o".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "gemini-2-5-flash"); + assert!(candidates.contains(&"google/gemini-2.5-flash".to_string())); + + // Test word-order swapping (Claude 3 series: version-size ↔ size-version) + let candidates = fuzzy_canonical_name("databricks", "claude-haiku-3-5"); + assert!(candidates.contains(&"anthropic/claude-3.5-haiku".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "claude-sonnet-3-7"); + assert!(candidates.contains(&"anthropic/claude-3.7-sonnet".to_string())); + + // Test word-order swapping (Claude 4 series: version-size ↔ size-version) + let candidates = fuzzy_canonical_name("databricks", "claude-4-opus"); + assert!(candidates.contains(&"anthropic/claude-opus-4".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "claude-4-sonnet"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4".to_string())); + + // Test prefixed models with word-order swapping + let candidates = fuzzy_canonical_name("databricks", "goose-claude-4-opus"); + assert!(candidates.contains(&"anthropic/claude-opus-4".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "kgoose-claude-4-sonnet"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "headless-goose-claude-4-sonnet"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "kgoose-cashapp-claude-4-sonnet"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4".to_string())); + + // Test ng-tools prefix with word swapping + let candidates = fuzzy_canonical_name("databricks", "ng-tools-claude-haiku-3-5"); + assert!(candidates.contains(&"anthropic/claude-3.5-haiku".to_string())); + + // Test raml prefix + let candidates = fuzzy_canonical_name("databricks", "raml-claude-opus-4-5"); + assert!(candidates.contains(&"anthropic/claude-opus-4.5".to_string())); + + // Test databricks prefix + let candidates = fuzzy_canonical_name("databricks", "databricks-claude-sonnet-4-5"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4.5".to_string())); + + // Test multiple prefixes (should strip all) + let candidates = fuzzy_canonical_name("databricks", "kgoose-gpt-4o"); + assert!(candidates.contains(&"openai/gpt-4o".to_string())); + + // Test platform suffixes + let candidates = fuzzy_canonical_name("databricks", "claude-4-sonnet-bedrock"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "goose-claude-4-sonnet-bedrock"); + assert!(candidates.contains(&"anthropic/claude-sonnet-4".to_string())); + + // Test provider-prefixed models with dates + let candidates = fuzzy_canonical_name("databricks", "claude-3-5-sonnet-20241022"); + assert!(candidates.contains(&"anthropic/claude-3.5-sonnet".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "gpt-4o-2024-11-20"); + assert!(candidates.contains(&"openai/gpt-4o".to_string())); + + // Test -latest suffix + let candidates = fuzzy_canonical_name("databricks", "claude-3-5-sonnet-latest"); + assert!(candidates.contains(&"anthropic/claude-3.5-sonnet".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "gpt-4o-latest"); + assert!(candidates.contains(&"openai/gpt-4o".to_string())); + + // Test direct provider (non-hosting) + let candidates = fuzzy_canonical_name("anthropic", "claude-3-5-sonnet-20241022"); + assert!(candidates.contains(&"anthropic/claude-3.5-sonnet".to_string())); + + let candidates = fuzzy_canonical_name("openai", "gpt-4o-latest"); + assert!(candidates.contains(&"openai/gpt-4o".to_string())); + + // Test O-series models + let candidates = fuzzy_canonical_name("databricks", "goose-o1"); + assert!(candidates.contains(&"openai/o1".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "kgoose-o3"); + assert!(candidates.contains(&"openai/o3".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "headless-goose-o3-mini"); + assert!(candidates.contains(&"openai/o3-mini".to_string())); + } + + #[test] + fn test_infer_provider_from_model() { + assert_eq!(infer_provider_from_model("claude-3-5-sonnet"), Some("anthropic")); + assert_eq!(infer_provider_from_model("claude-4-opus"), Some("anthropic")); + assert_eq!(infer_provider_from_model("gpt-4o"), Some("openai")); + assert_eq!(infer_provider_from_model("gpt-4-turbo"), Some("openai")); + assert_eq!(infer_provider_from_model("o1"), Some("openai")); + assert_eq!(infer_provider_from_model("o3-mini"), Some("openai")); + assert_eq!(infer_provider_from_model("chatgpt-4o-latest"), Some("openai")); + assert_eq!(infer_provider_from_model("gemini-2-5-flash"), Some("google")); + assert_eq!(infer_provider_from_model("gemini-2-5-pro"), Some("google")); + assert_eq!(infer_provider_from_model("gemma-2-27b-it"), Some("google")); + assert_eq!(infer_provider_from_model("llama-3-1-70b"), Some("meta-llama")); + assert_eq!(infer_provider_from_model("mistral-large"), Some("mistralai")); + assert_eq!(infer_provider_from_model("mixtral-8x7b"), Some("mistralai")); + assert_eq!(infer_provider_from_model("unknown-model"), None); + } + + #[test] + fn test_strip_common_prefixes() { + assert_eq!(strip_common_prefixes("goose-claude-4-opus"), "claude-4-opus"); + assert_eq!(strip_common_prefixes("databricks-gpt-5"), "gpt-5"); + assert_eq!(strip_common_prefixes("kgoose-gemini-pro"), "gemini-pro"); + assert_eq!(strip_common_prefixes("kgoose-gpt-4o"), "gpt-4o"); + assert_eq!(strip_common_prefixes("azure-gpt-4o"), "gpt-4o"); + assert_eq!(strip_common_prefixes("bedrock-claude-3-5-sonnet"), "claude-3-5-sonnet"); + assert_eq!(strip_common_prefixes("ng-tools-claude-opus-4"), "claude-opus-4"); + assert_eq!(strip_common_prefixes("raml-claude-sonnet-4-5"), "claude-sonnet-4-5"); // version normalization happens later + assert_eq!(strip_common_prefixes("headless-goose-o3-mini"), "o3-mini"); + assert_eq!(strip_common_prefixes("kgoose-cashapp-claude-4-sonnet"), "claude-4-sonnet"); + assert_eq!(strip_common_prefixes("claude-3-5-sonnet"), "claude-3-5-sonnet"); // no prefix + } + + #[test] + fn test_extract_provider_prefix() { + assert_eq!(extract_provider_prefix("anthropic-claude-3-5-sonnet"), Some(("anthropic", "claude-3-5-sonnet"))); + assert_eq!(extract_provider_prefix("openai-gpt-4o"), Some(("openai", "gpt-4o"))); + assert_eq!(extract_provider_prefix("google-gemini-2-5-flash"), Some(("google", "gemini-2-5-flash"))); + assert_eq!(extract_provider_prefix("meta-llama-3-1-70b"), Some(("meta-llama", "3-1-70b"))); + assert_eq!(extract_provider_prefix("mistralai-mistral-large"), Some(("mistralai", "mistral-large"))); + assert_eq!(extract_provider_prefix("claude-3-5-sonnet"), None); // no provider prefix + assert_eq!(extract_provider_prefix("unknown-provider-model"), None); // unknown provider + } + + #[test] + fn test_is_hosting_provider() { + assert!(is_hosting_provider("databricks")); + assert!(is_hosting_provider("openrouter")); + assert!(is_hosting_provider("azure")); + assert!(is_hosting_provider("bedrock")); + assert!(!is_hosting_provider("anthropic")); + assert!(!is_hosting_provider("openai")); + assert!(!is_hosting_provider("google")); + } + + #[test] + fn test_swap_claude_word_order() { + // Claude 3 series: version-size to size-version (with dots) + assert_eq!(swap_claude_word_order("claude-3.5-sonnet"), Some("claude-sonnet-3.5".to_string())); + assert_eq!(swap_claude_word_order("claude-3.5-haiku"), Some("claude-haiku-3.5".to_string())); + assert_eq!(swap_claude_word_order("claude-3.7-sonnet"), Some("claude-sonnet-3.7".to_string())); + + // Claude 3 series with dashes in version (before normalization) + assert_eq!(swap_claude_word_order("claude-3-5-sonnet"), Some("claude-sonnet-3-5".to_string())); + assert_eq!(swap_claude_word_order("claude-3-7-sonnet"), Some("claude-sonnet-3-7".to_string())); + + // Reverse: size-version to version-size (with dashes) + assert_eq!(swap_claude_word_order("claude-haiku-3-5"), Some("claude-3-5-haiku".to_string())); + assert_eq!(swap_claude_word_order("claude-sonnet-3-7"), Some("claude-3-7-sonnet".to_string())); + + // Claude 4 series: size-version to version-size + assert_eq!(swap_claude_word_order("claude-opus-4"), Some("claude-4-opus".to_string())); + assert_eq!(swap_claude_word_order("claude-sonnet-4"), Some("claude-4-sonnet".to_string())); + assert_eq!(swap_claude_word_order("claude-haiku-4.5"), Some("claude-4.5-haiku".to_string())); + assert_eq!(swap_claude_word_order("claude-sonnet-4.5"), Some("claude-4.5-sonnet".to_string())); + + // Claude 4 series reverse: version-size to size-version + assert_eq!(swap_claude_word_order("claude-4-opus"), Some("claude-opus-4".to_string())); + assert_eq!(swap_claude_word_order("claude-4-sonnet"), Some("claude-sonnet-4".to_string())); + + // Non-claude models should return None + assert_eq!(swap_claude_word_order("gpt-4o"), None); + assert_eq!(swap_claude_word_order("gemini-2.5-flash"), None); + } + + #[test] + fn test_strip_version_suffix_special_cases() { + // Test -bedrock suffix + assert_eq!(strip_version_suffix("claude-4-sonnet-bedrock"), "claude-4-sonnet"); + + // Ensure we don't strip the main version number + assert_eq!(strip_version_suffix("claude-4"), "claude-4"); + assert_eq!(strip_version_suffix("gpt-4"), "gpt-4"); } } diff --git a/crates/goose/tests/analyze_missing_models.rs b/crates/goose/tests/analyze_missing_models.rs new file mode 100644 index 000000000000..282ad993707c --- /dev/null +++ b/crates/goose/tests/analyze_missing_models.rs @@ -0,0 +1,158 @@ +/// Analyze which models are NOT matching to find patterns +/// Run with: cargo test --test analyze_missing_models -- --nocapture --ignored + +use goose::providers::canonical::{fuzzy_canonical_name, CanonicalModelRegistry}; +use goose::providers::create_with_named_model; + +#[tokio::test] +#[ignore] +async fn analyze_missing_models() { + println!("\n🔍 Analyzing Missing Databricks Models\n"); + + // Load canonical registry + let registry = match CanonicalModelRegistry::bundled() { + Ok(reg) => reg, + Err(e) => { + println!("❌ Failed to load canonical registry: {}", e); + return; + } + }; + + // Create Databricks provider + let provider = match create_with_named_model("databricks", "databricks-meta-llama-3-1-70b-instruct").await { + Ok(p) => p, + Err(e) => { + println!("⚠️ Databricks not configured: {}", e); + return; + } + }; + + // Fetch models + let models = match provider.fetch_supported_models().await { + Ok(Some(models)) => models, + Ok(None) => { + println!("⚠️ Databricks does not support model listing"); + return; + } + Err(e) => { + println!("❌ Failed to fetch models: {}", e); + return; + } + }; + + let mut matched = Vec::new(); + let mut unmatched = Vec::new(); + + for model in &models { + let candidates = fuzzy_canonical_name("databricks", model); + let is_match = candidates.iter().any(|canonical_id| { + registry.all_models() + .into_iter() + .any(|m| m.id == *canonical_id) + }); + + if is_match { + matched.push((model.clone(), candidates)); + } else { + unmatched.push((model.clone(), candidates)); + } + } + + println!("✅ Matched: {} / {} ({:.1}%)", matched.len(), models.len(), + (matched.len() as f64 / models.len() as f64) * 100.0); + println!("❌ Unmatched: {} / {} ({:.1}%)\n", unmatched.len(), models.len(), + (unmatched.len() as f64 / models.len() as f64) * 100.0); + + // Categorize unmatched models + let mut claude_unmatched = Vec::new(); + let mut gpt_unmatched = Vec::new(); + let mut gemini_unmatched = Vec::new(); + let mut o_series_unmatched = Vec::new(); + let mut custom_unmatched = Vec::new(); + let mut embedding_unmatched = Vec::new(); + + for (model, candidates) in &unmatched { + let lower = model.to_lowercase(); + + if lower.contains("embedding") || lower.contains("embed") { + embedding_unmatched.push((model, candidates)); + } else if lower.contains("claude") { + claude_unmatched.push((model, candidates)); + } else if lower.contains("gpt") { + gpt_unmatched.push((model, candidates)); + } else if lower.contains("gemini") || lower.contains("gemma") { + gemini_unmatched.push((model, candidates)); + } else if lower.starts_with("o1") || lower.starts_with("o3") || lower.starts_with("o4") { + o_series_unmatched.push((model, candidates)); + } else { + custom_unmatched.push((model, candidates)); + } + } + + // Show Claude unmatched + if !claude_unmatched.is_empty() { + println!("🤖 Claude Models NOT Matching ({}):", claude_unmatched.len()); + for (model, candidates) in &claude_unmatched { + println!(" ❌ {}", model); + println!(" Tried: {:?}", candidates); + } + println!(); + } + + // Show GPT unmatched + if !gpt_unmatched.is_empty() { + println!("🤖 GPT Models NOT Matching ({}):", gpt_unmatched.len()); + for (model, candidates) in &gpt_unmatched { + println!(" ❌ {}", model); + println!(" Tried: {:?}", candidates); + } + println!(); + } + + // Show Gemini unmatched + if !gemini_unmatched.is_empty() { + println!("🤖 Gemini Models NOT Matching ({}):", gemini_unmatched.len()); + for (model, candidates) in &gemini_unmatched { + println!(" ❌ {}", model); + println!(" Tried: {:?}", candidates); + } + println!(); + } + + // Show O-series unmatched + if !o_series_unmatched.is_empty() { + println!("🤖 O-Series Models NOT Matching ({}):", o_series_unmatched.len()); + for (model, candidates) in &o_series_unmatched { + println!(" ❌ {}", model); + println!(" Tried: {:?}", candidates); + } + println!(); + } + + // Show embedding models + if !embedding_unmatched.is_empty() { + println!("📊 Embedding Models NOT Matching ({}):", embedding_unmatched.len()); + for (model, _) in &embedding_unmatched { + println!(" ❌ {}", model); + } + println!(" 💡 Note: Embedding models aren't in the canonical registry (chat models only)\n"); + } + + // Show custom/internal + if !custom_unmatched.is_empty() { + println!("🏢 Custom/Internal Models NOT Matching ({}):", custom_unmatched.len()); + for (model, _) in &custom_unmatched { + println!(" ❌ {}", model); + } + println!(" 💡 Note: These are internal Databricks models, not in canonical registry\n"); + } + + // Pattern analysis + println!("📊 Pattern Analysis:"); + println!(" Claude unmatched: {}", claude_unmatched.len()); + println!(" GPT unmatched: {}", gpt_unmatched.len()); + println!(" Gemini unmatched: {}", gemini_unmatched.len()); + println!(" O-series unmatched: {}", o_series_unmatched.len()); + println!(" Embedding models: {}", embedding_unmatched.len()); + println!(" Custom/Internal: {}", custom_unmatched.len()); +} diff --git a/crates/goose/tests/debug_databricks_models.rs b/crates/goose/tests/debug_databricks_models.rs new file mode 100644 index 000000000000..3b3e6c8776f1 --- /dev/null +++ b/crates/goose/tests/debug_databricks_models.rs @@ -0,0 +1,88 @@ +/// Debug script to see all Databricks models +/// Run with: cargo test --test debug_databricks_models -- --nocapture --ignored + +use goose::providers::create_with_named_model; + +#[tokio::test] +#[ignore] +async fn debug_databricks_models() { + println!("\n🔍 Fetching All Databricks Models\n"); + + // Create Databricks provider + let provider = match create_with_named_model("databricks", "databricks-meta-llama-3-1-70b-instruct").await { + Ok(p) => p, + Err(e) => { + println!("⚠️ Databricks not configured: {}", e); + return; + } + }; + + // Fetch models + let models = match provider.fetch_supported_models().await { + Ok(Some(models)) => { + println!("✅ Fetched {} models from Databricks\n", models.len()); + models + } + Ok(None) => { + println!("⚠️ Databricks does not support model listing"); + return; + } + Err(e) => { + println!("❌ Failed to fetch models: {}", e); + return; + } + }; + + println!("📋 All Databricks Models:\n"); + for (idx, model) in models.iter().enumerate() { + println!(" {:3}. {}", idx + 1, model); + } + + // Categorize models + let mut claude_models = Vec::new(); + let mut gpt_models = Vec::new(); + let mut gemini_models = Vec::new(); + let mut llama_models = Vec::new(); + let mut custom_models = Vec::new(); + + for model in &models { + let lower = model.to_lowercase(); + if lower.contains("claude") { + claude_models.push(model); + } else if lower.contains("gpt") || lower.starts_with("o1") || lower.starts_with("o3") { + gpt_models.push(model); + } else if lower.contains("gemini") || lower.contains("gemma") { + gemini_models.push(model); + } else if lower.contains("llama") { + llama_models.push(model); + } else { + custom_models.push(model); + } + } + + println!("\n📊 Categorization:\n"); + println!(" Claude models (Anthropic): {}", claude_models.len()); + for model in &claude_models { + println!(" - {}", model); + } + + println!("\n GPT models (OpenAI): {}", gpt_models.len()); + for model in &gpt_models { + println!(" - {}", model); + } + + println!("\n Gemini models (Google): {}", gemini_models.len()); + for model in &gemini_models { + println!(" - {}", model); + } + + println!("\n Llama models: {}", llama_models.len()); + for model in &llama_models { + println!(" - {}", model); + } + + println!("\n Custom/Internal models: {}", custom_models.len()); + for model in &custom_models { + println!(" - {}", model); + } +} diff --git a/crates/goose/tests/debug_openrouter_models.rs b/crates/goose/tests/debug_openrouter_models.rs new file mode 100644 index 000000000000..05faac01d781 --- /dev/null +++ b/crates/goose/tests/debug_openrouter_models.rs @@ -0,0 +1,108 @@ +/// Debug script to see what OpenRouter models look like and why they don't match +/// Run with: cargo test --test debug_openrouter_models -- --nocapture --ignored + +use goose::providers::canonical::{canonical_name, CanonicalModelRegistry}; +use goose::providers::create_with_named_model; + +#[tokio::test] +#[ignore] +async fn debug_openrouter_models() { + println!("\n🔍 Debugging OpenRouter Model Matching\n"); + + // Load canonical registry + let registry = match CanonicalModelRegistry::bundled() { + Ok(reg) => reg, + Err(e) => { + println!("❌ Failed to load canonical registry: {}", e); + return; + } + }; + + // Get all canonical model IDs for quick lookup + let canonical_ids: std::collections::HashSet = registry + .all_models() + .into_iter() + .map(|m| m.id.clone()) + .collect(); + + println!("📦 Canonical registry has {} models\n", canonical_ids.len()); + + // Create OpenRouter provider + let provider = match create_with_named_model("openrouter", "anthropic/claude-3.5-sonnet").await { + Ok(p) => p, + Err(e) => { + println!("⚠️ Skipping - OpenRouter not configured: {}", e); + return; + } + }; + + // Fetch models from OpenRouter + let models = match provider.fetch_supported_models().await { + Ok(Some(models)) => { + println!("✅ OpenRouter API returned {} models\n", models.len()); + models + } + Ok(None) => { + println!("⚠️ OpenRouter does not support model listing"); + return; + } + Err(e) => { + println!("❌ Failed to fetch models: {}", e); + return; + } + }; + + println!("🔍 Analyzing first 20 models:\n"); + println!("{:<50} {:<50} {:<10}", "OpenRouter Model", "Canonical Name", "Match?"); + println!("{}", "=".repeat(115)); + + let mut matched = 0; + let mut unmatched = 0; + let mut unmatched_examples = Vec::new(); + + for (idx, model) in models.iter().enumerate() { + let canonical_id = canonical_name("openrouter", model); + let is_match = canonical_ids.contains(&canonical_id); + + if idx < 20 { + let model_display = if model.len() > 47 { + format!("{}...", &model[..44]) + } else { + model.clone() + }; + let canonical_display = if canonical_id.len() > 47 { + format!("{}...", &canonical_id[..44]) + } else { + canonical_id.clone() + }; + let match_display = if is_match { "✅" } else { "❌" }; + + println!("{:<50} {:<50} {:<10}", model_display, canonical_display, match_display); + } + + if is_match { + matched += 1; + } else { + unmatched += 1; + if unmatched_examples.len() < 10 { + unmatched_examples.push((model.clone(), canonical_id)); + } + } + } + + println!("\n{}", "=".repeat(115)); + println!("\n📊 Summary:"); + println!(" Matched: {} ({:.1}%)", matched, (matched as f64 / models.len() as f64) * 100.0); + println!(" Unmatched: {} ({:.1}%)", unmatched, (unmatched as f64 / models.len() as f64) * 100.0); + + println!("\n❌ Sample Unmatched Models:"); + for (or_model, canonical_id) in unmatched_examples { + println!(" {} → {}", or_model, canonical_id); + } + + println!("\n💡 Analysis:"); + println!(" OpenRouter returns models in format: provider/model-name"); + println!(" Canonical registry includes: anthropic, google, openai models"); + println!(" Likely issue: OpenRouter has many providers not in canonical registry"); + println!(" (ai21, alibaba, allenai, amazon, etc.)"); +} diff --git a/crates/goose/tests/test_canonical_vs_pricing.rs b/crates/goose/tests/test_canonical_vs_pricing.rs new file mode 100644 index 000000000000..cd0f965aa78a --- /dev/null +++ b/crates/goose/tests/test_canonical_vs_pricing.rs @@ -0,0 +1,122 @@ +/// Test to compare canonical model lookups vs pricing.rs lookups +/// Run with: cargo test --test test_canonical_vs_pricing -- --nocapture + +use goose::providers::canonical::{canonical_name, CanonicalModelRegistry}; +use goose::providers::pricing::{get_model_pricing, initialize_pricing_cache}; + +#[tokio::test] +async fn test_canonical_vs_pricing_coverage() { + // Initialize pricing cache + if let Err(e) = initialize_pricing_cache().await { + println!("⚠️ Failed to initialize pricing cache: {}", e); + println!(" This test requires network access"); + return; + } + + // Load canonical models + let registry = match CanonicalModelRegistry::bundled() { + Ok(reg) => reg, + Err(e) => { + println!("❌ Failed to load canonical registry: {}", e); + return; + } + }; + + // Test cases with various model name formats + let test_cases = vec![ + // Anthropic - various formats + ("anthropic", "claude-3.5-sonnet"), // Dot format (canonical) + ("anthropic", "claude-3-5-sonnet"), // Dash format (provider API) + ("anthropic", "claude-3.5-sonnet-20241022"), // With date + ("anthropic", "claude-3-5-sonnet-latest"), // With -latest + ("anthropic", "claude-3.5-haiku"), + ("anthropic", "claude-3.5-haiku-20241022"), + ("anthropic", "claude-3-opus"), + ("anthropic", "claude-3-opus-20240229"), + ("anthropic", "claude-sonnet-4"), + ("anthropic", "claude-sonnet-4.5"), + ("anthropic", "claude-opus-4"), + ("anthropic", "claude-haiku-4.5"), + + // Google - various formats + ("google", "gemini-2.5-flash"), + ("google", "gemini-2.5-flash-preview"), + ("google", "gemini-2.5-flash-preview-09-2025"), + ("google", "gemini-2.5-pro"), + ("google", "gemini-2.5-pro-exp"), + ("google", "gemini-2.0-flash"), + ("google", "gemini-2.0-flash-001"), + ("google", "gemini-2.0-flash-exp"), + ("google", "gemini-2.0-flash-lite-001"), + ("google", "gemma-2-27b-it"), + ("google", "gemma-2-9b-it"), + + // OpenAI - various formats + ("openai", "gpt-4o"), + ("openai", "gpt-4o-2024-11-20"), + ("openai", "gpt-4o-2024-08-06"), + ("openai", "gpt-4o-latest"), + ("openai", "gpt-4o-mini"), + ("openai", "gpt-4o-mini-2024-07-18"), + ("openai", "gpt-4-turbo"), + ("openai", "gpt-4-turbo-2024-04-09"), + ("openai", "gpt-4-turbo-preview"), + ("openai", "gpt-4"), + ("openai", "gpt-4-1106-preview"), + ("openai", "gpt-3.5-turbo"), + ("openai", "gpt-3.5-turbo-0613"), + ("openai", "gpt-3.5-turbo-16k"), + ("openai", "chatgpt-4o-latest"), + ("openai", "o1"), + ("openai", "o1-preview"), + ("openai", "o1-mini"), + ("openai", "o3-mini"), + ]; + + println!("\n📊 Canonical Models vs Pricing Cache Coverage\n"); + println!("{:<15} {:<40} {:<12} {:<12}", "Provider", "Model", "Canonical", "Pricing"); + println!("{}", "=".repeat(85)); + + let mut canonical_only = 0; + let mut pricing_only = 0; + let mut both = 0; + let mut neither = 0; + + for (provider, model) in &test_cases { + // Try canonical lookup + let canonical_id = canonical_name(provider, model); + let in_canonical = registry.all_models() + .into_iter() + .any(|m| m.id == canonical_id); + + // Try pricing lookup + let in_pricing = get_model_pricing(provider, model).await.is_some(); + + let canonical_status = if in_canonical { "✅" } else { "❌" }; + let pricing_status = if in_pricing { "✅" } else { "❌" }; + + println!( + "{:<15} {:<40} {:<12} {:<12}", + provider, model, canonical_status, pricing_status + ); + + match (in_canonical, in_pricing) { + (true, true) => both += 1, + (true, false) => canonical_only += 1, + (false, true) => pricing_only += 1, + (false, false) => neither += 1, + } + } + + let total = test_cases.len(); + println!("\n{}", "=".repeat(85)); + println!("📈 Coverage Analysis:"); + println!(" Both systems: {} / {} ({:.1}%)", both, total, (both as f64 / total as f64) * 100.0); + println!(" Canonical only: {} / {} ({:.1}%)", canonical_only, total, (canonical_only as f64 / total as f64) * 100.0); + println!(" Pricing only: {} / {} ({:.1}%)", pricing_only, total, (pricing_only as f64 / total as f64) * 100.0); + println!(" Neither: {} / {} ({:.1}%)", neither, total, (neither as f64 / total as f64) * 100.0); + + println!("\n💡 Key Insight:"); + println!(" Canonical models use smart normalization → Better coverage for variant names"); + println!(" Pricing cache uses raw OpenRouter names → Only exact matches work"); +} diff --git a/crates/goose/tests/test_pricing_hit_rate.rs b/crates/goose/tests/test_pricing_hit_rate.rs new file mode 100644 index 000000000000..15c914829c90 --- /dev/null +++ b/crates/goose/tests/test_pricing_hit_rate.rs @@ -0,0 +1,102 @@ +/// Test to check pricing lookup hit rate for common models +/// Run with: cargo test --test test_pricing_hit_rate -- --nocapture + +use goose::providers::pricing::{get_model_pricing, initialize_pricing_cache}; + +#[tokio::test] +async fn test_pricing_hit_rate() { + // Initialize cache + if let Err(e) = initialize_pricing_cache().await { + println!("⚠️ Failed to initialize pricing cache: {}", e); + println!(" This test requires network access to fetch pricing data"); + return; + } + + // Common model names that users might request + let test_cases = vec![ + // Anthropic models + ("anthropic", "claude-3.5-sonnet"), + ("anthropic", "claude-3-5-sonnet"), + ("anthropic", "claude-3.5-sonnet-20241022"), + ("anthropic", "claude-sonnet-4"), + ("anthropic", "claude-sonnet-4.5"), + ("anthropic", "claude-opus-4"), + ("anthropic", "claude-haiku-4.5"), + + // OpenAI models + ("openai", "gpt-4o"), + ("openai", "gpt-4o-2024-11-20"), + ("openai", "gpt-4o-mini"), + ("openai", "gpt-4-turbo"), + ("openai", "gpt-4"), + ("openai", "gpt-3.5-turbo"), + ("openai", "o1"), + ("openai", "o1-pro"), + ("openai", "o3-mini"), + + // Google models + ("google", "gemini-2.5-flash"), + ("google", "gemini-2.5-flash-preview"), + ("google", "gemini-2.5-pro"), + ("google", "gemini-2.0-flash"), + ]; + + let mut hits = 0; + let mut misses = 0; + let mut miss_list = Vec::new(); + + println!("\n📊 Testing Pricing Lookup Hit Rate\n"); + println!("{:<20} {:<40} {}", "Provider", "Model", "Result"); + println!("{}", "=".repeat(70)); + + for (provider, model) in test_cases { + match get_model_pricing(provider, model).await { + Some(pricing) => { + hits += 1; + println!( + "{:<20} {:<40} ✅ ${:.6} / ${:.6}", + provider, model, pricing.input_cost, pricing.output_cost + ); + } + None => { + misses += 1; + miss_list.push((provider, model)); + println!("{:<20} {:<40} ❌ NOT FOUND", provider, model); + } + } + } + + let total = hits + misses; + let hit_rate = (hits as f64 / total as f64) * 100.0; + + println!("\n{}", "=".repeat(70)); + println!("📈 Results:"); + println!(" Hits: {} / {} ({:.1}%)", hits, total, hit_rate); + println!(" Misses: {} / {} ({:.1}%)", misses, total, 100.0 - hit_rate); + + if !miss_list.is_empty() { + println!("\n❌ Missed lookups:"); + for (provider, model) in miss_list { + println!(" - {}/{}", provider, model); + } + } + + println!("\n💡 Note: Misses could be due to:"); + println!(" 1. Model name normalization issues"); + println!(" 2. Model not in OpenRouter catalog"); + println!(" 3. Outdated cache"); + + // Show what models are actually available in cache for Anthropic + use goose::providers::pricing::get_all_pricing; + let all_pricing = get_all_pricing().await; + + if let Some(anthropic_models) = all_pricing.get("anthropic") { + println!("\n📦 Sample models in cache (Anthropic):"); + let mut models: Vec<_> = anthropic_models.keys().collect(); + models.sort(); + for model in models.iter().take(10) { + println!(" - {}", model); + } + println!(" ... ({} total anthropic models)", anthropic_models.len()); + } +} diff --git a/crates/goose/tests/test_pricing_with_real_providers.rs b/crates/goose/tests/test_pricing_with_real_providers.rs new file mode 100644 index 000000000000..d2782ce169df --- /dev/null +++ b/crates/goose/tests/test_pricing_with_real_providers.rs @@ -0,0 +1,171 @@ +/// Test pricing and canonical model coverage against REAL provider model lists +/// This connects to actual providers using your configured API keys +/// Run with: cargo test --test test_pricing_with_real_providers -- --nocapture --ignored +/// +/// Mark as #[ignore] so it only runs when explicitly requested (requires API keys) + +use goose::providers::canonical::{fuzzy_canonical_name, CanonicalModelRegistry}; +use goose::providers::pricing::{get_model_pricing, initialize_pricing_cache}; +use goose::providers::create_with_named_model; + +#[tokio::test] +#[ignore] // Only run when explicitly requested with --ignored flag +async fn test_real_provider_pricing_coverage() { + println!("\n🔌 Testing Pricing Coverage with Real Provider APIs"); + println!(" (This test requires configured API keys)\n"); + + // Initialize pricing cache + if let Err(e) = initialize_pricing_cache().await { + println!("⚠️ Failed to initialize pricing cache: {}", e); + return; + } + + // Load canonical models + let registry = match CanonicalModelRegistry::bundled() { + Ok(reg) => reg, + Err(e) => { + println!("❌ Failed to load canonical registry: {}", e); + return; + } + }; + + // Providers to test with their default models for initialization + let providers_to_test = vec![ + ("anthropic", "claude-3-5-sonnet-20241022"), + ("openai", "gpt-4"), + ("google", "gemini-1.5-pro-002"), + ("openrouter", "anthropic/claude-3.5-sonnet"), + ("databricks", "databricks-meta-llama-3-1-70b-instruct"), + ]; + + let mut total_models = 0; + let mut canonical_hits = 0; + let mut pricing_hits = 0; + let mut both_hits = 0; + let mut neither_hits = 0; + + for (provider_name, default_model) in providers_to_test { + println!("\n{}", "=".repeat(80)); + println!("📡 Provider: {}", provider_name); + println!("{}", "=".repeat(80)); + + // Try to create provider with user's credentials + let provider = match create_with_named_model(provider_name, default_model).await { + Ok(p) => p, + Err(e) => { + println!(" ⚠️ Skipping {} - not configured: {}", provider_name, e); + println!(" Configure your API key to test this provider"); + continue; + } + }; + + // Fetch real model list from provider API + let models = match provider.fetch_supported_models().await { + Ok(Some(models)) => { + println!(" ✅ Fetched {} models from provider API", models.len()); + models + } + Ok(None) => { + println!(" ⚠️ Provider does not support model listing"); + continue; + } + Err(e) => { + println!(" ❌ Failed to fetch models: {}", e); + continue; + } + }; + + // Sample first 10 models for detailed output + let sample_size = 10.min(models.len()); + if sample_size > 0 { + println!("\n 📋 Testing coverage (showing first {} models):\n", sample_size); + println!(" {:<50} {:<12} {:<12}", "Model", "Canonical", "Pricing"); + println!(" {}", "-".repeat(78)); + } + + let mut provider_canonical = 0; + let mut provider_pricing = 0; + let mut provider_both = 0; + let mut provider_neither = 0; + + for (idx, model) in models.iter().enumerate() { + // Check canonical model mapping with fuzzy matching + let candidates = fuzzy_canonical_name(provider_name, model); + let in_canonical = candidates.iter().any(|canonical_id| { + registry.all_models() + .into_iter() + .any(|m| m.id == *canonical_id) + }); + + // Check pricing cache + let in_pricing = get_model_pricing(provider_name, model).await.is_some(); + + // Track stats + match (in_canonical, in_pricing) { + (true, true) => { + provider_both += 1; + both_hits += 1; + } + (true, false) => { + provider_canonical += 1; + canonical_hits += 1; + } + (false, true) => { + provider_pricing += 1; + pricing_hits += 1; + } + (false, false) => { + provider_neither += 1; + neither_hits += 1; + } + } + total_models += 1; + + // Show sample + if idx < sample_size { + let canonical_mark = if in_canonical { "✅" } else { "❌" }; + let pricing_mark = if in_pricing { "✅" } else { "❌" }; + let model_display = if model.len() > 47 { + format!("{}...", &model[..44]) + } else { + model.clone() + }; + println!(" {:<50} {:<12} {:<12}", + model_display, canonical_mark, pricing_mark); + } + } + + // Provider summary + let provider_total = models.len(); + println!("\n 📊 Provider Summary:"); + println!(" Total models: {}", provider_total); + println!(" Both systems: {} ({:.1}%)", + provider_both, (provider_both as f64 / provider_total as f64) * 100.0); + println!(" Canonical only: {} ({:.1}%)", + provider_canonical, (provider_canonical as f64 / provider_total as f64) * 100.0); + println!(" Pricing only: {} ({:.1}%)", + provider_pricing, (provider_pricing as f64 / provider_total as f64) * 100.0); + println!(" Neither: {} ({:.1}%)", + provider_neither, (provider_neither as f64 / provider_total as f64) * 100.0); + } + + // Overall summary + println!("\n{}", "=".repeat(80)); + println!("📈 OVERALL SUMMARY ACROSS ALL PROVIDERS"); + println!("{}", "=".repeat(80)); + println!("Total models tested: {}", total_models); + println!("Both systems: {} ({:.1}%)", + both_hits, (both_hits as f64 / total_models as f64) * 100.0); + println!("Canonical only: {} ({:.1}%)", + canonical_hits, (canonical_hits as f64 / total_models as f64) * 100.0); + println!("Pricing only: {} ({:.1}%)", + pricing_hits, (pricing_hits as f64 / total_models as f64) * 100.0); + println!("Neither: {} ({:.1}%)", + neither_hits, (neither_hits as f64 / total_models as f64) * 100.0); + + println!("\n💡 Interpretation:"); + println!(" • Both systems: Model pricing and metadata available"); + println!(" • Canonical only: Model metadata available, pricing may be missing"); + println!(" • Pricing only: Pricing available, but not in canonical registry"); + println!(" • Neither: Model not recognized by either system"); +} From 413f41f972d59d96ce7c7ccacba0d0468be7d048 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 12:49:46 -0500 Subject: [PATCH 25/52] add meta --- .../goose/examples/build_canonical_models.rs | 27 +- .../canonical/data/canonical_models.json | 371 ++++++++++++++---- crates/goose/src/providers/canonical/model.rs | 3 - 3 files changed, 317 insertions(+), 84 deletions(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 12215e595c29..40943e5505db 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -12,7 +12,20 @@ use serde_json::Value; use std::collections::HashMap; const OPENROUTER_API_URL: &str = "https://openrouter.ai/api/v1/models"; -const ALLOWED_PROVIDERS: &[&str] = &["anthropic", "google", "openai"]; +const ALLOWED_PROVIDERS: &[&str] = &[ + "anthropic", + "google", + "openai", + // Additional providers (uncomment one at a time to test): + "meta-llama", // Llama 3.1, 3.3, 4 series - very popular + // "mistralai", // Mistral Large, Mixtral - very popular + // "x-ai", // Grok models - high profile + // "deepseek", // DeepSeek v3, R1 - gaining popularity + // "cohere", // Command R, Command R+ models + // "ai21", // Jamba 1.5 models + // "qwen", // Qwen 2.5 series (Alibaba) + // "01-ai", // Yi models +]; #[tokio::main] async fn main() -> Result<()> { @@ -163,17 +176,6 @@ async fn main() -> Result<()> { }) .unwrap_or_else(|| vec!["text".to_string()]); - let tokenizer = if canonical_id.starts_with("anthropic/") { - "Claude" - } else if canonical_id.starts_with("openai/") { - "GPT" - } else if canonical_id.starts_with("google/") { - "Gemini" - } else { - "Unknown" - } - .to_string(); - let supports_tools = model .get("supported_parameters") .and_then(|v| v.as_array()) @@ -207,7 +209,6 @@ async fn main() -> Result<()> { max_completion_tokens, input_modalities, output_modalities, - tokenizer, supports_tools, pricing, }; diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 0661c82426c4..8582639d9aa5 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -11,7 +11,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 2.5e-7, @@ -32,7 +31,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 0.000015, @@ -53,7 +51,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 8e-7, @@ -75,7 +72,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 6e-6, @@ -97,7 +93,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 3e-6, @@ -119,7 +114,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 3e-6, @@ -140,7 +134,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 1e-6, @@ -162,7 +155,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 0.000015, @@ -184,7 +176,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 0.000015, @@ -206,7 +197,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 5e-6, @@ -228,7 +218,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 3e-6, @@ -250,7 +239,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Claude", "supports_tools": true, "pricing": { "prompt": 3e-6, @@ -274,7 +262,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 1e-7, @@ -298,7 +285,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 7.5e-8, @@ -322,7 +308,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 3e-7, @@ -344,7 +329,6 @@ "image", "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 3e-7, @@ -368,7 +352,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 1e-7, @@ -392,7 +375,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -416,7 +398,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 2e-6, @@ -438,7 +419,6 @@ "image", "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 2e-6, @@ -457,7 +437,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 6.5e-7, @@ -476,7 +455,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 3e-8, @@ -497,7 +475,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 3e-8, @@ -518,7 +495,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": true, "pricing": { "prompt": 4e-8, @@ -538,7 +514,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 1.703012e-8, @@ -557,7 +532,6 @@ "output_modalities": [ "text" ], - "tokenizer": "Gemini", "supports_tools": false, "pricing": { "prompt": 2e-8, @@ -566,6 +540,309 @@ "image": 0.0 } }, + { + "id": "meta-llama/llama-3-70b-instruct", + "name": "Meta: Llama 3 70B Instruct", + "context_length": 8192, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3-8b-instruct", + "name": "Meta: Llama 3 8B Instruct", + "context_length": 8192, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 6e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-405b", + "name": "Meta: Llama 3.1 405B (base)", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 4e-6, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-405b-instruct", + "name": "Meta: Llama 3.1 405B Instruct", + "context_length": 130815, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3.5e-6, + "completion": 3.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-70b-instruct", + "name": "Meta: Llama 3.1 70B Instruct", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Meta: Llama 3.1 8B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-8, + "completion": 3e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-11b-vision-instruct", + "name": "Meta: Llama 3.2 11B Vision Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 4.9e-8, + "completion": 4.9e-8, + "request": 0.0, + "image": 0.00007948 + } + }, + { + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Meta: Llama 3.2 1B Instruct", + "context_length": 60000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2.7e-8, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Meta: Llama 3.2 3B Instruct", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-8, + "completion": 2e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-3.2-90b-vision-instruct", + "name": "Meta: Llama 3.2 90B Vision Instruct", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 3.5e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0005058 + } + }, + { + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Meta: Llama 3.3 70B Instruct", + "context_length": 131072, + "max_completion_tokens": 120000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.08e-7, + "completion": 3.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-4-maverick", + "name": "Meta: Llama 4 Maverick", + "context_length": 1048576, + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0006684 + } + }, + { + "id": "meta-llama/llama-4-scout", + "name": "Meta: Llama 4 Scout", + "context_length": 327680, + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 8e-8, + "completion": 3e-7, + "request": 0.0, + "image": 0.0003342 + } + }, + { + "id": "meta-llama/llama-guard-2-8b", + "name": "Meta: LlamaGuard 2 8B", + "context_length": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-guard-3-8b", + "name": "Llama Guard 3 8B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 6e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "meta-llama/llama-guard-4-12b", + "name": "Meta: Llama Guard 4 12B", + "context_length": 163840, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 1.8e-7, + "completion": 1.8e-7, + "request": 0.0, + "image": 0.0 + } + }, { "id": "openai/chatgpt-4o", "name": "OpenAI: ChatGPT-4o", @@ -578,7 +855,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": false, "pricing": { "prompt": 5e-6, @@ -599,7 +875,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.5e-6, @@ -619,7 +894,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 5e-7, @@ -639,7 +913,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 3e-6, @@ -659,7 +932,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": false, "pricing": { "prompt": 1.5e-6, @@ -679,7 +951,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.00003, @@ -700,7 +971,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.00001, @@ -722,7 +992,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2e-6, @@ -744,7 +1013,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 4e-7, @@ -766,7 +1034,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1e-7, @@ -788,7 +1055,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2.5e-6, @@ -809,7 +1075,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2.5e-6, @@ -831,7 +1096,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.5e-7, @@ -851,7 +1115,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": false, "pricing": { "prompt": 1.5e-7, @@ -871,7 +1134,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": false, "pricing": { "prompt": 2.5e-6, @@ -893,7 +1155,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 6e-6, @@ -915,7 +1176,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -937,7 +1197,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": false, "pricing": { "prompt": 1.25e-6, @@ -958,7 +1217,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -981,7 +1239,6 @@ "image", "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.00001, @@ -1004,7 +1261,6 @@ "image", "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2.5e-6, @@ -1026,7 +1282,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2.5e-7, @@ -1048,7 +1303,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 5e-8, @@ -1070,7 +1324,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.000015, @@ -1092,7 +1345,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -1114,7 +1366,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -1135,7 +1386,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -1156,7 +1406,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.25e-6, @@ -1177,7 +1426,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2.5e-7, @@ -1196,7 +1444,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 3.9e-8, @@ -1215,7 +1462,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 3e-8, @@ -1235,7 +1481,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 7.5e-8, @@ -1257,7 +1502,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.000015, @@ -1279,7 +1523,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": false, "pricing": { "prompt": 0.00015, @@ -1301,7 +1544,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2e-6, @@ -1323,7 +1565,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.00001, @@ -1344,7 +1585,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.1e-6, @@ -1365,7 +1605,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.1e-6, @@ -1387,7 +1626,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 0.00002, @@ -1409,7 +1647,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.1e-6, @@ -1431,7 +1668,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 2e-6, @@ -1453,7 +1689,6 @@ "output_modalities": [ "text" ], - "tokenizer": "GPT", "supports_tools": true, "pricing": { "prompt": 1.1e-6, diff --git a/crates/goose/src/providers/canonical/model.rs b/crates/goose/src/providers/canonical/model.rs index 0ffecc985edf..77108b495105 100644 --- a/crates/goose/src/providers/canonical/model.rs +++ b/crates/goose/src/providers/canonical/model.rs @@ -44,9 +44,6 @@ pub struct CanonicalModel { #[serde(default)] pub output_modalities: Vec, - /// Tokenizer type (e.g., "GPT", "Claude", "Gemini") - pub tokenizer: String, - /// Whether the model supports tool calling #[serde(default)] pub supports_tools: bool, From cb4442eafb936a1e694eaf2e7795c583f6574de9 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 12:51:29 -0500 Subject: [PATCH 26/52] mistra look goods --- .../goose/examples/build_canonical_models.rs | 2 +- .../canonical/data/canonical_models.json | 392 ++++++++++++++++++ 2 files changed, 393 insertions(+), 1 deletion(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 40943e5505db..18e78da8151d 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -18,7 +18,7 @@ const ALLOWED_PROVIDERS: &[&str] = &[ "openai", // Additional providers (uncomment one at a time to test): "meta-llama", // Llama 3.1, 3.3, 4 series - very popular - // "mistralai", // Mistral Large, Mixtral - very popular + "mistralai", // Mistral Large, Mixtral - very popular // "x-ai", // Grok models - high profile // "deepseek", // DeepSeek v3, R1 - gaining popularity // "cohere", // Command R, Command R+ models diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 8582639d9aa5..a69f00e3bb9c 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -843,6 +843,398 @@ "image": 0.0 } }, + { + "id": "mistralai/codestral", + "name": "Mistral: Codestral 2508", + "context_length": 256000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/devstral-medium", + "name": "Mistral: Devstral Medium", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/devstral-small", + "name": "Mistral: Devstral Small 1.1", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 7e-8, + "completion": 2.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/ministral-14b", + "name": "Mistral: Ministral 3 14B 2512", + "context_length": 262144, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/ministral-3b", + "name": "Mistral: Ministral 3B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/ministral-8b", + "name": "Mistral: Ministral 8B", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-7b-instruct", + "name": "Mistral: Mistral 7B Instruct", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.8e-8, + "completion": 5.4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-large", + "name": "Mistral Large", + "context_length": 128000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-medium-3", + "name": "Mistral: Mistral Medium 3", + "context_length": 131072, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral: Mistral Medium 3.1", + "context_length": 131072, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-nemo", + "name": "Mistral: Mistral Nemo", + "context_length": 131072, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-8, + "completion": 4e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-saba", + "name": "Mistral: Saba", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-24b-instruct", + "name": "Mistral: Mistral Small 3", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral: Mistral Small 3.1 24B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral: Mistral Small 3.2 24B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 1.8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mistral-tiny", + "name": "Mistral Tiny", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.5e-7, + "completion": 2.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mistral: Mixtral 8x22B Instruct", + "context_length": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/mixtral-8x7b-instruct", + "name": "Mistral: Mixtral 8x7B Instruct", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 5.4e-7, + "completion": 5.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "mistralai/pixtral-12b", + "name": "Mistral: Pixtral 12B", + "context_length": 32768, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 1e-7, + "request": 0.0, + "image": 0.0001445 + } + }, + { + "id": "mistralai/pixtral-large", + "name": "Mistral: Pixtral Large 2411", + "context_length": 131072, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.002888 + } + }, + { + "id": "mistralai/voxtral-small-24b", + "name": "Mistral: Voxtral Small 24B 2507", + "context_length": 32000, + "input_modalities": [ + "text", + "audio" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 3e-7, + "request": 0.0, + "image": 0.0 + } + }, { "id": "openai/chatgpt-4o", "name": "OpenAI: ChatGPT-4o", From b89306af1d060d33b55f0482642f4b14cb089367 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 12:55:59 -0500 Subject: [PATCH 27/52] grok + beta filtering --- .../goose/examples/build_canonical_models.rs | 25 +++- .../canonical/data/canonical_models.json | 114 ++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 18e78da8151d..b599c2017a24 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -19,7 +19,7 @@ const ALLOWED_PROVIDERS: &[&str] = &[ // Additional providers (uncomment one at a time to test): "meta-llama", // Llama 3.1, 3.3, 4 series - very popular "mistralai", // Mistral Large, Mixtral - very popular - // "x-ai", // Grok models - high profile + "x-ai", // Grok models - high profile // "deepseek", // DeepSeek v3, R1 - gaining popularity // "cohere", // Command R, Command R+ models // "ai21", // Jamba 1.5 models @@ -138,6 +138,29 @@ async fn main() -> Result<()> { } } + // Filter out beta/preview variants if non-beta version exists + let beta_suffixes = ["-beta", "-preview", "-alpha"]; + let mut to_remove = Vec::new(); + + for canonical_id in canonical_groups.keys() { + for suffix in &beta_suffixes { + if canonical_id.ends_with(suffix) { + // Check if non-beta version exists + let base_id = canonical_id.strip_suffix(suffix).unwrap(); + if canonical_groups.contains_key(base_id) { + println!(" Filtering out {} (non-beta version {} exists)", canonical_id, base_id); + to_remove.push(canonical_id.clone()); + break; + } + } + } + } + + for id in to_remove { + canonical_groups.remove(&id); + shortest_names.remove(&id); + } + // Second pass: Build the registry with the selected models let mut registry = CanonicalModelRegistry::new(); diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index a69f00e3bb9c..5c780d751e1f 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -2088,5 +2088,119 @@ "request": 0.0, "image": 0.0008415 } + }, + { + "id": "x-ai/grok-3", + "name": "xAI: Grok 3", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-3-mini", + "name": "xAI: Grok 3 Mini", + "context_length": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-4", + "name": "xAI: Grok 4", + "context_length": 256000, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-6, + "completion": 0.000015, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-4-fast", + "name": "xAI: Grok 4 Fast", + "context_length": 2000000, + "max_completion_tokens": 30000, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-4.1-fast", + "name": "xAI: Grok 4.1 Fast", + "context_length": 2000000, + "max_completion_tokens": 30000, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "x-ai/grok-code-fast-1", + "name": "xAI: Grok Code Fast 1", + "context_length": 256000, + "max_completion_tokens": 10000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } } ] \ No newline at end of file From 8b431d6a29074728486e309dc4e0b857ad6b1f3d Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 13:21:07 -0500 Subject: [PATCH 28/52] Deepseek --- .../goose/examples/build_canonical_models.rs | 8 +- .../canonical/data/canonical_models.json | 187 ++++++++++++++++++ 2 files changed, 191 insertions(+), 4 deletions(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index b599c2017a24..d601888eb45c 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -17,10 +17,10 @@ const ALLOWED_PROVIDERS: &[&str] = &[ "google", "openai", // Additional providers (uncomment one at a time to test): - "meta-llama", // Llama 3.1, 3.3, 4 series - very popular - "mistralai", // Mistral Large, Mixtral - very popular - "x-ai", // Grok models - high profile - // "deepseek", // DeepSeek v3, R1 - gaining popularity + "meta-llama", // Llama 3.1, 3.3, 4 series - very popular + "mistralai", // Mistral Large, Mixtral - very popular + "x-ai", // Grok models - high profile + "deepseek", // DeepSeek v3, R1 - gaining popularity // "cohere", // Command R, Command R+ models // "ai21", // Jamba 1.5 models // "qwen", // Qwen 2.5 series (Alibaba) diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 5c780d751e1f..0889ecaf219f 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -247,6 +247,193 @@ "image": 0.0 } }, + { + "id": "deepseek/deepseek", + "name": "DeepSeek: DeepSeek V3.2", + "context_length": 163840, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.6e-7, + "completion": 3.9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-chat", + "name": "DeepSeek: DeepSeek V3", + "context_length": 163840, + "max_completion_tokens": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-prover", + "name": "DeepSeek: DeepSeek Prover V2", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 5e-7, + "completion": 2.18e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1", + "name": "DeepSeek: R1", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-0528-qwen3-8b", + "name": "DeepSeek: DeepSeek R1 0528 Qwen3 8B", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek: R1 Distill Llama 70B", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-8, + "completion": 1.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-14b", + "name": "DeepSeek: R1 Distill Qwen 14B", + "context_length": 32768, + "max_completion_tokens": 16384, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 1.2e-7, + "completion": 1.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-r1-distill-qwen-32b", + "name": "DeepSeek: R1 Distill Qwen 32B", + "context_length": 64000, + "max_completion_tokens": 32000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2.4e-7, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek: DeepSeek V3.1 Terminus", + "context_length": 163840, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.1e-7, + "completion": 7.9e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "deepseek/deepseek-v3.2-speciale", + "name": "DeepSeek: DeepSeek V3.2 Speciale", + "context_length": 163840, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2.7e-7, + "completion": 4.1e-7, + "request": 0.0, + "image": 0.0 + } + }, { "id": "google/gemini-2.0-flash", "name": "Google: Gemini 2.0 Flash", From 494551f8fc2cd275fa77e22afab8f2b6e29c8d08 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 14:27:24 -0500 Subject: [PATCH 29/52] add cohrere --- .../goose/examples/build_canonical_models.rs | 2 +- .../canonical/data/canonical_models.json | 76 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index d601888eb45c..994b79a4010f 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -21,7 +21,7 @@ const ALLOWED_PROVIDERS: &[&str] = &[ "mistralai", // Mistral Large, Mixtral - very popular "x-ai", // Grok models - high profile "deepseek", // DeepSeek v3, R1 - gaining popularity - // "cohere", // Command R, Command R+ models + "cohere", // Command R, Command R+ models // "ai21", // Jamba 1.5 models // "qwen", // Qwen 2.5 series (Alibaba) // "01-ai", // Yi models diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 0889ecaf219f..3cc5fb7962d6 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -247,6 +247,82 @@ "image": 0.0 } }, + { + "id": "cohere/command-a", + "name": "Cohere: Command A", + "context_length": 256000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-r-08", + "name": "Cohere: Command R (08-2024)", + "context_length": 128000, + "max_completion_tokens": 4000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-r-plus-08", + "name": "Cohere: Command R+ (08-2024)", + "context_length": 128000, + "max_completion_tokens": 4000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.5e-6, + "completion": 0.00001, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "cohere/command-r7b-12", + "name": "Cohere: Command R7B (12-2024)", + "context_length": 128000, + "max_completion_tokens": 4000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 3.75e-8, + "completion": 1.5e-7, + "request": 0.0, + "image": 0.0 + } + }, { "id": "deepseek/deepseek", "name": "DeepSeek: DeepSeek V3.2", From 43224b6964c54ce2b523f27367ae052dedfeb00f Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 14:28:12 -0500 Subject: [PATCH 30/52] add jamba --- .../goose/examples/build_canonical_models.rs | 2 +- .../canonical/data/canonical_models.json | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index 994b79a4010f..f2bf1e9ee9ae 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -22,7 +22,7 @@ const ALLOWED_PROVIDERS: &[&str] = &[ "x-ai", // Grok models - high profile "deepseek", // DeepSeek v3, R1 - gaining popularity "cohere", // Command R, Command R+ models - // "ai21", // Jamba 1.5 models + "ai21", // Jamba 1.5 models // "qwen", // Qwen 2.5 series (Alibaba) // "01-ai", // Yi models ]; diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 3cc5fb7962d6..82fec320d658 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -1,4 +1,42 @@ [ + { + "id": "ai21/jamba-large-1.7", + "name": "AI21: Jamba Large 1.7", + "context_length": 256000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-6, + "completion": 8e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "ai21/jamba-mini-1.7", + "name": "AI21: Jamba Mini 1.7", + "context_length": 256000, + "max_completion_tokens": 4096, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, { "id": "anthropic/claude-3-haiku", "name": "Anthropic: Claude 3 Haiku", From 381760176fe95b1046407031b34966a4056a9b20 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 14:29:53 -0500 Subject: [PATCH 31/52] add qwen --- .../goose/examples/build_canonical_models.rs | 2 +- .../canonical/data/canonical_models.json | 670 ++++++++++++++++++ 2 files changed, 671 insertions(+), 1 deletion(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index f2bf1e9ee9ae..d252fd04a955 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -23,7 +23,7 @@ const ALLOWED_PROVIDERS: &[&str] = &[ "deepseek", // DeepSeek v3, R1 - gaining popularity "cohere", // Command R, Command R+ models "ai21", // Jamba 1.5 models - // "qwen", // Qwen 2.5 series (Alibaba) + "qwen", // Qwen 2.5 series (Alibaba) // "01-ai", // Yi models ]; diff --git a/crates/goose/src/providers/canonical/data/canonical_models.json b/crates/goose/src/providers/canonical/data/canonical_models.json index 82fec320d658..9300d98465ad 100644 --- a/crates/goose/src/providers/canonical/data/canonical_models.json +++ b/crates/goose/src/providers/canonical/data/canonical_models.json @@ -2390,6 +2390,676 @@ "image": 0.0008415 } }, + { + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 7e-8, + "completion": 2.6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-7b-instruct", + "name": "Qwen: Qwen2.5 7B Instruct", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 4e-8, + "completion": 1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1.1e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-2.5-vl-7b-instruct", + "name": "Qwen: Qwen2.5-VL 7B Instruct", + "context_length": 32768, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2e-7, + "completion": 2e-7, + "request": 0.0, + "image": 0.0001445 + } + }, + { + "id": "qwen/qwen-max", + "name": "Qwen: Qwen-Max ", + "context_length": 32768, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.6e-6, + "completion": 6.4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-plus", + "name": "Qwen: Qwen-Plus", + "context_length": 131072, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-plus-2025-07-28:thinking", + "name": "Qwen: Qwen Plus 0728 (thinking)", + "context_length": 1000000, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 4e-7, + "completion": 4e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-turbo", + "name": "Qwen: Qwen-Turbo", + "context_length": 1000000, + "max_completion_tokens": 8192, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen-vl-max", + "name": "Qwen: Qwen VL Max", + "context_length": 131072, + "max_completion_tokens": 8192, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 8e-7, + "completion": 3.2e-6, + "request": 0.0, + "image": 0.001024 + } + }, + { + "id": "qwen/qwen-vl-plus", + "name": "Qwen: Qwen VL Plus", + "context_length": 7500, + "max_completion_tokens": 1500, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 2.1e-7, + "completion": 6.3e-7, + "request": 0.0, + "image": 0.0002688 + } + }, + { + "id": "qwen/qwen2.5-coder-7b-instruct", + "name": "Qwen: Qwen2.5 Coder 7B Instruct", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 9e-8, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen2.5-vl-32b-instruct", + "name": "Qwen: Qwen2.5 VL 32B Instruct", + "context_length": 16384, + "max_completion_tokens": 16384, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 5e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen: Qwen2.5 VL 72B Instruct", + "context_length": 32768, + "max_completion_tokens": 32768, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": false, + "pricing": { + "prompt": 3e-8, + "completion": 1.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-14b", + "name": "Qwen: Qwen3 14B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 5e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen: Qwen3 235B A22B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.8e-7, + "completion": 5.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-235b-a22b-thinking", + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.1e-7, + "completion": 6e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen: Qwen3 30B A3B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 2.2e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b-instruct", + "name": "Qwen: Qwen3 30B A3B Instruct 2507", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 8e-8, + "completion": 3.3e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-30b-a3b-thinking", + "name": "Qwen: Qwen3 30B A3B Thinking 2507", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 5.1e-8, + "completion": 3.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-32b", + "name": "Qwen: Qwen3 32B", + "context_length": 40960, + "max_completion_tokens": 40960, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 8e-8, + "completion": 2.4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-8b", + "name": "Qwen: Qwen3 8B", + "context_length": 128000, + "max_completion_tokens": 20000, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.8e-8, + "completion": 1.104e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder", + "name": "Qwen: Qwen3 Coder 480B A35B", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2.2e-7, + "completion": 9.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen: Qwen3 Coder 30B A3B Instruct", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 6e-8, + "completion": 2.5e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder-flash", + "name": "Qwen: Qwen3 Coder Flash", + "context_length": 128000, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-coder-plus", + "name": "Qwen: Qwen3 Coder Plus", + "context_length": 128000, + "max_completion_tokens": 65536, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1e-6, + "completion": 5e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-max", + "name": "Qwen: Qwen3 Max", + "context_length": 256000, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.2e-6, + "completion": 6e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen: Qwen3 Next 80B A3B Instruct", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1e-7, + "completion": 8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen: Qwen3 Next 80B A3B Thinking", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.2e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen: Qwen3 VL 235B A22B Instruct", + "context_length": 262144, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 2e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen: Qwen3 VL 235B A22B Thinking", + "context_length": 262144, + "max_completion_tokens": 262144, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 3e-7, + "completion": 1.2e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "context_length": 131072, + "max_completion_tokens": 131072, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.4e-7, + "completion": 1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-30b-a3b-thinking", + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "text", + "image" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.6e-7, + "completion": 8e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-8b-instruct", + "name": "Qwen: Qwen3 VL 8B Instruct", + "context_length": 131072, + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 6.4e-8, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwen3-vl-8b-thinking", + "name": "Qwen: Qwen3 VL 8B Thinking", + "context_length": 256000, + "max_completion_tokens": 32768, + "input_modalities": [ + "image", + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.8e-7, + "completion": 2.1e-6, + "request": 0.0, + "image": 0.0 + } + }, + { + "id": "qwen/qwq-32b", + "name": "Qwen: QwQ 32B", + "context_length": 32768, + "input_modalities": [ + "text" + ], + "output_modalities": [ + "text" + ], + "supports_tools": true, + "pricing": { + "prompt": 1.5e-7, + "completion": 4e-7, + "request": 0.0, + "image": 0.0 + } + }, { "id": "x-ai/grok-3", "name": "xAI: Grok 3", From ffacaf43747337758b269b1a6ceeff49774d1ff2 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 14:30:36 -0500 Subject: [PATCH 32/52] yi isnt there --- crates/goose/examples/build_canonical_models.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/goose/examples/build_canonical_models.rs b/crates/goose/examples/build_canonical_models.rs index d252fd04a955..54d6282a726f 100644 --- a/crates/goose/examples/build_canonical_models.rs +++ b/crates/goose/examples/build_canonical_models.rs @@ -24,7 +24,6 @@ const ALLOWED_PROVIDERS: &[&str] = &[ "cohere", // Command R, Command R+ models "ai21", // Jamba 1.5 models "qwen", // Qwen 2.5 series (Alibaba) - // "01-ai", // Yi models ]; #[tokio::main] From 5671b462e14a60cf9baee6e8ed184304f4ccf43c Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 14:37:53 -0500 Subject: [PATCH 33/52] moappring rerun --- .../data/canonical_mapping_report.json | 4653 ++++++++++------- 1 file changed, 2895 insertions(+), 1758 deletions(-) diff --git a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json index 3af83e1e3f54..26812744f3d0 100644 --- a/crates/goose/src/providers/canonical/data/canonical_mapping_report.json +++ b/crates/goose/src/providers/canonical/data/canonical_mapping_report.json @@ -1,5 +1,5 @@ { - "timestamp": "2025-12-10T00:38:10.636782+00:00", + "timestamp": "2025-12-10T19:35:57.131984+00:00", "unmapped_models": [ { "provider": "openai", @@ -173,10 +173,6 @@ "provider": "openai", "model": "babbage:ft-square-2023-02-28-14-48-38" }, - { - "provider": "openai", - "model": "codex-mini-latest" - }, { "provider": "openai", "model": "computer-use-preview" @@ -2173,10 +2169,6 @@ "provider": "openai", "model": "gpt-4o-transcribe-diarize" }, - { - "provider": "openai", - "model": "gpt-5-chat-latest" - }, { "provider": "openai", "model": "gpt-5-search-api" @@ -2185,10 +2177,6 @@ "provider": "openai", "model": "gpt-5-search-api-2025-10-14" }, - { - "provider": "openai", - "model": "gpt-5.1-chat-latest" - }, { "provider": "openai", "model": "gpt-audio" @@ -2277,14 +2265,6 @@ "provider": "openai", "model": "whisper-1" }, - { - "provider": "openrouter", - "model": "ai21/jamba-large-1.7" - }, - { - "provider": "openrouter", - "model": "ai21/jamba-mini-1.7" - }, { "provider": "openrouter", "model": "alibaba/tongyi-deepresearch-30b-a3b" @@ -2341,14 +2321,6 @@ "provider": "openrouter", "model": "baidu/ernie-4.5-vl-28b-a3b" }, - { - "provider": "openrouter", - "model": "cohere/command-r-08-2024" - }, - { - "provider": "openrouter", - "model": "cohere/command-r-plus-08-2024" - }, { "provider": "openrouter", "model": "deepcogito/cogito-v2-preview-llama-109b-moe" @@ -2363,1263 +2335,583 @@ }, { "provider": "openrouter", - "model": "deepseek/deepseek-chat" + "model": "google/gemini-2.0-flash-exp:free" }, { "provider": "openrouter", - "model": "deepseek/deepseek-chat-v3-0324" + "model": "inception/mercury" }, { "provider": "openrouter", - "model": "deepseek/deepseek-chat-v3.1" + "model": "inception/mercury-coder" }, { "provider": "openrouter", - "model": "deepseek/deepseek-r1" + "model": "kwaipilot/kat-coder-pro:free" }, { "provider": "openrouter", - "model": "deepseek/deepseek-r1-0528" + "model": "meituan/longcat-flash-chat:free" }, { "provider": "openrouter", - "model": "deepseek/deepseek-r1-distill-llama-70b" + "model": "meta-llama/llama-3.3-70b-instruct:free" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.1-terminus" + "model": "microsoft/phi-3-medium-128k-instruct" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.1-terminus:exacto" + "model": "microsoft/phi-3-mini-128k-instruct" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.2" + "model": "microsoft/phi-3.5-mini-128k-instruct" }, { "provider": "openrouter", - "model": "deepseek/deepseek-v3.2-exp" + "model": "minimax/minimax-m1" }, { "provider": "openrouter", - "model": "google/gemini-2.0-flash-exp:free" + "model": "minimax/minimax-m2" }, { "provider": "openrouter", - "model": "inception/mercury" + "model": "mistralai/devstral-2512:free" }, { "provider": "openrouter", - "model": "inception/mercury-coder" + "model": "mistralai/mistral-7b-instruct:free" }, { "provider": "openrouter", - "model": "kwaipilot/kat-coder-pro:free" + "model": "mistralai/mistral-small-3.1-24b-instruct:free" }, { "provider": "openrouter", - "model": "meituan/longcat-flash-chat:free" + "model": "moonshotai/kimi-k2" }, { "provider": "openrouter", - "model": "meta-llama/llama-3-70b-instruct" + "model": "moonshotai/kimi-k2-0905" }, { "provider": "openrouter", - "model": "meta-llama/llama-3-8b-instruct" + "model": "moonshotai/kimi-k2-0905:exacto" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.1-405b-instruct" + "model": "moonshotai/kimi-k2-thinking" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.1-70b-instruct" + "model": "nousresearch/deephermes-3-mistral-24b-preview" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.1-8b-instruct" + "model": "nousresearch/hermes-4-405b" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.2-3b-instruct" + "model": "nousresearch/hermes-4-70b" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.3-70b-instruct" + "model": "nvidia/llama-3.1-nemotron-70b-instruct" }, { "provider": "openrouter", - "model": "meta-llama/llama-3.3-70b-instruct:free" + "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5" }, { "provider": "openrouter", - "model": "meta-llama/llama-4-maverick" + "model": "nvidia/nemotron-nano-12b-v2-vl:free" }, { "provider": "openrouter", - "model": "meta-llama/llama-4-scout" + "model": "nvidia/nemotron-nano-9b-v2" }, { "provider": "openrouter", - "model": "microsoft/phi-3-medium-128k-instruct" + "model": "nvidia/nemotron-nano-9b-v2:free" }, { "provider": "openrouter", - "model": "microsoft/phi-3-mini-128k-instruct" + "model": "openai/gpt-oss-120b:free" }, { "provider": "openrouter", - "model": "microsoft/phi-3.5-mini-128k-instruct" + "model": "openai/gpt-oss-20b:free" }, { "provider": "openrouter", - "model": "minimax/minimax-m1" + "model": "prime-intellect/intellect-3" }, { "provider": "openrouter", - "model": "minimax/minimax-m2" + "model": "qwen/qwen3-235b-a22b:free" }, { "provider": "openrouter", - "model": "mistralai/codestral-2508" + "model": "qwen/qwen3-4b:free" }, { "provider": "openrouter", - "model": "mistralai/devstral-2512:free" + "model": "qwen/qwen3-coder:free" }, { "provider": "openrouter", - "model": "mistralai/devstral-medium" + "model": "relace/relace-search" }, { "provider": "openrouter", - "model": "mistralai/devstral-small" + "model": "sao10k/l3-euryale-70b" }, { "provider": "openrouter", - "model": "mistralai/ministral-14b-2512" + "model": "sao10k/l3.1-euryale-70b" }, { "provider": "openrouter", - "model": "mistralai/ministral-3b" + "model": "stepfun-ai/step3" }, { "provider": "openrouter", - "model": "mistralai/ministral-3b-2512" + "model": "thedrummer/rocinante-12b" }, { "provider": "openrouter", - "model": "mistralai/ministral-8b" + "model": "thedrummer/unslopnemo-12b" }, { "provider": "openrouter", - "model": "mistralai/ministral-8b-2512" + "model": "tngtech/deepseek-r1t2-chimera" }, { "provider": "openrouter", - "model": "mistralai/mistral-7b-instruct" + "model": "tngtech/tng-r1t-chimera" }, { "provider": "openrouter", - "model": "mistralai/mistral-7b-instruct:free" + "model": "tngtech/tng-r1t-chimera:free" }, { "provider": "openrouter", - "model": "mistralai/mistral-large" + "model": "x-ai/grok-3-beta" }, { "provider": "openrouter", - "model": "mistralai/mistral-large-2407" + "model": "x-ai/grok-3-mini-beta" }, { "provider": "openrouter", - "model": "mistralai/mistral-large-2411" + "model": "z-ai/glm-4-32b" }, { "provider": "openrouter", - "model": "mistralai/mistral-large-2512" + "model": "z-ai/glm-4.5" }, { "provider": "openrouter", - "model": "mistralai/mistral-medium-3" + "model": "z-ai/glm-4.5-air" }, { "provider": "openrouter", - "model": "mistralai/mistral-medium-3.1" + "model": "z-ai/glm-4.5-air:free" }, { "provider": "openrouter", - "model": "mistralai/mistral-nemo" + "model": "z-ai/glm-4.5v" }, { "provider": "openrouter", - "model": "mistralai/mistral-saba" + "model": "z-ai/glm-4.6" }, { "provider": "openrouter", - "model": "mistralai/mistral-small-24b-instruct-2501" + "model": "z-ai/glm-4.6:exacto" }, { "provider": "openrouter", - "model": "mistralai/mistral-small-3.1-24b-instruct" + "model": "z-ai/glm-4.6v" }, { - "provider": "openrouter", - "model": "mistralai/mistral-small-3.1-24b-instruct:free" + "provider": "databricks", + "model": "baxen-migration-demo" }, { - "provider": "openrouter", - "model": "mistralai/mistral-small-3.2-24b-instruct" + "provider": "databricks", + "model": "big-hack" }, { - "provider": "openrouter", - "model": "mistralai/mistral-tiny" + "provider": "databricks", + "model": "case_history_hackweek" }, { - "provider": "openrouter", - "model": "mistralai/mixtral-8x22b-instruct" + "provider": "databricks", + "model": "case-history-checker" }, { - "provider": "openrouter", - "model": "mistralai/mixtral-8x7b-instruct" + "provider": "databricks", + "model": "claude-3-5-sonnet-2" }, { - "provider": "openrouter", - "model": "mistralai/pixtral-12b" + "provider": "databricks", + "model": "claude-4" }, { - "provider": "openrouter", - "model": "mistralai/pixtral-large-2411" + "provider": "databricks", + "model": "claude-haiku" }, { - "provider": "openrouter", - "model": "mistralai/voxtral-small-24b-2507" + "provider": "databricks", + "model": "claude-opus" }, { - "provider": "openrouter", - "model": "moonshotai/kimi-k2" + "provider": "databricks", + "model": "claude-sonnet" }, { - "provider": "openrouter", - "model": "moonshotai/kimi-k2-0905" + "provider": "databricks", + "model": "cmg-test-iris" }, { - "provider": "openrouter", - "model": "moonshotai/kimi-k2-0905:exacto" + "provider": "databricks", + "model": "codellama-7b-hf-ift" }, { - "provider": "openrouter", - "model": "moonshotai/kimi-k2-thinking" + "provider": "databricks", + "model": "column-mapping-model-endpoint" }, { - "provider": "openrouter", - "model": "nousresearch/deephermes-3-mistral-24b-preview" + "provider": "databricks", + "model": "column-mapping-model-endpoint-v2" }, { - "provider": "openrouter", - "model": "nousresearch/hermes-4-405b" + "provider": "databricks", + "model": "dummy-model-ml-gp-endpoint" }, { - "provider": "openrouter", - "model": "nousresearch/hermes-4-70b" + "provider": "databricks", + "model": "e5-large-v2" }, { - "provider": "openrouter", - "model": "nvidia/llama-3.1-nemotron-70b-instruct" + "provider": "databricks", + "model": "gemini-1-5-flash" }, { - "provider": "openrouter", - "model": "nvidia/llama-3.3-nemotron-super-49b-v1.5" + "provider": "databricks", + "model": "gemini-1-5-pro" }, { - "provider": "openrouter", - "model": "nvidia/nemotron-nano-12b-v2-vl:free" + "provider": "databricks", + "model": "gemini-flash-lite-latest" }, { - "provider": "openrouter", - "model": "nvidia/nemotron-nano-9b-v2" + "provider": "databricks", + "model": "gemini-pro" }, { - "provider": "openrouter", - "model": "nvidia/nemotron-nano-9b-v2:free" + "provider": "databricks", + "model": "goose" }, { - "provider": "openrouter", - "model": "openai/gpt-oss-120b:free" + "provider": "databricks", + "model": "goose-gpt-oss" }, { - "provider": "openrouter", - "model": "openai/gpt-oss-20b:free" + "provider": "databricks", + "model": "goose-o4-mini" }, { - "provider": "openrouter", - "model": "prime-intellect/intellect-3" + "provider": "databricks", + "model": "gpt-4-vision-preview" }, { - "provider": "openrouter", - "model": "qwen/qwen-2.5-72b-instruct" + "provider": "databricks", + "model": "gpt-5-mini-high" }, { - "provider": "openrouter", - "model": "qwen/qwen-max" + "provider": "databricks", + "model": "gpt-vision" }, { - "provider": "openrouter", - "model": "qwen/qwen-plus" + "provider": "databricks", + "model": "hackweek-snowflake-gpt-query-generator" }, { - "provider": "openrouter", - "model": "qwen/qwen-plus-2025-07-28" + "provider": "databricks", + "model": "headless-goose" }, { - "provider": "openrouter", - "model": "qwen/qwen-plus-2025-07-28:thinking" + "provider": "databricks", + "model": "icg-poc" }, { - "provider": "openrouter", - "model": "qwen/qwen-turbo" + "provider": "databricks", + "model": "invoice_parser_test" }, { - "provider": "openrouter", - "model": "qwen/qwen-vl-max" + "provider": "databricks", + "model": "jina-reranker-v1-turbo-en" }, { - "provider": "openrouter", - "model": "qwen/qwen3-14b" + "provider": "databricks", + "model": "kgoose-o4-mini" }, { - "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b" + "provider": "databricks", + "model": "korhan-openai-test" }, { - "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b-2507" + "provider": "databricks", + "model": "korhan-openai-wrapper" }, { - "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b-thinking-2507" + "provider": "databricks", + "model": "lfc_mml_er_bge_m3" }, { - "provider": "openrouter", - "model": "qwen/qwen3-235b-a22b:free" + "provider": "databricks", + "model": "moderation" }, { - "provider": "openrouter", - "model": "qwen/qwen3-30b-a3b" + "provider": "databricks", + "model": "o1-mini" }, { - "provider": "openrouter", - "model": "qwen/qwen3-30b-a3b-instruct-2507" + "provider": "databricks", + "model": "o3-cdd-autopilot" }, { - "provider": "openrouter", - "model": "qwen/qwen3-30b-a3b-thinking-2507" + "provider": "databricks", + "model": "optimized-llama2-7b" }, { - "provider": "openrouter", - "model": "qwen/qwen3-32b" + "provider": "databricks", + "model": "opus-mt-en-es" }, { - "provider": "openrouter", - "model": "qwen/qwen3-4b:free" + "provider": "databricks", + "model": "opus-mt-en-fr" }, { - "provider": "openrouter", - "model": "qwen/qwen3-8b" + "provider": "databricks", + "model": "opus-mt-en-ja" }, { - "provider": "openrouter", - "model": "qwen/qwen3-coder" + "provider": "databricks", + "model": "opus-mt-es-en" }, { - "provider": "openrouter", - "model": "qwen/qwen3-coder-30b-a3b-instruct" + "provider": "databricks", + "model": "opus-mt-fr-en" }, { - "provider": "openrouter", - "model": "qwen/qwen3-coder-flash" + "provider": "databricks", + "model": "opus-mt-ja-en" }, { - "provider": "openrouter", - "model": "qwen/qwen3-coder-plus" + "provider": "databricks", + "model": "p2p-device-recovery-classify" }, { - "provider": "openrouter", - "model": "qwen/qwen3-coder:exacto" + "provider": "databricks", + "model": "picasso_embeddings" }, { - "provider": "openrouter", - "model": "qwen/qwen3-coder:free" + "provider": "databricks", + "model": "pii-redactor" }, { - "provider": "openrouter", - "model": "qwen/qwen3-max" + "provider": "databricks", + "model": "pii-redactor-prod" }, { - "provider": "openrouter", - "model": "qwen/qwen3-next-80b-a3b-instruct" + "provider": "databricks", + "model": "prime_model" }, { - "provider": "openrouter", - "model": "qwen/qwen3-next-80b-a3b-thinking" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-235b-a22b-instruct" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-235b-a22b-thinking" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-30b-a3b-instruct" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-30b-a3b-thinking" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-8b-instruct" - }, - { - "provider": "openrouter", - "model": "qwen/qwen3-vl-8b-thinking" - }, - { - "provider": "openrouter", - "model": "qwen/qwq-32b" - }, - { - "provider": "openrouter", - "model": "relace/relace-search" - }, - { - "provider": "openrouter", - "model": "sao10k/l3-euryale-70b" - }, - { - "provider": "openrouter", - "model": "sao10k/l3.1-euryale-70b" - }, - { - "provider": "openrouter", - "model": "stepfun-ai/step3" - }, - { - "provider": "openrouter", - "model": "thedrummer/rocinante-12b" - }, - { - "provider": "openrouter", - "model": "thedrummer/unslopnemo-12b" - }, - { - "provider": "openrouter", - "model": "tngtech/deepseek-r1t2-chimera" - }, - { - "provider": "openrouter", - "model": "tngtech/tng-r1t-chimera" - }, - { - "provider": "openrouter", - "model": "tngtech/tng-r1t-chimera:free" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-3" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-3-beta" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-3-mini" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-3-mini-beta" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-4" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-4-fast" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-4.1-fast" - }, - { - "provider": "openrouter", - "model": "x-ai/grok-code-fast-1" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4-32b" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.5" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.5-air" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.5-air:free" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.5v" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.6" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.6:exacto" - }, - { - "provider": "openrouter", - "model": "z-ai/glm-4.6v" + "provider": "databricks", + "model": "reportiq_selector_1" }, { "provider": "databricks", - "model": "baxen-migration-demo" + "model": "reportiq_selector_md_file" }, { "provider": "databricks", - "model": "big-hack" + "model": "snowflake-gpt-query-generator-v3" }, { "provider": "databricks", - "model": "case_history_hackweek" + "model": "sq-bank-statement-classifier" }, { "provider": "databricks", - "model": "case-history-checker" + "model": "sq-bank-statement-parser" }, { "provider": "databricks", - "model": "claude-3-5-haiku" + "model": "support-article-intent-mapping" }, { "provider": "databricks", - "model": "claude-3-5-sonnet" + "model": "text-embedding-3-large" }, { "provider": "databricks", - "model": "claude-3-5-sonnet-2" + "model": "text-embedding-3-small" }, { "provider": "databricks", - "model": "claude-3-7-sonnet" + "model": "text-embedding-ada-002" }, { "provider": "databricks", - "model": "claude-4" + "model": "databricks-llama-4-maverick" }, { "provider": "databricks", - "model": "claude-4-opus" + "model": "databricks-gemma-3-12b" }, { "provider": "databricks", - "model": "claude-haiku" + "model": "databricks-meta-llama-3-1-8b-instruct" }, { "provider": "databricks", - "model": "claude-opus" + "model": "databricks-meta-llama-3-3-70b-instruct" }, { "provider": "databricks", - "model": "claude-sonnet" + "model": "databricks-gte-large-en" }, { "provider": "databricks", - "model": "cmg-test-iris" + "model": "databricks-bge-large-en" }, { "provider": "databricks", - "model": "code-review-gpt-5" + "model": "databricks-meta-llama-3-1-405b-instruct" }, { - "provider": "databricks", - "model": "code-review-gpt-5-mini" + "provider": "google", + "model": "aqa" }, { - "provider": "databricks", - "model": "codellama-7b-hf-ift" + "provider": "google", + "model": "embedding-001" }, { - "provider": "databricks", - "model": "column-mapping-model-endpoint" + "provider": "google", + "model": "embedding-gecko-001" }, { - "provider": "databricks", - "model": "column-mapping-model-endpoint-v2" + "provider": "google", + "model": "gemini-2.0-flash-exp-image-generation" }, { - "provider": "databricks", - "model": "dummy-model-ml-gp-endpoint" + "provider": "google", + "model": "gemini-2.0-flash-live-001" }, { - "provider": "databricks", - "model": "e5-large-v2" + "provider": "google", + "model": "gemini-2.5-computer-use-preview-10-2025" }, { - "provider": "databricks", - "model": "gemini-1-5-flash" + "provider": "google", + "model": "gemini-2.5-flash-preview-tts" }, { - "provider": "databricks", - "model": "gemini-1-5-pro" + "provider": "google", + "model": "gemini-2.5-pro-preview-tts" }, { - "provider": "databricks", - "model": "gemini-2-0-flash" + "provider": "google", + "model": "gemini-embedding-001" }, { - "provider": "databricks", - "model": "gemini-2-5-flash" + "provider": "google", + "model": "gemini-embedding-exp" }, { - "provider": "databricks", - "model": "gemini-2-5-flash-latest" + "provider": "google", + "model": "gemini-embedding-exp-03-07" }, { - "provider": "databricks", - "model": "gemini-2-5-pro" + "provider": "google", + "model": "gemini-exp-1206" }, { - "provider": "databricks", - "model": "gemini-2-5-pro-exp" + "provider": "google", + "model": "gemini-flash-latest" }, { - "provider": "databricks", + "provider": "google", "model": "gemini-flash-lite-latest" }, { - "provider": "databricks", - "model": "gemini-pro" - }, - { - "provider": "databricks", - "model": "goose" - }, - { - "provider": "databricks", - "model": "goose-claude-3-5-sonnet" - }, - { - "provider": "databricks", - "model": "goose-claude-3-7-sonnet" - }, - { - "provider": "databricks", - "model": "goose-claude-4-5-haiku" - }, - { - "provider": "databricks", - "model": "goose-claude-4-5-opus" - }, - { - "provider": "databricks", - "model": "goose-claude-4-5-sonnet" - }, - { - "provider": "databricks", - "model": "goose-claude-4-opus" + "provider": "google", + "model": "gemini-pro-latest" }, { - "provider": "databricks", - "model": "goose-claude-4-sonnet" + "provider": "google", + "model": "gemini-robotics-er-1.5-preview" }, { - "provider": "databricks", - "model": "goose-claude-4-sonnet-bedrock" + "provider": "google", + "model": "gemma-3-1b-it" }, { - "provider": "databricks", - "model": "goose-gemini-2-5-pro" + "provider": "google", + "model": "gemma-3n-e2b-it" }, { - "provider": "databricks", - "model": "goose-gemini-3-pro" + "provider": "google", + "model": "imagen-4.0-fast-generate-001" }, { - "provider": "databricks", - "model": "goose-gpt-4-1" + "provider": "google", + "model": "imagen-4.0-generate-001" }, { - "provider": "databricks", - "model": "goose-gpt-4o" + "provider": "google", + "model": "imagen-4.0-generate-preview-06-06" }, { - "provider": "databricks", - "model": "goose-gpt-5" + "provider": "google", + "model": "imagen-4.0-ultra-generate-001" }, { - "provider": "databricks", - "model": "goose-gpt-oss" + "provider": "google", + "model": "imagen-4.0-ultra-generate-preview-06-06" }, { - "provider": "databricks", - "model": "goose-o1" + "provider": "google", + "model": "nano-banana-pro-preview" }, { - "provider": "databricks", - "model": "goose-o3" + "provider": "google", + "model": "text-embedding-004" }, { - "provider": "databricks", - "model": "goose-o4-mini" + "provider": "google", + "model": "veo-2.0-generate-001" }, { - "provider": "databricks", - "model": "gpt-3-5-turbo" + "provider": "google", + "model": "veo-3.0-fast-generate-001" }, { - "provider": "databricks", - "model": "gpt-3-5-turbo-0125" + "provider": "google", + "model": "veo-3.0-generate-001" }, { - "provider": "databricks", - "model": "gpt-3-5-turbo-16k" - }, - { - "provider": "databricks", - "model": "gpt-3-5-turbo-instruct" - }, - { - "provider": "databricks", - "model": "gpt-4" - }, - { - "provider": "databricks", - "model": "gpt-4-0125-preview" - }, - { - "provider": "databricks", - "model": "gpt-4-1-2025-04-14" - }, - { - "provider": "databricks", - "model": "gpt-4-1-mini" - }, - { - "provider": "databricks", - "model": "gpt-4-1-nano" - }, - { - "provider": "databricks", - "model": "gpt-4-turbo" - }, - { - "provider": "databricks", - "model": "gpt-4-turbo-2024-04-09" - }, - { - "provider": "databricks", - "model": "gpt-4-vision-preview" - }, - { - "provider": "databricks", - "model": "gpt-4o" - }, - { - "provider": "databricks", - "model": "gpt-4o-2024-05-13" - }, - { - "provider": "databricks", - "model": "gpt-4o-2024-11-20" - }, - { - "provider": "databricks", - "model": "gpt-4o-mini" - }, - { - "provider": "databricks", - "model": "gpt-4o-mini-2024-07-18" - }, - { - "provider": "databricks", - "model": "gpt-5" - }, - { - "provider": "databricks", - "model": "gpt-5-mini-high" - }, - { - "provider": "databricks", - "model": "gpt-5-nano" - }, - { - "provider": "databricks", - "model": "gpt-vision" - }, - { - "provider": "databricks", - "model": "hackweek-snowflake-gpt-query-generator" - }, - { - "provider": "databricks", - "model": "headless-goose" - }, - { - "provider": "databricks", - "model": "headless-goose-claude-4-sonnet" - }, - { - "provider": "databricks", - "model": "headless-goose-o3-mini" - }, - { - "provider": "databricks", - "model": "icg-poc" - }, - { - "provider": "databricks", - "model": "invoice_parser_test" - }, - { - "provider": "databricks", - "model": "jina-reranker-v1-turbo-en" - }, - { - "provider": "databricks", - "model": "kgoose-cashapp-claude-4-sonnet" - }, - { - "provider": "databricks", - "model": "kgoose-cashapp-claude-sonnet-4-5" - }, - { - "provider": "databricks", - "model": "kgoose-claude-4-sonnet" - }, - { - "provider": "databricks", - "model": "kgoose-claude-haiku-4-5" - }, - { - "provider": "databricks", - "model": "kgoose-claude-sonnet-4-5" - }, - { - "provider": "databricks", - "model": "kgoose-gemini-2-5-flash" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4-1" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4-1-mini" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4-1-nano" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-4o" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-5" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-5-mini" - }, - { - "provider": "databricks", - "model": "kgoose-gpt-5-nano" - }, - { - "provider": "databricks", - "model": "kgoose-o3" - }, - { - "provider": "databricks", - "model": "kgoose-o4-mini" - }, - { - "provider": "databricks", - "model": "korhan-openai-test" - }, - { - "provider": "databricks", - "model": "korhan-openai-wrapper" - }, - { - "provider": "databricks", - "model": "lfc_mml_er_bge_m3" - }, - { - "provider": "databricks", - "model": "moderation" - }, - { - "provider": "databricks", - "model": "ng-tools-claude-haiku-3-5" - }, - { - "provider": "databricks", - "model": "ng-tools-claude-opus-4" - }, - { - "provider": "databricks", - "model": "ng-tools-claude-opus-4-1" - }, - { - "provider": "databricks", - "model": "ng-tools-claude-sonnet-3-7" - }, - { - "provider": "databricks", - "model": "ng-tools-claude-sonnet-4" - }, - { - "provider": "databricks", - "model": "ng-tools-gpt-5-nano" - }, - { - "provider": "databricks", - "model": "ng-tools-int-claude-sonnet-4-5" - }, - { - "provider": "databricks", - "model": "o1" - }, - { - "provider": "databricks", - "model": "o1-2024-12-17" - }, - { - "provider": "databricks", - "model": "o1-mini" - }, - { - "provider": "databricks", - "model": "o1-preview" - }, - { - "provider": "databricks", - "model": "o3" - }, - { - "provider": "databricks", - "model": "o3-cdd-autopilot" - }, - { - "provider": "databricks", - "model": "o3-mini" - }, - { - "provider": "databricks", - "model": "optimized-llama2-7b" - }, - { - "provider": "databricks", - "model": "opus-mt-en-es" - }, - { - "provider": "databricks", - "model": "opus-mt-en-fr" - }, - { - "provider": "databricks", - "model": "opus-mt-en-ja" - }, - { - "provider": "databricks", - "model": "opus-mt-es-en" - }, - { - "provider": "databricks", - "model": "opus-mt-fr-en" - }, - { - "provider": "databricks", - "model": "opus-mt-ja-en" - }, - { - "provider": "databricks", - "model": "p2p-device-recovery-classify" - }, - { - "provider": "databricks", - "model": "picasso_embeddings" - }, - { - "provider": "databricks", - "model": "pii-redactor" - }, - { - "provider": "databricks", - "model": "pii-redactor-prod" - }, - { - "provider": "databricks", - "model": "prime_model" - }, - { - "provider": "databricks", - "model": "raml-claude-opus-4-5" - }, - { - "provider": "databricks", - "model": "raml-claude-sonnet-4-5" - }, - { - "provider": "databricks", - "model": "reportiq_selector_1" - }, - { - "provider": "databricks", - "model": "reportiq_selector_md_file" - }, - { - "provider": "databricks", - "model": "snowflake-gpt-query-generator-v3" - }, - { - "provider": "databricks", - "model": "sq-bank-statement-classifier" - }, - { - "provider": "databricks", - "model": "sq-bank-statement-parser" - }, - { - "provider": "databricks", - "model": "support-article-intent-mapping" - }, - { - "provider": "databricks", - "model": "text-embedding-3-large" - }, - { - "provider": "databricks", - "model": "text-embedding-3-small" - }, - { - "provider": "databricks", - "model": "text-embedding-ada-002" - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-1" - }, - { - "provider": "databricks", - "model": "databricks-gemini-3-pro" - }, - { - "provider": "databricks", - "model": "databricks-gpt-5" - }, - { - "provider": "databricks", - "model": "databricks-gemini-2-5-flash" - }, - { - "provider": "databricks", - "model": "databricks-claude-sonnet-4-5" - }, - { - "provider": "databricks", - "model": "databricks-gpt-oss-120b" - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-mini" - }, - { - "provider": "databricks", - "model": "databricks-gpt-5-nano" - }, - { - "provider": "databricks", - "model": "databricks-gemini-2-5-pro" - }, - { - "provider": "databricks", - "model": "databricks-gpt-oss-20b" - }, - { - "provider": "databricks", - "model": "databricks-llama-4-maverick" - }, - { - "provider": "databricks", - "model": "databricks-gemma-3-12b" - }, - { - "provider": "databricks", - "model": "databricks-meta-llama-3-1-8b-instruct" - }, - { - "provider": "databricks", - "model": "databricks-meta-llama-3-3-70b-instruct" - }, - { - "provider": "databricks", - "model": "databricks-claude-opus-4-5" - }, - { - "provider": "databricks", - "model": "databricks-claude-opus-4-1" - }, - { - "provider": "databricks", - "model": "databricks-claude-sonnet-4" - }, - { - "provider": "databricks", - "model": "databricks-claude-3-7-sonnet" - }, - { - "provider": "databricks", - "model": "databricks-gte-large-en" - }, - { - "provider": "databricks", - "model": "databricks-bge-large-en" - }, - { - "provider": "databricks", - "model": "databricks-meta-llama-3-1-405b-instruct" - }, - { - "provider": "google", - "model": "aqa" - }, - { - "provider": "google", - "model": "embedding-001" - }, - { - "provider": "google", - "model": "embedding-gecko-001" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-exp-image-generation" - }, - { - "provider": "google", - "model": "gemini-2.0-flash-live-001" - }, - { - "provider": "google", - "model": "gemini-2.5-computer-use-preview-10-2025" - }, - { - "provider": "google", - "model": "gemini-2.5-flash-preview-tts" - }, - { - "provider": "google", - "model": "gemini-2.5-pro-preview-tts" - }, - { - "provider": "google", - "model": "gemini-embedding-001" - }, - { - "provider": "google", - "model": "gemini-embedding-exp" - }, - { - "provider": "google", - "model": "gemini-embedding-exp-03-07" - }, - { - "provider": "google", - "model": "gemini-exp-1206" - }, - { - "provider": "google", - "model": "gemini-flash-latest" - }, - { - "provider": "google", - "model": "gemini-flash-lite-latest" - }, - { - "provider": "google", - "model": "gemini-pro-latest" - }, - { - "provider": "google", - "model": "gemini-robotics-er-1.5-preview" - }, - { - "provider": "google", - "model": "gemma-3-1b-it" - }, - { - "provider": "google", - "model": "gemma-3n-e2b-it" - }, - { - "provider": "google", - "model": "imagen-4.0-fast-generate-001" - }, - { - "provider": "google", - "model": "imagen-4.0-generate-001" - }, - { - "provider": "google", - "model": "imagen-4.0-generate-preview-06-06" - }, - { - "provider": "google", - "model": "imagen-4.0-ultra-generate-001" - }, - { - "provider": "google", - "model": "imagen-4.0-ultra-generate-preview-06-06" - }, - { - "provider": "google", - "model": "nano-banana-pro-preview" - }, - { - "provider": "google", - "model": "text-embedding-004" - }, - { - "provider": "google", - "model": "veo-2.0-generate-001" - }, - { - "provider": "google", - "model": "veo-3.0-fast-generate-001" - }, - { - "provider": "google", - "model": "veo-3.0-generate-001" - }, - { - "provider": "google", - "model": "veo-3.1-fast-generate-preview" + "provider": "google", + "model": "veo-3.1-fast-generate-preview" }, { "provider": "google", @@ -3627,1547 +2919,3323 @@ } ], "all_mappings": { - "anthropic": [ + "databricks": [ + { + "provider_model": "claude-3-5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "claude-3-5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "claude-3-7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "claude-4-opus", + "canonical_model": "anthropic/claude-opus-4", + "verified": true + }, + { + "provider_model": "code-review-gpt-5", + "canonical_model": "openai/gpt-5", + "verified": true + }, + { + "provider_model": "code-review-gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "gemini-2-0-flash", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2-5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2-5-flash-latest", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2-5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-2-5-pro-exp", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "goose-claude-3-5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "goose-claude-3-7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "goose-claude-4-5-haiku", + "canonical_model": "anthropic/claude-haiku-4.5", + "verified": true + }, + { + "provider_model": "goose-claude-4-5-opus", + "canonical_model": "anthropic/claude-opus-4.5", + "verified": true + }, + { + "provider_model": "goose-claude-4-5-sonnet", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "goose-claude-4-opus", + "canonical_model": "anthropic/claude-opus-4", + "verified": true + }, + { + "provider_model": "goose-claude-4-sonnet", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "goose-claude-4-sonnet-bedrock", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "goose-gemini-2-5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "goose-gemini-3-pro", + "canonical_model": "google/gemini-3-pro", + "verified": true + }, + { + "provider_model": "goose-gpt-4-1", + "canonical_model": "openai/gpt-4.1", + "verified": true + }, + { + "provider_model": "goose-gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "goose-gpt-5", + "canonical_model": "openai/gpt-5", + "verified": true + }, + { + "provider_model": "goose-o1", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "goose-o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "gpt-3-5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3-5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "gpt-3-5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", + "verified": true + }, + { + "provider_model": "gpt-3-5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", + "verified": true + }, + { + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4", + "verified": true + }, + { + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt-4", + "verified": true + }, + { + "provider_model": "gpt-4-1-2025-04-14", + "canonical_model": "openai/gpt-4.1", + "verified": true + }, + { + "provider_model": "gpt-4-1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "gpt-4-1-nano", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", + "verified": true + }, + { + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5", + "verified": true + }, + { + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "headless-goose-claude-4-sonnet", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "headless-goose-o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "kgoose-cashapp-claude-4-sonnet", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "kgoose-cashapp-claude-sonnet-4-5", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "kgoose-claude-4-sonnet", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "kgoose-claude-haiku-4-5", + "canonical_model": "anthropic/claude-haiku-4.5", + "verified": true + }, + { + "provider_model": "kgoose-claude-sonnet-4-5", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "kgoose-gemini-2-5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "kgoose-gpt-4-1", + "canonical_model": "openai/gpt-4.1", + "verified": true + }, + { + "provider_model": "kgoose-gpt-4-1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "kgoose-gpt-4-1-nano", + "canonical_model": "openai/gpt-4.1-nano", + "verified": true + }, + { + "provider_model": "kgoose-gpt-4o", + "canonical_model": "openai/gpt-4o", + "verified": true + }, + { + "provider_model": "kgoose-gpt-5", + "canonical_model": "openai/gpt-5", + "verified": true + }, + { + "provider_model": "kgoose-gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "kgoose-gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "kgoose-o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "ng-tools-claude-haiku-3-5", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "ng-tools-claude-opus-4", + "canonical_model": "anthropic/claude-opus-4", + "verified": true + }, + { + "provider_model": "ng-tools-claude-opus-4-1", + "canonical_model": "anthropic/claude-opus-4.1", + "verified": true + }, + { + "provider_model": "ng-tools-claude-sonnet-3-7", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "ng-tools-claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "ng-tools-gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "ng-tools-int-claude-sonnet-4-5", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "o1", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o1-preview", + "canonical_model": "openai/o1", + "verified": true + }, + { + "provider_model": "o3", + "canonical_model": "openai/o3", + "verified": true + }, + { + "provider_model": "o3-mini", + "canonical_model": "openai/o3-mini", + "verified": true + }, + { + "provider_model": "raml-claude-opus-4-5", + "canonical_model": "anthropic/claude-opus-4.5", + "verified": true + }, + { + "provider_model": "raml-claude-sonnet-4-5", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "databricks-gpt-5-1", + "canonical_model": "openai/gpt-5.1", + "verified": true + }, + { + "provider_model": "databricks-gemini-3-pro", + "canonical_model": "google/gemini-3-pro", + "verified": true + }, + { + "provider_model": "databricks-gpt-5", + "canonical_model": "openai/gpt-5", + "verified": true + }, + { + "provider_model": "databricks-gemini-2-5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "databricks-claude-sonnet-4-5", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "databricks-gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", + "verified": true + }, + { + "provider_model": "databricks-gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", + "verified": true + }, + { + "provider_model": "databricks-gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", + "verified": true + }, + { + "provider_model": "databricks-gemini-2-5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "databricks-gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", + "verified": true + }, + { + "provider_model": "databricks-claude-opus-4-5", + "canonical_model": "anthropic/claude-opus-4.5", + "verified": true + }, + { + "provider_model": "databricks-claude-opus-4-1", + "canonical_model": "anthropic/claude-opus-4.1", + "verified": true + }, + { + "provider_model": "databricks-claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "databricks-claude-3-7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + } + ], + "google": [ + { + "provider_model": "gemini-2.0-flash", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-exp", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-preview", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.0-flash-lite-preview-02-05", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-image", + "canonical_model": "google/gemini-2.5-flash-image", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-image-preview", + "canonical_model": "google/gemini-2.5-flash-image", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", + "verified": true + }, + { + "provider_model": "gemini-3-pro-image-preview", + "canonical_model": "google/gemini-3-pro-image", + "verified": true + }, + { + "provider_model": "gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro", + "verified": true + }, + { + "provider_model": "gemma-3-12b-it", + "canonical_model": "google/gemma-3-12b-it", + "verified": true + }, + { + "provider_model": "gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", + "verified": true + }, + { + "provider_model": "gemma-3-4b-it", + "canonical_model": "google/gemma-3-4b-it", + "verified": true + }, + { + "provider_model": "gemma-3n-e4b-it", + "canonical_model": "google/gemma-3n-e4b-it", + "verified": true + } + ], + "tetrate": [], + "openrouter": [ + { + "provider_model": "ai21/jamba-large-1.7", + "canonical_model": "ai21/jamba-large-1.7", + "verified": true + }, + { + "provider_model": "ai21/jamba-mini-1.7", + "canonical_model": "ai21/jamba-mini-1.7", + "verified": true + }, + { + "provider_model": "anthropic/claude-3-haiku", + "canonical_model": "anthropic/claude-3-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3-opus", + "canonical_model": "anthropic/claude-3-opus", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-haiku", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.5-sonnet", + "canonical_model": "anthropic/claude-3.5-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.7-sonnet", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "anthropic/claude-3.7-sonnet:thinking", + "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "verified": true + }, + { + "provider_model": "anthropic/claude-haiku-4.5", + "canonical_model": "anthropic/claude-haiku-4.5", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4", + "canonical_model": "anthropic/claude-opus-4", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4.1", + "canonical_model": "anthropic/claude-opus-4.1", + "verified": true + }, + { + "provider_model": "anthropic/claude-opus-4.5", + "canonical_model": "anthropic/claude-opus-4.5", + "verified": true + }, + { + "provider_model": "anthropic/claude-sonnet-4", + "canonical_model": "anthropic/claude-sonnet-4", + "verified": true + }, + { + "provider_model": "anthropic/claude-sonnet-4.5", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + }, + { + "provider_model": "cohere/command-r-08-2024", + "canonical_model": "cohere/command-r-08", + "verified": true + }, + { + "provider_model": "cohere/command-r-plus-08-2024", + "canonical_model": "cohere/command-r-plus-08", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-chat", + "canonical_model": "deepseek/deepseek-chat", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-chat-v3-0324", + "canonical_model": "deepseek/deepseek-chat", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-chat-v3.1", + "canonical_model": "deepseek/deepseek-chat", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-r1", + "canonical_model": "deepseek/deepseek-r1", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-r1-0528", + "canonical_model": "deepseek/deepseek-r1", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-r1-distill-llama-70b", + "canonical_model": "deepseek/deepseek-r1-distill-llama-70b", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-v3.1-terminus", + "canonical_model": "deepseek/deepseek-v3.1-terminus", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-v3.1-terminus:exacto", + "canonical_model": "deepseek/deepseek-v3.1-terminus", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-v3.2", + "canonical_model": "deepseek/deepseek", + "verified": true + }, + { + "provider_model": "deepseek/deepseek-v3.2-exp", + "canonical_model": "deepseek/deepseek", + "verified": true + }, + { + "provider_model": "google/gemini-2.0-flash-001", + "canonical_model": "google/gemini-2.0-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.0-flash-lite-001", + "canonical_model": "google/gemini-2.0-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash-lite", + "verified": true + }, + { + "provider_model": "google/gemini-2.5-flash-preview-09-2025", + "canonical_model": "google/gemini-2.5-flash", + "verified": true + }, { - "provider_model": "claude-3-5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "google/gemini-2.5-pro", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "claude-3-7-sonnet-20250219", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "google/gemini-2.5-pro-preview", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "claude-3-haiku-20240307", - "canonical_model": "anthropic/claude-3-haiku", + "provider_model": "google/gemini-2.5-pro-preview-05-06", + "canonical_model": "google/gemini-2.5-pro", "verified": true }, { - "provider_model": "claude-3-opus-20240229", - "canonical_model": "anthropic/claude-3-opus", + "provider_model": "google/gemini-3-pro-preview", + "canonical_model": "google/gemini-3-pro", "verified": true }, { - "provider_model": "claude-haiku-4-5-20251001", - "canonical_model": "anthropic/claude-haiku-4.5", + "provider_model": "google/gemma-3-27b-it", + "canonical_model": "google/gemma-3-27b-it", "verified": true }, { - "provider_model": "claude-opus-4-1-20250805", - "canonical_model": "anthropic/claude-opus-4.1", + "provider_model": "meta-llama/llama-3-70b-instruct", + "canonical_model": "meta-llama/llama-3-70b-instruct", "verified": true }, { - "provider_model": "claude-opus-4-20250514", - "canonical_model": "anthropic/claude-opus-4", + "provider_model": "meta-llama/llama-3-8b-instruct", + "canonical_model": "meta-llama/llama-3-8b-instruct", "verified": true }, { - "provider_model": "claude-opus-4-5-20251101", - "canonical_model": "anthropic/claude-opus-4.5", + "provider_model": "meta-llama/llama-3.1-405b-instruct", + "canonical_model": "meta-llama/llama-3.1-405b-instruct", "verified": true }, { - "provider_model": "claude-sonnet-4-20250514", - "canonical_model": "anthropic/claude-sonnet-4", + "provider_model": "meta-llama/llama-3.1-70b-instruct", + "canonical_model": "meta-llama/llama-3.1-70b-instruct", "verified": true }, { - "provider_model": "claude-sonnet-4-5-20250929", - "canonical_model": "anthropic/claude-sonnet-4.5", + "provider_model": "meta-llama/llama-3.1-8b-instruct", + "canonical_model": "meta-llama/llama-3.1-8b-instruct", "verified": true - } - ], - "openai": [ + }, { - "provider_model": "chatgpt-4o-latest", - "canonical_model": "openai/chatgpt-4o-latest", + "provider_model": "meta-llama/llama-3.2-3b-instruct", + "canonical_model": "meta-llama/llama-3.2-3b-instruct", "verified": true }, { - "provider_model": "gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "meta-llama/llama-3.3-70b-instruct", + "canonical_model": "meta-llama/llama-3.3-70b-instruct", "verified": true }, { - "provider_model": "gpt-3.5-turbo-0125", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "meta-llama/llama-4-maverick", + "canonical_model": "meta-llama/llama-4-maverick", "verified": true }, { - "provider_model": "gpt-3.5-turbo-1106", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "meta-llama/llama-4-scout", + "canonical_model": "meta-llama/llama-4-scout", "verified": true }, { - "provider_model": "gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "mistralai/codestral-2508", + "canonical_model": "mistralai/codestral", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "mistralai/devstral-medium", + "canonical_model": "mistralai/devstral-medium", "verified": true }, { - "provider_model": "gpt-3.5-turbo-instruct-0914", - "canonical_model": "openai/gpt-3.5-turbo-instruct", + "provider_model": "mistralai/devstral-small", + "canonical_model": "mistralai/devstral-small", "verified": true }, { - "provider_model": "gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "mistralai/ministral-14b-2512", + "canonical_model": "mistralai/ministral-14b", "verified": true }, { - "provider_model": "gpt-4-0125-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "mistralai/ministral-3b", + "canonical_model": "mistralai/ministral-3b", "verified": true }, { - "provider_model": "gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "mistralai/ministral-3b-2512", + "canonical_model": "mistralai/ministral-3b", "verified": true }, { - "provider_model": "gpt-4-0613", - "canonical_model": "openai/gpt-4", + "provider_model": "mistralai/ministral-8b", + "canonical_model": "mistralai/ministral-8b", "verified": true }, { - "provider_model": "gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "mistralai/ministral-8b-2512", + "canonical_model": "mistralai/ministral-8b", "verified": true }, { - "provider_model": "gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "mistralai/mistral-7b-instruct", + "canonical_model": "mistralai/mistral-7b-instruct", "verified": true }, { - "provider_model": "gpt-4-turbo-2024-04-09", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "mistralai/mistral-large", + "canonical_model": "mistralai/mistral-large", "verified": true }, { - "provider_model": "gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "mistralai/mistral-large-2407", + "canonical_model": "mistralai/mistral-large", "verified": true }, { - "provider_model": "gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "mistralai/mistral-large-2411", + "canonical_model": "mistralai/mistral-large", "verified": true }, { - "provider_model": "gpt-4.1-2025-04-14", - "canonical_model": "openai/gpt-4.1", + "provider_model": "mistralai/mistral-large-2512", + "canonical_model": "mistralai/mistral-large", "verified": true }, { - "provider_model": "gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "mistralai/mistral-medium-3", + "canonical_model": "mistralai/mistral-medium-3", "verified": true }, { - "provider_model": "gpt-4.1-mini-2025-04-14", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "mistralai/mistral-medium-3.1", + "canonical_model": "mistralai/mistral-medium-3.1", "verified": true }, { - "provider_model": "gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "mistralai/mistral-nemo", + "canonical_model": "mistralai/mistral-nemo", "verified": true }, { - "provider_model": "gpt-4.1-nano-2025-04-14", + "provider_model": "mistralai/mistral-saba", + "canonical_model": "mistralai/mistral-saba", + "verified": true + }, + { + "provider_model": "mistralai/mistral-small-24b-instruct-2501", + "canonical_model": "mistralai/mistral-small-24b-instruct", + "verified": true + }, + { + "provider_model": "mistralai/mistral-small-3.1-24b-instruct", + "canonical_model": "mistralai/mistral-small-3.1-24b-instruct", + "verified": true + }, + { + "provider_model": "mistralai/mistral-small-3.2-24b-instruct", + "canonical_model": "mistralai/mistral-small-3.2-24b-instruct", + "verified": true + }, + { + "provider_model": "mistralai/mistral-tiny", + "canonical_model": "mistralai/mistral-tiny", + "verified": true + }, + { + "provider_model": "mistralai/mixtral-8x22b-instruct", + "canonical_model": "mistralai/mixtral-8x22b-instruct", + "verified": true + }, + { + "provider_model": "mistralai/mixtral-8x7b-instruct", + "canonical_model": "mistralai/mixtral-8x7b-instruct", + "verified": true + }, + { + "provider_model": "mistralai/pixtral-12b", + "canonical_model": "mistralai/pixtral-12b", + "verified": true + }, + { + "provider_model": "mistralai/pixtral-large-2411", + "canonical_model": "mistralai/pixtral-large", + "verified": true + }, + { + "provider_model": "mistralai/voxtral-small-24b-2507", + "canonical_model": "mistralai/voxtral-small-24b", + "verified": true + }, + { + "provider_model": "openai/codex-mini", + "canonical_model": "openai/codex-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo-0613", + "canonical_model": "openai/gpt-3.5-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", + "verified": true + }, + { + "provider_model": "openai/gpt-4", + "canonical_model": "openai/gpt-4", + "verified": true + }, + { + "provider_model": "openai/gpt-4-0314", + "canonical_model": "openai/gpt-4", + "verified": true + }, + { + "provider_model": "openai/gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", + "verified": true + }, + { + "provider_model": "openai/gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1", + "canonical_model": "openai/gpt-4.1", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-4.1-nano", "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "gpt-4o", + "provider_model": "openai/gpt-4o", "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-2024-05-13", + "provider_model": "openai/gpt-4o-2024-05-13", "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-2024-08-06", + "provider_model": "openai/gpt-4o-2024-08-06", "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-2024-11-20", + "provider_model": "openai/gpt-4o-2024-11-20", "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "gpt-4o-audio-preview", + "provider_model": "openai/gpt-4o-audio-preview", "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2024-12-17", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-4o-audio-preview-2025-06-03", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "openai/gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-4o:extended", + "canonical_model": "openai/gpt-4o:extended", "verified": true }, { - "provider_model": "gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "openai/gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-5-codex", + "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-mini-search", + "provider_model": "openai/gpt-5-image", + "canonical_model": "openai/gpt-5-image", "verified": true }, { - "provider_model": "gpt-4o-search-preview", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-5-image-mini", + "canonical_model": "openai/gpt-5-image-mini", "verified": true }, { - "provider_model": "gpt-4o-search-preview-2025-03-11", - "canonical_model": "openai/gpt-4o-search", + "provider_model": "openai/gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "openai/gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "gpt-5-2025-08-07", - "canonical_model": "openai/gpt-5", + "provider_model": "openai/gpt-5-pro", + "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "gpt-5-codex", - "canonical_model": "openai/gpt-5-codex", + "provider_model": "openai/gpt-5.1", + "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/gpt-5.1-chat", + "canonical_model": "openai/gpt-5.1-chat", + "verified": true + }, + { + "provider_model": "openai/gpt-5.1-codex", + "canonical_model": "openai/gpt-5.1-codex", + "verified": true + }, + { + "provider_model": "openai/gpt-5.1-codex-max", + "canonical_model": "openai/gpt-5.1-codex-max", + "verified": true + }, + { + "provider_model": "openai/gpt-5.1-codex-mini", + "canonical_model": "openai/gpt-5.1-codex-mini", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-120b", + "canonical_model": "openai/gpt-oss-120b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-120b:exacto", + "canonical_model": "openai/gpt-oss-120b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-20b", + "canonical_model": "openai/gpt-oss-20b", + "verified": true + }, + { + "provider_model": "openai/gpt-oss-safeguard-20b", + "canonical_model": "openai/gpt-oss-safeguard-20b", "verified": true }, { - "provider_model": "gpt-5-mini-2025-08-07", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "openai/o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "gpt-5-nano", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "gpt-5-nano-2025-08-07", - "canonical_model": "openai/gpt-5-nano", + "provider_model": "openai/o3-deep-research", + "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "gpt-5-pro", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/o3-mini", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "gpt-5-pro-2025-10-06", - "canonical_model": "openai/gpt-5-pro", + "provider_model": "openai/o3-mini-high", + "canonical_model": "openai/o3-mini-high", "verified": true }, { - "provider_model": "gpt-5.1", - "canonical_model": "openai/gpt-5.1", + "provider_model": "openai/o3-pro", + "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "gpt-5.1-2025-11-13", - "canonical_model": "openai/gpt-5.1", + "provider_model": "openai/o4-mini", + "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "gpt-5.1-codex", - "canonical_model": "openai/gpt-5.1-codex", + "provider_model": "openai/o4-mini-deep-research", + "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "gpt-5.1-codex-max", - "canonical_model": "openai/gpt-5.1-codex-max", + "provider_model": "openai/o4-mini-high", + "canonical_model": "openai/o4-mini-high", "verified": true }, { - "provider_model": "gpt-5.1-codex-mini", - "canonical_model": "openai/gpt-5.1-codex-mini", + "provider_model": "qwen/qwen-2.5-72b-instruct", + "canonical_model": "qwen/qwen-2.5-72b-instruct", "verified": true }, { - "provider_model": "o1", - "canonical_model": "openai/o1", + "provider_model": "qwen/qwen-max", + "canonical_model": "qwen/qwen-max", "verified": true }, { - "provider_model": "o1-2024-12-17", - "canonical_model": "openai/o1", + "provider_model": "qwen/qwen-plus", + "canonical_model": "qwen/qwen-plus", "verified": true }, { - "provider_model": "o1-pro", - "canonical_model": "openai/o1-pro", + "provider_model": "qwen/qwen-plus-2025-07-28", + "canonical_model": "qwen/qwen-plus", "verified": true }, { - "provider_model": "o1-pro-2025-03-19", - "canonical_model": "openai/o1-pro", + "provider_model": "qwen/qwen-plus-2025-07-28:thinking", + "canonical_model": "qwen/qwen-plus-2025-07-28:thinking", "verified": true }, { - "provider_model": "o3", - "canonical_model": "openai/o3", + "provider_model": "qwen/qwen-turbo", + "canonical_model": "qwen/qwen-turbo", "verified": true }, { - "provider_model": "o3-2025-04-16", - "canonical_model": "openai/o3", + "provider_model": "qwen/qwen-vl-max", + "canonical_model": "qwen/qwen-vl-max", "verified": true }, { - "provider_model": "o3-deep-research", - "canonical_model": "openai/o3-deep-research", + "provider_model": "qwen/qwen3-14b", + "canonical_model": "qwen/qwen3-14b", "verified": true }, { - "provider_model": "o3-deep-research-2025-06-26", - "canonical_model": "openai/o3-deep-research", + "provider_model": "qwen/qwen3-235b-a22b", + "canonical_model": "qwen/qwen3-235b-a22b", "verified": true }, { - "provider_model": "o3-mini", - "canonical_model": "openai/o3-mini", + "provider_model": "qwen/qwen3-235b-a22b-2507", + "canonical_model": "qwen/qwen3-235b-a22b", "verified": true }, { - "provider_model": "o3-mini-2025-01-31", - "canonical_model": "openai/o3-mini", + "provider_model": "qwen/qwen3-235b-a22b-thinking-2507", + "canonical_model": "qwen/qwen3-235b-a22b-thinking", "verified": true }, { - "provider_model": "o3-pro", - "canonical_model": "openai/o3-pro", + "provider_model": "qwen/qwen3-30b-a3b", + "canonical_model": "qwen/qwen3-30b-a3b", "verified": true }, { - "provider_model": "o3-pro-2025-06-10", - "canonical_model": "openai/o3-pro", + "provider_model": "qwen/qwen3-30b-a3b-instruct-2507", + "canonical_model": "qwen/qwen3-30b-a3b-instruct", "verified": true }, { - "provider_model": "o4-mini", - "canonical_model": "openai/o4-mini", + "provider_model": "qwen/qwen3-30b-a3b-thinking-2507", + "canonical_model": "qwen/qwen3-30b-a3b-thinking", "verified": true }, { - "provider_model": "o4-mini-2025-04-16", - "canonical_model": "openai/o4-mini", + "provider_model": "qwen/qwen3-32b", + "canonical_model": "qwen/qwen3-32b", "verified": true }, { - "provider_model": "o4-mini-deep-research", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "qwen/qwen3-8b", + "canonical_model": "qwen/qwen3-8b", "verified": true }, { - "provider_model": "o4-mini-deep-research-2025-06-26", - "canonical_model": "openai/o4-mini-deep-research", + "provider_model": "qwen/qwen3-coder", + "canonical_model": "qwen/qwen3-coder", "verified": true - } - ], - "tetrate": [], - "google": [ + }, { - "provider_model": "gemini-2.0-flash", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "qwen/qwen3-coder-30b-a3b-instruct", + "canonical_model": "qwen/qwen3-coder-30b-a3b-instruct", "verified": true }, { - "provider_model": "gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "qwen/qwen3-coder-flash", + "canonical_model": "qwen/qwen3-coder-flash", "verified": true }, { - "provider_model": "gemini-2.0-flash-exp", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "qwen/qwen3-coder-plus", + "canonical_model": "qwen/qwen3-coder-plus", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "qwen/qwen3-coder:exacto", + "canonical_model": "qwen/qwen3-coder", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "qwen/qwen3-max", + "canonical_model": "qwen/qwen3-max", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-preview", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "qwen/qwen3-next-80b-a3b-instruct", + "canonical_model": "qwen/qwen3-next-80b-a3b-instruct", "verified": true }, { - "provider_model": "gemini-2.0-flash-lite-preview-02-05", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "qwen/qwen3-next-80b-a3b-thinking", + "canonical_model": "qwen/qwen3-next-80b-a3b-thinking", "verified": true }, { - "provider_model": "gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "qwen/qwen3-vl-235b-a22b-instruct", + "canonical_model": "qwen/qwen3-vl-235b-a22b-instruct", "verified": true }, { - "provider_model": "gemini-2.5-flash-image", - "canonical_model": "google/gemini-2.5-flash-image", + "provider_model": "qwen/qwen3-vl-235b-a22b-thinking", + "canonical_model": "qwen/qwen3-vl-235b-a22b-thinking", "verified": true }, { - "provider_model": "gemini-2.5-flash-image-preview", - "canonical_model": "google/gemini-2.5-flash-image", + "provider_model": "qwen/qwen3-vl-30b-a3b-instruct", + "canonical_model": "qwen/qwen3-vl-30b-a3b-instruct", "verified": true }, { - "provider_model": "gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "qwen/qwen3-vl-30b-a3b-thinking", + "canonical_model": "qwen/qwen3-vl-30b-a3b-thinking", "verified": true }, { - "provider_model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "qwen/qwen3-vl-8b-instruct", + "canonical_model": "qwen/qwen3-vl-8b-instruct", "verified": true }, { - "provider_model": "gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "qwen/qwen3-vl-8b-thinking", + "canonical_model": "qwen/qwen3-vl-8b-thinking", "verified": true }, { - "provider_model": "gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "qwen/qwq-32b", + "canonical_model": "qwen/qwq-32b", "verified": true }, { - "provider_model": "gemini-3-pro-image-preview", - "canonical_model": "google/gemini-3-pro-image", + "provider_model": "x-ai/grok-3", + "canonical_model": "x-ai/grok-3", "verified": true }, { - "provider_model": "gemini-3-pro-preview", - "canonical_model": "google/gemini-3-pro", + "provider_model": "x-ai/grok-3-mini", + "canonical_model": "x-ai/grok-3-mini", "verified": true }, { - "provider_model": "gemma-3-12b-it", - "canonical_model": "google/gemma-3-12b-it", + "provider_model": "x-ai/grok-4", + "canonical_model": "x-ai/grok-4", "verified": true }, { - "provider_model": "gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "x-ai/grok-4-fast", + "canonical_model": "x-ai/grok-4-fast", "verified": true }, { - "provider_model": "gemma-3-4b-it", - "canonical_model": "google/gemma-3-4b-it", + "provider_model": "x-ai/grok-4.1-fast", + "canonical_model": "x-ai/grok-4.1-fast", "verified": true }, { - "provider_model": "gemma-3n-e4b-it", - "canonical_model": "google/gemma-3n-e4b-it", + "provider_model": "x-ai/grok-code-fast-1", + "canonical_model": "x-ai/grok-code-fast-1", "verified": true } ], - "openrouter": [ + "anthropic": [ { - "provider_model": "anthropic/claude-3-haiku", + "provider_model": "claude-3-5-haiku-20241022", + "canonical_model": "anthropic/claude-3.5-haiku", + "verified": true + }, + { + "provider_model": "claude-3-7-sonnet-20250219", + "canonical_model": "anthropic/claude-3.7-sonnet", + "verified": true + }, + { + "provider_model": "claude-3-haiku-20240307", "canonical_model": "anthropic/claude-3-haiku", "verified": true }, { - "provider_model": "anthropic/claude-3-opus", + "provider_model": "claude-3-opus-20240229", "canonical_model": "anthropic/claude-3-opus", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "claude-haiku-4-5-20251001", + "canonical_model": "anthropic/claude-haiku-4.5", "verified": true }, { - "provider_model": "anthropic/claude-3.5-haiku-20241022", - "canonical_model": "anthropic/claude-3.5-haiku", + "provider_model": "claude-opus-4-1-20250805", + "canonical_model": "anthropic/claude-opus-4.1", "verified": true }, { - "provider_model": "anthropic/claude-3.5-sonnet", - "canonical_model": "anthropic/claude-3.5-sonnet", + "provider_model": "claude-opus-4-20250514", + "canonical_model": "anthropic/claude-opus-4", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet", - "canonical_model": "anthropic/claude-3.7-sonnet", + "provider_model": "claude-opus-4-5-20251101", + "canonical_model": "anthropic/claude-opus-4.5", "verified": true }, { - "provider_model": "anthropic/claude-3.7-sonnet:thinking", - "canonical_model": "anthropic/claude-3.7-sonnet:thinking", + "provider_model": "claude-sonnet-4-20250514", + "canonical_model": "anthropic/claude-sonnet-4", "verified": true }, { - "provider_model": "anthropic/claude-haiku-4.5", - "canonical_model": "anthropic/claude-haiku-4.5", + "provider_model": "claude-sonnet-4-5-20250929", + "canonical_model": "anthropic/claude-sonnet-4.5", + "verified": true + } + ], + "openai": [ + { + "provider_model": "chatgpt-4o-latest", + "canonical_model": "openai/chatgpt-4o", "verified": true }, { - "provider_model": "anthropic/claude-opus-4", - "canonical_model": "anthropic/claude-opus-4", + "provider_model": "codex-mini-latest", + "canonical_model": "openai/codex-mini", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.1", - "canonical_model": "anthropic/claude-opus-4.1", + "provider_model": "gpt-3.5-turbo", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-opus-4.5", - "canonical_model": "anthropic/claude-opus-4.5", + "provider_model": "gpt-3.5-turbo-0125", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4", - "canonical_model": "anthropic/claude-sonnet-4", + "provider_model": "gpt-3.5-turbo-1106", + "canonical_model": "openai/gpt-3.5-turbo", "verified": true }, { - "provider_model": "anthropic/claude-sonnet-4.5", - "canonical_model": "anthropic/claude-sonnet-4.5", + "provider_model": "gpt-3.5-turbo-16k", + "canonical_model": "openai/gpt-3.5-turbo-16k", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-001", - "canonical_model": "google/gemini-2.0-flash", + "provider_model": "gpt-3.5-turbo-instruct", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "google/gemini-2.0-flash-lite-001", - "canonical_model": "google/gemini-2.0-flash-lite", + "provider_model": "gpt-3.5-turbo-instruct-0914", + "canonical_model": "openai/gpt-3.5-turbo-instruct", "verified": true }, { - "provider_model": "google/gemini-2.5-flash", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-0125-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash-lite", + "provider_model": "gpt-4-0314", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-flash-preview-09-2025", - "canonical_model": "google/gemini-2.5-flash", + "provider_model": "gpt-4-0613", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-pro", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-1106-preview", + "canonical_model": "openai/gpt-4", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-turbo", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-2.5-pro-preview-05-06", - "canonical_model": "google/gemini-2.5-pro", + "provider_model": "gpt-4-turbo-2024-04-09", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemini-3-pro-preview", - "canonical_model": "google/gemini-3-pro", + "provider_model": "gpt-4-turbo-preview", + "canonical_model": "openai/gpt-4-turbo", "verified": true }, { - "provider_model": "google/gemma-3-27b-it", - "canonical_model": "google/gemma-3-27b-it", + "provider_model": "gpt-4.1", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "openai/codex-mini", - "canonical_model": "openai/codex-mini", + "provider_model": "gpt-4.1-2025-04-14", + "canonical_model": "openai/gpt-4.1", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4.1-mini", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-0613", - "canonical_model": "openai/gpt-3.5-turbo", + "provider_model": "gpt-4.1-mini-2025-04-14", + "canonical_model": "openai/gpt-4.1-mini", "verified": true }, { - "provider_model": "openai/gpt-3.5-turbo-16k", - "canonical_model": "openai/gpt-3.5-turbo-16k", + "provider_model": "gpt-4.1-nano", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "openai/gpt-4", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4.1-nano-2025-04-14", + "canonical_model": "openai/gpt-4.1-nano", "verified": true }, { - "provider_model": "openai/gpt-4-0314", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-1106-preview", - "canonical_model": "openai/gpt-4", + "provider_model": "gpt-4o-2024-05-13", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-turbo", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-2024-08-06", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4-turbo-preview", - "canonical_model": "openai/gpt-4-turbo", + "provider_model": "gpt-4o-2024-11-20", + "canonical_model": "openai/gpt-4o", "verified": true }, { - "provider_model": "openai/gpt-4.1", - "canonical_model": "openai/gpt-4.1", + "provider_model": "gpt-4o-audio-preview", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4.1-mini", - "canonical_model": "openai/gpt-4.1-mini", + "provider_model": "gpt-4o-audio-preview-2024-12-17", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4.1-nano", - "canonical_model": "openai/gpt-4.1-nano", + "provider_model": "gpt-4o-audio-preview-2025-06-03", + "canonical_model": "openai/gpt-4o-audio", "verified": true }, { - "provider_model": "openai/gpt-4o", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-05-13", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-2024-07-18", + "canonical_model": "openai/gpt-4o-mini", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-08-06", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-search-preview", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4o-2024-11-20", - "canonical_model": "openai/gpt-4o", + "provider_model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-mini-search", "verified": true }, { - "provider_model": "openai/gpt-4o-audio-preview", - "canonical_model": "openai/gpt-4o-audio", + "provider_model": "gpt-4o-search-preview", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4o-mini", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-4o-search-preview-2025-03-11", + "canonical_model": "openai/gpt-4o-search", "verified": true }, { - "provider_model": "openai/gpt-4o-mini-2024-07-18", - "canonical_model": "openai/gpt-4o-mini", + "provider_model": "gpt-5", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-4o:extended", - "canonical_model": "openai/gpt-4o:extended", + "provider_model": "gpt-5-2025-08-07", + "canonical_model": "openai/gpt-5", "verified": true }, { - "provider_model": "openai/gpt-5", - "canonical_model": "openai/gpt-5", + "provider_model": "gpt-5-chat-latest", + "canonical_model": "openai/gpt-5-chat", "verified": true }, { - "provider_model": "openai/gpt-5-codex", + "provider_model": "gpt-5-codex", "canonical_model": "openai/gpt-5-codex", "verified": true }, { - "provider_model": "openai/gpt-5-image", - "canonical_model": "openai/gpt-5-image", + "provider_model": "gpt-5-mini", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-5-image-mini", - "canonical_model": "openai/gpt-5-image-mini", + "provider_model": "gpt-5-mini-2025-08-07", + "canonical_model": "openai/gpt-5-mini", "verified": true }, { - "provider_model": "openai/gpt-5-mini", - "canonical_model": "openai/gpt-5-mini", + "provider_model": "gpt-5-nano", + "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-5-nano", + "provider_model": "gpt-5-nano-2025-08-07", "canonical_model": "openai/gpt-5-nano", "verified": true }, { - "provider_model": "openai/gpt-5-pro", + "provider_model": "gpt-5-pro", "canonical_model": "openai/gpt-5-pro", "verified": true }, { - "provider_model": "openai/gpt-5.1", + "provider_model": "gpt-5-pro-2025-10-06", + "canonical_model": "openai/gpt-5-pro", + "verified": true + }, + { + "provider_model": "gpt-5.1", "canonical_model": "openai/gpt-5.1", "verified": true }, { - "provider_model": "openai/gpt-5.1-chat", + "provider_model": "gpt-5.1-2025-11-13", + "canonical_model": "openai/gpt-5.1", + "verified": true + }, + { + "provider_model": "gpt-5.1-chat-latest", "canonical_model": "openai/gpt-5.1-chat", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex", + "provider_model": "gpt-5.1-codex", "canonical_model": "openai/gpt-5.1-codex", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex-max", + "provider_model": "gpt-5.1-codex-max", "canonical_model": "openai/gpt-5.1-codex-max", "verified": true }, { - "provider_model": "openai/gpt-5.1-codex-mini", + "provider_model": "gpt-5.1-codex-mini", "canonical_model": "openai/gpt-5.1-codex-mini", "verified": true }, { - "provider_model": "openai/gpt-oss-120b", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o1", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-oss-120b:exacto", - "canonical_model": "openai/gpt-oss-120b", + "provider_model": "o1-2024-12-17", + "canonical_model": "openai/o1", "verified": true }, { - "provider_model": "openai/gpt-oss-20b", - "canonical_model": "openai/gpt-oss-20b", + "provider_model": "o1-pro", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/gpt-oss-safeguard-20b", - "canonical_model": "openai/gpt-oss-safeguard-20b", + "provider_model": "o1-pro-2025-03-19", + "canonical_model": "openai/o1-pro", "verified": true }, { - "provider_model": "openai/o1", - "canonical_model": "openai/o1", + "provider_model": "o3", + "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/o3", + "provider_model": "o3-2025-04-16", "canonical_model": "openai/o3", "verified": true }, { - "provider_model": "openai/o3-deep-research", + "provider_model": "o3-deep-research", "canonical_model": "openai/o3-deep-research", "verified": true }, { - "provider_model": "openai/o3-mini", + "provider_model": "o3-deep-research-2025-06-26", + "canonical_model": "openai/o3-deep-research", + "verified": true + }, + { + "provider_model": "o3-mini", "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-mini-high", - "canonical_model": "openai/o3-mini-high", + "provider_model": "o3-mini-2025-01-31", + "canonical_model": "openai/o3-mini", "verified": true }, { - "provider_model": "openai/o3-pro", + "provider_model": "o3-pro", "canonical_model": "openai/o3-pro", "verified": true }, { - "provider_model": "openai/o4-mini", + "provider_model": "o3-pro-2025-06-10", + "canonical_model": "openai/o3-pro", + "verified": true + }, + { + "provider_model": "o4-mini", "canonical_model": "openai/o4-mini", "verified": true }, { - "provider_model": "openai/o4-mini-deep-research", + "provider_model": "o4-mini-2025-04-16", + "canonical_model": "openai/o4-mini", + "verified": true + }, + { + "provider_model": "o4-mini-deep-research", "canonical_model": "openai/o4-mini-deep-research", "verified": true }, { - "provider_model": "openai/o4-mini-high", - "canonical_model": "openai/o4-mini-high", + "provider_model": "o4-mini-deep-research-2025-06-26", + "canonical_model": "openai/o4-mini-deep-research", "verified": true } - ], - "databricks": [] + ] }, "mapped_models": [ { - "provider": "anthropic", - "model": "claude-opus-4-5-20251101", - "canonical": "anthropic/claude-opus-4.5" + "provider": "anthropic", + "model": "claude-haiku-4-5-20251001", + "canonical": "anthropic/claude-haiku-4.5" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-5-20251101", + "canonical": "anthropic/claude-opus-4.5" + }, + { + "provider": "anthropic", + "model": "claude-3-7-sonnet-20250219", + "canonical": "anthropic/claude-3.7-sonnet" + }, + { + "provider": "anthropic", + "model": "claude-3-haiku-20240307", + "canonical": "anthropic/claude-3-haiku" + }, + { + "provider": "anthropic", + "model": "claude-3-opus-20240229", + "canonical": "anthropic/claude-3-opus" + }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-20250514", + "canonical": "anthropic/claude-sonnet-4" + }, + { + "provider": "anthropic", + "model": "claude-sonnet-4-5-20250929", + "canonical": "anthropic/claude-sonnet-4.5" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-1-20250805", + "canonical": "anthropic/claude-opus-4.1" + }, + { + "provider": "anthropic", + "model": "claude-3-5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" + }, + { + "provider": "anthropic", + "model": "claude-opus-4-20250514", + "canonical": "anthropic/claude-opus-4" + }, + { + "provider": "openai", + "model": "o1", + "canonical": "openai/o1" + }, + { + "provider": "openai", + "model": "gpt-4.1", + "canonical": "openai/gpt-4.1" + }, + { + "provider": "openai", + "model": "o4-mini", + "canonical": "openai/o4-mini" + }, + { + "provider": "openai", + "model": "codex-mini-latest", + "canonical": "openai/codex-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-search" + }, + { + "provider": "openai", + "model": "o3-pro", + "canonical": "openai/o3-pro" + }, + { + "provider": "openai", + "model": "gpt-5.1-2025-11-13", + "canonical": "openai/gpt-5.1" + }, + { + "provider": "openai", + "model": "gpt-5-nano", + "canonical": "openai/gpt-5-nano" + }, + { + "provider": "openai", + "model": "o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-0125", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-search-preview", + "canonical": "openai/gpt-4o-mini-search" + }, + { + "provider": "openai", + "model": "gpt-5-2025-08-07", + "canonical": "openai/gpt-5" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "gpt-5-chat-latest", + "canonical": "openai/gpt-5-chat" + }, + { + "provider": "openai", + "model": "gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" + }, + { + "provider": "openai", + "model": "o1-pro-2025-03-19", + "canonical": "openai/o1-pro" + }, + { + "provider": "openai", + "model": "gpt-4o", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "gpt-5-pro", + "canonical": "openai/gpt-5-pro" + }, + { + "provider": "openai", + "model": "gpt-4.1-nano-2025-04-14", + "canonical": "openai/gpt-4.1-nano" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openai", + "model": "gpt-5-mini-2025-08-07", + "canonical": "openai/gpt-5-mini" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-instruct-0914", + "canonical": "openai/gpt-3.5-turbo-instruct" + }, + { + "provider": "openai", + "model": "gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "o4-mini-2025-04-16", + "canonical": "openai/o4-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "o3-2025-04-16", + "canonical": "openai/o3" + }, + { + "provider": "openai", + "model": "gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" + }, + { + "provider": "openai", + "model": "gpt-5.1-chat-latest", + "canonical": "openai/gpt-5.1-chat" + }, + { + "provider": "openai", + "model": "o4-mini-deep-research-2025-06-26", + "canonical": "openai/o4-mini-deep-research" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" + }, + { + "provider": "openai", + "model": "gpt-4.1-2025-04-14", + "canonical": "openai/gpt-4.1" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2024-12-17", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "chatgpt-4o-latest", + "canonical": "openai/chatgpt-4o" + }, + { + "provider": "openai", + "model": "o1-2024-12-17", + "canonical": "openai/o1" + }, + { + "provider": "openai", + "model": "gpt-4-0314", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-4o-audio-preview-2025-06-03", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-1106", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "o1-pro", + "canonical": "openai/o1-pro" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini-2025-04-14", + "canonical": "openai/gpt-4.1-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openai", + "model": "o3-deep-research-2025-06-26", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openai", + "model": "gpt-4-0125-preview", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-5", + "canonical": "openai/gpt-5" + }, + { + "provider": "openai", + "model": "o3-pro-2025-06-10", + "canonical": "openai/o3-pro" + }, + { + "provider": "openai", + "model": "gpt-5-pro-2025-10-06", + "canonical": "openai/gpt-5-pro" + }, + { + "provider": "openai", + "model": "o3", + "canonical": "openai/o3" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo-instruct", + "canonical": "openai/gpt-3.5-turbo-instruct" + }, + { + "provider": "openai", + "model": "gpt-4o-mini-search-preview-2025-03-11", + "canonical": "openai/gpt-4o-mini-search" + }, + { + "provider": "openai", + "model": "gpt-5-mini", + "canonical": "openai/gpt-5-mini" + }, + { + "provider": "openai", + "model": "gpt-4-0613", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "o3-deep-research", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openai", + "model": "gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openai", + "model": "gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" + }, + { + "provider": "openai", + "model": "gpt-5-codex", + "canonical": "openai/gpt-5-codex" + }, + { + "provider": "openai", + "model": "gpt-4.1-mini", + "canonical": "openai/gpt-4.1-mini" + }, + { + "provider": "openai", + "model": "gpt-4o-search-preview", + "canonical": "openai/gpt-4o-search" + }, + { + "provider": "openai", + "model": "gpt-4-turbo-2024-04-09", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openai", + "model": "o3-mini", + "canonical": "openai/o3-mini" + }, + { + "provider": "openai", + "model": "o3-mini-2025-01-31", + "canonical": "openai/o3-mini" + }, + { + "provider": "openai", + "model": "gpt-5.1", + "canonical": "openai/gpt-5.1" + }, + { + "provider": "openai", + "model": "gpt-4-1106-preview", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openai", + "model": "gpt-4", + "canonical": "openai/gpt-4" + }, + { + "provider": "openai", + "model": "gpt-5-nano-2025-08-07", + "canonical": "openai/gpt-5-nano" + }, + { + "provider": "openai", + "model": "gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku-20241022", + "canonical": "anthropic/claude-3.5-haiku" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2-exp", + "canonical": "deepseek/deepseek" + }, + { + "provider": "openrouter", + "model": "google/gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-24b-instruct-2501", + "canonical": "mistralai/mistral-small-24b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus", + "canonical": "qwen/qwen-plus" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-thinking", + "canonical": "qwen/qwen3-next-80b-a3b-thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwq-32b", + "canonical": "qwen/qwq-32b" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-audio-preview", + "canonical": "openai/gpt-4o-audio" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28:thinking", + "canonical": "qwen/qwen-plus-2025-07-28:thinking" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-thinking", + "canonical": "qwen/qwen3-vl-235b-a22b-thinking" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2407", + "canonical": "mistralai/mistral-large" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-nano", + "canonical": "openai/gpt-5-nano" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-codex", + "canonical": "openai/gpt-5-codex" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini-high", + "canonical": "openai/o4-mini-high" + }, + { + "provider": "openrouter", + "model": "openai/o3-mini", + "canonical": "openai/o3-mini" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.1-24b-instruct", + "canonical": "mistralai/mistral-small-3.1-24b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/codestral-2508", + "canonical": "mistralai/codestral" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-8b-2512", + "canonical": "mistralai/ministral-8b" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4.1-nano", + "canonical": "openai/gpt-4.1-nano" + }, + { + "provider": "openrouter", + "model": "qwen/qwen-max", + "canonical": "qwen/qwen-max" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-instruct-2507", + "canonical": "qwen/qwen3-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-tiny", + "canonical": "mistralai/mistral-tiny" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2512", + "canonical": "mistralai/mistral-large" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-nemo", + "canonical": "mistralai/mistral-nemo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder", + "canonical": "qwen/qwen3-coder" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-thinking", + "canonical": "qwen/qwen3-vl-30b-a3b-thinking" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-4", + "canonical": "x-ai/grok-4" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3-70b-instruct", + "canonical": "meta-llama/llama-3-70b-instruct" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-3.1-405b-instruct", + "canonical": "meta-llama/llama-3.1-405b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-next-80b-a3b-instruct", + "canonical": "qwen/qwen3-next-80b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1-0528", + "canonical": "deepseek/deepseek-r1" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-opus-4.5", + "canonical": "anthropic/claude-opus-4.5" + }, + { + "provider": "openrouter", + "model": "openai/o3", + "canonical": "openai/o3" + }, + { + "provider": "openrouter", + "model": "mistralai/pixtral-12b", + "canonical": "mistralai/pixtral-12b" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview-05-06", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-maverick", + "canonical": "meta-llama/llama-4-maverick" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-thinking", + "canonical": "qwen/qwen3-vl-8b-thinking" + }, + { + "provider": "openrouter", + "model": "ai21/jamba-mini-1.7", + "canonical": "ai21/jamba-mini-1.7" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-small-3.2-24b-instruct", + "canonical": "mistralai/mistral-small-3.2-24b-instruct" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5", + "canonical": "openai/gpt-5" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-120b:exacto", + "canonical": "openai/gpt-oss-120b" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-32b", + "canonical": "qwen/qwen3-32b" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1", + "canonical": "openai/gpt-5.1" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-2507", + "canonical": "qwen/qwen3-235b-a22b" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-3b", + "canonical": "mistralai/ministral-3b" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-4.1-fast", + "canonical": "x-ai/grok-4.1-fast" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-image-mini", + "canonical": "openai/gpt-5-image-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1-chat", + "canonical": "openai/gpt-5.1-chat" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-30b-a3b-instruct", + "canonical": "qwen/qwen3-coder-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3-haiku", + "canonical": "anthropic/claude-3-haiku" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-medium", + "canonical": "mistralai/devstral-medium" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-30b-a3b-instruct", + "canonical": "qwen/qwen3-vl-30b-a3b-instruct" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-max", + "canonical": "qwen/qwen3-max" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-r1-distill-llama-70b", + "canonical": "deepseek/deepseek-r1-distill-llama-70b" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-medium-3.1", + "canonical": "mistralai/mistral-medium-3.1" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-8b", + "canonical": "qwen/qwen3-8b" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-haiku-4.5", + "canonical": "anthropic/claude-haiku-4.5" + }, + { + "provider": "openrouter", + "model": "google/gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { - "provider": "anthropic", - "model": "claude-sonnet-4-20250514", - "canonical": "anthropic/claude-sonnet-4" + "provider": "openrouter", + "model": "google/gemini-2.0-flash-001", + "canonical": "google/gemini-2.0-flash" }, { - "provider": "anthropic", - "model": "claude-opus-4-1-20250805", - "canonical": "anthropic/claude-opus-4.1" + "provider": "openrouter", + "model": "mistralai/ministral-14b-2512", + "canonical": "mistralai/ministral-14b" }, { - "provider": "anthropic", - "model": "claude-3-opus-20240229", - "canonical": "anthropic/claude-3-opus" + "provider": "openrouter", + "model": "google/gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { - "provider": "anthropic", - "model": "claude-haiku-4-5-20251001", - "canonical": "anthropic/claude-haiku-4.5" + "provider": "openrouter", + "model": "openai/gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { - "provider": "anthropic", - "model": "claude-sonnet-4-5-20250929", + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo", + "canonical": "openai/gpt-3.5-turbo" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-max", + "canonical": "openai/gpt-5.1-codex-max" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5.1-codex-mini", + "canonical": "openai/gpt-5.1-codex-mini" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4.5", "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "anthropic", - "model": "claude-3-5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku" + "provider": "openrouter", + "model": "openai/gpt-5.1-codex", + "canonical": "openai/gpt-5.1-codex" }, { - "provider": "anthropic", - "model": "claude-opus-4-20250514", + "provider": "openrouter", + "model": "mistralai/pixtral-large-2411", + "canonical": "mistralai/pixtral-large" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-opus-4", "canonical": "anthropic/claude-opus-4" }, { - "provider": "anthropic", - "model": "claude-3-7-sonnet-20250219", - "canonical": "anthropic/claude-3.7-sonnet" + "provider": "openrouter", + "model": "openai/gpt-oss-120b", + "canonical": "openai/gpt-oss-120b" }, { - "provider": "anthropic", - "model": "claude-3-haiku-20240307", - "canonical": "anthropic/claude-3-haiku" + "provider": "openrouter", + "model": "mistralai/voxtral-small-24b-2507", + "canonical": "mistralai/voxtral-small-24b" }, { - "provider": "openai", - "model": "gpt-4o", - "canonical": "openai/gpt-4o" + "provider": "openrouter", + "model": "qwen/qwen-2.5-72b-instruct", + "canonical": "qwen/qwen-2.5-72b-instruct" }, { - "provider": "openai", - "model": "gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "provider": "openrouter", + "model": "mistralai/mixtral-8x7b-instruct", + "canonical": "mistralai/mixtral-8x7b-instruct" }, { - "provider": "openai", - "model": "gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "provider": "openrouter", + "model": "qwen/qwen3-coder-flash", + "canonical": "qwen/qwen3-coder-flash" }, { - "provider": "openai", - "model": "gpt-5.1-codex-max", - "canonical": "openai/gpt-5.1-codex-max" + "provider": "openrouter", + "model": "x-ai/grok-4-fast", + "canonical": "x-ai/grok-4-fast" }, { - "provider": "openai", - "model": "o4-mini", - "canonical": "openai/o4-mini" + "provider": "openrouter", + "model": "deepseek/deepseek-r1", + "canonical": "deepseek/deepseek-r1" }, { - "provider": "openai", - "model": "gpt-4-0314", - "canonical": "openai/gpt-4" + "provider": "openrouter", + "model": "meta-llama/llama-3.1-70b-instruct", + "canonical": "meta-llama/llama-3.1-70b-instruct" }, { - "provider": "openai", - "model": "gpt-5.1-2025-11-13", - "canonical": "openai/gpt-5.1" + "provider": "openrouter", + "model": "qwen/qwen-vl-max", + "canonical": "qwen/qwen-vl-max" }, { - "provider": "openai", - "model": "o3-mini", - "canonical": "openai/o3-mini" + "provider": "openrouter", + "model": "deepseek/deepseek-v3.2", + "canonical": "deepseek/deepseek" }, { - "provider": "openai", - "model": "o3-mini-2025-01-31", - "canonical": "openai/o3-mini" + "provider": "openrouter", + "model": "deepseek/deepseek-chat", + "canonical": "deepseek/deepseek-chat" }, { - "provider": "openai", - "model": "gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "provider": "openrouter", + "model": "meta-llama/llama-3-8b-instruct", + "canonical": "meta-llama/llama-3-8b-instruct" }, { - "provider": "openai", - "model": "gpt-4-turbo-2024-04-09", + "provider": "openrouter", + "model": "mistralai/mistral-medium-3", + "canonical": "mistralai/mistral-medium-3" + }, + { + "provider": "openrouter", + "model": "google/gemini-2.0-flash-lite-001", + "canonical": "google/gemini-2.0-flash-lite" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-turbo", "canonical": "openai/gpt-4-turbo" }, { - "provider": "openai", - "model": "gpt-4o-audio-preview-2024-12-17", - "canonical": "openai/gpt-4o-audio" + "provider": "openrouter", + "model": "openai/gpt-4-0314", + "canonical": "openai/gpt-4" }, { - "provider": "openai", - "model": "gpt-4.1-mini-2025-04-14", + "provider": "openrouter", + "model": "openai/gpt-4.1-mini", "canonical": "openai/gpt-4.1-mini" }, { - "provider": "openai", - "model": "gpt-5-codex", - "canonical": "openai/gpt-5-codex" + "provider": "openrouter", + "model": "anthropic/claude-3.7-sonnet:thinking", + "canonical": "anthropic/claude-3.7-sonnet:thinking" }, { - "provider": "openai", - "model": "gpt-5-pro", + "provider": "openrouter", + "model": "openai/gpt-oss-safeguard-20b", + "canonical": "openai/gpt-oss-safeguard-20b" + }, + { + "provider": "openrouter", + "model": "openai/o3-mini-high", + "canonical": "openai/o3-mini-high" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder-plus", + "canonical": "qwen/qwen3-coder-plus" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-coder:exacto", + "canonical": "qwen/qwen3-coder" + }, + { + "provider": "openrouter", + "model": "openai/gpt-5-pro", "canonical": "openai/gpt-5-pro" }, { - "provider": "openai", - "model": "gpt-3.5-turbo-0125", + "provider": "openrouter", + "model": "openai/gpt-4-1106-preview", + "canonical": "openai/gpt-4" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-vl-8b-instruct", + "canonical": "qwen/qwen3-vl-8b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large-2411", + "canonical": "mistralai/mistral-large" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-3", + "canonical": "x-ai/grok-3" + }, + { + "provider": "openrouter", + "model": "x-ai/grok-code-fast-1", + "canonical": "x-ai/grok-code-fast-1" + }, + { + "provider": "openrouter", + "model": "mistralai/mixtral-8x22b-instruct", + "canonical": "mistralai/mixtral-8x22b-instruct" + }, + { + "provider": "openrouter", + "model": "openai/gpt-oss-20b", + "canonical": "openai/gpt-oss-20b" + }, + { + "provider": "openrouter", + "model": "meta-llama/llama-4-scout", + "canonical": "meta-llama/llama-4-scout" + }, + { + "provider": "openrouter", + "model": "mistralai/devstral-small", + "canonical": "mistralai/devstral-small" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3-0324", + "canonical": "deepseek/deepseek-chat" + }, + { + "provider": "openrouter", + "model": "mistralai/ministral-8b", + "canonical": "mistralai/ministral-8b" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-saba", + "canonical": "mistralai/mistral-saba" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o-2024-08-06", + "canonical": "openai/gpt-4o" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4o:extended", + "canonical": "openai/gpt-4o:extended" + }, + { + "provider": "openrouter", + "model": "openai/o3-deep-research", + "canonical": "openai/o3-deep-research" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3-opus", + "canonical": "anthropic/claude-3-opus" + }, + { + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-0613", "canonical": "openai/gpt-3.5-turbo" }, { - "provider": "openai", - "model": "gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "provider": "openrouter", + "model": "meta-llama/llama-3.3-70b-instruct", + "canonical": "meta-llama/llama-3.3-70b-instruct" + }, + { + "provider": "openrouter", + "model": "mistralai/mistral-large", + "canonical": "mistralai/mistral-large" + }, + { + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b-thinking-2507", + "canonical": "qwen/qwen3-235b-a22b-thinking" + }, + { + "provider": "openrouter", + "model": "cohere/command-r-plus-08-2024", + "canonical": "cohere/command-r-plus-08" + }, + { + "provider": "openrouter", + "model": "openai/o4-mini", + "canonical": "openai/o4-mini" + }, + { + "provider": "openrouter", + "model": "openai/gpt-4-turbo-preview", + "canonical": "openai/gpt-4-turbo" + }, + { + "provider": "openrouter", + "model": "anthropic/claude-3.7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" + }, + { + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus", + "canonical": "deepseek/deepseek-v3.1-terminus" }, { - "provider": "openai", - "model": "gpt-5.1", - "canonical": "openai/gpt-5.1" + "provider": "openrouter", + "model": "openai/gpt-4.1", + "canonical": "openai/gpt-4.1" }, { - "provider": "openai", - "model": "gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "provider": "openrouter", + "model": "google/gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { - "provider": "openai", - "model": "o3-2025-04-16", - "canonical": "openai/o3" + "provider": "openrouter", + "model": "openai/o1", + "canonical": "openai/o1" }, { - "provider": "openai", - "model": "gpt-5-2025-08-07", - "canonical": "openai/gpt-5" + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b", + "canonical": "qwen/qwen3-30b-a3b" }, { - "provider": "openai", - "model": "gpt-4-0613", - "canonical": "openai/gpt-4" + "provider": "openrouter", + "model": "x-ai/grok-3-mini", + "canonical": "x-ai/grok-3-mini" }, { - "provider": "openai", - "model": "gpt-4o-audio-preview-2025-06-03", - "canonical": "openai/gpt-4o-audio" + "provider": "openrouter", + "model": "ai21/jamba-large-1.7", + "canonical": "ai21/jamba-large-1.7" }, { - "provider": "openai", - "model": "gpt-4.1-nano-2025-04-14", - "canonical": "openai/gpt-4.1-nano" + "provider": "openrouter", + "model": "openai/gpt-5-image", + "canonical": "openai/gpt-5-image" }, { - "provider": "openai", - "model": "chatgpt-4o-latest", - "canonical": "openai/chatgpt-4o-latest" + "provider": "openrouter", + "model": "cohere/command-r-08-2024", + "canonical": "cohere/command-r-08" }, { - "provider": "openai", - "model": "gpt-3.5-turbo-instruct-0914", - "canonical": "openai/gpt-3.5-turbo-instruct" + "provider": "openrouter", + "model": "mistralai/ministral-3b-2512", + "canonical": "mistralai/ministral-3b" }, { - "provider": "openai", - "model": "gpt-4", - "canonical": "openai/gpt-4" + "provider": "openrouter", + "model": "openai/codex-mini", + "canonical": "openai/codex-mini" }, { - "provider": "openai", - "model": "o1", - "canonical": "openai/o1" + "provider": "openrouter", + "model": "deepseek/deepseek-chat-v3.1", + "canonical": "deepseek/deepseek-chat" }, { - "provider": "openai", - "model": "gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "provider": "openrouter", + "model": "qwen/qwen-plus-2025-07-28", + "canonical": "qwen/qwen-plus" }, { - "provider": "openai", - "model": "gpt-5-nano-2025-08-07", - "canonical": "openai/gpt-5-nano" + "provider": "openrouter", + "model": "mistralai/mistral-7b-instruct", + "canonical": "mistralai/mistral-7b-instruct" }, { - "provider": "openai", - "model": "o1-pro", - "canonical": "openai/o1-pro" + "provider": "openrouter", + "model": "qwen/qwen3-14b", + "canonical": "qwen/qwen3-14b" }, { - "provider": "openai", - "model": "gpt-5-mini", - "canonical": "openai/gpt-5-mini" + "provider": "openrouter", + "model": "google/gemini-2.5-pro-preview", + "canonical": "google/gemini-2.5-pro" }, { - "provider": "openai", - "model": "gpt-4.1", - "canonical": "openai/gpt-4.1" + "provider": "openrouter", + "model": "anthropic/claude-opus-4.1", + "canonical": "anthropic/claude-opus-4.1" }, { - "provider": "openai", - "model": "gpt-4o-search-preview", - "canonical": "openai/gpt-4o-search" + "provider": "openrouter", + "model": "meta-llama/llama-3.2-3b-instruct", + "canonical": "meta-llama/llama-3.2-3b-instruct" }, { - "provider": "openai", - "model": "gpt-4.1-2025-04-14", - "canonical": "openai/gpt-4.1" + "provider": "openrouter", + "model": "qwen/qwen3-235b-a22b", + "canonical": "qwen/qwen3-235b-a22b" }, { - "provider": "openai", - "model": "gpt-5", - "canonical": "openai/gpt-5" + "provider": "openrouter", + "model": "qwen/qwen-turbo", + "canonical": "qwen/qwen-turbo" }, { - "provider": "openai", - "model": "o1-2024-12-17", - "canonical": "openai/o1" + "provider": "openrouter", + "model": "qwen/qwen3-vl-235b-a22b-instruct", + "canonical": "qwen/qwen3-vl-235b-a22b-instruct" }, { - "provider": "openai", - "model": "gpt-4o-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-search" + "provider": "openrouter", + "model": "deepseek/deepseek-v3.1-terminus:exacto", + "canonical": "deepseek/deepseek-v3.1-terminus" }, { - "provider": "openai", - "model": "gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "provider": "openrouter", + "model": "meta-llama/llama-3.1-8b-instruct", + "canonical": "meta-llama/llama-3.1-8b-instruct" }, { - "provider": "openai", - "model": "gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "provider": "openrouter", + "model": "openai/o3-pro", + "canonical": "openai/o3-pro" }, { - "provider": "openai", - "model": "o3", - "canonical": "openai/o3" + "provider": "openrouter", + "model": "qwen/qwen3-30b-a3b-thinking-2507", + "canonical": "qwen/qwen3-30b-a3b-thinking" }, { - "provider": "openai", - "model": "gpt-4-0125-preview", + "provider": "openrouter", + "model": "openai/gpt-4", "canonical": "openai/gpt-4" }, { - "provider": "openai", - "model": "o3-pro-2025-06-10", - "canonical": "openai/o3-pro" + "provider": "openrouter", + "model": "openai/o4-mini-deep-research", + "canonical": "openai/o4-mini-deep-research" }, { - "provider": "openai", - "model": "o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "provider": "openrouter", + "model": "anthropic/claude-3.5-haiku", + "canonical": "anthropic/claude-3.5-haiku" }, { - "provider": "openai", - "model": "gpt-3.5-turbo-1106", - "canonical": "openai/gpt-3.5-turbo" + "provider": "openrouter", + "model": "openai/gpt-3.5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { - "provider": "openai", - "model": "gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "provider": "openrouter", + "model": "openai/gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { - "provider": "openai", - "model": "gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "provider": "databricks", + "model": "gpt-3-5-turbo", + "canonical": "openai/gpt-3.5-turbo" }, { - "provider": "openai", - "model": "gpt-4o-mini-search-preview-2025-03-11", - "canonical": "openai/gpt-4o-mini-search" + "provider": "databricks", + "model": "goose-o1", + "canonical": "openai/o1" }, { - "provider": "openai", - "model": "gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "provider": "databricks", + "model": "raml-claude-opus-4-5", + "canonical": "anthropic/claude-opus-4.5" }, { - "provider": "openai", - "model": "o4-mini-deep-research-2025-06-26", - "canonical": "openai/o4-mini-deep-research" + "provider": "databricks", + "model": "gpt-4o-2024-11-20", + "canonical": "openai/gpt-4o" }, { - "provider": "openai", - "model": "gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "provider": "databricks", + "model": "o1-preview", + "canonical": "openai/o1" }, { - "provider": "openai", - "model": "o3-deep-research", - "canonical": "openai/o3-deep-research" + "provider": "databricks", + "model": "databricks-claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openai", - "model": "gpt-5-mini-2025-08-07", - "canonical": "openai/gpt-5-mini" + "provider": "databricks", + "model": "goose-claude-4-5-haiku", + "canonical": "anthropic/claude-haiku-4.5" }, { - "provider": "openai", - "model": "gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "provider": "databricks", + "model": "goose-claude-4-opus", + "canonical": "anthropic/claude-opus-4" }, { - "provider": "openai", - "model": "gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "provider": "databricks", + "model": "gpt-4o-mini", + "canonical": "openai/gpt-4o-mini" }, { - "provider": "openai", - "model": "o4-mini-2025-04-16", - "canonical": "openai/o4-mini" + "provider": "databricks", + "model": "claude-3-7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" }, { - "provider": "openai", - "model": "gpt-3.5-turbo-instruct", - "canonical": "openai/gpt-3.5-turbo-instruct" + "provider": "databricks", + "model": "goose-claude-4-sonnet", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openai", - "model": "o1-pro-2025-03-19", - "canonical": "openai/o1-pro" + "provider": "databricks", + "model": "gpt-4o-mini-2024-07-18", + "canonical": "openai/gpt-4o-mini" }, { - "provider": "openai", - "model": "gpt-4o-mini-search-preview", - "canonical": "openai/gpt-4o-mini-search" + "provider": "databricks", + "model": "headless-goose-claude-4-sonnet", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openai", - "model": "gpt-5-pro-2025-10-06", - "canonical": "openai/gpt-5-pro" + "provider": "databricks", + "model": "goose-gemini-3-pro", + "canonical": "google/gemini-3-pro" }, { - "provider": "openai", - "model": "gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "provider": "databricks", + "model": "goose-gemini-2-5-pro", + "canonical": "google/gemini-2.5-pro" }, { - "provider": "openai", - "model": "o3-deep-research-2025-06-26", - "canonical": "openai/o3-deep-research" + "provider": "databricks", + "model": "ng-tools-gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { - "provider": "openai", - "model": "o3-pro", - "canonical": "openai/o3-pro" + "provider": "databricks", + "model": "o1", + "canonical": "openai/o1" }, { - "provider": "openai", - "model": "gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "provider": "databricks", + "model": "databricks-gpt-5", + "canonical": "openai/gpt-5" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview-05-06", - "canonical": "google/gemini-2.5-pro" + "provider": "databricks", + "model": "databricks-claude-sonnet-4-5", + "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "openrouter", - "model": "openai/codex-mini", - "canonical": "openai/codex-mini" + "provider": "databricks", + "model": "databricks-gpt-oss-20b", + "canonical": "openai/gpt-oss-20b" }, { - "provider": "openrouter", - "model": "openai/o3-pro", - "canonical": "openai/o3-pro" + "provider": "databricks", + "model": "kgoose-cashapp-claude-4-sonnet", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openrouter", - "model": "google/gemini-2.0-flash-lite-001", - "canonical": "google/gemini-2.0-flash-lite" + "provider": "databricks", + "model": "gemini-2-5-flash", + "canonical": "google/gemini-2.5-flash" }, { - "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku-20241022", - "canonical": "anthropic/claude-3.5-haiku" + "provider": "databricks", + "model": "gpt-3-5-turbo-instruct", + "canonical": "openai/gpt-3.5-turbo-instruct" }, { - "provider": "openrouter", - "model": "anthropic/claude-3-haiku", - "canonical": "anthropic/claude-3-haiku" + "provider": "databricks", + "model": "claude-4-opus", + "canonical": "anthropic/claude-opus-4" }, { - "provider": "openrouter", - "model": "openai/gpt-4o-audio-preview", - "canonical": "openai/gpt-4o-audio" + "provider": "databricks", + "model": "gemini-2-5-pro", + "canonical": "google/gemini-2.5-pro" }, { - "provider": "openrouter", - "model": "anthropic/claude-haiku-4.5", - "canonical": "anthropic/claude-haiku-4.5" + "provider": "databricks", + "model": "claude-3-5-haiku", + "canonical": "anthropic/claude-3.5-haiku" }, { - "provider": "openrouter", - "model": "openai/gpt-5-mini", + "provider": "databricks", + "model": "code-review-gpt-5-mini", "canonical": "openai/gpt-5-mini" }, { - "provider": "openrouter", - "model": "openai/o4-mini-deep-research", - "canonical": "openai/o4-mini-deep-research" + "provider": "databricks", + "model": "o1-2024-12-17", + "canonical": "openai/o1" }, { - "provider": "openrouter", - "model": "openai/gpt-5-codex", - "canonical": "openai/gpt-5-codex" + "provider": "databricks", + "model": "gpt-4", + "canonical": "openai/gpt-4" }, { - "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet:thinking", - "canonical": "anthropic/claude-3.7-sonnet:thinking" + "provider": "databricks", + "model": "kgoose-gpt-4-1-nano", + "canonical": "openai/gpt-4.1-nano" }, { - "provider": "openrouter", - "model": "openai/gpt-5.1-chat", - "canonical": "openai/gpt-5.1-chat" + "provider": "databricks", + "model": "goose-claude-4-5-opus", + "canonical": "anthropic/claude-opus-4.5" }, { - "provider": "openrouter", - "model": "openai/o3-mini-high", - "canonical": "openai/o3-mini-high" + "provider": "databricks", + "model": "raml-claude-sonnet-4-5", + "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "provider": "databricks", + "model": "kgoose-gpt-4-1-mini", + "canonical": "openai/gpt-4.1-mini" }, { - "provider": "openrouter", - "model": "openai/gpt-5-image", - "canonical": "openai/gpt-5-image" + "provider": "databricks", + "model": "databricks-gemini-3-pro", + "canonical": "google/gemini-3-pro" }, { - "provider": "openrouter", - "model": "openai/gpt-oss-120b:exacto", + "provider": "databricks", + "model": "databricks-claude-3-7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" + }, + { + "provider": "databricks", + "model": "databricks-gpt-oss-120b", "canonical": "openai/gpt-oss-120b" }, { - "provider": "openrouter", - "model": "anthropic/claude-3.5-sonnet", - "canonical": "anthropic/claude-3.5-sonnet" + "provider": "databricks", + "model": "headless-goose-o3-mini", + "canonical": "openai/o3-mini" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" + "provider": "databricks", + "model": "goose-gpt-4-1", + "canonical": "openai/gpt-4.1" }, { - "provider": "openrouter", - "model": "openai/gpt-4o-2024-11-20", - "canonical": "openai/gpt-4o" + "provider": "databricks", + "model": "kgoose-gpt-5", + "canonical": "openai/gpt-5" }, { - "provider": "openrouter", - "model": "openai/gpt-4", - "canonical": "openai/gpt-4" + "provider": "databricks", + "model": "databricks-gemini-2-5-pro", + "canonical": "google/gemini-2.5-pro" }, { - "provider": "openrouter", - "model": "google/gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" + "provider": "databricks", + "model": "code-review-gpt-5", + "canonical": "openai/gpt-5" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-pro-preview", - "canonical": "google/gemini-2.5-pro" + "provider": "databricks", + "model": "goose-claude-4-sonnet-bedrock", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openrouter", - "model": "openai/gpt-4o", + "provider": "databricks", + "model": "gpt-4o", "canonical": "openai/gpt-4o" }, { - "provider": "openrouter", - "model": "openai/gpt-5", - "canonical": "openai/gpt-5" + "provider": "databricks", + "model": "o3", + "canonical": "openai/o3" }, { - "provider": "openrouter", - "model": "openai/o1", - "canonical": "openai/o1" + "provider": "databricks", + "model": "kgoose-gpt-4o", + "canonical": "openai/gpt-4o" }, { - "provider": "openrouter", - "model": "openai/gpt-4o-2024-08-06", - "canonical": "openai/gpt-4o" + "provider": "databricks", + "model": "kgoose-gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { - "provider": "openrouter", - "model": "google/gemini-3-pro-preview", - "canonical": "google/gemini-3-pro" + "provider": "databricks", + "model": "databricks-gpt-5-mini", + "canonical": "openai/gpt-5-mini" }, { - "provider": "openrouter", - "model": "openai/gpt-4-turbo-preview", - "canonical": "openai/gpt-4-turbo" + "provider": "databricks", + "model": "kgoose-cashapp-claude-sonnet-4-5", + "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "openrouter", - "model": "openai/o3-deep-research", - "canonical": "openai/o3-deep-research" + "provider": "databricks", + "model": "kgoose-claude-haiku-4-5", + "canonical": "anthropic/claude-haiku-4.5" }, { - "provider": "openrouter", - "model": "openai/o3", - "canonical": "openai/o3" + "provider": "databricks", + "model": "ng-tools-claude-sonnet-3-7", + "canonical": "anthropic/claude-3.7-sonnet" }, { - "provider": "openrouter", - "model": "anthropic/claude-opus-4.5", - "canonical": "anthropic/claude-opus-4.5" + "provider": "databricks", + "model": "gpt-4o-2024-05-13", + "canonical": "openai/gpt-4o" }, { - "provider": "openrouter", - "model": "anthropic/claude-3.7-sonnet", - "canonical": "anthropic/claude-3.7-sonnet" + "provider": "databricks", + "model": "gpt-4-turbo-2024-04-09", + "canonical": "openai/gpt-4-turbo" }, { - "provider": "openrouter", - "model": "anthropic/claude-3.5-haiku", - "canonical": "anthropic/claude-3.5-haiku" + "provider": "databricks", + "model": "databricks-gemini-2-5-flash", + "canonical": "google/gemini-2.5-flash" }, { - "provider": "openrouter", - "model": "openai/gpt-5.1-codex-mini", - "canonical": "openai/gpt-5.1-codex-mini" + "provider": "databricks", + "model": "o3-mini", + "canonical": "openai/o3-mini" }, { - "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-16k", - "canonical": "openai/gpt-3.5-turbo-16k" + "provider": "databricks", + "model": "kgoose-claude-4-sonnet", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openrouter", - "model": "openai/gpt-4o:extended", - "canonical": "openai/gpt-4o:extended" + "provider": "databricks", + "model": "goose-o3", + "canonical": "openai/o3" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "provider": "databricks", + "model": "gpt-4-1-nano", + "canonical": "openai/gpt-4.1-nano" }, { - "provider": "openrouter", - "model": "openai/gpt-5.1-codex-max", - "canonical": "openai/gpt-5.1-codex-max" + "provider": "databricks", + "model": "ng-tools-claude-opus-4-1", + "canonical": "anthropic/claude-opus-4.1" }, { - "provider": "openrouter", - "model": "openai/gpt-5-nano", - "canonical": "openai/gpt-5-nano" + "provider": "databricks", + "model": "databricks-gpt-5-1", + "canonical": "openai/gpt-5.1" }, { - "provider": "openrouter", - "model": "anthropic/claude-opus-4.1", - "canonical": "anthropic/claude-opus-4.1" + "provider": "databricks", + "model": "gpt-4-0125-preview", + "canonical": "openai/gpt-4" }, { - "provider": "openrouter", - "model": "openai/gpt-oss-safeguard-20b", - "canonical": "openai/gpt-oss-safeguard-20b" + "provider": "databricks", + "model": "databricks-claude-opus-4-5", + "canonical": "anthropic/claude-opus-4.5" }, { - "provider": "openrouter", - "model": "openai/gpt-4-turbo", - "canonical": "openai/gpt-4-turbo" + "provider": "databricks", + "model": "claude-3-5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" }, { - "provider": "openrouter", - "model": "openai/gpt-5.1-codex", - "canonical": "openai/gpt-5.1-codex" + "provider": "databricks", + "model": "gpt-4-1-mini", + "canonical": "openai/gpt-4.1-mini" }, { - "provider": "openrouter", - "model": "anthropic/claude-sonnet-4.5", - "canonical": "anthropic/claude-sonnet-4.5" + "provider": "databricks", + "model": "kgoose-gemini-2-5-flash", + "canonical": "google/gemini-2.5-flash" }, { - "provider": "openrouter", - "model": "openai/o3-mini", - "canonical": "openai/o3-mini" + "provider": "databricks", + "model": "gpt-3-5-turbo-0125", + "canonical": "openai/gpt-3.5-turbo" }, { - "provider": "openrouter", - "model": "openai/gpt-4-0314", - "canonical": "openai/gpt-4" + "provider": "databricks", + "model": "gpt-4-turbo", + "canonical": "openai/gpt-4-turbo" }, { - "provider": "openrouter", - "model": "anthropic/claude-opus-4", - "canonical": "anthropic/claude-opus-4" + "provider": "databricks", + "model": "kgoose-o3", + "canonical": "openai/o3" }, { - "provider": "openrouter", - "model": "openai/gpt-4-1106-preview", - "canonical": "openai/gpt-4" + "provider": "databricks", + "model": "gemini-2-5-pro-exp", + "canonical": "google/gemini-2.5-pro" }, { - "provider": "openrouter", - "model": "openai/gpt-4.1-nano", - "canonical": "openai/gpt-4.1-nano" + "provider": "databricks", + "model": "gemini-2-5-flash-latest", + "canonical": "google/gemini-2.5-flash" }, { - "provider": "openrouter", - "model": "openai/gpt-oss-120b", - "canonical": "openai/gpt-oss-120b" + "provider": "databricks", + "model": "goose-claude-3-7-sonnet", + "canonical": "anthropic/claude-3.7-sonnet" }, { - "provider": "openrouter", - "model": "openai/gpt-3.5-turbo-0613", - "canonical": "openai/gpt-3.5-turbo" + "provider": "databricks", + "model": "goose-gpt-4o", + "canonical": "openai/gpt-4o" }, { - "provider": "openrouter", - "model": "openai/o4-mini", - "canonical": "openai/o4-mini" + "provider": "databricks", + "model": "goose-gpt-5", + "canonical": "openai/gpt-5" + }, + { + "provider": "databricks", + "model": "gemini-2-0-flash", + "canonical": "google/gemini-2.0-flash" }, { - "provider": "openrouter", - "model": "openai/gpt-4.1", - "canonical": "openai/gpt-4.1" + "provider": "databricks", + "model": "kgoose-claude-sonnet-4-5", + "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "openrouter", - "model": "openai/gpt-5-pro", - "canonical": "openai/gpt-5-pro" + "provider": "databricks", + "model": "gpt-4-1-2025-04-14", + "canonical": "openai/gpt-4.1" }, { - "provider": "openrouter", - "model": "anthropic/claude-sonnet-4", - "canonical": "anthropic/claude-sonnet-4" + "provider": "databricks", + "model": "gpt-3-5-turbo-16k", + "canonical": "openai/gpt-3.5-turbo-16k" }, { - "provider": "openrouter", - "model": "anthropic/claude-3-opus", - "canonical": "anthropic/claude-3-opus" + "provider": "databricks", + "model": "ng-tools-claude-opus-4", + "canonical": "anthropic/claude-opus-4" }, { - "provider": "openrouter", - "model": "openai/gpt-oss-20b", - "canonical": "openai/gpt-oss-20b" + "provider": "databricks", + "model": "databricks-gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { - "provider": "openrouter", - "model": "google/gemini-2.0-flash-001", - "canonical": "google/gemini-2.0-flash" + "provider": "databricks", + "model": "databricks-claude-opus-4-1", + "canonical": "anthropic/claude-opus-4.1" }, { - "provider": "openrouter", - "model": "openai/gpt-3.5-turbo", - "canonical": "openai/gpt-3.5-turbo" + "provider": "databricks", + "model": "ng-tools-claude-sonnet-4", + "canonical": "anthropic/claude-sonnet-4" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "provider": "databricks", + "model": "gpt-5", + "canonical": "openai/gpt-5" }, { - "provider": "openrouter", - "model": "openai/gpt-4o-mini", - "canonical": "openai/gpt-4o-mini" + "provider": "databricks", + "model": "goose-claude-3-5-sonnet", + "canonical": "anthropic/claude-3.5-sonnet" }, { - "provider": "openrouter", - "model": "openai/gpt-4o-mini-2024-07-18", - "canonical": "openai/gpt-4o-mini" + "provider": "databricks", + "model": "kgoose-gpt-4-1", + "canonical": "openai/gpt-4.1" }, { - "provider": "openrouter", - "model": "openai/gpt-4o-2024-05-13", - "canonical": "openai/gpt-4o" + "provider": "databricks", + "model": "goose-claude-4-5-sonnet", + "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "openrouter", - "model": "openai/gpt-5-image-mini", - "canonical": "openai/gpt-5-image-mini" + "provider": "databricks", + "model": "kgoose-gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { - "provider": "openrouter", - "model": "openai/gpt-5.1", - "canonical": "openai/gpt-5.1" + "provider": "databricks", + "model": "gpt-5-nano", + "canonical": "openai/gpt-5-nano" }, { - "provider": "openrouter", - "model": "openai/gpt-4.1-mini", - "canonical": "openai/gpt-4.1-mini" + "provider": "databricks", + "model": "ng-tools-claude-haiku-3-5", + "canonical": "anthropic/claude-3.5-haiku" }, { - "provider": "openrouter", - "model": "google/gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "provider": "databricks", + "model": "ng-tools-int-claude-sonnet-4-5", + "canonical": "anthropic/claude-sonnet-4.5" }, { - "provider": "openrouter", - "model": "openai/o4-mini-high", - "canonical": "openai/o4-mini-high" + "provider": "google", + "model": "gemini-2.0-flash-lite", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", @@ -5176,17 +6244,17 @@ }, { "provider": "google", - "model": "gemini-2.5-flash-preview-09-2025", - "canonical": "google/gemini-2.5-flash" + "model": "gemini-2.5-pro", + "canonical": "google/gemini-2.5-pro" }, { "provider": "google", - "model": "gemini-2.5-flash-image-preview", - "canonical": "google/gemini-2.5-flash-image" + "model": "gemma-3-12b-it", + "canonical": "google/gemma-3-12b-it" }, { "provider": "google", - "model": "gemini-2.0-flash", + "model": "gemini-2.0-flash-001", "canonical": "google/gemini-2.0-flash" }, { @@ -5196,13 +6264,13 @@ }, { "provider": "google", - "model": "gemini-2.5-flash-image", - "canonical": "google/gemini-2.5-flash-image" + "model": "gemini-3-pro-preview", + "canonical": "google/gemini-3-pro" }, { "provider": "google", - "model": "gemini-3-pro-image-preview", - "canonical": "google/gemini-3-pro-image" + "model": "gemini-2.0-flash", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", @@ -5211,138 +6279,207 @@ }, { "provider": "google", - "model": "gemini-2.5-flash", - "canonical": "google/gemini-2.5-flash" - }, - { - "provider": "google", - "model": "gemini-3-pro-preview", - "canonical": "google/gemini-3-pro" + "model": "gemini-2.5-flash-image", + "canonical": "google/gemini-2.5-flash-image" }, { "provider": "google", - "model": "gemini-2.0-flash-lite", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemma-3-27b-it", + "canonical": "google/gemma-3-27b-it" }, { "provider": "google", - "model": "gemma-3-4b-it", - "canonical": "google/gemma-3-4b-it" + "model": "gemini-2.5-flash-lite", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", - "model": "gemini-2.0-flash-001", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-2.0-flash-lite-preview-02-05", + "canonical": "google/gemini-2.0-flash-lite" }, { "provider": "google", - "model": "gemini-2.0-flash-exp", - "canonical": "google/gemini-2.0-flash" + "model": "gemini-2.5-flash-image-preview", + "canonical": "google/gemini-2.5-flash-image" }, { "provider": "google", - "model": "gemini-2.5-flash-lite-preview-09-2025", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemini-3-pro-image-preview", + "canonical": "google/gemini-3-pro-image" }, { "provider": "google", - "model": "gemini-2.5-pro", - "canonical": "google/gemini-2.5-pro" + "model": "gemini-2.0-flash-exp", + "canonical": "google/gemini-2.0-flash" }, { "provider": "google", - "model": "gemma-3-27b-it", - "canonical": "google/gemma-3-27b-it" + "model": "gemini-2.5-flash", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", - "model": "gemini-2.0-flash-lite-preview-02-05", - "canonical": "google/gemini-2.0-flash-lite" + "model": "gemini-2.5-flash-lite-preview-09-2025", + "canonical": "google/gemini-2.5-flash-lite" }, { "provider": "google", - "model": "gemma-3-12b-it", - "canonical": "google/gemma-3-12b-it" + "model": "gemini-2.5-flash-preview-09-2025", + "canonical": "google/gemini-2.5-flash" }, { "provider": "google", - "model": "gemini-2.5-flash-lite", - "canonical": "google/gemini-2.5-flash-lite" + "model": "gemma-3-4b-it", + "canonical": "google/gemma-3-4b-it" } ], "model_counts": { - "openrouter": 223, - "google": 50, - "openai": 633, "anthropic": 10, + "databricks": 153, "tetrate": 0, - "databricks": 153 + "openai": 633, + "google": 50, + "openrouter": 223 }, "canonical_models_used": [ - "anthropic/claude-sonnet-4.5", - "google/gemini-3-pro-image", - "anthropic/claude-3.7-sonnet", + "mistralai/mistral-large", + "openai/o4-mini-high", + "mistralai/ministral-8b", + "mistralai/mixtral-8x22b-instruct", + "openai/gpt-5-mini", + "google/gemini-2.5-flash-lite", + "openai/chatgpt-4o", + "openai/o3-mini", + "mistralai/mistral-medium-3.1", + "mistralai/ministral-14b", + "mistralai/ministral-3b", + "ai21/jamba-large-1.7", + "qwen/qwen3-32b", + "qwen/qwen-vl-max", + "openai/gpt-4o:extended", + "openai/gpt-4-turbo", + "qwen/qwen3-vl-8b-thinking", + "anthropic/claude-3.7-sonnet:thinking", + "meta-llama/llama-3.1-8b-instruct", + "qwen/qwen3-max", + "qwen/qwen3-30b-a3b", "openai/gpt-4o-search", - "openai/gpt-5-image-mini", - "openai/gpt-3.5-turbo-16k", - "openai/o3-pro", + "mistralai/mixtral-8x7b-instruct", + "google/gemini-3-pro", + "google/gemma-3n-e4b-it", + "qwen/qwen3-235b-a22b-thinking", + "deepseek/deepseek-r1", + "deepseek/deepseek-v3.1-terminus", + "anthropic/claude-3.5-haiku", + "mistralai/mistral-7b-instruct", + "qwen/qwen3-vl-235b-a22b-instruct", + "qwen/qwen3-next-80b-a3b-thinking", + "qwen/qwen-plus-2025-07-28:thinking", "anthropic/claude-3.5-sonnet", - "google/gemini-2.0-flash-lite", - "openai/gpt-5.1-codex-mini", "openai/gpt-4o-mini", - "anthropic/claude-opus-4.5", - "openai/chatgpt-4o-latest", + "qwen/qwen3-coder-30b-a3b-instruct", + "openai/gpt-5-chat", + "qwen/qwen3-8b", + "google/gemma-3-27b-it", "openai/gpt-4o-audio", "openai/gpt-5.1-codex-max", - "openai/gpt-4o-mini-search", - "openai/gpt-5-image", + "mistralai/devstral-medium", + "meta-llama/llama-3.1-70b-instruct", + "qwen/qwen3-next-80b-a3b-instruct", + "x-ai/grok-code-fast-1", + "openai/codex-mini", + "google/gemini-2.0-flash", + "openai/gpt-3.5-turbo", + "openai/gpt-4o", + "qwen/qwen3-235b-a22b", + "deepseek/deepseek", + "x-ai/grok-4", + "qwen/qwen3-coder", + "deepseek/deepseek-chat", + "x-ai/grok-3-mini", + "qwen/qwen3-vl-235b-a22b-thinking", + "openai/gpt-5.1-codex", + "openai/gpt-5-pro", + "mistralai/pixtral-12b", + "anthropic/claude-haiku-4.5", + "qwen/qwen3-14b", + "openai/o3-deep-research", + "meta-llama/llama-3.3-70b-instruct", + "openai/o3", + "openai/o3-pro", + "qwen/qwen3-vl-30b-a3b-thinking", + "qwen/qwen-turbo", "openai/gpt-oss-20b", - "google/gemini-2.5-flash-image", + "x-ai/grok-4-fast", + "anthropic/claude-3.7-sonnet", + "anthropic/claude-sonnet-4", + "mistralai/mistral-tiny", + "anthropic/claude-3-opus", "openai/o4-mini", - "anthropic/claude-haiku-4.5", - "openai/gpt-5-pro", + "qwen/qwen3-vl-30b-a3b-instruct", + "openai/gpt-5.1", + "openai/gpt-3.5-turbo-16k", + "openai/o1-pro", + "qwen/qwen-max", + "openai/o3-mini-high", + "openai/gpt-5-image-mini", + "x-ai/grok-3", + "openai/gpt-5-image", + "anthropic/claude-3-haiku", + "google/gemini-3-pro-image", + "mistralai/voxtral-small-24b", + "qwen/qwen3-coder-flash", + "meta-llama/llama-3-8b-instruct", + "google/gemini-2.5-flash-image", "anthropic/claude-opus-4.1", - "openai/o3", - "openai/gpt-5", - "openai/gpt-4-turbo", - "openai/gpt-4.1-mini", + "cohere/command-r-08", + "ai21/jamba-mini-1.7", + "mistralai/mistral-small-24b-instruct", + "mistralai/mistral-medium-3", "openai/gpt-5-nano", - "openai/gpt-4", - "google/gemma-3-12b-it", - "openai/o3-deep-research", - "anthropic/claude-3.7-sonnet:thinking", - "openai/codex-mini", - "openai/o3-mini-high", - "openai/o3-mini", - "google/gemma-3-27b-it", - "openai/gpt-5-mini", + "openai/o1", + "openai/gpt-3.5-turbo-instruct", + "meta-llama/llama-3-70b-instruct", + "mistralai/mistral-small-3.1-24b-instruct", "openai/o4-mini-deep-research", - "google/gemma-3n-e4b-it", - "google/gemma-3-4b-it", - "openai/gpt-3.5-turbo", - "openai/gpt-oss-safeguard-20b", - "anthropic/claude-3-haiku", - "openai/gpt-4.1", - "openai/gpt-5.1-chat", - "google/gemini-3-pro", - "openai/gpt-4.1-nano", - "openai/o4-mini-high", - "google/gemini-2.0-flash", - "openai/gpt-4o:extended", - "openai/o1-pro", - "anthropic/claude-sonnet-4", + "anthropic/claude-opus-4", + "meta-llama/llama-3.1-405b-instruct", "google/gemini-2.5-flash", - "google/gemini-2.5-flash-lite", - "openai/gpt-5.1", - "anthropic/claude-3-opus", - "anthropic/claude-3.5-haiku", - "openai/gpt-5.1-codex", + "openai/gpt-5", + "openai/gpt-4", + "openai/gpt-oss-120b", + "mistralai/pixtral-large", + "meta-llama/llama-3.2-3b-instruct", + "qwen/qwen3-30b-a3b-thinking", + "mistralai/mistral-saba", + "openai/gpt-4.1-nano", + "qwen/qwen3-coder-plus", + "mistralai/mistral-nemo", + "meta-llama/llama-4-scout", + "qwen/qwen-plus", + "anthropic/claude-sonnet-4.5", + "google/gemini-2.0-flash-lite", + "openai/gpt-5.1-chat", + "openai/gpt-4o-mini-search", + "qwen/qwen3-30b-a3b-instruct", + "deepseek/deepseek-r1-distill-llama-70b", + "qwen/qwq-32b", + "mistralai/devstral-small", + "openai/gpt-5.1-codex-mini", + "mistralai/codestral", "google/gemini-2.5-pro", + "openai/gpt-oss-safeguard-20b", + "qwen/qwen-2.5-72b-instruct", + "openai/gpt-4.1", + "mistralai/mistral-small-3.2-24b-instruct", + "openai/gpt-4.1-mini", + "meta-llama/llama-4-maverick", + "qwen/qwen3-vl-8b-instruct", + "google/gemma-3-12b-it", + "anthropic/claude-opus-4.5", + "google/gemma-3-4b-it", + "cohere/command-r-plus-08", "openai/gpt-5-codex", - "openai/o1", - "openai/gpt-oss-120b", - "openai/gpt-4o", - "anthropic/claude-opus-4", - "openai/gpt-3.5-turbo-instruct" + "x-ai/grok-4.1-fast" ] } \ No newline at end of file From e43cdf1533614f68d7ebda6dad047981ded41e5a Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 10 Dec 2025 18:39:50 -0500 Subject: [PATCH 34/52] more parsing improvements --- .../goose/examples/canonical_model_checker.rs | 1 + .../src/providers/canonical/name_builder.rs | 106 +++++++++++++++++- 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/crates/goose/examples/canonical_model_checker.rs b/crates/goose/examples/canonical_model_checker.rs index 10b02d427bb2..dc57e9fdda0d 100644 --- a/crates/goose/examples/canonical_model_checker.rs +++ b/crates/goose/examples/canonical_model_checker.rs @@ -336,6 +336,7 @@ async fn main() -> Result<()> { ("databricks", "databricks-meta-llama-3-1-70b-instruct"), ("google", "gemini-1.5-pro-002"), ("tetrate", "claude-3-5-sonnet-computer-use"), + ("xai", "grok-code-fast-1"), ]; let mut report = MappingReport::new(); diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index 1f6e79cabe1d..52106046b026 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -113,10 +113,11 @@ fn infer_provider_from_model(model: &str) -> Option<&'static str> { return Some("anthropic"); } - // GPT, O1, O3, ChatGPT models → OpenAI + // GPT, O1, O3, O4, ChatGPT models → OpenAI if model_lower.starts_with("gpt-") || model_lower.starts_with("o1") || model_lower.starts_with("o3") + || model_lower.starts_with("o4") || model_lower.starts_with("chatgpt-") { return Some("openai"); } @@ -132,10 +133,41 @@ fn infer_provider_from_model(model: &str) -> Option<&'static str> { } // Mistral models → mistralai - if model_lower.starts_with("mistral-") || model_lower.contains("mixtral") { + if model_lower.starts_with("mistral") + || model_lower.starts_with("mixtral") + || model_lower.starts_with("codestral") + || model_lower.starts_with("ministral") + || model_lower.starts_with("pixtral") + || model_lower.starts_with("devstral") + || model_lower.starts_with("voxtral") { return Some("mistralai"); } + // DeepSeek models → deepseek + if model_lower.starts_with("deepseek") || model_lower.contains("deepseek") { + return Some("deepseek"); + } + + // Qwen models → qwen + if model_lower.starts_with("qwen") || model_lower.contains("qwen") { + return Some("qwen"); + } + + // Grok models → x-ai + if model_lower.starts_with("grok") || model_lower.contains("grok") { + return Some("x-ai"); + } + + // Jamba models → ai21 + if model_lower.starts_with("jamba") || model_lower.contains("jamba") { + return Some("ai21"); + } + + // Command models → cohere + if model_lower.starts_with("command") || model_lower.contains("command") { + return Some("cohere"); + } + None } @@ -157,6 +189,15 @@ fn strip_common_prefixes(model: &str) -> String { "mistral-", "mixtral-", "chatgpt-", + "deepseek-", // DeepSeek models + "qwen-", // Qwen models + "grok-", // Grok/xAI models + "jamba-", // AI21 Jamba models + "command-", // Cohere Command models + "codestral", // Mistral Codestral (no hyphen - can be standalone) + "ministral-", // Mistral Ministral + "pixtral-", // Mistral Pixtral + "devstral-", // Mistral Devstral ]; // Find the first occurrence of any known model pattern @@ -191,6 +232,12 @@ fn extract_provider_prefix(model: &str) -> Option<(&'static str, &str)> { "cohere", "ai21", "amazon", + "deepseek", + "qwen", + "x-ai", + "nvidia", + "microsoft", + "perplexity", ]; for provider in &known_providers { @@ -472,6 +519,39 @@ mod tests { let candidates = fuzzy_canonical_name("databricks", "headless-goose-o3-mini"); assert!(candidates.contains(&"openai/o3-mini".to_string())); + + // Test new providers: DeepSeek + let candidates = fuzzy_canonical_name("databricks", "databricks-deepseek-chat"); + assert!(candidates.contains(&"deepseek/deepseek-chat".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "deepseek-r1"); + assert!(candidates.contains(&"deepseek/deepseek-r1".to_string())); + + // Test Qwen models + let candidates = fuzzy_canonical_name("databricks", "qwen-2-5-72b-instruct"); + assert!(candidates.contains(&"qwen/qwen-2.5-72b-instruct".to_string())); + + // Test Grok models + let candidates = fuzzy_canonical_name("databricks", "grok-3"); + assert!(candidates.contains(&"x-ai/grok-3".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "databricks-grok-4-fast"); + assert!(candidates.contains(&"x-ai/grok-4-fast".to_string())); + + // Test Jamba models + let candidates = fuzzy_canonical_name("databricks", "jamba-large-1-7"); + assert!(candidates.contains(&"ai21/jamba-large-1.7".to_string())); + + // Test Cohere Command models + let candidates = fuzzy_canonical_name("databricks", "command-r-plus-08"); + assert!(candidates.contains(&"cohere/command-r-plus-08".to_string())); + + // Test Mistral variants + let candidates = fuzzy_canonical_name("databricks", "codestral"); + assert!(candidates.contains(&"mistralai/codestral".to_string())); + + let candidates = fuzzy_canonical_name("databricks", "ministral-8b"); + assert!(candidates.contains(&"mistralai/ministral-8b".to_string())); } #[test] @@ -489,6 +569,16 @@ mod tests { assert_eq!(infer_provider_from_model("llama-3-1-70b"), Some("meta-llama")); assert_eq!(infer_provider_from_model("mistral-large"), Some("mistralai")); assert_eq!(infer_provider_from_model("mixtral-8x7b"), Some("mistralai")); + assert_eq!(infer_provider_from_model("codestral"), Some("mistralai")); + assert_eq!(infer_provider_from_model("ministral-8b"), Some("mistralai")); + assert_eq!(infer_provider_from_model("pixtral-large"), Some("mistralai")); + assert_eq!(infer_provider_from_model("deepseek-chat"), Some("deepseek")); + assert_eq!(infer_provider_from_model("deepseek-r1"), Some("deepseek")); + assert_eq!(infer_provider_from_model("qwen-2-5-72b-instruct"), Some("qwen")); + assert_eq!(infer_provider_from_model("grok-3"), Some("x-ai")); + assert_eq!(infer_provider_from_model("grok-4-fast"), Some("x-ai")); + assert_eq!(infer_provider_from_model("jamba-large-1-7"), Some("ai21")); + assert_eq!(infer_provider_from_model("command-r-plus-08"), Some("cohere")); assert_eq!(infer_provider_from_model("unknown-model"), None); } @@ -505,6 +595,15 @@ mod tests { assert_eq!(strip_common_prefixes("headless-goose-o3-mini"), "o3-mini"); assert_eq!(strip_common_prefixes("kgoose-cashapp-claude-4-sonnet"), "claude-4-sonnet"); assert_eq!(strip_common_prefixes("claude-3-5-sonnet"), "claude-3-5-sonnet"); // no prefix + + // Test new provider patterns + assert_eq!(strip_common_prefixes("databricks-deepseek-chat"), "deepseek-chat"); + assert_eq!(strip_common_prefixes("goose-qwen-2-5-72b"), "qwen-2-5-72b"); + assert_eq!(strip_common_prefixes("kgoose-grok-4-fast"), "grok-4-fast"); + assert_eq!(strip_common_prefixes("databricks-jamba-large"), "jamba-large"); + assert_eq!(strip_common_prefixes("goose-command-r-plus"), "command-r-plus"); + assert_eq!(strip_common_prefixes("databricks-codestral"), "codestral"); + assert_eq!(strip_common_prefixes("goose-ministral-8b"), "ministral-8b"); } #[test] @@ -514,6 +613,9 @@ mod tests { assert_eq!(extract_provider_prefix("google-gemini-2-5-flash"), Some(("google", "gemini-2-5-flash"))); assert_eq!(extract_provider_prefix("meta-llama-3-1-70b"), Some(("meta-llama", "3-1-70b"))); assert_eq!(extract_provider_prefix("mistralai-mistral-large"), Some(("mistralai", "mistral-large"))); + assert_eq!(extract_provider_prefix("deepseek-deepseek-chat"), Some(("deepseek", "deepseek-chat"))); + assert_eq!(extract_provider_prefix("qwen-qwen-2-5-72b-instruct"), Some(("qwen", "qwen-2-5-72b-instruct"))); + assert_eq!(extract_provider_prefix("x-ai-grok-3"), Some(("x-ai", "grok-3"))); assert_eq!(extract_provider_prefix("claude-3-5-sonnet"), None); // no provider prefix assert_eq!(extract_provider_prefix("unknown-provider-model"), None); // unknown provider } From c406cf33c3fc69103c833b476cdbdbfc90d34164 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 11 Dec 2025 01:21:22 -0500 Subject: [PATCH 35/52] show only recommendeded --- crates/goose-cli/src/commands/configure.rs | 6 +-- .../src/routes/config_management.rs | 22 ++++++-- crates/goose/src/providers/base.rs | 54 +++++++++++++++++++ ui/desktop/openapi.json | 8 +++ ui/desktop/src/api/types.gen.ts | 4 +- ui/desktop/src/components/ConfigContext.tsx | 30 ++++++----- .../settings/models/modelInterface.ts | 5 +- .../models/subcomponents/SwitchModelModal.tsx | 29 +++++++++- 8 files changed, 134 insertions(+), 24 deletions(-) diff --git a/crates/goose-cli/src/commands/configure.rs b/crates/goose-cli/src/commands/configure.rs index 407d755d748c..303f55e4641c 100644 --- a/crates/goose-cli/src/commands/configure.rs +++ b/crates/goose-cli/src/commands/configure.rs @@ -570,13 +570,13 @@ pub async fn configure_provider_dialog() -> anyhow::Result { } } - // Attempt to fetch supported models for this provider + // Attempt to fetch recommended models for this provider (respects FORCE_SHOW_ALL_MODELS env var) let spin = spinner(); - spin.start("Attempting to fetch supported models..."); + spin.start("Attempting to fetch recommended models..."); let models_res = { let temp_model_config = ModelConfig::new(&provider_meta.default_model)?; let temp_provider = create(provider_name, temp_model_config).await?; - temp_provider.fetch_supported_models().await + temp_provider.fetch_recommended_models().await }; spin.stop(style("Model fetch complete").green()); diff --git a/crates/goose-server/src/routes/config_management.rs b/crates/goose-server/src/routes/config_management.rs index 3b4848bf5a06..304b9eacd2c3 100644 --- a/crates/goose-server/src/routes/config_management.rs +++ b/crates/goose-server/src/routes/config_management.rs @@ -2,7 +2,7 @@ use crate::routes::utils::check_provider_configured; use crate::state::AppState; use axum::routing::put; use axum::{ - extract::Path, + extract::{Path, Query}, routing::{delete, get, post}, Json, Router, }; @@ -51,6 +51,12 @@ pub struct ConfigKeyQuery { pub is_secret: bool, } +#[derive(Deserialize, ToSchema, utoipa::IntoParams)] +pub struct ModelFilterQuery { + #[serde(default)] + pub show_all: bool, +} + #[derive(Serialize, ToSchema)] pub struct ConfigResponse { pub config: HashMap, @@ -349,7 +355,8 @@ pub async fn providers() -> Result>, StatusCode> { get, path = "/config/providers/{name}/models", params( - ("name" = String, Path, description = "Provider name (e.g., openai)") + ("name" = String, Path, description = "Provider name (e.g., openai)"), + ModelFilterQuery ), responses( (status = 200, description = "Models fetched successfully", body = [String]), @@ -360,6 +367,7 @@ pub async fn providers() -> Result>, StatusCode> { )] pub async fn get_provider_models( Path(name): Path, + Query(filter): Query, ) -> Result>, StatusCode> { let loaded_provider = goose::config::declarative_providers::load_provider(name.as_str()).ok(); // TODO(Douwe): support a get models url for custom providers @@ -392,7 +400,15 @@ pub async fn get_provider_models( .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - match provider.fetch_supported_models().await { + // Use fetch_recommended_models by default (respects FORCE_SHOW_ALL_MODELS env var) + // Unless explicitly requested to show all via query parameter + let models_result = if filter.show_all { + provider.fetch_supported_models().await + } else { + provider.fetch_recommended_models().await + }; + + match models_result { Ok(Some(models)) => Ok(Json(models)), Ok(None) => Ok(Json(Vec::new())), Err(provider_error) => { diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index e0c35670989e..d28f04b8bf7d 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -416,6 +416,60 @@ pub trait Provider: Send + Sync { Ok(None) } + /// Fetch models filtered by canonical registry and usability + /// Respects FORCE_SHOW_ALL_MODELS env var - if true, returns all models + /// Otherwise, only returns models that: + /// 1. Map to a canonical model + /// 2. Have "text" in input_modalities + async fn fetch_recommended_models(&self) -> Result>, ProviderError> { + // Check if we should show all models + let force_show_all = std::env::var("FORCE_SHOW_ALL_MODELS") + .unwrap_or_else(|_| "false".to_string()) + .to_lowercase() + == "true"; + + if force_show_all { + return self.fetch_supported_models().await; + } + + // Get all models + let all_models = match self.fetch_supported_models().await? { + Some(models) => models, + None => return Ok(None), + }; + + // Load canonical registry + let registry = CanonicalModelRegistry::bundled() + .map_err(|e| ProviderError::ExecutionError(format!("Failed to load canonical registry: {}", e)))?; + + // Filter models that are usable (map to canonical + have text input) + let recommended_models: Vec = all_models + .into_iter() + .filter(|model| { + use super::canonical::fuzzy_canonical_name; + + // Try to map to canonical + let candidates = fuzzy_canonical_name(self.get_name(), model); + + // Check if any candidate maps to a canonical model with text input + candidates.iter().any(|canonical_id| { + if let Some(canonical_model) = registry.get(canonical_id) { + canonical_model.input_modalities.contains(&"text".to_string()) + } else { + false + } + }) + }) + .collect(); + + if recommended_models.is_empty() { + // If no models match, return None instead of empty list + Ok(None) + } else { + Ok(Some(recommended_models)) + } + } + async fn map_to_canonical_model( &self, provider_model: &str, diff --git a/ui/desktop/openapi.json b/ui/desktop/openapi.json index 3de24b346fd0..62232c524061 100644 --- a/ui/desktop/openapi.json +++ b/ui/desktop/openapi.json @@ -808,6 +808,14 @@ "schema": { "type": "string" } + }, + { + "name": "show_all", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } } ], "responses": { diff --git a/ui/desktop/src/api/types.gen.ts b/ui/desktop/src/api/types.gen.ts index b0640636991e..932c62b5cb3a 100644 --- a/ui/desktop/src/api/types.gen.ts +++ b/ui/desktop/src/api/types.gen.ts @@ -1638,7 +1638,9 @@ export type GetProviderModelsData = { */ name: string; }; - query?: never; + query?: { + show_all?: boolean; + }; url: '/config/providers/{name}/models'; }; diff --git a/ui/desktop/src/components/ConfigContext.tsx b/ui/desktop/src/components/ConfigContext.tsx index 5f4f16c827c0..ea4d9c4d6bcd 100644 --- a/ui/desktop/src/components/ConfigContext.tsx +++ b/ui/desktop/src/components/ConfigContext.tsx @@ -39,7 +39,7 @@ interface ConfigContextType { removeExtension: (name: string) => Promise; getProviders: (b: boolean) => Promise; getExtensions: (b: boolean) => Promise; - getProviderModels: (providerName: string) => Promise; + getProviderModels: (providerName: string, showAll?: boolean) => Promise; disableAllExtensions: () => Promise; enableBotExtensions: (extensions: ExtensionConfig[]) => Promise; } @@ -182,18 +182,22 @@ export const ConfigProvider: React.FC = ({ children }) => { [providersList] ); - const getProviderModels = useCallback(async (providerName: string): Promise => { - try { - const response = await apiGetProviderModels({ - path: { name: providerName }, - throwOnError: true, - }); - return response.data || []; - } catch (error) { - console.error(`Failed to fetch models for provider ${providerName}:`, error); - return []; - } - }, []); + const getProviderModels = useCallback( + async (providerName: string, showAll: boolean = false): Promise => { + try { + const response = await apiGetProviderModels({ + path: { name: providerName }, + query: showAll ? { show_all: true } : undefined, + throwOnError: true, + }); + return response.data || []; + } catch (error) { + console.error(`Failed to fetch models for provider ${providerName}:`, error); + return []; + } + }, + [] + ); useEffect(() => { // Load all configuration data and providers on mount diff --git a/ui/desktop/src/components/settings/models/modelInterface.ts b/ui/desktop/src/components/settings/models/modelInterface.ts index b3cec2469e19..e6dd8c6c5a90 100644 --- a/ui/desktop/src/components/settings/models/modelInterface.ts +++ b/ui/desktop/src/components/settings/models/modelInterface.ts @@ -52,12 +52,13 @@ export interface ProviderModelsResult { */ export async function fetchModelsForProviders( activeProviders: ProviderDetails[], - getProviderModelsFunc: (providerName: string) => Promise + getProviderModelsFunc: (providerName: string, showAll?: boolean) => Promise, + showAll: boolean = false ): Promise { const modelPromises = activeProviders.map(async (p) => { const providerName = p.name; try { - let models = await getProviderModelsFunc(providerName); + let models = await getProviderModelsFunc(providerName, showAll); if ((!models || models.length === 0) && p.metadata.known_models?.length) { models = p.metadata.known_models.map((m) => m.name); } diff --git a/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx b/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx index a1c346359093..5149aed3b775 100644 --- a/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx +++ b/ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx @@ -93,6 +93,7 @@ export const SwitchModelModal = ({ const [predefinedModels, setPredefinedModels] = useState([]); const [loadingModels, setLoadingModels] = useState(false); const [userClearedModel, setUserClearedModel] = useState(false); + const [showOnlyRecommended, setShowOnlyRecommended] = useState(true); // Validate form data const validateForm = useCallback(() => { @@ -198,7 +199,11 @@ export const SwitchModelModal = ({ setLoadingModels(true); // Fetching models for all providers - const results = await fetchModelsForProviders(activeProviders, getProviderModels); + const results = await fetchModelsForProviders( + activeProviders, + getProviderModels, + !showOnlyRecommended + ); // Process results and build grouped options const groupedOptions: { @@ -259,7 +264,7 @@ export const SwitchModelModal = ({ setLoadingModels(false); } })(); - }, [getProviders, getProviderModels, usePredefinedModels, read]); + }, [getProviders, getProviderModels, usePredefinedModels, read, showOnlyRecommended]); const filteredModelOptions = provider ? modelOptions.filter((group) => group.options[0]?.provider === provider) @@ -423,6 +428,26 @@ export const SwitchModelModal = ({ ) : ( /* Manual Provider/Model Selection */
+
+ + +
Date: Fri, 12 Dec 2025 15:00:45 -0500 Subject: [PATCH 49/52] minior clean --- crates/goose/src/providers/base.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/goose/src/providers/base.rs b/crates/goose/src/providers/base.rs index b6689a08f4dc..4a84fff8e0f6 100644 --- a/crates/goose/src/providers/base.rs +++ b/crates/goose/src/providers/base.rs @@ -2,7 +2,7 @@ use anyhow::Result; use futures::Stream; use serde::{Deserialize, Serialize}; -use super::canonical::CanonicalModelRegistry; +use super::canonical::{map_to_canonical_model, CanonicalModelRegistry}; use super::errors::ProviderError; use super::retry::RetryConfig; use crate::config::base::ConfigValue; @@ -427,7 +427,6 @@ pub trait Provider: Send + Sync { ProviderError::ExecutionError(format!("Failed to load canonical registry: {}", e)) })?; - use super::canonical::map_to_canonical_model; let provider_name = self.get_name(); let recommended_models: Vec = all_models @@ -452,8 +451,6 @@ pub trait Provider: Send + Sync { &self, provider_model: &str, ) -> Result, ProviderError> { - use super::canonical::map_to_canonical_model; - let registry = CanonicalModelRegistry::bundled().map_err(|e| { ProviderError::ExecutionError(format!("Failed to load canonical registry: {}", e)) })?; From 01e0024351fb95149327251030129fc4441253f3 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 12 Dec 2025 15:21:39 -0500 Subject: [PATCH 50/52] Clean up regex and redundant checks --- .../src/providers/canonical/name_builder.rs | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index 7d2e454b1320..c2c5add78bc1 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -2,20 +2,20 @@ use once_cell::sync::Lazy; use regex::Regex; static NORMALIZE_VERSION_RE: Lazy = Lazy::new(|| { - Regex::new(r"-(\d)-(\d)(-|$)").expect("Failed to compile NORMALIZE_VERSION regex") + Regex::new(r"-(\d)-(\d)(-|$)").unwrap() }); static STRIP_PATTERNS: Lazy> = Lazy::new(|| { vec![ - Regex::new(r"-latest$").expect("Failed to compile -latest regex"), - Regex::new(r"-preview(-\d+)*$").expect("Failed to compile -preview regex"), - Regex::new(r"-exp(-\d+)*$").expect("Failed to compile -exp regex"), - Regex::new(r":exacto$").expect("Failed to compile :exacto regex"), - Regex::new(r"-\d{8}$").expect("Failed to compile date regex"), - Regex::new(r"-\d{4}-\d{2}-\d{2}$").expect("Failed to compile full-date regex"), - Regex::new(r"-v\d+(\.\d+)*$").expect("Failed to compile version regex"), - Regex::new(r"-\d{3,}$").expect("Failed to compile patch regex"), - Regex::new(r"-bedrock$").expect("Failed to compile -bedrock regex"), + Regex::new(r"-latest$").unwrap(), + Regex::new(r"-preview(-\d+)*$").unwrap(), + Regex::new(r"-exp(-\d+)*$").unwrap(), + Regex::new(r":exacto$").unwrap(), + Regex::new(r"-\d{8}$").unwrap(), + Regex::new(r"-\d{4}-\d{2}-\d{2}$").unwrap(), + Regex::new(r"-v\d+(\.\d+)*$").unwrap(), + Regex::new(r"-\d{3,}$").unwrap(), + Regex::new(r"-bedrock$").unwrap(), ] }); @@ -24,10 +24,8 @@ static CLAUDE_PATTERNS: Lazy> = Lazy::new(|| { .iter() .map(|&size| { ( - Regex::new(&format!("claude-([0-9.-]+)-{}", size)) - .expect("Failed to compile Claude forward regex"), - Regex::new(&format!("claude-{}-([0-9.-]+)", size)) - .expect("Failed to compile Claude reverse regex"), + Regex::new(&format!("claude-([0-9.-]+)-{}", size)).unwrap(), + Regex::new(&format!("claude-{}-([0-9.-]+)", size)).unwrap(), size, ) }) @@ -46,6 +44,16 @@ pub fn canonical_name(provider: &str, model: &str) -> String { } } +/// Try to build a canonical name and check if it exists in the registry +fn try_canonical( + provider: &str, + model: &str, + registry: &super::CanonicalModelRegistry, +) -> Option { + let candidate = canonical_name(provider, model); + registry.get(&candidate).map(|_| candidate) +} + /// Try to map a provider/model pair to a canonical model pub fn map_to_canonical_model( provider: &str, @@ -53,31 +61,27 @@ pub fn map_to_canonical_model( registry: &super::CanonicalModelRegistry, ) -> Option { // Try direct mapping first - let candidate = canonical_name(provider, model); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(provider, model, registry) { return Some(candidate); } // Try with common prefixes stripped let model_stripped = strip_common_prefixes(model); if model_stripped != model { - let candidate = canonical_name(provider, &model_stripped); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(provider, &model_stripped, registry) { return Some(candidate); } } // Try word-order swapping for Claude models (claude-4-opus ↔ claude-opus-4) if let Some(swapped) = swap_claude_word_order(&model_stripped) { - let candidate = canonical_name(provider, &swapped); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(provider, &swapped, registry) { return Some(candidate); } if is_hosting_provider(provider) { if let Some(inferred) = infer_provider_from_model(&swapped) { - let candidate = canonical_name(inferred, &swapped); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(inferred, &swapped, registry) { return Some(candidate); } } @@ -87,15 +91,13 @@ pub fn map_to_canonical_model( // For hosting providers, try to infer the real provider from model name patterns if is_hosting_provider(provider) { if let Some(inferred_provider) = infer_provider_from_model(&model_stripped) { - let candidate = canonical_name(inferred_provider, &model_stripped); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(inferred_provider, &model_stripped, registry) { return Some(candidate); } } if let Some(inferred) = infer_provider_from_model(model) { - let candidate = canonical_name(inferred, model); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(inferred, model, registry) { return Some(candidate); } } @@ -103,8 +105,7 @@ pub fn map_to_canonical_model( // For provider-prefixed models like "databricks-meta-llama-3-1-70b" if let Some((extracted_provider, extracted_model)) = extract_provider_prefix(&model_stripped) { - let candidate = canonical_name(extracted_provider, extracted_model); - if registry.get(&candidate).is_some() { + if let Some(candidate) = try_canonical(extracted_provider, extracted_model, registry) { return Some(candidate); } } @@ -141,7 +142,7 @@ fn is_hosting_provider(provider: &str) -> bool { fn infer_provider_from_model(model: &str) -> Option<&'static str> { let model_lower = model.to_lowercase(); - if model_lower.starts_with("claude-") || model_lower.contains("claude") { + if model_lower.contains("claude") { return Some("anthropic"); } @@ -173,23 +174,23 @@ fn infer_provider_from_model(model: &str) -> Option<&'static str> { return Some("mistralai"); } - if model_lower.starts_with("deepseek") || model_lower.contains("deepseek") { + if model_lower.contains("deepseek") { return Some("deepseek"); } - if model_lower.starts_with("qwen") || model_lower.contains("qwen") { + if model_lower.contains("qwen") { return Some("qwen"); } - if model_lower.starts_with("grok") || model_lower.contains("grok") { + if model_lower.contains("grok") { return Some("x-ai"); } - if model_lower.starts_with("jamba") || model_lower.contains("jamba") { + if model_lower.contains("jamba") { return Some("ai21"); } - if model_lower.starts_with("command") || model_lower.contains("command") { + if model_lower.contains("command") { return Some("cohere"); } From a077db573326223d8b967c369f81602fcf06f4e2 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 12 Dec 2025 15:35:23 -0500 Subject: [PATCH 51/52] fuse tests --- .../src/providers/canonical/name_builder.rs | 659 +++--------------- 1 file changed, 90 insertions(+), 569 deletions(-) diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index c2c5add78bc1..0741159ddbcf 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -210,7 +210,7 @@ fn strip_common_prefixes(model: &str) -> String { "o3-", "o3", "o4-", - "meta-llama-", + "llama-", "mistral-", "mixtral-", "chatgpt-", @@ -298,573 +298,94 @@ mod tests { use super::*; #[test] - fn test_canonical_names() { - // canonical_name tests - assert_eq!( - canonical_name("anthropic", "claude-3-5-sonnet-20241022"), - "anthropic/claude-3.5-sonnet" - ); - assert_eq!( - canonical_name("openai", "gpt-4-turbo-2024-04-09"), - "openai/gpt-4-turbo" - ); - assert_eq!( - canonical_name("google", "gemini-1.5-pro-002"), - "google/gemini-1.5-pro" - ); - assert_eq!( - canonical_name("anthropic", "claude-3-5-sonnet"), - "anthropic/claude-3.5-sonnet" - ); - assert_eq!( - canonical_name("openrouter", "anthropic/claude-3.5-sonnet"), - "anthropic/claude-3.5-sonnet" - ); - assert_eq!( - canonical_name("openrouter", "openai/gpt-4-turbo-2024-04-09"), - "openai/gpt-4-turbo" - ); - - // strip_version_suffix - 8 digit dates - assert_eq!( - strip_version_suffix("claude-3-5-sonnet-20241022"), - "claude-3.5-sonnet" - ); - - // strip_version_suffix - YYYY-MM-DD dates - assert_eq!( - strip_version_suffix("gpt-4-turbo-2024-04-09"), - "gpt-4-turbo" - ); - - // strip_version_suffix - patch versions (3+ digits) and semantic versions - assert_eq!(strip_version_suffix("gemini-1.5-pro-002"), "gemini-1.5-pro"); - assert_eq!(strip_version_suffix("gemini-1.5-pro-001"), "gemini-1.5-pro"); - assert_eq!(strip_version_suffix("model-v1.5"), "model"); - assert_eq!(strip_version_suffix("model-v2.0"), "model"); - - // strip_version_suffix - no suffix - assert_eq!( - strip_version_suffix("claude-3-5-sonnet"), - "claude-3.5-sonnet" - ); - - // strip_version_suffix - exp suffix - assert_eq!( - strip_version_suffix("gemini-2.0-flash-exp"), - "gemini-2.0-flash" - ); - assert_eq!( - strip_version_suffix("gemini-2.0-flash-thinking-exp-01-21"), - "gemini-2.0-flash-thinking" - ); - - // strip_version_suffix - preview suffix - assert_eq!( - strip_version_suffix("gemini-2.5-flash-preview"), - "gemini-2.5-flash" - ); - assert_eq!( - strip_version_suffix("gemini-2.5-flash-preview-05-20"), - "gemini-2.5-flash" - ); - assert_eq!( - strip_version_suffix("gemini-2.5-flash-lite-preview-09"), - "gemini-2.5-flash-lite" - ); - - // strip_version_suffix - multiple patterns - assert_eq!( - strip_version_suffix("gemini-2.5-pro-preview-03-25"), - "gemini-2.5-pro" - ); - - // normalize version numbers (dashes to dots) - assert_eq!(strip_version_suffix("claude-3-5-haiku"), "claude-3.5-haiku"); - assert_eq!( - strip_version_suffix("claude-3-7-sonnet"), - "claude-3.7-sonnet" - ); - assert_eq!(strip_version_suffix("claude-haiku-4-5"), "claude-haiku-4.5"); - assert_eq!(strip_version_suffix("claude-opus-4-1"), "claude-opus-4.1"); - assert_eq!( - strip_version_suffix("claude-sonnet-4-5"), - "claude-sonnet-4.5" - ); - assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); - - // normalize and strip combined - assert_eq!( - strip_version_suffix("claude-3-5-haiku-20241022"), - "claude-3.5-haiku" - ); - assert_eq!( - strip_version_suffix("claude-3-7-sonnet-20250219"), - "claude-3.7-sonnet" - ); - assert_eq!( - strip_version_suffix("claude-haiku-4-5-20251001"), - "claude-haiku-4.5" - ); - assert_eq!( - strip_version_suffix("claude-sonnet-4-5-20250929"), - "claude-sonnet-4.5" - ); - - // preserve model family versions (1-2 digits) - assert_eq!( - strip_version_suffix("claude-sonnet-4.5"), - "claude-sonnet-4.5" - ); - assert_eq!(strip_version_suffix("claude-sonnet-4"), "claude-sonnet-4"); - assert_eq!(strip_version_suffix("claude-haiku-4.5"), "claude-haiku-4.5"); - assert_eq!(strip_version_suffix("gpt-4-turbo"), "gpt-4-turbo"); - assert_eq!(strip_version_suffix("gpt-3.5-turbo"), "gpt-3.5-turbo"); - assert_eq!(strip_version_suffix("model-002"), "model"); - assert_eq!(strip_version_suffix("model-123"), "model"); - - // strip -latest suffix - assert_eq!( - strip_version_suffix("claude-3.5-sonnet-latest"), - "claude-3.5-sonnet" - ); - assert_eq!(strip_version_suffix("gpt-4o-latest"), "gpt-4o"); - assert_eq!(strip_version_suffix("chatgpt-4o-latest"), "chatgpt-4o"); - } - - #[test] - fn test_fuzzy_canonical_name() { - let registry = super::super::CanonicalModelRegistry::bundled().unwrap(); - - // Test hosting provider with direct model names (Databricks pattern) - assert_eq!( - map_to_canonical_model("databricks", "claude-3-5-sonnet", registry), - Some("anthropic/claude-3.5-sonnet".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "gpt-4o", registry), - Some("openai/gpt-4o".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "gemini-2-5-flash", registry), - Some("google/gemini-2.5-flash".to_string()) - ); - - // Test word-order swapping (Claude 3 series: version-size ↔ size-version) - assert_eq!( - map_to_canonical_model("databricks", "claude-haiku-3-5", registry), - Some("anthropic/claude-3.5-haiku".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "claude-sonnet-3-7", registry), - Some("anthropic/claude-3.7-sonnet".to_string()) - ); - - // Test word-order swapping (Claude 4 series: version-size ↔ size-version) - assert_eq!( - map_to_canonical_model("databricks", "claude-4-opus", registry), - Some("anthropic/claude-opus-4".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "claude-4-sonnet", registry), - Some("anthropic/claude-sonnet-4".to_string()) - ); - - // Test prefixed models with word-order swapping - assert_eq!( - map_to_canonical_model("databricks", "goose-claude-4-opus", registry), - Some("anthropic/claude-opus-4".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "kgoose-claude-4-sonnet", registry), - Some("anthropic/claude-sonnet-4".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "headless-goose-claude-4-sonnet", registry), - Some("anthropic/claude-sonnet-4".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "kgoose-cashapp-claude-4-sonnet", registry), - Some("anthropic/claude-sonnet-4".to_string()) - ); - - // Test ng-tools prefix with word swapping - assert_eq!( - map_to_canonical_model("databricks", "ng-tools-claude-haiku-3-5", registry), - Some("anthropic/claude-3.5-haiku".to_string()) - ); - - // Test raml prefix - assert_eq!( - map_to_canonical_model("databricks", "raml-claude-opus-4-5", registry), - Some("anthropic/claude-opus-4.5".to_string()) - ); - - // Test databricks prefix - assert_eq!( - map_to_canonical_model("databricks", "databricks-claude-sonnet-4-5", registry), - Some("anthropic/claude-sonnet-4.5".to_string()) - ); - - // Test multiple prefixes (should strip all) - assert_eq!( - map_to_canonical_model("databricks", "kgoose-gpt-4o", registry), - Some("openai/gpt-4o".to_string()) - ); - - // Test platform suffixes - assert_eq!( - map_to_canonical_model("databricks", "claude-4-sonnet-bedrock", registry), - Some("anthropic/claude-sonnet-4".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "goose-claude-4-sonnet-bedrock", registry), - Some("anthropic/claude-sonnet-4".to_string()) - ); - - // Test provider-prefixed models with dates - assert_eq!( - map_to_canonical_model("databricks", "claude-3-5-sonnet-20241022", registry), - Some("anthropic/claude-3.5-sonnet".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "gpt-4o-2024-11-20", registry), - Some("openai/gpt-4o".to_string()) - ); - - // Test -latest suffix - assert_eq!( - map_to_canonical_model("databricks", "claude-3-5-sonnet-latest", registry), - Some("anthropic/claude-3.5-sonnet".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "gpt-4o-latest", registry), - Some("openai/gpt-4o".to_string()) - ); - - // Test direct provider (non-hosting) - assert_eq!( - map_to_canonical_model("anthropic", "claude-3-5-sonnet-20241022", registry), - Some("anthropic/claude-3.5-sonnet".to_string()) - ); - - assert_eq!( - map_to_canonical_model("openai", "gpt-4o-latest", registry), - Some("openai/gpt-4o".to_string()) - ); - - // Test O-series models - assert_eq!( - map_to_canonical_model("databricks", "goose-o1", registry), - Some("openai/o1".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "kgoose-o3", registry), - Some("openai/o3".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "headless-goose-o3-mini", registry), - Some("openai/o3-mini".to_string()) - ); - - // Test new providers: DeepSeek - assert_eq!( - map_to_canonical_model("databricks", "databricks-deepseek-chat", registry), - Some("deepseek/deepseek-chat".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "deepseek-r1", registry), - Some("deepseek/deepseek-r1".to_string()) - ); - - // Test Qwen models - assert_eq!( - map_to_canonical_model("databricks", "qwen-2-5-72b-instruct", registry), - Some("qwen/qwen-2.5-72b-instruct".to_string()) - ); - - // Test Grok models - assert_eq!( - map_to_canonical_model("databricks", "grok-3", registry), - Some("x-ai/grok-3".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "databricks-grok-4-fast", registry), - Some("x-ai/grok-4-fast".to_string()) - ); - - // Test Jamba models - assert_eq!( - map_to_canonical_model("databricks", "jamba-large-1-7", registry), - Some("ai21/jamba-large-1.7".to_string()) - ); - - // Test Cohere Command models - assert_eq!( - map_to_canonical_model("databricks", "command-r-plus-08", registry), - Some("cohere/command-r-plus-08".to_string()) - ); - - // Test Mistral variants - assert_eq!( - map_to_canonical_model("databricks", "codestral", registry), - Some("mistralai/codestral".to_string()) - ); - - assert_eq!( - map_to_canonical_model("databricks", "ministral-8b", registry), - Some("mistralai/ministral-8b".to_string()) - ); - } - - #[test] - fn test_infer_provider_from_model() { - assert_eq!( - infer_provider_from_model("claude-3-5-sonnet"), - Some("anthropic") - ); - assert_eq!( - infer_provider_from_model("claude-4-opus"), - Some("anthropic") - ); - assert_eq!(infer_provider_from_model("gpt-4o"), Some("openai")); - assert_eq!(infer_provider_from_model("gpt-4-turbo"), Some("openai")); - assert_eq!(infer_provider_from_model("o1"), Some("openai")); - assert_eq!(infer_provider_from_model("o3-mini"), Some("openai")); - assert_eq!( - infer_provider_from_model("chatgpt-4o-latest"), - Some("openai") - ); - assert_eq!( - infer_provider_from_model("gemini-2-5-flash"), - Some("google") - ); - assert_eq!(infer_provider_from_model("gemini-2-5-pro"), Some("google")); - assert_eq!(infer_provider_from_model("gemma-2-27b-it"), Some("google")); - assert_eq!( - infer_provider_from_model("llama-3-1-70b"), - Some("meta-llama") - ); - assert_eq!( - infer_provider_from_model("mistral-large"), - Some("mistralai") - ); - assert_eq!(infer_provider_from_model("mixtral-8x7b"), Some("mistralai")); - assert_eq!(infer_provider_from_model("codestral"), Some("mistralai")); - assert_eq!(infer_provider_from_model("ministral-8b"), Some("mistralai")); - assert_eq!( - infer_provider_from_model("pixtral-large"), - Some("mistralai") - ); - assert_eq!(infer_provider_from_model("deepseek-chat"), Some("deepseek")); - assert_eq!(infer_provider_from_model("deepseek-r1"), Some("deepseek")); - assert_eq!( - infer_provider_from_model("qwen-2-5-72b-instruct"), - Some("qwen") - ); - assert_eq!(infer_provider_from_model("grok-3"), Some("x-ai")); - assert_eq!(infer_provider_from_model("grok-4-fast"), Some("x-ai")); - assert_eq!(infer_provider_from_model("jamba-large-1-7"), Some("ai21")); - assert_eq!( - infer_provider_from_model("command-r-plus-08"), - Some("cohere") - ); - assert_eq!(infer_provider_from_model("unknown-model"), None); - } - - #[test] - fn test_strip_common_prefixes() { - assert_eq!( - strip_common_prefixes("goose-claude-4-opus"), - "claude-4-opus" - ); - assert_eq!(strip_common_prefixes("databricks-gpt-5"), "gpt-5"); - assert_eq!(strip_common_prefixes("kgoose-gemini-pro"), "gemini-pro"); - assert_eq!(strip_common_prefixes("kgoose-gpt-4o"), "gpt-4o"); - assert_eq!(strip_common_prefixes("azure-gpt-4o"), "gpt-4o"); - assert_eq!( - strip_common_prefixes("bedrock-claude-3-5-sonnet"), - "claude-3-5-sonnet" - ); - assert_eq!( - strip_common_prefixes("ng-tools-claude-opus-4"), - "claude-opus-4" - ); - assert_eq!( - strip_common_prefixes("raml-claude-sonnet-4-5"), - "claude-sonnet-4-5" - ); // version normalization happens later - assert_eq!(strip_common_prefixes("headless-goose-o3-mini"), "o3-mini"); - assert_eq!( - strip_common_prefixes("kgoose-cashapp-claude-4-sonnet"), - "claude-4-sonnet" - ); - assert_eq!( - strip_common_prefixes("claude-3-5-sonnet"), - "claude-3-5-sonnet" - ); // no prefix - - // Test new provider patterns - assert_eq!( - strip_common_prefixes("databricks-deepseek-chat"), - "deepseek-chat" - ); - assert_eq!(strip_common_prefixes("goose-qwen-2-5-72b"), "qwen-2-5-72b"); - assert_eq!(strip_common_prefixes("kgoose-grok-4-fast"), "grok-4-fast"); - assert_eq!( - strip_common_prefixes("databricks-jamba-large"), - "jamba-large" - ); - assert_eq!( - strip_common_prefixes("goose-command-r-plus"), - "command-r-plus" - ); - assert_eq!(strip_common_prefixes("databricks-codestral"), "codestral"); - assert_eq!(strip_common_prefixes("goose-ministral-8b"), "ministral-8b"); - } - - #[test] - fn test_extract_provider_prefix() { - assert_eq!( - extract_provider_prefix("anthropic-claude-3-5-sonnet"), - Some(("anthropic", "claude-3-5-sonnet")) - ); - assert_eq!( - extract_provider_prefix("openai-gpt-4o"), - Some(("openai", "gpt-4o")) - ); - assert_eq!( - extract_provider_prefix("google-gemini-2-5-flash"), - Some(("google", "gemini-2-5-flash")) - ); - assert_eq!( - extract_provider_prefix("meta-llama-3-1-70b"), - Some(("meta-llama", "3-1-70b")) - ); - assert_eq!( - extract_provider_prefix("mistralai-mistral-large"), - Some(("mistralai", "mistral-large")) - ); - assert_eq!( - extract_provider_prefix("deepseek-deepseek-chat"), - Some(("deepseek", "deepseek-chat")) - ); - assert_eq!( - extract_provider_prefix("qwen-qwen-2-5-72b-instruct"), - Some(("qwen", "qwen-2-5-72b-instruct")) - ); - assert_eq!( - extract_provider_prefix("x-ai-grok-3"), - Some(("x-ai", "grok-3")) - ); - assert_eq!(extract_provider_prefix("claude-3-5-sonnet"), None); // no provider prefix - assert_eq!(extract_provider_prefix("unknown-provider-model"), None); // unknown provider - } - - #[test] - fn test_is_hosting_provider() { - assert!(is_hosting_provider("databricks")); - assert!(is_hosting_provider("openrouter")); - assert!(is_hosting_provider("azure")); - assert!(is_hosting_provider("bedrock")); - assert!(!is_hosting_provider("anthropic")); - assert!(!is_hosting_provider("openai")); - assert!(!is_hosting_provider("google")); - } - - #[test] - fn test_swap_claude_word_order() { - // Claude 3 series: version-size to size-version (with dots) - assert_eq!( - swap_claude_word_order("claude-3.5-sonnet"), - Some("claude-sonnet-3.5".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-3.5-haiku"), - Some("claude-haiku-3.5".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-3.7-sonnet"), - Some("claude-sonnet-3.7".to_string()) - ); - - // Claude 3 series with dashes in version (before normalization) - assert_eq!( - swap_claude_word_order("claude-3-5-sonnet"), - Some("claude-sonnet-3-5".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-3-7-sonnet"), - Some("claude-sonnet-3-7".to_string()) - ); - - // Reverse: size-version to version-size (with dashes) - assert_eq!( - swap_claude_word_order("claude-haiku-3-5"), - Some("claude-3-5-haiku".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-sonnet-3-7"), - Some("claude-3-7-sonnet".to_string()) - ); - - // Claude 4 series: size-version to version-size - assert_eq!( - swap_claude_word_order("claude-opus-4"), - Some("claude-4-opus".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-sonnet-4"), - Some("claude-4-sonnet".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-haiku-4.5"), - Some("claude-4.5-haiku".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-sonnet-4.5"), - Some("claude-4.5-sonnet".to_string()) - ); - - // Claude 4 series reverse: version-size to size-version - assert_eq!( - swap_claude_word_order("claude-4-opus"), - Some("claude-opus-4".to_string()) - ); - assert_eq!( - swap_claude_word_order("claude-4-sonnet"), - Some("claude-sonnet-4".to_string()) - ); - - // Non-claude models should return None - assert_eq!(swap_claude_word_order("gpt-4o"), None); - assert_eq!(swap_claude_word_order("gemini-2.5-flash"), None); - } - - #[test] - fn test_strip_version_suffix_special_cases() { - // Test -bedrock suffix - assert_eq!( - strip_version_suffix("claude-4-sonnet-bedrock"), - "claude-4-sonnet" - ); - - // Ensure we don't strip the main version number - assert_eq!(strip_version_suffix("claude-4"), "claude-4"); - assert_eq!(strip_version_suffix("gpt-4"), "gpt-4"); + fn test_map_to_canonical_model() { + let r = super::super::CanonicalModelRegistry::bundled().unwrap(); + + // === Direct provider (non-hosting) === + assert_eq!(map_to_canonical_model("anthropic", "claude-3-5-sonnet-20241022", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!(map_to_canonical_model("openai", "gpt-4o-latest", r), Some("openai/gpt-4o".to_string())); + assert_eq!(map_to_canonical_model("openai", "gpt-4-turbo-2024-04-09", r), Some("openai/gpt-4-turbo".to_string())); + + // === OpenRouter (already canonical format) === + assert_eq!(map_to_canonical_model("openrouter", "anthropic/claude-3.5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); + + // === Anthropic Claude - basic === + assert_eq!(map_to_canonical_model("databricks", "claude-3-5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!(map_to_canonical_model("databricks", "claude-3-5-sonnet-20241022", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!(map_to_canonical_model("databricks", "claude-3-5-sonnet-latest", r), Some("anthropic/claude-3.5-sonnet".to_string())); + + // === Claude word-order swapping (3.x series) === + assert_eq!(map_to_canonical_model("databricks", "claude-haiku-3-5", r), Some("anthropic/claude-3.5-haiku".to_string())); + assert_eq!(map_to_canonical_model("databricks", "claude-sonnet-3-7", r), Some("anthropic/claude-3.7-sonnet".to_string())); + assert_eq!(map_to_canonical_model("databricks", "ng-tools-claude-haiku-3-5", r), Some("anthropic/claude-3.5-haiku".to_string())); + + // === Claude word-order swapping (4.x series) === + assert_eq!(map_to_canonical_model("databricks", "claude-4-opus", r), Some("anthropic/claude-opus-4".to_string())); + assert_eq!(map_to_canonical_model("databricks", "claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); + assert_eq!(map_to_canonical_model("databricks", "raml-claude-opus-4-5", r), Some("anthropic/claude-opus-4.5".to_string())); + assert_eq!(map_to_canonical_model("databricks", "databricks-claude-sonnet-4-5", r), Some("anthropic/claude-sonnet-4.5".to_string())); + + // === Claude with custom prefixes === + assert_eq!(map_to_canonical_model("databricks", "goose-claude-4-opus", r), Some("anthropic/claude-opus-4".to_string())); + assert_eq!(map_to_canonical_model("databricks", "kgoose-claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); + assert_eq!(map_to_canonical_model("databricks", "headless-goose-claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); + assert_eq!(map_to_canonical_model("databricks", "kgoose-cashapp-claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); + + // === Claude with platform suffixes === + assert_eq!(map_to_canonical_model("databricks", "claude-4-sonnet-bedrock", r), Some("anthropic/claude-sonnet-4".to_string())); + assert_eq!(map_to_canonical_model("databricks", "goose-claude-4-sonnet-bedrock", r), Some("anthropic/claude-sonnet-4".to_string())); + assert_eq!(map_to_canonical_model("bedrock", "claude-3-5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); + + // === OpenAI GPT === + assert_eq!(map_to_canonical_model("databricks", "gpt-4o", r), Some("openai/gpt-4o".to_string())); + assert_eq!(map_to_canonical_model("databricks", "gpt-4o-2024-11-20", r), Some("openai/gpt-4o".to_string())); + assert_eq!(map_to_canonical_model("databricks", "gpt-4o-latest", r), Some("openai/gpt-4o".to_string())); + assert_eq!(map_to_canonical_model("databricks", "kgoose-gpt-4o", r), Some("openai/gpt-4o".to_string())); + assert_eq!(map_to_canonical_model("azure", "gpt-4o", r), Some("openai/gpt-4o".to_string())); + + // === OpenAI O-series === + assert_eq!(map_to_canonical_model("databricks", "goose-o1", r), Some("openai/o1".to_string())); + assert_eq!(map_to_canonical_model("databricks", "kgoose-o3", r), Some("openai/o3".to_string())); + assert_eq!(map_to_canonical_model("databricks", "headless-goose-o3-mini", r), Some("openai/o3-mini".to_string())); + + // === Google Gemini === + assert_eq!(map_to_canonical_model("databricks", "gemini-2-5-flash", r), Some("google/gemini-2.5-flash".to_string())); + + // === Meta Llama === + assert_eq!(map_to_canonical_model("databricks", "meta-llama-3-1-70b-instruct", r), Some("meta-llama/llama-3.1-70b-instruct".to_string())); + + // === Mistral variants === + assert_eq!(map_to_canonical_model("databricks", "codestral", r), Some("mistralai/codestral".to_string())); + assert_eq!(map_to_canonical_model("databricks", "ministral-8b", r), Some("mistralai/ministral-8b".to_string())); + + // === DeepSeek === + assert_eq!(map_to_canonical_model("databricks", "databricks-deepseek-chat", r), Some("deepseek/deepseek-chat".to_string())); + assert_eq!(map_to_canonical_model("databricks", "deepseek-r1", r), Some("deepseek/deepseek-r1".to_string())); + + // === Qwen === + assert_eq!(map_to_canonical_model("databricks", "qwen-2-5-72b-instruct", r), Some("qwen/qwen-2.5-72b-instruct".to_string())); + assert_eq!(map_to_canonical_model("databricks", "goose-qwen-2-5-72b-instruct", r), Some("qwen/qwen-2.5-72b-instruct".to_string())); + + // === Grok (X.AI) === + assert_eq!(map_to_canonical_model("databricks", "grok-3", r), Some("x-ai/grok-3".to_string())); + assert_eq!(map_to_canonical_model("databricks", "databricks-grok-4-fast", r), Some("x-ai/grok-4-fast".to_string())); + assert_eq!(map_to_canonical_model("databricks", "kgoose-grok-4-fast", r), Some("x-ai/grok-4-fast".to_string())); + + // === Jamba (AI21) === + assert_eq!(map_to_canonical_model("databricks", "jamba-large-1-7", r), Some("ai21/jamba-large-1.7".to_string())); + assert_eq!(map_to_canonical_model("databricks", "databricks-jamba-large-1-7", r), Some("ai21/jamba-large-1.7".to_string())); + + // === Cohere Command === + assert_eq!(map_to_canonical_model("databricks", "command-r-plus-08", r), Some("cohere/command-r-plus-08".to_string())); + assert_eq!(map_to_canonical_model("databricks", "goose-command-r-08", r), Some("cohere/command-r-08".to_string())); + + // === Provider-prefixed extraction === + assert_eq!(map_to_canonical_model("databricks", "anthropic-claude-3-5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!(map_to_canonical_model("databricks", "openai-gpt-4o", r), Some("openai/gpt-4o".to_string())); + assert_eq!(map_to_canonical_model("databricks", "google-gemini-2-5-flash", r), Some("google/gemini-2.5-flash".to_string())); + assert_eq!(map_to_canonical_model("databricks", "mistralai-mistral-large", r), Some("mistralai/mistral-large".to_string())); + assert_eq!(map_to_canonical_model("databricks", "deepseek-deepseek-chat", r), Some("deepseek/deepseek-chat".to_string())); + assert_eq!(map_to_canonical_model("databricks", "qwen-qwen-2-5-72b-instruct", r), Some("qwen/qwen-2.5-72b-instruct".to_string())); + assert_eq!(map_to_canonical_model("databricks", "x-ai-grok-3", r), Some("x-ai/grok-3".to_string())); } } From c77bf78a1e65ce17a0beeebc1bf7febbd31efb39 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 12 Dec 2025 15:37:16 -0500 Subject: [PATCH 52/52] fmt --- .../src/routes/config_management.rs | 1 - .../src/providers/canonical/name_builder.rs | 259 ++++++++++++++---- 2 files changed, 205 insertions(+), 55 deletions(-) diff --git a/crates/goose-server/src/routes/config_management.rs b/crates/goose-server/src/routes/config_management.rs index aaee4cfdb0d9..c70a1bb9db01 100644 --- a/crates/goose-server/src/routes/config_management.rs +++ b/crates/goose-server/src/routes/config_management.rs @@ -51,7 +51,6 @@ pub struct ConfigKeyQuery { pub is_secret: bool, } - #[derive(Serialize, ToSchema)] pub struct ConfigResponse { pub config: HashMap, diff --git a/crates/goose/src/providers/canonical/name_builder.rs b/crates/goose/src/providers/canonical/name_builder.rs index 0741159ddbcf..c82629ed56c4 100644 --- a/crates/goose/src/providers/canonical/name_builder.rs +++ b/crates/goose/src/providers/canonical/name_builder.rs @@ -1,9 +1,7 @@ use once_cell::sync::Lazy; use regex::Regex; -static NORMALIZE_VERSION_RE: Lazy = Lazy::new(|| { - Regex::new(r"-(\d)-(\d)(-|$)").unwrap() -}); +static NORMALIZE_VERSION_RE: Lazy = Lazy::new(|| Regex::new(r"-(\d)-(\d)(-|$)").unwrap()); static STRIP_PATTERNS: Lazy> = Lazy::new(|| { vec![ @@ -302,90 +300,243 @@ mod tests { let r = super::super::CanonicalModelRegistry::bundled().unwrap(); // === Direct provider (non-hosting) === - assert_eq!(map_to_canonical_model("anthropic", "claude-3-5-sonnet-20241022", r), Some("anthropic/claude-3.5-sonnet".to_string())); - assert_eq!(map_to_canonical_model("openai", "gpt-4o-latest", r), Some("openai/gpt-4o".to_string())); - assert_eq!(map_to_canonical_model("openai", "gpt-4-turbo-2024-04-09", r), Some("openai/gpt-4-turbo".to_string())); + assert_eq!( + map_to_canonical_model("anthropic", "claude-3-5-sonnet-20241022", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); + assert_eq!( + map_to_canonical_model("openai", "gpt-4o-latest", r), + Some("openai/gpt-4o".to_string()) + ); + assert_eq!( + map_to_canonical_model("openai", "gpt-4-turbo-2024-04-09", r), + Some("openai/gpt-4-turbo".to_string()) + ); // === OpenRouter (already canonical format) === - assert_eq!(map_to_canonical_model("openrouter", "anthropic/claude-3.5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!( + map_to_canonical_model("openrouter", "anthropic/claude-3.5-sonnet", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); // === Anthropic Claude - basic === - assert_eq!(map_to_canonical_model("databricks", "claude-3-5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); - assert_eq!(map_to_canonical_model("databricks", "claude-3-5-sonnet-20241022", r), Some("anthropic/claude-3.5-sonnet".to_string())); - assert_eq!(map_to_canonical_model("databricks", "claude-3-5-sonnet-latest", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "claude-3-5-sonnet", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "claude-3-5-sonnet-20241022", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "claude-3-5-sonnet-latest", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); // === Claude word-order swapping (3.x series) === - assert_eq!(map_to_canonical_model("databricks", "claude-haiku-3-5", r), Some("anthropic/claude-3.5-haiku".to_string())); - assert_eq!(map_to_canonical_model("databricks", "claude-sonnet-3-7", r), Some("anthropic/claude-3.7-sonnet".to_string())); - assert_eq!(map_to_canonical_model("databricks", "ng-tools-claude-haiku-3-5", r), Some("anthropic/claude-3.5-haiku".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "claude-haiku-3-5", r), + Some("anthropic/claude-3.5-haiku".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "claude-sonnet-3-7", r), + Some("anthropic/claude-3.7-sonnet".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "ng-tools-claude-haiku-3-5", r), + Some("anthropic/claude-3.5-haiku".to_string()) + ); // === Claude word-order swapping (4.x series) === - assert_eq!(map_to_canonical_model("databricks", "claude-4-opus", r), Some("anthropic/claude-opus-4".to_string())); - assert_eq!(map_to_canonical_model("databricks", "claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); - assert_eq!(map_to_canonical_model("databricks", "raml-claude-opus-4-5", r), Some("anthropic/claude-opus-4.5".to_string())); - assert_eq!(map_to_canonical_model("databricks", "databricks-claude-sonnet-4-5", r), Some("anthropic/claude-sonnet-4.5".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "claude-4-opus", r), + Some("anthropic/claude-opus-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "claude-4-sonnet", r), + Some("anthropic/claude-sonnet-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "raml-claude-opus-4-5", r), + Some("anthropic/claude-opus-4.5".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "databricks-claude-sonnet-4-5", r), + Some("anthropic/claude-sonnet-4.5".to_string()) + ); // === Claude with custom prefixes === - assert_eq!(map_to_canonical_model("databricks", "goose-claude-4-opus", r), Some("anthropic/claude-opus-4".to_string())); - assert_eq!(map_to_canonical_model("databricks", "kgoose-claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); - assert_eq!(map_to_canonical_model("databricks", "headless-goose-claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); - assert_eq!(map_to_canonical_model("databricks", "kgoose-cashapp-claude-4-sonnet", r), Some("anthropic/claude-sonnet-4".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "goose-claude-4-opus", r), + Some("anthropic/claude-opus-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "kgoose-claude-4-sonnet", r), + Some("anthropic/claude-sonnet-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "headless-goose-claude-4-sonnet", r), + Some("anthropic/claude-sonnet-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "kgoose-cashapp-claude-4-sonnet", r), + Some("anthropic/claude-sonnet-4".to_string()) + ); // === Claude with platform suffixes === - assert_eq!(map_to_canonical_model("databricks", "claude-4-sonnet-bedrock", r), Some("anthropic/claude-sonnet-4".to_string())); - assert_eq!(map_to_canonical_model("databricks", "goose-claude-4-sonnet-bedrock", r), Some("anthropic/claude-sonnet-4".to_string())); - assert_eq!(map_to_canonical_model("bedrock", "claude-3-5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "claude-4-sonnet-bedrock", r), + Some("anthropic/claude-sonnet-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "goose-claude-4-sonnet-bedrock", r), + Some("anthropic/claude-sonnet-4".to_string()) + ); + assert_eq!( + map_to_canonical_model("bedrock", "claude-3-5-sonnet", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); // === OpenAI GPT === - assert_eq!(map_to_canonical_model("databricks", "gpt-4o", r), Some("openai/gpt-4o".to_string())); - assert_eq!(map_to_canonical_model("databricks", "gpt-4o-2024-11-20", r), Some("openai/gpt-4o".to_string())); - assert_eq!(map_to_canonical_model("databricks", "gpt-4o-latest", r), Some("openai/gpt-4o".to_string())); - assert_eq!(map_to_canonical_model("databricks", "kgoose-gpt-4o", r), Some("openai/gpt-4o".to_string())); - assert_eq!(map_to_canonical_model("azure", "gpt-4o", r), Some("openai/gpt-4o".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "gpt-4o", r), + Some("openai/gpt-4o".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "gpt-4o-2024-11-20", r), + Some("openai/gpt-4o".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "gpt-4o-latest", r), + Some("openai/gpt-4o".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "kgoose-gpt-4o", r), + Some("openai/gpt-4o".to_string()) + ); + assert_eq!( + map_to_canonical_model("azure", "gpt-4o", r), + Some("openai/gpt-4o".to_string()) + ); // === OpenAI O-series === - assert_eq!(map_to_canonical_model("databricks", "goose-o1", r), Some("openai/o1".to_string())); - assert_eq!(map_to_canonical_model("databricks", "kgoose-o3", r), Some("openai/o3".to_string())); - assert_eq!(map_to_canonical_model("databricks", "headless-goose-o3-mini", r), Some("openai/o3-mini".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "goose-o1", r), + Some("openai/o1".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "kgoose-o3", r), + Some("openai/o3".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "headless-goose-o3-mini", r), + Some("openai/o3-mini".to_string()) + ); // === Google Gemini === - assert_eq!(map_to_canonical_model("databricks", "gemini-2-5-flash", r), Some("google/gemini-2.5-flash".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "gemini-2-5-flash", r), + Some("google/gemini-2.5-flash".to_string()) + ); // === Meta Llama === - assert_eq!(map_to_canonical_model("databricks", "meta-llama-3-1-70b-instruct", r), Some("meta-llama/llama-3.1-70b-instruct".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "meta-llama-3-1-70b-instruct", r), + Some("meta-llama/llama-3.1-70b-instruct".to_string()) + ); // === Mistral variants === - assert_eq!(map_to_canonical_model("databricks", "codestral", r), Some("mistralai/codestral".to_string())); - assert_eq!(map_to_canonical_model("databricks", "ministral-8b", r), Some("mistralai/ministral-8b".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "codestral", r), + Some("mistralai/codestral".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "ministral-8b", r), + Some("mistralai/ministral-8b".to_string()) + ); // === DeepSeek === - assert_eq!(map_to_canonical_model("databricks", "databricks-deepseek-chat", r), Some("deepseek/deepseek-chat".to_string())); - assert_eq!(map_to_canonical_model("databricks", "deepseek-r1", r), Some("deepseek/deepseek-r1".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "databricks-deepseek-chat", r), + Some("deepseek/deepseek-chat".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "deepseek-r1", r), + Some("deepseek/deepseek-r1".to_string()) + ); // === Qwen === - assert_eq!(map_to_canonical_model("databricks", "qwen-2-5-72b-instruct", r), Some("qwen/qwen-2.5-72b-instruct".to_string())); - assert_eq!(map_to_canonical_model("databricks", "goose-qwen-2-5-72b-instruct", r), Some("qwen/qwen-2.5-72b-instruct".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "qwen-2-5-72b-instruct", r), + Some("qwen/qwen-2.5-72b-instruct".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "goose-qwen-2-5-72b-instruct", r), + Some("qwen/qwen-2.5-72b-instruct".to_string()) + ); // === Grok (X.AI) === - assert_eq!(map_to_canonical_model("databricks", "grok-3", r), Some("x-ai/grok-3".to_string())); - assert_eq!(map_to_canonical_model("databricks", "databricks-grok-4-fast", r), Some("x-ai/grok-4-fast".to_string())); - assert_eq!(map_to_canonical_model("databricks", "kgoose-grok-4-fast", r), Some("x-ai/grok-4-fast".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "grok-3", r), + Some("x-ai/grok-3".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "databricks-grok-4-fast", r), + Some("x-ai/grok-4-fast".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "kgoose-grok-4-fast", r), + Some("x-ai/grok-4-fast".to_string()) + ); // === Jamba (AI21) === - assert_eq!(map_to_canonical_model("databricks", "jamba-large-1-7", r), Some("ai21/jamba-large-1.7".to_string())); - assert_eq!(map_to_canonical_model("databricks", "databricks-jamba-large-1-7", r), Some("ai21/jamba-large-1.7".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "jamba-large-1-7", r), + Some("ai21/jamba-large-1.7".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "databricks-jamba-large-1-7", r), + Some("ai21/jamba-large-1.7".to_string()) + ); // === Cohere Command === - assert_eq!(map_to_canonical_model("databricks", "command-r-plus-08", r), Some("cohere/command-r-plus-08".to_string())); - assert_eq!(map_to_canonical_model("databricks", "goose-command-r-08", r), Some("cohere/command-r-08".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "command-r-plus-08", r), + Some("cohere/command-r-plus-08".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "goose-command-r-08", r), + Some("cohere/command-r-08".to_string()) + ); // === Provider-prefixed extraction === - assert_eq!(map_to_canonical_model("databricks", "anthropic-claude-3-5-sonnet", r), Some("anthropic/claude-3.5-sonnet".to_string())); - assert_eq!(map_to_canonical_model("databricks", "openai-gpt-4o", r), Some("openai/gpt-4o".to_string())); - assert_eq!(map_to_canonical_model("databricks", "google-gemini-2-5-flash", r), Some("google/gemini-2.5-flash".to_string())); - assert_eq!(map_to_canonical_model("databricks", "mistralai-mistral-large", r), Some("mistralai/mistral-large".to_string())); - assert_eq!(map_to_canonical_model("databricks", "deepseek-deepseek-chat", r), Some("deepseek/deepseek-chat".to_string())); - assert_eq!(map_to_canonical_model("databricks", "qwen-qwen-2-5-72b-instruct", r), Some("qwen/qwen-2.5-72b-instruct".to_string())); - assert_eq!(map_to_canonical_model("databricks", "x-ai-grok-3", r), Some("x-ai/grok-3".to_string())); + assert_eq!( + map_to_canonical_model("databricks", "anthropic-claude-3-5-sonnet", r), + Some("anthropic/claude-3.5-sonnet".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "openai-gpt-4o", r), + Some("openai/gpt-4o".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "google-gemini-2-5-flash", r), + Some("google/gemini-2.5-flash".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "mistralai-mistral-large", r), + Some("mistralai/mistral-large".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "deepseek-deepseek-chat", r), + Some("deepseek/deepseek-chat".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "qwen-qwen-2-5-72b-instruct", r), + Some("qwen/qwen-2.5-72b-instruct".to_string()) + ); + assert_eq!( + map_to_canonical_model("databricks", "x-ai-grok-3", r), + Some("x-ai/grok-3".to_string()) + ); } }