Compare commits

...

985 Commits

Author SHA1 Message Date
Aiden Cline 0d95bd3fc2 Update model in opencode workflow to gpt-5.5 2026-06-28 10:31:46 -05:00
Aiden Cline 3464977f8b Merge branch 'dev' into lf-opencode-provider-workflow 2026-06-28 10:31:29 -05:00
Aiden Cline 31c1285790 Update opencode action to use latest version 2026-06-28 10:31:04 -05:00
Aiden Cline 251f87abed ci: use opencode provider in workflow
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
2026-06-28 04:27:33 +00:00
Aiden Cline 985600d642 Stop tracking opencode package lock 2026-06-27 19:12:05 -05:00
Aiden Cline 06586c1992 Merge pull request #2871 from anomalyco/automation/sync-models-huggingface
chore(sync): update Hugging Face model catalog
2026-06-27 19:08:55 -05:00
opencode-agent[bot] b62addbab1 Add reasoning_options to HF gpt-oss-120b
Co-authored-by: rekram1-node <rekram1-node@users.noreply.github.com>
2026-06-27 23:44:20 +00:00
Aiden Cline 41dcf3da4b Update model in opencode workflow to Claude Opus 2026-06-27 18:43:00 -05:00
Aiden Cline 946dd9ebb2 Merge pull request #2856 from rekram1-node/fix-reasoning-options-snowflake-cortex
[snowflake-cortex] Fix reasoning options metadata
2026-06-27 18:41:39 -05:00
Aiden Cline fbf6beb104 Merge pull request #2870 from rekram1-node/fix-reasoning-options-requesty
[requesty] Fix reasoning options metadata
2026-06-27 18:41:14 -05:00
Aiden Cline 8b32c7c9d6 Merge pull request #2865 from rekram1-node/fix-reasoning-options-llmgateway
[llmgateway] Fix reasoning options metadata
2026-06-27 18:40:50 -05:00
Aiden Cline 4a97b967ff Merge pull request #2869 from rekram1-node/fix-reasoning-options-orcarouter
[orcarouter] Fix reasoning options metadata
2026-06-27 18:40:25 -05:00
Aiden Cline 4c9677d5c3 Merge pull request #2861 from rekram1-node/fix-reasoning-options-baseten
[baseten] Fix reasoning options metadata
2026-06-27 18:39:36 -05:00
Aiden Cline 8d6cb5533d Merge pull request #2860 from rekram1-node/fix-reasoning-options-qiniu-ai
[qiniu-ai] Fix reasoning options metadata
2026-06-27 18:39:25 -05:00
Aiden Cline d9838e0823 Merge pull request #2839 from rekram1-node/fix-reasoning-options-claudinio
[claudinio] Fix reasoning options metadata
2026-06-27 18:38:39 -05:00
Aiden Cline 7e6853d4b2 [requesty] Restore shared reasoning controls 2026-06-27 18:38:36 -05:00
Aiden Cline 9ebc99169b Merge pull request #2838 from rekram1-node/fix-reasoning-options-stackit
[stackit] Fix reasoning options metadata
2026-06-27 18:38:30 -05:00
Aiden Cline 0fc7bc5f91 Merge pull request #2835 from rekram1-node/fix-reasoning-options-302ai
[302ai] Fix reasoning options metadata
2026-06-27 18:37:42 -05:00
github-actions[bot] 30bf59c9da chore(sync): update Hugging Face model catalog 2026-06-27 23:36:51 +00:00
Aiden Cline 108c65f1ef [stackit] Add GPT-OSS reasoning effort metadata 2026-06-27 18:36:41 -05:00
Aiden Cline 920ff2c905 Merge pull request #2880 from rekram1-node/fix-reasoning-options-vivgrid
[vivgrid] Restore reasoning evidence comments
2026-06-27 18:36:35 -05:00
Aiden Cline d8fdfcea79 Merge pull request #2884 from rekram1-node/reaudit-reasoning-options-alibaba
[alibaba] Narrow reasoning budget metadata
2026-06-27 18:36:00 -05:00
Aiden Cline 5c3d9d9d5f [snowflake-cortex] Limit options to chat completions surface 2026-06-27 18:35:28 -05:00
Aiden Cline 48cb5cfb24 Merge pull request #2851 from rekram1-node/fix-reasoning-options-wandb
[wandb] Fix reasoning options metadata
2026-06-27 18:34:35 -05:00
Aiden Cline d30a76dd2d Merge pull request #2853 from rekram1-node/fix-reasoning-options-scaleway
[scaleway] Fix reasoning options metadata
2026-06-27 18:34:21 -05:00
Aiden Cline 64db9dd334 [qiniu-ai] Remove overbroad reasoning controls 2026-06-27 18:33:49 -05:00
Aiden Cline 8b4378ddeb Merge pull request #2858 from rekram1-node/fix-reasoning-options-perplexity-agent
[perplexity-agent] Fix reasoning options metadata
2026-06-27 18:32:40 -05:00
Aiden Cline e18ce969dd Merge pull request #2833 from rekram1-node/fix-reasoning-options-routing-run
[routing-run] Fix reasoning options metadata
2026-06-27 18:31:42 -05:00
Aiden Cline dc22e0e58b [qiniu-ai] Refine reasoning options audit 2026-06-27 18:27:28 -05:00
Aiden Cline dc8f95a5ee Merge pull request #2837 from rekram1-node/fix-reasoning-options-synthetic
[synthetic] Fix reasoning options metadata
2026-06-27 18:25:49 -05:00
Aiden Cline 88eeecdac9 Merge pull request #2834 from rekram1-node/fix-reasoning-options-ambient
[ambient] Fix reasoning options metadata
2026-06-27 18:25:09 -05:00
Aiden Cline 797c2c628f [snowflake-cortex] Add xhigh Claude effort metadata 2026-06-27 18:24:38 -05:00
Aiden Cline d438af659a Merge pull request #2832 from rekram1-node/fix-reasoning-options-cloudflare-workers-ai
[cloudflare-workers-ai] Fix reasoning options metadata
2026-06-27 18:24:38 -05:00
Aiden Cline 8b1664e852 [scaleway] Restore GLM reasoning efforts 2026-06-27 18:24:36 -05:00
Aiden Cline 4339a24b30 [perplexity-agent] Restore reasoning effort metadata 2026-06-27 18:24:33 -05:00
Aiden Cline df1615e94e Merge pull request #2831 from rekram1-node/fix-reasoning-options-poe
[poe] Fix reasoning options metadata
2026-06-27 18:24:23 -05:00
Aiden Cline 4e67698636 Merge branch 'dev' into fix-reasoning-options-cloudflare-workers-ai 2026-06-27 18:24:07 -05:00
Aiden Cline 28c6810100 [wandb] Restore documented reasoning toggles 2026-06-27 18:22:49 -05:00
Aiden Cline 09d6911343 Merge pull request #2850 from rekram1-node/fix-reasoning-options-siliconflow-cn
[siliconflow-cn] Fix reasoning options metadata
2026-06-27 18:21:33 -05:00
Aiden Cline 9f205211fb [baseten] Restore chat template reasoning toggles 2026-06-27 18:21:32 -05:00
Aiden Cline ed7540c2f6 Merge pull request #2847 from rekram1-node/fix-reasoning-options-xpersona
[xpersona] Fix reasoning options metadata
2026-06-27 18:20:16 -05:00
Aiden Cline 3d1c37e41f Merge pull request #2862 from rekram1-node/fix-reasoning-options-stepfun-ai
[stepfun-ai] Fix reasoning options metadata
2026-06-27 18:18:35 -05:00
Aiden Cline a8e4d5af4c Merge pull request #2863 from rekram1-node/fix-reasoning-options-openrouter
[openrouter] Fix reasoning options metadata
2026-06-27 18:18:22 -05:00
Aiden Cline 8699281189 [snowflake-cortex] Remove adaptive Claude budget claims 2026-06-27 18:17:03 -05:00
Aiden Cline 7dab52f5f0 Merge pull request #2859 from rekram1-node/fix-reasoning-options-alibaba-cn
[alibaba-cn] Fix reasoning options metadata
2026-06-27 18:16:28 -05:00
Aiden Cline 67fefbec4e Merge pull request #2857 from rekram1-node/fix-reasoning-options-alibaba-coding-plan-cn
[alibaba-coding-plan-cn] Fix reasoning options metadata
2026-06-27 18:15:56 -05:00
Aiden Cline d081dd45be [llmgateway] Use effort options for GLM 5.2 2026-06-27 18:15:31 -05:00
Aiden Cline 4eaf681c48 [xpersona] Restore shared effort values 2026-06-27 18:15:31 -05:00
Aiden Cline f52f3eab54 Merge pull request #2855 from rekram1-node/fix-reasoning-options-friendli
[friendli] Fix reasoning options metadata
2026-06-27 18:15:04 -05:00
Aiden Cline 835be1f899 [siliconflow-cn] Restore GLM 5.2 effort options 2026-06-27 18:14:56 -05:00
Aiden Cline 0d145c913f Merge pull request #2854 from rekram1-node/fix-reasoning-options-stepfun
[stepfun] Fix reasoning options metadata
2026-06-27 18:14:55 -05:00
Aiden Cline d8fb748015 Merge pull request #2852 from rekram1-node/fix-reasoning-options-cortecs
[cortecs] Fix reasoning options metadata
2026-06-27 18:14:30 -05:00
Aiden Cline de1dee022a Merge pull request #2848 from rekram1-node/fix-reasoning-options-tencent-tokenhub
[tencent-tokenhub] Fix reasoning options metadata
2026-06-27 18:13:42 -05:00
Aiden Cline 28525cb562 Merge pull request #2842 from rekram1-node/fix-reasoning-options-siliconflow
[siliconflow] Fix reasoning options metadata
2026-06-27 18:10:39 -05:00
Aiden Cline 52d08ddec8 Merge pull request #2846 from rekram1-node/fix-reasoning-options-crof
[crof] Fix reasoning options metadata
2026-06-27 18:09:59 -05:00
Aiden Cline 62e04bc734 [siliconflow] Restore GLM 5.2 effort options 2026-06-27 18:09:53 -05:00
Aiden Cline c0d5d623bb Enable reasoning in minimax-m2.5 model configuration 2026-06-27 18:09:50 -05:00
Aiden Cline dc06f46bc6 Merge pull request #2845 from rekram1-node/fix-reasoning-options-vercel
[vercel] Fix reasoning options metadata
2026-06-27 18:09:24 -05:00
Aiden Cline 2c7ac901ea Merge pull request #2844 from rekram1-node/fix-reasoning-options-neuralwatt
[neuralwatt] Fix reasoning options metadata
2026-06-27 18:09:10 -05:00
Aiden Cline ede73de230 Merge pull request #2843 from rekram1-node/fix-reasoning-options-openai
[openai] Fix reasoning options metadata
2026-06-27 18:09:02 -05:00
Aiden Cline cd36995c7b [perplexity-agent] Narrow reasoning options metadata 2026-06-27 18:08:34 -05:00
Aiden Cline ea8fc3996e Merge pull request #2841 from rekram1-node/fix-reasoning-options-zenmux
[zenmux] Fix reasoning options metadata
2026-06-27 18:08:22 -05:00
Aiden Cline ca696b1f8d Merge pull request #2864 from rekram1-node/fix-reasoning-options-sap-ai-core
[sap-ai-core] Fix reasoning options metadata
2026-06-27 18:08:13 -05:00
Aiden Cline f1ede77285 [alibaba] Narrow reasoning budget metadata 2026-06-27 17:27:31 -05:00
Aiden Cline 25092bfe75 [sap-ai-core] Narrow reasoning option claims 2026-06-27 17:27:15 -05:00
Aiden Cline 75534a295e [neuralwatt] Correct Kimi K2.7 reasoning options 2026-06-27 17:26:55 -05:00
Aiden Cline a70cd24291 [siliconflow] Re-audit reasoning options metadata 2026-06-27 17:26:23 -05:00
Aiden Cline 1b2670010c [wandb] Narrow reasoning options metadata 2026-06-27 17:26:07 -05:00
Aiden Cline 5e74bae2a3 [cloudflare-workers-ai] Correct Gemma reasoning evidence comment 2026-06-27 17:26:06 -05:00
Aiden Cline 9f8b9a1737 [xpersona] Narrow reasoning options metadata 2026-06-27 17:26:06 -05:00
Aiden Cline dddaba4e49 [scaleway] Narrow GLM reasoning options 2026-06-27 17:26:03 -05:00
Aiden Cline fffaae5c4f [synthetic] Narrow Qwen reasoning options 2026-06-27 17:25:46 -05:00
Aiden Cline 6c7d97cf92 [cloudflare-workers-ai] Re-audit reasoning options metadata 2026-06-27 17:25:39 -05:00
Aiden Cline 004fa2b9c3 [orcarouter] Refine reasoning effort metadata 2026-06-27 17:23:56 -05:00
Aiden Cline d30c909f24 Merge pull request #2866 from rekram1-node/fix-reasoning-options-huggingface
[huggingface] Fix reasoning options metadata
2026-06-27 17:22:50 -05:00
Aiden Cline 9c4d583dbb Merge pull request #2840 from rekram1-node/fix-reasoning-options-github-models
[github-models] Fix reasoning options metadata
2026-06-27 17:22:11 -05:00
Aiden Cline 0ac0d23947 Merge remote-tracking branch 'origin/dev' into fix-reasoning-options-vivgrid 2026-06-27 17:18:44 -05:00
Aiden Cline 0ccc0933d7 [orcarouter] Narrow reasoning options metadata 2026-06-27 17:16:38 -05:00
Aiden Cline 9673239efe [requesty] Use conservative reasoning options 2026-06-27 17:16:33 -05:00
Aiden Cline 86a359b44b [vivgrid] Restore reasoning evidence comments 2026-06-27 17:15:38 -05:00
Aiden Cline 4ce79fa001 [sap-ai-core] Restore reasoning evidence comments 2026-06-27 17:15:37 -05:00
Aiden Cline 23c13f39ab [baseten] Restore reasoning comments 2026-06-27 17:15:21 -05:00
Aiden Cline e95d60dfd9 [crof] Restore reasoning evidence comments 2026-06-27 17:15:17 -05:00
Aiden Cline 712333e8e3 [scaleway] Restore reasoning request comments 2026-06-27 17:15:16 -05:00
Aiden Cline d049de4d84 [qiniu-ai] Restore reasoning comments 2026-06-27 17:15:14 -05:00
Aiden Cline 8c9cde2c01 [cortecs] Restore reasoning comments 2026-06-27 17:15:12 -05:00
Aiden Cline cf9042381b [claudinio] Restore reasoning comments 2026-06-27 17:15:11 -05:00
Aiden Cline 21b6ee63fc [synthetic] Restore reasoning evidence comments 2026-06-27 17:15:10 -05:00
Aiden Cline 87a8e79e0d [tencent-tokenhub] Restore reasoning comments 2026-06-27 17:15:08 -05:00
Aiden Cline ec11454048 [github-models] Restore reasoning request comments 2026-06-27 17:15:04 -05:00
Aiden Cline afd08186c9 Merge pull request #2836 from rekram1-node/fix-reasoning-options-azure
[azure] Fix reasoning options metadata
2026-06-27 17:14:49 -05:00
Aiden Cline e9607b9440 Merge pull request #2829 from rekram1-node/fix-reasoning-options-frogbot
[frogbot] Fix reasoning options metadata
2026-06-27 17:14:21 -05:00
Aiden Cline 5593ff7681 Merge pull request #2830 from rekram1-node/fix-reasoning-options-ollama-cloud
[ollama-cloud] Fix reasoning options metadata
2026-06-27 17:14:12 -05:00
Aiden Cline c9613aa97e [xpersona] Restore reasoning docs comment 2026-06-27 17:12:36 -05:00
Aiden Cline 3c6dd0f336 Merge pull request #2849 from rekram1-node/fix-reasoning-options-togetherai
[togetherai] Fix reasoning options metadata
2026-06-27 17:11:45 -05:00
Aiden Cline 85c3107e0f Merge pull request #2867 from rekram1-node/fix-reasoning-options-alibaba
[alibaba] Fix reasoning options metadata
2026-06-27 17:10:19 -05:00
Aiden Cline 9fb6fbe38d Merge pull request #2868 from rekram1-node/fix-reasoning-options-vivgrid
[vivgrid] Fix reasoning options metadata
2026-06-27 17:10:10 -05:00
Aiden Cline 798c451bf7 Update model in opencode workflow to gpt-5.5 2026-06-27 17:08:21 -05:00
Aiden Cline 57880dd4e9 Merge pull request #2872 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-27 17:07:32 -05:00
Aiden Cline a6105407dd Merge pull request #2878 from rekram1-node/fix-reasoning-options-nano-gpt
[nano-gpt] Fix reasoning options metadata
2026-06-27 17:05:24 -05:00
Aiden Cline ff0b42e54f Merge pull request #2879 from rekram1-node/fix-reasoning-options-kilo
[kilo] Fix reasoning options metadata
2026-06-27 17:05:09 -05:00
Aiden Cline dd585d5531 [kilo] Fix reasoning options metadata 2026-06-27 16:54:01 -05:00
Aiden Cline b76ccf339c Merge pull request #2873 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-27 16:53:42 -05:00
Aiden Cline 574da64301 [nano-gpt] Fix reasoning options metadata 2026-06-27 16:53:41 -05:00
Aiden Cline 52b209cfb3 Merge pull request #2874 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-27 16:53:29 -05:00
Aiden Cline 467b5ad4ad Merge pull request #2875 from anomalyco/automation/sync-models-cloudflare-workers-ai
chore(sync): update Cloudflare Workers AI model catalog
2026-06-27 16:53:20 -05:00
github-actions[bot] 20a1d0682a chore(sync): update OpenRouter model catalog 2026-06-27 21:39:13 +00:00
github-actions[bot] 90f8f97578 chore(sync): update Cloudflare Workers AI model catalog 2026-06-27 21:39:13 +00:00
github-actions[bot] a8a4f3246d chore(sync): update Venice model catalog 2026-06-27 21:39:11 +00:00
github-actions[bot] 1e38a0bb0a chore(sync): update Vercel AI Gateway model catalog 2026-06-27 21:39:11 +00:00
Aiden Cline f0c5868023 [requesty] Fix reasoning options metadata 2026-06-27 11:31:05 -05:00
Aiden Cline f6c09475e0 [orcarouter] Fix reasoning options metadata 2026-06-27 11:30:13 -05:00
Aiden Cline 7ab1bc6443 [llmgateway] Fix reasoning options metadata 2026-06-27 11:30:02 -05:00
Aiden Cline 3d7e969d35 [vivgrid] Fix reasoning options metadata 2026-06-27 11:30:01 -05:00
Aiden Cline 077351b8d4 [huggingface] Correct reasoning option controls 2026-06-27 11:29:59 -05:00
Aiden Cline 74730af7d7 [alibaba] Fix reasoning options metadata 2026-06-27 11:29:58 -05:00
Aiden Cline dc66f58a91 [sap-ai-core] Fix reasoning options metadata 2026-06-27 11:29:45 -05:00
Aiden Cline 1d7874e5e1 [stepfun-ai] Fix reasoning options metadata 2026-06-27 11:29:38 -05:00
Aiden Cline 6fb083f31c [baseten] Fix reasoning options metadata 2026-06-27 11:29:28 -05:00
Aiden Cline 863bf99fff [qiniu-ai] Fix reasoning options metadata 2026-06-27 11:29:18 -05:00
Aiden Cline 5680b9638b [snowflake-cortex] Fix reasoning options metadata 2026-06-27 11:29:15 -05:00
Aiden Cline e8affcf23b [openrouter] Fix reasoning options metadata 2026-06-27 11:29:12 -05:00
Aiden Cline 024ccf57f1 [perplexity-agent] Fix reasoning options metadata 2026-06-27 11:29:10 -05:00
Aiden Cline cee02de41c [cortecs] Correct gpt-oss reasoning metadata 2026-06-27 11:28:56 -05:00
Aiden Cline 82b7b612a9 [alibaba-coding-plan-cn] Fix reasoning options metadata 2026-06-27 11:28:55 -05:00
Aiden Cline 0a01441c11 [scaleway] Fix reasoning options metadata 2026-06-27 11:28:53 -05:00
Aiden Cline f4969d166a [alibaba-cn] Fix reasoning options metadata 2026-06-27 11:28:50 -05:00
Aiden Cline ff6b227c2e [friendli] Fix reasoning options metadata 2026-06-27 11:28:48 -05:00
Aiden Cline dfdc989086 [xpersona] Fix reasoning options metadata 2026-06-27 11:28:38 -05:00
Aiden Cline 92defb9020 [wandb] Fix reasoning options metadata 2026-06-27 11:28:36 -05:00
Aiden Cline 26bb6dc9db [huggingface] Fix reasoning options metadata 2026-06-27 11:28:31 -05:00
Aiden Cline b1a1b82f5e [togetherai] Fix reasoning options metadata 2026-06-27 11:28:19 -05:00
Aiden Cline ee49e752e8 [tencent-tokenhub] Fix reasoning options metadata 2026-06-27 11:28:17 -05:00
Aiden Cline 053898f239 [siliconflow] Fix reasoning options metadata 2026-06-27 11:28:11 -05:00
Aiden Cline e0f6074281 [stepfun] Fix reasoning options metadata 2026-06-27 11:28:07 -05:00
Aiden Cline 7651e8079f [neuralwatt] Fix reasoning options metadata 2026-06-27 11:28:02 -05:00
Aiden Cline 8168ed401e [vercel] Fix reasoning options metadata 2026-06-27 11:27:57 -05:00
Aiden Cline 5cefa91f88 [crof] Fix reasoning options metadata 2026-06-27 11:27:56 -05:00
Aiden Cline 77d75c821a [siliconflow-cn] Fix reasoning options metadata 2026-06-27 11:27:55 -05:00
Aiden Cline 502362d517 [ambient] Fix reasoning options metadata 2026-06-27 11:27:53 -05:00
Aiden Cline 025cbaeb32 [synthetic] Fix reasoning options metadata 2026-06-27 11:27:52 -05:00
Aiden Cline c4ebaf1ce3 [zenmux] Fix reasoning options metadata 2026-06-27 11:27:49 -05:00
Aiden Cline 5da3e87e44 [stackit] Fix reasoning options metadata 2026-06-27 11:27:39 -05:00
Aiden Cline d8d35aebdc [claudinio] Fix reasoning options metadata 2026-06-27 11:27:39 -05:00
Aiden Cline f85dcc0997 [openai] Fix reasoning options metadata 2026-06-27 11:27:35 -05:00
Aiden Cline 22b4d5a86c [github-models] Fix reasoning options metadata 2026-06-27 11:27:32 -05:00
Aiden Cline e0f1ee1b91 [302ai] Fix reasoning options metadata 2026-06-27 11:27:31 -05:00
Aiden Cline 4571b1c50c [azure] Fix reasoning options metadata 2026-06-27 11:27:25 -05:00
Aiden Cline a40a07ed3a [routing-run] Fix reasoning options metadata 2026-06-27 11:27:24 -05:00
Aiden Cline 5bba2aac9a [cloudflare-workers-ai] Fix reasoning options metadata 2026-06-27 11:27:12 -05:00
Aiden Cline 468668e60a [poe] Fix reasoning options metadata 2026-06-27 11:27:07 -05:00
Aiden Cline cc1a295a48 [cortecs] Fix reasoning options metadata 2026-06-27 11:26:52 -05:00
Aiden Cline 4a90bc4846 [frogbot] Fix reasoning options metadata 2026-06-27 11:26:29 -05:00
Aiden Cline f2347c32c4 [ollama-cloud] Fix reasoning options metadata 2026-06-27 11:26:11 -05:00
Aiden Cline 4ad2550b14 Merge pull request #2517 from anomalyco/split/vercel-anthropic-reasoning-options
[vercel/anthropic] Add reasoning options
2026-06-27 11:16:34 -05:00
Aiden Cline 1eece72edf Merge pull request #2520 from anomalyco/split/vercel-deepseek-reasoning-options
[vercel/deepseek] Add reasoning options
2026-06-27 11:16:07 -05:00
Aiden Cline e02c7e1971 Merge pull request #2564 from anomalyco/consolidate/alibaba-small-labs-reasoning-options
[alibaba/multiple labs] Add reasoning options
2026-06-27 11:15:45 -05:00
Aiden Cline 323af4b323 Merge pull request #2521 from anomalyco/split/vercel-google-reasoning-options
[vercel/google] Add reasoning options
2026-06-27 11:15:21 -05:00
Aiden Cline aa7d3de18a Merge pull request #2825 from c99e/migrate-gpt-oss-base-model
refactor: migrate gpt-oss-120b provider files to base_model
2026-06-27 11:13:53 -05:00
Aiden Cline 4179c71c35 Merge pull request #2621 from Yashwanth-Kumar-26/patch-1
Add Minimax-M3
2026-06-27 11:11:15 -05:00
Aiden Cline 6f623398ed Fix NVIDIA MiniMax M3 metadata 2026-06-27 11:09:59 -05:00
Aiden Cline 78db7aa046 Merge pull request #2827 from anomalyco/audit/vercel-raw-reasoning-fixes
[vercel] Correct raw gateway reasoning options
2026-06-27 11:08:18 -05:00
Aiden Cline b9e9a3ad2f [vercel] Correct raw gateway reasoning options 2026-06-27 11:07:19 -05:00
Aiden Cline af448bf39b [vercel/deepseek] Use gateway effort aliases 2026-06-27 11:04:19 -05:00
Aiden Cline 0aa6e4d6c5 [vercel/anthropic] Align reasoning options with raw gateway 2026-06-27 11:04:18 -05:00
Aiden Cline bca710c271 [vercel/google] Align reasoning options with raw gateway 2026-06-27 11:04:18 -05:00
c99e b3e5684963 refactor: migrate gpt-oss-120b provider files to base_model
Follows #2819, which added the canonical models/openai/gpt-oss-120b and
gpt-oss-safeguard-120b entries. Migrates 10 provider files to inherit via
base_model, keeping only provider-specific fields (cost, reasoning_options,
divergent limit/date/name). Zero output change — generated catalog byte-identical.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 20:00:30 +04:00
Aiden Cline 15a794f54e Merge pull request #2821 from imagebuilder1837/fix-siliconflow-glm-5-2-limits
fix(siliconflow): correct GLM-5.2 limits
2026-06-27 10:55:13 -05:00
Aiden Cline 08175a1092 Merge pull request #2819 from c99e/canonical-gpt-oss
feat(openai): add canonical gpt-oss-120b + gpt-oss-safeguard-120b metadata
2026-06-27 10:54:52 -05:00
Aiden Cline 7238372691 Merge pull request #2820 from TheStreamCode/fix-sync-windows-path-separators
fix(sync): normalize Windows path separators in the sync runner
2026-06-27 10:54:32 -05:00
Aiden Cline c31ed262b7 Merge pull request #2818 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-27 10:54:13 -05:00
Aiden Cline f0d4152004 Merge pull request #2514 from anomalyco/split/vercel-alibaba-reasoning-options-part-1
[vercel/alibaba part 1] Add reasoning options
2026-06-27 10:50:02 -05:00
Aiden Cline ee9dd084e5 Merge pull request #2513 from anomalyco/split/siliconflow-zai-org-reasoning-options
[siliconflow/zai-org] Add reasoning options
2026-06-27 10:49:49 -05:00
Aiden Cline 521bb2c01f Merge pull request #2509 from anomalyco/split/siliconflow-qwen-reasoning-options-part-3
[siliconflow/Qwen part 3] Add reasoning options
2026-06-27 10:49:36 -05:00
Aiden Cline adf98a4380 Merge pull request #2508 from anomalyco/split/siliconflow-qwen-reasoning-options-part-2
[siliconflow/Qwen part 2] Add reasoning options
2026-06-27 10:49:15 -05:00
Aiden Cline 794c09f75d Merge pull request #2507 from anomalyco/split/siliconflow-qwen-reasoning-options-part-1
[siliconflow/Qwen part 1] Add reasoning options
2026-06-27 10:49:05 -05:00
Aiden Cline 37f1b7e23e Merge pull request #2506 from anomalyco/split/siliconflow-pro-reasoning-options
[siliconflow/Pro] Add reasoning options
2026-06-27 10:48:48 -05:00
Aiden Cline fddcbbb9fe Merge pull request #2502 from anomalyco/split/siliconflow-moonshotai-reasoning-options
[siliconflow/moonshotai] Add reasoning options
2026-06-27 10:48:37 -05:00
Aiden Cline 8f73c20afa Merge pull request #2497 from anomalyco/split/siliconflow-deepseek-ai-reasoning-options
[siliconflow/deepseek-ai] Add reasoning options
2026-06-27 10:48:11 -05:00
Aiden Cline 2c6bfbb83b Merge pull request #2495 from anomalyco/split/poe-xai-reasoning-options
[poe/xai] Add reasoning options
2026-06-27 10:47:50 -05:00
Aiden Cline e88b334e8e Merge pull request #2493 from anomalyco/split/poe-openai-reasoning-options-part-2
[poe/openai part 2] Add reasoning options
2026-06-27 10:47:41 -05:00
Aiden Cline 5c4ccdfc72 Merge pull request #2492 from anomalyco/split/poe-openai-reasoning-options-part-1
[poe/openai part 1] Add reasoning options
2026-06-27 10:47:11 -05:00
Aiden Cline 37270248a4 Merge pull request #2491 from anomalyco/split/poe-novita-reasoning-options
[poe/novita] Add reasoning options
2026-06-27 10:45:25 -05:00
Aiden Cline 71d4334143 Merge pull request #2490 from anomalyco/split/poe-google-reasoning-options
[poe/google] Add reasoning options
2026-06-27 10:45:15 -05:00
Aiden Cline 846c6410a6 Merge pull request #2487 from anomalyco/split/poe-anthropic-reasoning-options
[poe/anthropic] Add reasoning options
2026-06-27 10:45:03 -05:00
Aiden Cline 6910e30779 Merge pull request #2486 from anomalyco/split/nano-gpt-zai-org-reasoning-options-part-2
[nano-gpt/zai-org part 2] Add reasoning options
2026-06-27 10:44:37 -05:00
Aiden Cline f29cf9a0ad Merge pull request #2485 from anomalyco/split/nano-gpt-zai-org-reasoning-options-part-1
[nano-gpt/zai-org part 1] Add reasoning options
2026-06-27 10:44:28 -05:00
Aiden Cline f96cc35ad9 Merge pull request #2484 from anomalyco/split/nano-gpt-z-ai-reasoning-options
[nano-gpt/z-ai] Add reasoning options
2026-06-27 10:44:10 -05:00
Aiden Cline 506de032e1 Merge pull request #2482 from anomalyco/split/nano-gpt-tee-reasoning-options
[nano-gpt/TEE] Add reasoning options
2026-06-27 10:44:01 -05:00
Aiden Cline b313c15f8f Merge pull request #2478 from anomalyco/split/nano-gpt-qwen-reasoning-options
[nano-gpt/qwen] Add reasoning options
2026-06-27 10:43:51 -05:00
github-actions[bot] cd70401ec7 chore(sync): update Vercel AI Gateway model catalog 2026-06-27 15:43:09 +00:00
Aiden Cline 248a9750ab Merge pull request #2473 from anomalyco/split/nano-gpt-openai-reasoning-options-part-2
[nano-gpt/openai part 2] Add reasoning options
2026-06-27 10:43:08 -05:00
Aiden Cline b458237fc9 Merge pull request #2472 from anomalyco/split/nano-gpt-openai-reasoning-options-part-1
[nano-gpt/openai part 1] Add reasoning options
2026-06-27 10:42:54 -05:00
Aiden Cline 343fb43564 Merge pull request #2469 from anomalyco/split/nano-gpt-nanogpt-reasoning-options
[nano-gpt/nanogpt] Add reasoning options
2026-06-27 10:41:49 -05:00
Aiden Cline d56a8d98ef Merge pull request #2463 from anomalyco/split/nano-gpt-minimax-reasoning-options
[nano-gpt/minimax] Add reasoning options
2026-06-27 10:41:37 -05:00
Aiden Cline c030e4f90c Merge pull request #2458 from anomalyco/split/nano-gpt-google-reasoning-options-part-3
[nano-gpt/google part 3] Add reasoning options
2026-06-27 10:41:27 -05:00
Aiden Cline 2861ff9445 Merge pull request #2457 from anomalyco/split/nano-gpt-google-reasoning-options-part-2
[nano-gpt/google part 2] Add reasoning options
2026-06-27 10:41:06 -05:00
Aiden Cline 99b75c5630 Merge pull request #2456 from anomalyco/split/nano-gpt-google-reasoning-options-part-1
[nano-gpt/google part 1] Add reasoning options
2026-06-27 10:40:56 -05:00
Aiden Cline b503d4edf4 Merge pull request #2443 from anomalyco/split/llmgateway-zhipuai-reasoning-options
[llmgateway/zhipuai] Add reasoning options
2026-06-27 10:40:43 -05:00
Aiden Cline 77ae78fb83 Merge pull request #2440 from anomalyco/split/llmgateway-openai-reasoning-options-part-2
[llmgateway/openai part 2] Add reasoning options
2026-06-27 10:40:33 -05:00
Aiden Cline a7e15a7348 Merge pull request #2439 from anomalyco/split/llmgateway-openai-reasoning-options-part-1
[llmgateway/openai part 1] Add reasoning options
2026-06-27 10:40:04 -05:00
Aiden Cline 5305281f9d Merge pull request #2438 from anomalyco/split/llmgateway-moonshotai-reasoning-options
[llmgateway/moonshotai] Add reasoning options
2026-06-27 10:39:53 -05:00
Aiden Cline 24418b85b4 Merge pull request #2437 from anomalyco/split/llmgateway-minimax-reasoning-options
[llmgateway/minimax] Add reasoning options
2026-06-27 10:39:32 -05:00
Aiden Cline 138b9d0bed Merge pull request #2436 from anomalyco/split/llmgateway-google-reasoning-options
[llmgateway/google] Add reasoning options
2026-06-27 10:39:22 -05:00
Aiden Cline d79055cf33 Merge pull request #2435 from anomalyco/split/llmgateway-deepseek-reasoning-options
[llmgateway/deepseek] Add reasoning options
2026-06-27 10:39:11 -05:00
Aiden Cline 97e9356f62 Merge pull request #2434 from anomalyco/split/llmgateway-bytedance-reasoning-options
[llmgateway/bytedance] Add reasoning options
2026-06-27 10:39:00 -05:00
Aiden Cline 62648d75ba Merge pull request #2433 from anomalyco/split/llmgateway-anthropic-reasoning-options
[llmgateway/anthropic] Add reasoning options
2026-06-27 10:38:51 -05:00
Aiden Cline a103e033e1 Merge pull request #2431 from anomalyco/split/llmgateway-alibaba-reasoning-options-part-1
[llmgateway/alibaba part 1] Add reasoning options
2026-06-27 10:38:36 -05:00
Aiden Cline 568c5d4774 Merge pull request #2444 from anomalyco/split/nano-gpt-alibaba-reasoning-options-part-1
[nano-gpt/alibaba part 1] Add reasoning options
2026-06-27 10:37:12 -05:00
Aiden Cline 8146ef0a73 Merge pull request #2445 from anomalyco/split/nano-gpt-alibaba-reasoning-options-part-2
[nano-gpt/alibaba part 2] Add reasoning options
2026-06-27 10:37:03 -05:00
Aiden Cline 37b1eba715 Merge pull request #2446 from anomalyco/split/nano-gpt-alibaba-reasoning-options-part-3
[nano-gpt/alibaba part 3] Add reasoning options
2026-06-27 10:36:51 -05:00
Aiden Cline 1855095b39 Merge pull request #2448 from anomalyco/split/nano-gpt-anthropic-reasoning-options-part-1
[nano-gpt/anthropic part 1] Add reasoning options
2026-06-27 10:36:39 -05:00
Aiden Cline 3380669534 Merge pull request #2449 from anomalyco/split/nano-gpt-anthropic-reasoning-options-part-2
[nano-gpt/anthropic part 2] Add reasoning options
2026-06-27 10:35:31 -05:00
Yashwanth Kumar 97964d5699 Update reasoning_options in minimax-m3.toml to include detailed effort levels 2026-06-27 12:23:18 +00:00
Yashwanth Kumar 71d0194633 Update reasoning_options in minimax-m3.toml 2026-06-27 17:36:13 +05:30
Yashwanth Kumar 66d5915716 Update MiniMax M3 model configuration 2026-06-27 17:31:46 +05:30
imagebuilder1837 64cca687f2 fix(siliconflow): correct GLM-5.2 limits 2026-06-27 19:11:17 +08:00
Yashwanth Kumar 9bb7c82103 Remove reasoning_options configuration
Removed reasoning_options from minimax-m3.toml
2026-06-27 12:16:08 +05:30
Yashwanth Kumar fd3366b50e Add reasoning_options to minimax-m3 configuration 2026-06-27 12:13:10 +05:30
thestreamcode 01966108ea fix(sync): normalize Windows path separators in the sync runner
The sync runner builds map keys from path.relative (readModelMetadata)
and path.join (tomlFiles, plus the metadata-namespace cleanup), which
return backslash-separated paths on Windows. Those keys are compared
against forward-slash base_model references, ${id}.toml model ids, and
desiredMetadata paths, so base_model resolution and existing-file
diffing break and bun models:sync <provider> fails on Windows with
"Unable to resolve base_model: ...".

Normalize the three keys with .split(path.sep).join("/") (a no-op on
POSIX), mirroring the fix #2711 applied to src/generate.ts and the
standalone generators.
2026-06-27 08:27:14 +02:00
c99e ac742c52e3 feat(openai): add canonical gpt-oss-120b + gpt-oss-safeguard-120b metadata
Provider-agnostic models/ entries for two OpenAI open-weight models that
lack them, so providers can inherit via base_model instead of full-defining.
Capability flags verified against the live Tinfoil API.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 08:35:50 +04:00
Aiden Cline 69a9e0d3a2 Merge pull request #2455 from anomalyco/split/nano-gpt-deepseek-reasoning-options
[nano-gpt/deepseek] Add reasoning options
2026-06-26 22:53:24 -05:00
Aiden Cline 451bee76e4 Merge pull request #2430 from anomalyco/split/kilo-z-ai-reasoning-options
[kilo/z-ai] Add reasoning options
2026-06-26 22:25:49 -05:00
Aiden Cline 9df7b24837 Merge pull request #2412 from anomalyco/split/kilo-nvidia-reasoning-options
[kilo/nvidia] Add reasoning options
2026-06-26 22:25:40 -05:00
Aiden Cline 5e745b83e8 Merge pull request #2408 from anomalyco/split/kilo-minimax-reasoning-options
[kilo/minimax] Add reasoning options
2026-06-26 22:25:29 -05:00
Aiden Cline 6a85a81d07 Merge pull request #2429 from anomalyco/split/kilo-x-ai-reasoning-options
[kilo/x-ai] Add reasoning options
2026-06-26 22:20:06 -05:00
Aiden Cline f173d942b6 Merge pull request #2422 from anomalyco/split/kilo-qwen-reasoning-options-part-2
[kilo/qwen part 2] Add reasoning options
2026-06-26 22:19:58 -05:00
Aiden Cline 5e3be8bfba Merge pull request #2421 from anomalyco/split/kilo-qwen-reasoning-options-part-1
[kilo/qwen part 1] Add reasoning options
2026-06-26 22:19:48 -05:00
Aiden Cline ae0b8ce047 Merge pull request #2414 from anomalyco/split/kilo-openai-reasoning-options-part-2
[kilo/openai part 2] Add reasoning options
2026-06-26 22:19:36 -05:00
Aiden Cline 9795ca805b Merge pull request #2413 from anomalyco/split/kilo-openai-reasoning-options-part-1
[kilo/openai part 1] Add reasoning options
2026-06-26 22:19:27 -05:00
Aiden Cline 474275507e Merge pull request #2407 from anomalyco/split/kilo-kilo-auto-reasoning-options
[kilo/kilo-auto] Add reasoning options
2026-06-26 22:15:05 -05:00
Aiden Cline b40a1f0165 Merge pull request #2402 from anomalyco/split/kilo-deepseek-reasoning-options
[kilo/deepseek] Add reasoning options
2026-06-26 22:14:53 -05:00
Aiden Cline 09b62980da Merge pull request #2397 from anomalyco/split/kilo-anthropic-reasoning-options
[kilo/anthropic] Add reasoning options
2026-06-26 21:59:24 -05:00
Aiden Cline b6adacb1f5 Merge pull request #2399 from anomalyco/split/kilo-baidu-reasoning-options
[kilo/baidu] Add reasoning options
2026-06-26 21:59:14 -05:00
Aiden Cline 449306eb5f Merge pull request #2400 from anomalyco/split/kilo-bytedance-seed-reasoning-options
[kilo/bytedance-seed] Add reasoning options
2026-06-26 21:59:05 -05:00
Aiden Cline 6f04956007 Merge pull request #2817 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-26 21:11:11 -05:00
Aiden Cline 49c7b93761 fix(vercel): inherit retired Claude Haiku metadata 2026-06-26 21:10:28 -05:00
github-actions[bot] e796e9e71d chore(sync): update Vercel AI Gateway model catalog 2026-06-27 02:04:09 +00:00
Aiden Cline 212fcd9644 Merge pull request #2727 from ebeigarts/patch-1
Mark `claude-3-5-haiku-latest` model as deprecated
2026-06-26 20:59:13 -05:00
Aiden Cline 5e30eb26ba chore(anthropic): remove retired Claude 3.5 Haiku models 2026-06-26 20:53:44 -05:00
Aiden Cline 9d0551d5bc Merge pull request #2709 from TheStreamCode/chutes-sync-glm-5.2
chore(chutes): wire catalog into the model sync system
2026-06-26 20:52:37 -05:00
Aiden Cline bc4def6471 [kilo/deepseek] Fix model-specific reasoning controls 2026-06-26 20:11:25 -05:00
Aiden Cline 1366979181 Merge pull request #2403 from anomalyco/split/kilo-google-reasoning-options-part-1
[kilo/google part 1] Add reasoning options
2026-06-26 18:15:25 -05:00
Aiden Cline b2e2e6418f Merge pull request #2388 from anomalyco/split/frogbot-xai-reasoning-options
[frogbot/xai] Add reasoning options
2026-06-26 18:12:16 -05:00
Aiden Cline 4233a1c8c8 Merge pull request #2387 from anomalyco/split/frogbot-openai-reasoning-options
[frogbot/openai] Add reasoning options
2026-06-26 18:12:03 -05:00
Aiden Cline 2bf5a0e24f Merge pull request #2384 from anomalyco/split/frogbot-google-reasoning-options
[frogbot/google] Add reasoning options
2026-06-26 18:11:53 -05:00
thestreamcode e25bf46ee6 chore(chutes): wire catalog into the model sync system
Replace the standalone generate-chutes.ts with a SyncProvider module
(src/sync/providers/chutes.ts) registered in the sync system, so the
Chutes catalog is kept current by the automated model sync instead of a
hand-run generator. Resync the catalog to the live llm.chutes.ai/v1/models
set (13 models).

- reasoning_options: emit [] — the API advertises a reasoning capability
  but exposes no toggle/effort parameter, so there is no provider evidence
  for a reasoning option.
- Qwen3-235B-A22B-Thinking-2507-TEE: carry checkpoint-specific metadata
  inline instead of factoring it through the generic alibaba/qwen3-235b-a22b
  base (whose context window and capabilities differ).
- Mistral-Nemo-Instruct-2407-TEE references the canonical mistral/mistral-nemo
  via a base_model alias (its "unsloth" source org has no default mapping).
- Correct the inline models' release dates (Thinking-2507 -> 2025-07,
  DeepSeek-V3.2 -> 2025-12).
- Document the provider under "Chutes Notes" in sync.md.
2026-06-27 00:53:52 +02:00
Aiden Cline 20bde8e793 Merge pull request #2806 from c99e/add-tinfoil-provider
feat: add Tinfoil provider
2026-06-26 17:53:26 -05:00
Aiden Cline e3ad3be6ce Merge pull request #2812 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-26 17:52:46 -05:00
Aiden Cline 42ddb6467f Merge pull request #2813 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-26 17:52:30 -05:00
github-actions[bot] b8854ac9bd chore(sync): update Venice model catalog 2026-06-26 22:41:56 +00:00
github-actions[bot] 212e064dd1 chore(sync): update Vercel AI Gateway model catalog 2026-06-26 22:41:55 +00:00
Aiden Cline 5ae293202f Merge pull request #2815 from TheUntraceable/dev
Correct Amazon EU pricing for Haiku 4.5 and Opus 4.5
2026-06-26 14:59:28 -05:00
Ridhwan Hussain b5a11de431 Merge branch 'dev' of https://github.com/anomalyco/models.dev into dev 2026-06-26 20:29:48 +01:00
Ridhwan Hussain b113e47756 fix(amazon-bedrock): fix EU pricing for Haiku 4.5 and Opus 4.5 2026-06-26 20:29:28 +01:00
Aiden Cline f00aec89a5 Merge pull request #2685 from benas-humbility/nebius-glm-5.2
Add Nebius Token Factory GLM-5.2
2026-06-26 12:13:50 -05:00
Aiden Cline 343fe4a87a Merge pull request #2720 from Lee-Si-Yoon/feat/friendli-gemma-4-31b-it
feat(friendli): add gemma-4-31B-it model
2026-06-26 12:11:26 -05:00
Aiden Cline 5b77dddd9c Merge pull request #2721 from Lee-Si-Yoon/feat/friendli-deepseek-v3.2
feat(friendli): add DeepSeek-V3.2 model
2026-06-26 12:11:11 -05:00
Aiden Cline 2c2ad501e6 Merge pull request #2811 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-26 12:11:04 -05:00
Yashwanth Kumar 33db602398 Update minimax-m3.toml configuration settings 2026-06-26 22:28:57 +05:30
github-actions[bot] f2431b8425 chore(sync): update OpenRouter model catalog 2026-06-26 16:56:39 +00:00
c99e 7788774ce6 fix(tinfoil): address review feedback; drop deprecated models
- Add provider logo (logo.svg) from Tinfoil's official brand icon
- Add provider-specific reasoning_options to every reasoning model
  (effort enums verified live against the Tinfoil API)
- gpt-oss-safeguard-120b: correct tool_call -> true and
  structured_output -> true (both confirmed via the live API)
- gpt-oss: use a real output limit (32_768) instead of inferring it
  from the 131K context limit
- Remove deepseek-v4-pro and qwen3-vl-30b (deprecated upstream)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 20:44:47 +04:00
Aiden Cline 488e8b069d Merge pull request #2810 from rekram1-node/docs/reasoning-http-formats
docs: document provider reasoning request formats
2026-06-26 10:13:29 -05:00
Aiden Cline 14c64a0ace Merge pull request #2802 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-26 09:39:55 -05:00
Aiden Cline e0b1ab9a88 Merge pull request #2804 from yanyihan-xiaomi/deprecate-mimo-v2
fix(xiaomi): mark MiMo-V2 Pro/Flash/Omni as deprecated
2026-06-26 09:39:43 -05:00
Aiden Cline 7bc97eb4aa Merge pull request #2807 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-26 09:38:25 -05:00
Aiden Cline 30fc7d2f62 Merge pull request #2808 from caspervk/dev
scaleway: add GLM-5.2
2026-06-26 09:38:14 -05:00
Aiden Cline bf0da7f9a8 Merge pull request #2809 from shzdehmd/dev
feat(fireworks-ai): add GLM 5.2 Fast and fix GLM 5.2 context limit
2026-06-26 09:38:02 -05:00
Aiden Cline 4e85eac00a docs: document provider reasoning request formats 2026-06-26 09:37:21 -05:00
Ahmad Shahzad 11aeef4e26 feat(fireworks-ai): add GLM 5.2 Fast router and fix GLM 5.2 context limit 2026-06-26 19:16:55 +05:00
github-actions[bot] dcee72a8cf chore(sync): update OpenRouter model catalog 2026-06-26 13:57:48 +00:00
github-actions[bot] 0601aba844 chore(sync): update Venice model catalog 2026-06-26 13:57:47 +00:00
Casper V. Kristensen 89cc939637 scaleway: add GLM-5.2 2026-06-26 15:15:00 +02:00
Zain Hasan 4f6ec24502 [Together AI] add glm5.2 (#2663) 2026-06-26 08:11:14 -04:00
c99e ec03b93390 feat(tinfoil): add Tinfoil provider with 9 models
Add Tinfoil (confidential/private inference via an OpenAI-compatible
endpoint) as a new provider with 9 chat and embedding models.

Five reuse existing model metadata via base_model (deepseek-v4-pro,
kimi-k2-6, glm-5-2, gemma4-31b, llama3-3-70b), overriding only Tinfoil's
pricing and served context window. Four are full definitions where no
upstream metadata exists (qwen3-vl-30b, gpt-oss-120b,
gpt-oss-safeguard-120b, nomic-embed-text).

Data sourced from Tinfoil's public catalog at
https://inference.tinfoil.sh/v1/models. Passes `bun validate`.

Tinfoil's per-request endpoints (TTS, transcription, document upload,
websearch, realtime) are omitted because per-request pricing with no
context window can't be expressed in the token-priced schema.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 13:22:45 +04:00
yanyihan 3ccc092e3b chore(xiaomi): mark MiMo-V2 Pro/Flash/Omni as deprecated
The MiMo-V2 Pro, Flash, and Omni models are now forwarded to the MiMo-V2.5
series and billed at V2.5 rates. The V2 series will be fully retired on
2026-06-30 00:00 (Beijing time), after which the original model names stop
resolving. Mark them status = "deprecated" on the first-party Xiaomi
providers (xiaomi and xiaomi-token-plan-{ams,cn,sgp}; the ams/sgp entries are
symlinks to cn). TTS models are intentionally left untouched.

Refs:
- https://mimo.mi.com/docs/en-US/updates/deprecate
- https://mimo.mi.com/docs/zh-CN/updates/deprecate
2026-06-26 16:41:53 +08:00
Jack b4f37703da fix M3 context limit 2026-06-26 12:46:35 +08:00
Aiden Cline d6e5057cfa Merge pull request #2625 from kooyunmo/friendli-glm-5.2
feat(friendli): add GLM-5.2, link models to canonical pages
2026-06-25 23:34:33 -05:00
Yunmo Koo b0e270735e feat(friendli): add GLM-5.2, link models to canonical pages 2026-06-25 23:33:00 -05:00
Aiden Cline 0e9933f7b4 Merge pull request #2785 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-25 23:08:56 -05:00
Aiden Cline 9961f76980 Merge pull request #2786 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-25 23:07:56 -05:00
Aiden Cline 0aa21fc02e Merge pull request #2788 from anomalyco/automation/sync-models-ovhcloud
chore(sync): update OVHcloud AI Endpoints model catalog
2026-06-25 23:07:43 -05:00
Aiden Cline 2ecbd3c2dd Merge pull request #2793 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-25 23:07:32 -05:00
Aiden Cline 0f7008c8d9 Merge pull request #2795 from anomalyco/automation/sync-models-llmgateway
chore(sync): update LLM Gateway model catalog
2026-06-25 23:07:20 -05:00
Aiden Cline 22c9a947ef Merge pull request #2787 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-25 23:07:10 -05:00
github-actions[bot] ef66489a2b chore(sync): update Baseten model catalog 2026-06-26 03:26:10 +00:00
github-actions[bot] 0cfce4fde7 chore(sync): update Venice model catalog 2026-06-26 03:26:07 +00:00
github-actions[bot] 3f1d1575b6 chore(sync): update OVHcloud AI Endpoints model catalog 2026-06-26 03:26:07 +00:00
github-actions[bot] b39443f4c4 chore(sync): update Vercel AI Gateway model catalog 2026-06-26 03:26:07 +00:00
github-actions[bot] 46ad05b4c9 chore(sync): update LLM Gateway model catalog 2026-06-26 03:26:07 +00:00
github-actions[bot] f34441cf84 chore(sync): update OpenRouter model catalog 2026-06-26 03:26:05 +00:00
Jack 4557d9c935 fix(opencode-go): restore Qwen Anthropic format 2026-06-26 10:09:28 +08:00
Aiden Cline b58499ff7a Merge pull request #2366 from anomalyco/split/alibaba-alibaba-reasoning-options-part-3
[alibaba/alibaba part 3] Add reasoning options
2026-06-25 19:52:58 -05:00
Aiden Cline 8b92a52030 Merge pull request #2372 from anomalyco/split/cortecs-alibaba-reasoning-options
[cortecs/alibaba] Add reasoning options
2026-06-25 16:41:23 -05:00
Aiden Cline f624113865 Merge pull request #2373 from anomalyco/split/cortecs-anthropic-reasoning-options
[cortecs/anthropic] Add reasoning options
2026-06-25 16:41:10 -05:00
Aiden Cline f53081b231 Merge pull request #2374 from anomalyco/split/cortecs-deepseek-reasoning-options
[cortecs/deepseek] Add reasoning options
2026-06-25 16:40:59 -05:00
Aiden Cline 79f9a1414a Merge pull request #2791 from anomalyco/automation/sync-models-llmgateway
chore(sync): update LLM Gateway model catalog
2026-06-25 15:51:54 -05:00
Aiden Cline 4a4a2956b0 Merge pull request #2794 from patrik-kuehl/synthetic-model-catalog-housekeeping
chore(providers): synthetic model catalog housekeeping
2026-06-25 15:51:16 -05:00
Aiden Cline fb4bda0831 Merge pull request #2365 from anomalyco/split/alibaba-alibaba-reasoning-options-part-2
[alibaba/alibaba part 2] Add reasoning options
2026-06-25 15:50:41 -05:00
github-actions[bot] 2a1bfd3db6 chore(sync): update LLM Gateway model catalog 2026-06-25 19:56:05 +00:00
Patrik Kühl 432616caed chore(providers): update Nemotron 3 Super model definition 2026-06-25 20:42:16 +02:00
Patrik Kühl 2ca717fc34 chore(providers): update Kimi K2.6 model definition 2026-06-25 20:42:05 +02:00
Patrik Kühl cc162b896c chore(providers): update MiniMax M3 model definition 2026-06-25 20:41:58 +02:00
Jack 7ceac334bb fix(opencode-go): use OpenAI-compatible Qwen models 2026-06-26 00:38:34 +08:00
Aiden Cline 339bc6feef Merge remote-tracking branch 'origin/dev' into HEAD
# Conflicts:
#	providers/llmgateway/models/gemini-3.1-flash-lite-preview.toml
2026-06-25 10:22:22 -05:00
Aiden Cline efe8d7b7ab Merge remote-tracking branch 'origin/dev' into HEAD
# Conflicts:
#	providers/llmgateway/models/claude-opus-4-20250514.toml
#	providers/llmgateway/models/claude-sonnet-4-20250514.toml
2026-06-25 10:22:22 -05:00
Aiden Cline f1b7b81da1 fix(kilo): remove unsupported Opus budgets 2026-06-25 10:20:57 -05:00
Aiden Cline 8e948951b3 fix(nano-gpt): expose TEE Qwen budget 2026-06-25 10:19:46 -05:00
Aiden Cline afc13cf072 fix(kilo): expose ERNIE reasoning toggle 2026-06-25 10:18:38 -05:00
Aiden Cline 81bd3d7453 fix(kilo): expose NVIDIA reasoning controls 2026-06-25 10:17:35 -05:00
Aiden Cline e34cd91da2 fix(nano-gpt): add finetune reasoning budgets 2026-06-25 10:15:46 -05:00
Aiden Cline 103ba7ba57 fix(nano-gpt): add finetune reasoning budgets 2026-06-25 10:15:46 -05:00
Aiden Cline db1e5cadfd fix(nano-gpt): expose Qwen3.5 budgets 2026-06-25 10:14:22 -05:00
Aiden Cline 9340514849 fix(nano-gpt): expose Qwen reasoning budgets 2026-06-25 10:13:34 -05:00
Aiden Cline 236952ea27 fix(kilo): remove ineffective MiniMax toggles 2026-06-25 10:12:13 -05:00
Aiden Cline e1b4ae5515 fix(nano-gpt): expose Gemini Pro budgets 2026-06-25 10:11:15 -05:00
Aiden Cline 8f8b782b49 fix(nano-gpt): expose Gemini 2.5 budgets 2026-06-25 10:11:15 -05:00
Aiden Cline d99dfa4efc fix(nano-gpt): expose Claude reasoning budgets 2026-06-25 10:09:57 -05:00
Aiden Cline 315034d2f7 fix(nano-gpt): expose Opus 4.5 budget 2026-06-25 10:09:57 -05:00
Aiden Cline 74c93534e1 fix(cortecs): remove unsupported Opus budgets 2026-06-25 10:08:41 -05:00
Aiden Cline 437b28be75 fix(cortecs): expose DeepSeek V4 efforts 2026-06-25 10:00:49 -05:00
Aiden Cline d6d2550a18 Merge pull request #2376 from anomalyco/split/cortecs-minimax-reasoning-options
[cortecs/minimax] Add reasoning options
2026-06-25 09:54:29 -05:00
Aiden Cline d3fc6bb40b Merge pull request #2383 from anomalyco/split/cortecs-zhipuai-reasoning-options
[cortecs/zhipuai] Add reasoning options
2026-06-25 09:53:57 -05:00
Aiden Cline 522f4744aa Merge pull request #2364 from anomalyco/split/alibaba-alibaba-reasoning-options-part-1
[alibaba/alibaba part 1] Add reasoning options
2026-06-25 09:47:47 -05:00
Aiden Cline 9bbe2b4a41 Merge pull request #2359 from anomalyco/split/aihubmix-minimax-reasoning-options
[aihubmix/minimax] Add reasoning options
2026-06-25 09:47:14 -05:00
Aiden Cline 8f1160c3ee igore: add skill for automation 2026-06-25 09:47:02 -05:00
Aiden Cline cf2ec39ae6 Merge pull request #2361 from anomalyco/split/aihubmix-openai-reasoning-options
[aihubmix/openai] Add reasoning options
2026-06-25 09:46:25 -05:00
Aiden Cline 8b9a6e202b Merge pull request #2363 from anomalyco/split/aihubmix-zhipuai-reasoning-options
[aihubmix/zhipuai] Add reasoning options
2026-06-25 09:46:12 -05:00
Aiden Cline b12b968919 Merge pull request #2355 from anomalyco/split/aihubmix-anthropic-reasoning-options
[aihubmix/anthropic] Add reasoning options
2026-06-25 09:42:22 -05:00
Aiden Cline 811a77f084 Merge pull request #2356 from anomalyco/split/aihubmix-bytedance-reasoning-options
[aihubmix/bytedance] Add reasoning options
2026-06-25 09:42:08 -05:00
Aiden Cline 336d63ee4a Merge pull request #2760 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-25 09:41:57 -05:00
Aiden Cline 2fb42ba8c8 Merge pull request #2783 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-25 09:41:46 -05:00
Aiden Cline 810f2d2d83 Merge pull request #2357 from anomalyco/split/aihubmix-deepseek-reasoning-options
[aihubmix/deepseek] Add reasoning options
2026-06-25 09:41:23 -05:00
Aiden Cline 86cc38e9f4 Merge pull request #2358 from anomalyco/split/aihubmix-google-reasoning-options
[aihubmix/google] Add reasoning options
2026-06-25 09:41:00 -05:00
Aiden Cline c42d5b55fd Merge pull request #2353 from anomalyco/split/302ai-zhipuai-reasoning-options
[302ai/zhipuai] Add reasoning options
2026-06-25 09:40:01 -05:00
Aiden Cline aee8c25913 Merge pull request #2352 from anomalyco/split/302ai-xai-reasoning-options
[302ai/xai] Add reasoning options
2026-06-25 09:39:50 -05:00
Aiden Cline f9d7564087 Merge pull request #2351 from anomalyco/split/302ai-openai-reasoning-options
[302ai/openai] Add reasoning options
2026-06-25 09:39:37 -05:00
Aiden Cline 1cd1ebf848 Merge pull request #2346 from anomalyco/split/302ai-anthropic-reasoning-options-part-1
[302ai/anthropic part 1] Add reasoning options
2026-06-25 09:39:26 -05:00
Aiden Cline d1bb58a63b Merge pull request #2310 from anomalyco/split/merge-gateway-zai-reasoning-options
[merge-gateway/zai] Add reasoning options
2026-06-25 09:38:41 -05:00
Aiden Cline c206eb7fa9 Merge pull request #2307 from anomalyco/split/merge-gateway-openai-reasoning-options-part-1
[merge-gateway/openai part 1] Add reasoning options
2026-06-25 09:38:30 -05:00
Aiden Cline 43292ede3e Merge pull request #2305 from anomalyco/split/merge-gateway-minimax-reasoning-options
[merge-gateway/minimax] Add reasoning options
2026-06-25 09:38:18 -05:00
Aiden Cline b32cf06f58 Merge pull request #2304 from anomalyco/split/merge-gateway-google-reasoning-options
[merge-gateway/google] Add reasoning options
2026-06-25 09:38:07 -05:00
Aiden Cline b05c1b03c7 Merge pull request #2302 from anomalyco/split/merge-gateway-anthropic-reasoning-options
[merge-gateway/anthropic] Add reasoning options
2026-06-25 09:37:56 -05:00
Aiden Cline 0bb5ef3926 Merge pull request #2344 from anomalyco/split/frogbot-anthropic-reasoning-options
[frogbot/anthropic] Add reasoning options
2026-06-25 09:08:02 -05:00
Aiden Cline 8d7c33c28b Merge pull request #2342 from anomalyco/split/databricks-openai-reasoning-options
[databricks/openai] Add reasoning options
2026-06-25 09:07:49 -05:00
Aiden Cline b091dc1a58 Merge pull request #2341 from anomalyco/split/databricks-google-reasoning-options
[databricks/google] Add reasoning options
2026-06-25 09:07:37 -05:00
Aiden Cline ef96f9635b Merge pull request #2340 from anomalyco/split/databricks-anthropic-reasoning-options
[databricks/anthropic] Add reasoning options
2026-06-25 09:07:18 -05:00
Aiden Cline 90b578962c Merge pull request #2339 from anomalyco/split/github-copilot-openai-reasoning-options
[github-copilot/openai] Add reasoning options
2026-06-25 09:06:52 -05:00
Aiden Cline 24539c406d Merge pull request #2336 from anomalyco/split/github-copilot-anthropic-reasoning-options
[github-copilot/anthropic] Add reasoning options
2026-06-25 09:06:38 -05:00
Aiden Cline 4c3c85b76d Merge pull request #2334 from anomalyco/split/github-models-openai-reasoning-options
[github-models/openai] Add reasoning options
2026-06-25 09:06:20 -05:00
Aiden Cline 99a94b2821 fix(kilo): expose Seed reasoning controls 2026-06-25 09:06:14 -05:00
Aiden Cline ed20a7dea2 Merge pull request #2333 from anomalyco/split/github-models-mistral-ai-reasoning-options
[github-models/mistral-ai] Add reasoning options
2026-06-25 09:06:06 -05:00
Aiden Cline ce6a0e8584 Merge pull request #2332 from anomalyco/split/github-models-microsoft-reasoning-options
[github-models/microsoft] Add reasoning options
2026-06-25 09:05:40 -05:00
Aiden Cline b7dadb292f Merge pull request #2328 from anomalyco/split/github-models-cohere-reasoning-options
[github-models/cohere] Add reasoning options
2026-06-25 09:05:13 -05:00
Aiden Cline b754233bc8 Merge pull request #2331 from anomalyco/split/github-models-meta-reasoning-options
[github-models/meta] Add reasoning options
2026-06-25 09:05:00 -05:00
Aiden Cline f3a63f1e39 fix(merge-gateway): expose native GLM toggles 2026-06-25 09:03:30 -05:00
Aiden Cline fe348ea2df fix(merge-gateway): expose native OpenAI efforts 2026-06-25 09:03:30 -05:00
Aiden Cline f580fb9624 fix(merge-gateway): expose native Google controls 2026-06-25 09:03:30 -05:00
Aiden Cline 9976a233d4 Merge pull request #2326 from anomalyco/split/jiekou-zai-org-reasoning-options
[jiekou/zai-org] Add reasoning options
2026-06-25 09:01:59 -05:00
Aiden Cline f91c756654 fix(merge-gateway): expose native Claude controls 2026-06-25 09:01:44 -05:00
Aiden Cline 3414736d6a Merge pull request #2324 from anomalyco/split/jiekou-qwen-reasoning-options
[jiekou/qwen] Add reasoning options
2026-06-25 09:01:44 -05:00
Aiden Cline 71d458e3b9 Merge pull request #2323 from anomalyco/split/jiekou-openai-reasoning-options
[jiekou/openai] Add reasoning options
2026-06-25 09:01:35 -05:00
Aiden Cline bb021978ad Merge pull request #2319 from anomalyco/split/jiekou-google-reasoning-options
[jiekou/google] Add reasoning options
2026-06-25 09:01:18 -05:00
Aiden Cline 9d5f5843ca Merge pull request #2313 from anomalyco/split/nearai-openai-reasoning-options
[nearai/openai] Add reasoning options
2026-06-25 09:01:02 -05:00
Aiden Cline 7e267b1694 Merge pull request #2311 from anomalyco/split/nearai-anthropic-reasoning-options
[nearai/anthropic] Add reasoning options
2026-06-25 09:00:43 -05:00
github-actions[bot] 8842d59637 chore(sync): update OpenRouter model catalog 2026-06-25 13:57:51 +00:00
github-actions[bot] 7e3ef4ef55 chore(sync): update Vercel AI Gateway model catalog 2026-06-25 13:57:49 +00:00
Aiden Cline c908c0c327 Merge pull request #2301 from anomalyco/split/opencode-zhipuai-reasoning-options
[opencode/zhipuai] Add reasoning options
2026-06-25 08:57:01 -05:00
Aiden Cline 524558d6ab Merge pull request #2296 from anomalyco/split/opencode-openai-reasoning-options-part-1
[opencode/openai part 1] Add reasoning options
2026-06-25 08:56:48 -05:00
Aiden Cline ba9fe6264b Merge pull request #2294 from anomalyco/split/opencode-moonshotai-reasoning-options
[opencode/moonshotai] Add reasoning options
2026-06-25 08:56:05 -05:00
Aiden Cline 6e4270bef7 Merge pull request #2757 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-25 08:53:04 -05:00
Aiden Cline d3e5977681 Merge pull request #2764 from YOYO-do/split/aihubmix-qwen3-7
[aihubmix/qwen] Add Qwen3.7 models
2026-06-25 08:52:18 -05:00
Aiden Cline 787613e10a Merge pull request #2780 from teodortomas/add-glm-5.2-short
add glm-5.2-short model
2026-06-25 08:51:40 -05:00
Aiden Cline abcc173390 Merge pull request #2782 from anomalyco/feat/minimax-m3-context-pricing
feat(minimax): update M3 context and pricing
2026-06-25 08:51:11 -05:00
Aiden Cline 57a34f0586 Merge pull request #2759 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-25 08:50:22 -05:00
Aiden Cline d56d747fef feat(minimax): update M3 context and pricing 2026-06-25 08:49:52 -05:00
Aiden Cline 6826f21b8c Merge pull request #2765 from MassimoGirondiEvroc/dev
[evroc] update models June 2026
2026-06-25 08:47:44 -05:00
Aiden Cline 9d6ff83542 Merge pull request #2778 from MoYiC6/feat/stepfun-step-3.7-flash
feat(stepfun): add Step 3.7 Flash
2026-06-25 08:45:18 -05:00
Aiden Cline 053c9b694e fix(stepfun): add Step 3.7 reasoning options 2026-06-25 08:33:47 -05:00
Aiden Cline f638d464fb evroc: use base models for Whisper 2026-06-25 08:31:36 -05:00
Aiden Cline 884094bd16 Merge pull request #2768 from berget-ai/feat/add-glm-5-2
feat: add GLM-5.2 to Berget AI
2026-06-25 08:28:47 -05:00
github-actions[bot] 903d978cf5 chore(sync): update OpenRouter model catalog 2026-06-25 13:04:51 +00:00
github-actions[bot] 7ff0099deb chore(sync): update Venice model catalog 2026-06-25 13:04:49 +00:00
Teodor Tomáš 94746cc66b Add limit section to glm-5.2-short.toml
Fix missing [limit] definition that was deleted by mistake
2026-06-25 09:23:55 +02:00
Teodor Tomáš 205671b587 add glm-5.2-short model 2026-06-25 09:16:34 +02:00
Christian Landgren 78d7f0929c Merge pull request #1 from anomalyco/fix/pr-2768-base-model
fix: inherit GLM-5.2 metadata
2026-06-25 07:23:56 +02:00
辰ing d6a5c9fc75 feat(stepfun): add Step 3.7 Flash 2026-06-25 10:21:58 +08:00
Aiden Cline 8420647d06 fix(berget): inherit GLM-5.2 metadata 2026-06-24 16:19:24 -05:00
Aiden Cline 92f9c61862 Merge pull request #2769 from anomalyco/automation/sync-models-huggingface
chore(sync): update Hugging Face model catalog
2026-06-24 16:16:24 -05:00
Aiden Cline 895332910d fix(huggingface): add reasoning options 2026-06-24 16:05:48 -05:00
Aiden Cline 9a3926c3b1 Merge pull request #2775 from grp06/sentinel/google/google-vertex-gemini-3.1-flash-lite-preview-mevt_629401e
Update google-vertex/gemini-3.1-flash-lite-preview metadata from official source
2026-06-24 16:04:05 -05:00
Aiden Cline 4bfa78a312 Merge pull request #2776 from anomalyco/fix/sync-interleaved-reasoning-options
fix(sync): preserve TOML root fields
2026-06-24 16:03:44 -05:00
github-actions[bot] 38118636fc chore(sync): update Hugging Face model catalog 2026-06-24 20:53:00 +00:00
Aiden Cline b338d8a960 Merge pull request #2773 from steebchen/feat/llmgateway-sync
feat: add llmgateway.io model sync provider
2026-06-24 14:07:04 -05:00
Aiden Cline e3c7531891 fix(sync): preserve TOML root fields 2026-06-24 14:05:46 -05:00
Jack eb6819a13f fix(opencode-go): add MiniMax M3 long-context pricing
fix(opencode-go): add MiniMax M3 long-context pricing
2026-06-25 00:14:58 +08:00
Jack d77f596975 fix(opencode-go): add MiniMax M3 long-context pricing 2026-06-25 00:10:49 +08:00
Luca Steeb 9629a104d5 feat: add llmgateway.io model sync provider
Add a sync provider for the LLM Gateway (llmgateway.io) aggregator,
mirroring its public /v1/models catalog into providers/llmgateway.

The gateway exposes an OpenRouter-shaped response, but its
supported_parameters and modality data are noisy (it omits "tools" for
flagship models yet lists "temperature" for ones marked temperature=false).
So the gateway is treated as authoritative only for the volatile,
gateway-specific data — cost and served limits — while capability and
modality fields stay curated (preserved from the existing entry, which a
factored model inherits from its base). Only text-output models are synced.

- packages/core/src/sync/providers/llmgateway.ts: new provider
- packages/core/src/sync/index.ts: register in providers + aggregators
- package.json: add llmgateway:sync script
- .github/workflows/sync-models.yml: optional LLMGATEWAY_API_KEY

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 17:01:30 +01:00
Aiden Cline 2a005dcfd5 Merge pull request #2770 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-24 10:37:19 -05:00
github-actions[bot] c91f226deb chore(sync): update Baseten model catalog 2026-06-24 15:14:01 +00:00
Model Sentinel b9ec66b3cd data(google): update google-vertex-gemini-3.1-flash-lite-preview from official source 2026-06-24 06:46:41 -07:00
Hugo Bjork 4e0be0153d feat: add GLM-5.2 and update gpt-oss-120b pricing for Berget AI 2026-06-24 10:52:37 +02:00
Massimo Girondi 57c0047f5c Update reasoning_options for evroc models 2026-06-24 09:10:54 +02:00
Massimo Girondi 7d3a18d410 Add roc model 2026-06-24 09:10:54 +02:00
Massimo Girondi 763903a1da evroc: June 2026 updates
Update the list of available models.

Updated pricing as 2026/06/08
2026-06-24 09:10:54 +02:00
YOYO-do cefd747b26 [aihubmix/qwen] Add Qwen3.7 models 2026-06-24 14:16:22 +08:00
Aiden Cline 920a631ab5 fix(github-copilot): remove unsupported Opus budgets 2026-06-24 00:18:26 -05:00
Aiden Cline c3954249d3 fix(github-models): correct OpenAI reasoning efforts 2026-06-24 00:18:26 -05:00
Aiden Cline f917dec363 fix(opencode): correct GPT-5.3 Codex efforts 2026-06-23 23:35:12 -05:00
Aiden Cline b3e9570a4e [llmgateway/deepseek] Correct reasoning options 2026-06-23 23:33:42 -05:00
Aiden Cline e5d16e5c4c [llmgateway/bytedance] Correct reasoning options 2026-06-23 23:33:42 -05:00
Aiden Cline c179481ff7 [llmgateway/alibaba part 1] Remove unsupported reasoning options 2026-06-23 23:33:42 -05:00
Aiden Cline 835e468751 [llmgateway/google] Correct reasoning options 2026-06-23 23:33:42 -05:00
Aiden Cline 0d0ae90674 [llmgateway/anthropic] Correct reasoning options 2026-06-23 23:33:42 -05:00
Aiden Cline e43dc0d1af [nano-gpt/google part 3] Correct reasoning controls 2026-06-23 23:32:53 -05:00
Aiden Cline c1b6213e1e [nano-gpt/google part 2] Correct reasoning controls 2026-06-23 23:32:53 -05:00
Aiden Cline da40c1cf59 [nano-gpt/google part 1] Correct reasoning controls 2026-06-23 23:32:53 -05:00
Aiden Cline ad3e1b7a3d [nano-gpt/anthropic part 1] Correct reasoning controls 2026-06-23 23:32:53 -05:00
Aiden Cline cd9a627168 [nano-gpt/anthropic part 2] Correct reasoning controls 2026-06-23 23:32:53 -05:00
Aiden Cline 2531fd5221 [kilo/qwen part 2] Add reasoning budgets 2026-06-23 23:32:16 -05:00
Aiden Cline 94054eead0 [kilo/qwen part 1] Correct reasoning options 2026-06-23 23:32:16 -05:00
Aiden Cline 15fdcd41ee [kilo/openai part 2] Correct reasoning options 2026-06-23 23:32:16 -05:00
Aiden Cline c515fc0186 [kilo/openai part 1] Correct reasoning options 2026-06-23 23:32:16 -05:00
Aiden Cline c2efc46388 [jiekou/zai-org] Correct reasoning options 2026-06-23 23:30:44 -05:00
Aiden Cline 6c22804c64 [jiekou/qwen] Correct reasoning options 2026-06-23 23:30:44 -05:00
Aiden Cline 417fa2d5ce [jiekou/openai] Correct reasoning options 2026-06-23 23:30:44 -05:00
Aiden Cline 59509d8bb6 [jiekou/google] Correct reasoning options 2026-06-23 23:30:44 -05:00
Aiden Cline 0fd2cfced2 [nearai/anthropic] Correct reasoning options 2026-06-23 23:30:44 -05:00
Aiden Cline 44a0c340ab [kilo/deepseek] Correct reasoning controls 2026-06-23 23:30:43 -05:00
Aiden Cline 5f8ab1b738 [kilo/google] Correct reasoning controls 2026-06-23 23:30:43 -05:00
Aiden Cline b57c39de8a [kilo/anthropic] Correct reasoning controls 2026-06-23 23:30:43 -05:00
Aiden Cline 56b5e4c1c9 [kilo/baidu] Correct reasoning controls 2026-06-23 23:30:43 -05:00
Aiden Cline 0cd9df380c [kilo/bytedance-seed] Correct reasoning controls 2026-06-23 23:30:43 -05:00
Aiden Cline 1e85e3d7e9 [poe/xai] Correct reasoning options 2026-06-23 23:30:11 -05:00
Aiden Cline 9a9de77466 [poe/openai] Correct part 2 reasoning options 2026-06-23 23:30:11 -05:00
Aiden Cline 095d06896b [poe/openai] Correct part 1 reasoning options 2026-06-23 23:30:11 -05:00
Aiden Cline 611ec75a31 [poe/novita] Correct reasoning options 2026-06-23 23:30:11 -05:00
Aiden Cline 5d8a09852d [poe/google] Correct reasoning options 2026-06-23 23:30:11 -05:00
Aiden Cline fd005d74b8 [poe/anthropic] Correct reasoning options 2026-06-23 23:30:11 -05:00
Aiden Cline c8af5fb3ca fix(alibaba): remove unsupported Kimi thinking budget 2026-06-23 23:29:53 -05:00
Aiden Cline 5916db31a2 [nano-gpt/openai] Update latest reasoning options 2026-06-23 23:29:53 -05:00
Aiden Cline f239339b1d [nano-gpt/openai] Correct part 1 reasoning options 2026-06-23 23:29:53 -05:00
Aiden Cline e2819cb12a [nano-gpt/nanogpt] Correct router reasoning options 2026-06-23 23:29:53 -05:00
Aiden Cline a4b8fdbd4d [nano-gpt/TEE] Correct Qwen reasoning control 2026-06-23 23:29:53 -05:00
Aiden Cline e632538ae2 [302ai/zhipuai] Remove unverified coding control 2026-06-23 23:29:39 -05:00
Aiden Cline cef46813f2 [302ai/xai] Correct multi-agent efforts 2026-06-23 23:29:39 -05:00
Aiden Cline 39c7c3d2df [302ai/openai] Correct reasoning efforts 2026-06-23 23:29:39 -05:00
Aiden Cline 9b89a13e8a [302ai/anthropic] Correct reasoning controls 2026-06-23 23:29:39 -05:00
Aiden Cline 13149b349e [llmgateway/zhipuai] Correct reasoning controls 2026-06-23 23:29:16 -05:00
Aiden Cline 2b9a3b89df [llmgateway/openai] Correct o3 reasoning controls 2026-06-23 23:29:16 -05:00
Aiden Cline 307552209e [llmgateway/openai] Correct GPT-5.3 Codex effort 2026-06-23 23:29:16 -05:00
Aiden Cline 119d6b5c9e [llmgateway/moonshotai] Correct reasoning controls 2026-06-23 23:29:16 -05:00
Aiden Cline 329e53b3bd [llmgateway/minimax] Correct reasoning controls 2026-06-23 23:29:16 -05:00
Aiden Cline e27ee98ae6 [siliconflow/zai-org] Restore documented budgets 2026-06-23 23:28:57 -05:00
Aiden Cline 6df7b27677 [siliconflow/Qwen] Add CN thinking budgets 2026-06-23 23:28:57 -05:00
Aiden Cline a0af1e4105 [siliconflow/Pro] Apply reasoning audit fixes 2026-06-23 23:28:57 -05:00
Aiden Cline 57643745f9 [siliconflow/deepseek-ai] Correct R1 budget support 2026-06-23 23:28:57 -05:00
Aiden Cline 84287738b1 [kilo/z-ai] Correct reasoning efforts 2026-06-23 23:28:37 -05:00
Aiden Cline 90197b6132 [kilo/x-ai] Correct multi-agent reasoning efforts 2026-06-23 23:28:37 -05:00
Aiden Cline f09700209a fix(frogbot): add Grok 4.3 reasoning efforts 2026-06-23 23:28:36 -05:00
Aiden Cline 67feeb2d1b fix(frogbot): add missing GPT reasoning efforts 2026-06-23 23:28:36 -05:00
Aiden Cline 354fd6683a fix(frogbot): add Gemini 2.5 reasoning budgets 2026-06-23 23:28:36 -05:00
Aiden Cline 0845e502dd fix(frogbot): correct Claude reasoning controls 2026-06-23 23:28:36 -05:00
Aiden Cline dc2655aeb0 fix(databricks): remove unsupported Claude budget caps 2026-06-23 23:28:36 -05:00
Aiden Cline ac3f8a5c07 fix(nano-gpt): correct GLM 4.6 reasoning control 2026-06-23 23:25:55 -05:00
Aiden Cline a7c7d99c5a fix(nano-gpt): add latest MiniMax toggle 2026-06-23 23:25:55 -05:00
Aiden Cline 7c8a3d70f1 fix(nano-gpt): correct DeepSeek reasoning controls 2026-06-23 23:25:55 -05:00
Aiden Cline 394924cd49 fix(nano-gpt): drop stale Qwen reasoning claim 2026-06-23 23:25:55 -05:00
Aiden Cline 9165f72a65 fix(nano-gpt): correct Qwen Plus reasoning control 2026-06-23 23:25:55 -05:00
Aiden Cline bb8abcf121 fix(nano-gpt): correct latest GLM efforts 2026-06-23 23:25:54 -05:00
Aiden Cline 11df0fd55c fix(cortecs): remove unverified Qwen toggles 2026-06-23 22:36:12 -05:00
Aiden Cline a755e2e0ab fix(cortecs): remove unverified GLM toggles 2026-06-23 22:36:12 -05:00
Aiden Cline 05f237d496 fix(aihubmix): correct GPT-5.3 Codex efforts 2026-06-23 22:32:29 -05:00
Aiden Cline 04d4108a4b fix(aihubmix): correct Claude reasoning controls 2026-06-23 22:32:29 -05:00
Aiden Cline 848a0b045e fix(aihubmix): add Doubao reasoning toggles 2026-06-23 22:32:29 -05:00
Aiden Cline 55f388890b fix(aihubmix): correct DeepSeek reasoning controls 2026-06-23 22:32:29 -05:00
Aiden Cline 609ec2b6ec Merge pull request #2761 from YOYO-do/split/aihubmix-glm-5-2
[aihubmix/glm] Add GLM 5.2
2026-06-23 22:31:09 -05:00
Aiden Cline 2c70b27e28 Merge pull request #2291 from anomalyco/split/opencode-google-reasoning-options
[opencode/google] Add reasoning options
2026-06-23 22:30:57 -05:00
LL a118da229d [aihubmix/glm] Add GLM 5.2 2026-06-24 11:16:44 +08:00
Aiden Cline 3181aee5f1 Merge pull request #2750 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-23 18:25:48 -05:00
Aiden Cline b7db7e03c3 Merge pull request #2751 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-23 18:25:33 -05:00
Aiden Cline b3e55e9862 Merge pull request #2753 from patrik-kuehl/synthetic-remove-unavailable-models
chore(providers): remove unavailable models from Synthetic's model catalog
2026-06-23 18:25:15 -05:00
Aiden Cline efd997fc9a Merge pull request #2756 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-23 18:24:54 -05:00
github-actions[bot] 3e7e47ecae chore(sync): update Venice model catalog 2026-06-23 22:42:39 +00:00
github-actions[bot] afef03152d chore(sync): update Vercel AI Gateway model catalog 2026-06-23 22:42:38 +00:00
github-actions[bot] e4d9d4e037 chore(sync): update OpenRouter model catalog 2026-06-23 22:42:37 +00:00
Patrik Kühl e5d243d0dd chore(providers): remove unavailable models from Synthetic's model catalog 2026-06-23 21:23:53 +02:00
Aiden Cline 2aa9bce854 Merge pull request #2752 from anomalyco/feat/siliconflow-cn-deepseek-v4-flash
feat(siliconflow-cn): add DeepSeek V4 Flash
2026-06-23 11:59:30 -05:00
Aiden Cline d5531c16be fix(siliconflow-cn): add V4 Flash reasoning budget 2026-06-23 11:42:44 -05:00
Aiden Cline 2548bc7471 feat(siliconflow-cn): add DeepSeek V4 Flash 2026-06-23 11:27:28 -05:00
Aiden Cline 4462da5935 Merge pull request #2746 from Kibouo/add-azure-claude-opus-4-8
Add Azure Foundry Claude Opus 4.8
2026-06-23 11:26:42 -05:00
Aiden Cline 8e0a1cae3c refactor(azure): use base_model for claude-opus-4-8
- Convert Azure Foundry and Azure Cognitive Services models to inherit from anthropic/claude-opus-4-8
- Fix Cognitive Services API endpoint to use AZURE_COGNITIVE_SERVICES_RESOURCE_NAME (was incorrectly symlinked)
2026-06-23 11:26:00 -05:00
Aiden Cline 838ee5b8e8 Merge pull request #2713 from flamerged/add-wafer-glm-5.2
Add GLM-5.2 to wafer.ai provider
2026-06-23 11:20:29 -05:00
Aiden Cline 6fcb07a666 Merge pull request #2729 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-23 10:21:10 -05:00
Aiden Cline 2399396127 Merge pull request #2736 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-23 10:20:51 -05:00
Aiden Cline cb99430652 Merge pull request #2737 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-23 10:20:35 -05:00
Aiden Cline 1b9bb72592 Merge pull request #2740 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-23 10:19:14 -05:00
Aiden Cline 84df3d7b2d Merge pull request #2744 from Lee-Si-Yoon/feat/friendli-glm-5.2
feat(friendli): add GLM-5.2
2026-06-23 10:18:58 -05:00
Aiden Cline e973a9bff2 Merge pull request #2741 from Luew2/codex/update-lilac-glm52-minimax-m3
Update Lilac model catalog
2026-06-23 09:56:21 -05:00
github-actions[bot] 3a58a46b0d chore(sync): update OpenRouter model catalog 2026-06-23 14:08:49 +00:00
github-actions[bot] 920e2a8835 chore(sync): update Vercel AI Gateway model catalog 2026-06-23 14:08:48 +00:00
github-actions[bot] fd690c1666 chore(sync): update Venice model catalog 2026-06-23 14:08:47 +00:00
github-actions[bot] 46f15f74de chore(sync): update Baseten model catalog 2026-06-23 14:08:46 +00:00
Frank 9a481555d9 update zen models 2026-06-23 08:01:04 -04:00
Csonka Mihaly 892092d598 Add opus 4.8 2026-06-23 11:59:39 +02:00
siyoon df9e16c20b feat(friendli): add GLM-5.2
Reasoning effort only supports high/max; none rejected by API.
2026-06-23 17:22:33 +09:00
flamerged ae2c1588b9 Fix Wafer GLM-5.2 metadata 2026-06-23 09:29:11 +02:00
Luew2 f295b97e33 fix(lilac): mark MiniMax M3 multimodal 2026-06-22 22:34:53 -07:00
Luew2 54bea958e1 feat(lilac): update hosted model catalog
Replace Lilac's deprecated GLM 5.1 and MiniMax M2.7 entries with GLM 5.2 and MiniMax M3 so opencode users see the current served model set.
2026-06-22 21:32:56 -07:00
siyoon be9bb769eb fix(friendli): make DeepSeek-V3.2 provider-specific 2026-06-23 13:22:08 +09:00
siyoon 13f3978fc1 fix(friendli): remove redundant fields inherited from base_model 2026-06-23 12:15:53 +09:00
Aiden Cline f09af028c6 Merge pull request #2731 from aakash-gupte/aakash/models-dev-frontier-update
Add frontier models to Merge Gateway provider
2026-06-22 17:40:42 -05:00
Aakash Gupte 122281b87a Remove cache pricing; Gateway bills input/output only
The CMS catalog tracks only input and output cost per million, with no
separate cache rate. The cache_read/cache_write values added earlier
were sourced from the vendor canonical, not from Gateway billing, so
they advertised a caching discount the Gateway does not apply. Drop them
so displayed cost matches actual billing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:12:32 -04:00
Aakash Gupte 3ed28ecdcf Restore cache pricing dropped by the cost override
The [cost] block replaces the canonical's pricing, so specifying only
input/output silently dropped cache_read/cache_write. Re-add cache
pricing for the 8 models whose list price matches the canonical (so the
canonical cache rate applies), matching the existing stub convention
(e.g. glm-5). qwen3.7-max keeps flat input/output only (its list price
differs from the canonical, manual pricing with no cache rate).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:10:42 -04:00
Aakash Gupte b99c3d694f Correct reasoning_options to match the provider's actual interface
Verified against merge-gateway-ai-sdk-provider source: the provider
exposes reasoning solely as thinking { type: enabled|disabled;
budgetTokens } — i.e. a toggle plus a token budget, NOT effort.

All 10 reasoning models now declare reasoning_options = toggle +
budget_tokens, with the budget max bounded by each model's
max_output_tokens from the Gateway catalog. Drops the earlier effort
entries (opus-4-8, glm-5.2), which the provider cannot honor. GLM/Kimi
keep interleaved reasoning_content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:04:28 -04:00
Aakash Gupte 8f60a29a5e Reflect real reasoning controls instead of empty arrays
Per review feedback: empty reasoning_options understated what works
through the Gateway passthrough. Align each model to its actual controls
(matching the canonical entries / openrouter parity):

- effort: claude-opus-4-8, glm-5.2
- toggle: kimi-k2.5, kimi-k2.6, minimax-m3
- toggle + budget_tokens: qwen3.7-max, qwen3.6-plus

reasoning_options = [] retained only for always-on thinking variants
with no client-side control (kimi-k2-thinking, kimi-k2.7-code[-highspeed]),
matching their canonical entries. GLM/Kimi keep interleaved reasoning_content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 17:58:16 -04:00
Aiden Cline c46eb35022 Merge pull request #2734 from anomalyco/automation/sync-models-huggingface
chore(sync): update Hugging Face model catalog
2026-06-22 16:34:42 -05:00
Aiden Cline a92b5782cb Merge pull request #2711 from TheStreamCode/fix-windows-path-separators
fix: handle Windows path separators in catalog generation
2026-06-22 16:32:03 -05:00
Aiden Cline 72bc938fce Merge pull request #2733 from anomalyco/fix/vercel-sync-audio-models
fix(vercel): sync audio model types
2026-06-22 16:23:10 -05:00
github-actions[bot] 09466b22d5 chore(sync): update Hugging Face model catalog 2026-06-22 21:18:00 +00:00
Aiden Cline 96f71c533e fix(vercel): sync audio model types 2026-06-22 16:15:50 -05:00
Aakash Gupte d9fcc5fe3c Add reasoning_options to Merge Gateway frontier models
Per review feedback. All 10 models are reasoning-capable; declare
reasoning_options = [] (base_model does not inherit it) plus
[interleaved] reasoning_content on GLM and the Kimi family, matching
the existing deepseek-v4-pro / o4-mini stub convention.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:35:43 -04:00
Aiden Cline d74e191694 Merge pull request #2732 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-22 15:26:42 -05:00
Aiden Cline 2ebfbb3db5 Merge pull request #2678 from hanouticelina/sync/huggingface-inference-providers
feat(sync): add Hugging Face provider sync
2026-06-22 15:26:26 -05:00
Aiden Cline 7102dc932d fix(sync): skip unavailable Hugging Face models 2026-06-22 15:23:56 -05:00
github-actions[bot] 6fff0e652d chore(sync): update Baseten model catalog 2026-06-22 20:16:38 +00:00
Aakash Gupte 5dfa7f18bb Add frontier models to Merge Gateway provider
Adds 10 models now served through Merge Gateway that postdate the
initial provider PR, each extending its canonical entry with list pricing:

- anthropic/claude-opus-4-8
- zhipuai/glm-5.2
- moonshotai: kimi-k2.7-code, kimi-k2.7-code-highspeed, kimi-k2.6,
  kimi-k2.5, kimi-k2-thinking
- minimax/MiniMax-M3
- alibaba: qwen3.7-max, qwen3.6-plus

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:12:31 -04:00
Aiden Cline 4d50c8b588 Merge pull request #2728 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-22 11:04:20 -05:00
github-actions[bot] 3792481dd6 chore(sync): update OpenRouter model catalog 2026-06-22 15:07:20 +00:00
Aiden Cline e3300474ee Merge pull request #2699 from quantverse/dev
Add GLM-5.2 for novita-ai provider
2026-06-22 09:29:19 -05:00
Aiden Cline 1e9875220e Merge pull request #2717 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-22 09:24:35 -05:00
Aiden Cline b1e39e81d3 Merge pull request #2723 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-22 09:24:20 -05:00
github-actions[bot] 0ce055cc57 chore(sync): update OpenRouter model catalog 2026-06-22 13:11:11 +00:00
github-actions[bot] d7ca0b2627 chore(sync): update Vercel AI Gateway model catalog 2026-06-22 13:11:11 +00:00
Edgars Beigarts f4c173befb Mark Claude Haiku 3.5 model as deprecated 2026-06-22 14:30:42 +03:00
Karel Vavra d6e9aee388 Add GLM-5.2 for novita-ai provider 2026-06-22 10:24:49 +02:00
siyoon 454f274cf9 feat(friendli): add DeepSeek-V3.2 model 2026-06-22 17:05:58 +09:00
siyoon 8d27e48dd7 feat(friendli): add gemma-4-31B-it model 2026-06-22 16:54:01 +09:00
Benas Jacikas 9651bd1819 Use base_model syntax for Nebius GLM-5.2
Inherit provider-agnostic facts from models/zhipuai/glm-5.2.toml; keep
only Nebius-specific cost, reasoning_options, interleaved, and limit
overrides. Resolved output unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 06:39:37 +00:00
Aiden Cline 6421137686 Merge pull request #2716 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-21 22:38:48 -05:00
github-actions[bot] d55e91a7ed chore(sync): update OpenRouter model catalog 2026-06-22 03:27:02 +00:00
Aiden Cline 2b9886f76b Merge pull request #2695 from leszek3737/zenmuz-glm52
Zenmux add GLM 5.2 and GLM 5.2 (Free) models
2026-06-21 21:59:17 -05:00
Aiden Cline f027b11048 Merge pull request #2708 from tonimelisma/add-zai-glm-5.2-local
feat(zai): add GLM-5.2 to Z.AI API provider
2026-06-21 21:55:21 -05:00
Aiden Cline 641d790970 Merge pull request #2710 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-21 21:50:59 -05:00
Aiden Cline fcebda34d4 Merge pull request #2712 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-21 21:50:10 -05:00
github-actions[bot] 3262e4ca30 chore(sync): update Vercel AI Gateway model catalog 2026-06-22 01:30:25 +00:00
github-actions[bot] 656c744502 chore(sync): update OpenRouter model catalog 2026-06-22 01:30:23 +00:00
flamerged 01974df938 Add GLM-5.2 to wafer.ai provider
Wafer serves GLM-5.2 serverless (confirmed via GET https://pass.wafer.ai/v1/models)
but it was missing from the models.dev catalog, so the opencode CLI (which pulls
its provider/model list from models.dev) did not list wafer.ai/GLM-5.2.

Pricing and limits from the live wafer /v1/models endpoint:
- context: 1048576
- output: 131072
- input: $1.20 / output: $4.10 / cache_read: $0.20 per million tokens
- reasoning: true (toggle), tool_call: true, structured_output: true
- vision/attachment: false, text-only I/O

Matches the existing wafer.ai/GLM-5.1.toml convention (self-contained TOML,
toggle reasoning_options, underscore-separated numeric literals).
2026-06-22 00:51:23 +02:00
thestreamcode 7f3dd51c5e fix: handle Windows path separators in catalog generation
On Windows, `path.relative()` and `Bun.Glob` return paths with backslash
separators, while model IDs and the Chutes API use forward slashes. This
broke two things on Windows:

- `generate()` keyed model metadata as `provider\model`, so every
  `base_model` reference failed to resolve, making `bun run validate`,
  the test suite and the web build unusable.
- `generate-chutes.ts` compared backslash file paths against forward-slash
  API IDs, so the orphan check matched nothing and would delete every
  existing model file.

Normalize the affected paths to forward slashes. No behaviour change on
POSIX, where `path.sep` is already `/`.
2026-06-21 13:26:17 +02:00
Toni Melisma ccc1375e0a feat(zai): add GLM-5.2 to Z.AI API provider
Add metered GLM-5.2 for the standard Z.AI API endpoint, matching
zhipuai pricing and reasoning_options and using base_model inheritance
like other zai models.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-20 23:43:37 -07:00
Leszek 8065aa3c9f Add reasoning effort options to Zenmux GLM 5.2 models 2026-06-21 01:51:54 +02:00
Aiden Cline 363e0e6f3d Merge pull request #2705 from shzdehmd/dev
chore(firepass): remove the Fireworks AI Firepass provider
2026-06-20 18:00:42 -05:00
Ahmad Shahzad e3758e83d8 chore: remove Firepass provider 2026-06-21 03:52:09 +05:00
Aiden Cline 88046a33d3 Merge pull request #2700 from Tavernari/feat/add-claudius-model
chore(sync): add claudius model with audio/video input + add audio/video to claudinio
2026-06-20 16:12:51 -05:00
Aiden Cline 950b283605 Merge pull request #2701 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-20 16:12:27 -05:00
Aiden Cline 685635d0ca Merge pull request #2702 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-20 16:12:14 -05:00
Aiden Cline edf9c72753 Merge pull request #2703 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-20 16:12:03 -05:00
github-actions[bot] 3ad03b27c9 chore(sync): update Vercel AI Gateway model catalog 2026-06-20 20:44:46 +00:00
github-actions[bot] 2cb040b524 chore(sync): update OpenRouter model catalog 2026-06-20 20:44:45 +00:00
github-actions[bot] e8cab955f6 chore(sync): update Venice model catalog 2026-06-20 20:44:43 +00:00
Victor Carvalho Tavernari f759c801f6 feat: add audio+video input modalities to claudinio and claudius 2026-06-20 21:30:14 +01:00
Victor Carvalho Tavernari 539f58605e fix: inline claudius model instead of extends to fix CI validation 2026-06-20 21:28:24 +01:00
Victor Carvalho Tavernari ed3264b049 feat: add claudius model extending claudinio with / pricing 2026-06-20 20:04:53 +01:00
Aiden Cline e3df94e9a1 Merge pull request #2623 from smakosh/feat/llmgateway-add-gemma4-kimi-highspeed-qwen35-glm52
feat: add LLM Gateway gemma-4, kimi-k2.7-code-highspeed, qwen3.5-9b, glm-5.2
2026-06-20 14:53:38 -04:00
Aiden Cline 67b48ce993 Merge pull request #2679 from mitjap/remove-cortecs-devstral-small-2512
remove deprecated model cortecs/devstral-small-2512
2026-06-20 14:47:11 -04:00
Aiden Cline 9a0e70541c Merge pull request #2694 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-20 14:45:28 -04:00
Aiden Cline cce974a4ad Merge pull request #2698 from howmanysmall/feat/crof-deepseek-v4-pro-lightning-name
feat(crof): name DeepSeek V4 Pro Lightning
2026-06-20 14:43:36 -04:00
github-actions[bot] 1e9d80827c chore(sync): update OpenRouter model catalog 2026-06-20 17:47:50 +00:00
howmanysmall 12c5588b63 feat(models): add name to crof DeepSeek V4 Pro Lightning model
This helps distinguish it from the cheaper DeepSeek V4 Pro on crof
2026-06-19 22:35:32 -06:00
Leszek f2e9ca7166 Update Zenmux GLM 5.2 base model provider alias 2026-06-20 02:01:57 +02:00
Leszek 7e36f36eae Zenmux add GLM 5.2 and GLM 5.2 (Free) models
Adds configurations for the GLM 5.2 model under the Zenmux provider, including a distinct free-tier variant with zero cost.
2026-06-20 01:59:52 +02:00
Aiden Cline 28d4dbbd4c Merge pull request #2693 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-19 19:08:39 -04:00
Aiden Cline fbac01e55b Merge pull request #2584 from anomalyco/automation/sync-models-google
chore(sync): update Google model catalog
2026-06-19 19:08:26 -04:00
Aiden Cline 5fb63a5fab Merge pull request #2646 from BlockListed/cortecs-add-glm-5-2-kimi-k2-7
Cortecs add glm 5.2 and kimi k2.7
2026-06-19 18:36:50 -04:00
github-actions[bot] 32aaa20233 chore(sync): update Venice model catalog 2026-06-19 22:35:02 +00:00
github-actions[bot] 828e41d9fc chore(sync): update Google model catalog 2026-06-19 22:34:58 +00:00
Aiden Cline bca5c31ce3 Merge pull request #2644 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-19 18:33:13 -04:00
Aiden Cline c02d341c32 Merge pull request #2669 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-19 18:32:41 -04:00
Aiden Cline 5df780da5d Merge pull request #2668 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-19 18:32:35 -04:00
Aiden Cline 6462c50ac4 Merge pull request #2680 from jcraftsman/umans-curated-reasoning-options
umans-ai: curate reasoning_options to match each model's real reasoning support
2026-06-19 18:20:13 -04:00
Aiden Cline ff9ba6944e Merge pull request #2684 from Omee11/feat/token-plan-glm5.2-kimi-k2.7-code
feat(alibaba-token-plan): add glm-5.2 and kimi-k2.7-code
2026-06-19 18:19:40 -04:00
Aiden Cline e3d50a0856 Merge pull request #2686 from patrik-kuehl/mark-glm-5.2-as-open-weighted
chore(models): mark GLM 5.2 as open-weighted
2026-06-19 18:16:55 -04:00
Aiden Cline 8c56ecaed4 Merge pull request #2683 from skyitachi/add-siliconflow-glm-5.2
feat(siliconflow): add zai-org/GLM-5.2
2026-06-19 18:16:14 -04:00
github-actions[bot] f47485ca2a chore(sync): update Vercel AI Gateway model catalog 2026-06-19 21:41:53 +00:00
github-actions[bot] 5a665a775e chore(sync): update OpenRouter model catalog 2026-06-19 21:41:52 +00:00
github-actions[bot] 35e34181ea chore(sync): update Venice model catalog 2026-06-19 21:41:50 +00:00
BlockListed 20cce673df add kimi k2.7 to cortecs 2026-06-19 10:29:55 +02:00
BlockListed 29ae2fac59 add glm 5.2 to cortecs 2026-06-19 10:29:51 +02:00
Patrik Kühl 0705837fc7 chore(models): mark GLM 5.2 as open-weighted 2026-06-19 09:27:22 +02:00
Benas Jacikas 496be2ddca Add Nebius Token Factory GLM-5.2
Pricing and capabilities from the Nebius Token Factory models API
(verbose=true). reasoning_effort enum (low/medium/high) and the 432k
context/output cap confirmed against the live endpoint.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LhnDro1waV1ZSjWs1hbJvJ
2026-06-19 05:50:39 +00:00
Oliver Mee 5cd309aa57 feat(alibaba-token-plan): add glm-5.2 and kimi-k2.7-code
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 12:51:34 +08:00
skyitachi 3cc1c1861a feat: add zai-org/GLM-5.2 to siliconflow and siliconflow-cn 2026-06-19 11:14:44 +08:00
wassel alazhar c03cb0723d umans-ai: curate reasoning_options to match each model's real support
Align the umans-ai and umans-ai-coding-plan reasoning_options with the
levels each model actually exposes via the Umans gateway:

- GLM 5.1: toggle only (reasoning is on/off; effort is not meaningful)
- GLM 5.2: toggle + effort high/max (only high/max are real levels)
- Umans Coder / Kimi K2.7: [] (always-on; no toggle, no effort tiers)

Flash and the Qwen alias are unchanged (off + low/medium/high).
2026-06-18 23:28:33 +02:00
Mitja Puzigaća fe73d94598 remove deprecated model cortecs/devstral-small-2512 2026-06-18 19:58:45 +02:00
Celina Hanouti db8d4aee45 feat(sync): add Hugging Face inference providers sync
Mirror the existing daily model-catalog sync for the Hugging Face
Inference Providers router (https://router.huggingface.co/v1/models),
modeled on the baseten provider.

The router is an aggregator: each model is served by several inference
providers with their own pricing, context window, and capabilities, and
requests are routed to the fastest one. The provider collapses them into
the route a request would actually take -- pricing and context from the
highest-throughput provider, with tool/structured-output support taken
from any provider since a caller can pin a slower one.

New models are created via canonical base_model resolution (the same
resolveCanonicalBaseModel/factorBaseModel path baseten uses); unmappable
or unpriced models are skipped and reported in a notice. For now the sync
only creates new models -- existing curated TOMLs are left untouched via
sameModel -- and never deletes (deleteMissing: false).

HF_TOKEN is optional; the router model list is public.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PzQSYd3VwBK5NAsC9dYmSw
2026-06-18 16:48:44 +02:00
Aiden Cline e52ec1e870 fix(aihubmix): remove Gemini Pro token budget 2026-06-18 15:04:53 +02:00
Aiden Cline 490f0f7a07 fix(cortecs): use documented reasoning budgets 2026-06-18 14:19:17 +02:00
Aiden Cline c9b401a34d fix(aihubmix): add Gemini reasoning efforts 2026-06-18 14:19:17 +02:00
Aiden Cline a571899ac0 Merge pull request #2670 from xhml-tangf/dev
feat: add GLM-5.2 to Zhipu AI provider models
2026-06-18 14:09:15 +02:00
Edward d00ab87a87 feat: add GLM-5.2 to Zhipu AI provider models 2026-06-18 19:50:33 +08:00
Aiden Cline 760fbc07d6 Merge pull request #2665 from jcraftsman/feat/umans-coding-plan-coder-glm52-reasoning
umans-ai + umans-ai-coding-plan: repoint coder to K2.7, add GLM 5.2, drop K2.6, normalise reasoning
2026-06-18 12:36:17 +02:00
Aiden Cline 8bc9cfafe3 Merge pull request #2289 from anomalyco/split/opencode-anthropic-reasoning-options
[opencode/anthropic] Add reasoning options
2026-06-18 12:21:42 +02:00
Aiden Cline 67c8d0971e Merge pull request #2293 from anomalyco/split/opencode-minimax-reasoning-options
[opencode/minimax] Add reasoning options
2026-06-18 12:21:05 +02:00
Aiden Cline 6da1466c7c Merge pull request #2467 from anomalyco/split/nano-gpt-moonshotai-reasoning-options
[nano-gpt/moonshotai] Add reasoning options
2026-06-18 12:20:05 +02:00
Aiden Cline bac480d051 Merge pull request #2483 from anomalyco/split/nano-gpt-x-ai-reasoning-options
[nano-gpt/x-ai] Add reasoning options
2026-06-18 12:19:46 +02:00
Aiden Cline 4f254bda4e Merge pull request #2511 from anomalyco/split/siliconflow-tencent-reasoning-options
[siliconflow/tencent] Add reasoning options
2026-06-18 12:19:21 +02:00
Aiden Cline 633540f206 Merge pull request #2512 from anomalyco/split/siliconflow-thudm-reasoning-options
[siliconflow/THUDM] Add reasoning options
2026-06-18 12:18:56 +02:00
wassel alazhar 964bf76999 umans-ai + coding-plan: repoint coder to K2.7, add GLM 5.2, drop K2.6, normalise reasoning
Brings both umans providers in line with what umans.ai serves today, with identical
model structure across them. Per-token [cost] lives on the pay-by-token provider
(umans-ai) only; the coding plan is a flat subscription, so its models stay at [cost] = 0.

Both providers (umans-ai and umans-ai-coding-plan):
- umans-coder: base_model -> moonshotai/kimi-k2.7-code (inherits the kimi-k2 family).
  Always reasons, so it exposes effort levels only (no on/off toggle).
- add umans-glm-5.2 (reasoning toggle + effort, 405504 context).
- drop umans-kimi-k2.6 (no longer published in the catalogue).
- reasoning_options: effort (low/medium/high) everywhere; the on/off toggle is kept only
  on models that can disable reasoning (flash, glm-5.1, glm-5.2, qwen3.6-35b-a3b).
  kimi-k2.7 and coder always reason, so no toggle.

Pricing (umans-ai / pay-by-token only, $/M in / out / cache-read):
    umans-coder, umans-kimi-k2.7        0.95 / 4.00 / 0.19
    umans-glm-5.2                       1.40 / 4.40 / 0.26
    umans-glm-5.1                       1.40 / 4.40 / 0.29
    umans-flash                         0.15 / 1.00 / 0.05
umans-ai-coding-plan keeps [cost] = 0 (subscription, no per-token charge).
2026-06-18 12:15:09 +02:00
Aiden Cline a9b9f2998e Merge pull request #2652 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-18 12:14:17 +02:00
Aiden Cline 689126a1a2 Merge pull request #2526 from anomalyco/split/vercel-minimax-reasoning-options
[vercel/minimax] Add reasoning options
2026-06-18 12:13:46 +02:00
Aiden Cline 5668077eae Merge pull request #2567 from anomalyco/consolidate/github-copilot-google-router-reasoning-options
[github-copilot/google] Add reasoning options and remove Raptor Mini
2026-06-18 12:11:58 +02:00
Aiden Cline 09a783c54f chore(github-copilot): remove Raptor Mini 2026-06-18 12:11:08 +02:00
Aiden Cline 8d635f97a8 fix(github-copilot): complete Google reasoning options 2026-06-18 12:06:32 +02:00
Aiden Cline b5d4b84a7a fix(github-copilot): add Anthropic reasoning budgets 2026-06-18 12:06:15 +02:00
Aiden Cline 02fc312c05 Merge pull request #2656 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-18 12:00:47 +02:00
Aiden Cline 2780a25242 Merge pull request #2658 from InfHorus/dev
Add Latest LucidQuery models
2026-06-18 12:00:37 +02:00
Aiden Cline 0f26261671 Merge pull request #2655 from KTibow/automation/sync-models-crof
chore(sync): update CrofAI model catalog
2026-06-18 12:00:16 +02:00
Aiden Cline 684b1f37aa Merge pull request #2654 from RISHIKREDDYL/fix/azure-cognitive-services-env-var
fix(azure-cognitive-services): correct env var in kimi model API URLs
2026-06-18 11:59:28 +02:00
Aiden Cline c0341f0ce8 refactor(azure-cognitive-services): use Kimi base models 2026-06-18 11:57:15 +02:00
Aiden Cline 389fefa6df Merge pull request #2648 from houtanb/dev
Use base model metadata for GLM-5 and GLM-5.1, and fix release dates
2026-06-18 11:54:42 +02:00
Aiden Cline d78e43f537 Merge pull request #2633 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-18 11:51:49 +02:00
github-actions[bot] dd725fcb4b chore(sync): update Baseten model catalog 2026-06-18 09:47:33 +00:00
github-actions[bot] dc85ae0999 chore(sync): update OpenRouter model catalog 2026-06-18 09:47:31 +00:00
github-actions[bot] 4db533d460 chore(sync): update Venice model catalog 2026-06-18 09:47:30 +00:00
Aiden Cline abcb2424ca Merge pull request #2659 from thehaseebahmed/azure-gpt-image-models
feat(azure): add gpt-image-1, 1.5, and 2 models with pricing
2026-06-18 11:46:32 +02:00
Aiden Cline 0248ace087 Merge pull request #2627 from JoshuaDietz/dev
feat(ollama-cloud): add glm-5.2
2026-06-18 11:45:33 +02:00
Aiden Cline fc05522afe feat(openai): add GPT Image 2 2026-06-18 11:43:28 +02:00
Aiden Cline 5ae1dc5ff8 fix(azure): use base models for GPT Image 2026-06-18 11:40:46 +02:00
Aiden Cline 13e826f763 Merge pull request #2666 from heimoshuiyu/add-alibaba-token-plan-cn-glm-5.2
feat(alibaba-token-plan-cn): add GLM-5.2 model
2026-06-18 11:37:09 +02:00
heimoshuiyu e543afc6cf feat(alibaba-token-plan-cn): add GLM-5.2 model 2026-06-18 17:27:19 +08:00
Haseeb Ahmed c0b530099b feat(azure): add gpt-image-1, 1.5, and 2 models with pricing 2026-06-18 01:24:33 +02:00
InfHorus 7da1e391f4 Add 'agi' to the family list 2026-06-18 00:51:29 +02:00
InfHorus 441920b865 Add support for LucidQuery AGI-01 family 2026-06-18 00:39:31 +02:00
InfHorus b81c4c47fd Update LucidQuery API 2026-06-18 00:28:41 +02:00
KTibow a671ff0c50 chore(sync): update CrofAI model catalog 2026-06-17 14:18:03 -07:00
RISHIKREDDYL 87114fccb6 Fix incorrect env var in Azure Cognitive Services kimi models
The kimi-k2.5.toml and kimi-k2.6.toml files in azure-cognitive-services used
AZURE_RESOURCE_NAME in their API URLs, but the provider declares
AZURE_COGNITIVE_SERVICES_RESOURCE_NAME as the expected environment variable.

Changes:
- kimi-k2.5.toml: converted from symlink (pointing to azure/models/) to
  standalone real file with the corrected env var
- kimi-k2.6.toml: replaced AZURE_RESOURCE_NAME with
  AZURE_COGNITIVE_SERVICES_RESOURCE_NAME in the API URL

This matches the pattern used by other models with provider overrides in
azure-cognitive-services (e.g. claude-haiku-4-5, claude-opus-4-1, etc.).
2026-06-17 23:30:08 +05:30
Houtan Bastani 2bed70cca9 Use base model metadata for GLM-5 and GLM-5.1, and fix release dates
glm-5 release date: https://docs.z.ai/release-notes/new-released?utm_source=chatgpt.com#2026-02-12
glm-5.1 release date: https://docs.z.ai/release-notes/new-released?utm_source=chatgpt.com#2026-04-07
2026-06-17 13:57:11 +02:00
Frank 3f537855c3 update go models 2026-06-17 13:22:27 +02:00
Aiden Cline 8f5ae25daf Merge pull request #2645 from monotykamary/neuralwatt-glm-5-2-reasoning-efforts
feat(neuralwatt): expose full GLM 5.2 reasoning effort scale
2026-06-17 13:05:36 +02:00
Tom X Nguyen c5b3973a25 feat(neuralwatt): expose full GLM 5.2 reasoning effort scale
GLM-5.2 accepts the OpenAI-standard reasoning_effort field and supports
a wider depth range than the three levels previously advertised. Per
the Neuralwatt chat-completions docs [1], the gateway accepts and
normalizes the full scale:

  minimal -> skips the reasoning phase entirely (eq enable_thinking: false)
  low     -> mapped to high
  medium  -> mapped to high
  high    -> enhanced reasoning (balanced)
  xhigh   -> mapped to max (deepest; best for math/planning/agentic tasks)

The provider's thinkingLevelMap (pi-neuralwatt-provider/patch.json) already
exposes all five pi tiers, so mirror that here by adding minimal and xhigh
to the effort values for glm-5.2.

[1] https://portal.neuralwatt.com/docs/api/chat-completions
2026-06-17 17:57:22 +07:00
Joshua Dietz 5bf8d5a2c4 fix reasoning options
I'm unsure about the possible values, but the zai-coding-plan version uses the same high/max options that I've added now. This seems to be confirmed by https://huggingface.co/zai-org/GLM-5.2/discussions/1
2026-06-17 12:50:28 +02:00
Aiden Cline 553cde57ce Merge pull request #2563 from anomalyco/consolidate/aihubmix-small-labs-reasoning-options
[aihubmix/multiple labs] Add reasoning options
2026-06-17 12:26:46 +02:00
Aiden Cline 5094f20a1a Merge pull request #2529 from anomalyco/split/vercel-nvidia-reasoning-options
[vercel/nvidia] Add reasoning options
2026-06-17 12:26:29 +02:00
Aiden Cline 2d77e101e0 Merge pull request #2643 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-17 12:24:43 +02:00
Aiden Cline be1481eb27 Delete providers/openrouter/models/anthropic/claude-fable-5.toml 2026-06-17 12:24:28 +02:00
Aiden Cline 39f2a40a75 Merge pull request #2642 from anomalyco/fix/openrouter-blacklist-fable-5
fix(openrouter): blacklist Fable 5 models
2026-06-17 12:24:12 +02:00
Aiden Cline 5e9701a219 test: remove sync test suites 2026-06-17 12:18:19 +02:00
github-actions[bot] 3d0fbe7f20 chore(sync): update OpenRouter model catalog 2026-06-17 09:55:47 +00:00
Aiden Cline a8dd73ac1e fix(openrouter): blacklist Fable 5 models 2026-06-17 11:44:29 +02:00
Aiden Cline 96518b7942 Merge pull request #2615 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-17 05:42:14 -04:00
Aiden Cline ab2e1ed68d Delete providers/openrouter/models/anthropic/claude-fable-5.toml 2026-06-17 11:42:04 +02:00
Aiden Cline f8abb306ee Merge pull request #2640 from anomalyco/audit/vercel-mistral-small-capability
[vercel/mistral] Correct Mistral Small reasoning
2026-06-17 05:40:33 -04:00
Aiden Cline 6f3fb7e69a Merge pull request #2639 from anomalyco/audit/vercel-alibaba-openai-followup
[vercel/alibaba openai] Add tested reasoning controls
2026-06-17 05:40:16 -04:00
Aiden Cline 1309db94e6 [vercel/mistral] Correct Mistral Small reasoning 2026-06-17 11:30:40 +02:00
Joshua Dietz dc07908c6e implement PR feedback 2026-06-17 11:13:10 +02:00
github-actions[bot] 571188e70a chore(sync): update OpenRouter model catalog 2026-06-17 08:13:08 +00:00
Aiden Cline dee4628f3e Merge pull request #2636 from monotykamary/add-neuralwatt-glm-5-2
feat(neuralwatt): add GLM 5.2 and retire MiniMax M2.5, Devstral, GPT OSS 20B
2026-06-17 03:06:33 -04:00
Tom X Nguyen 34bbbc4b5f feat(neuralwatt): add GLM 5.2 and retire MiniMax M2.5, Devstral, GPT OSS 20B
Sync neuralwatt provider with the current Neuralwatt API data (from
../pi-neuralwatt-provider: models.json -> patch.json -> custom-models.json).

Added:
- glm-5.2: GLM 5.2 (family glm, 1_048_560 context/output, 1.45/4.5 cost,
  reasoning via effort [low,medium,high] — provider sets
  supportsReasoningEffort with no reasoning_content interleaving)

Removed (no longer in the provider API):
- MiniMaxAI/MiniMax-M2.5.toml
- mistralai/Devstral-Small-2-24B-Instruct-2512.toml
- openai/gpt-oss-20b.toml

README: added GLM 5.2 to the reasoning list; dropped the MiniMax M2.5,
GPT OSS 20B lines and the now-empty Devstral section.

opus/flex/long and canary variants excluded by request.
2026-06-17 11:32:01 +07:00
Aiden Cline 0eba09c28e Merge pull request #2634 from shzdehmd/dev
feat(fireworks-ai): add GLM-5.2 and fix Kimi/DeepSeek/GPT pricing
2026-06-17 00:17:07 -04:00
Ahmad Shahzad b4bf6468b4 feat(fireworks-ai): add GLM-5.2 and fix Kimi/DeepSeek/GPT pricing
- Add GLM-5.2 (accounts/fireworks/models/glm-5p2) with 1M context and

  Fireworks serverless pricing ($1.40 / $0.26 / $4.40).

- Normalize Kimi K2.7 Code and Kimi K2.7 Code Fast TOML files to be

  self-contained and follow the same metadata pattern as Kimi K2.6.

- Fix Kimi K2.7 Code Fast input price ($2.00 -> $1.90).

- Fix DeepSeek V4 Flash cache read price ($0.03 -> $0.028).

- Fix GPT OSS 120B cache read price ($0.01 -> $0.015).

- Set last_updated to 2026-06-16 for all touched provider files.
2026-06-17 08:13:52 +05:00
Aiden Cline eb89d9b2ad Merge pull request #2624 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-16 19:41:08 -04:00
Aiden Cline 89857613f2 Merge pull request #2629 from pat-baseten/add-glm-5.2-baseten
Add GLM-5.2 to Baseten provider
2026-06-16 19:09:00 -04:00
Aiden Cline 30cff10862 Merge pull request #2630 from pat-baseten/fix-kimi-k2.7-code-pricing-baseten
Fix Kimi K2.7 Code pricing for Baseten provider
2026-06-16 19:08:42 -04:00
github-actions[bot] eec148d635 chore(sync): update Venice model catalog 2026-06-16 22:54:48 +00:00
Pat c2d5869400 Fix Kimi K2.7 Code pricing for Baseten provider
Correct input and cache read costs to match published Baseten pricing
($0.95 input / $0.16 cached input / $4.00 output per 1M tokens).
2026-06-16 14:34:59 -07:00
Pat caa20e6a67 Add GLM-5.2 pricing from Baseten Model APIs
Set input, cache read, and output costs to match the published
Baseten pricing page ($1.50 / $0.30 / $4.50 per 1M tokens).
2026-06-16 14:34:57 -07:00
Pat c85b741815 Add GLM-5.2 to Baseten provider
Configure Baseten serving metadata for zai-org/GLM-5.2 using the
zhipuai/glm-5.2 base model. Limits and reasoning options are sourced
from the Baseten Model APIs catalog; cost is omitted until pricing is
published in the /v1/models endpoint.
2026-06-16 14:34:57 -07:00
Joshua Dietz 4fce8b4df6 feat(ollama-cloud): add glm-5.2 2026-06-16 22:37:10 +02:00
Aiden Cline 2655f319f0 Merge pull request #2622 from cline/saoudrizwan/add-openrouter-glm-5.2
feat: add z-ai/glm-5.2 model on OpenRouter
2026-06-16 14:48:14 -04:00
smakosh 805aababcb feat: add LLM Gateway gemma-4, kimi-k2.7-code-highspeed, qwen3.5-9b, glm-5.2
Add provider entries for newly available LLM Gateway text models:
- gemma-4-31b-it, gemma-4-26b-a4b-it (Google, reasoning)
- kimi-k2.7-code-highspeed (Moonshot, highspeed tier of kimi-k2.7-code)
- qwen3.5-9b (Alibaba)
- glm-5.2 (Z.AI)

Adds base model metadata for kimi-k2.7-code-highspeed and qwen3.5-9b.
Pricing for gemma/kimi/qwen taken from the api.llmgateway.io catalog;
glm-5.2 pricing from the Z.AI docs (input $1.4, cache_read $0.26, output $4.4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 20:10:59 +02:00
Saoud Rizwan d8e8b4ec82 feat: add z-ai/glm-5.2 model on OpenRouter 2026-06-16 11:00:27 -07:00
Yashwanth Kumar 722a842e4b Merge branch 'anomalyco:dev' into patch-1 2026-06-16 22:45:42 +05:30
Yashwanth Kumar 6789ecff13 Adding Minimax-M3 2026-06-16 22:44:55 +05:30
Aiden Cline cbe5e319dd Merge pull request #2619 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-16 13:06:44 -04:00
Aiden Cline b6c8f645fb Merge pull request #2620 from anomalyco/automation/sync-models-cloudflare-workers-ai
chore(sync): update Cloudflare Workers AI model catalog
2026-06-16 13:06:19 -04:00
github-actions[bot] fb62ddc484 chore(sync): update Cloudflare Workers AI model catalog 2026-06-16 16:56:06 +00:00
github-actions[bot] 0f41070eb8 chore(sync): update Vercel AI Gateway model catalog 2026-06-16 16:55:59 +00:00
Aiden Cline 484985736c Merge pull request #2565 from anomalyco/consolidate/cortecs-small-labs-reasoning-options
[cortecs/multiple labs] Add reasoning options
2026-06-16 12:31:28 -04:00
Aiden Cline 1f43cb15ef Merge pull request #2608 from anomalyco/audit/vercel-other-labs-reasoning-options
[vercel/multiple labs] Add verified reasoning options
2026-06-16 12:31:07 -04:00
Aiden Cline e6b8ec45e1 Merge pull request #2617 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-16 12:30:47 -04:00
Aiden Cline 2d12b0d3ca Merge pull request #2609 from anomalyco/audit/vercel-xai-reasoning-options
[vercel/xai] Add verified reasoning options
2026-06-16 12:25:04 -04:00
github-actions[bot] b44440b6af chore(sync): update Baseten model catalog 2026-06-16 15:06:04 +00:00
Aiden Cline a53102dc3c [vercel/alibaba] Add tested Qwen 3.7 Plus budget 2026-06-16 16:28:45 +02:00
Aiden Cline 24603efe7e [vercel/alibaba] Add tested thinking budgets 2026-06-16 16:28:25 +02:00
Aiden Cline 67c096aa35 [vercel/anthropic] Use tested 4.6 budget bounds 2026-06-16 16:21:26 +02:00
Aiden Cline 98ccd21e83 [vercel/openai] Correct tested effort ranges 2026-06-16 16:17:43 +02:00
Aiden Cline 50c93de146 [vercel/openai] Add tested chat model efforts 2026-06-16 16:15:11 +02:00
Aiden Cline f0c8295802 [vercel/xai] Remove ineffective Grok none effort 2026-06-16 16:12:52 +02:00
Aiden Cline fc3997f467 [vercel/google] Add tested Flash Lite efforts 2026-06-16 16:11:22 +02:00
Aiden Cline def16b04c7 [vercel/anthropic] Add tested gateway controls 2026-06-16 16:11:06 +02:00
Aiden Cline 2f9470a3b1 Merge pull request #2611 from anomalyco/audit/vercel-alibaba-openai-followup
[vercel/alibaba openai] Complete reasoning audit
2026-06-16 10:08:33 -04:00
Aiden Cline efe09a008e Merge pull request #2610 from anomalyco/audit/vercel-zai-reasoning-options
[vercel/zai] Add reasoning toggles
2026-06-16 10:08:18 -04:00
Aiden Cline a2a0de474b Merge pull request #2612 from anomalyco/audit/vercel-capability-reconciliation
[vercel] Reconcile reasoning capabilities
2026-06-16 07:41:52 -04:00
Aiden Cline cfe25d7eb2 Merge pull request #2595 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-16 07:00:33 -04:00
Aiden Cline 625519a252 Delete providers/openrouter/models/anthropic/claude-fable-5.toml 2026-06-16 12:59:59 +02:00
Aiden Cline a4a0e09c88 Merge pull request #2596 from anomalyco/automation/sync-models-vercel
chore(sync): update Vercel AI Gateway model catalog
2026-06-16 06:58:22 -04:00
github-actions[bot] a91f972ac7 chore(sync): update OpenRouter model catalog 2026-06-16 10:57:27 +00:00
github-actions[bot] ff652bba52 chore(sync): update Vercel AI Gateway model catalog 2026-06-16 10:57:27 +00:00
Aiden Cline abb6c053f4 Merge pull request #2613 from anomalyco/feat/moonshot-kimi-k2.7-code-highspeed
feat(moonshotai): add Kimi K2.7 Code HighSpeed
2026-06-16 06:40:56 -04:00
Aiden Cline 837d9f414e feat(moonshotai): add Kimi K2.7 Code HighSpeed 2026-06-16 12:39:59 +02:00
Aiden Cline 4358b05cac Merge pull request #2593 from houtanb/dev
Reuse base model metadata for Gemini and Mistral provider entries
2026-06-16 06:25:17 -04:00
Aiden Cline d0089030e3 Merge pull request #2585 from cline/saoudrizwan/remove-openrouter-fable-5
chore: remove Claude Fable 5 from OpenRouter
2026-06-16 06:24:53 -04:00
Aiden Cline e6ee64384c Merge pull request #2594 from hqrrr/moonshotai-cn-kimi-k2.7-code
[moonshotai-cn] Add kimi-k2.7-code.toml symlink
2026-06-16 06:24:33 -04:00
Aiden Cline a1d7729b1c Merge pull request #2597 from SvanBoxel/patch-1
Update context lengths for Poolside Laguna models
2026-06-16 06:24:14 -04:00
Aiden Cline d20ce82097 Merge pull request #2598 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-16 06:23:44 -04:00
Aiden Cline a6cd9749ef Merge pull request #2600 from oskarkocol/feat/update-togetherai-prices
chore: update TogetherAI prices 20260615
2026-06-16 06:23:35 -04:00
Aiden Cline 909041d729 Merge pull request #2590 from nikosch86/add/cortecs-minimax-m3
add llama-4-maverick and minimax-m3 to cortecs
2026-06-16 06:23:22 -04:00
Aiden Cline 118828ca54 [vercel] Reconcile reasoning capabilities 2026-06-16 12:20:05 +02:00
Aiden Cline f76e595b63 Merge remote-tracking branch 'origin/dev' into audit/vercel-other-labs-reasoning-options
# Conflicts:
#	providers/vercel/models/bytedance/seed-1.6.toml
#	providers/vercel/models/bytedance/seed-1.8.toml
#	providers/vercel/models/mistral/mistral-medium-3.5.toml
#	providers/vercel/models/perplexity/sonar-reasoning-pro.toml
#	providers/vercel/models/stepfun/step-3.5-flash.toml
2026-06-16 12:18:26 +02:00
Aiden Cline 1ea9929364 Merge remote-tracking branch 'origin/dev' into audit/vercel-xai-reasoning-options
# Conflicts:
#	providers/vercel/models/xai/grok-4.1-fast-reasoning.toml
#	providers/vercel/models/xai/grok-4.20-multi-agent-beta.toml
#	providers/vercel/models/xai/grok-4.20-multi-agent.toml
#	providers/vercel/models/xai/grok-4.20-reasoning-beta.toml
#	providers/vercel/models/xai/grok-4.20-reasoning.toml
#	providers/vercel/models/xai/grok-4.3.toml
2026-06-16 12:18:00 +02:00
Aiden Cline b0cfceeff3 [vercel/alibaba openai] Complete reasoning audit 2026-06-16 12:16:34 +02:00
Aiden Cline 05db497663 [vercel/multiple labs] Add verified reasoning options 2026-06-16 12:16:28 +02:00
Aiden Cline ae393aaca8 [vercel/zai] Add reasoning toggles 2026-06-16 12:16:20 +02:00
Aiden Cline 82ddea90f3 [vercel/xai] Add verified reasoning options 2026-06-16 12:16:14 +02:00
Aiden Cline 2aad7e6f16 [vercel/anthropic] Use route-safe reasoning controls 2026-06-16 12:15:29 +02:00
Aiden Cline f3070c436e Merge pull request #2601 from oskarkocol/chore/update-stepfun-20260615
chore: update stepai prices 20260615
2026-06-16 06:14:52 -04:00
Aiden Cline 728dad6ec2 [vercel/alibaba] Remove unsupported Coder toggles 2026-06-16 12:14:12 +02:00
Aiden Cline fd8a8846ea [vercel/google] Remove unsupported Gemma reasoning control 2026-06-16 12:13:13 +02:00
Aiden Cline 3f0df86ec4 Merge pull request #2599 from maxlang/update-ambient-glm51-kimi-k27
chore(ambient): add Kimi K2.7 Code, refresh GLM 5.1
2026-06-16 06:13:13 -04:00
Aiden Cline 43e1010e1e [vercel/minimax] Add M3 reasoning toggle 2026-06-16 12:12:32 +02:00
Aiden Cline 59ae24e3b1 [vercel/anthropic] Add gateway reasoning efforts 2026-06-16 11:51:56 +02:00
Aiden Cline 0886fc4e11 Merge pull request #2602 from oskarkocol/chore/update-siliconflow-20260615
chore: update siliconflow prices 20260615
2026-06-16 05:49:17 -04:00
Aiden Cline 7a7276123a Merge pull request #2603 from oskarkocol/chore/update-novitaai-20260615
chore: update novita pricing 20260615
2026-06-16 05:46:26 -04:00
Aiden Cline 374135b350 Merge pull request #2606 from JDinABox/dev
Add Neuralwatt Kimi K2.7 Code model configuration
2026-06-16 05:46:00 -04:00
Aiden Cline 87ba6613d2 Merge pull request #2605 from oskarkocol/chore/update-fireworks-20260615
chore: update fireworks pricing 20260615
2026-06-16 05:45:45 -04:00
Aiden Cline 57d1b2489a Merge pull request #2607 from BlockListed/cortecs-add-glm-5v
add glm-5*-turbo to cortecs
2026-06-16 05:45:23 -04:00
Aiden Cline ee243e06b4 Merge pull request #2591 from vglafirov/remove-gitlab-fable-5
Remove GitLab Duo Chat Fable 5 model
2026-06-16 11:29:35 +02:00
github-actions[bot] d7f8f4f40a chore(sync): update Venice model catalog 2026-06-16 08:20:39 +00:00
BlockListed e35a772633 add glm-5*-turbo to cortecs 2026-06-16 10:04:51 +02:00
JD Crawford 20056e2c02 feat(neuralwatt): add Kimi K2.7 Code model support 2026-06-16 03:38:30 -04:00
oskar 45c6ab5999 update the last_updated date 2026-06-16 13:54:51 +07:00
oskar 99c9baa635 update fireworks pricing 2026-06-16 13:51:35 +07:00
oskar 0e8c0b79f3 update novita pricing 2026-06-16 13:36:24 +07:00
oskar d99ba71ad0 update siliconflow models 2026-06-16 13:03:40 +07:00
oskar 2dce213dbd chore: update stepai prices 2026-06-16 12:17:43 +07:00
oskar 79389f68b7 chore: update last_updated 2026-06-16 11:39:38 +07:00
oskar cd95e58488 update togetherai prices 2026-06-16 11:35:44 +07:00
Max Lang 623ab9c61c chore(ambient): add Kimi K2.7 Code, refresh GLM 5.1
Update the Ambient catalog for two models from the live
api.ambient.xyz/v1/models endpoint:

- add moonshotai/kimi-k2.7-code (base_model: moonshotai/kimi-k2.7-code)
- refresh zai-org/GLM-5.1-FP8 display name

Both inherit canonical metadata via base_model and override only the
fields Ambient's API reports (pricing, capabilities).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 14:25:02 -07:00
Claude ffec078bbb Set output token limit to 32768 for Laguna M.1 and XS.2 2026-06-15 20:30:15 +00:00
Sebass van Boxel 03d0d79709 Update context limit foe XS.2 in kilo 2026-06-15 21:47:34 +02:00
Sebass van Boxel 987800ea87 Update and context limit for laguna m1 in kilo 2026-06-15 21:47:06 +02:00
Sebass van Boxel 555ca498e7 Update last_updated date and context limit for laguna m.1 2026-06-15 21:40:34 +02:00
Sebass van Boxel 37eacd2574 Update last_updated date and context limit for laguna.xs2 2026-06-15 21:39:08 +02:00
hqr 800e7404ef [moonshotai-cn] Add kimi-k2.7-code.toml symlink
Link providers/moonshotai-cn/models/kimi-k2.7-code.toml to providers/moonshotai/models/kimi-k2.7-code.toml.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-15 18:21:31 +02:00
Houtan Bastani f5c3437d74 Reuse base model metadata for Gemini and Mistral provider entries
Replace duplicated provider-agnostic metadata with base_model references for `Gemini 2.5 Flash`, `Gemini 2.5 Pro`, and `mistral-large-2411`.

Follow on to 5a8f9d4, 61a153e and PR #2251
2026-06-15 17:36:18 +02:00
Vladimir Glafirov b4c236a4b3 Remove GitLab Duo Chat Fable 5 model 2026-06-15 15:07:34 +02:00
Niko 6552f7489f add llama-4-maverick and minimax-m3 to cortecs 2026-06-15 15:13:29 +04:00
Saoud Rizwan 28dcf895db chore: remove Claude Fable 5 from OpenRouter 2026-06-14 21:38:52 -07:00
Aiden Cline afbe464bcc [vercel/anthropic] Remove route-dependent budgets 2026-06-14 23:13:29 -04:00
Aiden Cline dbd45193b1 [vercel/anthropic] Complete reasoning controls 2026-06-14 22:26:13 -04:00
Aiden Cline 351541ea2c Merge pull request #2566 from anomalyco/consolidate/frogbot-small-labs-reasoning-options
[frogbot/multiple labs] Add reasoning options
2026-06-14 21:24:59 -05:00
Aiden Cline a1f3591660 [frogbot] Remove options from non-reasoning models 2026-06-14 22:23:55 -04:00
Aiden Cline a3c3e97556 Merge pull request #2568 from anomalyco/consolidate/github-models-small-labs-reasoning-options
[github-models/multiple labs] Add reasoning options
2026-06-14 21:12:34 -05:00
Aiden Cline ff4f61c81f Merge pull request #2570 from anomalyco/consolidate/kilo-small-labs-1-reasoning-options
[kilo/multiple labs 1] Add reasoning options
2026-06-14 21:12:22 -05:00
Aiden Cline 84c75799b8 Merge pull request #2571 from anomalyco/consolidate/kilo-small-labs-2-reasoning-options
[kilo/multiple labs 2] Add reasoning options
2026-06-14 21:12:09 -05:00
Aiden Cline 78cb09383d Merge pull request #2572 from anomalyco/consolidate/kilo-small-labs-3-reasoning-options
[kilo/multiple labs 3] Add reasoning options
2026-06-14 21:11:57 -05:00
Aiden Cline c7601d0f5a Merge pull request #2573 from anomalyco/consolidate/kilo-small-labs-4-reasoning-options
[kilo/multiple labs 4] Add reasoning options
2026-06-14 21:03:41 -05:00
Aiden Cline befaefc783 Merge pull request #2569 from anomalyco/consolidate/jiekou-small-labs-reasoning-options
[jiekou/multiple labs] Add reasoning options
2026-06-14 21:03:11 -05:00
Aiden Cline ca44c698aa Merge pull request #2574 from anomalyco/consolidate/llmgateway-search-xai-reasoning-options
[llmgateway/search and xAI] Add reasoning options
2026-06-14 21:00:49 -05:00
Aiden Cline 69613e89c6 Merge pull request #2577 from anomalyco/consolidate/nano-gpt-small-labs-2-reasoning-options
[nano-gpt/multiple labs 2] Add reasoning options
2026-06-14 21:00:36 -05:00
Aiden Cline 304e56b702 Merge pull request #2575 from anomalyco/consolidate/merge-gateway-small-labs-reasoning-options
[merge-gateway/multiple labs] Add reasoning options
2026-06-14 21:00:20 -05:00
Aiden Cline 1e1224b3a6 Merge pull request #2576 from anomalyco/consolidate/nano-gpt-small-labs-1-reasoning-options
[nano-gpt/multiple labs 1] Add reasoning options
2026-06-14 20:56:09 -05:00
Aiden Cline 39747a0c4c Merge pull request #2580 from anomalyco/consolidate/opencode-small-labs-reasoning-options
[opencode/multiple labs] Add reasoning options
2026-06-14 20:51:33 -05:00
Aiden Cline 3c03d0af77 Merge pull request #2578 from anomalyco/consolidate/nano-gpt-small-labs-3-reasoning-options
[nano-gpt/multiple labs 3] Add reasoning options
2026-06-14 20:50:28 -05:00
Aiden Cline 760f814f20 Merge pull request #2579 from anomalyco/consolidate/nearai-google-qwen-zai-reasoning-options
[nearai/google, Qwen, and Z.AI] Add reasoning options
2026-06-14 20:50:08 -05:00
Aiden Cline bc4b4af78e Merge pull request #2581 from anomalyco/consolidate/poe-small-labs-reasoning-options
[poe/multiple labs] Add reasoning options
2026-06-14 20:50:00 -05:00
Aiden Cline 87e5357f02 [nearai/google] Remove unsupported reasoning controls 2026-06-14 21:27:02 -04:00
Aiden Cline f3a85a45db Merge pull request #2582 from anomalyco/consolidate/siliconflow-small-labs-reasoning-options
[siliconflow/multiple labs] Add reasoning options
2026-06-14 20:23:25 -05:00
Aiden Cline de08ce69dc Merge pull request #2583 from anomalyco/consolidate/vercel-small-labs-reasoning-options
[vercel/multiple labs] Add reasoning options
2026-06-14 20:16:02 -05:00
Aiden Cline e9bea3caa7 Merge pull request #2562 from anomalyco/consolidate/302ai-small-labs-reasoning-options
[302ai/multiple labs] Add reasoning options
2026-06-14 20:15:42 -05:00
Aiden Cline 484ee191e7 [vercel/multiple labs] Add reasoning options 2026-06-14 21:04:26 -04:00
Aiden Cline d25df3464c [siliconflow/multiple labs] Add reasoning options 2026-06-14 21:04:22 -04:00
Aiden Cline 0f1ef5df74 [poe/multiple labs] Add reasoning options 2026-06-14 21:04:17 -04:00
Aiden Cline 0a757f8f3c [opencode/multiple labs] Add reasoning options 2026-06-14 21:04:15 -04:00
Aiden Cline a683e15e05 [nearai/google, Qwen, and Z.AI] Add reasoning options 2026-06-14 21:04:11 -04:00
Aiden Cline c96e3a9a1c [nano-gpt/multiple labs 3] Add reasoning options 2026-06-14 21:04:09 -04:00
Aiden Cline 07c3d34cab [nano-gpt/multiple labs 2] Add reasoning options 2026-06-14 21:04:05 -04:00
Aiden Cline 2f1141725e [nano-gpt/multiple labs 1] Add reasoning options 2026-06-14 21:04:01 -04:00
Aiden Cline aaa7f0225c [merge-gateway/multiple labs] Add reasoning options 2026-06-14 21:03:57 -04:00
Aiden Cline 7964fde548 [llmgateway/search and xAI] Add reasoning options 2026-06-14 21:03:54 -04:00
Aiden Cline a2981ede7a [kilo/multiple labs 4] Add reasoning options 2026-06-14 21:03:52 -04:00
Aiden Cline 4e6b11d780 [kilo/multiple labs 3] Add reasoning options 2026-06-14 21:03:50 -04:00
Aiden Cline 1537342ee8 [kilo/multiple labs 2] Add reasoning options 2026-06-14 21:03:46 -04:00
Aiden Cline f8ac69d04d [kilo/multiple labs 1] Add reasoning options 2026-06-14 21:03:43 -04:00
Aiden Cline 9ed0691a8f [jiekou/multiple labs] Add reasoning options 2026-06-14 21:03:39 -04:00
Aiden Cline a181661717 [github-models/multiple labs] Add reasoning options 2026-06-14 21:03:35 -04:00
Aiden Cline 25e84df306 [github-copilot/google and router] Add reasoning options 2026-06-14 21:03:33 -04:00
Aiden Cline 483483a548 [frogbot/multiple labs] Add reasoning options 2026-06-14 21:03:31 -04:00
Aiden Cline 6b4fc2da6c [cortecs/multiple labs] Add reasoning options 2026-06-14 21:03:28 -04:00
Aiden Cline a6c1721f5f [alibaba/multiple labs] Add reasoning options 2026-06-14 21:03:24 -04:00
Aiden Cline 9178b8d96a [aihubmix/multiple labs] Add reasoning options 2026-06-14 21:03:21 -04:00
Aiden Cline 97e4f410f8 [302ai/multiple labs] Add reasoning options 2026-06-14 21:03:19 -04:00
Aiden Cline 61c9292dd2 Merge pull request #2541 from anomalyco/split/zenmux-minimax-reasoning-options
[zenmux/minimax] Add reasoning options
2026-06-14 19:57:18 -05:00
Aiden Cline 515cbe55e4 Merge pull request #2537 from anomalyco/split/zenmux-baidu-reasoning-options
[zenmux/baidu] Add reasoning options
2026-06-14 19:57:07 -05:00
Aiden Cline 4443540d24 Merge pull request #2538 from anomalyco/split/zenmux-deepseek-reasoning-options
[zenmux/deepseek] Add reasoning options
2026-06-14 19:56:58 -05:00
Aiden Cline 5142d98eac Merge pull request #2536 from anomalyco/split/zenmux-anthropic-reasoning-options
[zenmux/anthropic] Add reasoning options
2026-06-14 19:56:44 -05:00
Aiden Cline 75fc4a0341 Merge pull request #2525 from anomalyco/split/vercel-meituan-reasoning-options
[vercel/meituan] Add reasoning options
2026-06-14 19:56:30 -05:00
Aiden Cline 55234f593d Merge pull request #2535 from anomalyco/split/vercel-zai-reasoning-options
[vercel/zai] Add reasoning options
2026-06-14 19:56:20 -05:00
Aiden Cline d38f09549c Merge pull request #2542 from anomalyco/split/zenmux-moonshotai-reasoning-options
[zenmux/moonshotai] Add reasoning options
2026-06-14 19:56:07 -05:00
Aiden Cline 128a8da199 Merge pull request #2543 from anomalyco/split/zenmux-openai-reasoning-options
[zenmux/openai] Add reasoning options
2026-06-14 19:55:57 -05:00
Aiden Cline 2240450c73 Merge pull request #2556 from anomalyco/automation/sync-models-baseten
chore(sync): update Baseten model catalog
2026-06-14 19:55:06 -05:00
Aiden Cline 1e63debae9 Merge pull request #2560 from zainhas/dev
[Together AI] add kimi k2.7
2026-06-14 19:54:21 -05:00
Aiden Cline 72d8a5773a Merge pull request #2534 from anomalyco/split/vercel-xai-reasoning-options
[vercel/xai] Add reasoning options
2026-06-14 19:54:02 -05:00
Zain Hasan 16d6022afc fix family 2026-06-14 17:29:01 -07:00
Zain Hasan 9478cd312d Merge branch 'dev' into dev 2026-06-14 17:27:27 -07:00
Zain Hasan 5559feb253 add k2.7 to enum 2026-06-14 17:26:27 -07:00
Aiden Cline 389f551f32 Merge pull request #2558 from patrik-kuehl/add-minimax-m3-to-synthetic-provider
feat(providers): add MiniMax M3 to Synthetic provider
2026-06-14 18:53:30 -05:00
Aiden Cline f487c9692f Merge pull request #2561 from jpetrina/add-gemma4-e2b-e4b
feat(models): add Gemma 4 E2B and E4B variants
2026-06-14 18:52:08 -05:00
Aiden Cline 89282134fd Merge pull request #2551 from smakosh/feat/llmgateway-newest-text-models
feat: add LLM Gateway kimi-k2.7-code, nemotron-3-ultra-550b, grok-build-0-1
2026-06-14 18:51:42 -05:00
github-actions[bot] 247ffb8207 chore(sync): update Baseten model catalog 2026-06-14 23:42:27 +00:00
Jakov Petrina cb96a2e701 feat(models): add Gemma 4 E2B and E4B variants
Signed-off-by: Jakov Petrina <jkv.petrina@gmail.com>
2026-06-15 00:03:04 +02:00
Patrik Kühl 0e53645dce chore(models): add MiniMax M3 weights URL 2026-06-15 00:00:31 +02:00
Patrik Kühl 626700e268 chore: provide empty reasoning options 2026-06-14 23:54:59 +02:00
Zain Hasan c5bc7e9e3e [Together AI] add kimi k2.7 2026-06-14 13:40:50 -07:00
smakosh fb2b96a4b7 feat: add reasoning_options to new LLM Gateway models
Addresses review feedback: kimi-k2.7-code and grok-build-0-1 use the
effort (low/medium/high) option matching the kimi/grok gateway models;
nemotron-3-ultra-550b uses a reasoning toggle per its nvidia source.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 18:15:02 +02:00
Patrik Kühl 953b651adc feat(providers): add MiniMax M3 model to Synthetic provider 2026-06-14 14:22:59 +02:00
Patrik Kühl bf1e39cd19 chore(models): mark MiniMax M3 as open-weighted 2026-06-14 14:09:28 +02:00
Aiden Cline ce14787192 Merge pull request #2554 from dsingal0/fix-dsv4-context
fix(baseten): update DeepSeek V4 Pro context length to 1,048,576
2026-06-14 05:05:17 -05:00
Dhruv Singal 401da7398d fix(baseten): remove incorrect context limits from DeepSeek V4 Pro, inherit from base model 2026-06-14 05:20:52 +00:00
Aiden Cline 883951b6ae Merge pull request #2553 from JSap0914/fix/command-r7b-release-date
fix(cohere): correct Command R7B release date to 2024-12-02
2026-06-13 23:53:13 -05:00
JSap0914 0d09d0f2a2 fix(cohere): correct Command R7B release date to 2024-12-02
command-r7b-12-2024 had release_date/last_updated set to 2024-02-27,
which predates the model — its id encodes December 2024, and 02-27 was
evidently copied from the sibling command-r7b-arabic-02-2025 entry.
Cohere's official announcement is dated December 2, 2024.
2026-06-14 13:05:37 +09:00
Aiden Cline d3772f5dfa [siliconflow/zai-org] Remove ineffective GLM budgets 2026-06-13 19:21:07 -05:00
Aiden Cline 3b642e68c1 [zenmux/minimax] Add MiniMax M3 thinking toggle 2026-06-13 19:16:05 -05:00
Aiden Cline f0cfea9185 Merge pull request #2544 from anomalyco/split/zenmux-qwen-reasoning-options
[zenmux/qwen] Add reasoning options
2026-06-13 19:14:40 -05:00
Aiden Cline dc4f59bf13 Merge pull request #2516 from anomalyco/split/vercel-amazon-reasoning-options
[vercel/amazon] Add reasoning options
2026-06-13 19:08:41 -05:00
Aiden Cline 101a1c3771 Merge pull request #2539 from anomalyco/split/zenmux-google-reasoning-options
[zenmux/google] Add reasoning options
2026-06-13 19:06:06 -05:00
Aiden Cline 9344d01b8b Merge pull request #2540 from anomalyco/split/zenmux-inclusionai-reasoning-options
[zenmux/inclusionai] Add reasoning options
2026-06-13 19:05:53 -05:00
Aiden Cline b096a9f0d2 Merge pull request #2518 from anomalyco/split/vercel-arcee-ai-reasoning-options
[vercel/arcee-ai] Add reasoning options
2026-06-13 19:05:45 -05:00
Aiden Cline 1bf16b9774 Merge pull request #2425 from anomalyco/split/kilo-stepfun-reasoning-options
[kilo/stepfun] Add reasoning options
2026-06-13 19:05:35 -05:00
Aiden Cline b303848e33 Merge pull request #2546 from anomalyco/split/zenmux-stepfun-reasoning-options
[zenmux/stepfun] Add reasoning options
2026-06-13 19:04:30 -05:00
Aiden Cline 0440528e10 Merge pull request #2549 from anomalyco/split/zenmux-x-ai-reasoning-options
[zenmux/x-ai] Add reasoning options
2026-06-13 19:04:16 -05:00
Aiden Cline 3bbab9fd50 Merge pull request #2545 from anomalyco/split/zenmux-sapiens-ai-reasoning-options
[zenmux/sapiens-ai] Add reasoning options
2026-06-13 19:01:50 -05:00
Aiden Cline 78f0824557 [zenmux/x-ai] Correct Grok reasoning controls 2026-06-13 19:01:50 -05:00
Aiden Cline 15a29aabfc Merge pull request #2523 from anomalyco/split/vercel-interfaze-reasoning-options
[vercel/interfaze] Add reasoning options
2026-06-13 19:01:41 -05:00
Aiden Cline 5dbbd02f35 Merge pull request #2531 from anomalyco/split/vercel-openai-reasoning-options-part-2
[vercel/openai part 2] Add reasoning options
2026-06-13 19:01:29 -05:00
Aiden Cline a34573e367 Merge pull request #2530 from anomalyco/split/vercel-openai-reasoning-options-part-1
[vercel/openai part 1] Add reasoning options
2026-06-13 19:01:16 -05:00
Aiden Cline 9f6f058562 Merge pull request #2547 from anomalyco/split/zenmux-tencent-reasoning-options
[zenmux/tencent] Add reasoning options
2026-06-13 19:00:54 -05:00
Aiden Cline 8ed57cde03 Merge pull request #2548 from anomalyco/split/zenmux-volcengine-reasoning-options
[zenmux/volcengine] Add reasoning options
2026-06-13 19:00:46 -05:00
Aiden Cline 0383342620 Merge pull request #2550 from anomalyco/split/zenmux-z-ai-reasoning-options
[zenmux/z-ai] Add reasoning options
2026-06-13 19:00:09 -05:00
Aiden Cline 4c645691d7 Merge pull request #2552 from anomalyco/automation/sync-models-openrouter
chore(sync): update OpenRouter model catalog
2026-06-13 18:58:59 -05:00
Aiden Cline be9e01d10c Merge pull request #2288 from anomalyco/split/opencode-alibaba-reasoning-options
[opencode/alibaba] Add reasoning options
2026-06-13 18:58:46 -05:00
github-actions[bot] ad68e2b348 chore(sync): update OpenRouter model catalog 2026-06-13 23:40:33 +00:00
smakosh 57940ad416 feat: add LLM Gateway kimi-k2.7-code, nemotron-3-ultra-550b, grok-build-0-1
Newest text models from the LLM Gateway catalog, using the base_model
structure to inherit from the canonical model registry with gateway-specific
cost overrides.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 23:02:24 +01:00
Aiden Cline 3f307a7436 [alibaba/alibaba part 3] Add reasoning options 2026-06-13 16:11:31 -05:00
Aiden Cline e3f3bcff46 [alibaba/alibaba part 2] Add reasoning options 2026-06-13 16:11:29 -05:00
Aiden Cline 7cfc9f18e7 [alibaba/alibaba part 1] Add reasoning options 2026-06-13 16:11:27 -05:00
Aiden Cline 5e8a020a32 [siliconflow/zai-org] Add reasoning options 2026-06-13 16:11:25 -05:00
Aiden Cline 7a9e515f24 [siliconflow/THUDM] Add reasoning options 2026-06-13 16:11:23 -05:00
Aiden Cline 3f0ba493d0 [siliconflow/tencent] Add reasoning options 2026-06-13 16:11:21 -05:00
Aiden Cline 783d71e92c [siliconflow/Qwen part 3] Add reasoning options 2026-06-13 16:11:17 -05:00
Aiden Cline b40e95dfea [siliconflow/Qwen part 2] Add reasoning options 2026-06-13 16:11:15 -05:00
Aiden Cline c2b3424f1d [siliconflow/Qwen part 1] Add reasoning options 2026-06-13 16:11:13 -05:00
Aiden Cline 46e203cc96 [siliconflow/Pro] Add reasoning options 2026-06-13 16:11:11 -05:00
Aiden Cline f8336b31db [siliconflow/moonshotai] Add reasoning options 2026-06-13 16:11:03 -05:00
Aiden Cline 6b364bf1cd [siliconflow/deepseek-ai] Add reasoning options 2026-06-13 16:10:53 -05:00
Aiden Cline b7c10a682b [nano-gpt/zai-org part 2] Add reasoning options 2026-06-13 16:09:20 -05:00
Aiden Cline 0bb286bb3e [nano-gpt/zai-org part 1] Add reasoning options 2026-06-13 16:09:18 -05:00
Aiden Cline a4f09d424c [nano-gpt/z-ai] Add reasoning options 2026-06-13 16:09:16 -05:00
Aiden Cline 383a36f646 [nano-gpt/x-ai] Add reasoning options 2026-06-13 16:09:14 -05:00
Aiden Cline 382eb9052a [nano-gpt/TEE] Add reasoning options 2026-06-13 16:09:12 -05:00
Aiden Cline e0f7aca49d [nano-gpt/qwen] Add reasoning options 2026-06-13 16:09:05 -05:00
Aiden Cline 956756e6ea [nano-gpt/openai part 2] Add reasoning options 2026-06-13 16:08:55 -05:00
Aiden Cline d761a8bd68 [nano-gpt/openai part 1] Add reasoning options 2026-06-13 16:08:53 -05:00
Aiden Cline 7329bb0d3b [nano-gpt/nanogpt] Add reasoning options 2026-06-13 16:08:48 -05:00
Aiden Cline e6305607a4 [nano-gpt/moonshotai] Add reasoning options 2026-06-13 16:08:44 -05:00
Aiden Cline 3207c819e7 [nano-gpt/minimax] Add reasoning options 2026-06-13 16:08:37 -05:00
Aiden Cline 5f7d688a57 [nano-gpt/google part 3] Add reasoning options 2026-06-13 16:08:27 -05:00
Aiden Cline eedd467c42 [nano-gpt/google part 2] Add reasoning options 2026-06-13 16:08:25 -05:00
Aiden Cline d061bfe4f7 [nano-gpt/google part 1] Add reasoning options 2026-06-13 16:08:23 -05:00
Aiden Cline 1cfe13326b [nano-gpt/deepseek] Add reasoning options 2026-06-13 16:08:20 -05:00
Aiden Cline 40612b1b6a [nano-gpt/anthropic part 2] Add reasoning options 2026-06-13 16:08:10 -05:00
Aiden Cline 3f5ad9143a [nano-gpt/anthropic part 1] Add reasoning options 2026-06-13 16:08:08 -05:00
Aiden Cline 9ec5fd8a0f [nano-gpt/alibaba part 3] Add reasoning options 2026-06-13 16:08:04 -05:00
Aiden Cline 25767b9642 [nano-gpt/alibaba part 2] Add reasoning options 2026-06-13 16:08:02 -05:00
Aiden Cline b008427ff1 [nano-gpt/alibaba part 1] Add reasoning options 2026-06-13 16:08:00 -05:00
Aiden Cline c0d3207da7 [zenmux/z-ai] Add reasoning options 2026-06-13 16:07:58 -05:00
Aiden Cline e2fbc080ca [zenmux/x-ai] Add reasoning options 2026-06-13 16:07:56 -05:00
Aiden Cline 23563d1b2d [zenmux/volcengine] Add reasoning options 2026-06-13 16:07:55 -05:00
Aiden Cline ce4594421c [zenmux/tencent] Add reasoning options 2026-06-13 16:07:53 -05:00
Aiden Cline 50e3a7d946 [zenmux/stepfun] Add reasoning options 2026-06-13 16:07:51 -05:00
Aiden Cline bdf25065cf [zenmux/sapiens-ai] Add reasoning options 2026-06-13 16:07:49 -05:00
Aiden Cline 9f82b646a8 [zenmux/qwen] Add reasoning options 2026-06-13 16:07:47 -05:00
Aiden Cline 67ba921b70 [zenmux/openai] Add reasoning options 2026-06-13 16:07:45 -05:00
Aiden Cline 937948ac05 [zenmux/moonshotai] Add reasoning options 2026-06-13 16:07:43 -05:00
Aiden Cline b4ad1b5e7c [zenmux/minimax] Add reasoning options 2026-06-13 16:07:41 -05:00
Aiden Cline 8855f33982 [zenmux/inclusionai] Add reasoning options 2026-06-13 16:07:39 -05:00
Aiden Cline d580d186f4 [zenmux/google] Add reasoning options 2026-06-13 16:07:37 -05:00
Aiden Cline 338a3ba4cc [zenmux/deepseek] Add reasoning options 2026-06-13 16:07:35 -05:00
Aiden Cline aa29468222 [zenmux/baidu] Add reasoning options 2026-06-13 16:07:34 -05:00
Aiden Cline 45f0268363 [zenmux/anthropic] Add reasoning options 2026-06-13 16:07:32 -05:00
Aiden Cline cfa3c1d9d7 [kilo/z-ai] Add reasoning options 2026-06-13 16:07:30 -05:00
Aiden Cline 3e235de615 [kilo/x-ai] Add reasoning options 2026-06-13 16:06:52 -05:00
Aiden Cline 6eb4986851 [kilo/stepfun] Add reasoning options 2026-06-13 16:06:44 -05:00
Aiden Cline 25ca7c8e14 [kilo/qwen part 2] Add reasoning options 2026-06-13 16:06:39 -05:00
Aiden Cline 22440cd83a [kilo/qwen part 1] Add reasoning options 2026-06-13 16:06:37 -05:00
Aiden Cline cc31cf788c [kilo/openai part 2] Add reasoning options 2026-06-13 16:06:24 -05:00
Aiden Cline 672058ba1a [kilo/openai part 1] Add reasoning options 2026-06-13 16:06:22 -05:00
Aiden Cline 5aa6899313 [kilo/nvidia] Add reasoning options 2026-06-13 16:06:20 -05:00
Aiden Cline 9ac10794a5 [kilo/minimax] Add reasoning options 2026-06-13 16:06:13 -05:00
Aiden Cline 80dd1aee62 [kilo/kilo-auto] Add reasoning options 2026-06-13 16:06:11 -05:00
Aiden Cline f8e9ad06cd [kilo/google part 1] Add reasoning options 2026-06-13 16:06:04 -05:00
Aiden Cline a85084209b [kilo/deepseek] Add reasoning options 2026-06-13 16:06:02 -05:00
Aiden Cline b384d4623f [kilo/bytedance-seed] Add reasoning options 2026-06-13 16:05:58 -05:00
Aiden Cline 1e2398346b [kilo/baidu] Add reasoning options 2026-06-13 16:05:56 -05:00
Aiden Cline 0f2c06fa8e [kilo/anthropic] Add reasoning options 2026-06-13 16:05:52 -05:00
Aiden Cline be0b5a7215 [llmgateway/zhipuai] Add reasoning options 2026-06-13 16:05:34 -05:00
Aiden Cline e17bff4b7a [llmgateway/openai part 2] Add reasoning options 2026-06-13 16:05:27 -05:00
Aiden Cline 1d337ee862 [llmgateway/openai part 1] Add reasoning options 2026-06-13 16:05:25 -05:00
Aiden Cline 918d43cc70 [llmgateway/moonshotai] Add reasoning options 2026-06-13 16:05:23 -05:00
Aiden Cline 1e3b74afa4 [llmgateway/minimax] Add reasoning options 2026-06-13 16:05:21 -05:00
Aiden Cline 2128959edc [llmgateway/google] Add reasoning options 2026-06-13 16:05:20 -05:00
Aiden Cline 63afd5ba18 [llmgateway/deepseek] Add reasoning options 2026-06-13 16:05:18 -05:00
Aiden Cline a9e100123b [llmgateway/bytedance] Add reasoning options 2026-06-13 16:05:16 -05:00
Aiden Cline c39f2b1e1d [llmgateway/anthropic] Add reasoning options 2026-06-13 16:05:14 -05:00
Aiden Cline f0da17f5d0 [llmgateway/alibaba part 1] Add reasoning options 2026-06-13 16:05:10 -05:00
Aiden Cline 407011e84a [poe/xai] Add reasoning options 2026-06-13 16:05:08 -05:00
Aiden Cline 4b7c3df633 [poe/openai part 2] Add reasoning options 2026-06-13 16:05:04 -05:00
Aiden Cline 3fc8b5b8ed [poe/openai part 1] Add reasoning options 2026-06-13 16:05:02 -05:00
Aiden Cline 869f496e71 [poe/novita] Add reasoning options 2026-06-13 16:05:00 -05:00
Aiden Cline 8807dbded1 [poe/google] Add reasoning options 2026-06-13 16:04:58 -05:00
Aiden Cline a565aef9f8 [poe/anthropic] Add reasoning options 2026-06-13 16:04:53 -05:00
Aiden Cline dd0988cde0 [vercel/zai] Add reasoning options 2026-06-13 16:04:50 -05:00
Aiden Cline 631d348d75 [vercel/xai] Add reasoning options 2026-06-13 16:04:48 -05:00
Aiden Cline 3eb0985188 [vercel/openai part 2] Add reasoning options 2026-06-13 16:04:43 -05:00
Aiden Cline b69a4fc71e [vercel/openai part 1] Add reasoning options 2026-06-13 16:04:41 -05:00
Aiden Cline cbb47c5fb7 [vercel/nvidia] Add reasoning options 2026-06-13 16:04:39 -05:00
Aiden Cline 57319b2086 [vercel/minimax] Add reasoning options 2026-06-13 16:04:33 -05:00
Aiden Cline 2eef2259c5 [vercel/meituan] Add reasoning options 2026-06-13 16:04:31 -05:00
Aiden Cline debfd6339c [vercel/interfaze] Add reasoning options 2026-06-13 16:04:27 -05:00
Aiden Cline d278fb8d19 [vercel/google] Add reasoning options 2026-06-13 16:04:24 -05:00
Aiden Cline 5c1c24427b [vercel/deepseek] Add reasoning options 2026-06-13 16:04:22 -05:00
Aiden Cline 6543300a5d [vercel/arcee-ai] Add reasoning options 2026-06-13 16:04:18 -05:00
Aiden Cline cd16282c7f [vercel/anthropic] Add reasoning options 2026-06-13 16:04:16 -05:00
Aiden Cline e6b575adf1 [vercel/amazon] Add reasoning options 2026-06-13 16:04:14 -05:00
Aiden Cline c20a4c92ec [vercel/alibaba part 1] Add reasoning options 2026-06-13 16:04:10 -05:00
Aiden Cline 6bb4d365a0 [aihubmix/zhipuai] Add reasoning options 2026-06-13 16:04:08 -05:00
Aiden Cline 7695ea6832 [aihubmix/openai] Add reasoning options 2026-06-13 16:03:46 -05:00
Aiden Cline 6265a214cc [aihubmix/minimax] Add reasoning options 2026-06-13 16:03:42 -05:00
Aiden Cline 20879cdeb6 [aihubmix/google] Add reasoning options 2026-06-13 16:03:40 -05:00
Aiden Cline 87cd09664a [aihubmix/deepseek] Add reasoning options 2026-06-13 16:03:38 -05:00
Aiden Cline b3cb0ac936 [aihubmix/bytedance] Add reasoning options 2026-06-13 16:03:36 -05:00
Aiden Cline b724b64c7a [aihubmix/anthropic] Add reasoning options 2026-06-13 16:03:34 -05:00
Aiden Cline dacf651139 [cortecs/zhipuai] Add reasoning options 2026-06-13 16:03:30 -05:00
Aiden Cline fe4c790791 [cortecs/minimax] Add reasoning options 2026-06-13 16:03:17 -05:00
Aiden Cline b2122bbe6b [cortecs/deepseek] Add reasoning options 2026-06-13 16:03:13 -05:00
Aiden Cline 3803f815e3 [cortecs/anthropic] Add reasoning options 2026-06-13 16:03:11 -05:00
Aiden Cline f9454367a3 [cortecs/alibaba] Add reasoning options 2026-06-13 16:03:09 -05:00
Aiden Cline 9e7530276b [302ai/zhipuai] Add reasoning options 2026-06-13 16:03:07 -05:00
Aiden Cline 3df25fdb08 [302ai/xai] Add reasoning options 2026-06-13 16:03:05 -05:00
Aiden Cline 1a5742aec4 [302ai/openai] Add reasoning options 2026-06-13 16:03:03 -05:00
Aiden Cline 399a2bc904 [302ai/anthropic part 1] Add reasoning options 2026-06-13 16:02:53 -05:00
Aiden Cline f7f2468510 [frogbot/xai] Add reasoning options 2026-06-13 16:02:49 -05:00
Aiden Cline c8b3960515 [frogbot/openai] Add reasoning options 2026-06-13 16:02:47 -05:00
Aiden Cline 7c1e3c3095 [frogbot/google] Add reasoning options 2026-06-13 16:02:41 -05:00
Aiden Cline 636ad4c722 [frogbot/anthropic] Add reasoning options 2026-06-13 16:02:37 -05:00
Aiden Cline 7302d08ee9 [databricks/openai] Add reasoning options 2026-06-13 16:02:33 -05:00
Aiden Cline f45fca5eb5 [databricks/google] Add reasoning options 2026-06-13 16:02:32 -05:00
Aiden Cline 8506d5831f [databricks/anthropic] Add reasoning options 2026-06-13 16:02:30 -05:00
Aiden Cline 783905cb1b [github-copilot/openai] Add reasoning options 2026-06-13 16:02:28 -05:00
Aiden Cline a88a77e911 [github-copilot/anthropic] Add reasoning options 2026-06-13 16:02:21 -05:00
Aiden Cline ef832bcf58 [github-models/openai] Add reasoning options 2026-06-13 16:02:17 -05:00
Aiden Cline fb6254f9ce [github-models/mistral-ai] Add reasoning options 2026-06-13 16:02:14 -05:00
Aiden Cline 551c76d24c [github-models/microsoft] Add reasoning options 2026-06-13 16:02:12 -05:00
Aiden Cline bc0206c260 [github-models/meta] Add reasoning options 2026-06-13 16:02:09 -05:00
Aiden Cline 1645737a0a [github-models/cohere] Add reasoning options 2026-06-13 16:02:03 -05:00
Aiden Cline aa9c0ce755 [jiekou/zai-org] Add reasoning options 2026-06-13 16:01:59 -05:00
Aiden Cline b285f34f7c [jiekou/qwen] Add reasoning options 2026-06-13 16:01:55 -05:00
Aiden Cline 3ebb5e044c [jiekou/openai] Add reasoning options 2026-06-13 16:01:53 -05:00
Aiden Cline 67faece29a [jiekou/google] Add reasoning options 2026-06-13 16:01:46 -05:00
Aiden Cline 1d4acb915f [nearai/openai] Add reasoning options 2026-06-13 16:01:34 -05:00
Aiden Cline 164213931f [nearai/anthropic] Add reasoning options 2026-06-13 16:01:30 -05:00
Aiden Cline a87fcc19e6 [merge-gateway/zai] Add reasoning options 2026-06-13 16:01:28 -05:00
Aiden Cline d8e9c71612 [merge-gateway/openai part 1] Add reasoning options 2026-06-13 16:01:23 -05:00
Aiden Cline d6e9d5f7b6 [merge-gateway/minimax] Add reasoning options 2026-06-13 16:01:19 -05:00
Aiden Cline 8a847d1556 [merge-gateway/google] Add reasoning options 2026-06-13 16:01:17 -05:00
Aiden Cline aa9383e4ff [merge-gateway/anthropic] Add reasoning options 2026-06-13 16:01:13 -05:00
Aiden Cline 60bff48e95 [opencode/zhipuai] Add reasoning options 2026-06-13 16:01:11 -05:00
Aiden Cline b485685790 [opencode/openai part 1] Add reasoning options 2026-06-13 16:01:01 -05:00
Aiden Cline 799de585c4 [opencode/moonshotai] Add reasoning options 2026-06-13 16:00:57 -05:00
Aiden Cline 57a8c746e5 [opencode/minimax] Add reasoning options 2026-06-13 16:00:55 -05:00
Aiden Cline 5c9625bb24 [opencode/google] Add reasoning options 2026-06-13 16:00:51 -05:00
Aiden Cline 3e3918929c [opencode/anthropic] Add reasoning options 2026-06-13 16:00:47 -05:00
Aiden Cline 4d9a365f36 [opencode/alibaba] Add reasoning options 2026-06-13 16:00:45 -05:00
Aiden Cline 4dff8372f3 Merge pull request #2287 from anomalyco/automation/sync-models-venice
chore(sync): update Venice model catalog
2026-06-13 15:59:36 -05:00
github-actions[bot] e05c2a09a7 chore(sync): update Venice model catalog 2026-06-13 20:43:48 +00:00
2640 changed files with 8817 additions and 6570 deletions
+3 -3
View File
@@ -20,8 +20,8 @@ jobs:
uses: actions/checkout@v4
- name: Run opencode
uses: sst/opencode/github@latest
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
model: opencode/gpt-5.5
+2
View File
@@ -64,8 +64,10 @@ jobs:
run: bun models:sync ${{ matrix.provider }}
env:
BASETEN_API_KEY: ${{ secrets.BASETEN_API_KEY }}
HF_TOKEN: ${{ secrets.HF_TOKEN }}
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }}
LLMGATEWAY_API_KEY: ${{ secrets.LLMGATEWAY_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }}
+1 -3
View File
@@ -5,6 +5,4 @@ dist
.DS_Store
.sync/
node_modules
data/tokenspeed-monitor.sqlite
data/tokenspeed-monitor.sqlite-shm
data/tokenspeed-monitor.sqlite-wal
.opencode/package-lock.json
-380
View File
@@ -1,380 +0,0 @@
{
"name": ".opencode",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@opencode-ai/plugin": "1.15.13"
}
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz",
"integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz",
"integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz",
"integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz",
"integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz",
"integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz",
"integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@opencode-ai/plugin": {
"version": "1.15.13",
"resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.15.13.tgz",
"integrity": "sha512-NFwZGhmxIPijtfz9swPJXDmhOpq4UWP8WjEE7GEMr7FwtJrK/hv6v36nFimed5+OKk+pQCrTJn/vhRW7Io72IA==",
"license": "MIT",
"dependencies": {
"@opencode-ai/sdk": "1.15.13",
"effect": "4.0.0-beta.66",
"zod": "4.1.8"
},
"peerDependencies": {
"@opentui/core": ">=0.2.16",
"@opentui/keymap": ">=0.2.16",
"@opentui/solid": ">=0.2.16"
},
"peerDependenciesMeta": {
"@opentui/core": {
"optional": true
},
"@opentui/keymap": {
"optional": true
},
"@opentui/solid": {
"optional": true
}
}
},
"node_modules/@opencode-ai/sdk": {
"version": "1.15.13",
"resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.15.13.tgz",
"integrity": "sha512-4TwojIoQ8EG6/mVBuUVYZXiFcwNmiiytEnjnvyuvSJjGwFIlw2YIBFxtSVC3FbwwbwHT63teh1RHiQUUC4U5xw==",
"license": "MIT",
"dependencies": {
"cross-spawn": "7.0.6"
}
},
"node_modules/@standard-schema/spec": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"optional": true,
"engines": {
"node": ">=8"
}
},
"node_modules/effect": {
"version": "4.0.0-beta.66",
"resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.66.tgz",
"integrity": "sha512-4arEr62cziFa8BBVDUwJCJJmaVepXf/kRg7KtC0h8+bufngscrHbwWFhr9c+HonwOF+31U3iD3xUJmw9KzX7Dw==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.1.0",
"fast-check": "^4.6.0",
"find-my-way-ts": "^0.1.6",
"ini": "^6.0.0",
"kubernetes-types": "^1.30.0",
"msgpackr": "^1.11.9",
"multipasta": "^0.2.7",
"toml": "^4.1.1",
"uuid": "^13.0.0",
"yaml": "^2.8.3"
}
},
"node_modules/fast-check": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.8.0.tgz",
"integrity": "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT",
"dependencies": {
"pure-rand": "^8.0.0"
},
"engines": {
"node": ">=12.17.0"
}
},
"node_modules/find-my-way-ts": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz",
"integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==",
"license": "MIT"
},
"node_modules/ini": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz",
"integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==",
"license": "ISC",
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"license": "ISC"
},
"node_modules/kubernetes-types": {
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz",
"integrity": "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==",
"license": "Apache-2.0"
},
"node_modules/msgpackr": {
"version": "1.11.12",
"resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.12.tgz",
"integrity": "sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==",
"license": "MIT",
"optionalDependencies": {
"msgpackr-extract": "^3.0.2"
}
},
"node_modules/msgpackr-extract": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz",
"integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"dependencies": {
"node-gyp-build-optional-packages": "5.2.2"
},
"bin": {
"download-msgpackr-prebuilds": "bin/download-prebuilds.js"
},
"optionalDependencies": {
"@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4",
"@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4",
"@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4",
"@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4",
"@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4",
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4"
}
},
"node_modules/multipasta": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz",
"integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==",
"license": "MIT"
},
"node_modules/node-gyp-build-optional-packages": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
"integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
"license": "MIT",
"optional": true,
"dependencies": {
"detect-libc": "^2.0.1"
},
"bin": {
"node-gyp-build-optional-packages": "bin.js",
"node-gyp-build-optional-packages-optional": "optional.js",
"node-gyp-build-optional-packages-test": "build-test.js"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/pure-rand": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz",
"integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/toml": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/toml/-/toml-4.1.1.tgz",
"integrity": "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==",
"license": "MIT",
"engines": {
"node": ">=20"
}
},
"node_modules/uuid": {
"version": "13.0.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz",
"integrity": "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist-node/bin/uuid"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/yaml": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
"integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14.6"
},
"funding": {
"url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/zod": {
"version": "4.1.8",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
}
}
}
@@ -0,0 +1,164 @@
---
name: audit-reasoning-options
description: Audit or write models.dev reasoning_options in provider TOML files and reasoning-option PRs. Use when verifying toggle, effort, budget_tokens, provider reasoning controls, or citations.
---
# Audit Reasoning Options
Use this workflow to add or review `reasoning_options` for a specific provider. Treat these fields as provider capabilities, not provider-agnostic model facts.
Provider capability means the inference service's accepted HTTP request surface. It does not mean the controls exposed by the repository's configured npm package, a preferred SDK, or a typed client wrapper.
## Available Options
The schema in `packages/core/src/schema.ts` supports:
```toml
[[reasoning_options]]
type = "toggle"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[[reasoning_options]]
type = "budget_tokens"
min = 1_024
max = 32_000
```
- `toggle`: The provider offers an explicit way to switch reasoning on and off for the same model ID.
- `effort`: The provider accepts one or more discrete effort values. Schema values are `null`, `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, and `default`.
- `budget_tokens`: The provider accepts a numeric reasoning-token budget. `min` and `max` are optional and must only be included when verified.
- `reasoning_options = []`: The model reasons, but no user-selectable control was verified through this provider.
- Omitted `reasoning_options`: No provider-specific claim has been authored. Do not treat omission as equivalent to an audited empty list.
An option describes a control exposed to a caller. Do not add an option merely because a model reasons internally or another provider exposes that control.
## Evidence Standard
Use evidence in this order:
1. The provider's current API reference or model documentation.
2. The provider's raw OpenAPI schema, compatibility endpoint documentation, model endpoint metadata, or playground request payload.
3. A reproducible request against the provider API, including a negative control with an invalid value where practical.
4. The provider's official SDK source, but only as positive evidence for requests it emits.
5. The upstream model developer's documentation.
6. High-quality secondary sources only as supporting context.
Provider documentation proves what the provider accepts. Upstream documentation proves what the model can support, but cannot by itself prove that a gateway forwards or exposes the control.
An SDK can prove support when it emits a field. An SDK's omission, type restriction, or missing convenience option does not prove the inference API rejects that field. Before removing a control because an SDK cannot express it, inspect raw HTTP docs, compatibility base URLs, passthrough guarantees, migration guides, and direct API behavior.
Prefer versioned or model-specific documentation over generic examples. Record the access date when a page is mutable or unversioned.
## Audit Workflow
1. Read the provider configuration to identify the API base URL and protocol. Record the SDK only as one possible client.
2. Inspect the PR diff and list every changed model with its exact proposed options.
3. Group models by API family or request adapter, not only by model developer.
4. Locate provider documentation for reasoning request fields and model-specific restrictions.
5. Check every raw compatibility endpoint the inference provider advertises, such as OpenAI-, Anthropic-, or provider-compatible base URLs. Existing calls working unchanged is positive evidence that native reasoning fields are accepted.
6. Cross-check upstream model documentation for supported values and ranges after establishing provider passthrough or translation.
7. Test the provider API when credentials are already available and documentation is incomplete. Never print credentials.
8. Compare each TOML claim independently: toggle, each effort value, budget support, minimum, and maximum.
9. Remove any claim that lacks inference-provider evidence. Do not remove it merely because one SDK lacks a type or helper.
10. Run `bun validate` and `git diff --check`.
11. Update the PR body with citations, request-field details, audit conclusions, and validation commands.
## Toggle Verification
Only add `toggle` if all of these are true:
- The same provider model ID can run with reasoning enabled and disabled.
- The caller controls the state through a documented or reproduced request.
- The exact field and values are known.
Examples of possible controls include `thinking.type = "enabled" | "disabled"`, `enable_thinking = true | false`, a documented `reasoning` object, or a provider-defined prompt switch such as `/think` and `/no_think`.
The following do not prove a toggle:
- Separate thinking and non-thinking model IDs.
- Omitting a reasoning budget when omission selects an automatic budget.
- Setting effort to `low` unless the provider says it disables reasoning.
- A model card saying the model is hybrid without provider request documentation.
- A provider UI switch when its API payload cannot be identified.
For every proposed toggle, write this sentence before accepting it:
> `<provider model ID>` toggles reasoning with `<request path>` set to `<enabled value>` or `<disabled value>`.
If that sentence cannot be completed and cited or reproduced, do not claim `toggle`.
## Effort Verification
Verify every value separately. Do not copy the schema's full enum into a model.
- For an OpenAI-compatible API, `low`, `medium`, and `high` are a useful investigation baseline, not proof.
- Require explicit evidence for `null`, `none`, `minimal`, `xhigh`, `max`, and `default`.
- Check model-specific differences. A generic gateway enum may be rejected or ignored by some routed models.
- Distinguish accepted values from meaningful values. If the gateway silently ignores a field, it is not a supported control.
- Preserve JSON `null` as TOML `null`, not the string `"null"`, when evidence requires a null value.
When practical, send one valid request per claimed value and one invalid value. A structured `400` for the invalid value makes silent field dropping less likely.
## Budget Verification
`budget_tokens` is an abstract models.dev capability; providers may spell it `reasoning.max_tokens`, `thinking.budget_tokens`, `thinkingBudget`, or another field.
- Cite the provider's actual request path.
- Verify that the field controls reasoning tokens rather than total output tokens.
- Do not infer `max` from `limit.output`, context length, or an upstream provider's limit.
- Do not infer a provider minimum from an SDK default.
- Omit unverified bounds while retaining verified budget support.
- Check whether zero or a negative sentinel disables reasoning. If so, verify whether this also proves `toggle` for that model.
- Check constraints relating budget to `max_tokens` or total output.
## API Testing
Use existing credentials only when permitted and necessary. Keep secrets out of commands, logs, files, PR bodies, and chat output.
For each control, prefer this matrix:
| Request | Expected evidence |
| --- | --- |
| No reasoning field | Establishes default behavior |
| Each claimed valid value | Successful response or documented acceptance |
| Explicit disabled value | Proves toggle-off behavior |
| One invalid value | Structured rejection rather than silent dropping |
| Boundary and adjacent value | Supports a claimed minimum or maximum |
Acceptance alone is weak when an OpenAI-compatible gateway ignores unknown fields. Inspect returned metadata, reasoning content, usage fields, or error behavior where available.
## Citations
Put citations in the PR body, not TOML comments. TOML model files should remain data-only unless the repository establishes another convention.
Use direct links to the narrowest authoritative section. For each link, state exactly what it proves:
```markdown
## Evidence
- [Provider reasoning API](https://example.com/api/reasoning) documents
`reasoning_effort` values `low`, `medium`, and `high`.
- [Provider model page](https://example.com/models/foo) documents that
`thinking.type = "disabled"` turns reasoning off for `foo`.
- [Upstream model documentation](https://example.com/upstream/foo) confirms
the model-native budget range; provider requests at both boundaries succeeded.
```
Do not cite a search-results page, an AI-generated summary, or a generic upstream page for a provider-specific claim. If evidence comes from authenticated endpoint metadata or testing, describe the endpoint, date, request field, result, and negative control without including credentials or sensitive response data.
## PR Audit Output
For each audited PR, report:
- Models and proposed options.
- Verdict for every option: verified, corrected, or removed.
- Exact toggle mechanism, when applicable.
- Provider-level citations and what each proves.
- Upstream citations used only for model-specific constraints.
- Tests performed and their limitations.
- Final validation result.
If documentation is ambiguous, state the ambiguity and use the least permissive metadata supported by evidence.
@@ -1,7 +1,7 @@
name = "Qwen3 32B FP8"
name = "Qwen3.5 9B"
family = "qwen"
release_date = "2025-04-28"
last_updated = "2025-04-28"
release_date = "2026-02-23"
last_updated = "2026-02-23"
attachment = false
reasoning = true
temperature = true
@@ -9,14 +9,14 @@ tool_call = true
structured_output = true
open_weights = true
[cost]
input = 0.10
output = 0.10
[limit]
context = 131_072
output = 8_192
context = 262_144
output = 65_536
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/Qwen/Qwen3.5-9B"
+2 -2
View File
@@ -1,7 +1,7 @@
name = "Command R7B"
family = "command-r"
release_date = "2024-02-27"
last_updated = "2024-02-27"
release_date = "2024-12-02"
last_updated = "2024-12-02"
attachment = false
reasoning = false
temperature = true
+22
View File
@@ -0,0 +1,22 @@
name = "Gemma 4 E2B IT"
family = "gemma"
release_date = "2026-04-02"
last_updated = "2026-04-02"
attachment = true
reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = true
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text", "image", "audio"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/google/gemma-4-E2B-it"
+22
View File
@@ -0,0 +1,22 @@
name = "Gemma 4 E4B IT"
family = "gemma"
release_date = "2026-04-02"
last_updated = "2026-04-02"
attachment = true
reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = true
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text", "image", "audio"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/google/gemma-4-E4B-it"
+5 -1
View File
@@ -6,7 +6,7 @@ attachment = true
reasoning = true
temperature = true
tool_call = true
open_weights = false
open_weights = true
[limit]
context = 512_000
@@ -15,3 +15,7 @@ output = 128_000
[modalities]
input = ["text", "image", "video"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/MiniMaxAI/MiniMax-M3"
@@ -0,0 +1,23 @@
name = "Kimi K2.7 Code Highspeed"
family = "kimi-k2"
release_date = "2026-06-12"
last_updated = "2026-06-12"
attachment = true
reasoning = true
temperature = false
tool_call = true
structured_output = true
knowledge = "2025-01"
open_weights = true
[limit]
context = 262_144
output = 262_144
[modalities]
input = ["text", "image", "video"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/moonshotai/Kimi-K2.7-Code"
+17
View File
@@ -0,0 +1,17 @@
name = "GPT-Image-1.5"
family = "gpt-image"
release_date = "2025-11-25"
last_updated = "2025-11-25"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 0
output = 0
[modalities]
input = ["text", "image"]
output = ["text", "image"]
+17
View File
@@ -0,0 +1,17 @@
name = "GPT-Image-1"
family = "gpt-image"
release_date = "2025-04-24"
last_updated = "2025-04-24"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 0
output = 0
[modalities]
input = ["text", "image"]
output = ["image"]
+17
View File
@@ -0,0 +1,17 @@
name = "GPT-Image-2"
family = "gpt-image"
release_date = "2026-04-21"
last_updated = "2026-04-21"
attachment = true
reasoning = false
temperature = false
tool_call = false
open_weights = false
[limit]
context = 0
output = 0
[modalities]
input = ["text", "image"]
output = ["image"]
@@ -1,22 +1,22 @@
name = "GPT OSS 20B"
name = "GPT OSS 120B"
family = "gpt-oss"
release_date = "2025-08-05"
last_updated = "2025-08-05"
attachment = false
reasoning = true
reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
temperature = true
tool_call = true
structured_output = true
open_weights = true
[cost]
input = 0.03
output = 0.16
[limit]
context = 16_368
output = 16_368
context = 131_072
output = 32_768
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/openai/gpt-oss-120b"
+22
View File
@@ -0,0 +1,22 @@
name = "GPT OSS Safeguard 120B"
family = "gpt-oss"
release_date = "2025-10-29"
last_updated = "2025-10-29"
attachment = false
reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = true
[limit]
context = 131_072
output = 32_768
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/openai/gpt-oss-safeguard-120b"
+16
View File
@@ -0,0 +1,16 @@
name = "Whisper Large v3 Turbo"
family = "whisper"
release_date = "2024-10-01"
last_updated = "2024-10-01"
attachment = false
reasoning = false
tool_call = false
open_weights = true
[limit]
context = 448
output = 448
[modalities]
input = ["audio"]
output = ["text"]
+16
View File
@@ -0,0 +1,16 @@
name = "Whisper 3 Large"
family = "whisper"
release_date = "2024-10-01"
last_updated = "2024-10-01"
attachment = false
reasoning = false
tool_call = false
open_weights = true
[limit]
context = 448
output = 4_096
[modalities]
input = ["audio"]
output = ["text"]
+2 -2
View File
@@ -1,7 +1,7 @@
name = "GLM-5.1"
family = "glm"
release_date = "2026-03-27"
last_updated = "2026-03-27"
release_date = "2026-04-07"
last_updated = "2026-04-07"
attachment = false
reasoning = true
temperature = true
+5 -1
View File
@@ -7,7 +7,7 @@ reasoning = true
temperature = true
tool_call = true
structured_output = true
open_weights = false
open_weights = true
[limit]
context = 1_000_000
@@ -16,3 +16,7 @@ output = 131_072
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/zai-org/GLM-5.2"
+2 -2
View File
@@ -1,7 +1,7 @@
name = "GLM-5"
family = "glm"
release_date = "2026-02-11"
last_updated = "2026-02-11"
release_date = "2026-02-12"
last_updated = "2026-02-12"
attachment = false
reasoning = true
temperature = true
+3 -1
View File
@@ -20,9 +20,11 @@
"compare:migrations": "bun ./packages/core/script/compare-model-migrations.ts",
"baseten:sync": "bun ./packages/core/script/sync-models.ts baseten",
"cloudflare:sync": "bun ./packages/core/script/sync-models.ts cloudflare-workers-ai",
"chutes:generate": "bun ./packages/core/script/generate-chutes.ts",
"chutes:sync": "bun ./packages/core/script/sync-models.ts chutes",
"databricks:generate": "bun ./packages/core/script/generate-databricks.ts",
"helicone:generate": "bun ./packages/core/script/generate-helicone.ts",
"huggingface:sync": "bun ./packages/core/script/sync-models.ts huggingface",
"llmgateway:sync": "bun ./packages/core/script/sync-models.ts llmgateway",
"venice:sync": "bun ./packages/core/script/sync-models.ts venice",
"vercel:generate": "bun ./packages/core/script/sync-models.ts vercel",
"wandb:generate": "bun ./packages/core/script/generate-wandb.ts",
-891
View File
@@ -1,891 +0,0 @@
#!/usr/bin/env bun
/**
* Generates Chutes model TOML files from the Chutes LLM API.
*
* Flags:
* --dry-run: Preview changes without writing files
* --new-only: Only create new models, skip updating existing ones
* --keep-orphans: Don't delete TOML files for models no longer in the API
*/
import { z } from "zod";
import path from "node:path";
import { existsSync, readFileSync } from "node:fs";
import { mkdir } from "node:fs/promises";
import { inferKimiFamily, ModelFamilyValues } from "../src/family.js";
const API_ENDPOINT = "https://llm.chutes.ai/v1/models";
const MODEL_METADATA_DIR = path.join(import.meta.dirname, "..", "..", "..", "models");
const CHUTES_ORG_TO_MODEL_PROVIDER: Record<string, string | undefined> = {
"MiniMaxAI": "minimax",
"Qwen": "alibaba",
"XiaomiMiMo": "xiaomi",
"deepseek-ai": "deepseek",
"google": "google",
"moonshotai": "moonshotai",
"openai": "openai",
"zai-org": "zhipuai",
};
const BASE_MODEL_ALIASES: Record<string, string | undefined> = {
"google/gemma-4-31B-turbo-TEE": "google/gemma-4-31b-it",
"Qwen/Qwen3-235B-A22B-Instruct-2507-TEE": "alibaba/qwen3-235b-a22b",
};
const modelMetadataByID = new Map<string, Record<string, unknown>>();
enum SkipZeroFields {
LimitContext = "limit.context",
LimitOutput = "limit.output",
}
const Pricing = z.object({
prompt: z.number().optional(),
completion: z.number().optional(),
input_cache_read: z.number().optional(),
}).passthrough();
const ChutesModel = z.object({
id: z.string(),
created: z.number(),
pricing: Pricing.optional(),
context_length: z.number().optional(),
max_output_length: z.number().optional(),
max_model_len: z.number().optional(),
input_modalities: z.array(z.string()).optional(),
output_modalities: z.array(z.string()).optional(),
supported_features: z.array(z.string()).optional(),
supported_sampling_parameters: z.array(z.string()).optional(),
quantization: z.string().optional(),
}).passthrough();
const ChutesResponse = z.object({
data: z.array(ChutesModel),
}).passthrough();
interface ExistingModel {
base_model?: string;
base_model_omit?: string[];
name?: string;
family?: string;
attachment?: boolean;
reasoning?: boolean;
tool_call?: boolean;
structured_output?: boolean;
temperature?: boolean;
knowledge?: string;
release_date?: string;
last_updated?: string;
open_weights?: boolean;
interleaved?: boolean | { field: string };
status?: string;
cost?: {
input?: number;
output?: number;
cache_read?: number;
};
limit?: {
context?: number;
output?: number;
};
modalities?: {
input?: string[];
output?: string[];
};
}
interface MergedModel {
base_model?: string;
base_model_omit?: string[];
name: string;
family?: string;
attachment: boolean;
reasoning: boolean;
tool_call: boolean;
structured_output: boolean;
temperature: boolean;
knowledge?: string;
release_date: string;
last_updated: string;
open_weights: boolean;
interleaved?: boolean | { field: string };
status?: string;
cost?: {
input: number;
output: number;
cache_read?: number;
};
limit: {
context: number;
output: number;
};
modalities: {
input: string[];
output: string[];
};
}
interface Changes {
field: string;
oldValue: string;
newValue: string;
}
// ── Utility functions ────────────────────────────────────────────────
function timestampToDate(timestamp: number): string {
const date = new Date(timestamp * 1000);
return date.toISOString().slice(0, 10);
}
function getTodayDate(): string {
return new Date().toISOString().slice(0, 10);
}
function formatNumber(n: number): string {
if (n >= 1000) {
return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "_");
}
return n.toString();
}
/**
* Humanize a model ID into a readable name.
* Strips the org prefix and replaces hyphens with spaces.
* e.g. "Qwen/Qwen3-32B-TEE" → "Qwen3 32B TEE"
*/
function humanizeModelName(modelId: string): string {
const parts = modelId.split("/");
const modelPart = parts.at(-1) ?? modelId;
return modelPart.replace(/-/g, " ");
}
function modelMetadataPath(modelId: string): string {
return path.join(MODEL_METADATA_DIR, `${modelId}.toml`);
}
function modelMetadataExists(modelId: string): boolean {
return existsSync(modelMetadataPath(modelId));
}
function modelMetadata(modelId: string): Record<string, unknown> {
let metadata = modelMetadataByID.get(modelId);
if (metadata === undefined) {
metadata = Bun.TOML.parse(
readFileSync(modelMetadataPath(modelId), "utf8"),
) as Record<string, unknown>;
modelMetadataByID.set(modelId, metadata);
}
return metadata;
}
function baseModelCandidates(modelId: string): string[] {
const alias = BASE_MODEL_ALIASES[modelId];
const [org, ...modelParts] = modelId.split("/");
if (org === undefined || modelParts.length === 0) {
return alias === undefined ? [] : [alias];
}
const provider = CHUTES_ORG_TO_MODEL_PROVIDER[org];
if (provider === undefined) {
return alias === undefined ? [] : [alias];
}
const rawModel = modelParts.join("/");
if (!rawModel.endsWith("-TEE")) {
return alias === undefined ? [] : [alias];
}
const withoutTee = rawModel.slice(0, -"-TEE".length);
const lower = withoutTee.toLowerCase();
const normalized = [
withoutTee,
lower,
lower.replace(/-(?:instruct|thinking)-\d{4}$/, ""),
lower.replace(/-\d{4}$/, ""),
lower.replace(/-turbo$/, "-it"),
lower.replace(/-turbo$/, ""),
];
return [...new Set([alias, ...normalized.map((candidate) => `${provider}/${candidate}`)])
.values()].filter((candidate): candidate is string => candidate !== undefined);
}
function resolveBaseModel(modelId: string, existing: ExistingModel | null): string | undefined {
const candidates = [
existing?.base_model,
...baseModelCandidates(modelId),
].filter((candidate): candidate is string => candidate !== undefined);
return candidates.find(modelMetadataExists);
}
function resolveBaseModelOmit(
baseModel: string | undefined,
existing: ExistingModel | null,
): string[] | undefined {
const omit = new Set(existing?.base_model_omit ?? []);
if (baseModel !== undefined) {
const baseLimit = modelMetadata(baseModel).limit;
if (
isPlainObject(baseLimit) &&
baseLimit.input !== undefined
) {
omit.add("limit.input");
}
}
return omit.size > 0 ? [...omit].sort() : undefined;
}
// ── Family inference ───────────
function isSubstring(target: string, family: string): boolean {
return target.toLowerCase().includes(family.toLowerCase());
}
function matchesFamily(target: string, family: string): boolean {
const targetLower = target.toLowerCase();
const familyLower = family.toLowerCase();
let familyIdx = 0;
for (let i = 0; i < targetLower.length && familyIdx < familyLower.length; i++) {
if (targetLower[i] === familyLower[familyIdx]) {
familyIdx++;
}
}
return familyIdx === familyLower.length;
}
function inferFamily(modelId: string, modelName: string): string | undefined {
const kimiFamily = inferKimiFamily(modelId, modelName);
if (kimiFamily !== undefined) return kimiFamily;
const sortedFamilies = [...ModelFamilyValues].sort((a, b) => b.length - a.length);
// First pass: try exact substring matches
for (const family of sortedFamilies) {
if (isSubstring(modelId, family)) {
return family;
}
}
for (const family of sortedFamilies) {
if (isSubstring(modelName, family)) {
return family;
}
}
// Second pass: fall back to subsequence matching
for (const family of sortedFamilies) {
if (matchesFamily(modelId, family)) {
return family;
}
}
for (const family of sortedFamilies) {
if (matchesFamily(modelName, family)) {
return family;
}
}
return undefined;
}
// ── Load existing TOML ───────────────────────────────────────────────
async function loadExistingModel(filePath: string): Promise<ExistingModel | null> {
try {
const file = Bun.file(filePath);
if (!(await file.exists())) {
return null;
}
const toml = await import(filePath, { with: { type: "toml" } }).then(
(mod) => mod.default,
);
return toml as ExistingModel;
} catch (e) {
console.warn(`Warning: Failed to parse existing file ${filePath}:`, e);
return null;
}
}
// ── Merge API data with existing TOML ────────────────────────────────
function mergeModel(
apiModel: z.infer<typeof ChutesModel>,
existing: ExistingModel | null,
): MergedModel {
const features = new Set(apiModel.supported_features ?? []);
const samplingParams = new Set(apiModel.supported_sampling_parameters ?? []);
const inputMods = apiModel.input_modalities ?? ["text"];
const outputMods = apiModel.output_modalities ?? ["text"];
// Capabilities from API features
const hasAttachment = inputMods.some((m) =>
m === "image" || m === "video" || m === "pdf",
);
const hasReasoning = features.has("reasoning");
const hasToolCall = features.has("tools");
const hasStructuredOutput = features.has("structured_outputs");
const hasTemperature = samplingParams.size > 0
? samplingParams.has("temperature")
: true; // default true if no sampling params info
// Preserve existing values when available (manually specified)
const modelName = existing?.name ?? humanizeModelName(apiModel.id);
const family = existing?.family ?? inferFamily(apiModel.id, modelName);
const knowledge = existing?.knowledge;
const interleaved = existing?.interleaved;
const status = existing?.status;
const baseModel = resolveBaseModel(apiModel.id, existing);
const baseModelOmit = resolveBaseModelOmit(baseModel, existing);
// Release date: existing > API created timestamp > today
const releaseDate = existing?.release_date
?? timestampToDate(apiModel.created)
?? getTodayDate();
// Context limit: prefer context_length, fallback to max_model_len
const apiContext = apiModel.context_length ?? apiModel.max_model_len ?? 0;
const contextLimit = apiContext > 0
? apiContext
: (existing?.limit?.context ?? 0);
// Output limit: prefer max_output_length, fallback to existing
const apiOutput = apiModel.max_output_length ?? 0;
const outputLimit = apiOutput > 0
? apiOutput
: (existing?.limit?.output ?? 0);
const merged: MergedModel = {
...(baseModel !== undefined && { base_model: baseModel }),
...(baseModelOmit !== undefined && { base_model_omit: baseModelOmit }),
name: modelName,
family,
attachment: hasAttachment,
reasoning: hasReasoning,
tool_call: hasToolCall,
temperature: hasTemperature,
structured_output: hasStructuredOutput,
release_date: releaseDate,
last_updated: getTodayDate(),
open_weights: true, // Chutes hosts open-weight models
...(knowledge && { knowledge }),
...(interleaved !== undefined && { interleaved }),
...(status && { status }),
limit: {
context: contextLimit,
output: outputLimit,
},
modalities: {
input: inputMods,
output: outputMods,
},
};
// Cost: API values are already in USD per 1M tokens — use directly
if (apiModel.pricing) {
const inputPrice = apiModel.pricing.prompt;
const outputPrice = apiModel.pricing.completion;
const cacheReadPrice = apiModel.pricing.input_cache_read;
if (inputPrice !== undefined && outputPrice !== undefined) {
merged.cost = {
input: inputPrice,
output: outputPrice,
...(cacheReadPrice !== undefined && { cache_read: cacheReadPrice }),
};
}
}
return merged;
}
// ── TOML formatting ──────────────────────────────────────────────────
function formatToml(model: MergedModel): string {
if (model.base_model !== undefined) {
return formatBaseModelToml(model);
}
return formatFullToml(model);
}
function formatFullToml(model: MergedModel): string {
const lines: string[] = [];
lines.push(`# Auto-generated by generate-chutes.ts — do not edit pricing, limits, or capabilities.`);
lines.push(`# Manual overrides preserved on re-run: name, family, knowledge, interleaved, status`);
lines.push(`name = "${model.name.replace(/"/g, '\\"')}"`);
if (model.family) {
lines.push(`family = "${model.family}"`);
}
lines.push(`release_date = "${model.release_date}"`);
lines.push(`last_updated = "${model.last_updated}"`);
lines.push(`attachment = ${model.attachment}`);
lines.push(`reasoning = ${model.reasoning}`);
lines.push(`temperature = ${model.temperature}`);
lines.push(`tool_call = ${model.tool_call}`);
if (model.structured_output) {
lines.push(`structured_output = ${model.structured_output}`);
}
lines.push(`open_weights = ${model.open_weights}`);
if (model.knowledge) {
lines.push(`knowledge = "${model.knowledge}"`);
}
if (model.status) {
lines.push(`status = "${model.status}"`);
}
if (model.cost) {
lines.push("");
lines.push(`[cost]`);
lines.push(`input = ${model.cost.input}`);
lines.push(`output = ${model.cost.output}`);
if (model.cost.cache_read !== undefined) {
lines.push(`cache_read = ${model.cost.cache_read}`);
}
}
lines.push("");
lines.push(`[limit]`);
lines.push(`context = ${formatNumber(model.limit.context)}`);
lines.push(`output = ${formatNumber(model.limit.output)}`);
lines.push("");
lines.push(`[modalities]`);
lines.push(`input = [${model.modalities.input.map((m) => `"${m}"`).join(", ")}]`);
lines.push(`output = [${model.modalities.output.map((m) => `"${m}"`).join(", ")}]`);
if (model.interleaved !== undefined) {
lines.push("");
if (model.interleaved === true) {
lines.push(`interleaved = true`);
} else if (typeof model.interleaved === "object") {
lines.push(`[interleaved]`);
lines.push(`field = "${model.interleaved.field}"`);
}
}
return lines.join("\n") + "\n";
}
function formatBaseModelToml(model: MergedModel): string {
const lines: string[] = [];
const overrides = baseModelOverrides(model);
lines.push(`# Auto-generated by generate-chutes.ts — do not edit pricing, limits, or capabilities.`);
lines.push(`# Manual overrides preserved on re-run: name, family, knowledge, interleaved, status`);
lines.push(`base_model = "${model.base_model}"`);
if (model.base_model_omit !== undefined) {
lines.push(
`base_model_omit = [${model.base_model_omit.map((item) => `"${item}"`).join(", ")}]`,
);
}
if (overrides.name !== undefined) {
lines.push(`name = "${String(overrides.name).replace(/"/g, '\\"')}"`);
}
for (const field of [
"attachment",
"reasoning",
"structured_output",
"temperature",
"tool_call",
"open_weights",
] as const) {
const value = overrides[field];
if (value !== undefined) {
lines.push(`${field} = ${value}`);
}
}
if (overrides.knowledge !== undefined) {
lines.push(`knowledge = "${overrides.knowledge}"`);
}
if (overrides.status !== undefined) {
lines.push(`status = "${overrides.status}"`);
}
if (overrides.interleaved !== undefined) {
lines.push("");
if (overrides.interleaved === true) {
lines.push(`interleaved = true`);
} else if (isPlainObject(overrides.interleaved)) {
lines.push(`[interleaved]`);
lines.push(`field = "${overrides.interleaved.field}"`);
}
}
if (model.cost) {
lines.push("");
lines.push(`[cost]`);
lines.push(`input = ${model.cost.input}`);
lines.push(`output = ${model.cost.output}`);
if (model.cost.cache_read !== undefined) {
lines.push(`cache_read = ${model.cost.cache_read}`);
}
}
lines.push("");
lines.push(`[limit]`);
lines.push(`context = ${formatNumber(model.limit.context)}`);
lines.push(`output = ${formatNumber(model.limit.output)}`);
if (overrides.modalities !== undefined && isPlainObject(overrides.modalities)) {
const input = overrides.modalities.input;
const output = overrides.modalities.output;
if (Array.isArray(input) && Array.isArray(output)) {
lines.push("");
lines.push(`[modalities]`);
lines.push(`input = [${input.map((m) => `"${m}"`).join(", ")}]`);
lines.push(`output = [${output.map((m) => `"${m}"`).join(", ")}]`);
}
}
return lines.join("\n") + "\n";
}
function baseModelOverrides(model: MergedModel): Record<string, unknown> {
if (model.base_model === undefined) {
return {};
}
const metadata = modelMetadata(model.base_model);
const values: Record<string, unknown> = {
name: model.name,
attachment: model.attachment,
reasoning: model.reasoning,
structured_output:
model.structured_output || metadata.structured_output === true
? model.structured_output
: undefined,
temperature: model.temperature,
tool_call: model.tool_call,
knowledge: model.knowledge,
open_weights: model.open_weights,
status: model.status,
interleaved: model.interleaved,
modalities: model.modalities,
};
return Object.fromEntries(
Object.entries(values)
.map(([key, value]) => [key, inheritedOverride(value, metadata[key])])
.filter(([, value]) => value !== undefined),
);
}
function inheritedOverride(value: unknown, inherited: unknown): unknown {
if (value === undefined) return undefined;
if (sameInheritedValue(value, inherited)) return undefined;
return stripUndefined(value);
}
function stripUndefined(value: unknown): unknown {
if (Array.isArray(value)) return value.map(stripUndefined);
if (isPlainObject(value)) {
return Object.fromEntries(
Object.entries(value)
.filter(([, item]) => item !== undefined)
.map(([key, item]) => [key, stripUndefined(item)]),
);
}
return value;
}
function sameInheritedValue(value: unknown, inherited: unknown): boolean {
return stableInheritedValue(value) === stableInheritedValue(inherited);
}
function stableInheritedValue(value: unknown): string {
if (Array.isArray(value)) {
const items = value.map(stableInheritedValue);
const ordered = value.every((item) => item === null || typeof item !== "object")
? items.sort()
: items;
return `[${ordered.join(",")}]`;
}
if (isPlainObject(value)) {
return `{${Object.entries(value)
.filter(([, item]) => item !== undefined)
.sort(([a], [b]) => a.localeCompare(b))
.map(([key, item]) => `${JSON.stringify(key)}:${stableInheritedValue(item)}`)
.join(",")}}`;
}
return JSON.stringify(value);
}
function isPlainObject(value: unknown): value is Record<string, unknown> {
return value !== null && typeof value === "object" && !Array.isArray(value);
}
// ── Change detection ─────────────────────────────────────────────────
function detectChanges(
existing: ExistingModel | null,
merged: MergedModel,
): Changes[] {
if (!existing) return [];
const changes: Changes[] = [];
const EPSILON = 0.001;
const shouldSkipZero = (field: string, oldVal: unknown, newVal: unknown): boolean => {
if (!Object.values(SkipZeroFields).includes(field as SkipZeroFields)) {
return false;
}
return (typeof oldVal === "number" && oldVal === 0) || (typeof newVal === "number" && newVal === 0);
};
const formatValue = (val: unknown): string => {
if (typeof val === "number") return formatNumber(val);
if (Array.isArray(val)) return `[${val.join(", ")}]`;
if (val === undefined) return "(none)";
return String(val);
};
const isMaterialPriceDiff = (oldPrice: unknown, newPrice: unknown): boolean => {
if (oldPrice === 0 && newPrice === undefined) return false;
if (oldPrice !== undefined && newPrice !== undefined) {
return Math.abs((oldPrice as number) - (newPrice as number)) > EPSILON;
}
return oldPrice !== newPrice;
};
const compare = (field: string, oldVal: unknown, newVal: unknown) => {
if (shouldSkipZero(field, oldVal, newVal)) return;
const isDiff = field.startsWith("cost.")
? isMaterialPriceDiff(oldVal, newVal)
: JSON.stringify(oldVal) !== JSON.stringify(newVal);
if (isDiff) {
changes.push({
field,
oldValue: formatValue(oldVal),
newValue: formatValue(newVal),
});
}
};
if (merged.base_model !== undefined) {
const overrides = baseModelOverrides(merged);
compare("base_model", existing.base_model, merged.base_model);
compare("base_model_omit", existing.base_model_omit, merged.base_model_omit);
compare("name", existing.name, overrides.name);
compare("attachment", existing.attachment, overrides.attachment);
compare("reasoning", existing.reasoning, overrides.reasoning);
compare("tool_call", existing.tool_call, overrides.tool_call);
compare(
"structured_output",
existing.structured_output ?? false,
overrides.structured_output ?? false,
);
compare("temperature", existing.temperature, overrides.temperature);
compare("open_weights", existing.open_weights, overrides.open_weights);
compare("knowledge", existing.knowledge, overrides.knowledge);
compare("status", existing.status, overrides.status);
compare("interleaved", existing.interleaved, overrides.interleaved);
compare("cost.input", existing.cost?.input, merged.cost?.input);
compare("cost.output", existing.cost?.output, merged.cost?.output);
compare("cost.cache_read", existing.cost?.cache_read, merged.cost?.cache_read);
compare("limit.context", existing.limit?.context, merged.limit.context);
compare("limit.output", existing.limit?.output, merged.limit.output);
if (isPlainObject(overrides.modalities)) {
compare("modalities.input", existing.modalities?.input, overrides.modalities.input);
compare("modalities.output", existing.modalities?.output, overrides.modalities.output);
} else {
compare("modalities.input", existing.modalities?.input, undefined);
compare("modalities.output", existing.modalities?.output, undefined);
}
return changes;
}
compare("name", existing.name, merged.name);
compare("base_model", existing.base_model, merged.base_model);
compare("base_model_omit", existing.base_model_omit, merged.base_model_omit);
compare("family", existing.family, merged.family);
compare("attachment", existing.attachment, merged.attachment);
compare("reasoning", existing.reasoning, merged.reasoning);
compare("tool_call", existing.tool_call, merged.tool_call);
compare("structured_output", existing.structured_output ?? false, merged.structured_output);
compare("open_weights", existing.open_weights, merged.open_weights);
compare("release_date", existing.release_date, merged.release_date);
compare("cost.input", existing.cost?.input, merged.cost?.input);
compare("cost.output", existing.cost?.output, merged.cost?.output);
compare("cost.cache_read", existing.cost?.cache_read, merged.cost?.cache_read);
compare("limit.context", existing.limit?.context, merged.limit.context);
compare("limit.output", existing.limit?.output, merged.limit.output);
compare("modalities.input", existing.modalities?.input, merged.modalities.input);
compare("modalities.output", existing.modalities?.output, merged.modalities.output);
return changes;
}
// ── Main ─────────────────────────────────────────────────────────────
async function main() {
const args = process.argv.slice(2);
const dryRun = args.includes("--dry-run");
const newOnly = args.includes("--new-only");
const keepOrphans = args.includes("--keep-orphans");
const modelsDir = path.join(
import.meta.dirname,
"..",
"..",
"..",
"providers",
"chutes",
"models",
);
console.log(`${dryRun ? "[DRY RUN] " : ""}${newOnly ? "[NEW ONLY] " : ""}${keepOrphans ? "[KEEP ORPHANS] " : ""}Fetching Chutes models from API...`);
const res = await fetch(API_ENDPOINT);
if (!res.ok) {
console.error(`Failed to fetch API: ${res.status} ${res.statusText}`);
process.exit(1);
}
const json = await res.json();
const parsed = ChutesResponse.safeParse(json);
if (!parsed.success) {
console.error("Invalid API response:", parsed.error.errors);
process.exit(1);
}
const apiModels = parsed.data.data;
// Scan existing TOML files
const existingFiles = new Set<string>();
try {
for await (const file of new Bun.Glob("**/*.toml").scan({
cwd: modelsDir,
absolute: false,
})) {
existingFiles.add(file);
}
} catch {
}
console.log(`Found ${apiModels.length} models in API, ${existingFiles.size} existing files\n`);
const apiModelIds = new Set<string>();
let created = 0;
let updated = 0;
let unchanged = 0;
for (const apiModel of apiModels) {
const relativePath = `${apiModel.id}.toml`;
const filePath = path.join(modelsDir, relativePath);
const dirPath = path.dirname(filePath);
apiModelIds.add(relativePath);
const existing = await loadExistingModel(filePath);
const merged = mergeModel(apiModel, existing);
const tomlContent = formatToml(merged);
if (existing === null) {
created++;
if (dryRun) {
console.log(`[DRY RUN] Would create: ${relativePath}`);
console.log(` name = "${merged.name}"`);
if (merged.family) {
console.log(` family = "${merged.family}" (inferred)`);
}
console.log("");
} else {
await mkdir(dirPath, { recursive: true });
await Bun.write(filePath, tomlContent);
console.log(`Created: ${relativePath}`);
}
} else {
if (newOnly) {
unchanged++;
continue;
}
const changes = detectChanges(existing, merged);
const existingContent = await Bun.file(filePath).text();
const formatChanged = existingContent !== tomlContent;
if (changes.length > 0 || formatChanged) {
updated++;
if (dryRun) {
console.log(`[DRY RUN] Would update: ${relativePath}`);
} else {
await mkdir(dirPath, { recursive: true });
await Bun.write(filePath, tomlContent);
console.log(`Updated: ${relativePath}`);
}
for (const change of changes) {
console.log(` ${change.field}: ${change.oldValue}${change.newValue}`);
}
if (changes.length === 0 && formatChanged) {
console.log(` (format-only change)`);
}
console.log("");
} else {
unchanged++;
}
}
}
// Handle orphaned files (on disk but not in API)
const orphaned: string[] = [];
for (const file of existingFiles) {
if (!apiModelIds.has(file)) {
orphaned.push(file);
const orphanPath = path.join(modelsDir, file);
if (keepOrphans) {
console.log(`Orphaned (kept): ${file}`);
} else if (dryRun) {
console.log(`[DRY RUN] Would delete: ${file}`);
} else {
await Bun.file(orphanPath).delete();
console.log(`Deleted: ${file}`);
// Clean up empty parent directories
const parentDir = path.dirname(orphanPath);
try {
const remaining = [];
for await (const entry of new Bun.Glob("*").scan({ cwd: parentDir })) {
remaining.push(entry);
}
if (remaining.length === 0) {
const { rmdir } = await import("node:fs/promises");
await rmdir(parentDir);
console.log(` Removed empty directory: ${path.basename(parentDir)}/`);
}
} catch {
// Directory not empty or other error, ignore
}
}
}
}
console.log("");
if (dryRun) {
console.log(
`Summary: ${created} would be created, ${updated} would be updated, ${unchanged} unchanged, ${orphaned.length} would be deleted`,
);
} else if (keepOrphans) {
console.log(
`Summary: ${created} created, ${updated} updated, ${unchanged} unchanged, ${orphaned.length} orphaned (kept)`,
);
} else {
console.log(
`Summary: ${created} created, ${updated} updated, ${unchanged} unchanged, ${orphaned.length} deleted`,
);
}
}
await main();
+3
View File
@@ -246,6 +246,9 @@ export const ModelFamilyValues = [
// Lucid
"lucid",
// LucidQuery
"agi",
// Intellect
"intellect",
+2 -2
View File
@@ -39,7 +39,7 @@ export async function generateModels(directory: string) {
absolute: true,
followSymlinks: true,
})) {
const modelID = path.relative(directory, modelPath).slice(0, -5);
const modelID = path.relative(directory, modelPath).split(path.sep).join("/").slice(0, -5);
const toml = await import(modelPath, {
with: {
type: "toml",
@@ -94,7 +94,7 @@ async function generateProviders(
absolute: true,
followSymlinks: true,
})) {
const modelID = path.relative(modelsPath, modelPath).slice(0, -5);
const modelID = path.relative(modelsPath, modelPath).split(path.sep).join("/").slice(0, -5);
const toml = await import(modelPath, {
with: {
type: "toml",
+28 -22
View File
@@ -5,8 +5,11 @@ import { z } from "zod";
import { AuthoredModel, AuthoredModelShape, ModelMetadata } from "../schema.js";
import { baseten } from "./providers/baseten.js";
import { chutes } from "./providers/chutes.js";
import { cloudflareWorkersAi } from "./providers/cloudflare-workers-ai.js";
import { google } from "./providers/google.js";
import { huggingface } from "./providers/huggingface.js";
import { llmgateway } from "./providers/llmgateway.js";
import { openrouter } from "./providers/openrouter.js";
import { ovhcloud } from "./providers/ovhcloud.js";
import { vercel } from "./providers/vercel.js";
@@ -78,8 +81,11 @@ export interface SyncResult {
export const providers: {
baseten: SyncProvider<any>;
chutes: SyncProvider<any>;
"cloudflare-workers-ai": SyncProvider<any>;
google: SyncProvider<any>;
huggingface: SyncProvider<any>;
llmgateway: SyncProvider<any>;
openrouter: SyncProvider<any>;
ovhcloud: SyncProvider<any>;
vercel: SyncProvider<any>;
@@ -87,8 +93,11 @@ export const providers: {
xai: SyncProvider<any>;
} = {
baseten,
chutes,
"cloudflare-workers-ai": cloudflareWorkersAi,
google,
huggingface,
llmgateway,
openrouter,
ovhcloud,
vercel,
@@ -97,9 +106,9 @@ export const providers: {
};
export const groups = {
aggregators: ["openrouter", "vercel"],
aggregators: ["huggingface", "llmgateway", "openrouter", "vercel"],
cloudflare: ["cloudflare-workers-ai"],
direct: ["baseten", "google", "ovhcloud", "venice", "xai"],
direct: ["baseten", "chutes", "google", "ovhcloud", "venice", "xai"],
} as const;
type ProviderID = keyof typeof providers;
@@ -229,7 +238,7 @@ export async function syncProvider<SourceModel>(
}
const namespaceDir = path.join(metadataDir, provider.metadataNamespace);
for (const { file } of await tomlFiles(namespaceDir)) {
const relativePath = path.join(provider.metadataNamespace, file);
const relativePath = path.join(provider.metadataNamespace, file).split(path.sep).join("/");
if (desiredMetadata.has(relativePath) || provider.deleteMissing === false) continue;
if (options.newOnly) {
console.log(`Skipping metadata removal in new-only mode: ${relativePath}`);
@@ -435,7 +444,7 @@ async function readModelMetadata(modelsDir: string) {
absolute: true,
followSymlinks: true,
})) {
const modelID = path.relative(metadataDir, modelPath).slice(0, -5);
const modelID = path.relative(metadataDir, modelPath).split(path.sep).join("/").slice(0, -5);
const toml = Bun.TOML.parse(
await Bun.file(modelPath).text(),
) as Record<string, unknown>;
@@ -544,7 +553,7 @@ async function tomlFiles(root: string, dir = "") {
const result: Array<{ file: string; symlink: boolean }> = [];
for (const entry of await readdir(path.join(root, dir), { withFileTypes: true })) {
const file = path.join(dir, entry.name);
const file = path.join(dir, entry.name).split(path.sep).join("/");
if (entry.isDirectory()) {
result.push(...await tomlFiles(root, file));
} else if (entry.name.endsWith(".toml") && (entry.isFile() || entry.isSymbolicLink())) {
@@ -673,7 +682,7 @@ function formatReasoningValue(value: string | null) {
return value === null ? quote("null") : quote(value);
}
function formatToml(model: z.infer<typeof SyncedAuthoredModel>) {
export function formatToml(model: z.infer<typeof SyncedAuthoredModel>) {
const lines: string[] = [];
if (model.base_model !== undefined) lines.push(`base_model = ${quote(model.base_model)}`);
@@ -694,22 +703,7 @@ function formatToml(model: z.infer<typeof SyncedAuthoredModel>) {
if (model.knowledge !== undefined) lines.push(`knowledge = ${quote(model.knowledge)}`);
if (model.open_weights !== undefined) lines.push(`open_weights = ${model.open_weights}`);
if (model.status !== undefined) lines.push(`status = ${quote(model.status)}`);
if (model.reasoning_options?.length === 0) {
lines.push("reasoning_options = []");
} else {
for (const option of model.reasoning_options ?? []) {
lines.push("", "[[reasoning_options]]");
lines.push(`type = ${quote(option.type)}`);
if (option.type === "effort") {
lines.push(`values = [${option.values.map(formatReasoningValue).join(", ")}]`);
}
if (option.type === "budget_tokens") {
if (option.min !== undefined) lines.push(`min = ${formatInteger(option.min)}`);
if (option.max !== undefined) lines.push(`max = ${formatInteger(option.max)}`);
}
}
}
if (model.reasoning_options?.length === 0) lines.push("reasoning_options = []");
if (model.interleaved !== undefined) {
lines.push("");
@@ -721,6 +715,18 @@ function formatToml(model: z.infer<typeof SyncedAuthoredModel>) {
}
}
for (const option of model.reasoning_options ?? []) {
lines.push("", "[[reasoning_options]]");
lines.push(`type = ${quote(option.type)}`);
if (option.type === "effort") {
lines.push(`values = [${option.values.map(formatReasoningValue).join(", ")}]`);
}
if (option.type === "budget_tokens") {
if (option.min !== undefined) lines.push(`min = ${formatInteger(option.min)}`);
if (option.max !== undefined) lines.push(`max = ${formatInteger(option.max)}`);
}
}
if (model.cost !== undefined) {
lines.push("", "[cost]");
lines.push(`input = ${formatNumber(model.cost.input)}`);
+219
View File
@@ -0,0 +1,219 @@
import { existsSync, readdirSync } from "node:fs";
import path from "node:path";
import { z } from "zod";
import { inferKimiFamily, ModelFamilyValues } from "../../family.js";
import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "../index.js";
import { factorBaseModel } from "./openrouter.js";
const API_ENDPOINT = "https://llm.chutes.ai/v1/models";
const MODELS_DIR = path.join(import.meta.dirname, "..", "..", "..", "..", "..", "models");
const CHUTES_ORG_TO_MODEL_PROVIDER: Record<string, string | undefined> = {
MiniMaxAI: "minimax",
Qwen: "alibaba",
XiaomiMiMo: "xiaomi",
"deepseek-ai": "deepseek",
google: "google",
moonshotai: "moonshotai",
openai: "openai",
"zai-org": "zhipuai",
};
const BASE_MODEL_ALIASES: Record<string, string | undefined> = {
"google/gemma-4-31B-turbo-TEE": "google/gemma-4-31b-it",
// "unsloth" re-hosts models from many providers, so it has no org mapping; alias the
// ones whose canonical metadata lives under the original provider's namespace.
"unsloth/Mistral-Nemo-Instruct-2407-TEE": "mistral/mistral-nemo",
};
const Pricing = z.object({
prompt: z.number().optional(),
completion: z.number().optional(),
input_cache_read: z.number().optional(),
}).passthrough();
export const ChutesModel = z.object({
id: z.string(),
created: z.number(),
pricing: Pricing.optional(),
context_length: z.number().optional(),
max_output_length: z.number().optional(),
max_model_len: z.number().optional(),
input_modalities: z.array(z.string()).optional(),
output_modalities: z.array(z.string()).optional(),
supported_features: z.array(z.string()).optional(),
supported_sampling_parameters: z.array(z.string()).optional(),
quantization: z.string().optional(),
}).passthrough();
export const ChutesResponse = z.object({
data: z.array(ChutesModel),
}).passthrough();
export type ChutesModel = z.infer<typeof ChutesModel>;
type Modality = "text" | "audio" | "image" | "video" | "pdf";
export const chutes = {
id: "chutes",
name: "Chutes",
modelsDir: "providers/chutes/models",
preserveBaseModels: false,
async fetchModels() {
const response = await fetch(API_ENDPOINT);
if (!response.ok) {
throw new Error(`Chutes models request failed: ${response.status} ${response.statusText}`);
}
return response.json();
},
parseModels(raw) {
return ChutesResponse.parse(raw).data;
},
translateModel(model, context) {
return {
id: model.id,
model: buildChutesModel(model, context.existing(model.id)),
};
},
} satisfies SyncProvider<ChutesModel>;
export function buildChutesModel(
model: ChutesModel,
existing: ExistingModel | undefined,
today = new Date().toISOString().slice(0, 10),
): SyncedModel {
const features = new Set(model.supported_features ?? []);
const samplingParams = new Set(model.supported_sampling_parameters ?? []);
const input = normalizeModalities(model.input_modalities ?? ["text"]);
const output = normalizeModalities(model.output_modalities ?? ["text"]);
const attachment = input.some((value) => value !== "text");
const reasoning = features.has("reasoning");
const toolCall = features.has("tools");
const structuredOutput = features.has("structured_outputs");
// Absent sampling-parameter info, assume temperature is tunable.
const temperature = samplingParams.size > 0 ? samplingParams.has("temperature") : true;
const name = existing?.name ?? humanizeModelName(model.id);
const baseModel = resolveBaseModel(model.id);
const apiContext = model.context_length ?? model.max_model_len ?? 0;
const context = apiContext > 0 ? apiContext : existing?.limit?.context ?? 0;
const apiOutput = model.max_output_length ?? 0;
const limit = {
context,
input: existing?.limit?.input,
output: apiOutput > 0 ? apiOutput : existing?.limit?.output ?? 0,
};
const cost = model.pricing?.prompt !== undefined && model.pricing?.completion !== undefined
? {
input: model.pricing.prompt,
output: model.pricing.completion,
cache_read: model.pricing.input_cache_read,
}
: existing?.cost;
const values: SyncedFullModel = {
name,
family: baseModel == null ? (existing?.family ?? inferFamily(model.id, name)) : existing?.family,
release_date: existing?.release_date ?? dateFromTimestamp(model.created),
last_updated: existing?.last_updated ?? today,
attachment,
reasoning,
// Chutes' /v1/models advertises `reasoning` as a capability but exposes no parameter
// to toggle or set its effort, so there is no provider evidence for a reasoning option.
reasoning_options: [],
temperature,
tool_call: toolCall,
structured_output: structuredOutput ? true : undefined,
knowledge: existing?.knowledge,
open_weights: true,
status: existing?.status,
interleaved: existing?.interleaved,
cost,
limit,
modalities: { input, output },
};
return baseModel == null
? values
: factorBaseModel(baseModel, values, limit, existing?.base_model_omit);
}
function resolveBaseModel(modelId: string): string | undefined {
return baseModelCandidates(modelId).find(canonicalExists);
}
// existsSync is case-insensitive on Windows/macOS; verify the real on-disk filename case
// so the resolved base_model matches the canonical metadata exactly (and CI on Linux).
function canonicalExists(candidate: string): boolean {
const file = path.join(MODELS_DIR, `${candidate}.toml`);
if (!existsSync(file)) return false;
try {
return readdirSync(path.dirname(file)).includes(path.basename(file));
} catch {
return false;
}
}
function baseModelCandidates(modelId: string): string[] {
const alias = BASE_MODEL_ALIASES[modelId];
const [org, ...modelParts] = modelId.split("/");
if (org === undefined || modelParts.length === 0 || modelParts.join("/").endsWith("-TEE") === false) {
return alias === undefined ? [] : [alias];
}
const provider = CHUTES_ORG_TO_MODEL_PROVIDER[org];
if (provider === undefined) {
return alias === undefined ? [] : [alias];
}
const withoutTee = modelParts.join("/").slice(0, -"-TEE".length);
const lower = withoutTee.toLowerCase();
// Distinct checkpoints (e.g. "-Thinking-2507") keep their own metadata — deliberately
// not collapsed onto the generic base, which would inherit the wrong capabilities.
const normalized = [
withoutTee,
lower,
lower.replace(/-turbo$/, "-it"),
lower.replace(/-turbo$/, ""),
];
return [
...new Set([alias, ...normalized.map((candidate) => `${provider}/${candidate}`)]).values(),
].filter((candidate): candidate is string => candidate !== undefined);
}
function normalizeModalities(values: string[]): Modality[] {
const allowed = new Set<Modality>(["text", "audio", "image", "video", "pdf"]);
const result = values
.map((value) => value.toLowerCase())
.filter((value): value is Modality => allowed.has(value as Modality));
if (result.length === 0) return ["text"];
return [...new Set(result)];
}
function humanizeModelName(modelId: string): string {
const modelPart = modelId.split("/").at(-1) ?? modelId;
return modelPart.replace(/-/g, " ");
}
function dateFromTimestamp(timestamp: number): string {
return new Date(timestamp * 1000).toISOString().slice(0, 10);
}
function inferFamily(id: string, name: string) {
const kimiFamily = inferKimiFamily(id, name);
if (kimiFamily !== undefined) return kimiFamily;
const target = `${id} ${name}`.toLowerCase();
return [...ModelFamilyValues]
.sort((a, b) => b.length - a.length)
.find((family) => {
const value = family.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
if (family === "o") return new RegExp(`(^|[^a-z0-9])${value}(?=\\d|$|[^a-z0-9])`).test(target);
return new RegExp(`(^|[^a-z0-9])${value}(?=$|[^a-z0-9])`).test(target);
});
}
@@ -0,0 +1,245 @@
import { z } from "zod";
import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "../index.js";
import { factorBaseModel, resolveCanonicalBaseModel } from "./openrouter.js";
const API_ENDPOINT = "https://router.huggingface.co/v1/models";
// Hugging Face org prefixes mapped to the canonical metadata prefixes understood
// by resolveCanonicalBaseModel. Anything not listed falls back to a direct lookup.
const CANONICAL_ORG_PREFIXES: Record<string, string> = {
CohereLabs: "cohere",
"deepseek-ai": "deepseek",
google: "google",
"meta-llama": "meta-llama",
MiniMaxAI: "minimax",
moonshotai: "moonshotai",
nvidia: "nvidia",
Qwen: "qwen",
"stepfun-ai": "stepfun",
XiaomiMiMo: "xiaomi",
"zai-org": "zai",
};
const HuggingFaceProvider = z.object({
provider: z.string(),
status: z.string(),
context_length: z.number().int().positive().optional(),
pricing: z.object({
input: z.number(),
output: z.number(),
}).passthrough().optional(),
throughput: z.number().nonnegative().optional(),
first_token_latency_ms: z.number().nonnegative().optional(),
is_free: z.boolean().optional(),
supports_tools: z.boolean().optional(),
supports_structured_output: z.boolean().optional(),
is_model_author: z.boolean().optional(),
}).passthrough();
export const HuggingFaceModel = z.object({
id: z.string().min(1),
created: z.number().optional(),
owned_by: z.string().optional(),
architecture: z.object({
input_modalities: z.array(z.string()),
output_modalities: z.array(z.string()),
}).passthrough(),
providers: z.array(HuggingFaceProvider),
}).passthrough();
export const HuggingFaceResponse = z.object({
data: z.array(HuggingFaceModel),
}).passthrough();
export type HuggingFaceModel = z.infer<typeof HuggingFaceModel>;
export type HuggingFaceProvider = z.infer<typeof HuggingFaceProvider>;
export const huggingface = {
id: "huggingface",
name: "Hugging Face",
modelsDir: "providers/huggingface/models",
deleteMissing: false,
sourceID(model) {
return model.id;
},
skippedNotice(ids) {
if (ids.length === 0) return [];
return [
`${ids.length} Hugging Face Inference Providers models were not created because their IDs could not be mapped to provider-agnostic metadata, had no live provider, or had no priced provider.`,
`Skipped remote IDs: ${ids.map((id) => `\`${id}\``).join(", ")}`,
];
},
missingNotice(paths) {
if (paths.length === 0) return [];
return [
`${paths.length} local Hugging Face models were absent from the Inference Providers catalog and were retained for manual lifecycle review.`,
`Retained local paths: ${paths.map((item) => `\`${item}\``).join(", ")}`,
];
},
async fetchModels() {
const headers = process.env.HF_TOKEN
? { Authorization: `Bearer ${process.env.HF_TOKEN}` }
: undefined;
const response = await fetch(API_ENDPOINT, { headers });
if (!response.ok) {
throw new Error(`Hugging Face models request failed: ${response.status} ${response.statusText}`);
}
return response.json();
},
parseModels(raw) {
return HuggingFaceResponse.parse(raw).data;
},
translateModel(model, context) {
if (!model.providers.some((provider) => provider.status === "live")) return undefined;
const existing = context.existing(model.id);
const baseModel = existing === undefined
? resolveHuggingFaceBaseModel(model.id)
: existing.base_model;
if (existing === undefined && baseModel === undefined) return undefined;
// The router only exposes pricing per inference provider, so a new model with
// no priced provider cannot be created with a meaningful cost.
const aggregate = aggregateProviders(model);
if (existing === undefined && aggregate.cost === undefined) return undefined;
return {
id: model.id,
model: buildHuggingFaceModel(model, existing, baseModel, aggregate),
};
},
sameModel() {
// For now the sync only creates new models; existing curated TOMLs are left
// untouched. Treating every existing model as already in sync skips updates
// while still allowing new files to be created.
return true;
},
} satisfies SyncProvider<HuggingFaceModel>;
interface Aggregate {
cost: { input: number; output: number } | undefined;
context: number | undefined;
tools: boolean;
structuredOutput: boolean;
}
function price(value: number) {
return Number.isFinite(value) && value >= 0
? Math.round(value * 1_000_000) / 1_000_000
: undefined;
}
// The router aggregates several inference providers per model and sends traffic to
// the fastest one, so this collapses them into the route a request would actually
// take: pricing and context from the highest-throughput provider, plus capabilities
// advertised by any provider (a caller can always pin a slower provider).
function aggregateProviders(model: HuggingFaceModel): Aggregate {
const providers = model.providers.filter((provider) => provider.status === "live");
const byThroughput = (a: HuggingFaceProvider, b: HuggingFaceProvider) =>
(b.throughput ?? -Infinity) - (a.throughput ?? -Infinity);
// The provider the router routes to (fastest). Take its price when it reports one;
// otherwise fall back to the fastest provider that does, so a new model can still
// be costed.
const routed = [...providers].sort(byThroughput).at(0);
const costProvider = routed?.pricing !== undefined
? routed
: [...providers]
.filter((provider): provider is HuggingFaceProvider & { pricing: { input: number; output: number } } =>
provider.pricing !== undefined)
.sort(byThroughput)
.at(0);
const input = costProvider?.pricing === undefined ? undefined : price(costProvider.pricing.input);
const output = costProvider?.pricing === undefined ? undefined : price(costProvider.pricing.output);
const contexts = providers
.map((provider) => provider.context_length)
.filter((value): value is number => value !== undefined);
return {
cost: input !== undefined && output !== undefined ? { input, output } : undefined,
context: routed?.context_length ?? (contexts.length > 0 ? Math.max(...contexts) : undefined),
tools: providers.some((provider) => provider.supports_tools === true),
structuredOutput: providers.some((provider) => provider.supports_structured_output === true),
};
}
type Modality = "text" | "audio" | "image" | "video" | "pdf";
function modalities(values: string[], fallback: Modality[]): Modality[] {
const allowed = new Set<Modality>(["text", "audio", "image", "video", "pdf"]);
const result = values
.map((value) => value.toLowerCase())
.filter((value): value is Modality => allowed.has(value as Modality));
return [...new Set(result.length > 0 ? result : fallback)];
}
export function buildHuggingFaceModel(
model: HuggingFaceModel,
existing: ExistingModel | undefined,
baseModel = existing === undefined ? resolveHuggingFaceBaseModel(model.id) : existing.base_model,
aggregate: Aggregate = aggregateProviders(model),
): SyncedModel {
const input = modalities(model.architecture.input_modalities, existing?.modalities?.input ?? ["text"]);
const output = modalities(model.architecture.output_modalities, existing?.modalities?.output ?? ["text"]);
// Pricing is curated: keep what was authored and only fall back to the router
// (fastest route) when the local model has no cost yet.
const cost = existing?.cost ?? aggregate.cost;
// context/output may be unset for a freshly created base_model entry, in which case
// factorBaseModel inherits them from the canonical metadata; the standalone-model
// path below validates their presence at runtime.
const limit = {
context: existing?.limit?.context ?? aggregate.context,
input: existing?.limit?.input,
output: existing?.limit?.output,
} as SyncedFullModel["limit"];
const values: Partial<SyncedFullModel> = {
name: existing?.name,
family: existing?.family,
release_date: existing?.release_date,
last_updated: existing?.last_updated,
attachment: input.some((value) => value !== "text"),
reasoning: existing?.reasoning,
reasoning_options: existing?.reasoning_options,
temperature: existing?.temperature,
tool_call: aggregate.tools || existing?.tool_call || undefined,
structured_output: aggregate.structuredOutput || existing?.structured_output || undefined,
knowledge: existing?.knowledge,
open_weights: existing?.open_weights ?? true,
status: existing?.status,
interleaved: existing?.interleaved,
cost,
limit,
modalities: { input, output },
};
if (baseModel !== undefined) {
return factorBaseModel(baseModel, values, limit, existing?.base_model_omit);
}
// Standalone (non base_model) models require concrete booleans the router does
// not always report; default the capability flags it leaves out.
const full = { ...values, tool_call: values.tool_call ?? false };
const required = z.object({
name: z.string(),
release_date: z.string(),
last_updated: z.string(),
reasoning: z.boolean(),
open_weights: z.boolean(),
cost: z.object({ input: z.number(), output: z.number() }),
limit: z.object({ context: z.number(), output: z.number() }),
}).safeParse(full);
if (!required.success) {
throw new Error(`Hugging Face model ${model.id} has incomplete local metadata required for sync`);
}
return full as SyncedFullModel;
}
export function resolveHuggingFaceBaseModel(id: string) {
const [prefix, ...parts] = id.split("/");
if (prefix === undefined || parts.length === 0) return undefined;
const canonicalPrefix = CANONICAL_ORG_PREFIXES[prefix];
if (canonicalPrefix === undefined) return resolveCanonicalBaseModel(id);
return resolveCanonicalBaseModel(`${canonicalPrefix}/${parts.join("/").toLowerCase()}`);
}
@@ -0,0 +1,217 @@
import { z } from "zod";
import { inferKimiFamily, ModelFamilyValues } from "../../family.js";
import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "../index.js";
import { factorBaseModel } from "./openrouter.js";
const API_ENDPOINT = "https://api.llmgateway.io/v1/models";
const Pricing = z.object({
prompt: z.string().optional(),
completion: z.string().optional(),
internal_reasoning: z.string().optional(),
input_cache_read: z.string().optional(),
input_cache_write: z.string().optional(),
});
export const LLMGatewayModel = z.object({
id: z.string(),
name: z.string(),
created: z.number(),
family: z.string().optional(),
architecture: z.object({
input_modalities: z.array(z.string()),
output_modalities: z.array(z.string()),
}),
pricing: Pricing,
context_length: z.number(),
supported_parameters: z.array(z.string()),
structured_outputs: z.boolean().optional(),
}).passthrough();
export const LLMGatewayResponse = z.object({
data: z.array(LLMGatewayModel),
}).passthrough();
export type LLMGatewayModel = z.infer<typeof LLMGatewayModel>;
export const llmgateway = {
id: "llmgateway",
name: "LLM Gateway",
modelsDir: "providers/llmgateway/models",
async fetchModels() {
const headers = process.env.LLMGATEWAY_API_KEY
? { Authorization: `Bearer ${process.env.LLMGATEWAY_API_KEY}` }
: undefined;
const response = await fetch(API_ENDPOINT, { headers });
if (!response.ok) {
throw new Error(`LLM Gateway request failed: ${response.status} ${response.statusText}`);
}
return response.json();
},
parseModels(raw) {
return LLMGatewayResponse.parse(raw).data.filter((model) => {
const output = model.architecture.output_modalities;
return output.length === 1 && output[0] === "text";
});
},
translateModel(model, context) {
return {
id: model.id,
model: buildLLMGatewayModel(model, context.existing(model.id)),
};
},
} satisfies SyncProvider<LLMGatewayModel>;
function dateFromTimestamp(timestamp: number) {
return new Date(timestamp * 1000).toISOString().slice(0, 10);
}
function price(value: string | undefined) {
if (value === undefined) return undefined;
const number = Number(value);
return Number.isFinite(number) && number >= 0
? Math.round(number * 1_000_000_000_000) / 1_000_000
: undefined;
}
// Cache/reasoning prices are reported as "0" when the gateway has no data; treat
// those as unknown so we never downgrade a hand-authored value to zero.
function nonZeroPrice(value: string | undefined) {
const result = price(value);
return result !== undefined && result > 0 ? result : undefined;
}
type Modality = "text" | "audio" | "image" | "video" | "pdf";
function modalities(values: string[], fallback: Modality[]): Modality[] {
const allowed = new Set<Modality>(["text", "audio", "image", "video", "pdf"]);
const result = values
.map((value) => value.toLowerCase())
.map((value) => (value === "file" ? "pdf" : value))
.filter((value): value is Modality => allowed.has(value as Modality));
return [...new Set(result.length > 0 ? result : fallback)];
}
function inferFamily(model: LLMGatewayModel, name: string) {
const kimiFamily = inferKimiFamily(model.id, name);
if (kimiFamily !== undefined) return kimiFamily;
const target = `${model.id} ${name}`.toLowerCase();
return [...ModelFamilyValues]
.sort((a, b) => b.length - a.length)
.find((family) => {
const value = family.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
if (family === "o") {
return new RegExp(`(^|[^a-z0-9])${value}(?=\\d|$|[^a-z0-9])`).test(target);
}
return new RegExp(`(^|[^a-z0-9])${value}(?=$|[^a-z0-9])`).test(target);
});
}
function buildLLMGatewayModel(
model: LLMGatewayModel,
existing: ExistingModel | undefined,
): SyncedModel {
const prompt = price(model.pricing.prompt);
const completion = price(model.pricing.completion);
const reasoning = model.supported_parameters.includes("reasoning")
|| model.supported_parameters.includes("include_reasoning");
const context = model.context_length > 0
? model.context_length
: existing?.limit?.context ?? model.context_length;
// The gateway is authoritative for the volatile, gateway-specific data — cost
// and served limits. Its supported_parameters / modalities are too noisy to
// drive capability fields (it omits "tools" for flagship models yet lists
// "temperature" for ones the catalog deliberately marks temperature=false),
// so those stay curated: preserved from the existing entry (which, for a
// factored model, inherits its base when the field is absent).
const cost = prompt !== undefined && completion !== undefined
? {
input: prompt,
output: completion,
reasoning: reasoning ? nonZeroPrice(model.pricing.internal_reasoning) ?? existing?.cost?.reasoning : existing?.cost?.reasoning,
cache_read: nonZeroPrice(model.pricing.input_cache_read) ?? existing?.cost?.cache_read,
cache_write: nonZeroPrice(model.pricing.input_cache_write) ?? existing?.cost?.cache_write,
tiers: existing?.cost?.tiers,
}
: existing?.cost;
const limit = {
context,
input: existing?.limit?.input,
output: existing?.limit?.output ?? context,
};
// Existing factored model: refresh cost + limit, keep every authored override
// as-is (undefined fields keep inheriting the base model).
if (existing?.base_model !== undefined) {
return factorBaseModel(
existing.base_model,
{
attachment: existing.attachment,
reasoning: existing.reasoning,
temperature: existing.temperature,
tool_call: existing.tool_call,
structured_output: existing.structured_output,
status: existing.status,
interleaved: existing.interleaved,
knowledge: existing.knowledge,
modalities: existing.modalities,
limit,
cost,
},
limit,
existing.base_model_omit,
);
}
// Existing full model: refresh cost + limit, preserve curated metadata.
if (existing !== undefined) {
return {
name: existing.name ?? model.name,
family: existing.family,
release_date: existing.release_date ?? dateFromTimestamp(model.created),
last_updated: existing.last_updated ?? dateFromTimestamp(model.created),
attachment: existing.attachment ?? false,
reasoning: existing.reasoning ?? false,
temperature: existing.temperature ?? false,
tool_call: existing.tool_call ?? false,
structured_output: existing.structured_output,
knowledge: existing.knowledge,
open_weights: existing.open_weights ?? false,
status: existing.status,
interleaved: existing.interleaved,
cost,
limit,
modalities: existing.modalities ?? defaultModalities(model),
} satisfies SyncedFullModel;
}
// Brand-new model: best-effort translation from the gateway. Capability and
// modality data are unreliable here and should be hand-reviewed.
const { input, output } = defaultModalities(model);
return {
name: model.name,
family: inferFamily(model, model.name),
release_date: dateFromTimestamp(model.created),
last_updated: dateFromTimestamp(model.created),
attachment: input.some((value) => value !== "text"),
reasoning,
temperature: model.supported_parameters.includes("temperature"),
tool_call: model.supported_parameters.includes("tools")
|| model.supported_parameters.includes("tool_choice"),
structured_output: model.structured_outputs ?? false,
open_weights: false,
cost,
limit,
modalities: { input, output },
} satisfies SyncedFullModel;
}
function defaultModalities(model: LLMGatewayModel) {
return {
input: modalities(model.architecture.input_modalities, ["text"]),
output: modalities(model.architecture.output_modalities, ["text"]),
};
}
@@ -7,6 +7,7 @@ import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "
const API_ENDPOINT = "https://openrouter.ai/api/v1/models";
const MODELS_DIR = path.join(import.meta.dirname, "..", "..", "..", "..", "..", "models");
const MODEL_NAME_BLACKLIST = ["fable-5"];
const modelMetadataByID = new Map<string, Record<string, unknown>>();
const modelMetadataFilesByProvider = new Map<string, Set<string>>();
@@ -79,7 +80,10 @@ export const openrouter = {
return response.json();
},
parseModels(raw) {
return OpenRouterResponse.parse(raw).data;
return OpenRouterResponse.parse(raw).data.filter((model) => {
const name = `${model.id} ${model.name}`.toLowerCase();
return MODEL_NAME_BLACKLIST.every((value) => !name.includes(value));
});
},
translateModel(model, context) {
return {
+23 -6
View File
@@ -6,7 +6,16 @@ import { factorBaseModel, resolveCanonicalBaseModel } from "./openrouter.js";
const API_ENDPOINT = "https://ai-gateway.vercel.sh/v1/models";
const ModelType = z.enum(["language", "embedding", "image", "video", "reranking"]);
const ModelType = z.enum([
"language",
"embedding",
"image",
"video",
"reranking",
"transcription",
"speech",
"realtime",
]);
const PricingTier = z.object({
cost: z.string(),
@@ -30,8 +39,8 @@ export const VercelModel = z.object({
name: z.string(),
created: z.number(),
released: z.number().optional(),
context_window: z.number(),
max_tokens: z.number(),
context_window: z.number().optional().default(0),
max_tokens: z.number().optional().default(0),
type: ModelType,
tags: z.array(z.string()).optional().default([]),
pricing: Pricing.optional(),
@@ -107,9 +116,17 @@ export function buildVercelModel(model: VercelModel, existing: ExistingModel | u
cost,
limit: { context, input, output },
modalities: {
input: ["text", tags.has("vision") ? "image" : undefined, tags.has("file-input") ? "pdf" : undefined]
.filter((value): value is "text" | "image" | "pdf" => value !== undefined),
output: model.type === "image"
input: model.type === "transcription"
? ["audio"]
: model.type === "realtime"
? ["text", "audio"]
: ["text", tags.has("vision") ? "image" : undefined, tags.has("file-input") ? "pdf" : undefined]
.filter((value): value is "text" | "image" | "pdf" => value !== undefined),
output: model.type === "speech"
? ["audio"]
: model.type === "realtime"
? ["text", "audio"]
: model.type === "image"
? ["image"]
: model.type === "video"
? ["video"]
-150
View File
@@ -1,150 +0,0 @@
import { afterEach, expect, test } from "bun:test";
import path from "node:path";
import { mkdir, mkdtemp } from "node:fs/promises";
import os from "node:os";
import { syncProvider } from "../src/sync/index.js";
import {
BasetenResponse,
baseten,
buildBasetenModel,
fetchBasetenModels,
type BasetenModel,
} from "../src/sync/providers/baseten.js";
const catalogModel: BasetenModel = {
id: "zai-org/GLM-5.1",
name: "GLM 5.1",
context_length: 128_000,
max_completion_tokens: 32_000,
input_modalities: ["text"],
output_modalities: ["text"],
pricing: {
prompt: "0.00000012",
completion: "0.0000005",
},
supported_features: ["reasoning", "reasoning_effort", "tools", "structured_outputs"],
supported_sampling_parameters: ["temperature", "top_p"],
};
const newCatalogModel: BasetenModel = {
...catalogModel,
};
afterEach(() => {
baseten.modelsDir = "providers/baseten/models";
baseten.fetchModels = async () => {
const key = process.env.BASETEN_API_KEY;
if (key === undefined) throw new Error("Baseten sync requires BASETEN_API_KEY");
return fetchBasetenModels(key);
};
});
test("Baseten maps authoritative fields and preserves curated metadata", () => {
const synced = buildBasetenModel(catalogModel, {
name: "Old name",
release_date: "2025-08-05",
last_updated: "2025-09-01",
attachment: false,
reasoning: true,
reasoning_options: [{ type: "effort", values: ["low", "high"] }],
tool_call: true,
open_weights: true,
status: "deprecated",
interleaved: { field: "reasoning_content" },
base_model: "zhipuai/glm-5.1",
base_model_omit: ["limit.input"],
cost: { input: 0.1, output: 0.4, cache_write: 0.2 },
limit: { context: 64_000, output: 16_000 },
modalities: { input: ["text"], output: ["text"] },
});
expect(synced).toMatchObject({
base_model: "zhipuai/glm-5.1",
base_model_omit: ["limit.input"],
reasoning_options: [{ type: "effort", values: ["low", "high"] }],
status: "deprecated",
interleaved: { field: "reasoning_content" },
cost: { input: 0.12, output: 0.5, cache_write: 0.2 },
limit: { context: 128_000, output: 32_000 },
});
});
test("Baseten preserves curated reasoning when an opt-in capability is omitted", () => {
const synced = buildBasetenModel({
...catalogModel,
supported_features: ["tools", "structured_outputs"],
}, {
name: "GLM 5.1",
release_date: "2026-05-20",
last_updated: "2026-05-20",
attachment: false,
reasoning: true,
reasoning_options: [{ type: "toggle" }],
tool_call: true,
open_weights: true,
cost: { input: 1, output: 4 },
limit: { context: 100_000, output: 50_000 },
modalities: { input: ["text"], output: ["text"] },
});
expect(synced).toMatchObject({
reasoning: true,
reasoning_options: [{ type: "toggle" }],
});
});
test("Baseten sync adds exact base models, retains missing entries, and is idempotent", async () => {
const root = await mkdtemp(path.join(os.tmpdir(), "models-dev-baseten-"));
const modelsDir = path.join(root, "providers", "baseten", "models");
const metadataDir = path.join(root, "models", "zhipuai");
await mkdir(path.join(modelsDir, "stale"), { recursive: true });
await mkdir(metadataDir, { recursive: true });
await Bun.write(
path.join(metadataDir, "glm-5.1.toml"),
Bun.file(path.join(import.meta.dirname, "../../../models/zhipuai/glm-5.1.toml")),
);
await Bun.write(path.join(modelsDir, "stale", "model.toml"), [
'name = "Retained"',
'release_date = "2025-01-01"',
'last_updated = "2025-01-01"',
"attachment = false",
"reasoning = false",
"tool_call = false",
"open_weights = false",
"[cost]",
"input = 1",
"output = 1",
"[limit]",
"context = 1000",
"output = 100",
"[modalities]",
'input = ["text"]',
'output = ["text"]',
"",
].join("\n"));
baseten.modelsDir = modelsDir;
baseten.fetchModels = async () => ({ data: [newCatalogModel] });
const first = await syncProvider(baseten);
const second = await syncProvider(baseten);
expect(first.created).toBe(1);
expect(first.deleted).toBe(0);
expect(first.notices.join(" ")).toContain("stale/model.toml");
expect(second).toMatchObject({ created: 0, updated: 0, deleted: 0 });
});
test("Baseten rejects malformed catalog responses", () => {
expect(() => BasetenResponse.parse({ data: "broken" })).toThrow();
});
test("Baseten rejects non-success API responses", async () => {
const fetcher = async () => new Response("unauthorized", {
status: 401,
statusText: "Unauthorized",
});
expect(fetchBasetenModels("fixture-key", fetcher as typeof fetch))
.rejects.toThrow("Baseten models request failed: 401 Unauthorized");
});
@@ -1,35 +0,0 @@
import { expect, test } from "bun:test";
import { buildWorkersAiModel } from "../src/sync/providers/cloudflare-workers-ai.js";
import type { OpenRouterModel } from "../src/sync/providers/openrouter.js";
test("Cloudflare Workers AI sync preserves reasoning options", () => {
const model: OpenRouterModel = {
id: "@cf/nvidia/nemotron-3-120b-a12b",
name: "Nemotron 3 Super 120B",
created: 1_773_187_200,
hugging_face_id: "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16",
knowledge_cutoff: null,
context_length: 256_000,
architecture: {
input_modalities: ["text"],
output_modalities: ["text"],
},
pricing: {
prompt: "0.0000005",
completion: "0.0000015",
},
top_provider: {
context_length: 256_000,
max_completion_tokens: 256_000,
},
supported_parameters: ["reasoning", "tools", "temperature"],
};
const synced = buildWorkersAiModel(model, {
base_model: "nvidia/nemotron-3-super-120b-a12b",
reasoning_options: [{ type: "toggle" }],
});
expect(synced.reasoning_options).toEqual([{ type: "toggle" }]);
});
-35
View File
@@ -1,35 +0,0 @@
import { expect, test } from "bun:test";
import { buildGoogleModel } from "../src/sync/providers/google.js";
test("Google sync keeps base models compact", () => {
const synced = buildGoogleModel({
name: "models/gemini-3-pro-image-preview",
displayName: "Nano Banana Pro",
inputTokenLimit: 131_072,
outputTokenLimit: 32_768,
temperature: 1,
thinking: true,
}, {
base_model: "google/gemini-3-pro-image-preview",
name: "Nano Banana Pro",
family: "gemini-pro",
release_date: "2025-11-20",
last_updated: "2025-11-20",
attachment: true,
reasoning: true,
temperature: true,
tool_call: false,
knowledge: "2025-01",
open_weights: false,
cost: { input: 2, output: 120 },
limit: { context: 65_536, output: 32_768 },
modalities: { input: ["text", "image"], output: ["text", "image"] },
});
expect(synced).toEqual({
base_model: "google/gemini-3-pro-image-preview",
cost: { input: 2, output: 120 },
limit: { context: 131_072 },
});
});
-121
View File
@@ -1,121 +0,0 @@
import { expect, test } from "bun:test";
import { preserveBaseModel } from "../src/sync/index.js";
import { resolveCloudflareBaseModel } from "../src/sync/providers/cloudflare-workers-ai.js";
import { buildOpenRouterModel, type OpenRouterModel } from "../src/sync/providers/openrouter.js";
test("OpenRouter z-ai models inherit from zhipuai metadata", () => {
const model: OpenRouterModel = {
id: "z-ai/glm-5.1",
name: "Z.AI: GLM-5.1",
created: 1_777_680_000,
hugging_face_id: "zai-org/GLM-5.1",
knowledge_cutoff: null,
context_length: 200_000,
architecture: {
input_modalities: ["text"],
output_modalities: ["text"],
},
pricing: {
prompt: "0.0000014",
completion: "0.0000044",
},
top_provider: {
context_length: 200_000,
max_completion_tokens: 131_072,
},
supported_parameters: ["tools", "tool_choice", "temperature", "structured_outputs"],
};
const synced = buildOpenRouterModel(model, undefined);
expect("base_model" in synced ? synced.base_model : undefined).toBe("zhipuai/glm-5.1");
});
test("OpenRouter-derived syncs preserve existing base model links", () => {
const model: OpenRouterModel = {
id: "@cf/nvidia/nemotron-3-120b-a12b",
name: "Nemotron 3 Super 120B",
created: 1_773_187_200,
hugging_face_id: "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16",
knowledge_cutoff: null,
context_length: 256_000,
architecture: {
input_modalities: ["text"],
output_modalities: ["text"],
},
pricing: {
prompt: "0.0000005",
completion: "0.0000015",
},
top_provider: {
context_length: 256_000,
max_completion_tokens: 256_000,
},
supported_parameters: ["reasoning", "tools", "temperature", "structured_outputs"],
};
const synced = preserveBaseModel(buildOpenRouterModel(model, undefined), {
base_model: "nvidia/nemotron-3-super-120b-a12b",
base_model_omit: ["limit.input"],
});
expect("base_model" in synced ? synced.base_model : undefined)
.toBe("nvidia/nemotron-3-super-120b-a12b");
expect("base_model_omit" in synced ? synced.base_model_omit : undefined)
.toEqual(["limit.input"]);
});
test("newly detected base models do not replace existing links", () => {
const model: OpenRouterModel = {
id: "z-ai/glm-5.1",
name: "Z.AI: GLM-5.1",
created: 1_777_680_000,
hugging_face_id: null,
knowledge_cutoff: null,
context_length: 200_000,
architecture: { input_modalities: ["text"], output_modalities: ["text"] },
pricing: { prompt: "0.0000014", completion: "0.0000044" },
top_provider: { context_length: 200_000, max_completion_tokens: 131_072 },
supported_parameters: ["tools"],
};
const synced = buildOpenRouterModel(model, {
base_model: "zhipuai/glm-5",
});
expect("base_model" in synced ? synced.base_model : undefined).toBe("zhipuai/glm-5");
});
test("undefined translated links preserve existing base model fields", () => {
const synced = preserveBaseModel({
base_model: undefined,
} as never, {
base_model: "nvidia/nemotron-3-super-120b-a12b",
base_model_omit: ["limit.input"],
});
expect("base_model" in synced ? synced.base_model : undefined)
.toBe("nvidia/nemotron-3-super-120b-a12b");
expect("base_model_omit" in synced ? synced.base_model_omit : undefined)
.toEqual(["limit.input"]);
});
test("new Cloudflare models discover a unique metadata base model", () => {
const model: OpenRouterModel = {
id: "@cf/nvidia/nemotron-3-120b-a12b",
name: "Nemotron 3 Super 120B",
created: 1_773_187_200,
hugging_face_id: null,
knowledge_cutoff: null,
context_length: 256_000,
architecture: { input_modalities: ["text"], output_modalities: ["text"] },
pricing: { prompt: "0.0000005", completion: "0.0000015" },
top_provider: { context_length: 256_000, max_completion_tokens: 256_000 },
supported_parameters: ["reasoning"],
};
expect(resolveCloudflareBaseModel(model)).toBe("nvidia/nemotron-3-super-120b-a12b");
const synced = buildOpenRouterModel(model, undefined, resolveCloudflareBaseModel(model));
expect("base_model" in synced ? synced.base_model : undefined)
.toBe("nvidia/nemotron-3-super-120b-a12b");
});
-227
View File
@@ -1,227 +0,0 @@
import { expect, test } from "bun:test";
import path from "node:path";
import { mkdtemp, mkdir, readlink, symlink } from "node:fs/promises";
import os from "node:os";
import { AuthoredModelShape } from "../src/schema.js";
import { syncProvider, type SyncProvider, type SyncedFullModel } from "../src/sync/index.js";
const model: SyncedFullModel = {
name: "Test model",
release_date: "2026-01-01",
last_updated: "2026-01-01",
attachment: false,
reasoning: false,
tool_call: false,
open_weights: false,
cost: { input: 1, output: 2 },
limit: { context: 1_000, output: 100 },
modalities: { input: ["text"], output: ["text"] },
};
test("reasoning budgets allow only the -1 negative sentinel", () => {
const authored = { id: "model", ...model };
expect(AuthoredModelShape.safeParse({
...authored,
reasoning_options: [{ type: "budget_tokens", min: -1, max: 32_768 }],
}).success).toBe(true);
expect(AuthoredModelShape.safeParse({
...authored,
reasoning_options: [{ type: "budget_tokens", min: -2, max: 32_768 }],
}).success).toBe(false);
});
test("reasoning efforts accept the provider default value", () => {
expect(AuthoredModelShape.safeParse({
id: "model",
...model,
reasoning: true,
reasoning_options: [{ type: "effort", values: ["none", "default"] }],
}).success).toBe(true);
});
async function fixture() {
const root = await mkdtemp(path.join(os.tmpdir(), "models-dev-sync-"));
const modelsDir = path.join(root, "providers", "test", "models");
await mkdir(modelsDir, { recursive: true });
return { root, modelsDir };
}
function provider(
modelsDir: string,
ids: string[],
deleteMissing = true,
preserveSymlinks = false,
): SyncProvider<string> {
return {
id: "test",
name: "Test",
modelsDir,
deleteMissing,
preserveSymlinks,
missingNotice: (paths) => paths.map((item) => `missing: ${item}`),
async fetchModels() {
return ids;
},
parseModels(raw) {
return raw as string[];
},
translateModel(id) {
return { id, model };
},
};
}
test("sync repairs a broken symlink returned by the source", async () => {
const { modelsDir } = await fixture();
const filePath = path.join(modelsDir, "model.toml");
await symlink("missing.toml", filePath);
const result = await syncProvider(provider(modelsDir, ["model"]));
expect(result.created).toBe(1);
expect(await Bun.file(filePath).text()).toContain('name = "Test model"');
expect(readlink(filePath)).rejects.toThrow();
});
test("sync preserves valid symlink aliases when configured", async () => {
const { root, modelsDir } = await fixture();
const targetPath = path.join(root, "target.toml");
const filePath = path.join(modelsDir, "model.toml");
await Bun.write(targetPath, `name = "Alias target"\n`);
await symlink(targetPath, filePath);
const result = await syncProvider(provider(modelsDir, ["model"], true, true));
expect(result.updated).toBe(0);
expect(await readlink(filePath)).toBe(targetPath);
});
test("sync removes a broken symlink absent from the source", async () => {
const { modelsDir } = await fixture();
const filePath = path.join(modelsDir, "model.toml");
await symlink("missing.toml", filePath);
const result = await syncProvider(provider(modelsDir, []));
expect(result.deleted).toBe(1);
expect(await Bun.file(filePath).exists()).toBe(false);
});
test("non-deleting sync reports missing broken symlinks", async () => {
const { modelsDir } = await fixture();
const filePath = path.join(modelsDir, "model.toml");
await symlink("missing.toml", filePath);
const result = await syncProvider(provider(modelsDir, [], false));
expect(result.deleted).toBe(0);
expect(result.notices).toEqual(["missing: model.toml"]);
expect(await readlink(filePath)).toBe("missing.toml");
});
test("sync preserves authored reasoning options omitted by a translator", async () => {
const { modelsDir } = await fixture();
const filePath = path.join(modelsDir, "model.toml");
await Bun.write(filePath, `name = "Old name"
release_date = "2026-01-01"
last_updated = "2026-01-01"
attachment = false
reasoning = true
tool_call = false
open_weights = false
[[reasoning_options]]
type = "effort"
values = ["low", "high"]
[[reasoning_options]]
type = "budget_tokens"
min = -1
max = 32768
[cost]
input = 1
output = 2
[limit]
context = 1000
output = 100
[modalities]
input = ["text"]
output = ["text"]
`);
const sync = provider(modelsDir, ["model"]);
sync.translateModel = (id) => ({
id,
model: { ...model, reasoning: true },
});
const first = await syncProvider(sync);
const content = await Bun.file(filePath).text();
const second = await syncProvider(sync);
expect(first.updated).toBe(1);
expect(content).toContain("[[reasoning_options]]");
expect(content).toContain('values = ["low", "high"]');
expect(content).toContain("min = -1");
expect(content).toContain("max = 32_768");
expect(second.updated).toBe(0);
expect(second.unchanged).toBe(1);
});
test("sync writes metadata returned by a provider translator", async () => {
const root = await mkdtemp(path.join(os.tmpdir(), "models-dev-sync-metadata-"));
const modelsDir = path.join(root, "providers", "test", "models");
await mkdir(modelsDir, { recursive: true });
const sync = provider(modelsDir, ["model"]);
sync.translateModel = () => ({
id: "model",
model: {
base_model: "test/model",
reasoning_options: [],
cost: { input: 1, output: 2 },
},
metadata: {
id: "test/model",
model: {
name: "Model",
release_date: "2026-06-10",
last_updated: "2026-06-10",
attachment: false,
reasoning: false,
tool_call: true,
open_weights: false,
limit: { context: 1_000, output: 100 },
modalities: { input: ["text"], output: ["text"] },
},
},
});
const first = await syncProvider(sync);
const second = await syncProvider(sync);
expect(first).toMatchObject({ created: 2, updated: 0 });
expect(second).toMatchObject({ created: 0, updated: 0 });
expect(await Bun.file(path.join(root, "models", "test", "model.toml")).text()).toContain('name = "Model"');
});
test("sync removes missing metadata only from its owned namespace", async () => {
const { root, modelsDir } = await fixture();
const ownedDir = path.join(root, "models", "test");
const otherDir = path.join(root, "models", "other");
await mkdir(ownedDir, { recursive: true });
await mkdir(otherDir, { recursive: true });
await Bun.write(path.join(ownedDir, "stale.toml"), 'name = "Stale"\n');
await Bun.write(path.join(otherDir, "retained.toml"), 'name = "Retained"\n');
const sync = provider(modelsDir, []);
sync.metadataNamespace = "test";
const result = await syncProvider(sync);
expect(result.deleted).toBe(1);
expect(await Bun.file(path.join(ownedDir, "stale.toml")).exists()).toBe(false);
expect(await Bun.file(path.join(otherDir, "retained.toml")).exists()).toBe(true);
});
+49
View File
@@ -0,0 +1,49 @@
import { expect, test } from "bun:test";
import { formatToml } from "../src/sync/index.js";
test("formats interleaved as a root field before reasoning option tables", () => {
const content = formatToml({
id: "example/model",
name: "Example Model",
release_date: "2026-01-01",
last_updated: "2026-01-01",
attachment: false,
reasoning: true,
reasoning_options: [{ type: "toggle" }],
tool_call: true,
interleaved: true,
open_weights: false,
cost: { input: 1, output: 2 },
limit: { context: 1_000, output: 100 },
modalities: { input: ["text"], output: ["text"] },
});
expect(Bun.TOML.parse(content)).toMatchObject({
interleaved: true,
reasoning_options: [{ type: "toggle" }],
});
});
test("formats empty reasoning options outside the interleaved table", () => {
const content = formatToml({
id: "example/model",
name: "Example Model",
release_date: "2026-01-01",
last_updated: "2026-01-01",
attachment: false,
reasoning: true,
reasoning_options: [],
tool_call: true,
interleaved: { field: "reasoning_content" },
open_weights: false,
cost: { input: 1, output: 2 },
limit: { context: 1_000, output: 100 },
modalities: { input: ["text"], output: ["text"] },
});
expect(Bun.TOML.parse(content)).toMatchObject({
interleaved: { field: "reasoning_content" },
reasoning_options: [],
});
});
-167
View File
@@ -1,167 +0,0 @@
import { expect, test } from "bun:test";
import { readdirSync } from "node:fs";
import path from "node:path";
import {
buildVeniceModel,
resolveVeniceBaseModel,
venice,
VeniceResponse,
type VeniceModel,
} from "../src/sync/providers/venice.js";
const catalogModel: VeniceModel = {
id: "openai-gpt-54",
created: 1_772_668_800,
model_spec: {
name: "GPT-5.4",
availableContextTokens: 400_000,
maxCompletionTokens: 128_000,
modelSource: "OpenAI",
capabilities: {
supportsVision: true,
supportsReasoning: true,
supportsReasoningEffort: true,
reasoningEffortOptions: ["none", "low", "medium", "high"],
supportsFunctionCalling: true,
supportsResponseSchema: true,
},
pricing: {
input: { usd: 3.13 },
output: { usd: 18.75 },
cache_input: { usd: 0.313 },
extended: {
context_token_threshold: 200_000,
input: { usd: 6.26 },
output: { usd: 28.125 },
},
},
},
};
test("Venice resolves flattened IDs to canonical metadata", () => {
expect(resolveVeniceBaseModel("openai-gpt-54", "GPT-5.4")).toBe("openai/gpt-5.4");
expect(resolveVeniceBaseModel("claude-opus-4-8-fast", "Claude Opus 4.8 Fast"))
.toBe("anthropic/claude-opus-4-8");
});
test("Venice emits empty reasoning options when efforts are unavailable", () => {
const synced = buildVeniceModel({
...catalogModel,
id: "reasoning-without-efforts",
model_spec: {
...catalogModel.model_spec,
name: "Reasoning Without Efforts",
capabilities: {
...catalogModel.model_spec.capabilities,
reasoningEffortOptions: [],
},
},
}, undefined, undefined, "2026-06-10");
expect(synced).toMatchObject({ reasoning: true, reasoning_options: [] });
});
test("Venice does not infer temperature support", () => {
const synced = buildVeniceModel(catalogModel, undefined, null, "2026-06-10");
expect(synced.temperature).toBeUndefined();
});
test("Venice skips E2EE models", () => {
const translated = venice.translateModel({
...catalogModel,
id: "e2ee-test-model",
model_spec: {
...catalogModel.model_spec,
capabilities: { ...catalogModel.model_spec.capabilities, supportsE2EE: true },
},
}, { existing: () => undefined });
expect(translated).toBeUndefined();
});
test("Venice uses boundary-aware family matching", () => {
const synced = buildVeniceModel({
...catalogModel,
id: "google-gemma-4-31b-it",
model_spec: { ...catalogModel.model_spec, name: "Google Gemma 4 31B Instruct" },
}, undefined, null, "2026-06-10");
expect(synced).toMatchObject({ family: "gemma" });
});
test("Venice maps API fields without bumping inherited model timestamps", () => {
const synced = buildVeniceModel(catalogModel, {
base_model: "openai/gpt-5.4",
name: "GPT-5.4",
family: "gpt",
release_date: "2026-03-05",
last_updated: "2026-03-09",
attachment: true,
reasoning: true,
tool_call: true,
structured_output: true,
temperature: true,
open_weights: false,
interleaved: { field: "reasoning_content" },
cost: { input: 3, output: 18, input_audio: 4 },
limit: { context: 400_000, output: 128_000 },
modalities: { input: ["text", "image", "pdf"], output: ["text"] },
}, "openai/gpt-5.4", "2026-06-10");
expect(synced).toMatchObject({
base_model: "openai/gpt-5.4",
base_model_omit: ["limit.input"],
last_updated: "2026-03-09",
reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }],
interleaved: { field: "reasoning_content" },
cost: {
input: 3.13,
output: 18.75,
cache_read: 0.313,
input_audio: 4,
tiers: [{ tier: { type: "context", size: 200_000 }, input: 6.26, output: 28.125 }],
},
});
expect(synced).not.toHaveProperty("family");
expect(synced).not.toHaveProperty("release_date");
expect(synced).not.toHaveProperty("open_weights");
expect(synced).not.toHaveProperty("modalities");
expect(synced).not.toHaveProperty("temperature");
});
test("Venice preserves last_updated when authoritative data is unchanged", () => {
const providerModel = {
...catalogModel,
id: "venice-only-test-model",
model_spec: { ...catalogModel.model_spec, name: "Venice Only Test Model" },
};
const full = buildVeniceModel(providerModel, undefined, undefined, "2026-06-10");
if ("base_model" in full) throw new Error("Expected a full provider model fixture");
const synced = buildVeniceModel(providerModel, full, undefined, "2026-06-11");
expect(synced).toMatchObject({ last_updated: "2026-06-10" });
});
test("Venice rejects malformed responses", () => {
expect(() => VeniceResponse.parse({ data: [{ id: "broken" }] })).toThrow();
});
test("Venice models use only canonical metadata and declare reasoning options", async () => {
const root = path.join(import.meta.dirname, "..", "..", "..");
const modelsDir = path.join(root, "providers", "venice", "models");
for (const file of readdirSync(modelsDir).filter((item) => item.endsWith(".toml"))) {
const model = Bun.TOML.parse(await Bun.file(path.join(modelsDir, file)).text()) as {
base_model?: string;
reasoning_options?: unknown[];
};
expect(model.reasoning_options, file).toBeDefined();
if (model.base_model !== undefined) {
expect(model.base_model.startsWith("venice/"), file).toBe(false);
expect(await Bun.file(path.join(root, "models", `${model.base_model}.toml`)).exists(), file).toBe(true);
}
expect(file.startsWith("e2ee-"), file).toBe(false);
}
});
-113
View File
@@ -1,113 +0,0 @@
import { expect, test } from "bun:test";
import { buildVercelModel, type VercelModel, vercel } from "../src/sync/providers/vercel.js";
const model: VercelModel = {
id: "openai/gpt-test",
name: "GPT Test",
created: 1_700_000_000,
released: 1_710_000_000,
context_window: 128_000,
max_tokens: 32_000,
type: "language",
tags: ["reasoning", "tool-use", "vision", "file-input"],
pricing: {
input: "0.000001",
output: "0.000004",
input_cache_read: "0.0000001",
},
};
test("Vercel models translate gateway metadata", () => {
const synced = buildVercelModel(model, undefined);
expect(synced).toMatchObject({
name: "GPT Test",
release_date: "2024-03-09",
last_updated: "2024-03-09",
attachment: true,
reasoning: true,
tool_call: true,
open_weights: false,
cost: { input: 1, output: 4, cache_read: 0.1 },
limit: { context: 128_000, input: 96_000, output: 32_000 },
modalities: { input: ["text", "image", "pdf"], output: ["text"] },
});
});
test("Vercel models preserve curated metadata and missing limits", () => {
const synced = buildVercelModel({
...model,
context_window: 0,
max_tokens: 0,
}, {
name: "Curated name",
release_date: "2024-01-01",
last_updated: "2025-01-01",
reasoning_options: [{ type: "effort", values: ["low", "high"] }],
cost: {
input: 2,
output: 8,
tiers: [{
tier: { type: "context", size: 200_000 },
input: 3,
output: 12,
}],
},
limit: { context: 64_000, input: 48_000, output: 16_000 },
});
expect(synced.name).toBe("Curated name");
expect(synced.last_updated).toBe("2025-01-01");
expect(synced.reasoning_options).toEqual([{ type: "effort", values: ["low", "high"] }]);
expect(synced.cost?.tiers).toHaveLength(1);
expect(synced.limit).toEqual({ context: 64_000, input: 48_000, output: 16_000 });
});
test("Vercel non-language models use API tool capabilities", () => {
const synced = buildVercelModel({
...model,
type: "image",
tags: [],
}, {
tool_call: true,
});
expect(synced.tool_call).toBe(false);
});
test("Vercel sync includes non-language model types", () => {
for (const [type, output] of [
["image", ["image"]],
["video", ["video"]],
["reranking", ["text"]],
] as const) {
const source = {
...model,
id: `test/${type}`,
type,
tags: [],
context_window: 0,
max_tokens: 0,
pricing: undefined,
};
expect(vercel.translateModel(source, { existing: () => undefined })).toBeDefined();
expect(buildVercelModel(source, undefined)).toMatchObject({
tool_call: false,
modalities: { input: ["text"], output },
});
}
});
test("Vercel models use canonical metadata when available", () => {
const synced = buildVercelModel({
...model,
id: "nvidia/nemotron-3-ultra-550b-a55b",
name: "Nemotron 3 Ultra",
}, undefined);
expect("base_model" in synced ? synced.base_model : undefined)
.toBe("nvidia/nemotron-3-ultra-550b-a55b");
expect("last_updated" in synced ? synced.last_updated : undefined).toBeUndefined();
});
-30
View File
@@ -1,30 +0,0 @@
import { expect, test } from "bun:test";
import { buildXAIModel, type XAIModel } from "../src/sync/providers/xai.js";
const model: XAIModel = {
id: "grok-test",
created: 1_700_000_000,
input_modalities: ["text"],
output_modalities: ["text"],
prompt_text_token_price: 10_000,
completion_text_token_price: 20_000,
};
test("xAI sync preserves reasoning options", () => {
const synced = buildXAIModel(model, {
name: "Grok Test",
release_date: "2024-01-01",
last_updated: "2024-01-01",
attachment: false,
reasoning: true,
reasoning_options: [{ type: "effort", values: ["none", "high"] }],
tool_call: true,
open_weights: false,
limit: { context: 2_000_000, output: 30_000 },
modalities: { input: ["text"], output: ["text"] },
});
expect(synced.reasoning_options).toEqual([{ type: "effort", values: ["none", "high"] }]);
expect(synced.limit?.context).toBe(2_000_000);
});
@@ -4,6 +4,7 @@ release_date = "2025-10-16"
last_updated = "2025-10-16"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-10-16"
last_updated = "2025-10-16"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-05-27"
last_updated = "2025-05-27"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-08-05"
last_updated = "2025-08-05"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 31999 }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-05-22"
last_updated = "2025-05-22"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 31999 }]
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-11-25"
last_updated = "2025-11-25"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-11-25"
last_updated = "2025-11-25"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["low", "medium", "high"] }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-11-25"
last_updated = "2025-11-25"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["low", "medium", "high"] }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2026-02-06"
last_updated = "2026-03-13"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2026-02-06"
last_updated = "2026-03-13"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["low", "medium", "high", "max"] }, { type = "budget_tokens", min = 1024, max = 127999 }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2026-04-17"
last_updated = "2026-04-17"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["low", "medium", "high", "xhigh", "max"] }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-05-22"
last_updated = "2025-05-22"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-09-30"
last_updated = "2025-09-30"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-09-30"
last_updated = "2025-09-30"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-09-30"
last_updated = "2025-09-30"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2026-02-18"
last_updated = "2026-03-13"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2026-02-18"
last_updated = "2026-03-13"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "budget_tokens", min = 1024, max = 63999 }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-01-20"
last_updated = "2025-01-20"
attachment = false
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-12-01"
last_updated = "2025-12-01"
attachment = false
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-07-15"
last_updated = "2025-07-15"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-07-29"
last_updated = "2025-07-29"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-07-29"
last_updated = "2025-07-29"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-08-12"
last_updated = "2025-08-12"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-09-30"
last_updated = "2025-09-30"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-12-08"
last_updated = "2025-12-08"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
@@ -4,6 +4,7 @@ release_date = "2026-01-20"
last_updated = "2026-01-20"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-12-22"
last_updated = "2025-12-22"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-03-16"
last_updated = "2026-03-16"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-04-10"
last_updated = "2026-04-10"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-02-12"
last_updated = "2026-02-12"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-04-02"
last_updated = "2026-04-02"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-09-30"
last_updated = "2025-09-30"
attachment = false
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-08-08"
last_updated = "2025-08-08"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["minimal", "low", "medium", "high"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-10-08"
last_updated = "2025-10-08"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["high"] }]
temperature = false
tool_call = true
structured_output = true
@@ -3,6 +3,7 @@ release_date = "2025-08-08"
last_updated = "2025-08-08"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -4,6 +4,7 @@ release_date = "2025-11-14"
last_updated = "2025-11-14"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["medium"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-11-14"
last_updated = "2025-11-14"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high"] }]
temperature = false
tool_call = true
structured_output = true
@@ -4,6 +4,7 @@ release_date = "2025-12-12"
last_updated = "2025-12-12"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["medium"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-12-12"
last_updated = "2025-12-12"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = true
@@ -4,6 +4,7 @@ release_date = "2026-03-19"
last_updated = "2026-03-19"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-03-19"
last_updated = "2026-03-19"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = true
@@ -4,6 +4,7 @@ release_date = "2026-03-19"
last_updated = "2026-03-19"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-03-19"
last_updated = "2026-03-19"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-03-05"
last_updated = "2026-03-05"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = false
+1
View File
@@ -4,6 +4,7 @@ release_date = "2026-03-05"
last_updated = "2026-03-05"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "xhigh"] }]
temperature = false
tool_call = true
structured_output = true
+1
View File
@@ -4,6 +4,7 @@ release_date = "2025-08-08"
last_updated = "2025-08-08"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["minimal", "low", "medium", "high"] }]
temperature = false
tool_call = true
structured_output = true
@@ -3,6 +3,7 @@ release_date = "2025-11-20"
last_updated = "2025-11-20"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-09-23"
last_updated = "2025-09-23"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2026-03-16"
last_updated = "2026-03-16"
attachment = true
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2026-03-16"
last_updated = "2026-03-16"
attachment = true
reasoning = true
reasoning_options = [{ type = "effort", values = ["low", "medium", "high", "xhigh"] }]
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-09-05"
last_updated = "2025-09-05"
attachment = false
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
@@ -3,6 +3,7 @@ release_date = "2025-09-05"
last_updated = "2025-09-05"
attachment = false
reasoning = true
reasoning_options = []
temperature = true
tool_call = true
open_weights = false
+6
View File
@@ -1,5 +1,11 @@
name = "302.AI"
env = ["302AI_API_KEY"]
npm = "@ai-sdk/openai-compatible"
# Reasoning HTTP format (accessed 2026-06-25):
# Audited POST https://api.302.ai/v1/chat/completions. The provider's API guide
# documents model/messages only; no reasoning toggle, effort, or numeric budget
# request field is documented. Do not infer passthrough from upstream APIs.
# Sources:
# https://doc.302.ai/
doc = "https://doc.302.ai"
api = "https://api.302.ai/v1"
+6
View File
@@ -1,5 +1,11 @@
name = "Abacus"
npm = "@ai-sdk/openai-compatible"
# Reasoning HTTP format (accessed 2026-06-25):
# Audited POST https://routellm.abacus.ai/v1/chat/completions. The provider API
# reference documents no reasoning toggle, effort, or numeric budget request
# field. Do not infer behavior from the routed model developer's API.
# Sources:
# https://abacus.ai/help/api
env = ["ABACUS_API_KEY"]
doc = "https://abacus.ai/help/api"
api = "https://routellm.abacus.ai/v1"
@@ -1,4 +1,10 @@
name = "Abliterated Model"
# Reasoning HTTP format (accessed 2026-06-25):
# This model thinks by default. On POST /v1/chat/completions or /v1/messages,
# top-level `thinking: false` skips thinking; omission keeps it enabled.
# Sources:
# https://docs.abliteration.ai/models
# https://docs.abliteration.ai/capabilities/thinking
release_date = "2026-01-06"
last_updated = "2026-01-06"
attachment = true
+7
View File
@@ -1,5 +1,12 @@
name = "abliteration.ai"
env = ["ABLIT_KEY"]
npm = "@ai-sdk/openai-compatible"
# Reasoning HTTP format (accessed 2026-06-25):
# POST /v1/chat/completions and POST /v1/messages: top-level `thinking` is true
# by default; false skips thinking. POST /v1/responses has no thinking toggle.
# No effort or numeric reasoning-budget request field is documented.
# Sources:
# https://docs.abliteration.ai/capabilities/thinking
# https://docs.abliteration.ai/compatibility-matrix
api = "https://api.abliteration.ai/v1"
doc = "https://docs.abliteration.ai/models"
@@ -4,6 +4,7 @@ release_date = "2026-04-24"
last_updated = "2026-04-24"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
structured_output = true
@@ -4,6 +4,7 @@ release_date = "2026-04-24"
last_updated = "2026-04-24"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
structured_output = true
@@ -4,6 +4,7 @@ release_date = "2026-03-27"
last_updated = "2026-03-27"
attachment = false
reasoning = true
reasoning_options = [{ type = "toggle" }]
temperature = true
tool_call = true
structured_output = true
@@ -4,6 +4,7 @@ release_date = "2026-02-05"
last_updated = "2026-03-13"
attachment = true
reasoning = true
reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["low", "medium", "high", "max"] }, { type = "budget_tokens", min = 1_024 }]
temperature = true
tool_call = true
structured_output = true

Some files were not shown because too many files have changed in this diff Show More