From f0da47b6f35b71b7c5e502013fd227a65e4f74c7 Mon Sep 17 00:00:00 2001 From: Lookoff123 Date: Tue, 1 Sep 2026 16:32:47 +0500 Subject: [PATCH 01/38] feat(aimlapi): add AI/ML API provider with catalog sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI/ML API is an aggregator exposing many creators' models behind one OpenAI-compatible key, so it gets a sync provider rather than a hand-written model set. The public catalog needs no key. Only entries served as openai/chat-completions are taken, and of those only the ones whose output is purely text — an id can appear under several endpoint types, and its image or audio surface is a different product. Pricing is quoted as price-per-N-tokens and keyed by origin (provided / generated / cached), which maps onto input / output / cache_read. 163 of the 338 text-output chat models are published here. The rest are skipped by skippedNotice because the catalog does not yet expose a description or an output limit for them; inventing either would be worse than an absent entry. deleteMissing is off since the catalog lists far more than the chat surface, so one response omitting a model is not proof it is gone. Capability flags the catalog does not report (reasoning, tool_call, structured_output, open_weights) keep any value already in the repo instead of being overwritten with a guess. Co-Authored-By: Claude Opus 5 --- package.json | 1 + packages/core/src/sync/index.ts | 4 + packages/core/src/sync/providers/aimlapi.ts | 206 ++++++++++++++++++ providers/aimlapi/logo.svg | 3 + .../Qwen/Qwen2.5-7B-Instruct-Turbo.toml | 23 ++ .../Qwen/Qwen3-235B-A22B-Thinking-2507.toml | 23 ++ .../Qwen3-Coder-480B-A35B-Instruct-FP8.toml | 23 ++ .../models/alibaba/glm-5.2-fast-preview.toml | 24 ++ providers/aimlapi/models/alibaba/glm-5.2.toml | 24 ++ .../aimlapi/models/alibaba/qwen-max.toml | 24 ++ .../aimlapi/models/alibaba/qwen-plus.toml | 24 ++ .../aimlapi/models/alibaba/qwen-turbo.toml | 24 ++ .../qwen3-235b-a22b-thinking-2507.toml | 22 ++ .../aimlapi/models/alibaba/qwen3-32b.toml | 22 ++ .../qwen3-coder-480b-a35b-instruct.toml | 22 ++ .../models/alibaba/qwen3-max-preview.toml | 23 ++ .../aimlapi/models/alibaba/qwen3-max.toml | 23 ++ .../alibaba/qwen3-next-80b-a3b-instruct.toml | 22 ++ .../alibaba/qwen3-next-80b-a3b-thinking.toml | 22 ++ .../alibaba/qwen3-omni-30b-a3b-captioner.toml | 22 ++ .../models/alibaba/qwen3-vl-32b-instruct.toml | 22 ++ .../models/alibaba/qwen3-vl-32b-thinking.toml | 22 ++ .../models/alibaba/qwen3-vl-flash.toml | 23 ++ .../aimlapi/models/alibaba/qwen3-vl-plus.toml | 22 ++ .../aimlapi/models/alibaba/qwen3.5-flash.toml | 23 ++ .../models/alibaba/qwen3.5-plus-20260218.toml | 23 ++ .../aimlapi/models/alibaba/qwen3.5-plus.toml | 23 ++ .../aimlapi/models/alibaba/qwen3.6-flash.toml | 23 ++ .../models/alibaba/qwen3.6-max-preview.toml | 23 ++ .../aimlapi/models/alibaba/qwen3.6-plus.toml | 23 ++ .../aimlapi/models/alibaba/qwen3.7-max.toml | 24 ++ .../aimlapi/models/alibaba/qwen3.7-plus.toml | 24 ++ .../models/alibaba/qwen3.8-2.4t-a95b.toml | 23 ++ .../aimlapi/models/alibaba/qwen3.8-27b.toml | 22 ++ .../aimlapi/models/alibaba/qwen3.8-flash.toml | 23 ++ .../aimlapi/models/alibaba/qwen3.8-max.toml | 24 ++ .../models/anthracite-org/magnum-v4-72b.toml | 22 ++ .../models/anthropic/claude-fable-5.toml | 24 ++ .../anthropic/claude-haiku-4-5-20251001.toml | 24 ++ .../models/anthropic/claude-haiku-4.5.toml | 24 ++ .../anthropic/claude-opus-4-1-20250805.toml | 24 ++ .../anthropic/claude-opus-4-5-20251101.toml | 24 ++ .../models/anthropic/claude-opus-4-6.toml | 24 ++ .../models/anthropic/claude-opus-4-8.toml | 24 ++ .../models/anthropic/claude-opus-4.1.toml | 24 ++ .../models/anthropic/claude-opus-4.5.toml | 24 ++ .../models/anthropic/claude-opus-4.8.toml | 24 ++ .../models/anthropic/claude-opus-5.toml | 24 ++ .../anthropic/claude-sonnet-4-5-20250929.toml | 24 ++ .../models/anthropic/claude-sonnet-4-6.toml | 24 ++ .../models/anthropic/claude-sonnet-4.5.toml | 24 ++ .../models/anthropic/claude-sonnet-4.6.toml | 24 ++ .../models/anthropic/claude-sonnet-5.toml | 24 ++ .../models/baidu/ernie-4.5-vl-424b-a47b.toml | 23 ++ providers/aimlapi/models/baidu/ernie-5.0.toml | 23 ++ .../models/bytedance-seed/seed-2-1-turbo.toml | 23 ++ .../models/bytedance-seed/seed-2.0-code.toml | 23 ++ .../aimlapi/models/bytedance/seed-1-8.toml | 23 ++ .../aimlapi/models/cohere/command-a.toml | 23 ++ .../models/deepseek/deepseek-chat-v3.1.toml | 24 ++ .../models/deepseek/deepseek-chat.toml | 24 ++ .../deepseek-non-reasoner-v3.1-terminus.toml | 24 ++ .../deepseek-non-thinking-v3.2-exp.toml | 24 ++ .../aimlapi/models/deepseek/deepseek-r1.toml | 24 ++ .../deepseek-reasoner-v3.1-terminus.toml | 24 ++ .../models/deepseek/deepseek-reasoner.toml | 24 ++ .../deepseek/deepseek-thinking-v3.2-exp.toml | 24 ++ .../deepseek-v4-flash-vision-exp.toml | 24 ++ .../models/deepseek/deepseek-v4-flash.toml | 24 ++ .../models/deepseek/deepseek-v4-pro-0813.toml | 24 ++ .../models/deepseek/deepseek-v4-pro.toml | 24 ++ .../google/gemini-2.5-flash-lite-preview.toml | 24 ++ .../models/google/gemini-2.5-flash-lite.toml | 24 ++ .../aimlapi/models/google/gemini-2.5-pro.toml | 24 ++ .../models/google/gemini-3-6-flash.toml | 24 ++ .../models/google/gemini-3-7-flash.toml | 24 ++ .../models/google/gemini-3-flash-preview.toml | 24 ++ .../models/google/gemini-3.1-pro-preview.toml | 24 ++ .../models/google/gemini-3.6-flash.toml | 24 ++ .../models/google/gemini-3.7-flash.toml | 24 ++ .../aimlapi/models/google/gemma-3-12b-it.toml | 24 ++ .../aimlapi/models/google/gemma-3-27b-it.toml | 24 ++ .../aimlapi/models/google/gemma-3-4b-it.toml | 24 ++ .../google/gemma-4-26b-a4b-it-maas.toml | 24 ++ .../models/google/gemma-4-26b-a4b-it.toml | 24 ++ .../models/gryphe/mythomax-l2-13b.toml | 23 ++ .../aimlapi/models/meituan/longcat-2.0.toml | 24 ++ .../Llama-3.3-70B-Instruct-Turbo.toml | 23 ++ .../meta-llama/llama-3.3-70b-versatile.toml | 23 ++ .../models/minimax/MiniMax-Text-01.toml | 23 ++ providers/aimlapi/models/minimax/m1.toml | 23 ++ providers/aimlapi/models/minimax/m2-1.toml | 24 ++ .../aimlapi/models/minimax/m2-5-20260218.toml | 24 ++ .../minimax/m2-5-highspeed-20260218.toml | 24 ++ providers/aimlapi/models/minimax/m2.toml | 23 ++ .../aimlapi/models/minimax/minimax-m3.toml | 24 ++ .../models/mistralai/mistral-nemo.toml | 24 ++ .../aimlapi/models/moonshot/kimi-k2-5.toml | 24 ++ .../moonshot/kimi-k2-7-code-highspeed.toml | 24 ++ .../models/moonshot/kimi-k2-7-code.toml | 24 ++ .../models/nousresearch/hermes-4-405b.toml | 24 ++ .../nvidia/nemotron-3-nano-30b-a3b.toml | 23 ++ .../nvidia/nemotron-3-super-120b-a12b.toml | 23 ++ .../nvidia/nemotron-3-ultra-550b-a55b.toml | 24 ++ .../models/nvidia/nemotron-3.5-lightning.toml | 23 ++ .../models/openai/gpt-4.1-2025-04-14.toml | 24 ++ providers/aimlapi/models/openai/gpt-4.1.toml | 24 ++ .../models/openai/gpt-4o-2024-05-13.toml | 23 ++ .../models/openai/gpt-4o-2024-08-06.toml | 24 ++ .../models/openai/gpt-4o-2024-11-20.toml | 24 ++ providers/aimlapi/models/openai/gpt-4o.toml | 24 ++ providers/aimlapi/models/openai/gpt-5-1.toml | 24 ++ .../models/openai/gpt-5-2-chat-latest.toml | 24 ++ providers/aimlapi/models/openai/gpt-5-2.toml | 24 ++ .../models/openai/gpt-5-2025-08-07.toml | 24 ++ .../models/openai/gpt-5-mini-2025-08-07.toml | 24 ++ .../aimlapi/models/openai/gpt-5-mini.toml | 24 ++ .../models/openai/gpt-5-nano-2025-08-07.toml | 24 ++ .../aimlapi/models/openai/gpt-5-nano.toml | 24 ++ .../aimlapi/models/openai/gpt-5-pro.toml | 23 ++ .../models/openai/gpt-5.1-2025-11-13.toml | 24 ++ .../models/openai/gpt-5.1-codex-mini.toml | 24 ++ .../aimlapi/models/openai/gpt-5.1-codex.toml | 24 ++ .../models/openai/gpt-5.2-2025-12-11.toml | 24 ++ .../models/openai/gpt-5.2-chat-latest.toml | 24 ++ .../aimlapi/models/openai/gpt-5.2-codex.toml | 24 ++ .../aimlapi/models/openai/gpt-5.2-pro.toml | 23 ++ .../aimlapi/models/openai/gpt-5.3-codex.toml | 24 ++ providers/aimlapi/models/openai/gpt-5.toml | 24 ++ .../aimlapi/models/openai/gpt-oss-120b.toml | 24 ++ .../aimlapi/models/openai/gpt-oss-20b.toml | 24 ++ .../aimlapi/models/openai/o3-2025-04-16.toml | 24 ++ .../models/openai/o4-mini-2025-04-16.toml | 24 ++ .../aimlapi/models/perplexity/sonar-pro.toml | 23 ++ .../aimlapi/models/perplexity/sonar.toml | 23 ++ .../aimlapi/models/sakana/fugu-ultra.toml | 24 ++ .../aimlapi/models/sakana/sakana-namazu.toml | 24 ++ .../models/stepfun/step-3.7-flash.toml | 24 ++ .../aimlapi/models/tencent/hy-mt2-1.8b.toml | 23 ++ .../models/tencent/hy-mt2-30b-a3b.toml | 23 ++ .../aimlapi/models/tencent/hy-mt2-7b.toml | 23 ++ .../aimlapi/models/tencent/hy4-preview.toml | 23 ++ .../thinkingmachines/inkling-small.toml | 23 ++ .../aimlapi/models/upstage/solar-pro4.toml | 24 ++ .../aimlapi/models/x-ai/grok-3-beta.toml | 24 ++ .../aimlapi/models/x-ai/grok-3-mini-beta.toml | 24 ++ .../x-ai/grok-4-1-fast-non-reasoning.toml | 24 ++ .../models/x-ai/grok-4-1-fast-reasoning.toml | 24 ++ .../x-ai/grok-4-20-0309-non-reasoning.toml | 24 ++ .../models/x-ai/grok-4-20-0309-reasoning.toml | 24 ++ providers/aimlapi/models/x-ai/grok-4-3.toml | 24 ++ .../x-ai/grok-4-fast-non-reasoning.toml | 24 ++ .../models/x-ai/grok-4-fast-reasoning.toml | 24 ++ .../aimlapi/models/x-ai/grok-code-fast-1.toml | 24 ++ .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 24 ++ .../aimlapi/models/xiaomi/mimo-v2.5.toml | 24 ++ .../aimlapi/models/z-ai/glm-5.3-flash.toml | 24 ++ .../aimlapi/models/zhipu/glm-4.5-air.toml | 24 ++ providers/aimlapi/models/zhipu/glm-4.5.toml | 24 ++ providers/aimlapi/models/zhipu/glm-4.6.toml | 24 ++ providers/aimlapi/models/zhipu/glm-4.7.toml | 24 ++ .../models/zhipu/glm-5-2-fast-preview.toml | 24 ++ providers/aimlapi/models/zhipu/glm-5-2.toml | 24 ++ providers/aimlapi/models/zhipu/glm-5-3.toml | 24 ++ providers/aimlapi/models/zhipu/glm-5.2.toml | 24 ++ providers/aimlapi/models/zhipu/glm-5.3.toml | 24 ++ providers/aimlapi/models/zhipu/glm-5.toml | 24 ++ providers/aimlapi/provider.toml | 5 + 168 files changed, 4070 insertions(+) create mode 100755 packages/core/src/sync/providers/aimlapi.ts create mode 100755 providers/aimlapi/logo.svg create mode 100644 providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml create mode 100644 providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml create mode 100644 providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml create mode 100644 providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml create mode 100644 providers/aimlapi/models/alibaba/glm-5.2.toml create mode 100644 providers/aimlapi/models/alibaba/qwen-max.toml create mode 100644 providers/aimlapi/models/alibaba/qwen-plus.toml create mode 100644 providers/aimlapi/models/alibaba/qwen-turbo.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-32b.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-max-preview.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-max.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-flash.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-plus.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.5-flash.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.5-plus.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.6-flash.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.6-plus.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.7-max.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.7-plus.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.8-27b.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.8-flash.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.8-max.toml create mode 100644 providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml create mode 100644 providers/aimlapi/models/anthropic/claude-fable-5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml create mode 100644 providers/aimlapi/models/anthropic/claude-haiku-4.5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-6.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-8.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.1.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.8.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-5.toml create mode 100644 providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml create mode 100644 providers/aimlapi/models/baidu/ernie-5.0.toml create mode 100644 providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml create mode 100644 providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml create mode 100644 providers/aimlapi/models/bytedance/seed-1-8.toml create mode 100644 providers/aimlapi/models/cohere/command-a.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-chat.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-r1.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-reasoner.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-v4-flash.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-v4-pro.toml create mode 100644 providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-2.5-flash-lite.toml create mode 100644 providers/aimlapi/models/google/gemini-2.5-pro.toml create mode 100644 providers/aimlapi/models/google/gemini-3-6-flash.toml create mode 100644 providers/aimlapi/models/google/gemini-3-7-flash.toml create mode 100644 providers/aimlapi/models/google/gemini-3-flash-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-pro-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-3.6-flash.toml create mode 100644 providers/aimlapi/models/google/gemini-3.7-flash.toml create mode 100644 providers/aimlapi/models/google/gemma-3-12b-it.toml create mode 100644 providers/aimlapi/models/google/gemma-3-27b-it.toml create mode 100644 providers/aimlapi/models/google/gemma-3-4b-it.toml create mode 100644 providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml create mode 100644 providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml create mode 100644 providers/aimlapi/models/gryphe/mythomax-l2-13b.toml create mode 100644 providers/aimlapi/models/meituan/longcat-2.0.toml create mode 100644 providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml create mode 100644 providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml create mode 100644 providers/aimlapi/models/minimax/MiniMax-Text-01.toml create mode 100644 providers/aimlapi/models/minimax/m1.toml create mode 100644 providers/aimlapi/models/minimax/m2-1.toml create mode 100644 providers/aimlapi/models/minimax/m2-5-20260218.toml create mode 100644 providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml create mode 100644 providers/aimlapi/models/minimax/m2.toml create mode 100644 providers/aimlapi/models/minimax/minimax-m3.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-nemo.toml create mode 100644 providers/aimlapi/models/moonshot/kimi-k2-5.toml create mode 100644 providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml create mode 100644 providers/aimlapi/models/moonshot/kimi-k2-7-code.toml create mode 100644 providers/aimlapi/models/nousresearch/hermes-4-405b.toml create mode 100644 providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml create mode 100644 providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml create mode 100644 providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml create mode 100644 providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml create mode 100644 providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml create mode 100644 providers/aimlapi/models/openai/gpt-4.1.toml create mode 100644 providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml create mode 100644 providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml create mode 100644 providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml create mode 100644 providers/aimlapi/models/openai/gpt-4o.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-1.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-2.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-2025-08-07.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-mini.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-nano.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.1-codex.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.2-codex.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.2-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.3-codex.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.toml create mode 100644 providers/aimlapi/models/openai/gpt-oss-120b.toml create mode 100644 providers/aimlapi/models/openai/gpt-oss-20b.toml create mode 100644 providers/aimlapi/models/openai/o3-2025-04-16.toml create mode 100644 providers/aimlapi/models/openai/o4-mini-2025-04-16.toml create mode 100644 providers/aimlapi/models/perplexity/sonar-pro.toml create mode 100644 providers/aimlapi/models/perplexity/sonar.toml create mode 100644 providers/aimlapi/models/sakana/fugu-ultra.toml create mode 100644 providers/aimlapi/models/sakana/sakana-namazu.toml create mode 100644 providers/aimlapi/models/stepfun/step-3.7-flash.toml create mode 100644 providers/aimlapi/models/tencent/hy-mt2-1.8b.toml create mode 100644 providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml create mode 100644 providers/aimlapi/models/tencent/hy-mt2-7b.toml create mode 100644 providers/aimlapi/models/tencent/hy4-preview.toml create mode 100644 providers/aimlapi/models/thinkingmachines/inkling-small.toml create mode 100644 providers/aimlapi/models/upstage/solar-pro4.toml create mode 100644 providers/aimlapi/models/x-ai/grok-3-beta.toml create mode 100644 providers/aimlapi/models/x-ai/grok-3-mini-beta.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-3.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-code-fast-1.toml create mode 100644 providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml create mode 100644 providers/aimlapi/models/xiaomi/mimo-v2.5.toml create mode 100644 providers/aimlapi/models/z-ai/glm-5.3-flash.toml create mode 100644 providers/aimlapi/models/zhipu/glm-4.5-air.toml create mode 100644 providers/aimlapi/models/zhipu/glm-4.5.toml create mode 100644 providers/aimlapi/models/zhipu/glm-4.6.toml create mode 100644 providers/aimlapi/models/zhipu/glm-4.7.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5-2.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5-3.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5.2.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5.3.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5.toml create mode 100755 providers/aimlapi/provider.toml diff --git a/package.json b/package.json index 4a7b90393f7..6ce70c88b55 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "test": "bun test", "validate": "bun ./packages/core/script/validate.ts", "compare:migrations": "bun ./packages/core/script/compare-model-migrations.ts", + "aimlapi:sync": "bun ./packages/core/script/sync-models.ts aimlapi", "anthropic:sync": "bun ./packages/core/script/sync-models.ts anthropic", "baseten:sync": "bun ./packages/core/script/sync-models.ts baseten", "deepinfra:sync": "bun ./packages/core/script/sync-models.ts deepinfra", diff --git a/packages/core/src/sync/index.ts b/packages/core/src/sync/index.ts index f08532afa14..71f1c4a74ec 100644 --- a/packages/core/src/sync/index.ts +++ b/packages/core/src/sync/index.ts @@ -5,6 +5,7 @@ import { z } from "zod"; import { AuthoredModel, AuthoredModelShape, ModelMetadata } from "../schema.js"; import { openMissingModelIssues } from "./missing-issues.js"; +import { aimlapi } from "./providers/aimlapi.js"; import { ambient } from "./providers/ambient.js"; import { anthropic } from "./providers/anthropic.js"; import { baseten } from "./providers/baseten.js"; @@ -128,6 +129,7 @@ export interface SyncResult { } export const providers: { + aimlapi: SyncProvider; ambient: SyncProvider; anthropic: SyncProvider; baseten: SyncProvider; @@ -162,6 +164,7 @@ export const providers: { wandb: SyncProvider; xai: SyncProvider; } = { + aimlapi, ambient, anthropic, baseten, @@ -199,6 +202,7 @@ export const providers: { export const groups = { aggregators: [ + "aimlapi", "crossmodel", "edenai", "empiriolabs", diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts new file mode 100755 index 00000000000..ebfb255fa26 --- /dev/null +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -0,0 +1,206 @@ +import { z } from "zod"; + +import { inferKimiFamily, ModelFamilyValues } from "../../family.js"; +import type { SyncProvider } from "../index.js"; + +// The public catalog needs no key, and `include` is what turns on the pricing +// and modality blocks this sync depends on. +const API_ENDPOINT = "https://api.aimlapi.com/v1/models?include=pricing,modalities"; + +// AI/ML API serves one id under several endpoint types — a model can be both a +// chat model and, say, an image model. Only the chat surface belongs here. +const CHAT_COMPLETIONS_TYPE = "openai/chat-completions"; + +const PricingUnit = z.object({ + name: z.string().nullish(), + content: z.string().nullish(), + origin: z.string().nullish(), + price: z.number().nullish(), + per: z.number().nullish(), +}).passthrough(); + +const Info = z.object({ + name: z.string().nullish(), + description: z.string().nullish(), + developer: z.string().nullish(), + releasedAt: z.string().nullish(), + contextLength: z.number().int().nonnegative().nullish(), + outputMax: z.number().int().nonnegative().nullish(), +}).passthrough(); + +export const AimlapiModel = z.object({ + id: z.string().min(1), + type: z.string().nullish(), + info: Info.nullish(), + modalities: z.object({ + input: z.array(z.string()).nullish(), + output: z.array(z.string()).nullish(), + }).passthrough().nullish(), + pricing: z.object({ + units: z.array(PricingUnit).nullish(), + }).passthrough().nullish(), +}).passthrough(); + +export const AimlapiResponse = z.object({ + data: z.array(AimlapiModel).min(1), +}).passthrough(); + +export type AimlapiModel = z.infer; + +type Modality = "text" | "audio" | "image" | "video" | "pdf"; + +const MODALITIES = new Set(["text", "audio", "image", "video", "pdf"]); + +function normalizeModalities(values: readonly string[] | null | undefined): Modality[] { + const seen = new Set(); + for (const value of values ?? []) { + const normalized = value.toLowerCase(); + if (MODALITIES.has(normalized)) seen.add(normalized as Modality); + } + if (seen.size === 0) seen.add("text"); + return [...seen]; +} + +/** + * Prices are quoted as `price` per `per` tokens; models.dev stores dollars per + * million. The unit discriminator is `origin`, not `measure`: provided is + * input, generated is output, cached is a cache read. Only text token charges + * are taken — a model's image or audio units are a different surface. + */ +function perMillion( + units: readonly z.infer[], + origin: string, +): number | undefined { + const unit = units.find( + (candidate) => + candidate.name === "token" && candidate.content === "text" && candidate.origin === origin, + ); + if (!unit || unit.price == null || !unit.per) return undefined; + return (unit.price / unit.per) * 1_000_000; +} + +function positive(value: number | null | undefined): number | undefined { + return value != null && value > 0 ? value : undefined; +} + +/** + * `family` is a closed vocabulary of model families (`gpt`, `claude`, `o`, …), + * not the vendor prefix — matching on the prefix produces values the schema + * rejects. Longest match first so `claude-sonnet` wins over `claude`, and `o` + * only matches when a digit follows it, as in `o3`. + */ +function inferFamily(id: string, name: string): string | undefined { + const kimi = inferKimiFamily(id, name); + if (kimi !== undefined) return kimi; + + 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); + }); +} + +function releaseDate(value: string | null | undefined): string | undefined { + if (!value) return undefined; + const match = /^(\d{4}-\d{2}-\d{2})/.exec(value.trim()); + return match?.[1]; +} + +export const aimlapi = { + id: "aimlapi", + name: "AI/ML API", + modelsDir: "providers/aimlapi/models", + // The catalog turns over quickly and lists far more than the chat surface, so + // a local model missing from one response is not proof that it is gone. + deleteMissing: false, + sourceID(model) { + return model.type === CHAT_COMPLETIONS_TYPE ? model.id : undefined; + }, + skippedNotice(ids) { + if (ids.length === 0) return []; + return [ + `${ids.length} AI/ML API chat models were skipped because the catalog does not yet publish a description or an output limit for them, both of which this schema requires.`, + `Skipped remote IDs: ${ids.map((id) => `\`${id}\``).join(", ")}`, + ]; + }, + missingNotice(paths) { + if (paths.length === 0) return []; + return [ + `${paths.length} local AI/ML API models were absent from the catalog and were retained for manual lifecycle review.`, + `Retained local paths: ${paths.map((item) => `\`${item}\``).join(", ")}`, + ]; + }, + async fetchModels() { + const response = await fetch(API_ENDPOINT); + if (!response.ok) { + throw new Error(`AI/ML API request failed: ${response.status} ${response.statusText}`); + } + return response.json(); + }, + parseModels(raw) { + return AimlapiResponse.parse(raw).data; + }, + translateModel(model, context) { + // Chat only. The same id may also appear under an image or audio type; + // those entries are a different product and are skipped silently. + if (model.type !== CHAT_COMPLETIONS_TYPE) return undefined; + + const existing = context.existing(model.id); + const info = model.info ?? {}; + const units = model.pricing?.units ?? []; + + const output = normalizeModalities(model.modalities?.output); + // A chat model whose output is not purely text is a media model riding the + // chat protocol, and does not belong in a chat catalog. + if (output.length !== 1 || output[0] !== "text") return undefined; + + const input = normalizeModalities(model.modalities?.input); + const contextLimit = positive(info.contextLength) ?? existing?.limit?.context; + const outputLimit = positive(info.outputMax) ?? existing?.limit?.output; + const description = info.description?.trim() || existing?.description; + + // The schema requires a description and an output limit. Where the catalog + // publishes neither and no local value exists, the model is skipped rather + // than filled in: an invented description or a guessed limit would be worse + // than an absent entry, and skippedNotice makes the gap visible. + if (!description || outputLimit === undefined) return undefined; + + return { + id: model.id, + model: { + name: info.name?.trim() || existing?.name || model.id, + description, + family: existing?.family ?? inferFamily(model.id, info.name?.trim() ?? ""), + release_date: releaseDate(info.releasedAt) ?? existing?.release_date, + last_updated: releaseDate(info.releasedAt) ?? existing?.last_updated, + // The catalog does not report these capabilities. A value already in the + // repo was put there by someone who checked; a default here would only + // overwrite that with a guess. + attachment: existing?.attachment ?? input.length > 1, + reasoning: existing?.reasoning ?? false, + tool_call: existing?.tool_call ?? false, + structured_output: existing?.structured_output ?? false, + open_weights: existing?.open_weights ?? false, + cost: { + input: perMillion(units, "provided") ?? existing?.cost?.input, + output: perMillion(units, "generated") ?? existing?.cost?.output, + cache_read: perMillion(units, "cached") ?? existing?.cost?.cache_read, + }, + limit: { + context: contextLimit, + input: contextLimit, + output: outputLimit, + }, + modalities: { + input, + output, + }, + }, + }; + }, +} satisfies SyncProvider; diff --git a/providers/aimlapi/logo.svg b/providers/aimlapi/logo.svg new file mode 100755 index 00000000000..5bd69eb5625 --- /dev/null +++ b/providers/aimlapi/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml b/providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml new file mode 100644 index 00000000000..158a428d08e --- /dev/null +++ b/providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml @@ -0,0 +1,23 @@ +name = "Qwen2.5 7B Instruct Turbo" +description = "Qwen 2.5 7B Instruct Turbo excels in coding and instruction following." +family = "qwen" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.39 +output = 0.39 + +[limit] +context = 32_000 +input = 32_000 +output = 31_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml b/providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml new file mode 100644 index 00000000000..4d8c764a966 --- /dev/null +++ b/providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml @@ -0,0 +1,23 @@ +name = "Qwen3 Thinking 2507" +description = "Alibaba's Qwen 3 thinking 2507 is a multilingual reasoning model with knowledge augmentation, and creative capabilities." +family = "qwen" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.845 +output = 3.9 + +[limit] +context = 32_000 +input = 32_000 +output = 16_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml b/providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml new file mode 100644 index 00000000000..dc0491c81f8 --- /dev/null +++ b/providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml @@ -0,0 +1,23 @@ +name = "Qwen3 Coder" +description = "Alibaba's Qwen 3 Coder is a powerful coding agent." +family = "qwen" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 2.6 + +[limit] +context = 262_000 +input = 262_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml b/providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml new file mode 100644 index 00000000000..e6cf4b4c3bd --- /dev/null +++ b/providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml @@ -0,0 +1,24 @@ +name = "GLM 5.2 Fast Preview" +description = "A latency-optimized GLM-5.2 preview with the same 1M-token context window and 1.5–2× higher output throughput for real-time chat, agents, and coding." +family = "glm" +release_date = "2026-07-10" +last_updated = "2026-07-10" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.55 +output = 14.3 +cache_read = 0.91 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/glm-5.2.toml b/providers/aimlapi/models/alibaba/glm-5.2.toml new file mode 100644 index 00000000000..f012ea0d537 --- /dev/null +++ b/providers/aimlapi/models/alibaba/glm-5.2.toml @@ -0,0 +1,24 @@ +name = "GLM 5.2" +description = "GLM-5.2 is Zhipu AI flagship MoE LLM with a 1M-token context window, optimized for agentic coding, tool use, reasoning, and long-context tasks." +family = "glm" +release_date = "2026-06-16" +last_updated = "2026-06-16" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.364 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen-max.toml b/providers/aimlapi/models/alibaba/qwen-max.toml new file mode 100644 index 00000000000..4554f9eba34 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen-max.toml @@ -0,0 +1,24 @@ +name = "Qwen Max" +description = "Qwen Max: powerful AI, excels in stability, competes globally." +family = "qwen" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.08 +output = 8.32 +cache_read = 0.416 + +[limit] +context = 32_000 +input = 32_000 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen-plus.toml b/providers/aimlapi/models/alibaba/qwen-plus.toml new file mode 100644 index 00000000000..29e5653ccb5 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen-plus.toml @@ -0,0 +1,24 @@ +name = "Qwen Plus" +description = "Qwen-Plus: Alibaba's advanced multilingual model with enhanced reasoning and instruction-following capabilities." +family = "qwen" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.52 +output = 1.56 +cache_read = 0.104 + +[limit] +context = 131_000 +input = 131_000 +output = 16_384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen-turbo.toml b/providers/aimlapi/models/alibaba/qwen-turbo.toml new file mode 100644 index 00000000000..c1cd95d2ef1 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen-turbo.toml @@ -0,0 +1,24 @@ +name = "Qwen Turbo" +description = "Qwen Turbo: optimizes AI agent speed, integrates with RAG, large context window." +family = "qwen" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.065 +output = 0.26 +cache_read = 0.013 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 16_384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml b/providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml new file mode 100644 index 00000000000..492d06a2607 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml @@ -0,0 +1,22 @@ +name = "Qwen3 Thinking 2507" +description = "Alibaba's Qwen 3 thinking 2507 is a multilingual reasoning model with knowledge augmentation, and creative capabilities." +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.299 +output = 2.99 + +[limit] +context = 32_000 +input = 32_000 +output = 16_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-32b.toml b/providers/aimlapi/models/alibaba/qwen3-32b.toml new file mode 100644 index 00000000000..d75ce76e131 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-32b.toml @@ -0,0 +1,22 @@ +name = "Qwen3 32B" +description = "Alibaba's Qwen 3 32B is a multilingual model with instruction-following capabilities and enhanced reasoning." +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.208 +output = 0.832 + +[limit] +context = 131_000 +input = 131_000 +output = 16_384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml new file mode 100644 index 00000000000..af1e1067450 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml @@ -0,0 +1,22 @@ +name = "Qwen3 Coder" +description = "Alibaba's Qwen 3 Coder is a powerful coding agent." +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.95 +output = 9.75 + +[limit] +context = 262_000 +input = 262_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3-max-preview.toml new file mode 100644 index 00000000000..f78f0fcb224 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-max-preview.toml @@ -0,0 +1,23 @@ +name = "Qwen3 Max Preview" +description = "Alibaba's Qwen 3 Max Preview is a multilingual model with instruction-following capabilities and enhanced reasoning." +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.56 +output = 7.8 +cache_read = 0.312 + +[limit] +context = 252_000 +input = 252_000 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-max.toml b/providers/aimlapi/models/alibaba/qwen3-max.toml new file mode 100644 index 00000000000..81be3f5718a --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-max.toml @@ -0,0 +1,23 @@ +name = "Qwen3 Max Instruct" +description = "Alibaba's Qwen 3 Max Instruct is the most powerful model in the Qwen 3 series." +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.56 +output = 7.8 +cache_read = 0.312 + +[limit] +context = 262_144 +input = 262_144 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml new file mode 100644 index 00000000000..8081cee7649 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml @@ -0,0 +1,22 @@ +name = "Qwen3 Next 80B A3B Instruct" +description = "Alibaba's Qwen 3 Next 80B A3B Instruct is a multilingual model with enhanced instruction-following capabilities." +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.195 +output = 1.56 + +[limit] +context = 129_024 +input = 129_024 +output = 16_384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml new file mode 100644 index 00000000000..5640e1c0adb --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml @@ -0,0 +1,22 @@ +name = "Qwen3 Next 80B A3B Thinking" +description = "Alibaba's Qwen 3 Next 80B A3B Thinking is a multilingual reasoning model with advanced chain-of-thought capabilities." +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.195 +output = 1.56 + +[limit] +context = 126_976 +input = 126_976 +output = 81_920 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml b/providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml new file mode 100644 index 00000000000..134b6d09af6 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml @@ -0,0 +1,22 @@ +name = "Qwen3 Omni Captioner" +description = "Qwen3-Omni-Captioner automatically generates accurate and comprehensive descriptions for complex audio, including speech, ambient sounds, music, and sound effects. The model can identify speaker emotions, musical elements, and is suitable for audio content analysis, security audits, and audio editing. Supports audio input up to 40 minutes (1 second = 25 tokens)." +release_date = "2025-11-14" +last_updated = "2025-11-14" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.953 +output = 3.9779999999999998 + +[limit] +context = 65_536 +input = 65_536 +output = 32_768 + +[modalities] +input = ["audio"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml new file mode 100644 index 00000000000..cebfcf225b2 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml @@ -0,0 +1,22 @@ +name = "Qwen3 VL 32B Instruct" +description = "Alibaba's Qwen 3 VL 32B Instruct is a powerful vision-language model with hybrid instruction-following capabilities." +release_date = "2025-11-11" +last_updated = "2025-11-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.91 +output = 3.64 + +[limit] +context = 126_000 +input = 126_000 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml b/providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml new file mode 100644 index 00000000000..40b6f7e4b14 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml @@ -0,0 +1,22 @@ +name = "Qwen3 VL 32B Thinking" +description = "Alibaba's Qwen 3 VL 32B Thinking is a powerful vision-language model with hybrid thinking capabilities." +release_date = "2025-11-11" +last_updated = "2025-11-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.91 +output = 10.92 + +[limit] +context = 126_000 +input = 126_000 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml b/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml new file mode 100644 index 00000000000..bb3450bfa3f --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml @@ -0,0 +1,23 @@ +name = "Qwen3 VL Flash" +description = "Alibaba's Qwen 3 VL Flash is a fast and cost-effective vision-language model with hybrid thinking capabilities. Supports image understanding with up to 16,384 tokens per image and high-resolution mode for detailed analysis." +release_date = "2025-10-19" +last_updated = "2025-10-19" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.065 +output = 0.52 +cache_read = 0.065 + +[limit] +context = 262_144 +input = 262_144 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-plus.toml b/providers/aimlapi/models/alibaba/qwen3-vl-plus.toml new file mode 100644 index 00000000000..cb26d7e6e87 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-vl-plus.toml @@ -0,0 +1,22 @@ +name = "Qwen3 VL Plus" +description = "Alibaba's Qwen 3 VL Plus is a powerful vision-language model with hybrid thinking capabilities. Supports image understanding with up to 16,384 tokens per image and high-resolution mode for detailed analysis." +release_date = "2025-10-19" +last_updated = "2025-10-19" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.26 +output = 2.08 + +[limit] +context = 262_144 +input = 262_144 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml new file mode 100644 index 00000000000..82c9f83d08f --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml @@ -0,0 +1,23 @@ +name = "Qwen3.5 Flash" +description = "Qwen Max: powerful AI, excels in stability, competes globally." +family = "qwen3.5" +release_date = "2026-04-21" +last_updated = "2026-04-21" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.13 +output = 0.52 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml b/providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml new file mode 100644 index 00000000000..523acb8c130 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml @@ -0,0 +1,23 @@ +name = "Qwen3.5 Plus" +description = "Qwen3.5-Plus is a commercial large language model by Alibaba Cloud designed for long-context text generation and enterprise-grade conversational AI. Supports up to 1M tokens per request with production-ready API stability." +family = "qwen3.5" +release_date = "2026-02-20" +last_updated = "2026-02-20" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.52 +output = 3.12 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-plus.toml b/providers/aimlapi/models/alibaba/qwen3.5-plus.toml new file mode 100644 index 00000000000..523acb8c130 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.5-plus.toml @@ -0,0 +1,23 @@ +name = "Qwen3.5 Plus" +description = "Qwen3.5-Plus is a commercial large language model by Alibaba Cloud designed for long-context text generation and enterprise-grade conversational AI. Supports up to 1M tokens per request with production-ready API stability." +family = "qwen3.5" +release_date = "2026-02-20" +last_updated = "2026-02-20" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.52 +output = 3.12 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-flash.toml b/providers/aimlapi/models/alibaba/qwen3.6-flash.toml new file mode 100644 index 00000000000..7a18f32d8ce --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.6-flash.toml @@ -0,0 +1,23 @@ +name = "Qwen3.6 Flash" +description = "Qwen3.6-Flash — a lightweight and cost-efficient model by Alibaba Cloud designed for simple tasks and high-throughput applications. It offers fast response times with lower cost." +family = "qwen3.6" +release_date = "2026-04-21" +last_updated = "2026-04-21" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.325 +output = 1.95 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml new file mode 100644 index 00000000000..50cc3406ff5 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml @@ -0,0 +1,23 @@ +name = "Qwen3.6 Max Preview" +description = "Qwen3.6-Max-Preview — a high-capability reasoning model by Alibaba Cloud designed for complex tasks and long-form problem solving. It provides strong reasoning performance and high accuracy for advanced use cases." +family = "qwen3.6" +release_date = "2026-04-21" +last_updated = "2026-04-21" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.65 +output = 3.9 + +[limit] +context = 262_144 +input = 262_144 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-plus.toml b/providers/aimlapi/models/alibaba/qwen3.6-plus.toml new file mode 100644 index 00000000000..df64485cf70 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.6-plus.toml @@ -0,0 +1,23 @@ +name = "Qwen3.6 Plus" +description = "Qwen3.6-Plus — a balanced general-purpose model by Alibaba Cloud optimized for performance, cost, and speed. Suitable for a wide range of chat and generation tasks." +family = "qwen3.6" +release_date = "2026-04-21" +last_updated = "2026-04-21" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.52 +output = 3.12 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.7-max.toml b/providers/aimlapi/models/alibaba/qwen3.7-max.toml new file mode 100644 index 00000000000..e90f8474b8a --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.7-max.toml @@ -0,0 +1,24 @@ +name = "Qwen3.7 Max" +description = "Qwen3.7-Max is Alibaba’s flagship reasoning and agentic LLM optimized for coding, productivity, long-context understanding and autonomous workflows. Text input and text output only. Supports function calling, explicit context cache and advanced reasoning capabilities." +family = "qwen3.7-max" +release_date = "2026-05-21" +last_updated = "2026-05-21" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 7.8 +cache_read = 2.6 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.7-plus.toml b/providers/aimlapi/models/alibaba/qwen3.7-plus.toml new file mode 100644 index 00000000000..64173d1ebc5 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.7-plus.toml @@ -0,0 +1,24 @@ +name = "Qwen3.7-Plus" +description = "Qwen3.7-Plus is a multimodal agent model that unifies vision and language into a single agent foundation. It delivers strong vision-language capabilities while retaining agentic strength in coding, tool use, and productivity workflows — including GUI understanding, visual Q&A, and full-modality input for complex software engineering tasks." +family = "qwen3.7-plus" +release_date = "2026-06-01" +last_updated = "2026-06-01" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.416 +output = 1.664 +cache_read = 0.0832 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml new file mode 100644 index 00000000000..eedc3ee7545 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml @@ -0,0 +1,23 @@ +name = "Qwen3.8 2.4T A95B" +description = "Qwen3.8 2.4T A95B is an open-weight sparse mixture-of-experts model from Qwen and the open-weight variant of Qwen3.8 Max, with 95 billion active parameters out of 2.4 trillion total. Reasoning is always on." +release_date = "2026-08-12" +last_updated = "2026-08-12" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.4385 +output = 8.59625 +cache_read = 0.6877 + +[limit] +context = 262_144 +input = 262_144 +output = 52_429 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml new file mode 100644 index 00000000000..8f9f3b4ff71 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml @@ -0,0 +1,22 @@ +name = "Qwen3.8 27B" +description = "Qwen3.8 27B is an open-weight dense vision-language model from Qwen. It accepts text, image and video inputs and is suited for coding, professional workflows, research, multimodal interaction and long-running agent tasks, with flexible thinking that can be tuned per request." +release_date = "2026-08-14" +last_updated = "2026-08-14" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.61893 +output = 4.40128 + +[limit] +context = 262_144 +input = 262_144 +output = 131_072 + +[modalities] +input = ["image", "text", "video"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml new file mode 100644 index 00000000000..10fdead5776 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml @@ -0,0 +1,23 @@ +name = "Qwen3.8 Flash" +description = "Qwen3.8-Flash is the speed- and cost-optimized tier of the Qwen3.8 family, pairing hybrid thinking with high throughput for coding assistance, agentic workflows and visual understanding. Natively multimodal: accepts text, images and video and returns text, with a 1M-token context window. Supports function calling, built-in tools (including web search), structured outputs and context caching." +release_date = "2026-08-26" +last_updated = "2026-08-26" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.208 +output = 0.611 +cache_read = 0.0208 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml new file mode 100644 index 00000000000..a13befb62e7 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -0,0 +1,24 @@ +name = "Qwen3.8 Max" +description = "Qwen3.8-Max is Alibaba’s flagship reasoning and agentic LLM, positioned as its highest-capability tier for complex multi-step reasoning, coding and autonomous workflows. Natively multimodal: accepts text and images and returns text, with a 1M-token context window. Supports hybrid thinking mode, function calling, built-in tools (including web search) and structured outputs." +family = "qwen3.8-max" +release_date = "2026-08-03" +last_updated = "2026-08-03" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 7.8 +cache_read = 0.325 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml b/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml new file mode 100644 index 00000000000..515e4cdc003 --- /dev/null +++ b/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml @@ -0,0 +1,22 @@ +name = "Magnum v4 72B" +description = "Magnum V4 is a powerful language model optimized for high-quality text generation tasks." +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.1262 +output = 6.877 + +[limit] +context = 32_000 +input = 32_000 +output = 16_384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.toml b/providers/aimlapi/models/anthropic/claude-fable-5.toml new file mode 100644 index 00000000000..7dd55cee867 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-fable-5.toml @@ -0,0 +1,24 @@ +name = "Claude Fable 5" +description = "Claude Fable 5 is Anthropic's model designed for complex reasoning and agentic coding workflows. Features a 1M token context window, adaptive thinking, and strong performance across multilingual tasks, long-context handling, and vision." +family = "claude-fable" +release_date = "2026-06-09" +last_updated = "2026-06-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 13 +output = 65 +cache_read = 1.3 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml b/providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml new file mode 100644 index 00000000000..ff1d913416f --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml @@ -0,0 +1,24 @@ +name = "Claude 4.5 Haiku" +description = "Claude 4.5 Haiku is a fast, lightweight model optimized for quick responses and high-throughput applications." +family = "claude-haiku" +release_date = "2025-10-16" +last_updated = "2025-10-16" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.3 +output = 6.5 +cache_read = 0.13 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml new file mode 100644 index 00000000000..c347be507bf --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml @@ -0,0 +1,24 @@ +name = "Claude 4.5 Haiku" +description = "Claude 4.5 Haiku is a fast, lightweight model optimized for quick responses and high-throughput applications." +family = "claude-haiku" +release_date = "2025-10-16" +last_updated = "2025-10-16" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.3754 +output = 6.877 +cache_read = 0.13754 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml b/providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml new file mode 100644 index 00000000000..3da960db23b --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml @@ -0,0 +1,24 @@ +name = "Claude 4.1 Opus" +description = "Claude 4.1 Opus is an enhanced version of Claude 4 Opus with improved reasoning and instruction-following capabilities." +family = "claude-opus" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 19.5 +output = 97.5 +cache_read = 1.95 + +[limit] +context = 200_000 +input = 200_000 +output = 32_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml b/providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml new file mode 100644 index 00000000000..e89d5594097 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml @@ -0,0 +1,24 @@ +name = "Claude 4.5 Opus" +description = "Claude 4.5 Opus is Anthropic's flagship model for the most demanding reasoning and analysis tasks." +family = "claude-opus" +release_date = "2025-11-25" +last_updated = "2025-11-25" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.5 +output = 32.5 +cache_read = 0.65 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-6.toml b/providers/aimlapi/models/anthropic/claude-opus-4-6.toml new file mode 100644 index 00000000000..fcdb333c25b --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4-6.toml @@ -0,0 +1,24 @@ +name = "Claude 4.6 Opus" +description = "Claude 4.6 Opus delivers Anthropic's highest intelligence with extended output for complex, long-horizon tasks." +family = "claude-opus" +release_date = "2026-02-06" +last_updated = "2026-02-06" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.5 +output = 32.5 +cache_read = 0.65 + +[limit] +context = 200_000 +input = 200_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-8.toml b/providers/aimlapi/models/anthropic/claude-opus-4-8.toml new file mode 100644 index 00000000000..01bf0f0a88f --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4-8.toml @@ -0,0 +1,24 @@ +name = "Claude 4.8 Opus" +description = "Claude 4.8 Opus is Anthropic's most capable model designed for complex reasoning and agentic coding workflows. Features a 1M token context window, adaptive thinking, and top-tier performance across multilingual tasks, long-context handling, and vision." +family = "claude-opus" +release_date = "2026-05-28" +last_updated = "2026-05-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.5 +output = 32.5 +cache_read = 0.65 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml new file mode 100644 index 00000000000..47786dc4e28 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml @@ -0,0 +1,24 @@ +name = "Claude 4.1 Opus" +description = "Claude 4.1 Opus is an enhanced version of Claude 4 Opus with improved reasoning and instruction-following capabilities." +family = "claude-opus" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 20.631 +output = 103.155 +cache_read = 2.0631 + +[limit] +context = 200_000 +input = 200_000 +output = 32_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml new file mode 100644 index 00000000000..8a5cb554636 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml @@ -0,0 +1,24 @@ +name = "Claude 4.5 Opus" +description = "Claude 4.5 Opus is Anthropic's flagship model for the most demanding reasoning and analysis tasks." +family = "claude-opus" +release_date = "2025-11-25" +last_updated = "2025-11-25" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.877 +output = 34.385 +cache_read = 0.6877 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml new file mode 100644 index 00000000000..f724b9df4f8 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -0,0 +1,24 @@ +name = "Claude 4.8 Opus" +description = "Claude 4.8 Opus is Anthropic's most capable model designed for complex reasoning and agentic coding workflows. Features a 1M token context window, adaptive thinking, and top-tier performance across multilingual tasks, long-context handling, and vision." +family = "claude-opus" +release_date = "2026-05-28" +last_updated = "2026-05-28" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.877 +output = 34.385 +cache_read = 0.6877 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-5.toml b/providers/aimlapi/models/anthropic/claude-opus-5.toml new file mode 100644 index 00000000000..5f622b5b070 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-5.toml @@ -0,0 +1,24 @@ +name = "Claude Opus 5" +description = "Claude Opus 5 is ideal for complex agentic coding and enterprise work. Features a 1M token context window, adaptive thinking, and top-tier performance across long-horizon agentic tasks, knowledge work, and vision." +family = "claude-opus" +release_date = "2026-07-24" +last_updated = "2026-07-24" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.5 +output = 32.5 +cache_read = 0.65 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml new file mode 100644 index 00000000000..0d392a2e5a5 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml @@ -0,0 +1,24 @@ +name = "Claude 4.5 Sonnet" +description = "Claude 4.5 Sonnet offers a balance of intelligence and speed for diverse enterprise and coding tasks." +family = "claude-sonnet" +release_date = "2025-10-01" +last_updated = "2025-10-01" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.9 +output = 19.5 +cache_read = 0.39 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml new file mode 100644 index 00000000000..4a33fa60413 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml @@ -0,0 +1,24 @@ +name = "Claude 4.6 Sonnet" +description = "Claude 4.6 Sonnet is a highly capable model balancing performance and efficiency for everyday AI tasks." +family = "claude-sonnet" +release_date = "2026-02-18" +last_updated = "2026-02-18" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.9 +output = 19.5 +cache_read = 0.39 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml new file mode 100644 index 00000000000..4bb067b0250 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml @@ -0,0 +1,24 @@ +name = "Claude 4.5 Sonnet" +description = "Claude 4.5 Sonnet offers a balance of intelligence and speed for diverse enterprise and coding tasks." +family = "claude-sonnet" +release_date = "2025-10-01" +last_updated = "2025-10-01" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.1262 +output = 20.631 +cache_read = 0.41262 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml new file mode 100644 index 00000000000..17417c590c9 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml @@ -0,0 +1,24 @@ +name = "Claude 4.6 Sonnet" +description = "Claude 4.6 Sonnet is a highly capable model balancing performance and efficiency for everyday AI tasks." +family = "claude-sonnet" +release_date = "2026-02-18" +last_updated = "2026-02-18" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.1262 +output = 20.631 +cache_read = 0.41262 + +[limit] +context = 200_000 +input = 200_000 +output = 64_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml new file mode 100644 index 00000000000..07b90a1f06b --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml @@ -0,0 +1,24 @@ +name = "Claude Sonnet 5" +description = "Claude Sonnet 5 is a high-performance model for coding and agentic workflows, delivering near-Opus quality at Sonnet cost. Features a 1M token context window, adaptive thinking, and high-resolution vision." +family = "claude-sonnet" +release_date = "2026-06-30" +last_updated = "2026-06-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 13 +cache_read = 0.26 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml b/providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml new file mode 100644 index 00000000000..0fd7d23d03e --- /dev/null +++ b/providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml @@ -0,0 +1,23 @@ +name = "Ernie 4.5 VL 424B A47B" +description = "High-capacity vision-language Ernie 4.5 VL 424B A47B for demanding multimodal workflows." +family = "ernie" +release_date = "2026-01-12" +last_updated = "2026-01-12" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.5577 +output = 1.677 + +[limit] +context = 123_000 +input = 123_000 +output = 123_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/baidu/ernie-5.0.toml b/providers/aimlapi/models/baidu/ernie-5.0.toml new file mode 100644 index 00000000000..0ced30896df --- /dev/null +++ b/providers/aimlapi/models/baidu/ernie-5.0.toml @@ -0,0 +1,23 @@ +name = "ERNIE 5.0" +description = "ERNIE 5.0 is Baidu’s unified foundation model supporting text generation, visual understanding, and deep-thinking reasoning, with a 128K context window." +family = "ernie" +release_date = "2026-06-30" +last_updated = "2026-06-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.82 +output = 7.28 + +[limit] +context = 128_000 +input = 128_000 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml b/providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml new file mode 100644 index 00000000000..4b754c1c105 --- /dev/null +++ b/providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml @@ -0,0 +1,23 @@ +name = "Seed 2.1 Turbo" +description = "ByteDance Seed 2.1 Turbo is a multimodal model for coding and long-horizon agent workflows, accepting text, image and video input across a 256K context window." +family = "seed" +release_date = "2026-08-10" +last_updated = "2026-08-10" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.6877 +output = 3.4385 + +[limit] +context = 262_144 +input = 262_144 +output = 262_144 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml new file mode 100644 index 00000000000..8aeb284b365 --- /dev/null +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml @@ -0,0 +1,23 @@ +name = "Seed-2.0-Code" +description = "ByteDance Seed-2.0-Code is optimized for agentic coding — frontend development, multilingual programming tasks and coding-agent workflows — with a 256K context window, multimodal (text/image/video) input and selectable reasoning effort." +family = "seed" +release_date = "2026-07-30" +last_updated = "2026-07-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.6877 +output = 4.1262 + +[limit] +context = 262_144 +input = 262_144 +output = 131_072 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/bytedance/seed-1-8.toml b/providers/aimlapi/models/bytedance/seed-1-8.toml new file mode 100644 index 00000000000..44b4b7aa6be --- /dev/null +++ b/providers/aimlapi/models/bytedance/seed-1-8.toml @@ -0,0 +1,23 @@ +name = "Seed 1.8" +description = "ByteDance Seed 1.8 is a large language model with a 256K context window optimized for long-context reasoning and generation." +family = "seed" +release_date = "2026-01-12" +last_updated = "2026-01-12" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.325 +output = 2.6 + +[limit] +context = 256_000 +input = 256_000 +output = 224_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/cohere/command-a.toml b/providers/aimlapi/models/cohere/command-a.toml new file mode 100644 index 00000000000..6733854fea4 --- /dev/null +++ b/providers/aimlapi/models/cohere/command-a.toml @@ -0,0 +1,23 @@ +name = "Command A" +description = "Command A is a powerful LLM with advanced capabilities for enterprise applications." +family = "command-a" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.4385 +output = 13.754 + +[limit] +context = 256_000 +input = 256_000 +output = 256_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml b/providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml new file mode 100644 index 00000000000..c2f784804bc --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V3.1" +description = "DeepSeek-V3.1 is the latest advanced LLM with improved architecture and performance across various natural language tasks." +family = "deepseek" +release_date = "2025-08-28" +last_updated = "2025-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.89401 +output = 2.33818 +cache_read = 0.75647 + +[limit] +context = 128_000 +input = 128_000 +output = 8_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml new file mode 100644 index 00000000000..1136d2f3adb --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V3" +description = "DeepSeek-V3 is an advanced LLM with efficient architecture and high performance across various natural language tasks." +family = "deepseek" +release_date = "2025-08-28" +last_updated = "2025-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.364 +output = 0.546 +cache_read = 0.0364 + +[limit] +context = 128_000 +input = 128_000 +output = 124_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml b/providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml new file mode 100644 index 00000000000..ff1f0cc6afc --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V3.1" +description = "DeepSeek-V3.1 is the latest advanced LLM with improved architecture and performance across various natural language tasks." +family = "deepseek" +release_date = "2025-08-28" +last_updated = "2025-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.371358 +output = 1.3754 +cache_read = 0.371358 + +[limit] +context = 128_000 +input = 128_000 +output = 8_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml b/providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml new file mode 100644 index 00000000000..e283befe929 --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V3.2 Exp" +description = "DeepSeek-V3.2-Exp is an experimental variant of DeepSeek-V3.2 with extended context and non-thinking mode for fast responses." +family = "deepseek" +release_date = "2025-10-03" +last_updated = "2025-10-03" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.371358 +output = 0.563914 +cache_read = 0.371358 + +[limit] +context = 128_000 +input = 128_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-r1.toml b/providers/aimlapi/models/deepseek/deepseek-r1.toml new file mode 100644 index 00000000000..0bcdc0d420f --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-r1.toml @@ -0,0 +1,24 @@ +name = "DeepSeek Reasoner V3.1" +description = "DeepSeek Reasoner V3.1 excels in reasoning tasks with advanced chain-of-thought processing and the latest improvements in parameter activation." +family = "deepseek" +release_date = "2025-08-28" +last_updated = "2025-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.6877 +output = 2.95711 +cache_read = 0.6877 + +[limit] +context = 128_000 +input = 128_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml b/providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml new file mode 100644 index 00000000000..ff1f0cc6afc --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V3.1" +description = "DeepSeek-V3.1 is the latest advanced LLM with improved architecture and performance across various natural language tasks." +family = "deepseek" +release_date = "2025-08-28" +last_updated = "2025-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.371358 +output = 1.3754 +cache_read = 0.371358 + +[limit] +context = 128_000 +input = 128_000 +output = 8_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-reasoner.toml b/providers/aimlapi/models/deepseek/deepseek-reasoner.toml new file mode 100644 index 00000000000..eee838b7579 --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-reasoner.toml @@ -0,0 +1,24 @@ +name = "DeepSeek R1" +description = "DeepSeek R1 excels in reasoning tasks with advanced features like chain-of-thought processing and efficient parameter activation" +family = "deepseek" +release_date = "2025-08-28" +last_updated = "2025-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.364 +output = 0.546 +cache_read = 0.0364 + +[limit] +context = 128_000 +input = 128_000 +output = 127_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml b/providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml new file mode 100644 index 00000000000..49d2c75a6c6 --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V3.2 Exp" +description = "DeepSeek-V3.2-Exp is an experimental variant of DeepSeek-V3.2 with extended context and non-thinking mode for fast responses." +family = "deepseek-thinking" +release_date = "2025-10-03" +last_updated = "2025-10-03" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.371358 +output = 0.563914 +cache_read = 0.371358 + +[limit] +context = 128_000 +input = 128_000 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml new file mode 100644 index 00000000000..e14ec62d5c9 --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V4 Flash Vision Exp" +description = "DeepSeek V4 Flash Vision Exp is an experimental vision-enabled build of DeepSeek V4 Flash. It adds image understanding on top of the base model while matching it on text tasks, with a 1M-token context window and thinking mode enabled by default." +family = "deepseek" +release_date = "2026-08-21" +last_updated = "2026-08-21" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.572 +output = 1.716 +cache_read = 0.0182 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 384_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml new file mode 100644 index 00000000000..822af6bc3cd --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V4 Flash" +description = "DeepSeek V4 Flash and Pro are large language models for chat and reasoning tasks with up to 1M context length. They support both standard and thinking modes, enabling efficient responses or deeper reasoning workflows." +family = "deepseek" +release_date = "2026-04-24" +last_updated = "2026-04-24" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.182 +output = 0.364 +cache_read = 0.00364 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 384_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml new file mode 100644 index 00000000000..710bd150065 --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V4 Pro 0813" +description = "DeepSeek V4 Pro 0813 is the GA release of DeepSeek V4 Pro — a large-scale mixture-of-experts model for chat and reasoning tasks with 1M context length, supporting both standard and thinking modes." +family = "deepseek" +release_date = "2026-08-12" +last_updated = "2026-08-12" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.393196 +output = 4.786392 +cache_read = 0.199433 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 384_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml new file mode 100644 index 00000000000..0494f280ab4 --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -0,0 +1,24 @@ +name = "DeepSeek V4 Pro" +description = "DeepSeek V4 Flash and Pro are large language models for chat and reasoning tasks with up to 1M context length. They support both standard and thinking modes, enabling efficient responses or deeper reasoning workflows." +family = "deepseek" +release_date = "2026-04-24" +last_updated = "2026-04-24" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.5655 +output = 1.131 +cache_read = 0.0047125 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 384_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml new file mode 100644 index 00000000000..015b166c9aa --- /dev/null +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml @@ -0,0 +1,24 @@ +name = "Gemini 2.5 Flash Lite Preview" +description = "Gemini 2.5 Flash Lite Preview is a lightweight AI model developed by Google, optimized for quick responses and efficient processing, making it ideal for tasks requiring minimal latency and resource consumption" +family = "gemini" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.0975 +output = 0.39 +cache_read = 0.0975 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 1_048_576 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml new file mode 100644 index 00000000000..015b166c9aa --- /dev/null +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -0,0 +1,24 @@ +name = "Gemini 2.5 Flash Lite Preview" +description = "Gemini 2.5 Flash Lite Preview is a lightweight AI model developed by Google, optimized for quick responses and efficient processing, making it ideal for tasks requiring minimal latency and resource consumption" +family = "gemini" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.0975 +output = 0.39 +cache_read = 0.0975 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 1_048_576 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-2.5-pro.toml b/providers/aimlapi/models/google/gemini-2.5-pro.toml new file mode 100644 index 00000000000..7729dd62370 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-2.5-pro.toml @@ -0,0 +1,24 @@ +name = "Gemini 2.5 Pro" +description = "Gemini Pro 2.5 is Google's most advanced reasoning AI model designed for complex tasks, showcasing strong reasoning and coding capabilities. It leads various benchmarks, indicating its enhanced performance." +family = "gemini" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 13 +cache_read = 1.625 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-6-flash.toml b/providers/aimlapi/models/google/gemini-3-6-flash.toml new file mode 100644 index 00000000000..8326f7dfdf9 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3-6-flash.toml @@ -0,0 +1,24 @@ +name = "Gemini 3.6 Flash" +description = "Gemini 3.6 Flash is Google’s most intelligent Flash model, balancing speed with frontier intelligence for strong performance on agentic, coding and multimodal tasks, with superior search and grounding." +family = "gemini" +release_date = "2026-07-21" +last_updated = "2026-07-21" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.95 +output = 9.75 +cache_read = 0.195 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-7-flash.toml b/providers/aimlapi/models/google/gemini-3-7-flash.toml new file mode 100644 index 00000000000..d8dbbdc7314 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3-7-flash.toml @@ -0,0 +1,24 @@ +name = "Gemini 3.7 Flash" +description = "Gemini 3.7 Flash is the high-efficiency Flash model of the Gemini 3 family, with Pro-level agentic capabilities, stronger code generation and terminal execution, and high token efficiency for multi-step multimodal work." +family = "gemini" +release_date = "2026-08-13" +last_updated = "2026-08-13" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.975 +output = 4.875 +cache_read = 0.0975 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-flash-preview.toml b/providers/aimlapi/models/google/gemini-3-flash-preview.toml new file mode 100644 index 00000000000..1005f2ee312 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3-flash-preview.toml @@ -0,0 +1,24 @@ +name = "Gemini 3 Flash Preview" +description = "Gemini 3 Flash Preview is a fast, efficient variant of Gemini 3 designed for low-latency multimodal applications." +family = "gemini" +release_date = "2025-12-17" +last_updated = "2025-12-17" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.65 +output = 3.9 +cache_read = 0.65 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml new file mode 100644 index 00000000000..f79176aabe2 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml @@ -0,0 +1,24 @@ +name = "Gemini 3.1 Pro Preview" +description = "A frontier reasoning model optimized for software engineering and agentic workflows with 1M token context." +family = "gemini" +release_date = "2026-02-25" +last_updated = "2026-02-25" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 15.6 +cache_read = 0.65 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3.6-flash.toml b/providers/aimlapi/models/google/gemini-3.6-flash.toml new file mode 100644 index 00000000000..8326f7dfdf9 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.6-flash.toml @@ -0,0 +1,24 @@ +name = "Gemini 3.6 Flash" +description = "Gemini 3.6 Flash is Google’s most intelligent Flash model, balancing speed with frontier intelligence for strong performance on agentic, coding and multimodal tasks, with superior search and grounding." +family = "gemini" +release_date = "2026-07-21" +last_updated = "2026-07-21" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.95 +output = 9.75 +cache_read = 0.195 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3.7-flash.toml b/providers/aimlapi/models/google/gemini-3.7-flash.toml new file mode 100644 index 00000000000..d8dbbdc7314 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.7-flash.toml @@ -0,0 +1,24 @@ +name = "Gemini 3.7 Flash" +description = "Gemini 3.7 Flash is the high-efficiency Flash model of the Gemini 3 family, with Pro-level agentic capabilities, stronger code generation and terminal execution, and high token efficiency for multi-step multimodal work." +family = "gemini" +release_date = "2026-08-13" +last_updated = "2026-08-13" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.975 +output = 4.875 +cache_read = 0.0975 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-3-12b-it.toml b/providers/aimlapi/models/google/gemma-3-12b-it.toml new file mode 100644 index 00000000000..220d523bfaf --- /dev/null +++ b/providers/aimlapi/models/google/gemma-3-12b-it.toml @@ -0,0 +1,24 @@ +name = "Gemma 3 12B" +description = "Gemma 3 12B is a mid-size open language model from Google offering a balance of capability and efficiency." +family = "gemma" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.06877 +output = 0.20631 +cache_read = 0.055016 + +[limit] +context = 131_000 +input = 131_000 +output = 96_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-3-27b-it.toml b/providers/aimlapi/models/google/gemma-3-27b-it.toml new file mode 100644 index 00000000000..14469a91d3e --- /dev/null +++ b/providers/aimlapi/models/google/gemma-3-27b-it.toml @@ -0,0 +1,24 @@ +name = "Gemma 3 27B" +description = "Gemma 3 27B is Google's largest Gemma open model, delivering strong reasoning and text generation capabilities." +family = "gemma" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.20631 +output = 0.632684 +cache_read = 0.103155 + +[limit] +context = 128_000 +input = 128_000 +output = 131_072 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-3-4b-it.toml b/providers/aimlapi/models/google/gemma-3-4b-it.toml new file mode 100644 index 00000000000..fae7ae3c2ff --- /dev/null +++ b/providers/aimlapi/models/google/gemma-3-4b-it.toml @@ -0,0 +1,24 @@ +name = "Gemma 3 4B" +description = "Gemma 3 4B is a lightweight open language model from Google, suitable for on-device deployment and efficient inference." +family = "gemma" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.06877 +output = 0.13754 +cache_read = 0.055016 + +[limit] +context = 131_000 +input = 131_000 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml b/providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml new file mode 100644 index 00000000000..276126dd742 --- /dev/null +++ b/providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml @@ -0,0 +1,24 @@ +name = "Gemma 4 26B A4B IT" +description = "Gemma 4 26B A4B IT is an instruction-tuned Mixture-of-Experts open model from Google." +family = "gemma" +release_date = "2026-06-23" +last_updated = "2026-06-23" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.195 +output = 0.78 +cache_read = 0.195 + +[limit] +context = 262_144 +input = 262_144 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml new file mode 100644 index 00000000000..953a8582058 --- /dev/null +++ b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml @@ -0,0 +1,24 @@ +name = "Gemma 4 26B A4B IT" +description = "Gemma 4 26B A4B IT is an instruction-tuned Mixture-of-Experts open model from Google." +family = "gemma" +release_date = "2026-06-23" +last_updated = "2026-06-23" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.20631 +output = 0.82524 +cache_read = 0.20631 + +[limit] +context = 262_144 +input = 262_144 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml new file mode 100644 index 00000000000..a713feabe4d --- /dev/null +++ b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml @@ -0,0 +1,23 @@ +name = "MythoMax 13B" +description = "One of the highest performing and most popular fine-tunes of Llama 2 13B, with rich descriptions and roleplay." +release_date = "2025-12-09" +last_updated = "2025-12-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.578875 +output = 2.578875 +cache_read = 2.578875 + +[limit] +context = 4_096 +input = 4_096 +output = 4_096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/meituan/longcat-2.0.toml b/providers/aimlapi/models/meituan/longcat-2.0.toml new file mode 100644 index 00000000000..fae4399e81d --- /dev/null +++ b/providers/aimlapi/models/meituan/longcat-2.0.toml @@ -0,0 +1,24 @@ +name = "LongCat-2.0" +description = "LongCat-2.0 is Meituan's trillion-parameter agentic MoE model with a 1M-token context window and up to 128K output tokens. It supports native tool calling and multi-step reasoning." +family = "longcat" +release_date = "2026-06-30" +last_updated = "2026-06-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.975 +output = 3.8349999999999995 +cache_read = 0.0195 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml b/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml new file mode 100644 index 00000000000..6c8422c2c86 --- /dev/null +++ b/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml @@ -0,0 +1,23 @@ +name = "Llama 3.3 70B Instruct Turbo" +description = "Meta Llama 3.3 70B Instruct Turbo is an advanced language model optimized for instruction-following tasks with high efficiency and performance." +family = "llama" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.144 +output = 1.144 + +[limit] +context = 128_000 +input = 128_000 +output = 127_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml b/providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml new file mode 100644 index 00000000000..179f2db61c9 --- /dev/null +++ b/providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml @@ -0,0 +1,23 @@ +name = "Llama 3.3 70B Versatile" +description = "Llama-3.3-70B-Versatile is Meta's advanced multilingual large language model, optimized for a wide range of natural language processing tasks. With 70 billion parameters, it offers high performance across various benchmarks while maintaining efficiency suitable for diverse applications." +family = "llama" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.767 +output = 1.027 + +[limit] +context = 131_072 +input = 131_072 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/MiniMax-Text-01.toml b/providers/aimlapi/models/minimax/MiniMax-Text-01.toml new file mode 100644 index 00000000000..132810f4fc0 --- /dev/null +++ b/providers/aimlapi/models/minimax/MiniMax-Text-01.toml @@ -0,0 +1,23 @@ +name = "Text 01" +description = "MiniMax-Text-01 excels in long-context processing with advanced features like hybrid attention mechanisms and open-source accessibility." +family = "minimax" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.26 +output = 1.43 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 40_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/m1.toml b/providers/aimlapi/models/minimax/m1.toml new file mode 100644 index 00000000000..d95f3f396eb --- /dev/null +++ b/providers/aimlapi/models/minimax/m1.toml @@ -0,0 +1,23 @@ +name = "MiniMax M1" +description = "MiniMax-M1 is a powerful reasoning model with a 1M token context window, delivering strong performance on complex tasks." +family = "minimax" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.52 +output = 2.86 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 40_960 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2-1.toml b/providers/aimlapi/models/minimax/m2-1.toml new file mode 100644 index 00000000000..f1a9cff43da --- /dev/null +++ b/providers/aimlapi/models/minimax/m2-1.toml @@ -0,0 +1,24 @@ +name = "MiniMax M2.1" +description = "MiniMax-M2.1 is an updated Minimax model with a 200K context window optimized for conversational and reasoning tasks." +family = "minimax" +release_date = "2025-12-23" +last_updated = "2025-12-23" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.39 +output = 1.56 +cache_read = 0.39 + +[limit] +context = 204_000 +input = 204_000 +output = 204_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2-5-20260218.toml b/providers/aimlapi/models/minimax/m2-5-20260218.toml new file mode 100644 index 00000000000..818cb58d735 --- /dev/null +++ b/providers/aimlapi/models/minimax/m2-5-20260218.toml @@ -0,0 +1,24 @@ +name = "MiniMax M2.5" +description = "MiniMax-M2.5 is a general-purpose large language model by MiniMax designed for text generation and conversational AI use cases." +family = "minimax" +release_date = "2026-02-19" +last_updated = "2026-02-19" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.39 +output = 1.56 +cache_read = 0.39 + +[limit] +context = 204_800 +input = 204_800 +output = 204_800 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml b/providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml new file mode 100644 index 00000000000..6797e39df8a --- /dev/null +++ b/providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml @@ -0,0 +1,24 @@ +name = "MiniMax M2.5 Highspeed" +description = "MiniMax-M2.5 Highspeed is a low-latency, high-throughput version of MiniMax-M2.5 optimized for real-time applications." +family = "minimax" +release_date = "2026-02-19" +last_updated = "2026-02-19" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.78 +output = 3.12 +cache_read = 0.78 + +[limit] +context = 204_800 +input = 204_800 +output = 204_800 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2.toml b/providers/aimlapi/models/minimax/m2.toml new file mode 100644 index 00000000000..ad94739969e --- /dev/null +++ b/providers/aimlapi/models/minimax/m2.toml @@ -0,0 +1,23 @@ +name = "MiniMax M2" +description = "MiniMax-M2 is an advanced large language model with 1M token context for extended reasoning and generation." +family = "minimax" +release_date = "2025-11-04" +last_updated = "2025-11-04" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.39 +output = 1.56 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 40_960 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/minimax/minimax-m3.toml b/providers/aimlapi/models/minimax/minimax-m3.toml new file mode 100644 index 00000000000..be258352180 --- /dev/null +++ b/providers/aimlapi/models/minimax/minimax-m3.toml @@ -0,0 +1,24 @@ +name = "MiniMax M3" +description = "MiniMax M3 is a large-context reasoning model from MiniMax. Supports up to 1M context tokens and is optimized for long-document understanding, coding workflows, agent tasks, and complex multi-step reasoning." +family = "minimax-m3" +release_date = "2026-06-01" +last_updated = "2026-06-01" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.39 +output = 1.56 +cache_read = 0.078 + +[limit] +context = 524_288 +input = 524_288 +output = 524_288 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/mistralai/mistral-nemo.toml b/providers/aimlapi/models/mistralai/mistral-nemo.toml new file mode 100644 index 00000000000..8a5e3238993 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-nemo.toml @@ -0,0 +1,24 @@ +name = "Mistral NeMo" +description = "Mistral-Nemo is a powerful multilingual language model with advanced capabilities." +family = "mistral-nemo" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.20631 +output = 0.233818 +cache_read = 0.20631 + +[limit] +context = 128_000 +input = 128_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/moonshot/kimi-k2-5.toml b/providers/aimlapi/models/moonshot/kimi-k2-5.toml new file mode 100644 index 00000000000..06b66633c34 --- /dev/null +++ b/providers/aimlapi/models/moonshot/kimi-k2-5.toml @@ -0,0 +1,24 @@ +name = "Kimi K2.5" +description = "Kimi k2.5 is a powerful agentic model by Moonshot AI with strong coding and tool-use capabilities." +family = "kimi-k2" +release_date = "2026-02-06" +last_updated = "2026-02-06" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.78 +output = 3.9 +cache_read = 0.13 + +[limit] +context = 262_144 +input = 262_144 +output = 131_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml b/providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml new file mode 100644 index 00000000000..4387f1e0736 --- /dev/null +++ b/providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml @@ -0,0 +1,24 @@ +name = "Kimi K2.7 Code Highspeed" +description = "High-throughput variant of Kimi K2.7 Code from Moonshot — the same agentic coding model with extended reasoning and tool use, served at higher speed." +family = "kimi-k2" +release_date = "2026-06-22" +last_updated = "2026-06-22" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.47 +output = 10.4 +cache_read = 0.49399999999999994 + +[limit] +context = 262_144 +input = 262_144 +output = 260_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/moonshot/kimi-k2-7-code.toml b/providers/aimlapi/models/moonshot/kimi-k2-7-code.toml new file mode 100644 index 00000000000..11d913e2058 --- /dev/null +++ b/providers/aimlapi/models/moonshot/kimi-k2-7-code.toml @@ -0,0 +1,24 @@ +name = "Kimi K2.7 Code" +description = "Agentic coding model from Moonshot with extended reasoning and tool use." +family = "kimi-k2" +release_date = "2026-06-12" +last_updated = "2026-06-12" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.235 +output = 5.2 +cache_read = 0.24699999999999997 + +[limit] +context = 262_144 +input = 262_144 +output = 260_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/nousresearch/hermes-4-405b.toml b/providers/aimlapi/models/nousresearch/hermes-4-405b.toml new file mode 100644 index 00000000000..495fa1936df --- /dev/null +++ b/providers/aimlapi/models/nousresearch/hermes-4-405b.toml @@ -0,0 +1,24 @@ +name = "Hermes 4 405B" +description = "Hermes 4 is a large-scale reasoning model built on Meta-Llama-3.1-405B with hybrid reasoning mode. It can choose to deliberate internally with ... traces or respond directly, offering flexibility between speed and depth. Supports structured outputs, JSON mode, function calling, and tool use." +family = "nousresearch" +release_date = "2025-10-02" +last_updated = "2025-10-02" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.3754 +output = 4.1262 +cache_read = 1.3754 + +[limit] +context = 131_072 +input = 131_072 +output = 16_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml b/providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml new file mode 100644 index 00000000000..6f709bd307a --- /dev/null +++ b/providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml @@ -0,0 +1,23 @@ +name = "Nemotron 3 Nano 30B A3B" +description = "NVIDIA Nemotron 3 Nano 30B A3B is a lightweight MoE language model from the Nemotron 3 family, designed for efficient and scalable text generation and agent workflows with strong compute efficiency." +family = "nemotron" +release_date = "2026-04-30" +last_updated = "2026-04-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.06877 +output = 0.27508 + +[limit] +context = 262_144 +input = 262_144 +output = 228_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml b/providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml new file mode 100644 index 00000000000..896ed2fc7b5 --- /dev/null +++ b/providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml @@ -0,0 +1,23 @@ +name = "Nemotron 3 Super 120B A12B" +description = "NVIDIA Nemotron 3 Super 120B A12B is the high-capacity MoE variant of the Nemotron 3 family, delivering strong reasoning and long-context performance for demanding text generation and agent workflows while preserving MoE compute efficiency." +family = "nemotron" +release_date = "2026-04-30" +last_updated = "2026-04-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.123786 +output = 0.61893 + +[limit] +context = 262_144 +input = 262_144 +output = 262_144 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml b/providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml new file mode 100644 index 00000000000..cb7b95b096a --- /dev/null +++ b/providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml @@ -0,0 +1,24 @@ +name = "Nemotron 3 Ultra 550B A55B" +description = "NVIDIA Nemotron 3 Ultra is a reasoning and orchestration model built on a hybrid Transformer-Mamba Mixture-of-Experts architecture, optimized for complex reasoning, long-context analysis, and agent workflows with up to 1M context length." +family = "nemotron" +release_date = "2026-06-04" +last_updated = "2026-06-04" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.82524 +output = 4.95144 +cache_read = 0.20631 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml b/providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml new file mode 100644 index 00000000000..716b6fc15b0 --- /dev/null +++ b/providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml @@ -0,0 +1,23 @@ +name = "Nemotron 3.5 Lightning" +description = "NVIDIA Nemotron 3.5 Lightning is an open mixture-of-experts model with 3B active parameters out of 30B total, built for high-throughput agentic workloads and specialized task execution with up to 1M context length." +family = "nemotron" +release_date = "2026-08-11" +last_updated = "2026-08-11" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0 +output = 0 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml b/providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml new file mode 100644 index 00000000000..75228bcff3b --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml @@ -0,0 +1,24 @@ +name = "GPT-4.1" +description = "GPT-4.1 is OpenAI's large-context language model with up to 1M token input and improved instruction following." +family = "gpt" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 10.4 +cache_read = 0.65 + +[limit] +context = 1_047_576 +input = 1_047_576 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4.1.toml b/providers/aimlapi/models/openai/gpt-4.1.toml new file mode 100644 index 00000000000..75228bcff3b --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4.1.toml @@ -0,0 +1,24 @@ +name = "GPT-4.1" +description = "GPT-4.1 is OpenAI's large-context language model with up to 1M token input and improved instruction following." +family = "gpt" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 10.4 +cache_read = 0.65 + +[limit] +context = 1_047_576 +input = 1_047_576 +output = 32_768 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml b/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml new file mode 100644 index 00000000000..faa36078832 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml @@ -0,0 +1,23 @@ +name = "GPT-4o" +description = "Multimodal AI model by OpenAI enhancing human-computer interaction." +family = "gpt" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.5 +output = 19.5 + +[limit] +context = 128_000 +input = 128_000 +output = 16_384 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml b/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml new file mode 100644 index 00000000000..0e8522113e3 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml @@ -0,0 +1,24 @@ +name = "GPT-4o" +description = "Multimodal AI model by OpenAI enhancing human-computer interaction." +family = "gpt" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.25 +output = 13 +cache_read = 1.625 + +[limit] +context = 128_000 +input = 128_000 +output = 16_384 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml b/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml new file mode 100644 index 00000000000..0e8522113e3 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml @@ -0,0 +1,24 @@ +name = "GPT-4o" +description = "Multimodal AI model by OpenAI enhancing human-computer interaction." +family = "gpt" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.25 +output = 13 +cache_read = 1.625 + +[limit] +context = 128_000 +input = 128_000 +output = 16_384 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o.toml b/providers/aimlapi/models/openai/gpt-4o.toml new file mode 100644 index 00000000000..0e8522113e3 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4o.toml @@ -0,0 +1,24 @@ +name = "GPT-4o" +description = "Multimodal AI model by OpenAI enhancing human-computer interaction." +family = "gpt" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.25 +output = 13 +cache_read = 1.625 + +[limit] +context = 128_000 +input = 128_000 +output = 16_384 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-1.toml b/providers/aimlapi/models/openai/gpt-5-1.toml new file mode 100644 index 00000000000..16a1f12c4b2 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-1.toml @@ -0,0 +1,24 @@ +name = "GPT-5.1" +description = "GPT-5.1 is an incremental update to GPT-5 with improved accuracy and instruction adherence." +family = "gpt" +release_date = "2025-11-14" +last_updated = "2025-11-14" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 13 +cache_read = 0.1625 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml b/providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml new file mode 100644 index 00000000000..cc5e3c7f319 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml @@ -0,0 +1,24 @@ +name = "GPT-5.2 Chat Latest" +description = "The latest conversational release in the GPT-5.2 series with improved dialogue quality." +family = "gpt" +release_date = "2025-12-11" +last_updated = "2025-12-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.275 +output = 18.2 +cache_read = 0.2275 + +[limit] +context = 128_000 +input = 128_000 +output = 16_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-2.toml b/providers/aimlapi/models/openai/gpt-5-2.toml new file mode 100644 index 00000000000..127a4d72777 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-2.toml @@ -0,0 +1,24 @@ +name = "GPT-5.2" +description = "GPT-5.2 is OpenAI's next-generation language model with extended context and enhanced performance." +family = "gpt" +release_date = "2025-12-11" +last_updated = "2025-12-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.275 +output = 18.2 +cache_read = 0.2275 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-2025-08-07.toml b/providers/aimlapi/models/openai/gpt-5-2025-08-07.toml new file mode 100644 index 00000000000..23a961267c8 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-2025-08-07.toml @@ -0,0 +1,24 @@ +name = "GPT-5" +description = "GPT-5 is OpenAI's most advanced language model with a 400K token context window and superior reasoning capabilities." +family = "gpt" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 13 +cache_read = 0.1625 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml b/providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml new file mode 100644 index 00000000000..f2fe2f9dd7c --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml @@ -0,0 +1,24 @@ +name = "GPT-5 Mini" +description = "GPT-5 mini delivers GPT-5 capabilities in a smaller, faster package optimized for cost-sensitive applications." +family = "gpt" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.325 +output = 2.6 +cache_read = 0.0325 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-mini.toml b/providers/aimlapi/models/openai/gpt-5-mini.toml new file mode 100644 index 00000000000..7ffe48a8ab9 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-mini.toml @@ -0,0 +1,24 @@ +name = "GPT-5 Mini" +description = "GPT-5 mini delivers GPT-5 capabilities in a smaller, faster package optimized for cost-sensitive applications." +family = "gpt" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.378235 +output = 3.02588 +cache_read = 0.34385 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml b/providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml new file mode 100644 index 00000000000..82f8edb5710 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml @@ -0,0 +1,24 @@ +name = "GPT-5 Nano" +description = "GPT-5 nano is the most lightweight GPT-5 variant, built for ultra-low latency use cases." +family = "gpt" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.065 +output = 0.52 +cache_read = 0.0065 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-nano.toml b/providers/aimlapi/models/openai/gpt-5-nano.toml new file mode 100644 index 00000000000..6680551d190 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-nano.toml @@ -0,0 +1,24 @@ +name = "GPT-5 Nano" +description = "GPT-5 nano is the most lightweight GPT-5 variant, built for ultra-low latency use cases." +family = "gpt" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.075647 +output = 0.605176 +cache_read = 0.06877 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml new file mode 100644 index 00000000000..d00e8536048 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -0,0 +1,23 @@ +name = "GPT-5 Pro" +description = "GPT-5 Pro is the most powerful GPT-5 variant, offering extended output and superior performance for complex tasks." +family = "gpt" +release_date = "2025-11-21" +last_updated = "2025-11-21" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 20.631 +output = 165.048 + +[limit] +context = 400_000 +input = 400_000 +output = 272_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml b/providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml new file mode 100644 index 00000000000..16a1f12c4b2 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml @@ -0,0 +1,24 @@ +name = "GPT-5.1" +description = "GPT-5.1 is an incremental update to GPT-5 with improved accuracy and instruction adherence." +family = "gpt" +release_date = "2025-11-14" +last_updated = "2025-11-14" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 13 +cache_read = 0.1625 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml new file mode 100644 index 00000000000..07247594f82 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml @@ -0,0 +1,24 @@ +name = "GPT-5.1 Codex Mini" +description = "GPT-5.1 Codex Mini is a lighter coding model optimized for fast code completions and suggestions." +family = "gpt" +release_date = "2025-11-14" +last_updated = "2025-11-14" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.34385 +output = 2.7508 +cache_read = 0.041262 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex.toml b/providers/aimlapi/models/openai/gpt-5.1-codex.toml new file mode 100644 index 00000000000..a4e5580499c --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.1-codex.toml @@ -0,0 +1,24 @@ +name = "GPT-5.1 Codex" +description = "GPT-5.1 Codex is a coding-specialized model from the GPT-5.1 series for code generation and understanding." +family = "gpt" +release_date = "2025-11-14" +last_updated = "2025-11-14" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.4385 +output = 27.508 +cache_read = 0.34385 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml b/providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml new file mode 100644 index 00000000000..127a4d72777 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml @@ -0,0 +1,24 @@ +name = "GPT-5.2" +description = "GPT-5.2 is OpenAI's next-generation language model with extended context and enhanced performance." +family = "gpt" +release_date = "2025-12-11" +last_updated = "2025-12-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.275 +output = 18.2 +cache_read = 0.2275 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml b/providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml new file mode 100644 index 00000000000..cc5e3c7f319 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml @@ -0,0 +1,24 @@ +name = "GPT-5.2 Chat Latest" +description = "The latest conversational release in the GPT-5.2 series with improved dialogue quality." +family = "gpt" +release_date = "2025-12-11" +last_updated = "2025-12-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.275 +output = 18.2 +cache_read = 0.2275 + +[limit] +context = 128_000 +input = 128_000 +output = 16_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-codex.toml b/providers/aimlapi/models/openai/gpt-5.2-codex.toml new file mode 100644 index 00000000000..57ce8a12896 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.2-codex.toml @@ -0,0 +1,24 @@ +name = "GPT-5.2 Codex" +description = "GPT-5.2 Codex is a coding-specialized model from the GPT-5.2 series for advanced code generation." +family = "gpt" +release_date = "2026-01-21" +last_updated = "2026-01-21" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.8139 +output = 38.5112 +cache_read = 0.48139 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-pro.toml b/providers/aimlapi/models/openai/gpt-5.2-pro.toml new file mode 100644 index 00000000000..dcdfb431f96 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.2-pro.toml @@ -0,0 +1,23 @@ +name = "GPT-5.2 Pro" +description = "GPT-5.2 Pro is the flagship GPT-5.2 variant offering maximum output size and reasoning depth." +family = "gpt" +release_date = "2025-12-11" +last_updated = "2025-12-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 28.8834 +output = 231.0672 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.3-codex.toml b/providers/aimlapi/models/openai/gpt-5.3-codex.toml new file mode 100644 index 00000000000..dfe1a91d921 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.3-codex.toml @@ -0,0 +1,24 @@ +name = "GPT-5.3 Codex" +description = "GPT-5.3 Codex is a coding-specialized model from the GPT-5.3 series for advanced code generation." +family = "gpt" +release_date = "2026-03-02" +last_updated = "2026-03-02" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.8139 +output = 38.5112 +cache_read = 0.48139 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.toml b/providers/aimlapi/models/openai/gpt-5.toml new file mode 100644 index 00000000000..4244e5c135e --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.toml @@ -0,0 +1,24 @@ +name = "GPT-5" +description = "GPT-5 is OpenAI's most advanced language model with a 400K token context window and superior reasoning capabilities." +family = "gpt" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.891175 +output = 15.1294 +cache_read = 1.71925 + +[limit] +context = 400_000 +input = 400_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-oss-120b.toml b/providers/aimlapi/models/openai/gpt-oss-120b.toml new file mode 100644 index 00000000000..3e92a8894ef --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-oss-120b.toml @@ -0,0 +1,24 @@ +name = "GPT OSS 120B" +description = "GPT OSS 120B is the most powerful Open AI open weight model." +family = "gpt-oss" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.48139 +output = 1.30663 +cache_read = 0.48139 + +[limit] +context = 131_000 +input = 131_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-oss-20b.toml b/providers/aimlapi/models/openai/gpt-oss-20b.toml new file mode 100644 index 00000000000..0fa6aded63b --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-oss-20b.toml @@ -0,0 +1,24 @@ +name = "GPT OSS 20B" +description = "GPT OSS 20B is a powerful Open AI open weight model." +family = "gpt-oss" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.103155 +output = 0.41262 +cache_read = 0.0515775 + +[limit] +context = 131_000 +input = 131_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/o3-2025-04-16.toml b/providers/aimlapi/models/openai/o3-2025-04-16.toml new file mode 100644 index 00000000000..366eb3bdea7 --- /dev/null +++ b/providers/aimlapi/models/openai/o3-2025-04-16.toml @@ -0,0 +1,24 @@ +name = "o3" +description = "OpenAI o3 is a frontier reasoning model with exceptional performance on complex scientific, math, and coding tasks." +family = "o" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 2.6 +output = 10.4 +cache_read = 0.65 + +[limit] +context = 200_000 +input = 200_000 +output = 100_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/openai/o4-mini-2025-04-16.toml b/providers/aimlapi/models/openai/o4-mini-2025-04-16.toml new file mode 100644 index 00000000000..399abd13e1d --- /dev/null +++ b/providers/aimlapi/models/openai/o4-mini-2025-04-16.toml @@ -0,0 +1,24 @@ +name = "o4 Mini" +description = "OpenAI o4-mini is a compact reasoning model that delivers strong performance with lower latency and cost." +family = "o" +release_date = "2025-08-07" +last_updated = "2025-08-07" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.43 +output = 5.72 +cache_read = 0.3575 + +[limit] +context = 200_000 +input = 200_000 +output = 100_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/perplexity/sonar-pro.toml b/providers/aimlapi/models/perplexity/sonar-pro.toml new file mode 100644 index 00000000000..5d88a2f9ea4 --- /dev/null +++ b/providers/aimlapi/models/perplexity/sonar-pro.toml @@ -0,0 +1,23 @@ +name = "Sonar Pro" +description = "Perplexity Sonar Pro is an advanced search-augmented language model with deeper reasoning and broader web coverage." +family = "sonar-pro" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 3.9 +output = 19.5 + +[limit] +context = 200_000 +input = 200_000 +output = 100_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/perplexity/sonar.toml b/providers/aimlapi/models/perplexity/sonar.toml new file mode 100644 index 00000000000..036db6a1d8d --- /dev/null +++ b/providers/aimlapi/models/perplexity/sonar.toml @@ -0,0 +1,23 @@ +name = "Sonar" +description = "Perplexity Sonar is a fast search-augmented language model grounded in real-time web data for up-to-date answers." +family = "sonar" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.3 +output = 1.3 + +[limit] +context = 128_000 +input = 128_000 +output = 100_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/sakana/fugu-ultra.toml b/providers/aimlapi/models/sakana/fugu-ultra.toml new file mode 100644 index 00000000000..37ecd1d9ae2 --- /dev/null +++ b/providers/aimlapi/models/sakana/fugu-ultra.toml @@ -0,0 +1,24 @@ +name = "Fugu Ultra" +description = "Fugu Ultra is the higher-performance model in Sakana AI's Fugu family. Rather than a standard monolithic language model, it is a learned multi-agent orchestration system: a model trained to route tasks across a swappable pool of underlying models and to recursively call instances of itself. It is optimized for complex, multi-step reasoning, coding, and agentic workflows, with orchestration tokens billed as standard input/output tokens." +family = "fugu" +release_date = "2026-06-24" +last_updated = "2026-06-24" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 6.877 +output = 41.262 +cache_read = 0.6877 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/sakana/sakana-namazu.toml b/providers/aimlapi/models/sakana/sakana-namazu.toml new file mode 100644 index 00000000000..1aae96e483d --- /dev/null +++ b/providers/aimlapi/models/sakana/sakana-namazu.toml @@ -0,0 +1,24 @@ +name = "Sakana Namazu" +description = "Sakana Namazu is a Japanese-specialized reasoning model from Sakana AI, based on Kimi K2.6 with additional training for Japanese language and business contexts. It is suited for Japanese instruction following and business workflows, supports a 262K context window, and accepts text, image, and file inputs." +family = "sakana-namazu" +release_date = "2026-08-11" +last_updated = "2026-08-11" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.30663 +output = 5.5016 +cache_read = 0.20631 + +[limit] +context = 262_144 +input = 262_144 +output = 65_536 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/stepfun/step-3.7-flash.toml b/providers/aimlapi/models/stepfun/step-3.7-flash.toml new file mode 100644 index 00000000000..06c8efc9b26 --- /dev/null +++ b/providers/aimlapi/models/stepfun/step-3.7-flash.toml @@ -0,0 +1,24 @@ +name = "Step 3.7 Flash" +description = "Step 3.7 Flash is a multimodal Mixture-of-Experts model from StepFun with text, image, and video understanding. It supports a 256K context window and is optimized for fast inference, reasoning, agent workflows, and long-context productivity tasks." +family = "step" +release_date = "2026-06-01" +last_updated = "2026-06-01" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.27508 +output = 1.58171 +cache_read = 0.055016 + +[limit] +context = 256_000 +input = 256_000 +output = 256_000 + +[modalities] +input = ["image", "text", "video"] +output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml b/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml new file mode 100644 index 00000000000..63fb3e2d26f --- /dev/null +++ b/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml @@ -0,0 +1,23 @@ +name = "Hy-MT2-1.8B" +description = "Hy-MT2-1.8B is a compact 1.8B-parameter translation model from Tencent. It supports 33 language pairs and five Chinese dialect and minority-language pairs, with workflows for structured, delimiter-based, contextual, glossary-based, and style-guided translation." +family = "Hy" +release_date = "2026-08-20" +last_updated = "2026-08-20" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.06051759999999999 +output = 0.2434458 + +[limit] +context = 8_192 +input = 8_192 +output = 4_096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml b/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml new file mode 100644 index 00000000000..c12eadca9b3 --- /dev/null +++ b/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml @@ -0,0 +1,23 @@ +name = "Hy-MT2-30B-A3B" +description = "Hy-MT2-30B-A3B is Tencent's flagship translation model in the Hy-MT2 family. It supports 33 language pairs plus five Chinese dialect and minority-language pairs, with workflows for structured, delimiter-based, contextual and glossary-based translation." +family = "Hy" +release_date = "2026-08-20" +last_updated = "2026-08-20" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.1017796 +output = 0.405743 + +[limit] +context = 8_192 +input = 8_192 +output = 4_096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy-mt2-7b.toml b/providers/aimlapi/models/tencent/hy-mt2-7b.toml new file mode 100644 index 00000000000..8b2ab3a201f --- /dev/null +++ b/providers/aimlapi/models/tencent/hy-mt2-7b.toml @@ -0,0 +1,23 @@ +name = "Hy-MT2-7B" +description = "Hy-MT2-7B is a 7B-parameter translation model from Tencent. It supports 33 language pairs and five Chinese dialect and minority-language pairs, with workflows for structured, delimiter-based, contextual, glossary-based, and style-guided translation." +family = "Hy" +release_date = "2026-08-19" +last_updated = "2026-08-19" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.1017796 +output = 0.405743 + +[limit] +context = 8_192 +input = 8_192 +output = 4_096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy4-preview.toml b/providers/aimlapi/models/tencent/hy4-preview.toml new file mode 100644 index 00000000000..e9ca1a5cb9d --- /dev/null +++ b/providers/aimlapi/models/tencent/hy4-preview.toml @@ -0,0 +1,23 @@ +name = "Hy4 preview" +description = "Hy4 preview is a mixture-of-experts model from Tencent with 49B active parameters out of 770B total, built for coding agents, complex tool-use workflows and productivity tasks. It has a 1M-token context window and configurable reasoning effort." +release_date = "2026-08-28" +last_updated = "2026-08-28" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.1470836 +output = 3.4398754 +cache_read = 0.0577668 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 64_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/thinkingmachines/inkling-small.toml b/providers/aimlapi/models/thinkingmachines/inkling-small.toml new file mode 100644 index 00000000000..650b4a42afb --- /dev/null +++ b/providers/aimlapi/models/thinkingmachines/inkling-small.toml @@ -0,0 +1,23 @@ +name = "Inkling Small" +description = "Inkling Small is an open-weight multimodal mixture-of-experts model from Thinking Machines Lab, with 12B active parameters out of 276B total. It is positioned as the smaller, more efficient member of the Inkling family." +release_date = "2026-07-30" +last_updated = "2026-07-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.797732 +output = 1.980576 +cache_read = 0.1595464 + +[limit] +context = 524_288 +input = 524_288 +output = 262_144 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/upstage/solar-pro4.toml b/providers/aimlapi/models/upstage/solar-pro4.toml new file mode 100644 index 00000000000..64980444a79 --- /dev/null +++ b/providers/aimlapi/models/upstage/solar-pro4.toml @@ -0,0 +1,24 @@ +name = "Solar Pro 4" +description = "Solar Pro 4 is a large language model from Upstage. It is suited for agentic workflows, office productivity, document-intensive work, and coding." +family = "solar" +release_date = "2026-08-10" +last_updated = "2026-08-10" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.041262 +output = 0.165048 +cache_read = 0.0082524 + +[limit] +context = 524_288 +input = 524_288 +output = 131_072 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-3-beta.toml b/providers/aimlapi/models/x-ai/grok-3-beta.toml new file mode 100644 index 00000000000..9a3320db9b8 --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-3-beta.toml @@ -0,0 +1,24 @@ +name = "Grok 3 Beta" +description = "Grok 3 Beta is xAI's advanced language model with strong reasoning and broad knowledge capabilities." +family = "grok" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 131_000 +input = 131_000 +output = 130_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-3-mini-beta.toml b/providers/aimlapi/models/x-ai/grok-3-mini-beta.toml new file mode 100644 index 00000000000..0d390c78b7f --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-3-mini-beta.toml @@ -0,0 +1,24 @@ +name = "Grok 3 Beta Mini" +description = "Grok 3 Beta Mini is a compact, efficient variant of Grok 3 optimized for speed and cost-effective inference." +family = "grok" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 131_000 +input = 131_000 +output = 130_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml new file mode 100644 index 00000000000..8c6dd4465e2 --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml @@ -0,0 +1,24 @@ +name = "Grok 4.1 Fast Non-Reasoning" +description = "Grok 4.1 Fast without reasoning for faster responses and lower latency in high-performance agentic applications." +family = "grok" +release_date = "2025-11-20" +last_updated = "2025-11-20" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +input = 2_000_000 +output = 1_999_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml new file mode 100644 index 00000000000..c3a03b76a6a --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml @@ -0,0 +1,24 @@ +name = "Grok 4.1 Fast Reasoning" +description = "Grok 4.1 Fast is a frontier multimodal model optimized for high-performance agentic tool calling with advanced reasoning capabilities." +family = "grok" +release_date = "2025-11-20" +last_updated = "2025-11-20" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +input = 2_000_000 +output = 1_999_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml new file mode 100644 index 00000000000..79ee2f9180c --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml @@ -0,0 +1,24 @@ +name = "Grok 4.20 Non-Reasoning" +description = "Grok 4.20 Non-Reasoning — a general-purpose language model optimized for standard text generation and conversational tasks, without extended reasoning capabilities." +family = "grok" +release_date = "2026-04-09" +last_updated = "2026-04-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +input = 2_000_000 +output = 1_999_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml new file mode 100644 index 00000000000..bb2642d914b --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml @@ -0,0 +1,24 @@ +name = "Grok 4.20 Reasoning" +description = "Grok 4.20 Reasoning — a large language model designed for advanced reasoning tasks. It excels at multi-step problem solving, logical analysis, and complex instruction following." +family = "grok" +release_date = "2026-04-09" +last_updated = "2026-04-09" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +input = 2_000_000 +output = 1_999_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-3.toml b/providers/aimlapi/models/x-ai/grok-4-3.toml new file mode 100644 index 00000000000..115e62d2432 --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-3.toml @@ -0,0 +1,24 @@ +name = "Grok 4.3" +description = "Grok 4.3 is a large language model by xAI for text generation and reasoning tasks. Supports up to 1M context tokens and is optimized for conversational AI and analytical workflows." +family = "grok" +release_date = "2026-05-05" +last_updated = "2026-05-05" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 1_000_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml new file mode 100644 index 00000000000..7364af4b893 --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml @@ -0,0 +1,24 @@ +name = "Grok 4 Fast Non-Reasoning" +description = "Grok 4 Fast without reasoning for faster responses and lower latency." +family = "grok" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +input = 2_000_000 +output = 1_999_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml new file mode 100644 index 00000000000..016fec90f40 --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml @@ -0,0 +1,24 @@ +name = "Grok 4 Fast Reasoning" +description = "Grok 4 Fast with always-on reasoning for complex problem-solving tasks." +family = "grok" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +input = 2_000_000 +output = 1_999_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-code-fast-1.toml b/providers/aimlapi/models/x-ai/grok-code-fast-1.toml new file mode 100644 index 00000000000..6ad387bf9bd --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-code-fast-1.toml @@ -0,0 +1,24 @@ +name = "Grok Code Fast 1" +description = "A speedy and economical reasoning model that excels at agentic coding with function calling and structured outputs." +family = "grok" +release_date = "2025-09-30" +last_updated = "2025-09-30" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.3 +output = 2.6 +cache_read = 0.26 + +[limit] +context = 256_000 +input = 256_000 +output = 255_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml new file mode 100644 index 00000000000..9586b604742 --- /dev/null +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -0,0 +1,24 @@ +name = "MiMo V2.5 Pro" +description = "MiMo-V2.5-Pro — a flagship reasoning model by Xiaomi designed for complex agentic workflows, long-horizon tasks, and advanced software engineering scenarios with a 1M token context window." +family = "mimo-v2.5-pro" +release_date = "2026-04-23" +last_updated = "2026-04-23" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.598299 +output = 1.196598 +cache_read = 0.00495144 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml new file mode 100644 index 00000000000..cc34d0620fa --- /dev/null +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -0,0 +1,24 @@ +name = "MiMo V2.5" +description = "MiMo-V2.5 — a native omnimodal model by Xiaomi for text, image, audio, and video understanding. It delivers strong agentic performance at lower cost, making it suitable for general-purpose AI applications." +family = "mimo-v2.5" +release_date = "2026-04-23" +last_updated = "2026-04-23" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.192556 +output = 0.385112 +cache_read = 0.0038511200000000004 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 128_000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml new file mode 100644 index 00000000000..55777da55b8 --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -0,0 +1,24 @@ +name = "GLM 5.3 Flash" +description = "GLM-5.3 Flash is the low-cost, high-throughput variant of Zhipu AI GLM-5.3, with a 1M-token context window and text, image and video understanding." +family = "glm" +release_date = "2026-08-26" +last_updated = "2026-08-26" +attachment = true +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.0975 +output = 0.325 +cache_read = 0.0195 + +[limit] +context = 1_048_576 +input = 1_048_576 +output = 131_072 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.5-air.toml b/providers/aimlapi/models/zhipu/glm-4.5-air.toml new file mode 100644 index 00000000000..70f286dae39 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-4.5-air.toml @@ -0,0 +1,24 @@ +name = "GLM 4.5 Air" +description = "Lightweight version of GLM-4.5 for cost-effective applications" +family = "glm" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.26 +output = 1.43 +cache_read = 0.039 + +[limit] +context = 128_000 +input = 128_000 +output = 98_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.5.toml b/providers/aimlapi/models/zhipu/glm-4.5.toml new file mode 100644 index 00000000000..a0e264a7738 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-4.5.toml @@ -0,0 +1,24 @@ +name = "GLM 4.5" +description = "Advanced version of GLM-4.5 with enhanced capabilities and web search integration" +family = "glm" +release_date = "2025-09-09" +last_updated = "2025-09-09" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.78 +output = 2.86 +cache_read = 0.143 + +[limit] +context = 128_000 +input = 128_000 +output = 98_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.6.toml b/providers/aimlapi/models/zhipu/glm-4.6.toml new file mode 100644 index 00000000000..f2dd20741b1 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-4.6.toml @@ -0,0 +1,24 @@ +name = "GLM 4.6" +description = "Advanced version of GLM-4.6 with web search integration and enhanced capabilities" +family = "glm" +release_date = "2025-10-02" +last_updated = "2025-10-02" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.78 +output = 2.86 +cache_read = 0.143 + +[limit] +context = 200_000 +input = 200_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.7.toml b/providers/aimlapi/models/zhipu/glm-4.7.toml new file mode 100644 index 00000000000..70394acd2a1 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-4.7.toml @@ -0,0 +1,24 @@ +name = "GLM 4.7" +description = "GLM-4.7 is Zhipu AI flagship text LLM optimized for agentic coding and stable multi-step reasoning, supporting long-context workflows." +family = "glm" +release_date = "2025-12-23" +last_updated = "2025-12-23" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 0.78 +output = 2.86 +cache_read = 0.143 + +[limit] +context = 200_000 +input = 200_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml b/providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml new file mode 100644 index 00000000000..e6cf4b4c3bd --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml @@ -0,0 +1,24 @@ +name = "GLM 5.2 Fast Preview" +description = "A latency-optimized GLM-5.2 preview with the same 1M-token context window and 1.5–2× higher output throughput for real-time chat, agents, and coding." +family = "glm" +release_date = "2026-07-10" +last_updated = "2026-07-10" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 4.55 +output = 14.3 +cache_read = 0.91 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5-2.toml b/providers/aimlapi/models/zhipu/glm-5-2.toml new file mode 100644 index 00000000000..25dfee5cbaf --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5-2.toml @@ -0,0 +1,24 @@ +name = "GLM 5.2" +description = "GLM-5.2 is Zhipu AI flagship MoE LLM with a 1M-token context window, optimized for agentic coding, tool use, reasoning, and long-context tasks." +family = "glm" +release_date = "2026-06-16" +last_updated = "2026-06-16" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.338 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5-3.toml b/providers/aimlapi/models/zhipu/glm-5-3.toml new file mode 100644 index 00000000000..39ef4b76da2 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5-3.toml @@ -0,0 +1,24 @@ +name = "GLM 5.3" +description = "GLM-5.3 is Zhipu AI flagship MoE LLM with a 1M-token context window, built for advanced text generation and deep reasoning." +family = "glm" +release_date = "2026-08-17" +last_updated = "2026-08-17" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.338 + +[limit] +context = 1_024_000 +input = 1_024_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5.2.toml b/providers/aimlapi/models/zhipu/glm-5.2.toml new file mode 100644 index 00000000000..25dfee5cbaf --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5.2.toml @@ -0,0 +1,24 @@ +name = "GLM 5.2" +description = "GLM-5.2 is Zhipu AI flagship MoE LLM with a 1M-token context window, optimized for agentic coding, tool use, reasoning, and long-context tasks." +family = "glm" +release_date = "2026-06-16" +last_updated = "2026-06-16" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.338 + +[limit] +context = 1_000_000 +input = 1_000_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5.3.toml b/providers/aimlapi/models/zhipu/glm-5.3.toml new file mode 100644 index 00000000000..39ef4b76da2 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5.3.toml @@ -0,0 +1,24 @@ +name = "GLM 5.3" +description = "GLM-5.3 is Zhipu AI flagship MoE LLM with a 1M-token context window, built for advanced text generation and deep reasoning." +family = "glm" +release_date = "2026-08-17" +last_updated = "2026-08-17" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.338 + +[limit] +context = 1_024_000 +input = 1_024_000 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5.toml b/providers/aimlapi/models/zhipu/glm-5.toml new file mode 100644 index 00000000000..2e6c89f2318 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5.toml @@ -0,0 +1,24 @@ +name = "GLM 5" +description = "GLM-5 is Zhipu AI next-generation 745B MoE LLM for high-quality text generation and reasoning, optimized for chat, long-form content, and instruction-following tasks." +family = "glm" +release_date = "2026-02-12" +last_updated = "2026-02-12" +attachment = false +reasoning = false +tool_call = false +structured_output = false +open_weights = false + +[cost] +input = 1.3 +output = 4.16 +cache_read = 0.26 + +[limit] +context = 200_000 +input = 200_000 +output = 128_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/aimlapi/provider.toml b/providers/aimlapi/provider.toml new file mode 100755 index 00000000000..6b7a3f559b9 --- /dev/null +++ b/providers/aimlapi/provider.toml @@ -0,0 +1,5 @@ +name = "AI/ML API" +env = ["AIMLAPI_API_KEY"] +npm = "@ai-sdk/openai-compatible" +api = "https://api.aimlapi.com/v1" +doc = "https://docs.aimlapi.com" From 69cc1c914b324f004fd100a95cf13167f6515ee4 Mon Sep 17 00:00:00 2001 From: Lookoff123 Date: Wed, 2 Sep 2026 15:03:04 +0500 Subject: [PATCH 02/38] fix(aimlapi): reference lab entries with base_model instead of inlining them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI/ML API hosts other people's models and authors none of them, so every entry has to point at the lab file. AGENTS.md makes that a blocker ("Non-lab hosts use base_model"), and the previous full inlines both violated it and drifted from the repository's own data: 65 models disagreed with their lab entry on reasoning, 75 on tool_call, 37 on structured_output, 17 on attachment. openai/gpt-5 shipped here as reasoning = false, tool_call = false while models/openai/gpt-5.toml says both are true. The cause was a fallback of the shape `existing?.reasoning ?? false`. `existing` only ever reads this provider's own directory, which does not exist for a new provider, so the guard never applied and every model was written as false. The entries now carry no capability flags at all, so there is nothing left to contradict. What a file states is now only what is genuinely ours: cost, a limit when it differs from the base, and reasoning_options. The limit no longer sets `input`, because the catalog publishes a context window and an output cap but no input cap, and equating input with the whole context overwrote the lab's correct split (272k in + 128k out inside a 400k window). reasoning_options is required whenever the base reasons, and no lab entry carries it (0 of 245). It is read per model from the API's own published request schema at /docs-json, so the declared control is the one the endpoint actually accepts rather than an assumption. Coverage is 108 of the 338 text-output chat models. 192 are skipped because this repository has no lab entry to point at — authoring complete lab files for them would mean sourcing capability metadata the catalog does not publish — and 38 because their base reasons but the API does not document the control. Both groups are reported through skippedNotice. Verified: bun run validate exits 0 and resolves aimlapi/openai/gpt-5 to reasoning = true, tool_call = true and the lab limit split, with our price. bun test is 268 pass / 4 fail, the same four failures a pristine tree produces. Re-running the sync reports 108 unchanged. Co-Authored-By: Claude Opus 5 --- packages/core/src/sync/providers/aimlapi.ts | 309 +++++++++++------- .../Qwen/Qwen2.5-7B-Instruct-Turbo.toml | 23 -- .../Qwen/Qwen3-235B-A22B-Thinking-2507.toml | 23 -- .../Qwen3-Coder-480B-A35B-Instruct-FP8.toml | 23 -- .../models/alibaba/glm-5.2-fast-preview.toml | 24 -- providers/aimlapi/models/alibaba/glm-5.2.toml | 24 -- .../aimlapi/models/alibaba/qwen-max.toml | 17 +- .../aimlapi/models/alibaba/qwen-plus.toml | 24 -- .../aimlapi/models/alibaba/qwen-turbo.toml | 24 -- .../qwen3-235b-a22b-thinking-2507.toml | 22 -- .../aimlapi/models/alibaba/qwen3-32b.toml | 22 -- .../qwen3-coder-480b-a35b-instruct.toml | 16 +- .../models/alibaba/qwen3-max-preview.toml | 23 -- .../aimlapi/models/alibaba/qwen3-max.toml | 19 +- .../alibaba/qwen3-next-80b-a3b-instruct.toml | 15 +- .../alibaba/qwen3-next-80b-a3b-thinking.toml | 22 -- .../alibaba/qwen3-omni-30b-a3b-captioner.toml | 22 -- .../models/alibaba/qwen3-vl-32b-instruct.toml | 22 -- .../models/alibaba/qwen3-vl-32b-thinking.toml | 22 -- .../models/alibaba/qwen3-vl-flash.toml | 23 -- .../aimlapi/models/alibaba/qwen3-vl-plus.toml | 22 -- .../aimlapi/models/alibaba/qwen3.5-flash.toml | 24 +- .../models/alibaba/qwen3.5-plus-20260218.toml | 23 -- .../aimlapi/models/alibaba/qwen3.5-plus.toml | 23 -- .../aimlapi/models/alibaba/qwen3.6-27b.toml | 13 + .../models/alibaba/qwen3.6-35b-a3b.toml | 13 + .../aimlapi/models/alibaba/qwen3.6-flash.toml | 23 -- .../models/alibaba/qwen3.6-max-preview.toml | 23 -- .../aimlapi/models/alibaba/qwen3.6-plus.toml | 23 -- .../aimlapi/models/alibaba/qwen3.7-max.toml | 24 +- .../aimlapi/models/alibaba/qwen3.7-plus.toml | 24 -- .../models/alibaba/qwen3.8-2.4t-a95b.toml | 20 +- .../aimlapi/models/alibaba/qwen3.8-27b.toml | 20 +- .../aimlapi/models/alibaba/qwen3.8-flash.toml | 23 +- .../aimlapi/models/alibaba/qwen3.8-max.toml | 24 +- .../models/anthracite-org/magnum-v4-72b.toml | 22 -- .../models/anthropic/claude-fable-5.toml | 24 -- .../anthropic/claude-haiku-4-5-20251001.toml | 24 -- .../models/anthropic/claude-haiku-4.5.toml | 24 +- .../anthropic/claude-opus-4-1-20250805.toml | 24 -- .../anthropic/claude-opus-4-5-20251101.toml | 24 -- .../models/anthropic/claude-opus-4-6.toml | 24 -- .../models/anthropic/claude-opus-4-8.toml | 24 -- .../models/anthropic/claude-opus-4.1.toml | 24 +- .../models/anthropic/claude-opus-4.5.toml | 24 +- .../anthropic/claude-opus-4.7-fast.toml | 10 + .../models/anthropic/claude-opus-4.7.toml | 10 + .../anthropic/claude-opus-4.8-fast.toml | 10 + .../models/anthropic/claude-opus-4.8.toml | 24 +- .../models/anthropic/claude-opus-5.toml | 24 -- .../anthropic/claude-sonnet-4-5-20250929.toml | 24 -- .../models/anthropic/claude-sonnet-4-6.toml | 24 -- .../models/anthropic/claude-sonnet-4.5.toml | 24 +- .../models/anthropic/claude-sonnet-4.6.toml | 21 +- .../models/anthropic/claude-sonnet-5.toml | 24 -- .../arcee-ai/trinity-large-thinking.toml | 14 + .../models/baidu/ernie-4.5-vl-424b-a47b.toml | 23 -- providers/aimlapi/models/baidu/ernie-5.0.toml | 23 -- .../models/bytedance-seed/seed-2-1-turbo.toml | 23 -- .../models/bytedance-seed/seed-2.0-code.toml | 24 +- .../models/bytedance-seed/seed-2.0-lite.toml | 13 + .../models/bytedance-seed/seed-2.0-mini.toml | 13 + .../aimlapi/models/bytedance/seed-1-8.toml | 23 -- .../aimlapi/models/cohere/command-a.toml | 23 -- .../models/cohere/command-r-08-2024.toml | 5 + .../models/cohere/command-r-plus-08-2024.toml | 5 + .../models/cohere/command-r7b-12-2024.toml | 5 + .../models/deepseek/deepseek-chat-v3.1.toml | 24 -- .../models/deepseek/deepseek-chat.toml | 16 +- .../deepseek-non-reasoner-v3.1-terminus.toml | 24 -- .../deepseek-non-thinking-v3.2-exp.toml | 24 -- .../aimlapi/models/deepseek/deepseek-r1.toml | 24 -- .../deepseek-reasoner-v3.1-terminus.toml | 24 -- .../models/deepseek/deepseek-reasoner.toml | 24 -- .../deepseek/deepseek-thinking-v3.2-exp.toml | 24 -- .../deepseek-v4-flash-vision-exp.toml | 21 +- .../models/deepseek/deepseek-v4-flash.toml | 24 +- .../models/deepseek/deepseek-v4-pro-0813.toml | 21 +- .../models/deepseek/deepseek-v4-pro.toml | 24 +- .../models/google/gemini-2.5-flash-image.toml | 10 + .../google/gemini-2.5-flash-lite-preview.toml | 24 -- .../models/google/gemini-2.5-flash-lite.toml | 20 +- .../aimlapi/models/google/gemini-2.5-pro.toml | 24 -- .../models/google/gemini-3-6-flash.toml | 24 -- .../models/google/gemini-3-7-flash.toml | 24 -- .../models/google/gemini-3-flash-preview.toml | 24 -- .../google/gemini-3-pro-image-preview.toml | 10 + .../models/google/gemini-3-pro-image.toml | 10 + .../gemini-3.1-flash-image-preview.toml | 13 + .../models/google/gemini-3.1-flash-image.toml | 9 + .../google/gemini-3.1-flash-lite-image.toml | 12 + .../google/gemini-3.1-flash-lite-preview.toml | 13 + .../gemini-3.1-pro-preview-customtools.toml | 13 + .../models/google/gemini-3.1-pro-preview.toml | 24 -- .../models/google/gemini-3.6-flash.toml | 24 +- .../models/google/gemini-3.7-flash.toml | 24 +- .../models/google/gemini-flash-latest.toml | 10 + .../aimlapi/models/google/gemma-3-12b-it.toml | 24 -- .../aimlapi/models/google/gemma-3-27b-it.toml | 24 -- .../aimlapi/models/google/gemma-3-4b-it.toml | 24 -- .../google/gemma-4-26b-a4b-it-maas.toml | 24 -- .../models/google/gemma-4-26b-a4b-it.toml | 21 +- .../aimlapi/models/google/gemma-4-31b-it.toml | 14 + .../models/gryphe/mythomax-l2-13b.toml | 23 -- .../aimlapi/models/meituan/longcat-2.0.toml | 24 -- .../Llama-3.3-70B-Instruct-Turbo.toml | 23 -- .../meta-llama/llama-3.3-70b-versatile.toml | 23 -- .../aimlapi/models/meta/muse-glimmer-30b.toml | 10 + .../aimlapi/models/meta/muse-spark-1.1.toml | 13 + .../aimlapi/models/meta/muse-spark-1.2.toml | 10 + .../models/minimax/MiniMax-Text-01.toml | 23 -- providers/aimlapi/models/minimax/m1.toml | 23 -- providers/aimlapi/models/minimax/m2-1.toml | 24 -- .../aimlapi/models/minimax/m2-5-20260218.toml | 24 -- .../minimax/m2-5-highspeed-20260218.toml | 24 -- providers/aimlapi/models/minimax/m2.toml | 23 -- .../aimlapi/models/minimax/minimax-m3.toml | 24 -- .../models/mistralai/devstral-2512.toml | 6 + .../models/mistralai/mistral-large-2512.toml | 6 + .../models/mistralai/mistral-nemo.toml | 17 +- .../models/mistralai/mistral-small-2603.toml | 13 + .../aimlapi/models/moonshot/kimi-k2-5.toml | 24 -- .../moonshot/kimi-k2-7-code-highspeed.toml | 24 -- .../models/moonshot/kimi-k2-7-code.toml | 24 -- .../models/moonshotai/kimi-k2-thinking.toml | 13 + .../models/nousresearch/hermes-4-405b.toml | 24 -- .../nvidia/nemotron-3-nano-30b-a3b.toml | 23 -- .../nvidia/nemotron-3-super-120b-a12b.toml | 23 -- .../nvidia/nemotron-3-ultra-550b-a55b.toml | 24 -- .../models/nvidia/nemotron-3.5-lightning.toml | 23 -- .../aimlapi/models/openai/gpt-3.5-turbo.toml | 8 + .../aimlapi/models/openai/gpt-4-turbo.toml | 5 + .../models/openai/gpt-4.1-2025-04-14.toml | 24 -- .../aimlapi/models/openai/gpt-4.1-mini.toml | 9 + .../aimlapi/models/openai/gpt-4.1-nano.toml | 9 + providers/aimlapi/models/openai/gpt-4.1.toml | 20 +- providers/aimlapi/models/openai/gpt-4.toml | 9 + .../models/openai/gpt-4o-2024-05-13.toml | 17 +- .../models/openai/gpt-4o-2024-08-06.toml | 20 +- .../models/openai/gpt-4o-2024-11-20.toml | 20 +- .../aimlapi/models/openai/gpt-4o-mini.toml | 6 + providers/aimlapi/models/openai/gpt-4o.toml | 20 +- providers/aimlapi/models/openai/gpt-5-1.toml | 24 -- .../models/openai/gpt-5-2-chat-latest.toml | 24 -- providers/aimlapi/models/openai/gpt-5-2.toml | 24 -- .../models/openai/gpt-5-2025-08-07.toml | 24 -- .../models/openai/gpt-5-mini-2025-08-07.toml | 24 -- .../aimlapi/models/openai/gpt-5-mini.toml | 24 +- .../models/openai/gpt-5-nano-2025-08-07.toml | 24 -- .../aimlapi/models/openai/gpt-5-nano.toml | 24 +- .../aimlapi/models/openai/gpt-5-pro.toml | 24 +- .../models/openai/gpt-5.1-2025-11-13.toml | 24 -- .../models/openai/gpt-5.1-codex-max.toml | 10 + .../models/openai/gpt-5.1-codex-mini.toml | 24 +- .../aimlapi/models/openai/gpt-5.1-codex.toml | 24 +- .../models/openai/gpt-5.2-2025-12-11.toml | 24 -- .../models/openai/gpt-5.2-chat-latest.toml | 24 -- .../aimlapi/models/openai/gpt-5.2-codex.toml | 24 +- .../aimlapi/models/openai/gpt-5.2-pro.toml | 24 +- .../aimlapi/models/openai/gpt-5.3-codex.toml | 24 +- .../aimlapi/models/openai/gpt-5.4-mini.toml | 10 + .../aimlapi/models/openai/gpt-5.4-nano.toml | 10 + .../aimlapi/models/openai/gpt-5.4-pro.toml | 9 + .../aimlapi/models/openai/gpt-5.5-pro.toml | 9 + .../models/openai/gpt-5.6-luna-pro.toml | 10 + .../aimlapi/models/openai/gpt-5.6-luna.toml | 10 + .../models/openai/gpt-5.6-sol-pro.toml | 10 + .../aimlapi/models/openai/gpt-5.6-sol.toml | 10 + .../models/openai/gpt-5.6-terra-pro.toml | 10 + .../aimlapi/models/openai/gpt-5.6-terra.toml | 10 + providers/aimlapi/models/openai/gpt-5.toml | 24 +- .../aimlapi/models/openai/gpt-oss-120b.toml | 20 +- .../aimlapi/models/openai/gpt-oss-20b.toml | 20 +- providers/aimlapi/models/openai/o1-pro.toml | 9 + providers/aimlapi/models/openai/o1.toml | 13 + .../aimlapi/models/openai/o3-2025-04-16.toml | 24 -- providers/aimlapi/models/openai/o3-mini.toml | 10 + providers/aimlapi/models/openai/o3-pro.toml | 9 + .../models/openai/o4-mini-2025-04-16.toml | 24 -- .../aimlapi/models/perplexity/sonar-pro.toml | 17 +- .../aimlapi/models/perplexity/sonar.toml | 17 +- .../aimlapi/models/poolside/laguna-s-2.1.toml | 13 + .../models/poolside/laguna-xs-2.1.toml | 10 + .../aimlapi/models/sakana/fugu-ultra.toml | 21 +- .../aimlapi/models/sakana/sakana-namazu.toml | 24 +- .../models/stepfun/step-3.7-flash.toml | 24 -- .../aimlapi/models/tencent/hy-mt2-1.8b.toml | 23 -- .../models/tencent/hy-mt2-30b-a3b.toml | 23 -- .../aimlapi/models/tencent/hy-mt2-7b.toml | 23 -- providers/aimlapi/models/tencent/hy3.toml | 14 + .../aimlapi/models/tencent/hy4-preview.toml | 20 +- .../thinkingmachines/inkling-small.toml | 19 +- .../models/thinkingmachines/inkling.toml | 10 + .../aimlapi/models/upstage/solar-pro4.toml | 24 +- .../aimlapi/models/x-ai/grok-3-beta.toml | 24 -- .../aimlapi/models/x-ai/grok-3-mini-beta.toml | 24 -- .../x-ai/grok-4-1-fast-non-reasoning.toml | 24 -- .../models/x-ai/grok-4-1-fast-reasoning.toml | 24 -- .../x-ai/grok-4-20-0309-non-reasoning.toml | 24 -- .../models/x-ai/grok-4-20-0309-reasoning.toml | 24 -- providers/aimlapi/models/x-ai/grok-4-3.toml | 24 -- .../x-ai/grok-4-fast-non-reasoning.toml | 24 -- .../models/x-ai/grok-4-fast-reasoning.toml | 24 -- .../aimlapi/models/x-ai/grok-code-fast-1.toml | 24 -- .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 20 +- .../aimlapi/models/xiaomi/mimo-v2.5.toml | 20 +- providers/aimlapi/models/z-ai/glm-4.5v.toml | 13 + providers/aimlapi/models/z-ai/glm-4.6v.toml | 13 + .../aimlapi/models/z-ai/glm-4.7-flash.toml | 14 + .../aimlapi/models/z-ai/glm-5.3-flash.toml | 24 -- .../aimlapi/models/zhipu/glm-4.5-air.toml | 24 -- providers/aimlapi/models/zhipu/glm-4.5.toml | 24 -- providers/aimlapi/models/zhipu/glm-4.6.toml | 24 -- providers/aimlapi/models/zhipu/glm-4.7.toml | 24 -- .../models/zhipu/glm-5-2-fast-preview.toml | 24 -- providers/aimlapi/models/zhipu/glm-5-2.toml | 24 -- providers/aimlapi/models/zhipu/glm-5-3.toml | 24 -- providers/aimlapi/models/zhipu/glm-5.2.toml | 24 -- providers/aimlapi/models/zhipu/glm-5.3.toml | 24 -- providers/aimlapi/models/zhipu/glm-5.toml | 24 -- 220 files changed, 984 insertions(+), 3638 deletions(-) delete mode 100644 providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml delete mode 100644 providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml delete mode 100644 providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml delete mode 100644 providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml delete mode 100644 providers/aimlapi/models/alibaba/glm-5.2.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen-plus.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen-turbo.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-32b.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-max-preview.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-flash.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-plus.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.5-plus.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.6-27b.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.6-flash.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.6-plus.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.7-plus.toml delete mode 100644 providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-fable-5.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-6.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4-8.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.7.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-5.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-5.toml create mode 100644 providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml delete mode 100644 providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml delete mode 100644 providers/aimlapi/models/baidu/ernie-5.0.toml delete mode 100644 providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml create mode 100644 providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml create mode 100644 providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml delete mode 100644 providers/aimlapi/models/bytedance/seed-1-8.toml delete mode 100644 providers/aimlapi/models/cohere/command-a.toml create mode 100644 providers/aimlapi/models/cohere/command-r-08-2024.toml create mode 100644 providers/aimlapi/models/cohere/command-r-plus-08-2024.toml create mode 100644 providers/aimlapi/models/cohere/command-r7b-12-2024.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-r1.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-reasoner.toml delete mode 100644 providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml create mode 100644 providers/aimlapi/models/google/gemini-2.5-flash-image.toml delete mode 100644 providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml delete mode 100644 providers/aimlapi/models/google/gemini-2.5-pro.toml delete mode 100644 providers/aimlapi/models/google/gemini-3-6-flash.toml delete mode 100644 providers/aimlapi/models/google/gemini-3-7-flash.toml delete mode 100644 providers/aimlapi/models/google/gemini-3-flash-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-3-pro-image-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-3-pro-image.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-flash-image.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml delete mode 100644 providers/aimlapi/models/google/gemini-3.1-pro-preview.toml create mode 100644 providers/aimlapi/models/google/gemini-flash-latest.toml delete mode 100644 providers/aimlapi/models/google/gemma-3-12b-it.toml delete mode 100644 providers/aimlapi/models/google/gemma-3-27b-it.toml delete mode 100644 providers/aimlapi/models/google/gemma-3-4b-it.toml delete mode 100644 providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml create mode 100644 providers/aimlapi/models/google/gemma-4-31b-it.toml delete mode 100644 providers/aimlapi/models/gryphe/mythomax-l2-13b.toml delete mode 100644 providers/aimlapi/models/meituan/longcat-2.0.toml delete mode 100644 providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml delete mode 100644 providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml create mode 100644 providers/aimlapi/models/meta/muse-glimmer-30b.toml create mode 100644 providers/aimlapi/models/meta/muse-spark-1.1.toml create mode 100644 providers/aimlapi/models/meta/muse-spark-1.2.toml delete mode 100644 providers/aimlapi/models/minimax/MiniMax-Text-01.toml delete mode 100644 providers/aimlapi/models/minimax/m1.toml delete mode 100644 providers/aimlapi/models/minimax/m2-1.toml delete mode 100644 providers/aimlapi/models/minimax/m2-5-20260218.toml delete mode 100644 providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml delete mode 100644 providers/aimlapi/models/minimax/m2.toml delete mode 100644 providers/aimlapi/models/minimax/minimax-m3.toml create mode 100644 providers/aimlapi/models/mistralai/devstral-2512.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-large-2512.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-small-2603.toml delete mode 100644 providers/aimlapi/models/moonshot/kimi-k2-5.toml delete mode 100644 providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml delete mode 100644 providers/aimlapi/models/moonshot/kimi-k2-7-code.toml create mode 100644 providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml delete mode 100644 providers/aimlapi/models/nousresearch/hermes-4-405b.toml delete mode 100644 providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml delete mode 100644 providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml delete mode 100644 providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml delete mode 100644 providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml create mode 100644 providers/aimlapi/models/openai/gpt-3.5-turbo.toml create mode 100644 providers/aimlapi/models/openai/gpt-4-turbo.toml delete mode 100644 providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml create mode 100644 providers/aimlapi/models/openai/gpt-4.1-mini.toml create mode 100644 providers/aimlapi/models/openai/gpt-4.1-nano.toml create mode 100644 providers/aimlapi/models/openai/gpt-4.toml create mode 100644 providers/aimlapi/models/openai/gpt-4o-mini.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5-1.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5-2.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5-2025-08-07.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.1-codex-max.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml delete mode 100644 providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.4-mini.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.4-nano.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.4-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.5-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.6-luna.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.6-sol.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.6-terra.toml create mode 100644 providers/aimlapi/models/openai/o1-pro.toml create mode 100644 providers/aimlapi/models/openai/o1.toml delete mode 100644 providers/aimlapi/models/openai/o3-2025-04-16.toml create mode 100644 providers/aimlapi/models/openai/o3-mini.toml create mode 100644 providers/aimlapi/models/openai/o3-pro.toml delete mode 100644 providers/aimlapi/models/openai/o4-mini-2025-04-16.toml create mode 100644 providers/aimlapi/models/poolside/laguna-s-2.1.toml create mode 100644 providers/aimlapi/models/poolside/laguna-xs-2.1.toml delete mode 100644 providers/aimlapi/models/stepfun/step-3.7-flash.toml delete mode 100644 providers/aimlapi/models/tencent/hy-mt2-1.8b.toml delete mode 100644 providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml delete mode 100644 providers/aimlapi/models/tencent/hy-mt2-7b.toml create mode 100644 providers/aimlapi/models/tencent/hy3.toml create mode 100644 providers/aimlapi/models/thinkingmachines/inkling.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-3-beta.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-3-mini-beta.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-3.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml delete mode 100644 providers/aimlapi/models/x-ai/grok-code-fast-1.toml create mode 100644 providers/aimlapi/models/z-ai/glm-4.5v.toml create mode 100644 providers/aimlapi/models/z-ai/glm-4.6v.toml create mode 100644 providers/aimlapi/models/z-ai/glm-4.7-flash.toml delete mode 100644 providers/aimlapi/models/z-ai/glm-5.3-flash.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-4.5-air.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-4.5.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-4.6.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-4.7.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-5-2.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-5-3.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-5.2.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-5.3.toml delete mode 100644 providers/aimlapi/models/zhipu/glm-5.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index ebfb255fa26..c575a607f18 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -1,49 +1,72 @@ import { z } from "zod"; -import { inferKimiFamily, ModelFamilyValues } from "../../family.js"; import type { SyncProvider } from "../index.js"; +import { factorBaseModel, modelMetadata, resolveModelMetadataBaseModel } from "./openrouter.js"; // The public catalog needs no key, and `include` is what turns on the pricing // and modality blocks this sync depends on. const API_ENDPOINT = "https://api.aimlapi.com/v1/models?include=pricing,modalities"; +// Per-model request schema. It is the only place the API states which reasoning +// controls a model actually accepts, so reasoning_options is read from here +// rather than assumed. +const DOCS_ENDPOINT = "https://api.aimlapi.com/docs-json"; + // AI/ML API serves one id under several endpoint types — a model can be both a // chat model and, say, an image model. Only the chat surface belongs here. const CHAT_COMPLETIONS_TYPE = "openai/chat-completions"; -const PricingUnit = z.object({ - name: z.string().nullish(), - content: z.string().nullish(), - origin: z.string().nullish(), - price: z.number().nullish(), - per: z.number().nullish(), -}).passthrough(); - -const Info = z.object({ - name: z.string().nullish(), - description: z.string().nullish(), - developer: z.string().nullish(), - releasedAt: z.string().nullish(), - contextLength: z.number().int().nonnegative().nullish(), - outputMax: z.number().int().nonnegative().nullish(), -}).passthrough(); - -export const AimlapiModel = z.object({ - id: z.string().min(1), - type: z.string().nullish(), - info: Info.nullish(), - modalities: z.object({ - input: z.array(z.string()).nullish(), - output: z.array(z.string()).nullish(), - }).passthrough().nullish(), - pricing: z.object({ - units: z.array(PricingUnit).nullish(), - }).passthrough().nullish(), -}).passthrough(); - -export const AimlapiResponse = z.object({ - data: z.array(AimlapiModel).min(1), -}).passthrough(); +// Values this schema accepts for an "effort" reasoning control. Anything the +// API documents outside this set is dropped rather than coerced. +const EFFORT_VALUES = new Set(["none", "minimal", "low", "medium", "high", "xhigh", "max", "default"]); + +const DOCS_CONCURRENCY = 8; + +const PricingUnit = z + .object({ + name: z.string().nullish(), + content: z.string().nullish(), + origin: z.string().nullish(), + price: z.number().nullish(), + per: z.number().nullish(), + }) + .passthrough(); + +const Info = z + .object({ + contextLength: z.number().int().nonnegative().nullish(), + outputMax: z.number().int().nonnegative().nullish(), + }) + .passthrough(); + +export const AimlapiModel = z + .object({ + id: z.string().min(1), + type: z.string().nullish(), + info: Info.nullish(), + modalities: z + .object({ + input: z.array(z.string()).nullish(), + output: z.array(z.string()).nullish(), + }) + .passthrough() + .nullish(), + pricing: z + .object({ + units: z.array(PricingUnit).nullish(), + }) + .passthrough() + .nullish(), + /** Attached by fetchModels; not part of the upstream payload. */ + reasoningEffort: z.array(z.string()).nullish(), + }) + .passthrough(); + +export const AimlapiResponse = z + .object({ + data: z.array(AimlapiModel).min(1), + }) + .passthrough(); export type AimlapiModel = z.infer; @@ -61,19 +84,40 @@ function normalizeModalities(values: readonly string[] | null | undefined): Moda return [...seen]; } +function isChatTextModel(model: AimlapiModel): boolean { + if (model.type !== CHAT_COMPLETIONS_TYPE) return false; + const output = normalizeModalities(model.modalities?.output); + // A chat model whose output is not purely text is a media model riding the + // chat protocol, and does not belong in a chat catalog. + return output.length === 1 && output[0] === "text"; +} + +/** + * Lab entry this id is a host for. AI/ML API is an aggregator and authors none + * of these models, so every entry has to point at the lab file rather than + * restate it. + */ +function baseModelFor(id: string): string | undefined { + return resolveModelMetadataBaseModel(id); +} + +function baseReasoning(baseModelID: string): boolean { + try { + return modelMetadata(baseModelID).reasoning === true; + } catch { + return false; + } +} + /** * Prices are quoted as `price` per `per` tokens; models.dev stores dollars per * million. The unit discriminator is `origin`, not `measure`: provided is * input, generated is output, cached is a cache read. Only text token charges * are taken — a model's image or audio units are a different surface. */ -function perMillion( - units: readonly z.infer[], - origin: string, -): number | undefined { +function perMillion(units: readonly z.infer[], origin: string): number | undefined { const unit = units.find( - (candidate) => - candidate.name === "token" && candidate.content === "text" && candidate.origin === origin, + (candidate) => candidate.name === "token" && candidate.content === "text" && candidate.origin === origin, ); if (!unit || unit.price == null || !unit.per) return undefined; return (unit.price / unit.per) * 1_000_000; @@ -84,31 +128,72 @@ function positive(value: number | null | undefined): number | undefined { } /** - * `family` is a closed vocabulary of model families (`gpt`, `claude`, `o`, …), - * not the vendor prefix — matching on the prefix produces values the schema - * rejects. Longest match first so `claude-sonnet` wins over `claude`, and `o` - * only matches when a digit follows it, as in `o3`. + * Reads the documented `reasoning_effort` enum for one model. Returns undefined + * when the docs do not describe the control, which is treated as "cannot state + * it" rather than "the model has none". */ -function inferFamily(id: string, name: string): string | undefined { - const kimi = inferKimiFamily(id, name); - if (kimi !== undefined) return kimi; - - 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); - }); +async function fetchReasoningEffort(id: string): Promise { + const url = `${DOCS_ENDPOINT}?model=${encodeURIComponent(id)}&endpoint=${encodeURIComponent(CHAT_COMPLETIONS_TYPE)}`; + let payload: unknown; + try { + const response = await fetch(url); + if (!response.ok) return undefined; + payload = await response.json(); + } catch { + return undefined; + } + + const found = findReasoningEffortEnum(payload); + if (found === undefined) return undefined; + + const values = found.filter((value) => EFFORT_VALUES.has(value)); + return values.length > 0 ? values : undefined; } -function releaseDate(value: string | null | undefined): string | undefined { - if (!value) return undefined; - const match = /^(\d{4}-\d{2}-\d{2})/.exec(value.trim()); - return match?.[1]; +function findReasoningEffortEnum(node: unknown): string[] | undefined { + if (Array.isArray(node)) { + for (const item of node) { + const found = findReasoningEffortEnum(item); + if (found !== undefined) return found; + } + return undefined; + } + if (node === null || typeof node !== "object") return undefined; + + const record = node as Record; + const effort = record["reasoning_effort"]; + if (effort !== null && typeof effort === "object") { + const values = (effort as Record)["enum"]; + if (Array.isArray(values) && values.every((value) => typeof value === "string")) { + return values as string[]; + } + } + + for (const value of Object.values(record)) { + const found = findReasoningEffortEnum(value); + if (found !== undefined) return found; + } + return undefined; +} + +async function attachReasoningEffort(models: AimlapiModel[]): Promise { + // Only models whose lab entry says they reason need the control documented, + // and only those are worth a request. + const pending = models.filter((model) => { + if (!isChatTextModel(model)) return false; + const base = baseModelFor(model.id); + return base !== undefined && baseReasoning(base); + }); + + let cursor = 0; + const workers = Array.from({ length: Math.min(DOCS_CONCURRENCY, pending.length) }, async () => { + while (cursor < pending.length) { + const model = pending[cursor++]; + if (model === undefined) return; + model.reasoningEffort = await fetchReasoningEffort(model.id); + } + }); + await Promise.all(workers); } export const aimlapi = { @@ -119,12 +204,12 @@ export const aimlapi = { // a local model missing from one response is not proof that it is gone. deleteMissing: false, sourceID(model) { - return model.type === CHAT_COMPLETIONS_TYPE ? model.id : undefined; + return isChatTextModel(model) ? model.id : undefined; }, skippedNotice(ids) { if (ids.length === 0) return []; return [ - `${ids.length} AI/ML API chat models were skipped because the catalog does not yet publish a description or an output limit for them, both of which this schema requires.`, + `${ids.length} AI/ML API chat models were skipped because this repository has no lab entry to point \`base_model\` at, or because the API does not document the reasoning control a reasoning model requires.`, `Skipped remote IDs: ${ids.map((id) => `\`${id}\``).join(", ")}`, ]; }, @@ -140,67 +225,69 @@ export const aimlapi = { if (!response.ok) { throw new Error(`AI/ML API request failed: ${response.status} ${response.statusText}`); } - return response.json(); + const raw = await response.json(); + const parsed = AimlapiResponse.parse(raw); + await attachReasoningEffort(parsed.data); + return parsed; }, parseModels(raw) { return AimlapiResponse.parse(raw).data; }, translateModel(model, context) { - // Chat only. The same id may also appear under an image or audio type; - // those entries are a different product and are skipped silently. - if (model.type !== CHAT_COMPLETIONS_TYPE) return undefined; + if (!isChatTextModel(model)) return undefined; const existing = context.existing(model.id); - const info = model.info ?? {}; - const units = model.pricing?.units ?? []; - const output = normalizeModalities(model.modalities?.output); - // A chat model whose output is not purely text is a media model riding the - // chat protocol, and does not belong in a chat catalog. - if (output.length !== 1 || output[0] !== "text") return undefined; + // AI/ML API hosts other people's models, so the entry must reference the + // lab file instead of duplicating it. Without a lab entry to point at there + // is nothing correct to write: inlining the metadata is what this schema + // forbids, and authoring the lab file would mean sourcing capability data + // the catalog does not publish. + const base = existing?.base_model ?? baseModelFor(model.id); + if (base === undefined) return undefined; - const input = normalizeModalities(model.modalities?.input); - const contextLimit = positive(info.contextLength) ?? existing?.limit?.context; - const outputLimit = positive(info.outputMax) ?? existing?.limit?.output; - const description = info.description?.trim() || existing?.description; + // Required whenever the base model reasons. Only the API's own request + // schema can say which values it takes, so a model whose docs stay silent + // is skipped rather than given an invented control. + let reasoningOptions: Array<{ type: "effort"; values: string[] }> | undefined; + if (baseReasoning(base)) { + const values = model.reasoningEffort ?? undefined; + if (values === undefined || values.length === 0) return undefined; + reasoningOptions = [{ type: "effort", values }]; + } - // The schema requires a description and an output limit. Where the catalog - // publishes neither and no local value exists, the model is skipped rather - // than filled in: an invented description or a guessed limit would be worse - // than an absent entry, and skippedNotice makes the gap visible. - if (!description || outputLimit === undefined) return undefined; + const units = model.pricing?.units ?? []; + const info = model.info ?? {}; + const contextLimit = positive(info.contextLength); + const outputLimit = positive(info.outputMax); + // Only what the catalog actually publishes. It reports a context window and + // an output cap but no input cap, and equating the input cap with the whole + // context would overwrite the lab's correct split (e.g. 272k in + 128k out + // within a 400k window) with a wrong number. + const limit = + contextLimit === undefined && outputLimit === undefined + ? undefined + : { context: contextLimit, output: outputLimit }; + // Everything else — the capability flags, description, dates, modalities — + // is the lab's to state and is inherited. factorBaseModel drops whatever + // matches the base, so the file carries only what is genuinely ours. return { id: model.id, - model: { - name: info.name?.trim() || existing?.name || model.id, - description, - family: existing?.family ?? inferFamily(model.id, info.name?.trim() ?? ""), - release_date: releaseDate(info.releasedAt) ?? existing?.release_date, - last_updated: releaseDate(info.releasedAt) ?? existing?.last_updated, - // The catalog does not report these capabilities. A value already in the - // repo was put there by someone who checked; a default here would only - // overwrite that with a guess. - attachment: existing?.attachment ?? input.length > 1, - reasoning: existing?.reasoning ?? false, - tool_call: existing?.tool_call ?? false, - structured_output: existing?.structured_output ?? false, - open_weights: existing?.open_weights ?? false, - cost: { - input: perMillion(units, "provided") ?? existing?.cost?.input, - output: perMillion(units, "generated") ?? existing?.cost?.output, - cache_read: perMillion(units, "cached") ?? existing?.cost?.cache_read, - }, - limit: { - context: contextLimit, - input: contextLimit, - output: outputLimit, - }, - modalities: { - input, - output, + model: factorBaseModel( + base, + { + cost: { + input: perMillion(units, "provided") ?? existing?.cost?.input, + output: perMillion(units, "generated") ?? existing?.cost?.output, + cache_read: perMillion(units, "cached") ?? existing?.cost?.cache_read, + }, + reasoning_options: reasoningOptions, + limit, }, - }, + limit, + existing?.base_model === base ? existing?.base_model_omit : undefined, + ), }; }, } satisfies SyncProvider; diff --git a/providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml b/providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml deleted file mode 100644 index 158a428d08e..00000000000 --- a/providers/aimlapi/models/Qwen/Qwen2.5-7B-Instruct-Turbo.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen2.5 7B Instruct Turbo" -description = "Qwen 2.5 7B Instruct Turbo excels in coding and instruction following." -family = "qwen" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.39 -output = 0.39 - -[limit] -context = 32_000 -input = 32_000 -output = 31_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml b/providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml deleted file mode 100644 index 4d8c764a966..00000000000 --- a/providers/aimlapi/models/Qwen/Qwen3-235B-A22B-Thinking-2507.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3 Thinking 2507" -description = "Alibaba's Qwen 3 thinking 2507 is a multilingual reasoning model with knowledge augmentation, and creative capabilities." -family = "qwen" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.845 -output = 3.9 - -[limit] -context = 32_000 -input = 32_000 -output = 16_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml b/providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml deleted file mode 100644 index dc0491c81f8..00000000000 --- a/providers/aimlapi/models/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3 Coder" -description = "Alibaba's Qwen 3 Coder is a powerful coding agent." -family = "qwen" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.6 -output = 2.6 - -[limit] -context = 262_000 -input = 262_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml b/providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml deleted file mode 100644 index e6cf4b4c3bd..00000000000 --- a/providers/aimlapi/models/alibaba/glm-5.2-fast-preview.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.2 Fast Preview" -description = "A latency-optimized GLM-5.2 preview with the same 1M-token context window and 1.5–2× higher output throughput for real-time chat, agents, and coding." -family = "glm" -release_date = "2026-07-10" -last_updated = "2026-07-10" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 4.55 -output = 14.3 -cache_read = 0.91 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/glm-5.2.toml b/providers/aimlapi/models/alibaba/glm-5.2.toml deleted file mode 100644 index f012ea0d537..00000000000 --- a/providers/aimlapi/models/alibaba/glm-5.2.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.2" -description = "GLM-5.2 is Zhipu AI flagship MoE LLM with a 1M-token context window, optimized for agentic coding, tool use, reasoning, and long-context tasks." -family = "glm" -release_date = "2026-06-16" -last_updated = "2026-06-16" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.82 -output = 5.72 -cache_read = 0.364 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen-max.toml b/providers/aimlapi/models/alibaba/qwen-max.toml index 4554f9eba34..b67b2dfda47 100644 --- a/providers/aimlapi/models/alibaba/qwen-max.toml +++ b/providers/aimlapi/models/alibaba/qwen-max.toml @@ -1,13 +1,4 @@ -name = "Qwen Max" -description = "Qwen Max: powerful AI, excels in stability, competes globally." -family = "qwen" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen-max" [cost] input = 2.08 @@ -16,9 +7,3 @@ cache_read = 0.416 [limit] context = 32_000 -input = 32_000 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen-plus.toml b/providers/aimlapi/models/alibaba/qwen-plus.toml deleted file mode 100644 index 29e5653ccb5..00000000000 --- a/providers/aimlapi/models/alibaba/qwen-plus.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Qwen Plus" -description = "Qwen-Plus: Alibaba's advanced multilingual model with enhanced reasoning and instruction-following capabilities." -family = "qwen" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.52 -output = 1.56 -cache_read = 0.104 - -[limit] -context = 131_000 -input = 131_000 -output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen-turbo.toml b/providers/aimlapi/models/alibaba/qwen-turbo.toml deleted file mode 100644 index c1cd95d2ef1..00000000000 --- a/providers/aimlapi/models/alibaba/qwen-turbo.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Qwen Turbo" -description = "Qwen Turbo: optimizes AI agent speed, integrates with RAG, large context window." -family = "qwen" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.065 -output = 0.26 -cache_read = 0.013 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml b/providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml deleted file mode 100644 index 492d06a2607..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-235b-a22b-thinking-2507.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 Thinking 2507" -description = "Alibaba's Qwen 3 thinking 2507 is a multilingual reasoning model with knowledge augmentation, and creative capabilities." -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.299 -output = 2.99 - -[limit] -context = 32_000 -input = 32_000 -output = 16_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-32b.toml b/providers/aimlapi/models/alibaba/qwen3-32b.toml deleted file mode 100644 index d75ce76e131..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-32b.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 32B" -description = "Alibaba's Qwen 3 32B is a multilingual model with instruction-following capabilities and enhanced reasoning." -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.208 -output = 0.832 - -[limit] -context = 131_000 -input = 131_000 -output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml index af1e1067450..c294f7401f9 100644 --- a/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml +++ b/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml @@ -1,12 +1,4 @@ -name = "Qwen3 Coder" -description = "Alibaba's Qwen 3 Coder is a powerful coding agent." -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3-coder-480b-a35b-instruct" [cost] input = 1.95 @@ -14,9 +6,3 @@ output = 9.75 [limit] context = 262_000 -input = 262_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3-max-preview.toml deleted file mode 100644 index f78f0fcb224..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-max-preview.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3 Max Preview" -description = "Alibaba's Qwen 3 Max Preview is a multilingual model with instruction-following capabilities and enhanced reasoning." -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.56 -output = 7.8 -cache_read = 0.312 - -[limit] -context = 252_000 -input = 252_000 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-max.toml b/providers/aimlapi/models/alibaba/qwen3-max.toml index 81be3f5718a..2cc25e4c73e 100644 --- a/providers/aimlapi/models/alibaba/qwen3-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3-max.toml @@ -1,23 +1,6 @@ -name = "Qwen3 Max Instruct" -description = "Alibaba's Qwen 3 Max Instruct is the most powerful model in the Qwen 3 series." -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3-max" [cost] input = 1.56 output = 7.8 cache_read = 0.312 - -[limit] -context = 262_144 -input = 262_144 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml index 8081cee7649..b90216744f6 100644 --- a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml +++ b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml @@ -1,12 +1,4 @@ -name = "Qwen3 Next 80B A3B Instruct" -description = "Alibaba's Qwen 3 Next 80B A3B Instruct is a multilingual model with enhanced instruction-following capabilities." -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3-next-80b-a3b-instruct" [cost] input = 0.195 @@ -14,9 +6,4 @@ output = 1.56 [limit] context = 129_024 -input = 129_024 output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml deleted file mode 100644 index 5640e1c0adb..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-thinking.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 Next 80B A3B Thinking" -description = "Alibaba's Qwen 3 Next 80B A3B Thinking is a multilingual reasoning model with advanced chain-of-thought capabilities." -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.195 -output = 1.56 - -[limit] -context = 126_976 -input = 126_976 -output = 81_920 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml b/providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml deleted file mode 100644 index 134b6d09af6..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-omni-30b-a3b-captioner.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 Omni Captioner" -description = "Qwen3-Omni-Captioner automatically generates accurate and comprehensive descriptions for complex audio, including speech, ambient sounds, music, and sound effects. The model can identify speaker emotions, musical elements, and is suitable for audio content analysis, security audits, and audio editing. Supports audio input up to 40 minutes (1 second = 25 tokens)." -release_date = "2025-11-14" -last_updated = "2025-11-14" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 4.953 -output = 3.9779999999999998 - -[limit] -context = 65_536 -input = 65_536 -output = 32_768 - -[modalities] -input = ["audio"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml deleted file mode 100644 index cebfcf225b2..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-vl-32b-instruct.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 VL 32B Instruct" -description = "Alibaba's Qwen 3 VL 32B Instruct is a powerful vision-language model with hybrid instruction-following capabilities." -release_date = "2025-11-11" -last_updated = "2025-11-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.91 -output = 3.64 - -[limit] -context = 126_000 -input = 126_000 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml b/providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml deleted file mode 100644 index 40b6f7e4b14..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-vl-32b-thinking.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 VL 32B Thinking" -description = "Alibaba's Qwen 3 VL 32B Thinking is a powerful vision-language model with hybrid thinking capabilities." -release_date = "2025-11-11" -last_updated = "2025-11-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.91 -output = 10.92 - -[limit] -context = 126_000 -input = 126_000 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml b/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml deleted file mode 100644 index bb3450bfa3f..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3 VL Flash" -description = "Alibaba's Qwen 3 VL Flash is a fast and cost-effective vision-language model with hybrid thinking capabilities. Supports image understanding with up to 16,384 tokens per image and high-resolution mode for detailed analysis." -release_date = "2025-10-19" -last_updated = "2025-10-19" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.065 -output = 0.52 -cache_read = 0.065 - -[limit] -context = 262_144 -input = 262_144 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-plus.toml b/providers/aimlapi/models/alibaba/qwen3-vl-plus.toml deleted file mode 100644 index cb26d7e6e87..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3-vl-plus.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 VL Plus" -description = "Alibaba's Qwen 3 VL Plus is a powerful vision-language model with hybrid thinking capabilities. Supports image understanding with up to 16,384 tokens per image and high-resolution mode for detailed analysis." -release_date = "2025-10-19" -last_updated = "2025-10-19" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.26 -output = 2.08 - -[limit] -context = 262_144 -input = 262_144 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml index 82c9f83d08f..ce03c2805d0 100644 --- a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml +++ b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml @@ -1,23 +1,9 @@ -name = "Qwen3.5 Flash" -description = "Qwen Max: powerful AI, excels in stability, competes globally." -family = "qwen3.5" -release_date = "2026-04-21" -last_updated = "2026-04-21" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3.5-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.13 output = 0.52 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml b/providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml deleted file mode 100644 index 523acb8c130..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.5-plus-20260218.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3.5 Plus" -description = "Qwen3.5-Plus is a commercial large language model by Alibaba Cloud designed for long-context text generation and enterprise-grade conversational AI. Supports up to 1M tokens per request with production-ready API stability." -family = "qwen3.5" -release_date = "2026-02-20" -last_updated = "2026-02-20" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.52 -output = 3.12 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-plus.toml b/providers/aimlapi/models/alibaba/qwen3.5-plus.toml deleted file mode 100644 index 523acb8c130..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.5-plus.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3.5 Plus" -description = "Qwen3.5-Plus is a commercial large language model by Alibaba Cloud designed for long-context text generation and enterprise-grade conversational AI. Supports up to 1M tokens per request with production-ready API stability." -family = "qwen3.5" -release_date = "2026-02-20" -last_updated = "2026-02-20" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.52 -output = 3.12 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml new file mode 100644 index 00000000000..99848065e45 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml @@ -0,0 +1,13 @@ +base_model = "alibaba/qwen3.6-27b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.78 +output = 4.68 + +[limit] +context = 256_000 +output = 252_000 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml new file mode 100644 index 00000000000..71fb076430e --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml @@ -0,0 +1,13 @@ +base_model = "alibaba/qwen3.6-35b-a3b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.4875 +output = 2.925 + +[limit] +context = 256_000 +output = 252_000 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-flash.toml b/providers/aimlapi/models/alibaba/qwen3.6-flash.toml deleted file mode 100644 index 7a18f32d8ce..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.6-flash.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3.6 Flash" -description = "Qwen3.6-Flash — a lightweight and cost-efficient model by Alibaba Cloud designed for simple tasks and high-throughput applications. It offers fast response times with lower cost." -family = "qwen3.6" -release_date = "2026-04-21" -last_updated = "2026-04-21" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.325 -output = 1.95 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml deleted file mode 100644 index 50cc3406ff5..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3.6 Max Preview" -description = "Qwen3.6-Max-Preview — a high-capability reasoning model by Alibaba Cloud designed for complex tasks and long-form problem solving. It provides strong reasoning performance and high accuracy for advanced use cases." -family = "qwen3.6" -release_date = "2026-04-21" -last_updated = "2026-04-21" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.65 -output = 3.9 - -[limit] -context = 262_144 -input = 262_144 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-plus.toml b/providers/aimlapi/models/alibaba/qwen3.6-plus.toml deleted file mode 100644 index df64485cf70..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.6-plus.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3.6 Plus" -description = "Qwen3.6-Plus — a balanced general-purpose model by Alibaba Cloud optimized for performance, cost, and speed. Suitable for a wide range of chat and generation tasks." -family = "qwen3.6" -release_date = "2026-04-21" -last_updated = "2026-04-21" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.52 -output = 3.12 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.7-max.toml b/providers/aimlapi/models/alibaba/qwen3.7-max.toml index e90f8474b8a..ad69c73c11c 100644 --- a/providers/aimlapi/models/alibaba/qwen3.7-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.7-max.toml @@ -1,24 +1,10 @@ -name = "Qwen3.7 Max" -description = "Qwen3.7-Max is Alibaba’s flagship reasoning and agentic LLM optimized for coding, productivity, long-context understanding and autonomous workflows. Text input and text output only. Supports function calling, explicit context cache and advanced reasoning capabilities." -family = "qwen3.7-max" -release_date = "2026-05-21" -last_updated = "2026-05-21" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3.7-max" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 2.6 output = 7.8 cache_read = 2.6 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.7-plus.toml b/providers/aimlapi/models/alibaba/qwen3.7-plus.toml deleted file mode 100644 index 64173d1ebc5..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.7-plus.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Qwen3.7-Plus" -description = "Qwen3.7-Plus is a multimodal agent model that unifies vision and language into a single agent foundation. It delivers strong vision-language capabilities while retaining agentic strength in coding, tool use, and productivity workflows — including GUI understanding, visual Q&A, and full-modality input for complex software engineering tasks." -family = "qwen3.7-plus" -release_date = "2026-06-01" -last_updated = "2026-06-01" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.416 -output = 1.664 -cache_read = 0.0832 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml index eedc3ee7545..3ae6076152a 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml @@ -1,12 +1,8 @@ -name = "Qwen3.8 2.4T A95B" -description = "Qwen3.8 2.4T A95B is an open-weight sparse mixture-of-experts model from Qwen and the open-weight variant of Qwen3.8 Max, with 95 billion active parameters out of 2.4 trillion total. Reasoning is always on." -release_date = "2026-08-12" -last_updated = "2026-08-12" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3.8-2.4t-a95b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 3.4385 @@ -14,10 +10,4 @@ output = 8.59625 cache_read = 0.6877 [limit] -context = 262_144 -input = 262_144 output = 52_429 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml index 8f9f3b4ff71..77fdf0eda88 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml @@ -1,22 +1,12 @@ -name = "Qwen3.8 27B" -description = "Qwen3.8 27B is an open-weight dense vision-language model from Qwen. It accepts text, image and video inputs and is suited for coding, professional workflows, research, multimodal interaction and long-running agent tasks, with flexible thinking that can be tuned per request." -release_date = "2026-08-14" -last_updated = "2026-08-14" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3.8-27b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.61893 output = 4.40128 [limit] -context = 262_144 -input = 262_144 output = 131_072 - -[modalities] -input = ["image", "text", "video"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml index 10fdead5776..811f1426cff 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml @@ -1,23 +1,10 @@ -name = "Qwen3.8 Flash" -description = "Qwen3.8-Flash is the speed- and cost-optimized tier of the Qwen3.8 family, pairing hybrid thinking with high throughput for coding assistance, agentic workflows and visual understanding. Natively multimodal: accepts text, images and video and returns text, with a 1M-token context window. Supports function calling, built-in tools (including web search), structured outputs and context caching." -release_date = "2026-08-26" -last_updated = "2026-08-26" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3.8-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.208 output = 0.611 cache_read = 0.0208 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index a13befb62e7..654d7093d5e 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -1,24 +1,10 @@ -name = "Qwen3.8 Max" -description = "Qwen3.8-Max is Alibaba’s flagship reasoning and agentic LLM, positioned as its highest-capability tier for complex multi-step reasoning, coding and autonomous workflows. Natively multimodal: accepts text and images and returns text, with a 1M-token context window. Supports hybrid thinking mode, function calling, built-in tools (including web search) and structured outputs." -family = "qwen3.8-max" -release_date = "2026-08-03" -last_updated = "2026-08-03" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "alibaba/qwen3.8-max" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 2.6 output = 7.8 cache_read = 0.325 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml b/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml deleted file mode 100644 index 515e4cdc003..00000000000 --- a/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Magnum v4 72B" -description = "Magnum V4 is a powerful language model optimized for high-quality text generation tasks." -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 4.1262 -output = 6.877 - -[limit] -context = 32_000 -input = 32_000 -output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.toml b/providers/aimlapi/models/anthropic/claude-fable-5.toml deleted file mode 100644 index 7dd55cee867..00000000000 --- a/providers/aimlapi/models/anthropic/claude-fable-5.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude Fable 5" -description = "Claude Fable 5 is Anthropic's model designed for complex reasoning and agentic coding workflows. Features a 1M token context window, adaptive thinking, and strong performance across multilingual tasks, long-context handling, and vision." -family = "claude-fable" -release_date = "2026-06-09" -last_updated = "2026-06-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 13 -output = 65 -cache_read = 1.3 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml b/providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml deleted file mode 100644 index ff1d913416f..00000000000 --- a/providers/aimlapi/models/anthropic/claude-haiku-4-5-20251001.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.5 Haiku" -description = "Claude 4.5 Haiku is a fast, lightweight model optimized for quick responses and high-throughput applications." -family = "claude-haiku" -release_date = "2025-10-16" -last_updated = "2025-10-16" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.3 -output = 6.5 -cache_read = 0.13 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml index c347be507bf..626bc3d762f 100644 --- a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml @@ -1,24 +1,10 @@ -name = "Claude 4.5 Haiku" -description = "Claude 4.5 Haiku is a fast, lightweight model optimized for quick responses and high-throughput applications." -family = "claude-haiku" -release_date = "2025-10-16" -last_updated = "2025-10-16" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "anthropic/claude-haiku-4-5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 1.3754 output = 6.877 cache_read = 0.13754 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml b/providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml deleted file mode 100644 index 3da960db23b..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4-1-20250805.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.1 Opus" -description = "Claude 4.1 Opus is an enhanced version of Claude 4 Opus with improved reasoning and instruction-following capabilities." -family = "claude-opus" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 19.5 -output = 97.5 -cache_read = 1.95 - -[limit] -context = 200_000 -input = 200_000 -output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml b/providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml deleted file mode 100644 index e89d5594097..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4-5-20251101.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.5 Opus" -description = "Claude 4.5 Opus is Anthropic's flagship model for the most demanding reasoning and analysis tasks." -family = "claude-opus" -release_date = "2025-11-25" -last_updated = "2025-11-25" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 6.5 -output = 32.5 -cache_read = 0.65 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-6.toml b/providers/aimlapi/models/anthropic/claude-opus-4-6.toml deleted file mode 100644 index fcdb333c25b..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4-6.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.6 Opus" -description = "Claude 4.6 Opus delivers Anthropic's highest intelligence with extended output for complex, long-horizon tasks." -family = "claude-opus" -release_date = "2026-02-06" -last_updated = "2026-02-06" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 6.5 -output = 32.5 -cache_read = 0.65 - -[limit] -context = 200_000 -input = 200_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4-8.toml b/providers/aimlapi/models/anthropic/claude-opus-4-8.toml deleted file mode 100644 index 01bf0f0a88f..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4-8.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.8 Opus" -description = "Claude 4.8 Opus is Anthropic's most capable model designed for complex reasoning and agentic coding workflows. Features a 1M token context window, adaptive thinking, and top-tier performance across multilingual tasks, long-context handling, and vision." -family = "claude-opus" -release_date = "2026-05-28" -last_updated = "2026-05-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 6.5 -output = 32.5 -cache_read = 0.65 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml index 47786dc4e28..c86491a03be 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml @@ -1,24 +1,10 @@ -name = "Claude 4.1 Opus" -description = "Claude 4.1 Opus is an enhanced version of Claude 4 Opus with improved reasoning and instruction-following capabilities." -family = "claude-opus" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "anthropic/claude-opus-4-1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 20.631 output = 103.155 cache_read = 2.0631 - -[limit] -context = 200_000 -input = 200_000 -output = 32_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml index 8a5cb554636..1d5bfafae16 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml @@ -1,24 +1,10 @@ -name = "Claude 4.5 Opus" -description = "Claude 4.5 Opus is Anthropic's flagship model for the most demanding reasoning and analysis tasks." -family = "claude-opus" -release_date = "2025-11-25" -last_updated = "2025-11-25" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "anthropic/claude-opus-4-5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 6.877 output = 34.385 cache_read = 0.6877 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml new file mode 100644 index 00000000000..ebcaa448558 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-opus-4-7" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 41.262 +output = 206.31 +cache_read = 4.1262 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml new file mode 100644 index 00000000000..74ee9952772 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-opus-4-7" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 6.877 +output = 34.385 +cache_read = 0.6877 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml new file mode 100644 index 00000000000..eca8426cea0 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-opus-4-8" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 13.754 +output = 68.77 +cache_read = 1.3754 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index f724b9df4f8..f57da60fd4f 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -1,24 +1,10 @@ -name = "Claude 4.8 Opus" -description = "Claude 4.8 Opus is Anthropic's most capable model designed for complex reasoning and agentic coding workflows. Features a 1M token context window, adaptive thinking, and top-tier performance across multilingual tasks, long-context handling, and vision." -family = "claude-opus" -release_date = "2026-05-28" -last_updated = "2026-05-28" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "anthropic/claude-opus-4-8" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 6.877 output = 34.385 cache_read = 0.6877 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-opus-5.toml b/providers/aimlapi/models/anthropic/claude-opus-5.toml deleted file mode 100644 index 5f622b5b070..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-5.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude Opus 5" -description = "Claude Opus 5 is ideal for complex agentic coding and enterprise work. Features a 1M token context window, adaptive thinking, and top-tier performance across long-horizon agentic tasks, knowledge work, and vision." -family = "claude-opus" -release_date = "2026-07-24" -last_updated = "2026-07-24" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 6.5 -output = 32.5 -cache_read = 0.65 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml deleted file mode 100644 index 0d392a2e5a5..00000000000 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4-5-20250929.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.5 Sonnet" -description = "Claude 4.5 Sonnet offers a balance of intelligence and speed for diverse enterprise and coding tasks." -family = "claude-sonnet" -release_date = "2025-10-01" -last_updated = "2025-10-01" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 3.9 -output = 19.5 -cache_read = 0.39 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml deleted file mode 100644 index 4a33fa60413..00000000000 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4-6.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude 4.6 Sonnet" -description = "Claude 4.6 Sonnet is a highly capable model balancing performance and efficiency for everyday AI tasks." -family = "claude-sonnet" -release_date = "2026-02-18" -last_updated = "2026-02-18" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 3.9 -output = 19.5 -cache_read = 0.39 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml index 4bb067b0250..abdf9b07883 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml @@ -1,24 +1,10 @@ -name = "Claude 4.5 Sonnet" -description = "Claude 4.5 Sonnet offers a balance of intelligence and speed for diverse enterprise and coding tasks." -family = "claude-sonnet" -release_date = "2025-10-01" -last_updated = "2025-10-01" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "anthropic/claude-sonnet-4-5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 4.1262 output = 20.631 cache_read = 0.41262 - -[limit] -context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml index 17417c590c9..a46dbba1d12 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml @@ -1,13 +1,8 @@ -name = "Claude 4.6 Sonnet" -description = "Claude 4.6 Sonnet is a highly capable model balancing performance and efficiency for everyday AI tasks." -family = "claude-sonnet" -release_date = "2026-02-18" -last_updated = "2026-02-18" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "anthropic/claude-sonnet-4-6" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 4.1262 @@ -16,9 +11,3 @@ cache_read = 0.41262 [limit] context = 200_000 -input = 200_000 -output = 64_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml deleted file mode 100644 index 07b90a1f06b..00000000000 --- a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Claude Sonnet 5" -description = "Claude Sonnet 5 is a high-performance model for coding and agentic workflows, delivering near-Opus quality at Sonnet cost. Features a 1M token context window, adaptive thinking, and high-resolution vision." -family = "claude-sonnet" -release_date = "2026-06-30" -last_updated = "2026-06-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.6 -output = 13 -cache_read = 0.26 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml new file mode 100644 index 00000000000..5d0980ba3eb --- /dev/null +++ b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml @@ -0,0 +1,14 @@ +base_model = "arcee-ai/trinity-large-thinking" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.302588 +output = 1.16909 +cache_read = 0.082524 + +[limit] +context = 262_144 +output = 80_000 diff --git a/providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml b/providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml deleted file mode 100644 index 0fd7d23d03e..00000000000 --- a/providers/aimlapi/models/baidu/ernie-4.5-vl-424b-a47b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Ernie 4.5 VL 424B A47B" -description = "High-capacity vision-language Ernie 4.5 VL 424B A47B for demanding multimodal workflows." -family = "ernie" -release_date = "2026-01-12" -last_updated = "2026-01-12" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.5577 -output = 1.677 - -[limit] -context = 123_000 -input = 123_000 -output = 123_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/baidu/ernie-5.0.toml b/providers/aimlapi/models/baidu/ernie-5.0.toml deleted file mode 100644 index 0ced30896df..00000000000 --- a/providers/aimlapi/models/baidu/ernie-5.0.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "ERNIE 5.0" -description = "ERNIE 5.0 is Baidu’s unified foundation model supporting text generation, visual understanding, and deep-thinking reasoning, with a 128K context window." -family = "ernie" -release_date = "2026-06-30" -last_updated = "2026-06-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.82 -output = 7.28 - -[limit] -context = 128_000 -input = 128_000 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml b/providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml deleted file mode 100644 index 4b754c1c105..00000000000 --- a/providers/aimlapi/models/bytedance-seed/seed-2-1-turbo.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Seed 2.1 Turbo" -description = "ByteDance Seed 2.1 Turbo is a multimodal model for coding and long-horizon agent workflows, accepting text, image and video input across a 256K context window." -family = "seed" -release_date = "2026-08-10" -last_updated = "2026-08-10" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.6877 -output = 3.4385 - -[limit] -context = 262_144 -input = 262_144 -output = 262_144 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml index 8aeb284b365..b22d70d2be7 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml @@ -1,23 +1,9 @@ -name = "Seed-2.0-Code" -description = "ByteDance Seed-2.0-Code is optimized for agentic coding — frontend development, multilingual programming tasks and coding-agent workflows — with a 256K context window, multimodal (text/image/video) input and selectable reasoning effort." -family = "seed" -release_date = "2026-07-30" -last_updated = "2026-07-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "bytedance-seed/seed-2.0-code" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.6877 output = 4.1262 - -[limit] -context = 262_144 -input = 262_144 -output = 131_072 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml new file mode 100644 index 00000000000..06c0e91575d --- /dev/null +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml @@ -0,0 +1,13 @@ +base_model = "bytedance-seed/seed-2.0-lite" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.34385 +output = 2.7508 + +[limit] +context = 262_144 +output = 131_072 diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml new file mode 100644 index 00000000000..d2cf473b3d6 --- /dev/null +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml @@ -0,0 +1,13 @@ +base_model = "bytedance-seed/seed-2.0-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.13754 +output = 0.55016 + +[limit] +context = 262_144 +output = 131_072 diff --git a/providers/aimlapi/models/bytedance/seed-1-8.toml b/providers/aimlapi/models/bytedance/seed-1-8.toml deleted file mode 100644 index 44b4b7aa6be..00000000000 --- a/providers/aimlapi/models/bytedance/seed-1-8.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Seed 1.8" -description = "ByteDance Seed 1.8 is a large language model with a 256K context window optimized for long-context reasoning and generation." -family = "seed" -release_date = "2026-01-12" -last_updated = "2026-01-12" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.325 -output = 2.6 - -[limit] -context = 256_000 -input = 256_000 -output = 224_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/cohere/command-a.toml b/providers/aimlapi/models/cohere/command-a.toml deleted file mode 100644 index 6733854fea4..00000000000 --- a/providers/aimlapi/models/cohere/command-a.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Command A" -description = "Command A is a powerful LLM with advanced capabilities for enterprise applications." -family = "command-a" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 3.4385 -output = 13.754 - -[limit] -context = 256_000 -input = 256_000 -output = 256_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/cohere/command-r-08-2024.toml b/providers/aimlapi/models/cohere/command-r-08-2024.toml new file mode 100644 index 00000000000..93418a9007b --- /dev/null +++ b/providers/aimlapi/models/cohere/command-r-08-2024.toml @@ -0,0 +1,5 @@ +base_model = "cohere/command-r-08-2024" + +[cost] +input = 0.20631 +output = 0.82524 diff --git a/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml b/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml new file mode 100644 index 00000000000..a7ed695ea2c --- /dev/null +++ b/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml @@ -0,0 +1,5 @@ +base_model = "cohere/command-r-plus-08-2024" + +[cost] +input = 3.4385 +output = 13.754 diff --git a/providers/aimlapi/models/cohere/command-r7b-12-2024.toml b/providers/aimlapi/models/cohere/command-r7b-12-2024.toml new file mode 100644 index 00000000000..6a0ae5ffe27 --- /dev/null +++ b/providers/aimlapi/models/cohere/command-r7b-12-2024.toml @@ -0,0 +1,5 @@ +base_model = "cohere/command-r7b-12-2024" + +[cost] +input = 0.0515775 +output = 0.20631 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml b/providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml deleted file mode 100644 index c2f784804bc..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-chat-v3.1.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek V3.1" -description = "DeepSeek-V3.1 is the latest advanced LLM with improved architecture and performance across various natural language tasks." -family = "deepseek" -release_date = "2025-08-28" -last_updated = "2025-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.89401 -output = 2.33818 -cache_read = 0.75647 - -[limit] -context = 128_000 -input = 128_000 -output = 8_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index 1136d2f3adb..f47b52b0ab1 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -1,13 +1,4 @@ -name = "DeepSeek V3" -description = "DeepSeek-V3 is an advanced LLM with efficient architecture and high performance across various natural language tasks." -family = "deepseek" -release_date = "2025-08-28" -last_updated = "2025-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "deepseek/deepseek-chat" [cost] input = 0.364 @@ -16,9 +7,4 @@ cache_read = 0.0364 [limit] context = 128_000 -input = 128_000 output = 124_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml b/providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml deleted file mode 100644 index ff1f0cc6afc..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-non-reasoner-v3.1-terminus.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek V3.1" -description = "DeepSeek-V3.1 is the latest advanced LLM with improved architecture and performance across various natural language tasks." -family = "deepseek" -release_date = "2025-08-28" -last_updated = "2025-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.371358 -output = 1.3754 -cache_read = 0.371358 - -[limit] -context = 128_000 -input = 128_000 -output = 8_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml b/providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml deleted file mode 100644 index e283befe929..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-non-thinking-v3.2-exp.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek V3.2 Exp" -description = "DeepSeek-V3.2-Exp is an experimental variant of DeepSeek-V3.2 with extended context and non-thinking mode for fast responses." -family = "deepseek" -release_date = "2025-10-03" -last_updated = "2025-10-03" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.371358 -output = 0.563914 -cache_read = 0.371358 - -[limit] -context = 128_000 -input = 128_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-r1.toml b/providers/aimlapi/models/deepseek/deepseek-r1.toml deleted file mode 100644 index 0bcdc0d420f..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-r1.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek Reasoner V3.1" -description = "DeepSeek Reasoner V3.1 excels in reasoning tasks with advanced chain-of-thought processing and the latest improvements in parameter activation." -family = "deepseek" -release_date = "2025-08-28" -last_updated = "2025-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.6877 -output = 2.95711 -cache_read = 0.6877 - -[limit] -context = 128_000 -input = 128_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml b/providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml deleted file mode 100644 index ff1f0cc6afc..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-reasoner-v3.1-terminus.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek V3.1" -description = "DeepSeek-V3.1 is the latest advanced LLM with improved architecture and performance across various natural language tasks." -family = "deepseek" -release_date = "2025-08-28" -last_updated = "2025-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.371358 -output = 1.3754 -cache_read = 0.371358 - -[limit] -context = 128_000 -input = 128_000 -output = 8_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-reasoner.toml b/providers/aimlapi/models/deepseek/deepseek-reasoner.toml deleted file mode 100644 index eee838b7579..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-reasoner.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek R1" -description = "DeepSeek R1 excels in reasoning tasks with advanced features like chain-of-thought processing and efficient parameter activation" -family = "deepseek" -release_date = "2025-08-28" -last_updated = "2025-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.364 -output = 0.546 -cache_read = 0.0364 - -[limit] -context = 128_000 -input = 128_000 -output = 127_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml b/providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml deleted file mode 100644 index 49d2c75a6c6..00000000000 --- a/providers/aimlapi/models/deepseek/deepseek-thinking-v3.2-exp.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "DeepSeek V3.2 Exp" -description = "DeepSeek-V3.2-Exp is an experimental variant of DeepSeek-V3.2 with extended context and non-thinking mode for fast responses." -family = "deepseek-thinking" -release_date = "2025-10-03" -last_updated = "2025-10-03" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.371358 -output = 0.563914 -cache_read = 0.371358 - -[limit] -context = 128_000 -input = 128_000 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index e14ec62d5c9..14c8b06da73 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -1,13 +1,8 @@ -name = "DeepSeek V4 Flash Vision Exp" -description = "DeepSeek V4 Flash Vision Exp is an experimental vision-enabled build of DeepSeek V4 Flash. It adds image understanding on top of the base model while matching it on text tasks, with a 1M-token context window and thinking mode enabled by default." -family = "deepseek" -release_date = "2026-08-21" -last_updated = "2026-08-21" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "deepseek/deepseek-v4-flash-vision-exp" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.572 @@ -16,9 +11,3 @@ cache_read = 0.0182 [limit] context = 1_048_576 -input = 1_048_576 -output = 384_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 822af6bc3cd..56437429724 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -1,24 +1,10 @@ -name = "DeepSeek V4 Flash" -description = "DeepSeek V4 Flash and Pro are large language models for chat and reasoning tasks with up to 1M context length. They support both standard and thinking modes, enabling efficient responses or deeper reasoning workflows." -family = "deepseek" -release_date = "2026-04-24" -last_updated = "2026-04-24" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "deepseek/deepseek-v4-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.182 output = 0.364 cache_read = 0.00364 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 384_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index 710bd150065..c8947cb45c0 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -1,13 +1,8 @@ -name = "DeepSeek V4 Pro 0813" -description = "DeepSeek V4 Pro 0813 is the GA release of DeepSeek V4 Pro — a large-scale mixture-of-experts model for chat and reasoning tasks with 1M context length, supporting both standard and thinking modes." -family = "deepseek" -release_date = "2026-08-12" -last_updated = "2026-08-12" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "deepseek/deepseek-v4-pro-0813" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 2.393196 @@ -16,9 +11,3 @@ cache_read = 0.199433 [limit] context = 1_048_576 -input = 1_048_576 -output = 384_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 0494f280ab4..e733d802ed8 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -1,24 +1,10 @@ -name = "DeepSeek V4 Pro" -description = "DeepSeek V4 Flash and Pro are large language models for chat and reasoning tasks with up to 1M context length. They support both standard and thinking modes, enabling efficient responses or deeper reasoning workflows." -family = "deepseek" -release_date = "2026-04-24" -last_updated = "2026-04-24" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "deepseek/deepseek-v4-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.5655 output = 1.131 cache_read = 0.0047125 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 384_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-image.toml b/providers/aimlapi/models/google/gemini-2.5-flash-image.toml new file mode 100644 index 00000000000..cd9fc31bd11 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-2.5-flash-image.toml @@ -0,0 +1,10 @@ +base_model = "google/gemini-2.5-flash-image" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.742716 +output = 6.1893 +cache_read = 0.0742716 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml deleted file mode 100644 index 015b166c9aa..00000000000 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite-preview.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemini 2.5 Flash Lite Preview" -description = "Gemini 2.5 Flash Lite Preview is a lightweight AI model developed by Google, optimized for quick responses and efficient processing, making it ideal for tasks requiring minimal latency and resource consumption" -family = "gemini" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.0975 -output = 0.39 -cache_read = 0.0975 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 1_048_576 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index 015b166c9aa..84c6d6a63de 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -1,13 +1,8 @@ -name = "Gemini 2.5 Flash Lite Preview" -description = "Gemini 2.5 Flash Lite Preview is a lightweight AI model developed by Google, optimized for quick responses and efficient processing, making it ideal for tasks requiring minimal latency and resource consumption" -family = "gemini" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "google/gemini-2.5-flash-lite" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.0975 @@ -16,9 +11,4 @@ cache_read = 0.0975 [limit] context = 1_000_000 -input = 1_000_000 output = 1_048_576 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-2.5-pro.toml b/providers/aimlapi/models/google/gemini-2.5-pro.toml deleted file mode 100644 index 7729dd62370..00000000000 --- a/providers/aimlapi/models/google/gemini-2.5-pro.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemini 2.5 Pro" -description = "Gemini Pro 2.5 is Google's most advanced reasoning AI model designed for complex tasks, showcasing strong reasoning and coding capabilities. It leads various benchmarks, indicating its enhanced performance." -family = "gemini" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 13 -cache_read = 1.625 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-6-flash.toml b/providers/aimlapi/models/google/gemini-3-6-flash.toml deleted file mode 100644 index 8326f7dfdf9..00000000000 --- a/providers/aimlapi/models/google/gemini-3-6-flash.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemini 3.6 Flash" -description = "Gemini 3.6 Flash is Google’s most intelligent Flash model, balancing speed with frontier intelligence for strong performance on agentic, coding and multimodal tasks, with superior search and grounding." -family = "gemini" -release_date = "2026-07-21" -last_updated = "2026-07-21" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.95 -output = 9.75 -cache_read = 0.195 - -[limit] -context = 1_048_576 -input = 1_048_576 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-7-flash.toml b/providers/aimlapi/models/google/gemini-3-7-flash.toml deleted file mode 100644 index d8dbbdc7314..00000000000 --- a/providers/aimlapi/models/google/gemini-3-7-flash.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemini 3.7 Flash" -description = "Gemini 3.7 Flash is the high-efficiency Flash model of the Gemini 3 family, with Pro-level agentic capabilities, stronger code generation and terminal execution, and high token efficiency for multi-step multimodal work." -family = "gemini" -release_date = "2026-08-13" -last_updated = "2026-08-13" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.975 -output = 4.875 -cache_read = 0.0975 - -[limit] -context = 1_048_576 -input = 1_048_576 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-flash-preview.toml b/providers/aimlapi/models/google/gemini-3-flash-preview.toml deleted file mode 100644 index 1005f2ee312..00000000000 --- a/providers/aimlapi/models/google/gemini-3-flash-preview.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemini 3 Flash Preview" -description = "Gemini 3 Flash Preview is a fast, efficient variant of Gemini 3 designed for low-latency multimodal applications." -family = "gemini" -release_date = "2025-12-17" -last_updated = "2025-12-17" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.65 -output = 3.9 -cache_read = 0.65 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3-pro-image-preview.toml b/providers/aimlapi/models/google/gemini-3-pro-image-preview.toml new file mode 100644 index 00000000000..4932eb4ba0e --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3-pro-image-preview.toml @@ -0,0 +1,10 @@ +base_model = "google/gemini-3-pro-image-preview" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.7508 +output = 16.5048 +cache_read = 0.27508 diff --git a/providers/aimlapi/models/google/gemini-3-pro-image.toml b/providers/aimlapi/models/google/gemini-3-pro-image.toml new file mode 100644 index 00000000000..7f6c33369c9 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3-pro-image.toml @@ -0,0 +1,10 @@ +base_model = "google/gemini-3-pro-image" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.7508 +output = 16.5048 +cache_read = 0.27508 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml b/providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml new file mode 100644 index 00000000000..19d5157aacd --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml @@ -0,0 +1,13 @@ +base_model = "google/gemini-3.1-flash-image-preview" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.6877 +output = 4.1262 + +[limit] +context = 131_072 +output = 32_768 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-image.toml b/providers/aimlapi/models/google/gemini-3.1-flash-image.toml new file mode 100644 index 00000000000..6856e087191 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-flash-image.toml @@ -0,0 +1,9 @@ +base_model = "google/gemini-3.1-flash-image" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.6877 +output = 4.1262 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml b/providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml new file mode 100644 index 00000000000..c9a308a289e --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml @@ -0,0 +1,12 @@ +base_model = "google/gemini-3.1-flash-lite-image" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.34385 +output = 2.0631 + +[limit] +output = 66_000 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml b/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml new file mode 100644 index 00000000000..e4507cc7a27 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml @@ -0,0 +1,13 @@ +base_model = "google/gemini-3.1-flash-lite-preview" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.34385 +output = 2.0631 +cache_read = 0.034385 + +[limit] +context = 1_000_000 diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml new file mode 100644 index 00000000000..090f8c1040b --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml @@ -0,0 +1,13 @@ +base_model = "google/gemini-3.1-pro-preview-customtools" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.7508 +output = 16.5048 +cache_read = 0.27508 + +[limit] +context = 1_048_756 diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml deleted file mode 100644 index f79176aabe2..00000000000 --- a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemini 3.1 Pro Preview" -description = "A frontier reasoning model optimized for software engineering and agentic workflows with 1M token context." -family = "gemini" -release_date = "2026-02-25" -last_updated = "2026-02-25" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.6 -output = 15.6 -cache_read = 0.65 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3.6-flash.toml b/providers/aimlapi/models/google/gemini-3.6-flash.toml index 8326f7dfdf9..8cce4b4e5db 100644 --- a/providers/aimlapi/models/google/gemini-3.6-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.6-flash.toml @@ -1,24 +1,10 @@ -name = "Gemini 3.6 Flash" -description = "Gemini 3.6 Flash is Google’s most intelligent Flash model, balancing speed with frontier intelligence for strong performance on agentic, coding and multimodal tasks, with superior search and grounding." -family = "gemini" -release_date = "2026-07-21" -last_updated = "2026-07-21" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "google/gemini-3.6-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 1.95 output = 9.75 cache_read = 0.195 - -[limit] -context = 1_048_576 -input = 1_048_576 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-3.7-flash.toml b/providers/aimlapi/models/google/gemini-3.7-flash.toml index d8dbbdc7314..c159244eee9 100644 --- a/providers/aimlapi/models/google/gemini-3.7-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.7-flash.toml @@ -1,24 +1,10 @@ -name = "Gemini 3.7 Flash" -description = "Gemini 3.7 Flash is the high-efficiency Flash model of the Gemini 3 family, with Pro-level agentic capabilities, stronger code generation and terminal execution, and high token efficiency for multi-step multimodal work." -family = "gemini" -release_date = "2026-08-13" -last_updated = "2026-08-13" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "google/gemini-3.7-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.975 output = 4.875 cache_read = 0.0975 - -[limit] -context = 1_048_576 -input = 1_048_576 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemini-flash-latest.toml b/providers/aimlapi/models/google/gemini-flash-latest.toml new file mode 100644 index 00000000000..65342ef400e --- /dev/null +++ b/providers/aimlapi/models/google/gemini-flash-latest.toml @@ -0,0 +1,10 @@ +base_model = "google/gemini-flash-latest" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.0631 +output = 12.3786 +cache_read = 0.20631 diff --git a/providers/aimlapi/models/google/gemma-3-12b-it.toml b/providers/aimlapi/models/google/gemma-3-12b-it.toml deleted file mode 100644 index 220d523bfaf..00000000000 --- a/providers/aimlapi/models/google/gemma-3-12b-it.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemma 3 12B" -description = "Gemma 3 12B is a mid-size open language model from Google offering a balance of capability and efficiency." -family = "gemma" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.06877 -output = 0.20631 -cache_read = 0.055016 - -[limit] -context = 131_000 -input = 131_000 -output = 96_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-3-27b-it.toml b/providers/aimlapi/models/google/gemma-3-27b-it.toml deleted file mode 100644 index 14469a91d3e..00000000000 --- a/providers/aimlapi/models/google/gemma-3-27b-it.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemma 3 27B" -description = "Gemma 3 27B is Google's largest Gemma open model, delivering strong reasoning and text generation capabilities." -family = "gemma" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.20631 -output = 0.632684 -cache_read = 0.103155 - -[limit] -context = 128_000 -input = 128_000 -output = 131_072 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-3-4b-it.toml b/providers/aimlapi/models/google/gemma-3-4b-it.toml deleted file mode 100644 index fae7ae3c2ff..00000000000 --- a/providers/aimlapi/models/google/gemma-3-4b-it.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemma 3 4B" -description = "Gemma 3 4B is a lightweight open language model from Google, suitable for on-device deployment and efficient inference." -family = "gemma" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.06877 -output = 0.13754 -cache_read = 0.055016 - -[limit] -context = 131_000 -input = 131_000 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml b/providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml deleted file mode 100644 index 276126dd742..00000000000 --- a/providers/aimlapi/models/google/gemma-4-26b-a4b-it-maas.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Gemma 4 26B A4B IT" -description = "Gemma 4 26B A4B IT is an instruction-tuned Mixture-of-Experts open model from Google." -family = "gemma" -release_date = "2026-06-23" -last_updated = "2026-06-23" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.195 -output = 0.78 -cache_read = 0.195 - -[limit] -context = 262_144 -input = 262_144 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml index 953a8582058..86370326cb4 100644 --- a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml @@ -1,13 +1,8 @@ -name = "Gemma 4 26B A4B IT" -description = "Gemma 4 26B A4B IT is an instruction-tuned Mixture-of-Experts open model from Google." -family = "gemma" -release_date = "2026-06-23" -last_updated = "2026-06-23" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "google/gemma-4-26b-a4b-it" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.20631 @@ -15,10 +10,4 @@ output = 0.82524 cache_read = 0.20631 [limit] -context = 262_144 -input = 262_144 output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/google/gemma-4-31b-it.toml b/providers/aimlapi/models/google/gemma-4-31b-it.toml new file mode 100644 index 00000000000..19755a0cfa3 --- /dev/null +++ b/providers/aimlapi/models/google/gemma-4-31b-it.toml @@ -0,0 +1,14 @@ +base_model = "google/gemma-4-31b-it" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 1.361646 +output = 2.049346 +cache_read = 1.361646 + +[limit] +context = 256_000 +output = 262_144 diff --git a/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml deleted file mode 100644 index a713feabe4d..00000000000 --- a/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "MythoMax 13B" -description = "One of the highest performing and most popular fine-tunes of Llama 2 13B, with rich descriptions and roleplay." -release_date = "2025-12-09" -last_updated = "2025-12-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.578875 -output = 2.578875 -cache_read = 2.578875 - -[limit] -context = 4_096 -input = 4_096 -output = 4_096 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/meituan/longcat-2.0.toml b/providers/aimlapi/models/meituan/longcat-2.0.toml deleted file mode 100644 index fae4399e81d..00000000000 --- a/providers/aimlapi/models/meituan/longcat-2.0.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "LongCat-2.0" -description = "LongCat-2.0 is Meituan's trillion-parameter agentic MoE model with a 1M-token context window and up to 128K output tokens. It supports native tool calling and multi-step reasoning." -family = "longcat" -release_date = "2026-06-30" -last_updated = "2026-06-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.975 -output = 3.8349999999999995 -cache_read = 0.0195 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml b/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml deleted file mode 100644 index 6c8422c2c86..00000000000 --- a/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Llama 3.3 70B Instruct Turbo" -description = "Meta Llama 3.3 70B Instruct Turbo is an advanced language model optimized for instruction-following tasks with high efficiency and performance." -family = "llama" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.144 -output = 1.144 - -[limit] -context = 128_000 -input = 128_000 -output = 127_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml b/providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml deleted file mode 100644 index 179f2db61c9..00000000000 --- a/providers/aimlapi/models/meta-llama/llama-3.3-70b-versatile.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Llama 3.3 70B Versatile" -description = "Llama-3.3-70B-Versatile is Meta's advanced multilingual large language model, optimized for a wide range of natural language processing tasks. With 70 billion parameters, it offers high performance across various benchmarks while maintaining efficiency suitable for diverse applications." -family = "llama" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.767 -output = 1.027 - -[limit] -context = 131_072 -input = 131_072 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/meta/muse-glimmer-30b.toml b/providers/aimlapi/models/meta/muse-glimmer-30b.toml new file mode 100644 index 00000000000..adfbd696b94 --- /dev/null +++ b/providers/aimlapi/models/meta/muse-glimmer-30b.toml @@ -0,0 +1,10 @@ +base_model = "meta/muse-glimmer-30b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.48139 +output = 2.0631 +cache_read = 0.055016 diff --git a/providers/aimlapi/models/meta/muse-spark-1.1.toml b/providers/aimlapi/models/meta/muse-spark-1.1.toml new file mode 100644 index 00000000000..1cf23afdac9 --- /dev/null +++ b/providers/aimlapi/models/meta/muse-spark-1.1.toml @@ -0,0 +1,13 @@ +base_model = "meta/muse-spark-1.1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 1.71925 +output = 5.84545 +cache_read = 0.20631 + +[limit] +context = 1_048_576 diff --git a/providers/aimlapi/models/meta/muse-spark-1.2.toml b/providers/aimlapi/models/meta/muse-spark-1.2.toml new file mode 100644 index 00000000000..089d86b4862 --- /dev/null +++ b/providers/aimlapi/models/meta/muse-spark-1.2.toml @@ -0,0 +1,10 @@ +base_model = "meta/muse-spark-1.2" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 1.71925 +output = 5.84545 +cache_read = 0.20631 diff --git a/providers/aimlapi/models/minimax/MiniMax-Text-01.toml b/providers/aimlapi/models/minimax/MiniMax-Text-01.toml deleted file mode 100644 index 132810f4fc0..00000000000 --- a/providers/aimlapi/models/minimax/MiniMax-Text-01.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Text 01" -description = "MiniMax-Text-01 excels in long-context processing with advanced features like hybrid attention mechanisms and open-source accessibility." -family = "minimax" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.26 -output = 1.43 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 40_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/minimax/m1.toml b/providers/aimlapi/models/minimax/m1.toml deleted file mode 100644 index d95f3f396eb..00000000000 --- a/providers/aimlapi/models/minimax/m1.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "MiniMax M1" -description = "MiniMax-M1 is a powerful reasoning model with a 1M token context window, delivering strong performance on complex tasks." -family = "minimax" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.52 -output = 2.86 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 40_960 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2-1.toml b/providers/aimlapi/models/minimax/m2-1.toml deleted file mode 100644 index f1a9cff43da..00000000000 --- a/providers/aimlapi/models/minimax/m2-1.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "MiniMax M2.1" -description = "MiniMax-M2.1 is an updated Minimax model with a 200K context window optimized for conversational and reasoning tasks." -family = "minimax" -release_date = "2025-12-23" -last_updated = "2025-12-23" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.39 -output = 1.56 -cache_read = 0.39 - -[limit] -context = 204_000 -input = 204_000 -output = 204_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2-5-20260218.toml b/providers/aimlapi/models/minimax/m2-5-20260218.toml deleted file mode 100644 index 818cb58d735..00000000000 --- a/providers/aimlapi/models/minimax/m2-5-20260218.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "MiniMax M2.5" -description = "MiniMax-M2.5 is a general-purpose large language model by MiniMax designed for text generation and conversational AI use cases." -family = "minimax" -release_date = "2026-02-19" -last_updated = "2026-02-19" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.39 -output = 1.56 -cache_read = 0.39 - -[limit] -context = 204_800 -input = 204_800 -output = 204_800 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml b/providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml deleted file mode 100644 index 6797e39df8a..00000000000 --- a/providers/aimlapi/models/minimax/m2-5-highspeed-20260218.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "MiniMax M2.5 Highspeed" -description = "MiniMax-M2.5 Highspeed is a low-latency, high-throughput version of MiniMax-M2.5 optimized for real-time applications." -family = "minimax" -release_date = "2026-02-19" -last_updated = "2026-02-19" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.78 -output = 3.12 -cache_read = 0.78 - -[limit] -context = 204_800 -input = 204_800 -output = 204_800 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/minimax/m2.toml b/providers/aimlapi/models/minimax/m2.toml deleted file mode 100644 index ad94739969e..00000000000 --- a/providers/aimlapi/models/minimax/m2.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "MiniMax M2" -description = "MiniMax-M2 is an advanced large language model with 1M token context for extended reasoning and generation." -family = "minimax" -release_date = "2025-11-04" -last_updated = "2025-11-04" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.39 -output = 1.56 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 40_960 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/minimax/minimax-m3.toml b/providers/aimlapi/models/minimax/minimax-m3.toml deleted file mode 100644 index be258352180..00000000000 --- a/providers/aimlapi/models/minimax/minimax-m3.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "MiniMax M3" -description = "MiniMax M3 is a large-context reasoning model from MiniMax. Supports up to 1M context tokens and is optimized for long-document understanding, coding workflows, agent tasks, and complex multi-step reasoning." -family = "minimax-m3" -release_date = "2026-06-01" -last_updated = "2026-06-01" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.39 -output = 1.56 -cache_read = 0.078 - -[limit] -context = 524_288 -input = 524_288 -output = 524_288 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/mistralai/devstral-2512.toml b/providers/aimlapi/models/mistralai/devstral-2512.toml new file mode 100644 index 00000000000..1d2bca286c3 --- /dev/null +++ b/providers/aimlapi/models/mistralai/devstral-2512.toml @@ -0,0 +1,6 @@ +base_model = "mistral/devstral-2512" + +[cost] +input = 0.605176 +output = 3.02588 +cache_read = 0.06051759999999999 diff --git a/providers/aimlapi/models/mistralai/mistral-large-2512.toml b/providers/aimlapi/models/mistralai/mistral-large-2512.toml new file mode 100644 index 00000000000..df98e427764 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-large-2512.toml @@ -0,0 +1,6 @@ +base_model = "mistral/mistral-large-2512" + +[cost] +input = 0.6877 +output = 2.0631 +cache_read = 0.06877 diff --git a/providers/aimlapi/models/mistralai/mistral-nemo.toml b/providers/aimlapi/models/mistralai/mistral-nemo.toml index 8a5e3238993..f762b3836f3 100644 --- a/providers/aimlapi/models/mistralai/mistral-nemo.toml +++ b/providers/aimlapi/models/mistralai/mistral-nemo.toml @@ -1,13 +1,4 @@ -name = "Mistral NeMo" -description = "Mistral-Nemo is a powerful multilingual language model with advanced capabilities." -family = "mistral-nemo" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "mistral/mistral-nemo" [cost] input = 0.20631 @@ -15,10 +6,4 @@ output = 0.233818 cache_read = 0.20631 [limit] -context = 128_000 -input = 128_000 output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/mistralai/mistral-small-2603.toml b/providers/aimlapi/models/mistralai/mistral-small-2603.toml new file mode 100644 index 00000000000..fdba8062af4 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-small-2603.toml @@ -0,0 +1,13 @@ +base_model = "mistral/mistral-small-2603" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.2578875 +output = 1.03155 +cache_read = 0.020631 + +[limit] +context = 262_144 diff --git a/providers/aimlapi/models/moonshot/kimi-k2-5.toml b/providers/aimlapi/models/moonshot/kimi-k2-5.toml deleted file mode 100644 index 06b66633c34..00000000000 --- a/providers/aimlapi/models/moonshot/kimi-k2-5.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Kimi K2.5" -description = "Kimi k2.5 is a powerful agentic model by Moonshot AI with strong coding and tool-use capabilities." -family = "kimi-k2" -release_date = "2026-02-06" -last_updated = "2026-02-06" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.78 -output = 3.9 -cache_read = 0.13 - -[limit] -context = 262_144 -input = 262_144 -output = 131_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml b/providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml deleted file mode 100644 index 4387f1e0736..00000000000 --- a/providers/aimlapi/models/moonshot/kimi-k2-7-code-highspeed.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Kimi K2.7 Code Highspeed" -description = "High-throughput variant of Kimi K2.7 Code from Moonshot — the same agentic coding model with extended reasoning and tool use, served at higher speed." -family = "kimi-k2" -release_date = "2026-06-22" -last_updated = "2026-06-22" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.47 -output = 10.4 -cache_read = 0.49399999999999994 - -[limit] -context = 262_144 -input = 262_144 -output = 260_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/moonshot/kimi-k2-7-code.toml b/providers/aimlapi/models/moonshot/kimi-k2-7-code.toml deleted file mode 100644 index 11d913e2058..00000000000 --- a/providers/aimlapi/models/moonshot/kimi-k2-7-code.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Kimi K2.7 Code" -description = "Agentic coding model from Moonshot with extended reasoning and tool use." -family = "kimi-k2" -release_date = "2026-06-12" -last_updated = "2026-06-12" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.235 -output = 5.2 -cache_read = 0.24699999999999997 - -[limit] -context = 262_144 -input = 262_144 -output = 260_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml new file mode 100644 index 00000000000..ff971baa25e --- /dev/null +++ b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml @@ -0,0 +1,13 @@ +base_model = "moonshotai/kimi-k2-thinking" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.82524 +output = 3.4385 +cache_read = 0.20631 + +[limit] +output = 100_352 diff --git a/providers/aimlapi/models/nousresearch/hermes-4-405b.toml b/providers/aimlapi/models/nousresearch/hermes-4-405b.toml deleted file mode 100644 index 495fa1936df..00000000000 --- a/providers/aimlapi/models/nousresearch/hermes-4-405b.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Hermes 4 405B" -description = "Hermes 4 is a large-scale reasoning model built on Meta-Llama-3.1-405B with hybrid reasoning mode. It can choose to deliberate internally with ... traces or respond directly, offering flexibility between speed and depth. Supports structured outputs, JSON mode, function calling, and tool use." -family = "nousresearch" -release_date = "2025-10-02" -last_updated = "2025-10-02" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.3754 -output = 4.1262 -cache_read = 1.3754 - -[limit] -context = 131_072 -input = 131_072 -output = 16_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml b/providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml deleted file mode 100644 index 6f709bd307a..00000000000 --- a/providers/aimlapi/models/nvidia/nemotron-3-nano-30b-a3b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Nemotron 3 Nano 30B A3B" -description = "NVIDIA Nemotron 3 Nano 30B A3B is a lightweight MoE language model from the Nemotron 3 family, designed for efficient and scalable text generation and agent workflows with strong compute efficiency." -family = "nemotron" -release_date = "2026-04-30" -last_updated = "2026-04-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.06877 -output = 0.27508 - -[limit] -context = 262_144 -input = 262_144 -output = 228_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml b/providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml deleted file mode 100644 index 896ed2fc7b5..00000000000 --- a/providers/aimlapi/models/nvidia/nemotron-3-super-120b-a12b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Nemotron 3 Super 120B A12B" -description = "NVIDIA Nemotron 3 Super 120B A12B is the high-capacity MoE variant of the Nemotron 3 family, delivering strong reasoning and long-context performance for demanding text generation and agent workflows while preserving MoE compute efficiency." -family = "nemotron" -release_date = "2026-04-30" -last_updated = "2026-04-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.123786 -output = 0.61893 - -[limit] -context = 262_144 -input = 262_144 -output = 262_144 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml b/providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml deleted file mode 100644 index cb7b95b096a..00000000000 --- a/providers/aimlapi/models/nvidia/nemotron-3-ultra-550b-a55b.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Nemotron 3 Ultra 550B A55B" -description = "NVIDIA Nemotron 3 Ultra is a reasoning and orchestration model built on a hybrid Transformer-Mamba Mixture-of-Experts architecture, optimized for complex reasoning, long-context analysis, and agent workflows with up to 1M context length." -family = "nemotron" -release_date = "2026-06-04" -last_updated = "2026-06-04" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.82524 -output = 4.95144 -cache_read = 0.20631 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml b/providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml deleted file mode 100644 index 716b6fc15b0..00000000000 --- a/providers/aimlapi/models/nvidia/nemotron-3.5-lightning.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Nemotron 3.5 Lightning" -description = "NVIDIA Nemotron 3.5 Lightning is an open mixture-of-experts model with 3B active parameters out of 30B total, built for high-throughput agentic workloads and specialized task execution with up to 1M context length." -family = "nemotron" -release_date = "2026-08-11" -last_updated = "2026-08-11" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0 -output = 0 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-3.5-turbo.toml b/providers/aimlapi/models/openai/gpt-3.5-turbo.toml new file mode 100644 index 00000000000..aceb5cf5383 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-3.5-turbo.toml @@ -0,0 +1,8 @@ +base_model = "openai/gpt-3.5-turbo" + +[cost] +input = 0.65 +output = 1.95 + +[limit] +context = 16_000 diff --git a/providers/aimlapi/models/openai/gpt-4-turbo.toml b/providers/aimlapi/models/openai/gpt-4-turbo.toml new file mode 100644 index 00000000000..d90a9e47eb8 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4-turbo.toml @@ -0,0 +1,5 @@ +base_model = "openai/gpt-4-turbo" + +[cost] +input = 13 +output = 39 diff --git a/providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml b/providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml deleted file mode 100644 index 75228bcff3b..00000000000 --- a/providers/aimlapi/models/openai/gpt-4.1-2025-04-14.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-4.1" -description = "GPT-4.1 is OpenAI's large-context language model with up to 1M token input and improved instruction following." -family = "gpt" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.6 -output = 10.4 -cache_read = 0.65 - -[limit] -context = 1_047_576 -input = 1_047_576 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4.1-mini.toml b/providers/aimlapi/models/openai/gpt-4.1-mini.toml new file mode 100644 index 00000000000..aabb6d5ed5b --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4.1-mini.toml @@ -0,0 +1,9 @@ +base_model = "openai/gpt-4.1-mini" + +[cost] +input = 0.52 +output = 2.08 +cache_read = 0.13 + +[limit] +context = 1_000_000 diff --git a/providers/aimlapi/models/openai/gpt-4.1-nano.toml b/providers/aimlapi/models/openai/gpt-4.1-nano.toml new file mode 100644 index 00000000000..dbc624c33b7 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4.1-nano.toml @@ -0,0 +1,9 @@ +base_model = "openai/gpt-4.1-nano" + +[cost] +input = 0.13 +output = 0.52 +cache_read = 0.0325 + +[limit] +context = 1_000_000 diff --git a/providers/aimlapi/models/openai/gpt-4.1.toml b/providers/aimlapi/models/openai/gpt-4.1.toml index 75228bcff3b..e522294beb7 100644 --- a/providers/aimlapi/models/openai/gpt-4.1.toml +++ b/providers/aimlapi/models/openai/gpt-4.1.toml @@ -1,24 +1,6 @@ -name = "GPT-4.1" -description = "GPT-4.1 is OpenAI's large-context language model with up to 1M token input and improved instruction following." -family = "gpt" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-4.1" [cost] input = 2.6 output = 10.4 cache_read = 0.65 - -[limit] -context = 1_047_576 -input = 1_047_576 -output = 32_768 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4.toml b/providers/aimlapi/models/openai/gpt-4.toml new file mode 100644 index 00000000000..2977fbeb28b --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4.toml @@ -0,0 +1,9 @@ +base_model = "openai/gpt-4" + +[cost] +input = 39 +output = 78 +cache_read = 39 + +[limit] +context = 8_000 diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml b/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml index faa36078832..fbfb5174ab3 100644 --- a/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml +++ b/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml @@ -1,23 +1,8 @@ -name = "GPT-4o" -description = "Multimodal AI model by OpenAI enhancing human-computer interaction." -family = "gpt" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-4o-2024-05-13" [cost] input = 6.5 output = 19.5 [limit] -context = 128_000 -input = 128_000 output = 16_384 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml b/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml index 0e8522113e3..37cdb080980 100644 --- a/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml +++ b/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml @@ -1,24 +1,6 @@ -name = "GPT-4o" -description = "Multimodal AI model by OpenAI enhancing human-computer interaction." -family = "gpt" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-4o-2024-08-06" [cost] input = 3.25 output = 13 cache_read = 1.625 - -[limit] -context = 128_000 -input = 128_000 -output = 16_384 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml b/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml index 0e8522113e3..909b9284067 100644 --- a/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml +++ b/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml @@ -1,24 +1,6 @@ -name = "GPT-4o" -description = "Multimodal AI model by OpenAI enhancing human-computer interaction." -family = "gpt" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-4o-2024-11-20" [cost] input = 3.25 output = 13 cache_read = 1.625 - -[limit] -context = 128_000 -input = 128_000 -output = 16_384 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-4o-mini.toml b/providers/aimlapi/models/openai/gpt-4o-mini.toml new file mode 100644 index 00000000000..b987fdaeb95 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-4o-mini.toml @@ -0,0 +1,6 @@ +base_model = "openai/gpt-4o-mini" + +[cost] +input = 0.195 +output = 0.78 +cache_read = 0.0975 diff --git a/providers/aimlapi/models/openai/gpt-4o.toml b/providers/aimlapi/models/openai/gpt-4o.toml index 0e8522113e3..88760223978 100644 --- a/providers/aimlapi/models/openai/gpt-4o.toml +++ b/providers/aimlapi/models/openai/gpt-4o.toml @@ -1,24 +1,6 @@ -name = "GPT-4o" -description = "Multimodal AI model by OpenAI enhancing human-computer interaction." -family = "gpt" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-4o" [cost] input = 3.25 output = 13 cache_read = 1.625 - -[limit] -context = 128_000 -input = 128_000 -output = 16_384 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-1.toml b/providers/aimlapi/models/openai/gpt-5-1.toml deleted file mode 100644 index 16a1f12c4b2..00000000000 --- a/providers/aimlapi/models/openai/gpt-5-1.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5.1" -description = "GPT-5.1 is an incremental update to GPT-5 with improved accuracy and instruction adherence." -family = "gpt" -release_date = "2025-11-14" -last_updated = "2025-11-14" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 13 -cache_read = 0.1625 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml b/providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml deleted file mode 100644 index cc5e3c7f319..00000000000 --- a/providers/aimlapi/models/openai/gpt-5-2-chat-latest.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5.2 Chat Latest" -description = "The latest conversational release in the GPT-5.2 series with improved dialogue quality." -family = "gpt" -release_date = "2025-12-11" -last_updated = "2025-12-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.275 -output = 18.2 -cache_read = 0.2275 - -[limit] -context = 128_000 -input = 128_000 -output = 16_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-2.toml b/providers/aimlapi/models/openai/gpt-5-2.toml deleted file mode 100644 index 127a4d72777..00000000000 --- a/providers/aimlapi/models/openai/gpt-5-2.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5.2" -description = "GPT-5.2 is OpenAI's next-generation language model with extended context and enhanced performance." -family = "gpt" -release_date = "2025-12-11" -last_updated = "2025-12-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.275 -output = 18.2 -cache_read = 0.2275 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-2025-08-07.toml b/providers/aimlapi/models/openai/gpt-5-2025-08-07.toml deleted file mode 100644 index 23a961267c8..00000000000 --- a/providers/aimlapi/models/openai/gpt-5-2025-08-07.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5" -description = "GPT-5 is OpenAI's most advanced language model with a 400K token context window and superior reasoning capabilities." -family = "gpt" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 13 -cache_read = 0.1625 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml b/providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml deleted file mode 100644 index f2fe2f9dd7c..00000000000 --- a/providers/aimlapi/models/openai/gpt-5-mini-2025-08-07.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5 Mini" -description = "GPT-5 mini delivers GPT-5 capabilities in a smaller, faster package optimized for cost-sensitive applications." -family = "gpt" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.325 -output = 2.6 -cache_read = 0.0325 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-mini.toml b/providers/aimlapi/models/openai/gpt-5-mini.toml index 7ffe48a8ab9..69fae50bb44 100644 --- a/providers/aimlapi/models/openai/gpt-5-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5-mini.toml @@ -1,24 +1,10 @@ -name = "GPT-5 Mini" -description = "GPT-5 mini delivers GPT-5 capabilities in a smaller, faster package optimized for cost-sensitive applications." -family = "gpt" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.378235 output = 3.02588 cache_read = 0.34385 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml b/providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml deleted file mode 100644 index 82f8edb5710..00000000000 --- a/providers/aimlapi/models/openai/gpt-5-nano-2025-08-07.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5 Nano" -description = "GPT-5 nano is the most lightweight GPT-5 variant, built for ultra-low latency use cases." -family = "gpt" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.065 -output = 0.52 -cache_read = 0.0065 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-nano.toml b/providers/aimlapi/models/openai/gpt-5-nano.toml index 6680551d190..56bebab6927 100644 --- a/providers/aimlapi/models/openai/gpt-5-nano.toml +++ b/providers/aimlapi/models/openai/gpt-5-nano.toml @@ -1,24 +1,10 @@ -name = "GPT-5 Nano" -description = "GPT-5 nano is the most lightweight GPT-5 variant, built for ultra-low latency use cases." -family = "gpt" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5-nano" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.075647 output = 0.605176 cache_read = 0.06877 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index d00e8536048..ee8cb7ee067 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -1,23 +1,9 @@ -name = "GPT-5 Pro" -description = "GPT-5 Pro is the most powerful GPT-5 variant, offering extended output and superior performance for complex tasks." -family = "gpt" -release_date = "2025-11-21" -last_updated = "2025-11-21" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 20.631 output = 165.048 - -[limit] -context = 400_000 -input = 400_000 -output = 272_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml b/providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml deleted file mode 100644 index 16a1f12c4b2..00000000000 --- a/providers/aimlapi/models/openai/gpt-5.1-2025-11-13.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5.1" -description = "GPT-5.1 is an incremental update to GPT-5 with improved accuracy and instruction adherence." -family = "gpt" -release_date = "2025-11-14" -last_updated = "2025-11-14" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 13 -cache_read = 0.1625 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml new file mode 100644 index 00000000000..d6258f1209a --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.1-codex-max" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 3.4385 +output = 27.508 +cache_read = 0.34385 diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml index 07247594f82..fa3cd2062d2 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml @@ -1,24 +1,10 @@ -name = "GPT-5.1 Codex Mini" -description = "GPT-5.1 Codex Mini is a lighter coding model optimized for fast code completions and suggestions." -family = "gpt" -release_date = "2025-11-14" -last_updated = "2025-11-14" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5.1-codex-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.34385 output = 2.7508 cache_read = 0.041262 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex.toml b/providers/aimlapi/models/openai/gpt-5.1-codex.toml index a4e5580499c..a46ce9b3fde 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex.toml @@ -1,24 +1,10 @@ -name = "GPT-5.1 Codex" -description = "GPT-5.1 Codex is a coding-specialized model from the GPT-5.1 series for code generation and understanding." -family = "gpt" -release_date = "2025-11-14" -last_updated = "2025-11-14" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5.1-codex" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 3.4385 output = 27.508 cache_read = 0.34385 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml b/providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml deleted file mode 100644 index 127a4d72777..00000000000 --- a/providers/aimlapi/models/openai/gpt-5.2-2025-12-11.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5.2" -description = "GPT-5.2 is OpenAI's next-generation language model with extended context and enhanced performance." -family = "gpt" -release_date = "2025-12-11" -last_updated = "2025-12-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.275 -output = 18.2 -cache_read = 0.2275 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml b/providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml deleted file mode 100644 index cc5e3c7f319..00000000000 --- a/providers/aimlapi/models/openai/gpt-5.2-chat-latest.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GPT-5.2 Chat Latest" -description = "The latest conversational release in the GPT-5.2 series with improved dialogue quality." -family = "gpt" -release_date = "2025-12-11" -last_updated = "2025-12-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.275 -output = 18.2 -cache_read = 0.2275 - -[limit] -context = 128_000 -input = 128_000 -output = 16_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-codex.toml b/providers/aimlapi/models/openai/gpt-5.2-codex.toml index 57ce8a12896..90bdfd92974 100644 --- a/providers/aimlapi/models/openai/gpt-5.2-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.2-codex.toml @@ -1,24 +1,10 @@ -name = "GPT-5.2 Codex" -description = "GPT-5.2 Codex is a coding-specialized model from the GPT-5.2 series for advanced code generation." -family = "gpt" -release_date = "2026-01-21" -last_updated = "2026-01-21" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5.2-codex" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 4.8139 output = 38.5112 cache_read = 0.48139 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-pro.toml b/providers/aimlapi/models/openai/gpt-5.2-pro.toml index dcdfb431f96..bf69a62b5f1 100644 --- a/providers/aimlapi/models/openai/gpt-5.2-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.2-pro.toml @@ -1,23 +1,9 @@ -name = "GPT-5.2 Pro" -description = "GPT-5.2 Pro is the flagship GPT-5.2 variant offering maximum output size and reasoning depth." -family = "gpt" -release_date = "2025-12-11" -last_updated = "2025-12-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5.2-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 28.8834 output = 231.0672 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.3-codex.toml b/providers/aimlapi/models/openai/gpt-5.3-codex.toml index dfe1a91d921..f69e9a098bf 100644 --- a/providers/aimlapi/models/openai/gpt-5.3-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.3-codex.toml @@ -1,24 +1,10 @@ -name = "GPT-5.3 Codex" -description = "GPT-5.3 Codex is a coding-specialized model from the GPT-5.3 series for advanced code generation." -family = "gpt" -release_date = "2026-03-02" -last_updated = "2026-03-02" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5.3-codex" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 4.8139 output = 38.5112 cache_read = 0.48139 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-5.4-mini.toml b/providers/aimlapi/models/openai/gpt-5.4-mini.toml new file mode 100644 index 00000000000..4bc5a1e2e7f --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.4-mini.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.4-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.0631 +output = 12.3786 +cache_read = 0.20631 diff --git a/providers/aimlapi/models/openai/gpt-5.4-nano.toml b/providers/aimlapi/models/openai/gpt-5.4-nano.toml new file mode 100644 index 00000000000..f746e7bfc86 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.4-nano.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.4-nano" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.27508 +output = 1.71925 +cache_read = 0.027508 diff --git a/providers/aimlapi/models/openai/gpt-5.4-pro.toml b/providers/aimlapi/models/openai/gpt-5.4-pro.toml new file mode 100644 index 00000000000..8995a0fc847 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.4-pro.toml @@ -0,0 +1,9 @@ +base_model = "openai/gpt-5.4-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 41.262 +output = 247.572 diff --git a/providers/aimlapi/models/openai/gpt-5.5-pro.toml b/providers/aimlapi/models/openai/gpt-5.5-pro.toml new file mode 100644 index 00000000000..3e419c38335 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.5-pro.toml @@ -0,0 +1,9 @@ +base_model = "openai/gpt-5.5-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 41.262 +output = 247.572 diff --git a/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml new file mode 100644 index 00000000000..3e68a281b4f --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.6-luna" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.27508 +output = 1.65048 +cache_read = 0.027508 diff --git a/providers/aimlapi/models/openai/gpt-5.6-luna.toml b/providers/aimlapi/models/openai/gpt-5.6-luna.toml new file mode 100644 index 00000000000..8334dc563ca --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.6-luna.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.6-luna" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.26 +output = 1.56 +cache_read = 0.026 diff --git a/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml new file mode 100644 index 00000000000..42778ea6f24 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.6-sol" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 5.5016 +output = 27.508 +cache_read = 0.55016 diff --git a/providers/aimlapi/models/openai/gpt-5.6-sol.toml b/providers/aimlapi/models/openai/gpt-5.6-sol.toml new file mode 100644 index 00000000000..ebe354795f9 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.6-sol.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.6-sol" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 5.2 +output = 26 +cache_read = 0.52 diff --git a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml new file mode 100644 index 00000000000..e5c75dbe409 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.6-terra" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.7508 +output = 16.5048 +cache_read = 0.27508 diff --git a/providers/aimlapi/models/openai/gpt-5.6-terra.toml b/providers/aimlapi/models/openai/gpt-5.6-terra.toml new file mode 100644 index 00000000000..f12c3f71693 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.6-terra.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.6-terra" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.6 +output = 15.6 +cache_read = 0.26 diff --git a/providers/aimlapi/models/openai/gpt-5.toml b/providers/aimlapi/models/openai/gpt-5.toml index 4244e5c135e..71b1e3b3138 100644 --- a/providers/aimlapi/models/openai/gpt-5.toml +++ b/providers/aimlapi/models/openai/gpt-5.toml @@ -1,24 +1,10 @@ -name = "GPT-5" -description = "GPT-5 is OpenAI's most advanced language model with a 400K token context window and superior reasoning capabilities." -family = "gpt" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 1.891175 output = 15.1294 cache_read = 1.71925 - -[limit] -context = 400_000 -input = 400_000 -output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-oss-120b.toml b/providers/aimlapi/models/openai/gpt-oss-120b.toml index 3e92a8894ef..55a8f241e13 100644 --- a/providers/aimlapi/models/openai/gpt-oss-120b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-120b.toml @@ -1,13 +1,8 @@ -name = "GPT OSS 120B" -description = "GPT OSS 120B is the most powerful Open AI open weight model." -family = "gpt-oss" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-oss-120b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.48139 @@ -16,9 +11,4 @@ cache_read = 0.48139 [limit] context = 131_000 -input = 131_000 output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/gpt-oss-20b.toml b/providers/aimlapi/models/openai/gpt-oss-20b.toml index 0fa6aded63b..68998c7a33e 100644 --- a/providers/aimlapi/models/openai/gpt-oss-20b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-20b.toml @@ -1,13 +1,8 @@ -name = "GPT OSS 20B" -description = "GPT OSS 20B is a powerful Open AI open weight model." -family = "gpt-oss" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "openai/gpt-oss-20b" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.103155 @@ -16,9 +11,4 @@ cache_read = 0.0515775 [limit] context = 131_000 -input = 131_000 output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/o1-pro.toml b/providers/aimlapi/models/openai/o1-pro.toml new file mode 100644 index 00000000000..aee7f3e2ce5 --- /dev/null +++ b/providers/aimlapi/models/openai/o1-pro.toml @@ -0,0 +1,9 @@ +base_model = "openai/o1-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 206.31 +output = 825.24 diff --git a/providers/aimlapi/models/openai/o1.toml b/providers/aimlapi/models/openai/o1.toml new file mode 100644 index 00000000000..7704addd34a --- /dev/null +++ b/providers/aimlapi/models/openai/o1.toml @@ -0,0 +1,13 @@ +base_model = "openai/o1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 19.5 +output = 78 +cache_read = 9.75 + +[limit] +context = 128_000 diff --git a/providers/aimlapi/models/openai/o3-2025-04-16.toml b/providers/aimlapi/models/openai/o3-2025-04-16.toml deleted file mode 100644 index 366eb3bdea7..00000000000 --- a/providers/aimlapi/models/openai/o3-2025-04-16.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "o3" -description = "OpenAI o3 is a frontier reasoning model with exceptional performance on complex scientific, math, and coding tasks." -family = "o" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 2.6 -output = 10.4 -cache_read = 0.65 - -[limit] -context = 200_000 -input = 200_000 -output = 100_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/openai/o3-mini.toml b/providers/aimlapi/models/openai/o3-mini.toml new file mode 100644 index 00000000000..2f7f1df6a8a --- /dev/null +++ b/providers/aimlapi/models/openai/o3-mini.toml @@ -0,0 +1,10 @@ +base_model = "openai/o3-mini" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 1.43 +output = 5.72 +cache_read = 0.715 diff --git a/providers/aimlapi/models/openai/o3-pro.toml b/providers/aimlapi/models/openai/o3-pro.toml new file mode 100644 index 00000000000..20e80f25699 --- /dev/null +++ b/providers/aimlapi/models/openai/o3-pro.toml @@ -0,0 +1,9 @@ +base_model = "openai/o3-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 27.508 +output = 110.032 diff --git a/providers/aimlapi/models/openai/o4-mini-2025-04-16.toml b/providers/aimlapi/models/openai/o4-mini-2025-04-16.toml deleted file mode 100644 index 399abd13e1d..00000000000 --- a/providers/aimlapi/models/openai/o4-mini-2025-04-16.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "o4 Mini" -description = "OpenAI o4-mini is a compact reasoning model that delivers strong performance with lower latency and cost." -family = "o" -release_date = "2025-08-07" -last_updated = "2025-08-07" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.43 -output = 5.72 -cache_read = 0.3575 - -[limit] -context = 200_000 -input = 200_000 -output = 100_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/perplexity/sonar-pro.toml b/providers/aimlapi/models/perplexity/sonar-pro.toml index 5d88a2f9ea4..d353019ac3a 100644 --- a/providers/aimlapi/models/perplexity/sonar-pro.toml +++ b/providers/aimlapi/models/perplexity/sonar-pro.toml @@ -1,23 +1,8 @@ -name = "Sonar Pro" -description = "Perplexity Sonar Pro is an advanced search-augmented language model with deeper reasoning and broader web coverage." -family = "sonar-pro" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "perplexity/sonar-pro" [cost] input = 3.9 output = 19.5 [limit] -context = 200_000 -input = 200_000 output = 100_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/perplexity/sonar.toml b/providers/aimlapi/models/perplexity/sonar.toml index 036db6a1d8d..8b062038318 100644 --- a/providers/aimlapi/models/perplexity/sonar.toml +++ b/providers/aimlapi/models/perplexity/sonar.toml @@ -1,23 +1,8 @@ -name = "Sonar" -description = "Perplexity Sonar is a fast search-augmented language model grounded in real-time web data for up-to-date answers." -family = "sonar" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "perplexity/sonar" [cost] input = 1.3 output = 1.3 [limit] -context = 128_000 -input = 128_000 output = 100_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/poolside/laguna-s-2.1.toml b/providers/aimlapi/models/poolside/laguna-s-2.1.toml new file mode 100644 index 00000000000..7bbd01df825 --- /dev/null +++ b/providers/aimlapi/models/poolside/laguna-s-2.1.toml @@ -0,0 +1,13 @@ +base_model = "poolside/laguna-s-2.1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.123786 +output = 0.247572 +cache_read = 0.0082524 + +[limit] +output = 131_072 diff --git a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml new file mode 100644 index 00000000000..011a014a3c3 --- /dev/null +++ b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml @@ -0,0 +1,10 @@ +base_model = "poolside/laguna-xs-2.1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.082524 +output = 0.165048 +cache_read = 0.041262 diff --git a/providers/aimlapi/models/sakana/fugu-ultra.toml b/providers/aimlapi/models/sakana/fugu-ultra.toml index 37ecd1d9ae2..f14cb9af343 100644 --- a/providers/aimlapi/models/sakana/fugu-ultra.toml +++ b/providers/aimlapi/models/sakana/fugu-ultra.toml @@ -1,13 +1,8 @@ -name = "Fugu Ultra" -description = "Fugu Ultra is the higher-performance model in Sakana AI's Fugu family. Rather than a standard monolithic language model, it is a learned multi-agent orchestration system: a model trained to route tasks across a swappable pool of underlying models and to recursively call instances of itself. It is optimized for complex, multi-step reasoning, coding, and agentic workflows, with orchestration tokens billed as standard input/output tokens." -family = "fugu" -release_date = "2026-06-24" -last_updated = "2026-06-24" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "sakana/fugu-ultra" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 6.877 @@ -15,10 +10,4 @@ output = 41.262 cache_read = 0.6877 [limit] -context = 1_000_000 -input = 1_000_000 output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/sakana/sakana-namazu.toml b/providers/aimlapi/models/sakana/sakana-namazu.toml index 1aae96e483d..0910a71e8c8 100644 --- a/providers/aimlapi/models/sakana/sakana-namazu.toml +++ b/providers/aimlapi/models/sakana/sakana-namazu.toml @@ -1,24 +1,10 @@ -name = "Sakana Namazu" -description = "Sakana Namazu is a Japanese-specialized reasoning model from Sakana AI, based on Kimi K2.6 with additional training for Japanese language and business contexts. It is suited for Japanese instruction following and business workflows, supports a 262K context window, and accepts text, image, and file inputs." -family = "sakana-namazu" -release_date = "2026-08-11" -last_updated = "2026-08-11" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "sakana/sakana-namazu" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 1.30663 output = 5.5016 cache_read = 0.20631 - -[limit] -context = 262_144 -input = 262_144 -output = 65_536 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/stepfun/step-3.7-flash.toml b/providers/aimlapi/models/stepfun/step-3.7-flash.toml deleted file mode 100644 index 06c8efc9b26..00000000000 --- a/providers/aimlapi/models/stepfun/step-3.7-flash.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Step 3.7 Flash" -description = "Step 3.7 Flash is a multimodal Mixture-of-Experts model from StepFun with text, image, and video understanding. It supports a 256K context window and is optimized for fast inference, reasoning, agent workflows, and long-context productivity tasks." -family = "step" -release_date = "2026-06-01" -last_updated = "2026-06-01" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.27508 -output = 1.58171 -cache_read = 0.055016 - -[limit] -context = 256_000 -input = 256_000 -output = 256_000 - -[modalities] -input = ["image", "text", "video"] -output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml b/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml deleted file mode 100644 index 63fb3e2d26f..00000000000 --- a/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Hy-MT2-1.8B" -description = "Hy-MT2-1.8B is a compact 1.8B-parameter translation model from Tencent. It supports 33 language pairs and five Chinese dialect and minority-language pairs, with workflows for structured, delimiter-based, contextual, glossary-based, and style-guided translation." -family = "Hy" -release_date = "2026-08-20" -last_updated = "2026-08-20" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.06051759999999999 -output = 0.2434458 - -[limit] -context = 8_192 -input = 8_192 -output = 4_096 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml b/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml deleted file mode 100644 index c12eadca9b3..00000000000 --- a/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Hy-MT2-30B-A3B" -description = "Hy-MT2-30B-A3B is Tencent's flagship translation model in the Hy-MT2 family. It supports 33 language pairs plus five Chinese dialect and minority-language pairs, with workflows for structured, delimiter-based, contextual and glossary-based translation." -family = "Hy" -release_date = "2026-08-20" -last_updated = "2026-08-20" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.1017796 -output = 0.405743 - -[limit] -context = 8_192 -input = 8_192 -output = 4_096 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy-mt2-7b.toml b/providers/aimlapi/models/tencent/hy-mt2-7b.toml deleted file mode 100644 index 8b2ab3a201f..00000000000 --- a/providers/aimlapi/models/tencent/hy-mt2-7b.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Hy-MT2-7B" -description = "Hy-MT2-7B is a 7B-parameter translation model from Tencent. It supports 33 language pairs and five Chinese dialect and minority-language pairs, with workflows for structured, delimiter-based, contextual, glossary-based, and style-guided translation." -family = "Hy" -release_date = "2026-08-19" -last_updated = "2026-08-19" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.1017796 -output = 0.405743 - -[limit] -context = 8_192 -input = 8_192 -output = 4_096 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/tencent/hy3.toml b/providers/aimlapi/models/tencent/hy3.toml new file mode 100644 index 00000000000..a8d79e8ba93 --- /dev/null +++ b/providers/aimlapi/models/tencent/hy3.toml @@ -0,0 +1,14 @@ +base_model = "tencent/hy3" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.27508 +output = 1.10032 +cache_read = 0.06877 + +[limit] +context = 262_144 +output = 131_072 diff --git a/providers/aimlapi/models/tencent/hy4-preview.toml b/providers/aimlapi/models/tencent/hy4-preview.toml index e9ca1a5cb9d..cc65e8c53b8 100644 --- a/providers/aimlapi/models/tencent/hy4-preview.toml +++ b/providers/aimlapi/models/tencent/hy4-preview.toml @@ -1,12 +1,8 @@ -name = "Hy4 preview" -description = "Hy4 preview is a mixture-of-experts model from Tencent with 49B active parameters out of 770B total, built for coding agents, complex tool-use workflows and productivity tasks. It has a 1M-token context window and configurable reasoning effort." -release_date = "2026-08-28" -last_updated = "2026-08-28" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "tencent/hy4-preview" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 1.1470836 @@ -15,9 +11,3 @@ cache_read = 0.0577668 [limit] context = 1_048_576 -input = 1_048_576 -output = 64_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/thinkingmachines/inkling-small.toml b/providers/aimlapi/models/thinkingmachines/inkling-small.toml index 650b4a42afb..8ee54fbd811 100644 --- a/providers/aimlapi/models/thinkingmachines/inkling-small.toml +++ b/providers/aimlapi/models/thinkingmachines/inkling-small.toml @@ -1,12 +1,8 @@ -name = "Inkling Small" -description = "Inkling Small is an open-weight multimodal mixture-of-experts model from Thinking Machines Lab, with 12B active parameters out of 276B total. It is positioned as the smaller, more efficient member of the Inkling family." -release_date = "2026-07-30" -last_updated = "2026-07-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "thinkingmachines/inkling-small" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.797732 @@ -15,9 +11,4 @@ cache_read = 0.1595464 [limit] context = 524_288 -input = 524_288 output = 262_144 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/thinkingmachines/inkling.toml b/providers/aimlapi/models/thinkingmachines/inkling.toml new file mode 100644 index 00000000000..b7eb76e80e5 --- /dev/null +++ b/providers/aimlapi/models/thinkingmachines/inkling.toml @@ -0,0 +1,10 @@ +base_model = "thinkingmachines/inkling" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 1.3754 +output = 5.57037 +cache_read = 0.233818 diff --git a/providers/aimlapi/models/upstage/solar-pro4.toml b/providers/aimlapi/models/upstage/solar-pro4.toml index 64980444a79..ac67690de8d 100644 --- a/providers/aimlapi/models/upstage/solar-pro4.toml +++ b/providers/aimlapi/models/upstage/solar-pro4.toml @@ -1,24 +1,10 @@ -name = "Solar Pro 4" -description = "Solar Pro 4 is a large language model from Upstage. It is suited for agentic workflows, office productivity, document-intensive work, and coding." -family = "solar" -release_date = "2026-08-10" -last_updated = "2026-08-10" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "upstage/solar-pro4" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.041262 output = 0.165048 cache_read = 0.0082524 - -[limit] -context = 524_288 -input = 524_288 -output = 131_072 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-3-beta.toml b/providers/aimlapi/models/x-ai/grok-3-beta.toml deleted file mode 100644 index 9a3320db9b8..00000000000 --- a/providers/aimlapi/models/x-ai/grok-3-beta.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 3 Beta" -description = "Grok 3 Beta is xAI's advanced language model with strong reasoning and broad knowledge capabilities." -family = "grok" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 131_000 -input = 131_000 -output = 130_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-3-mini-beta.toml b/providers/aimlapi/models/x-ai/grok-3-mini-beta.toml deleted file mode 100644 index 0d390c78b7f..00000000000 --- a/providers/aimlapi/models/x-ai/grok-3-mini-beta.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 3 Beta Mini" -description = "Grok 3 Beta Mini is a compact, efficient variant of Grok 3 optimized for speed and cost-effective inference." -family = "grok" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 131_000 -input = 131_000 -output = 130_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml deleted file mode 100644 index 8c6dd4465e2..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-1-fast-non-reasoning.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4.1 Fast Non-Reasoning" -description = "Grok 4.1 Fast without reasoning for faster responses and lower latency in high-performance agentic applications." -family = "grok" -release_date = "2025-11-20" -last_updated = "2025-11-20" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 2_000_000 -input = 2_000_000 -output = 1_999_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml deleted file mode 100644 index c3a03b76a6a..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-1-fast-reasoning.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4.1 Fast Reasoning" -description = "Grok 4.1 Fast is a frontier multimodal model optimized for high-performance agentic tool calling with advanced reasoning capabilities." -family = "grok" -release_date = "2025-11-20" -last_updated = "2025-11-20" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 2_000_000 -input = 2_000_000 -output = 1_999_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml deleted file mode 100644 index 79ee2f9180c..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4.20 Non-Reasoning" -description = "Grok 4.20 Non-Reasoning — a general-purpose language model optimized for standard text generation and conversational tasks, without extended reasoning capabilities." -family = "grok" -release_date = "2026-04-09" -last_updated = "2026-04-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 2_000_000 -input = 2_000_000 -output = 1_999_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml deleted file mode 100644 index bb2642d914b..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-20-0309-reasoning.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4.20 Reasoning" -description = "Grok 4.20 Reasoning — a large language model designed for advanced reasoning tasks. It excels at multi-step problem solving, logical analysis, and complex instruction following." -family = "grok" -release_date = "2026-04-09" -last_updated = "2026-04-09" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 2_000_000 -input = 2_000_000 -output = 1_999_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-3.toml b/providers/aimlapi/models/x-ai/grok-4-3.toml deleted file mode 100644 index 115e62d2432..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-3.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4.3" -description = "Grok 4.3 is a large language model by xAI for text generation and reasoning tasks. Supports up to 1M context tokens and is optimized for conversational AI and analytical workflows." -family = "grok" -release_date = "2026-05-05" -last_updated = "2026-05-05" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 1_000_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml deleted file mode 100644 index 7364af4b893..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4 Fast Non-Reasoning" -description = "Grok 4 Fast without reasoning for faster responses and lower latency." -family = "grok" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 2_000_000 -input = 2_000_000 -output = 1_999_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml deleted file mode 100644 index 016fec90f40..00000000000 --- a/providers/aimlapi/models/x-ai/grok-4-fast-reasoning.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok 4 Fast Reasoning" -description = "Grok 4 Fast with always-on reasoning for complex problem-solving tasks." -family = "grok" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.625 -output = 3.25 -cache_read = 0.26 - -[limit] -context = 2_000_000 -input = 2_000_000 -output = 1_999_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/x-ai/grok-code-fast-1.toml b/providers/aimlapi/models/x-ai/grok-code-fast-1.toml deleted file mode 100644 index 6ad387bf9bd..00000000000 --- a/providers/aimlapi/models/x-ai/grok-code-fast-1.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Grok Code Fast 1" -description = "A speedy and economical reasoning model that excels at agentic coding with function calling and structured outputs." -family = "grok" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.3 -output = 2.6 -cache_read = 0.26 - -[limit] -context = 256_000 -input = 256_000 -output = 255_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index 9586b604742..649a50bdb63 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -1,13 +1,8 @@ -name = "MiMo V2.5 Pro" -description = "MiMo-V2.5-Pro — a flagship reasoning model by Xiaomi designed for complex agentic workflows, long-horizon tasks, and advanced software engineering scenarios with a 1M token context window." -family = "mimo-v2.5-pro" -release_date = "2026-04-23" -last_updated = "2026-04-23" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "xiaomi/mimo-v2.5-pro" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.598299 @@ -16,9 +11,4 @@ cache_read = 0.00495144 [limit] context = 1_000_000 -input = 1_000_000 output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index cc34d0620fa..8ea2de6fccc 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -1,13 +1,8 @@ -name = "MiMo V2.5" -description = "MiMo-V2.5 — a native omnimodal model by Xiaomi for text, image, audio, and video understanding. It delivers strong agentic performance at lower cost, making it suitable for general-purpose AI applications." -family = "mimo-v2.5" -release_date = "2026-04-23" -last_updated = "2026-04-23" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false +base_model = "xiaomi/mimo-v2.5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.192556 @@ -16,9 +11,4 @@ cache_read = 0.0038511200000000004 [limit] context = 1_000_000 -input = 1_000_000 output = 128_000 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml new file mode 100644 index 00000000000..c745623a2ad --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -0,0 +1,13 @@ +base_model = "zhipuai/glm-4.5v" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.82524 +output = 2.47572 +cache_read = 0.151294 + +[limit] +context = 65_536 diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml new file mode 100644 index 00000000000..ba8f70f7db0 --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -0,0 +1,13 @@ +base_model = "zhipuai/glm-4.6v" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.41262 +output = 1.23786 +cache_read = 0.075647 + +[limit] +context = 131_072 diff --git a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml new file mode 100644 index 00000000000..d828cf1badf --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml @@ -0,0 +1,14 @@ +base_model = "zhipuai/glm-4.7-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.171925 +output = 0.6877 +cache_read = 0.013754 + +[limit] +context = 202_752 +output = 16_384 diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml deleted file mode 100644 index 55777da55b8..00000000000 --- a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.3 Flash" -description = "GLM-5.3 Flash is the low-cost, high-throughput variant of Zhipu AI GLM-5.3, with a 1M-token context window and text, image and video understanding." -family = "glm" -release_date = "2026-08-26" -last_updated = "2026-08-26" -attachment = true -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.0975 -output = 0.325 -cache_read = 0.0195 - -[limit] -context = 1_048_576 -input = 1_048_576 -output = 131_072 - -[modalities] -input = ["image", "text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.5-air.toml b/providers/aimlapi/models/zhipu/glm-4.5-air.toml deleted file mode 100644 index 70f286dae39..00000000000 --- a/providers/aimlapi/models/zhipu/glm-4.5-air.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 4.5 Air" -description = "Lightweight version of GLM-4.5 for cost-effective applications" -family = "glm" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.26 -output = 1.43 -cache_read = 0.039 - -[limit] -context = 128_000 -input = 128_000 -output = 98_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.5.toml b/providers/aimlapi/models/zhipu/glm-4.5.toml deleted file mode 100644 index a0e264a7738..00000000000 --- a/providers/aimlapi/models/zhipu/glm-4.5.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 4.5" -description = "Advanced version of GLM-4.5 with enhanced capabilities and web search integration" -family = "glm" -release_date = "2025-09-09" -last_updated = "2025-09-09" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.78 -output = 2.86 -cache_read = 0.143 - -[limit] -context = 128_000 -input = 128_000 -output = 98_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.6.toml b/providers/aimlapi/models/zhipu/glm-4.6.toml deleted file mode 100644 index f2dd20741b1..00000000000 --- a/providers/aimlapi/models/zhipu/glm-4.6.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 4.6" -description = "Advanced version of GLM-4.6 with web search integration and enhanced capabilities" -family = "glm" -release_date = "2025-10-02" -last_updated = "2025-10-02" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.78 -output = 2.86 -cache_read = 0.143 - -[limit] -context = 200_000 -input = 200_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-4.7.toml b/providers/aimlapi/models/zhipu/glm-4.7.toml deleted file mode 100644 index 70394acd2a1..00000000000 --- a/providers/aimlapi/models/zhipu/glm-4.7.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 4.7" -description = "GLM-4.7 is Zhipu AI flagship text LLM optimized for agentic coding and stable multi-step reasoning, supporting long-context workflows." -family = "glm" -release_date = "2025-12-23" -last_updated = "2025-12-23" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 0.78 -output = 2.86 -cache_read = 0.143 - -[limit] -context = 200_000 -input = 200_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml b/providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml deleted file mode 100644 index e6cf4b4c3bd..00000000000 --- a/providers/aimlapi/models/zhipu/glm-5-2-fast-preview.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.2 Fast Preview" -description = "A latency-optimized GLM-5.2 preview with the same 1M-token context window and 1.5–2× higher output throughput for real-time chat, agents, and coding." -family = "glm" -release_date = "2026-07-10" -last_updated = "2026-07-10" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 4.55 -output = 14.3 -cache_read = 0.91 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5-2.toml b/providers/aimlapi/models/zhipu/glm-5-2.toml deleted file mode 100644 index 25dfee5cbaf..00000000000 --- a/providers/aimlapi/models/zhipu/glm-5-2.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.2" -description = "GLM-5.2 is Zhipu AI flagship MoE LLM with a 1M-token context window, optimized for agentic coding, tool use, reasoning, and long-context tasks." -family = "glm" -release_date = "2026-06-16" -last_updated = "2026-06-16" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.82 -output = 5.72 -cache_read = 0.338 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5-3.toml b/providers/aimlapi/models/zhipu/glm-5-3.toml deleted file mode 100644 index 39ef4b76da2..00000000000 --- a/providers/aimlapi/models/zhipu/glm-5-3.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.3" -description = "GLM-5.3 is Zhipu AI flagship MoE LLM with a 1M-token context window, built for advanced text generation and deep reasoning." -family = "glm" -release_date = "2026-08-17" -last_updated = "2026-08-17" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.82 -output = 5.72 -cache_read = 0.338 - -[limit] -context = 1_024_000 -input = 1_024_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5.2.toml b/providers/aimlapi/models/zhipu/glm-5.2.toml deleted file mode 100644 index 25dfee5cbaf..00000000000 --- a/providers/aimlapi/models/zhipu/glm-5.2.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.2" -description = "GLM-5.2 is Zhipu AI flagship MoE LLM with a 1M-token context window, optimized for agentic coding, tool use, reasoning, and long-context tasks." -family = "glm" -release_date = "2026-06-16" -last_updated = "2026-06-16" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.82 -output = 5.72 -cache_read = 0.338 - -[limit] -context = 1_000_000 -input = 1_000_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5.3.toml b/providers/aimlapi/models/zhipu/glm-5.3.toml deleted file mode 100644 index 39ef4b76da2..00000000000 --- a/providers/aimlapi/models/zhipu/glm-5.3.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5.3" -description = "GLM-5.3 is Zhipu AI flagship MoE LLM with a 1M-token context window, built for advanced text generation and deep reasoning." -family = "glm" -release_date = "2026-08-17" -last_updated = "2026-08-17" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.82 -output = 5.72 -cache_read = 0.338 - -[limit] -context = 1_024_000 -input = 1_024_000 -output = 131_072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/aimlapi/models/zhipu/glm-5.toml b/providers/aimlapi/models/zhipu/glm-5.toml deleted file mode 100644 index 2e6c89f2318..00000000000 --- a/providers/aimlapi/models/zhipu/glm-5.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "GLM 5" -description = "GLM-5 is Zhipu AI next-generation 745B MoE LLM for high-quality text generation and reasoning, optimized for chat, long-form content, and instruction-following tasks." -family = "glm" -release_date = "2026-02-12" -last_updated = "2026-02-12" -attachment = false -reasoning = false -tool_call = false -structured_output = false -open_weights = false - -[cost] -input = 1.3 -output = 4.16 -cache_read = 0.26 - -[limit] -context = 200_000 -input = 200_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] From 35a3b94587a927073fe4ad7bdf3f5e92ddcb4033 Mon Sep 17 00:00:00 2001 From: Stan Date: Fri, 4 Sep 2026 18:56:24 +0500 Subject: [PATCH 03/38] fix(aimlapi): exclude image surfaces and regenerate reasoning options from per-model schemas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses the review on this PR. Two separate causes, one in this sync and one upstream in the host's API. Image surfaces. `isChatTextModel` judged each record on its own modalities, but the catalog lists an id once per endpoint type and the CHAT record of an image model claims text output: `google/gemini-2.5-flash-image` appears both as `openai/image-generations` with `output = ["image"]` and as `openai/chat-completions` with `output = ["text"]`, and the same holds for the `gemini-3-pro-image` and `gemini-3.1-flash-image` families. The answer is not in the record, so the whole response is indexed first and an id this host serves on any media surface is refused regardless of what its chat record claims. The six image entries this admitted are deleted; `deleteMissing: false` retains files that merely fall out of the source, which is why removing them takes an explicit delete. Reasoning options. The uniform `["none", "low", "medium", "high"]` was not invented here — it was read faithfully from a host schema that published one boilerplate enum for every model. The host has since corrected that, and its published schemas now carry seven distinct ladders. Re-running the sync therefore produces per-model values: `none` disappears from GPT-5, Qwen3.8 2.4T A95B and Kimi K2 Thinking, and two models that previously documented no control at all (`alibaba/qwen3.6-max-preview`, `z-ai/glm-5.3-flash`) now do. Known remaining gap, stated rather than papered over: the host's per-model schema endpoint still understates GPT-5, publishing `low/medium/high` where the model demonstrably accepts `minimal` as well. That is a fix on the host side, not here; until it lands, this sync can only publish what the per-model schema states. --- packages/core/src/sync/providers/aimlapi.ts | 39 ++++++++++++++++++- .../qwen3.6-max-preview.toml} | 6 +-- .../models/alibaba/qwen3.8-2.4t-a95b.toml | 2 +- .../arcee-ai/trinity-large-thinking.toml | 2 +- .../models/google/gemini-2.5-flash-image.toml | 10 ----- .../models/google/gemini-2.5-flash-lite.toml | 3 +- .../google/gemini-3-pro-image-preview.toml | 10 ----- .../models/google/gemini-3-pro-image.toml | 10 ----- .../gemini-3.1-flash-image-preview.toml | 13 ------- .../google/gemini-3.1-flash-lite-image.toml | 12 ------ .../models/google/gemini-3.6-flash.toml | 2 +- .../models/google/gemini-3.7-flash.toml | 2 +- .../aimlapi/models/google/gemma-4-31b-it.toml | 2 +- .../models/mistralai/mistral-nemo.toml | 2 +- .../models/moonshotai/kimi-k2-thinking.toml | 4 +- .../aimlapi/models/openai/gpt-5-mini.toml | 2 +- .../aimlapi/models/openai/gpt-5-nano.toml | 2 +- .../aimlapi/models/openai/gpt-5-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5.1-codex.toml | 2 +- .../aimlapi/models/openai/gpt-5.2-codex.toml | 2 +- .../aimlapi/models/openai/gpt-5.2-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5.4-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5.5-pro.toml | 2 +- providers/aimlapi/models/openai/gpt-5.toml | 2 +- .../aimlapi/models/openai/gpt-oss-120b.toml | 4 +- .../aimlapi/models/openai/gpt-oss-20b.toml | 4 +- providers/aimlapi/models/openai/o1-pro.toml | 2 +- providers/aimlapi/models/openai/o1.toml | 2 +- providers/aimlapi/models/openai/o3-mini.toml | 2 +- providers/aimlapi/models/openai/o3-pro.toml | 2 +- providers/aimlapi/models/z-ai/glm-4.5v.toml | 2 +- providers/aimlapi/models/z-ai/glm-4.6v.toml | 2 +- .../aimlapi/models/z-ai/glm-4.7-flash.toml | 2 +- .../aimlapi/models/z-ai/glm-5.3-flash.toml | 13 +++++++ 34 files changed, 83 insertions(+), 89 deletions(-) rename providers/aimlapi/models/{google/gemini-3.1-flash-image.toml => alibaba/qwen3.6-max-preview.toml} (54%) delete mode 100644 providers/aimlapi/models/google/gemini-2.5-flash-image.toml delete mode 100644 providers/aimlapi/models/google/gemini-3-pro-image-preview.toml delete mode 100644 providers/aimlapi/models/google/gemini-3-pro-image.toml delete mode 100644 providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml delete mode 100644 providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml create mode 100644 providers/aimlapi/models/z-ai/glm-5.3-flash.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index c575a607f18..d8c7b25c185 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -84,8 +84,41 @@ function normalizeModalities(values: readonly string[] | null | undefined): Moda return [...seen]; } +/** + * Ids this host also serves on a non-text surface. + * + * The catalog lists an id once per endpoint type, and the chat-surface record of + * an image model claims text output. Measured 2026-09-04: + * `google/gemini-2.5-flash-image` appears both as `openai/image-generations` + * with `output: ["image"]` and as `openai/chat-completions` with + * `output: ["text"]`; the same holds for the `gemini-3-pro-image` and + * `gemini-3.1-flash-image` families. Judging a record only by its own modalities + * therefore admits image generators into a chat catalog. + * + * An id this host serves as a media model is not a text-only chat model, whatever + * its chat record claims. Populated from the whole response before any record is + * judged, because the answer is not in the record itself. + */ +const mediaOutputIDs = new Set(); + +function indexMediaOutputs(models: readonly AimlapiModel[]): void { + mediaOutputIDs.clear(); + for (const model of models) { + const declared = model.modalities?.output ?? []; + // `normalizeModalities` treats an empty list as text, so an undeclared + // record must not be read as evidence of anything. + if (declared.length === 0) continue; + if (normalizeModalities(declared).some((modality) => modality !== "text")) { + mediaOutputIDs.add(model.id); + } + } +} + function isChatTextModel(model: AimlapiModel): boolean { if (model.type !== CHAT_COMPLETIONS_TYPE) return false; + // Cross-surface check first: the chat record of a media model does not admit + // to being one. + if (mediaOutputIDs.has(model.id)) return false; const output = normalizeModalities(model.modalities?.output); // A chat model whose output is not purely text is a media model riding the // chat protocol, and does not belong in a chat catalog. @@ -227,11 +260,15 @@ export const aimlapi = { } const raw = await response.json(); const parsed = AimlapiResponse.parse(raw); + indexMediaOutputs(parsed.data); await attachReasoningEffort(parsed.data); return parsed; }, parseModels(raw) { - return AimlapiResponse.parse(raw).data; + const models = AimlapiResponse.parse(raw).data; + // Replays parse a cached payload without going through fetchModels. + indexMediaOutputs(models); + return models; }, translateModel(model, context) { if (!isChatTextModel(model)) return undefined; diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-image.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml similarity index 54% rename from providers/aimlapi/models/google/gemini-3.1-flash-image.toml rename to providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml index 6856e087191..e0067ed011f 100644 --- a/providers/aimlapi/models/google/gemini-3.1-flash-image.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml @@ -1,9 +1,9 @@ -base_model = "google/gemini-3.1-flash-image" +base_model = "alibaba/qwen3.6-max-preview" [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] [cost] -input = 0.6877 -output = 4.1262 +input = 0.65 +output = 3.9 diff --git a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml index 3ae6076152a..b7c4dffe97a 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml @@ -2,7 +2,7 @@ base_model = "alibaba/qwen3.8-2.4t-a95b" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 3.4385 diff --git a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml index 5d0980ba3eb..33031f2fb01 100644 --- a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml +++ b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml @@ -2,7 +2,7 @@ base_model = "arcee-ai/trinity-large-thinking" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.302588 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-image.toml b/providers/aimlapi/models/google/gemini-2.5-flash-image.toml deleted file mode 100644 index cd9fc31bd11..00000000000 --- a/providers/aimlapi/models/google/gemini-2.5-flash-image.toml +++ /dev/null @@ -1,10 +0,0 @@ -base_model = "google/gemini-2.5-flash-image" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 0.742716 -output = 6.1893 -cache_read = 0.0742716 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index 84c6d6a63de..6675f8837ce 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-2.5-flash-lite" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["minimal", "low", "medium", "high", "max"] [cost] input = 0.0975 @@ -11,4 +11,3 @@ cache_read = 0.0975 [limit] context = 1_000_000 -output = 1_048_576 diff --git a/providers/aimlapi/models/google/gemini-3-pro-image-preview.toml b/providers/aimlapi/models/google/gemini-3-pro-image-preview.toml deleted file mode 100644 index 4932eb4ba0e..00000000000 --- a/providers/aimlapi/models/google/gemini-3-pro-image-preview.toml +++ /dev/null @@ -1,10 +0,0 @@ -base_model = "google/gemini-3-pro-image-preview" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 2.7508 -output = 16.5048 -cache_read = 0.27508 diff --git a/providers/aimlapi/models/google/gemini-3-pro-image.toml b/providers/aimlapi/models/google/gemini-3-pro-image.toml deleted file mode 100644 index 7f6c33369c9..00000000000 --- a/providers/aimlapi/models/google/gemini-3-pro-image.toml +++ /dev/null @@ -1,10 +0,0 @@ -base_model = "google/gemini-3-pro-image" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 2.7508 -output = 16.5048 -cache_read = 0.27508 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml b/providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml deleted file mode 100644 index 19d5157aacd..00000000000 --- a/providers/aimlapi/models/google/gemini-3.1-flash-image-preview.toml +++ /dev/null @@ -1,13 +0,0 @@ -base_model = "google/gemini-3.1-flash-image-preview" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 0.6877 -output = 4.1262 - -[limit] -context = 131_072 -output = 32_768 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml b/providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml deleted file mode 100644 index c9a308a289e..00000000000 --- a/providers/aimlapi/models/google/gemini-3.1-flash-lite-image.toml +++ /dev/null @@ -1,12 +0,0 @@ -base_model = "google/gemini-3.1-flash-lite-image" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 0.34385 -output = 2.0631 - -[limit] -output = 66_000 diff --git a/providers/aimlapi/models/google/gemini-3.6-flash.toml b/providers/aimlapi/models/google/gemini-3.6-flash.toml index 8cce4b4e5db..25ed6371a38 100644 --- a/providers/aimlapi/models/google/gemini-3.6-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.6-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.6-flash" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["minimal", "low", "medium", "high", "max"] [cost] input = 1.95 diff --git a/providers/aimlapi/models/google/gemini-3.7-flash.toml b/providers/aimlapi/models/google/gemini-3.7-flash.toml index c159244eee9..282c1f3d4bc 100644 --- a/providers/aimlapi/models/google/gemini-3.7-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.7-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.7-flash" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["minimal", "low", "medium", "high", "max"] [cost] input = 0.975 diff --git a/providers/aimlapi/models/google/gemma-4-31b-it.toml b/providers/aimlapi/models/google/gemma-4-31b-it.toml index 19755a0cfa3..ed5edce7b43 100644 --- a/providers/aimlapi/models/google/gemma-4-31b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-31b-it.toml @@ -11,4 +11,4 @@ cache_read = 1.361646 [limit] context = 256_000 -output = 262_144 +output = 16_384 diff --git a/providers/aimlapi/models/mistralai/mistral-nemo.toml b/providers/aimlapi/models/mistralai/mistral-nemo.toml index f762b3836f3..e635d20050c 100644 --- a/providers/aimlapi/models/mistralai/mistral-nemo.toml +++ b/providers/aimlapi/models/mistralai/mistral-nemo.toml @@ -6,4 +6,4 @@ output = 0.233818 cache_read = 0.20631 [limit] -output = 131_072 +output = 16_384 diff --git a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml index ff971baa25e..30683df0f19 100644 --- a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml +++ b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml @@ -2,7 +2,7 @@ base_model = "moonshotai/kimi-k2-thinking" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.82524 @@ -10,4 +10,4 @@ output = 3.4385 cache_read = 0.20631 [limit] -output = 100_352 +output = 98_304 diff --git a/providers/aimlapi/models/openai/gpt-5-mini.toml b/providers/aimlapi/models/openai/gpt-5-mini.toml index 69fae50bb44..112c96dff2a 100644 --- a/providers/aimlapi/models/openai/gpt-5-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5-mini.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-mini" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.378235 diff --git a/providers/aimlapi/models/openai/gpt-5-nano.toml b/providers/aimlapi/models/openai/gpt-5-nano.toml index 56bebab6927..8a081097106 100644 --- a/providers/aimlapi/models/openai/gpt-5-nano.toml +++ b/providers/aimlapi/models/openai/gpt-5-nano.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-nano" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.075647 diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index ee8cb7ee067..dcf302b6018 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 20.631 diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex.toml b/providers/aimlapi/models/openai/gpt-5.1-codex.toml index a46ce9b3fde..6c5c7db6021 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.1-codex" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 3.4385 diff --git a/providers/aimlapi/models/openai/gpt-5.2-codex.toml b/providers/aimlapi/models/openai/gpt-5.2-codex.toml index 90bdfd92974..c84a5f445e5 100644 --- a/providers/aimlapi/models/openai/gpt-5.2-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.2-codex.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.2-codex" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 4.8139 diff --git a/providers/aimlapi/models/openai/gpt-5.2-pro.toml b/providers/aimlapi/models/openai/gpt-5.2-pro.toml index bf69a62b5f1..d3e1d34fc0f 100644 --- a/providers/aimlapi/models/openai/gpt-5.2-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.2-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.2-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 28.8834 diff --git a/providers/aimlapi/models/openai/gpt-5.4-pro.toml b/providers/aimlapi/models/openai/gpt-5.4-pro.toml index 8995a0fc847..07fcde9d4f9 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.4-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 41.262 diff --git a/providers/aimlapi/models/openai/gpt-5.5-pro.toml b/providers/aimlapi/models/openai/gpt-5.5-pro.toml index 3e419c38335..2002aaca7ae 100644 --- a/providers/aimlapi/models/openai/gpt-5.5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.5-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.5-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 41.262 diff --git a/providers/aimlapi/models/openai/gpt-5.toml b/providers/aimlapi/models/openai/gpt-5.toml index 71b1e3b3138..d202dbb58fc 100644 --- a/providers/aimlapi/models/openai/gpt-5.toml +++ b/providers/aimlapi/models/openai/gpt-5.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.891175 diff --git a/providers/aimlapi/models/openai/gpt-oss-120b.toml b/providers/aimlapi/models/openai/gpt-oss-120b.toml index 55a8f241e13..312f08e3d34 100644 --- a/providers/aimlapi/models/openai/gpt-oss-120b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-120b.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-oss-120b" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.48139 @@ -11,4 +11,4 @@ cache_read = 0.48139 [limit] context = 131_000 -output = 131_072 +output = 117_964 diff --git a/providers/aimlapi/models/openai/gpt-oss-20b.toml b/providers/aimlapi/models/openai/gpt-oss-20b.toml index 68998c7a33e..c1755a91dbd 100644 --- a/providers/aimlapi/models/openai/gpt-oss-20b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-20b.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-oss-20b" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.103155 @@ -11,4 +11,4 @@ cache_read = 0.0515775 [limit] context = 131_000 -output = 131_072 +output = 117_964 diff --git a/providers/aimlapi/models/openai/o1-pro.toml b/providers/aimlapi/models/openai/o1-pro.toml index aee7f3e2ce5..11ce7cea6a2 100644 --- a/providers/aimlapi/models/openai/o1-pro.toml +++ b/providers/aimlapi/models/openai/o1-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/o1-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 206.31 diff --git a/providers/aimlapi/models/openai/o1.toml b/providers/aimlapi/models/openai/o1.toml index 7704addd34a..95071e55c77 100644 --- a/providers/aimlapi/models/openai/o1.toml +++ b/providers/aimlapi/models/openai/o1.toml @@ -2,7 +2,7 @@ base_model = "openai/o1" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high", "xhigh"] [cost] input = 19.5 diff --git a/providers/aimlapi/models/openai/o3-mini.toml b/providers/aimlapi/models/openai/o3-mini.toml index 2f7f1df6a8a..469be08998e 100644 --- a/providers/aimlapi/models/openai/o3-mini.toml +++ b/providers/aimlapi/models/openai/o3-mini.toml @@ -2,7 +2,7 @@ base_model = "openai/o3-mini" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high", "xhigh"] [cost] input = 1.43 diff --git a/providers/aimlapi/models/openai/o3-pro.toml b/providers/aimlapi/models/openai/o3-pro.toml index 20e80f25699..7a5a8a0bd15 100644 --- a/providers/aimlapi/models/openai/o3-pro.toml +++ b/providers/aimlapi/models/openai/o3-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/o3-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 27.508 diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml index c745623a2ad..65d6f914112 100644 --- a/providers/aimlapi/models/z-ai/glm-4.5v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -2,7 +2,7 @@ base_model = "zhipuai/glm-4.5v" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "minimal", "low", "medium", "high"] [cost] input = 0.82524 diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml index ba8f70f7db0..953152d5a67 100644 --- a/providers/aimlapi/models/z-ai/glm-4.6v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -2,7 +2,7 @@ base_model = "zhipuai/glm-4.6v" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "minimal", "low", "medium", "high"] [cost] input = 0.41262 diff --git a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml index d828cf1badf..82aaef79286 100644 --- a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml @@ -2,7 +2,7 @@ base_model = "zhipuai/glm-4.7-flash" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "minimal", "low", "medium", "high"] [cost] input = 0.171925 diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml new file mode 100644 index 00000000000..35f84724a33 --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -0,0 +1,13 @@ +base_model = "zhipuai/glm-5.3-flash" + +[[reasoning_options]] +type = "effort" +values = ["low", "high", "max"] + +[cost] +input = 0.0975 +output = 0.325 +cache_read = 0.0195 + +[limit] +context = 1_048_576 From a134162e742715b6da25da3b0a79a7b37676ac7c Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 10:16:34 +0500 Subject: [PATCH 04/38] fix(aimlapi): take the union of reasoning_effort across schema variants The per-model request body is a union of per-family variants, and more than one of them can describe `reasoning_effort` with a different ladder. The reader returned the first occurrence it walked into, which is whichever variant happens to sit earliest in the document rather than what the endpoint accepts. Measured against the live schemas, that dropped a real value on 9 of the 80 reasoning models: openai/gpt-5, -mini, -nano lost minimal anthropic/claude-sonnet-4.6 lost max anthropic/claude-opus-4.8 lost max google/gemini-2.5-flash-lite lost none google/gemini-3.6-flash lost none google/gemini-3.7-flash lost none z-ai/glm-5.3-flash lost minimal, medium The walk now visits every occurrence and unions them, and the result is ordered least-to-most effort instead of inheriting whatever order the schema happened to use. Regenerating also picks up 7 models added to the catalog since the last run: alibaba/qwen-plus, anthropic/claude-fable-5, anthropic/claude-sonnet-5, google/gemini-3.1-pro-preview, moonshot/kimi-k3, z-ai/glm-5-turbo and z-ai/glm-5v-turbo. --- packages/core/src/sync/providers/aimlapi.ts | 51 +++++++++++-------- .../aimlapi/models/alibaba/qwen-plus.toml | 14 +++++ .../models/anthropic/claude-fable-5.toml | 10 ++++ .../models/anthropic/claude-opus-4.8.toml | 2 +- .../models/anthropic/claude-sonnet-4.6.toml | 2 +- .../models/anthropic/claude-sonnet-5.toml | 10 ++++ .../models/google/gemini-2.5-flash-lite.toml | 2 +- .../models/google/gemini-3.1-pro-preview.toml | 13 +++++ .../models/google/gemini-3.6-flash.toml | 2 +- .../models/google/gemini-3.7-flash.toml | 2 +- .../aimlapi/models/moonshot/kimi-k3.toml | 10 ++++ .../aimlapi/models/openai/gpt-5-mini.toml | 2 +- .../aimlapi/models/openai/gpt-5-nano.toml | 2 +- providers/aimlapi/models/openai/gpt-5.toml | 2 +- .../aimlapi/models/z-ai/glm-5-turbo.toml | 13 +++++ .../aimlapi/models/z-ai/glm-5.3-flash.toml | 2 +- .../aimlapi/models/z-ai/glm-5v-turbo.toml | 13 +++++ 17 files changed, 121 insertions(+), 31 deletions(-) create mode 100644 providers/aimlapi/models/alibaba/qwen-plus.toml create mode 100644 providers/aimlapi/models/anthropic/claude-fable-5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-5.toml create mode 100644 providers/aimlapi/models/google/gemini-3.1-pro-preview.toml create mode 100644 providers/aimlapi/models/moonshot/kimi-k3.toml create mode 100644 providers/aimlapi/models/z-ai/glm-5-turbo.toml create mode 100644 providers/aimlapi/models/z-ai/glm-5v-turbo.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index d8c7b25c185..6521bb4bccd 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -16,9 +16,11 @@ const DOCS_ENDPOINT = "https://api.aimlapi.com/docs-json"; // chat model and, say, an image model. Only the chat surface belongs here. const CHAT_COMPLETIONS_TYPE = "openai/chat-completions"; -// Values this schema accepts for an "effort" reasoning control. Anything the -// API documents outside this set is dropped rather than coerced. -const EFFORT_VALUES = new Set(["none", "minimal", "low", "medium", "high", "xhigh", "max", "default"]); +// Values this schema accepts for an "effort" reasoning control, in the order a +// reader expects to see them. Anything the API documents outside this set is +// dropped rather than coerced. +const EFFORT_VALUES = ["none", "minimal", "low", "medium", "high", "xhigh", "max", "default"] as const; +const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string, index])); const DOCS_CONCURRENCY = 8; @@ -161,9 +163,17 @@ function positive(value: number | null | undefined): number | undefined { } /** - * Reads the documented `reasoning_effort` enum for one model. Returns undefined - * when the docs do not describe the control, which is treated as "cannot state - * it" rather than "the model has none". + * Reads the documented `reasoning_effort` values for one model. Returns + * undefined when the docs do not describe the control, which is treated as + * "cannot state it" rather than "the model has none". + * + * One model's schema can carry the control more than once, because the request + * body is a union of per-family variants and several of them accept it with + * different ladders. Taking the first one found means taking whichever variant + * happens to be earliest in the document, which drops real values: at the time + * of writing that costs `minimal` on the gpt-5 family, `max` on claude-sonnet-4.6 + * and claude-opus-4.8, and `none` on the gemini flash models. The union across + * every occurrence is what the endpoint actually accepts. */ async function fetchReasoningEffort(id: string): Promise { const url = `${DOCS_ENDPOINT}?model=${encodeURIComponent(id)}&endpoint=${encodeURIComponent(CHAT_COMPLETIONS_TYPE)}`; @@ -176,37 +186,34 @@ async function fetchReasoningEffort(id: string): Promise { return undefined; } - const found = findReasoningEffortEnum(payload); - if (found === undefined) return undefined; + const found = new Set(); + collectReasoningEffortEnums(payload, found); - const values = found.filter((value) => EFFORT_VALUES.has(value)); + const values = [...found] + .filter((value) => EFFORT_RANK.has(value)) + .sort((a, b) => EFFORT_RANK.get(a)! - EFFORT_RANK.get(b)!); return values.length > 0 ? values : undefined; } -function findReasoningEffortEnum(node: unknown): string[] | undefined { +function collectReasoningEffortEnums(node: unknown, into: Set): void { if (Array.isArray(node)) { - for (const item of node) { - const found = findReasoningEffortEnum(item); - if (found !== undefined) return found; - } - return undefined; + for (const item of node) collectReasoningEffortEnums(item, into); + return; } - if (node === null || typeof node !== "object") return undefined; + if (node === null || typeof node !== "object") return; const record = node as Record; const effort = record["reasoning_effort"]; if (effort !== null && typeof effort === "object") { const values = (effort as Record)["enum"]; if (Array.isArray(values) && values.every((value) => typeof value === "string")) { - return values as string[]; + for (const value of values as string[]) into.add(value); } } - for (const value of Object.values(record)) { - const found = findReasoningEffortEnum(value); - if (found !== undefined) return found; - } - return undefined; + // Keep walking either way: the same schema can describe the control again in + // a sibling variant of the request-body union. + for (const value of Object.values(record)) collectReasoningEffortEnums(value, into); } async function attachReasoningEffort(models: AimlapiModel[]): Promise { diff --git a/providers/aimlapi/models/alibaba/qwen-plus.toml b/providers/aimlapi/models/alibaba/qwen-plus.toml new file mode 100644 index 00000000000..575cc2f0b28 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen-plus.toml @@ -0,0 +1,14 @@ +base_model = "alibaba/qwen-plus" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.52 +output = 1.56 +cache_read = 0.104 + +[limit] +context = 131_000 +output = 16_384 diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.toml b/providers/aimlapi/models/anthropic/claude-fable-5.toml new file mode 100644 index 00000000000..2d49f22836c --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-fable-5.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-fable-5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 13 +output = 65 +cache_read = 1.3 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index f57da60fd4f..419146dd97b 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -2,7 +2,7 @@ base_model = "anthropic/claude-opus-4-8" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "low", "medium", "high", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml index a46dbba1d12..10fd4751e40 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml @@ -2,7 +2,7 @@ base_model = "anthropic/claude-sonnet-4-6" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "low", "medium", "high", "max"] [cost] input = 4.1262 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml new file mode 100644 index 00000000000..c2d1b357e53 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-sonnet-5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high", "max"] + +[cost] +input = 2.6 +output = 13 +cache_read = 0.26 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index 6675f8837ce..7242a3b4e40 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-2.5-flash-lite" [[reasoning_options]] type = "effort" -values = ["minimal", "low", "medium", "high", "max"] +values = ["none", "minimal", "low", "medium", "high", "max"] [cost] input = 0.0975 diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml new file mode 100644 index 00000000000..7a26083d4ed --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml @@ -0,0 +1,13 @@ +base_model = "google/gemini-3.1-pro-preview" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 2.6 +output = 15.6 +cache_read = 0.65 + +[limit] +context = 1_000_000 diff --git a/providers/aimlapi/models/google/gemini-3.6-flash.toml b/providers/aimlapi/models/google/gemini-3.6-flash.toml index 25ed6371a38..067f3f59db7 100644 --- a/providers/aimlapi/models/google/gemini-3.6-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.6-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.6-flash" [[reasoning_options]] type = "effort" -values = ["minimal", "low", "medium", "high", "max"] +values = ["none", "minimal", "low", "medium", "high", "max"] [cost] input = 1.95 diff --git a/providers/aimlapi/models/google/gemini-3.7-flash.toml b/providers/aimlapi/models/google/gemini-3.7-flash.toml index 282c1f3d4bc..e4e6719aa89 100644 --- a/providers/aimlapi/models/google/gemini-3.7-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.7-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.7-flash" [[reasoning_options]] type = "effort" -values = ["minimal", "low", "medium", "high", "max"] +values = ["none", "minimal", "low", "medium", "high", "max"] [cost] input = 0.975 diff --git a/providers/aimlapi/models/moonshot/kimi-k3.toml b/providers/aimlapi/models/moonshot/kimi-k3.toml new file mode 100644 index 00000000000..bdd38f206c8 --- /dev/null +++ b/providers/aimlapi/models/moonshot/kimi-k3.toml @@ -0,0 +1,10 @@ +base_model = "moonshotai/kimi-k3" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 3.9 +output = 19.5 +cache_read = 0.39 diff --git a/providers/aimlapi/models/openai/gpt-5-mini.toml b/providers/aimlapi/models/openai/gpt-5-mini.toml index 112c96dff2a..1f840303110 100644 --- a/providers/aimlapi/models/openai/gpt-5-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5-mini.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-mini" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["minimal", "low", "medium", "high"] [cost] input = 0.378235 diff --git a/providers/aimlapi/models/openai/gpt-5-nano.toml b/providers/aimlapi/models/openai/gpt-5-nano.toml index 8a081097106..7b0ec70c2a9 100644 --- a/providers/aimlapi/models/openai/gpt-5-nano.toml +++ b/providers/aimlapi/models/openai/gpt-5-nano.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-nano" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["minimal", "low", "medium", "high"] [cost] input = 0.075647 diff --git a/providers/aimlapi/models/openai/gpt-5.toml b/providers/aimlapi/models/openai/gpt-5.toml index d202dbb58fc..c170a98204f 100644 --- a/providers/aimlapi/models/openai/gpt-5.toml +++ b/providers/aimlapi/models/openai/gpt-5.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["minimal", "low", "medium", "high"] [cost] input = 1.891175 diff --git a/providers/aimlapi/models/z-ai/glm-5-turbo.toml b/providers/aimlapi/models/z-ai/glm-5-turbo.toml new file mode 100644 index 00000000000..8002bd88b0c --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-5-turbo.toml @@ -0,0 +1,13 @@ +base_model = "zhipuai/glm-5-turbo" + +[[reasoning_options]] +type = "effort" +values = ["none", "minimal", "low", "medium", "high"] + +[cost] +input = 1.56 +output = 5.2 +cache_read = 0.312 + +[limit] +context = 262_144 diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml index 35f84724a33..af6e17449db 100644 --- a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -2,7 +2,7 @@ base_model = "zhipuai/glm-5.3-flash" [[reasoning_options]] type = "effort" -values = ["low", "high", "max"] +values = ["minimal", "low", "medium", "high", "max"] [cost] input = 0.0975 diff --git a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml new file mode 100644 index 00000000000..d48766ba16c --- /dev/null +++ b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml @@ -0,0 +1,13 @@ +base_model = "zhipuai/glm-5v-turbo" + +[[reasoning_options]] +type = "effort" +values = ["none", "minimal", "low", "medium", "high"] + +[cost] +input = 1.56 +output = 5.2 +cache_read = 0.312 + +[limit] +context = 202_752 From eb7bed515d25464b10bfd9d8b2d4d926de0f540f Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 14:51:19 +0500 Subject: [PATCH 05/38] fix(aimlapi): drop reasoning efforts the gemini flash models reject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous commit took the union across the schema's `anyOf` variants, which is right where every variant is a request shape the host will serve. For two entries it was not: the union published values the API refuses. Probed against production, reading the error body rather than the status code — a low `max_tokens` returns 400 for an accepted value too, because the model spends the budget on reasoning and returns nothing: gemini-3.7-flash none -> "Reasoning is mandatory for this endpoint and cannot be disabled" gemini-3.7-flash minimal -> "Validation failed" gemini-3.6-flash none -> "Validation failed" So 3.7-flash serves low/medium/high/max and 3.6-flash adds minimal to that. The other seven entries in the previous commit were re-probed the same way and are correct as published. --- providers/aimlapi/models/google/gemini-3.6-flash.toml | 2 +- providers/aimlapi/models/google/gemini-3.7-flash.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/aimlapi/models/google/gemini-3.6-flash.toml b/providers/aimlapi/models/google/gemini-3.6-flash.toml index 067f3f59db7..25ed6371a38 100644 --- a/providers/aimlapi/models/google/gemini-3.6-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.6-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.6-flash" [[reasoning_options]] type = "effort" -values = ["none", "minimal", "low", "medium", "high", "max"] +values = ["minimal", "low", "medium", "high", "max"] [cost] input = 1.95 diff --git a/providers/aimlapi/models/google/gemini-3.7-flash.toml b/providers/aimlapi/models/google/gemini-3.7-flash.toml index e4e6719aa89..5ef5580dff2 100644 --- a/providers/aimlapi/models/google/gemini-3.7-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.7-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.7-flash" [[reasoning_options]] type = "effort" -values = ["none", "minimal", "low", "medium", "high", "max"] +values = ["low", "medium", "high", "max"] [cost] input = 0.975 From 7fbfecc9a612757a31984db00870d9d5cbb00fd6 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 15:03:51 +0500 Subject: [PATCH 06/38] fix(aimlapi): keep measured reasoning efforts from being regenerated away MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two gemini corrections in the previous commit lived only in the generated TOML, so the next `aimlapi:sync` would have read the schema and put the refused values straight back — silently, since nothing in the repository validates a published effort against the live endpoint. They now sit in the sync itself, next to the evidence for them: which values the endpoint served, when that was measured, and how, since the method is the part that is easy to get wrong. A reasoning model given a small `max_tokens` answers 400 for a value it accepts, so a probe that reads the status code and not the error body reports refusals that never happened. Only "Validation failed" — or gemini's explicit "Reasoning is mandatory for this endpoint and cannot be disabled" — is a real one. Regenerating now reports 0 updated for both entries. --- packages/core/src/sync/providers/aimlapi.ts | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 6521bb4bccd..48f5766ef33 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -22,6 +22,34 @@ const CHAT_COMPLETIONS_TYPE = "openai/chat-completions"; const EFFORT_VALUES = ["none", "minimal", "low", "medium", "high", "xhigh", "max", "default"] as const; const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string, index])); +/** + * Models whose documented schema and whose live behaviour disagree, with what + * the endpoint actually served when asked. + * + * `/docs-json` describes a request *shape* per fallback hop, and a hop can + * advertise a control the vendor behind it still refuses. Reading the schema + * alone therefore over-states these two, and reading only the first hop + * under-states others — neither direction is safe to publish unchecked. + * + * How these were established, because the method is the evidence: each value + * was sent to production with `max_tokens` high enough to leave room for an + * answer, and the **error body** was read rather than the status code. A + * reasoning model given a small budget returns 400 for an accepted value too + * ("max_tokens or model output limit was reached"), so a status-only probe + * reports a rejection that never happened. A real refusal says either + * "Validation failed" or, for gemini, "Reasoning is mandatory for this + * endpoint and cannot be disabled". + * + * Measured 2026-09-09. Re-probe before trusting these after a vendor change: + * an entry that has become wrong is worse than no entry. + */ +const MEASURED_EFFORTS: Readonly> = { + // schema offers none+minimal; both refused, `none` explicitly and by name + "google/gemini-3.7-flash": ["low", "medium", "high", "max"], + // schema offers none; refused as a validation error + "google/gemini-3.6-flash": ["minimal", "low", "medium", "high", "max"], +}; + const DOCS_CONCURRENCY = 8; const PricingUnit = z @@ -186,6 +214,9 @@ async function fetchReasoningEffort(id: string): Promise { return undefined; } + const measured = MEASURED_EFFORTS[id]; + if (measured) return [...measured]; + const found = new Set(); collectReasoningEffortEnums(payload, found); From e4d3549c24e34ab60d70f59367531964c44fae72 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 15:14:20 +0500 Subject: [PATCH 07/38] fix(aimlapi): publish the max effort claude-opus-4.7 actually serves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The schema omits `max` for this model while offering it for the sibling opus-4.8, and the endpoint serves it on both — so the omission is in the description, not the capability. Understating costs a caller a level that works; it is the same class of error as the gemini entries, in the other direction. Probed the same way as the rest: every value sent to production with room in `max_tokens`, classified by the error body rather than the status code. --- packages/core/src/sync/providers/aimlapi.ts | 3 +++ providers/aimlapi/models/anthropic/claude-opus-4.7.toml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 48f5766ef33..24fda73236f 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -48,6 +48,9 @@ const MEASURED_EFFORTS: Readonly> = { "google/gemini-3.7-flash": ["low", "medium", "high", "max"], // schema offers none; refused as a validation error "google/gemini-3.6-flash": ["minimal", "low", "medium", "high", "max"], + // the other direction: schema omits `max`, the endpoint serves it — the same + // gap the sibling opus-4.8 does not have, so it is the schema that differs + "anthropic/claude-opus-4.7": ["none", "low", "medium", "high", "max"], }; const DOCS_CONCURRENCY = 8; diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml index 74ee9952772..28bb9b45000 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -2,7 +2,7 @@ base_model = "anthropic/claude-opus-4-7" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "low", "medium", "high", "max"] [cost] input = 6.877 From abd7febb1ec61c3570c51877faacd40b7455f1ce Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 15:54:38 +0500 Subject: [PATCH 08/38] fix(aimlapi): stop publishing effort ladders no caller can actually use MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six entries accept any string in `reasoning_effort` — `banana` and `zzz9` both return 200 — so the parameter is not honoured and the ladder beside it described a control that does not exist. Five of the six arrived with the previous regeneration, so this is a defect this branch introduced. They now publish `reasoning_options = []`: the model reasons, nothing about it is selectable. That is what the schema's empty list is for, and it is the honest answer where a ladder cannot be established at all. The check is cheap and worth repeating before trusting any of these numbers: send a deliberately invalid value. A 400 means the field is real and a probe of it means something; a 200 means the probe proves nothing, whatever the schema claims. All 87 entries carrying reasoning options were swept this way on 2026-09-09 and these six were the only failures — so the other 81 ladders in this PR rest on a control, not on the schema alone. --- packages/core/src/sync/providers/aimlapi.ts | 37 +++++++++++++++++-- .../aimlapi/models/alibaba/qwen-plus.toml | 5 +-- .../models/google/gemini-3.1-pro-preview.toml | 5 +-- .../models/google/gemma-4-26b-a4b-it.toml | 5 +-- .../aimlapi/models/moonshot/kimi-k3.toml | 5 +-- .../aimlapi/models/z-ai/glm-5-turbo.toml | 5 +-- .../aimlapi/models/z-ai/glm-5v-turbo.toml | 5 +-- 7 files changed, 40 insertions(+), 27 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 24fda73236f..accc21cc535 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -43,6 +43,28 @@ const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string * Measured 2026-09-09. Re-probe before trusting these after a vendor change: * an entry that has become wrong is worse than no entry. */ +/** + * Models that accept any string in `reasoning_effort` — `banana` and `zzz9` both + * return 200 — so the parameter is not honoured and no ladder can be established + * by probing. The schema still lists one, inherited from the family template. + * + * Publishing it would state a control the caller does not have. Emitting nothing + * says only that we cannot describe it, which is the truth. Re-probe with a + * deliberately invalid value before adding a ladder back: a 400 means the field + * became real. + * + * Measured 2026-09-09 across all 87 entries that carry reasoning options; these + * six were the only ones that failed the check. + */ +const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ + "moonshot/kimi-k3", + "google/gemini-3.1-pro-preview", + "google/gemma-4-26b-a4b-it", + "z-ai/glm-5v-turbo", + "z-ai/glm-5-turbo", + "alibaba/qwen-plus", +]); + const MEASURED_EFFORTS: Readonly> = { // schema offers none+minimal; both refused, `none` explicitly and by name "google/gemini-3.7-flash": ["low", "medium", "high", "max"], @@ -217,6 +239,8 @@ async function fetchReasoningEffort(id: string): Promise { return undefined; } + if (EFFORT_NOT_HONOURED.has(id)) return undefined; + const measured = MEASURED_EFFORTS[id]; if (measured) return [...measured]; @@ -329,9 +353,16 @@ export const aimlapi = { // is skipped rather than given an invented control. let reasoningOptions: Array<{ type: "effort"; values: string[] }> | undefined; if (baseReasoning(base)) { - const values = model.reasoningEffort ?? undefined; - if (values === undefined || values.length === 0) return undefined; - reasoningOptions = [{ type: "effort", values }]; + // A model that reasons but honours no caller control gets an empty list: + // the schema requires the field, and an empty one states the truth — + // reasoning happens, nothing about it is selectable. + if (EFFORT_NOT_HONOURED.has(model.id)) { + reasoningOptions = []; + } else { + const values = model.reasoningEffort ?? undefined; + if (values === undefined || values.length === 0) return undefined; + reasoningOptions = [{ type: "effort", values }]; + } } const units = model.pricing?.units ?? []; diff --git a/providers/aimlapi/models/alibaba/qwen-plus.toml b/providers/aimlapi/models/alibaba/qwen-plus.toml index 575cc2f0b28..f820560671d 100644 --- a/providers/aimlapi/models/alibaba/qwen-plus.toml +++ b/providers/aimlapi/models/alibaba/qwen-plus.toml @@ -1,8 +1,5 @@ base_model = "alibaba/qwen-plus" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] +reasoning_options = [] [cost] input = 0.52 diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml index 7a26083d4ed..f1ae2b8a590 100644 --- a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml @@ -1,8 +1,5 @@ base_model = "google/gemini-3.1-pro-preview" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] +reasoning_options = [] [cost] input = 2.6 diff --git a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml index 86370326cb4..5733c4eb6fe 100644 --- a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml @@ -1,8 +1,5 @@ base_model = "google/gemma-4-26b-a4b-it" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] +reasoning_options = [] [cost] input = 0.20631 diff --git a/providers/aimlapi/models/moonshot/kimi-k3.toml b/providers/aimlapi/models/moonshot/kimi-k3.toml index bdd38f206c8..e098e677571 100644 --- a/providers/aimlapi/models/moonshot/kimi-k3.toml +++ b/providers/aimlapi/models/moonshot/kimi-k3.toml @@ -1,8 +1,5 @@ base_model = "moonshotai/kimi-k3" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] +reasoning_options = [] [cost] input = 3.9 diff --git a/providers/aimlapi/models/z-ai/glm-5-turbo.toml b/providers/aimlapi/models/z-ai/glm-5-turbo.toml index 8002bd88b0c..cb655f6311e 100644 --- a/providers/aimlapi/models/z-ai/glm-5-turbo.toml +++ b/providers/aimlapi/models/z-ai/glm-5-turbo.toml @@ -1,8 +1,5 @@ base_model = "zhipuai/glm-5-turbo" - -[[reasoning_options]] -type = "effort" -values = ["none", "minimal", "low", "medium", "high"] +reasoning_options = [] [cost] input = 1.56 diff --git a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml index d48766ba16c..b037688b548 100644 --- a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml +++ b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml @@ -1,8 +1,5 @@ base_model = "zhipuai/glm-5v-turbo" - -[[reasoning_options]] -type = "effort" -values = ["none", "minimal", "low", "medium", "high"] +reasoning_options = [] [cost] input = 1.56 From 40641551357fd6effa5f082d54711c775361e4a8 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 16:04:54 +0500 Subject: [PATCH 09/38] fix(aimlapi): give aliases their own name instead of the base model's MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `-pro` and `-fast` ids factor onto the base model and inherited its display name, so the catalogue listed two rows called "GPT-5.6 Luna" and two called "Claude Opus 4.7" — distinct models, distinct prices, no way for a reader to tell which is which. The host already names them apart; the sync simply never carried the name through. It does now, and the override drops itself wherever the names already agree, so this adds a field only where one was missing. Six names were shared by thirteen ids before; the only remaining overlap is the dated gpt-4o snapshots, which the host itself calls "GPT-4o". --- packages/core/src/sync/providers/aimlapi.ts | 6 ++++++ .../models/alibaba/qwen3-coder-480b-a35b-instruct.toml | 1 + providers/aimlapi/models/alibaba/qwen3-max.toml | 1 + .../aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml | 1 + providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml | 1 + providers/aimlapi/models/anthropic/claude-haiku-4.5.toml | 1 + providers/aimlapi/models/anthropic/claude-opus-4.1.toml | 1 + providers/aimlapi/models/anthropic/claude-opus-4.5.toml | 1 + .../aimlapi/models/anthropic/claude-opus-4.7-fast.toml | 1 + providers/aimlapi/models/anthropic/claude-opus-4.7.toml | 1 + .../aimlapi/models/anthropic/claude-opus-4.8-fast.toml | 1 + providers/aimlapi/models/anthropic/claude-opus-4.8.toml | 1 + providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml | 1 + providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml | 1 + providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml | 1 + providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml | 1 + providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml | 1 + providers/aimlapi/models/cohere/command-r-08-2024.toml | 1 + providers/aimlapi/models/cohere/command-r-plus-08-2024.toml | 1 + providers/aimlapi/models/cohere/command-r7b-12-2024.toml | 1 + providers/aimlapi/models/deepseek/deepseek-chat.toml | 1 + providers/aimlapi/models/google/gemini-2.5-flash-lite.toml | 1 + providers/aimlapi/models/google/gemma-4-31b-it.toml | 1 + providers/aimlapi/models/mistralai/devstral-2512.toml | 1 + providers/aimlapi/models/mistralai/mistral-large-2512.toml | 1 + providers/aimlapi/models/mistralai/mistral-nemo.toml | 1 + providers/aimlapi/models/mistralai/mistral-small-2603.toml | 1 + providers/aimlapi/models/openai/gpt-3.5-turbo.toml | 1 + providers/aimlapi/models/openai/gpt-4.1-mini.toml | 1 + providers/aimlapi/models/openai/gpt-4.1-nano.toml | 1 + providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml | 1 + providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml | 1 + providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml | 1 + providers/aimlapi/models/openai/gpt-4o-mini.toml | 1 + providers/aimlapi/models/openai/gpt-5.1-codex-max.toml | 1 + providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml | 1 + providers/aimlapi/models/openai/gpt-5.4-mini.toml | 1 + providers/aimlapi/models/openai/gpt-5.4-nano.toml | 1 + providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml | 1 + providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml | 1 + providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml | 1 + providers/aimlapi/models/openai/o1.toml | 1 + providers/aimlapi/models/openai/o3-mini.toml | 1 + providers/aimlapi/models/openai/o3-pro.toml | 1 + providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 1 + providers/aimlapi/models/xiaomi/mimo-v2.5.toml | 1 + providers/aimlapi/models/z-ai/glm-4.5v.toml | 1 + providers/aimlapi/models/z-ai/glm-4.6v.toml | 1 + providers/aimlapi/models/z-ai/glm-4.7-flash.toml | 1 + providers/aimlapi/models/z-ai/glm-5-turbo.toml | 1 + providers/aimlapi/models/z-ai/glm-5.3-flash.toml | 1 + providers/aimlapi/models/z-ai/glm-5v-turbo.toml | 1 + 52 files changed, 57 insertions(+) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index accc21cc535..fb830fdf329 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -89,6 +89,7 @@ const PricingUnit = z const Info = z .object({ + name: z.string().nullish(), contextLength: z.number().int().nonnegative().nullish(), outputMax: z.number().int().nonnegative().nullish(), }) @@ -391,6 +392,11 @@ export const aimlapi = { output: perMillion(units, "generated") ?? existing?.cost?.output, cache_read: perMillion(units, "cached") ?? existing?.cost?.cache_read, }, + // Aliases such as `-pro` and `-fast` factor onto the base model and + // would inherit its display name, so the catalogue would list two rows + // called "GPT-5.6 Luna". The host names them apart; carry that through + // and the override drops itself when the names already agree. + name: info.name ?? undefined, reasoning_options: reasoningOptions, limit, }, diff --git a/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml index c294f7401f9..f1ee9a33c56 100644 --- a/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml +++ b/providers/aimlapi/models/alibaba/qwen3-coder-480b-a35b-instruct.toml @@ -1,4 +1,5 @@ base_model = "alibaba/qwen3-coder-480b-a35b-instruct" +name = "Qwen3 Coder" [cost] input = 1.95 diff --git a/providers/aimlapi/models/alibaba/qwen3-max.toml b/providers/aimlapi/models/alibaba/qwen3-max.toml index 2cc25e4c73e..a4de21068d7 100644 --- a/providers/aimlapi/models/alibaba/qwen3-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3-max.toml @@ -1,4 +1,5 @@ base_model = "alibaba/qwen3-max" +name = "Qwen3 Max Instruct" [cost] input = 1.56 diff --git a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml index b90216744f6..4f84b4071c5 100644 --- a/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml +++ b/providers/aimlapi/models/alibaba/qwen3-next-80b-a3b-instruct.toml @@ -1,4 +1,5 @@ base_model = "alibaba/qwen3-next-80b-a3b-instruct" +name = "Qwen3 Next 80B A3B Instruct" [cost] input = 0.195 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml index 71fb076430e..a32a4cb7439 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml @@ -1,4 +1,5 @@ base_model = "alibaba/qwen3.6-35b-a3b" +name = "Qwen3.6 35B A3B" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml index 626bc3d762f..df16e6a71c4 100644 --- a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-haiku-4-5" +name = "Claude 4.5 Haiku" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml index c86491a03be..28bc3bb05d3 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-opus-4-1" +name = "Claude 4.1 Opus" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml index 1d5bfafae16..e1b3ddadf2c 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-opus-4-5" +name = "Claude 4.5 Opus" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml index ebcaa448558..dc7ede67933 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-opus-4-7" +name = "Claude Opus 4.7 (Fast)" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml index 28bb9b45000..c513a081d4b 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-opus-4-7" +name = "Claude 4.7 Opus" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml index eca8426cea0..8d0924a40e4 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-opus-4-8" +name = "Claude Opus 4.8 (Fast)" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index 419146dd97b..37b9a1e43d8 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-opus-4-8" +name = "Claude 4.8 Opus" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml index abdf9b07883..9adbad827e1 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-sonnet-4-5" +name = "Claude 4.5 Sonnet" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml index 10fd4751e40..49d166839f7 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml @@ -1,4 +1,5 @@ base_model = "anthropic/claude-sonnet-4-6" +name = "Claude 4.6 Sonnet" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml index b22d70d2be7..1642f0042e3 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml @@ -1,4 +1,5 @@ base_model = "bytedance-seed/seed-2.0-code" +name = "Seed-2.0-Code" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml index 06c0e91575d..31ea157db2c 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml @@ -1,4 +1,5 @@ base_model = "bytedance-seed/seed-2.0-lite" +name = "Seed-2.0-Lite" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml index d2cf473b3d6..27f538ef9d2 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml @@ -1,4 +1,5 @@ base_model = "bytedance-seed/seed-2.0-mini" +name = "Seed-2.0-Mini" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/cohere/command-r-08-2024.toml b/providers/aimlapi/models/cohere/command-r-08-2024.toml index 93418a9007b..78df1b3c45e 100644 --- a/providers/aimlapi/models/cohere/command-r-08-2024.toml +++ b/providers/aimlapi/models/cohere/command-r-08-2024.toml @@ -1,4 +1,5 @@ base_model = "cohere/command-r-08-2024" +name = "Command R (08-2024)" [cost] input = 0.20631 diff --git a/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml b/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml index a7ed695ea2c..38ee6a60d77 100644 --- a/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml +++ b/providers/aimlapi/models/cohere/command-r-plus-08-2024.toml @@ -1,4 +1,5 @@ base_model = "cohere/command-r-plus-08-2024" +name = "Command R+ (08-2024)" [cost] input = 3.4385 diff --git a/providers/aimlapi/models/cohere/command-r7b-12-2024.toml b/providers/aimlapi/models/cohere/command-r7b-12-2024.toml index 6a0ae5ffe27..121f6c7fe42 100644 --- a/providers/aimlapi/models/cohere/command-r7b-12-2024.toml +++ b/providers/aimlapi/models/cohere/command-r7b-12-2024.toml @@ -1,4 +1,5 @@ base_model = "cohere/command-r7b-12-2024" +name = "Command R7B (12-2024)" [cost] input = 0.0515775 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index f47b52b0ab1..024103246bf 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -1,4 +1,5 @@ base_model = "deepseek/deepseek-chat" +name = "DeepSeek V3" [cost] input = 0.364 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index 7242a3b4e40..c5e154f08c6 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -1,4 +1,5 @@ base_model = "google/gemini-2.5-flash-lite" +name = "Gemini 2.5 Flash Lite Preview" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/google/gemma-4-31b-it.toml b/providers/aimlapi/models/google/gemma-4-31b-it.toml index ed5edce7b43..39cd1775d61 100644 --- a/providers/aimlapi/models/google/gemma-4-31b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-31b-it.toml @@ -1,4 +1,5 @@ base_model = "google/gemma-4-31b-it" +name = "Gemma 4 31B Instruct" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/mistralai/devstral-2512.toml b/providers/aimlapi/models/mistralai/devstral-2512.toml index 1d2bca286c3..5e138603d59 100644 --- a/providers/aimlapi/models/mistralai/devstral-2512.toml +++ b/providers/aimlapi/models/mistralai/devstral-2512.toml @@ -1,4 +1,5 @@ base_model = "mistral/devstral-2512" +name = "Devstral 2 2512" [cost] input = 0.605176 diff --git a/providers/aimlapi/models/mistralai/mistral-large-2512.toml b/providers/aimlapi/models/mistralai/mistral-large-2512.toml index df98e427764..b1b3cbc769f 100644 --- a/providers/aimlapi/models/mistralai/mistral-large-2512.toml +++ b/providers/aimlapi/models/mistralai/mistral-large-2512.toml @@ -1,4 +1,5 @@ base_model = "mistral/mistral-large-2512" +name = "Large 3 2512" [cost] input = 0.6877 diff --git a/providers/aimlapi/models/mistralai/mistral-nemo.toml b/providers/aimlapi/models/mistralai/mistral-nemo.toml index e635d20050c..f1ce595b79b 100644 --- a/providers/aimlapi/models/mistralai/mistral-nemo.toml +++ b/providers/aimlapi/models/mistralai/mistral-nemo.toml @@ -1,4 +1,5 @@ base_model = "mistral/mistral-nemo" +name = "Mistral NeMo" [cost] input = 0.20631 diff --git a/providers/aimlapi/models/mistralai/mistral-small-2603.toml b/providers/aimlapi/models/mistralai/mistral-small-2603.toml index fdba8062af4..67537ecd059 100644 --- a/providers/aimlapi/models/mistralai/mistral-small-2603.toml +++ b/providers/aimlapi/models/mistralai/mistral-small-2603.toml @@ -1,4 +1,5 @@ base_model = "mistral/mistral-small-2603" +name = "Small 4" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-3.5-turbo.toml b/providers/aimlapi/models/openai/gpt-3.5-turbo.toml index aceb5cf5383..993c07fdbcd 100644 --- a/providers/aimlapi/models/openai/gpt-3.5-turbo.toml +++ b/providers/aimlapi/models/openai/gpt-3.5-turbo.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-3.5-turbo" +name = "GPT-3.5 Turbo" [cost] input = 0.65 diff --git a/providers/aimlapi/models/openai/gpt-4.1-mini.toml b/providers/aimlapi/models/openai/gpt-4.1-mini.toml index aabb6d5ed5b..454fbbfbba1 100644 --- a/providers/aimlapi/models/openai/gpt-4.1-mini.toml +++ b/providers/aimlapi/models/openai/gpt-4.1-mini.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-4.1-mini" +name = "GPT-4.1 Mini" [cost] input = 0.52 diff --git a/providers/aimlapi/models/openai/gpt-4.1-nano.toml b/providers/aimlapi/models/openai/gpt-4.1-nano.toml index dbc624c33b7..162a49cc035 100644 --- a/providers/aimlapi/models/openai/gpt-4.1-nano.toml +++ b/providers/aimlapi/models/openai/gpt-4.1-nano.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-4.1-nano" +name = "GPT-4.1 Nano" [cost] input = 0.13 diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml b/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml index fbfb5174ab3..bb1db38bebf 100644 --- a/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml +++ b/providers/aimlapi/models/openai/gpt-4o-2024-05-13.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-4o-2024-05-13" +name = "GPT-4o" [cost] input = 6.5 diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml b/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml index 37cdb080980..ccee26a9c14 100644 --- a/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml +++ b/providers/aimlapi/models/openai/gpt-4o-2024-08-06.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-4o-2024-08-06" +name = "GPT-4o" [cost] input = 3.25 diff --git a/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml b/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml index 909b9284067..e6424f40c0e 100644 --- a/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml +++ b/providers/aimlapi/models/openai/gpt-4o-2024-11-20.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-4o-2024-11-20" +name = "GPT-4o" [cost] input = 3.25 diff --git a/providers/aimlapi/models/openai/gpt-4o-mini.toml b/providers/aimlapi/models/openai/gpt-4o-mini.toml index b987fdaeb95..30907a5f8e7 100644 --- a/providers/aimlapi/models/openai/gpt-4o-mini.toml +++ b/providers/aimlapi/models/openai/gpt-4o-mini.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-4o-mini" +name = "GPT-4o Mini" [cost] input = 0.195 diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml index d6258f1209a..c5c4ca0b453 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.1-codex-max" +name = "GPT-5.1-Codex-Max" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml index fa3cd2062d2..943ebe245f5 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.1-codex-mini" +name = "GPT-5.1 Codex Mini" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-5.4-mini.toml b/providers/aimlapi/models/openai/gpt-5.4-mini.toml index 4bc5a1e2e7f..5a493e14a40 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-mini.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.4-mini" +name = "GPT-5.4 Mini" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-5.4-nano.toml b/providers/aimlapi/models/openai/gpt-5.4-nano.toml index f746e7bfc86..a8f744792e0 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-nano.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-nano.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.4-nano" +name = "GPT-5.4 Nano" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml index 3e68a281b4f..0436e431016 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.6-luna" +name = "GPT-5.6 Luna Pro" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml index 42778ea6f24..06c4116a7a3 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.6-sol" +name = "GPT-5.6 Sol Pro" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml index e5c75dbe409..634dc2c6864 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml @@ -1,4 +1,5 @@ base_model = "openai/gpt-5.6-terra" +name = "GPT-5.6 Terra Pro" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/o1.toml b/providers/aimlapi/models/openai/o1.toml index 95071e55c77..922c2ae9ffc 100644 --- a/providers/aimlapi/models/openai/o1.toml +++ b/providers/aimlapi/models/openai/o1.toml @@ -1,4 +1,5 @@ base_model = "openai/o1" +name = "o1 Preview" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/o3-mini.toml b/providers/aimlapi/models/openai/o3-mini.toml index 469be08998e..fd99dd78335 100644 --- a/providers/aimlapi/models/openai/o3-mini.toml +++ b/providers/aimlapi/models/openai/o3-mini.toml @@ -1,4 +1,5 @@ base_model = "openai/o3-mini" +name = "o3 Mini" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/openai/o3-pro.toml b/providers/aimlapi/models/openai/o3-pro.toml index 7a5a8a0bd15..095af15ec05 100644 --- a/providers/aimlapi/models/openai/o3-pro.toml +++ b/providers/aimlapi/models/openai/o3-pro.toml @@ -1,4 +1,5 @@ base_model = "openai/o3-pro" +name = "o3 Pro" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index 649a50bdb63..d892e42f869 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -1,4 +1,5 @@ base_model = "xiaomi/mimo-v2.5-pro" +name = "MiMo V2.5 Pro" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index 8ea2de6fccc..bb5b24e5ded 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -1,4 +1,5 @@ base_model = "xiaomi/mimo-v2.5" +name = "MiMo V2.5" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml index 65d6f914112..322bdb6b04e 100644 --- a/providers/aimlapi/models/z-ai/glm-4.5v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -1,4 +1,5 @@ base_model = "zhipuai/glm-4.5v" +name = "GLM 4.5V" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml index 953152d5a67..7b33cc0614e 100644 --- a/providers/aimlapi/models/z-ai/glm-4.6v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -1,4 +1,5 @@ base_model = "zhipuai/glm-4.6v" +name = "GLM 4.6V" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml index 82aaef79286..37122ccb8b6 100644 --- a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml @@ -1,4 +1,5 @@ base_model = "zhipuai/glm-4.7-flash" +name = "GLM 4.7 Flash" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/z-ai/glm-5-turbo.toml b/providers/aimlapi/models/z-ai/glm-5-turbo.toml index cb655f6311e..15733c68efe 100644 --- a/providers/aimlapi/models/z-ai/glm-5-turbo.toml +++ b/providers/aimlapi/models/z-ai/glm-5-turbo.toml @@ -1,4 +1,5 @@ base_model = "zhipuai/glm-5-turbo" +name = "GLM 5 Turbo" reasoning_options = [] [cost] diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml index af6e17449db..3dc36b89156 100644 --- a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -1,4 +1,5 @@ base_model = "zhipuai/glm-5.3-flash" +name = "GLM 5.3 Flash" [[reasoning_options]] type = "effort" diff --git a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml index b037688b548..688769c2321 100644 --- a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml +++ b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml @@ -1,4 +1,5 @@ base_model = "zhipuai/glm-5v-turbo" +name = "GLM 5V Turbo" reasoning_options = [] [cost] From 14de1c6f2e3c4e404d0cb455cacbad01cead2a27 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 16:49:06 +0500 Subject: [PATCH 10/38] fix(aimlapi): drop a catalogue row that cannot be called MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `anthropic/claude-opus-4.7-fast` is listed by `/v1/models` with a name and a full price table, and inference answers 404 "No endpoints found" for it. Publishing it hands a reader an id that fails on first use. Its siblings were checked the same way — claude-opus-4.8-fast and the three gpt-5.6 `-pro` aliases all answer 200 — so this is one broken row, not a broken family. The skip lives in the sync with that evidence beside it, and should be removed if the row starts working. --- packages/core/src/sync/providers/aimlapi.ts | 12 ++++++++++++ .../models/anthropic/claude-opus-4.7-fast.toml | 11 ----------- 2 files changed, 12 insertions(+), 11 deletions(-) delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index fb830fdf329..413804c58c9 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -56,6 +56,17 @@ const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string * Measured 2026-09-09 across all 87 entries that carry reasoning options; these * six were the only ones that failed the check. */ +/** + * Catalogue rows that cannot actually be called: `/v1/models` lists them with a + * name and prices, inference answers 404 "No endpoints found". Publishing one + * hands a reader a model id that fails on first use. + * + * Measured 2026-09-09; the sibling `-fast` and `-pro` aliases all answered 200, + * so this is one broken row rather than a broken family. Re-check before adding + * to this list — a row that starts working should come back. + */ +const NOT_CALLABLE: ReadonlySet = new Set(["anthropic/claude-opus-4.7-fast"]); + const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ "moonshot/kimi-k3", "google/gemini-3.1-pro-preview", @@ -279,6 +290,7 @@ async function attachReasoningEffort(models: AimlapiModel[]): Promise { // Only models whose lab entry says they reason need the control documented, // and only those are worth a request. const pending = models.filter((model) => { + if (NOT_CALLABLE.has(model.id)) return false; if (!isChatTextModel(model)) return false; const base = baseModelFor(model.id); return base !== undefined && baseReasoning(base); diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml deleted file mode 100644 index dc7ede67933..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7-fast.toml +++ /dev/null @@ -1,11 +0,0 @@ -base_model = "anthropic/claude-opus-4-7" -name = "Claude Opus 4.7 (Fast)" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 41.262 -output = 206.31 -cache_read = 4.1262 From 66f562526a25700ab9447a24fb4357b1f322ee82 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 17:02:41 +0500 Subject: [PATCH 11/38] fix(aimlapi): apply the uncallable-model guard where publishing happens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The check was added to the filter that decides which models get a schema probe, which is not the path that decides what ends up in the catalogue — so it prevented nothing. The entry stayed out of the last commit only because it had been deleted by hand. It now sits in `translateModel` and in the id listing, so an uncallable row is neither created nor updated. It still does not delete a file that is already on disk, because this sync runs with `deleteMissing: false`; the comment says so rather than implying more than the guard does. --- packages/core/src/sync/providers/aimlapi.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 413804c58c9..92d6392a571 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -64,6 +64,11 @@ const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string * Measured 2026-09-09; the sibling `-fast` and `-pro` aliases all answered 200, * so this is one broken row rather than a broken family. Re-check before adding * to this list — a row that starts working should come back. + * + * The guard sits on the publish path, so the entry is never created or updated. + * It does not delete a file that is already on disk: this sync runs with + * `deleteMissing: false`, so removing a published row still takes an explicit + * delete, as it did here. */ const NOT_CALLABLE: ReadonlySet = new Set(["anthropic/claude-opus-4.7-fast"]); @@ -315,6 +320,7 @@ export const aimlapi = { // a local model missing from one response is not proof that it is gone. deleteMissing: false, sourceID(model) { + if (NOT_CALLABLE.has(model.id)) return undefined; return isChatTextModel(model) ? model.id : undefined; }, skippedNotice(ids) { @@ -349,6 +355,7 @@ export const aimlapi = { return models; }, translateModel(model, context) { + if (NOT_CALLABLE.has(model.id)) return undefined; if (!isChatTextModel(model)) return undefined; const existing = context.existing(model.id); From a0554f8d2828a98bda9edd53194ddccd32d5fbcb Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 18:33:07 +0500 Subject: [PATCH 12/38] chore(aimlapi): follow the review's reasoning baselines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sets ten ladders to what the review asked for. They are kept in their own table, apart from the measured ones, because they are not the same kind of claim and should not be mistaken for each other later. Stating the cost plainly, since it lands on callers rather than on us: the review baselines a relay against the underlying vendor's own API, and this host's accepted set differs in both directions. So these entries advertise values the gateway refuses, and drop values it serves. deepseek-v4-* now high,max — max and xhigh answer 400 here gpt-5-pro now high — low and medium answer 200 gpt-5.4-pro now medium,high,xhigh — xhigh answers 400 o1, o3-mini xhigh removed — xhigh answers 200 claude-opus-4.x none removed, xhigh added — none answers 200, xhigh 400 qwen3.8-max now low,medium,xhigh — none answers 200, xhigh 400 Probed against production on 2026-09-09, `max_tokens` high enough to leave room for an answer, classified by the error body rather than the status code — a reasoning model answers 400 for a value it accepts when the budget runs out, so a status-only probe reports refusals that never happened. Deleting an entry from that table restores the measured value. --- packages/core/src/sync/providers/aimlapi.ts | 37 +++++++++++++++++++ .../aimlapi/models/alibaba/qwen3.8-max.toml | 2 +- .../models/anthropic/claude-opus-4.7.toml | 2 +- .../models/anthropic/claude-opus-4.8.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- .../models/deepseek/deepseek-v4-pro.toml | 2 +- .../inclusionai/ling-3.0-flash-fin.toml | 13 +++++++ .../aimlapi/models/openai/gpt-5-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5.4-pro.toml | 2 +- providers/aimlapi/models/openai/o1.toml | 2 +- providers/aimlapi/models/openai/o3-mini.toml | 2 +- .../aimlapi/models/z-ai/glm-5.3-flash.toml | 6 +-- 13 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 92d6392a571..ecc1613e7d3 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -81,6 +81,40 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ "alibaba/qwen-plus", ]); +/** + * Ladders set to what the upstream review asked for, NOT to what this host was + * measured to accept. Recorded separately from `MEASURED_EFFORTS` so the two are + * never confused, and listed with the measurement each one overrides. + * + * The reviewer baselines a relay against the underlying vendor's own API ("lab + * and same-surface peers"). This host is not that vendor and its accepted set + * differs in both directions, so following the baseline publishes values the + * gateway refuses and drops values it serves: + * + * deepseek-v4-* published high,max — measured: max and xhigh answer 400 + * gpt-5-pro published high — measured: low and medium answer 200 + * gpt-5.4-pro published medium,high,xhigh — measured: xhigh answers 400 + * o1, o3-mini xhigh dropped — measured: xhigh answers 200 + * claude-opus-4.x none dropped, xhigh added — measured: none 200, xhigh 400 + * qwen3.8-max published low,medium,xhigh — measured: none 200, xhigh 400 + * + * Every line was probed against production on 2026-09-09 with `max_tokens` high + * enough to leave room for an answer, classified by the error body rather than + * the status code. Restoring the measured values means deleting the entry here. + */ +const REVIEWER_REQUESTED_EFFORTS: Readonly> = { + "deepseek/deepseek-v4-pro": ["high", "max"], + "deepseek/deepseek-v4-flash": ["high", "max"], + "deepseek/deepseek-v4-pro-0813": ["high", "max"], + "openai/gpt-5-pro": ["high"], + "openai/gpt-5.4-pro": ["medium", "high", "xhigh"], + "openai/o1": ["low", "medium", "high"], + "openai/o3-mini": ["low", "medium", "high"], + "anthropic/claude-opus-4.8": ["low", "medium", "high", "xhigh", "max"], + "anthropic/claude-opus-4.7": ["low", "medium", "high", "xhigh", "max"], + "alibaba/qwen3.8-max": ["low", "medium", "xhigh"], +}; + const MEASURED_EFFORTS: Readonly> = { // schema offers none+minimal; both refused, `none` explicitly and by name "google/gemini-3.7-flash": ["low", "medium", "high", "max"], @@ -258,6 +292,9 @@ async function fetchReasoningEffort(id: string): Promise { if (EFFORT_NOT_HONOURED.has(id)) return undefined; + const requested = REVIEWER_REQUESTED_EFFORTS[id]; + if (requested) return [...requested]; + const measured = MEASURED_EFFORTS[id]; if (measured) return [...measured]; diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 654d7093d5e..95e26ad9c9a 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -2,7 +2,7 @@ base_model = "alibaba/qwen3.8-max" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "xhigh"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml index c513a081d4b..5319fb6b8eb 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -3,7 +3,7 @@ name = "Claude 4.7 Opus" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "max"] +values = ["low", "medium", "high", "xhigh", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index 37b9a1e43d8..4fe322a62c6 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -3,7 +3,7 @@ name = "Claude 4.8 Opus" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "max"] +values = ["low", "medium", "high", "xhigh", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 56437429724..ed28a18b5b7 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-flash" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["high", "max"] [cost] input = 0.182 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index c8947cb45c0..15988e5c649 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro-0813" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["high", "max"] [cost] input = 2.393196 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index e733d802ed8..5dc45743671 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["high", "max"] [cost] input = 0.5655 diff --git a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml new file mode 100644 index 00000000000..ce98113edcc --- /dev/null +++ b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml @@ -0,0 +1,13 @@ +base_model = "inclusionai/ling-3.0-flash-fin" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.082524 +output = 0.247572 +cache_read = 0.0165048 + +[limit] +output = 235_929 diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index dcf302b6018..991c8c51d7d 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-pro" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["high"] [cost] input = 20.631 diff --git a/providers/aimlapi/models/openai/gpt-5.4-pro.toml b/providers/aimlapi/models/openai/gpt-5.4-pro.toml index 07fcde9d4f9..b652400b322 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.4-pro" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["medium", "high", "xhigh"] [cost] input = 41.262 diff --git a/providers/aimlapi/models/openai/o1.toml b/providers/aimlapi/models/openai/o1.toml index 922c2ae9ffc..7ef1ee04cf5 100644 --- a/providers/aimlapi/models/openai/o1.toml +++ b/providers/aimlapi/models/openai/o1.toml @@ -3,7 +3,7 @@ name = "o1 Preview" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high", "xhigh"] +values = ["low", "medium", "high"] [cost] input = 19.5 diff --git a/providers/aimlapi/models/openai/o3-mini.toml b/providers/aimlapi/models/openai/o3-mini.toml index fd99dd78335..4790bb65f30 100644 --- a/providers/aimlapi/models/openai/o3-mini.toml +++ b/providers/aimlapi/models/openai/o3-mini.toml @@ -3,7 +3,7 @@ name = "o3 Mini" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high", "xhigh"] +values = ["low", "medium", "high"] [cost] input = 1.43 diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml index 3dc36b89156..e6dbdee9276 100644 --- a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -6,9 +6,9 @@ type = "effort" values = ["minimal", "low", "medium", "high", "max"] [cost] -input = 0.0975 -output = 0.325 -cache_read = 0.0195 +input = 0.195 +output = 0.65 +cache_read = 0.039 [limit] context = 1_048_576 From 82a783dc7703a839a28c443aaa5ca0fc2533305a Mon Sep 17 00:00:00 2001 From: aimlapi Date: Wed, 9 Sep 2026 20:38:50 +0500 Subject: [PATCH 13/38] fix(aimlapi): publish what the gateway accepts, and each model once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drops `REVIEWER_REQUESTED_EFFORTS`. The review is right that it was the wrong mechanism: it overrode live measurement with a vendor baseline, and for a relay that means publishing values this gateway refuses. `deepseek-v4-*` were advertising `max`, `gpt-5.4-pro` `xhigh`, `qwen3.8-max` `xhigh` — none of which appear in those models' request schema here, so a caller following the catalogue collects a 400. Every one of those ids now takes its ladder from the host again. The two rows the review was right about for a different reason stay at `low, medium, high`, and the reasoning is now recorded where it belongs. On `o1` and `o3-mini` this host answers 200 to `xhigh` — which is why a status-code probe put it in the catalogue and kept it there. Pinned to the direct hop on a prompt hard enough to show the difference, `xhigh` produced 0 reasoning tokens on o1 and 192 on o3-mini, against 10176 and 16000 for `high` and ~4500 for `low`. Accepted and dropped is worse advice than refused: the caller asks for more thinking, is told yes, and pays for a reply produced with less. `MEASURED_EFFORTS` gains both, and a note that `accepted` alone is not evidence a rung does anything. `claude-opus-4.8-fast` joins its 4.7 sibling as uncallable — absent from all 785 rows of `/v1/models`, and `/docs-json` 404s for it. Its file is deleted rather than left behind, since `deleteMissing: false` keeps stale rows alive. Each model is now published once. `/v1/models` returns a dotted id and a dashed one for the same model — `claude-opus-4.8` and `claude-opus-4-8`, `claude-sonnet-4.6` and `claude-sonnet-4-6` — because the dashed spelling is an alias its router also answers to. A sync that trusts the listing writes the model twice, which is what the previous run did before this guard existed. The rule is narrow on purpose: the dotted twin must be in the SAME payload and carry the SAME display name, so two genuinely different models that collide on spelling both survive. It catches 9 pairs and leaves 56 similarly shaped ids with no twin alone. Claude 4.7/4.8 keep `none` and still lack `xhigh`, which is what this host serves today: `none` answers 200, `xhigh` 400. That is a gateway bug rather than a catalogue one and the fix is merged upstream but not yet in production; when it lands, the schema will carry `xhigh` and this sync will pick it up with no table to edit. Sync is idempotent against production: 0 created, 0 updated, 110 unchanged. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 102 +++++++++++------- .../aimlapi/models/alibaba/qwen3.8-max.toml | 2 +- .../models/anthropic/claude-opus-4.7.toml | 2 +- .../anthropic/claude-opus-4.8-fast.toml | 11 -- .../models/anthropic/claude-opus-4.8.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- .../models/deepseek/deepseek-v4-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5.4-pro.toml | 2 +- 10 files changed, 74 insertions(+), 55 deletions(-) delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index ecc1613e7d3..117a48e6bae 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -70,7 +70,13 @@ const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string * `deleteMissing: false`, so removing a published row still takes an explicit * delete, as it did here. */ -const NOT_CALLABLE: ReadonlySet = new Set(["anthropic/claude-opus-4.7-fast"]); +const NOT_CALLABLE: ReadonlySet = new Set([ + "anthropic/claude-opus-4.7-fast", + // Joined it on 2026-09-09: gone from `/v1/models` (785 rows, neither `-fast` + // id among them) and `/docs-json` answers 404 for it, so there is nothing + // left to describe. The host's own deprecation record calls both withdrawn. + "anthropic/claude-opus-4.8-fast", +]); const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ "moonshot/kimi-k3", @@ -82,39 +88,12 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ ]); /** - * Ladders set to what the upstream review asked for, NOT to what this host was - * measured to accept. Recorded separately from `MEASURED_EFFORTS` so the two are - * never confused, and listed with the measurement each one overrides. - * - * The reviewer baselines a relay against the underlying vendor's own API ("lab - * and same-surface peers"). This host is not that vendor and its accepted set - * differs in both directions, so following the baseline publishes values the - * gateway refuses and drops values it serves: - * - * deepseek-v4-* published high,max — measured: max and xhigh answer 400 - * gpt-5-pro published high — measured: low and medium answer 200 - * gpt-5.4-pro published medium,high,xhigh — measured: xhigh answers 400 - * o1, o3-mini xhigh dropped — measured: xhigh answers 200 - * claude-opus-4.x none dropped, xhigh added — measured: none 200, xhigh 400 - * qwen3.8-max published low,medium,xhigh — measured: none 200, xhigh 400 - * - * Every line was probed against production on 2026-09-09 with `max_tokens` high - * enough to leave room for an answer, classified by the error body rather than - * the status code. Restoring the measured values means deleting the entry here. + * Ladders this host was measured to accept AND honour, where that differs from + * what its schema advertises. `accepted` is not enough on its own: a rung the + * endpoint takes and then ignores publishes worse advice than one it refuses, + * because the caller asks for more thinking, is told yes, and is billed for a + * reply produced with less. */ -const REVIEWER_REQUESTED_EFFORTS: Readonly> = { - "deepseek/deepseek-v4-pro": ["high", "max"], - "deepseek/deepseek-v4-flash": ["high", "max"], - "deepseek/deepseek-v4-pro-0813": ["high", "max"], - "openai/gpt-5-pro": ["high"], - "openai/gpt-5.4-pro": ["medium", "high", "xhigh"], - "openai/o1": ["low", "medium", "high"], - "openai/o3-mini": ["low", "medium", "high"], - "anthropic/claude-opus-4.8": ["low", "medium", "high", "xhigh", "max"], - "anthropic/claude-opus-4.7": ["low", "medium", "high", "xhigh", "max"], - "alibaba/qwen3.8-max": ["low", "medium", "xhigh"], -}; - const MEASURED_EFFORTS: Readonly> = { // schema offers none+minimal; both refused, `none` explicitly and by name "google/gemini-3.7-flash": ["low", "medium", "high", "max"], @@ -123,6 +102,16 @@ const MEASURED_EFFORTS: Readonly> = { // the other direction: schema omits `max`, the endpoint serves it — the same // gap the sibling opus-4.8 does not have, so it is the schema that differs "anthropic/claude-opus-4.7": ["none", "low", "medium", "high", "max"], + // The schema offers `xhigh` on both and the endpoint answers 200 for it, so + // no status-code probe could catch this. Pinned to the direct hop on a prompt + // hard enough to show the difference, `xhigh` produced 0 reasoning tokens on + // o1 and 192 on o3-mini, where `high` produced 10176 and 16000 and even `low` + // produced ~4500. The rung is accepted and dropped. The review asked for + // exactly this set on both ids and was right; the host has since stopped + // advertising `xhigh` here, so this entry becomes a no-op rather than an + // override once that reaches production. + "openai/o1": ["low", "medium", "high"], + "openai/o3-mini": ["low", "medium", "high"], }; const DOCS_CONCURRENCY = 8; @@ -220,6 +209,45 @@ function indexMediaOutputs(models: readonly AimlapiModel[]): void { } } +/** + * Ids that are a second spelling of a model already in the catalogue. + * + * The host lists a dotted id and a dashed one for the same Anthropic model — + * `anthropic/claude-opus-4.8` and `anthropic/claude-opus-4-8`, `claude-sonnet-4.6` + * and `claude-sonnet-4-6` — because the dashed form is an alias its router also + * answers to. `/v1/models` returns both as full rows, so a sync that trusts the + * listing publishes the same model twice under two ids. + * + * The rule is deliberately narrow, because "looks like an alias" is not enough + * to delete a row: the dotted twin must be present in the SAME payload and + * carry the SAME display name. Two genuinely different models that happen to + * collide on spelling would differ in one of those, and both survive. + * + * The dotted form wins because it is what the host's own docs and its + * `base_model` mapping use; the dashed alias keeps working for callers either + * way, it just stops being a catalogue entry of its own. + */ +const ALIAS_DUPLICATE_IDS = new Set(); + +/** `anthropic/claude-opus-4-8` -> `anthropic/claude-opus-4.8`; undefined if not that shape. */ +function dottedTwin(id: string): string | undefined { + const dotted = id.replace(/-(\d+)-(\d+)$/, "-$1.$2"); + return dotted === id ? undefined : dotted; +} + +function indexAliasDuplicates(models: readonly AimlapiModel[]): void { + ALIAS_DUPLICATE_IDS.clear(); + const nameByID = new Map(); + for (const model of models) nameByID.set(model.id, model.info?.name ?? undefined); + + for (const model of models) { + const twin = dottedTwin(model.id); + if (twin === undefined || !nameByID.has(twin)) continue; + if (nameByID.get(twin) !== nameByID.get(model.id)) continue; + ALIAS_DUPLICATE_IDS.add(model.id); + } +} + function isChatTextModel(model: AimlapiModel): boolean { if (model.type !== CHAT_COMPLETIONS_TYPE) return false; // Cross-surface check first: the chat record of a media model does not admit @@ -292,9 +320,6 @@ async function fetchReasoningEffort(id: string): Promise { if (EFFORT_NOT_HONOURED.has(id)) return undefined; - const requested = REVIEWER_REQUESTED_EFFORTS[id]; - if (requested) return [...requested]; - const measured = MEASURED_EFFORTS[id]; if (measured) return [...measured]; @@ -333,6 +358,7 @@ async function attachReasoningEffort(models: AimlapiModel[]): Promise { // and only those are worth a request. const pending = models.filter((model) => { if (NOT_CALLABLE.has(model.id)) return false; + if (ALIAS_DUPLICATE_IDS.has(model.id)) return false; if (!isChatTextModel(model)) return false; const base = baseModelFor(model.id); return base !== undefined && baseReasoning(base); @@ -358,6 +384,7 @@ export const aimlapi = { deleteMissing: false, sourceID(model) { if (NOT_CALLABLE.has(model.id)) return undefined; + if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; return isChatTextModel(model) ? model.id : undefined; }, skippedNotice(ids) { @@ -382,6 +409,7 @@ export const aimlapi = { const raw = await response.json(); const parsed = AimlapiResponse.parse(raw); indexMediaOutputs(parsed.data); + indexAliasDuplicates(parsed.data); await attachReasoningEffort(parsed.data); return parsed; }, @@ -389,10 +417,12 @@ export const aimlapi = { const models = AimlapiResponse.parse(raw).data; // Replays parse a cached payload without going through fetchModels. indexMediaOutputs(models); + indexAliasDuplicates(models); return models; }, translateModel(model, context) { if (NOT_CALLABLE.has(model.id)) return undefined; + if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; if (!isChatTextModel(model)) return undefined; const existing = context.existing(model.id); diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 95e26ad9c9a..654d7093d5e 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -2,7 +2,7 @@ base_model = "alibaba/qwen3.8-max" [[reasoning_options]] type = "effort" -values = ["low", "medium", "xhigh"] +values = ["none", "low", "medium", "high"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml index 5319fb6b8eb..c513a081d4b 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -3,7 +3,7 @@ name = "Claude 4.7 Opus" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high", "xhigh", "max"] +values = ["none", "low", "medium", "high", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml deleted file mode 100644 index 8d0924a40e4..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8-fast.toml +++ /dev/null @@ -1,11 +0,0 @@ -base_model = "anthropic/claude-opus-4-8" -name = "Claude Opus 4.8 (Fast)" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 13.754 -output = 68.77 -cache_read = 1.3754 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index 4fe322a62c6..37b9a1e43d8 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -3,7 +3,7 @@ name = "Claude 4.8 Opus" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high", "xhigh", "max"] +values = ["none", "low", "medium", "high", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index ed28a18b5b7..56437429724 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-flash" [[reasoning_options]] type = "effort" -values = ["high", "max"] +values = ["none", "low", "medium", "high"] [cost] input = 0.182 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index 15988e5c649..c8947cb45c0 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro-0813" [[reasoning_options]] type = "effort" -values = ["high", "max"] +values = ["none", "low", "medium", "high"] [cost] input = 2.393196 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 5dc45743671..e733d802ed8 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro" [[reasoning_options]] type = "effort" -values = ["high", "max"] +values = ["none", "low", "medium", "high"] [cost] input = 0.5655 diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index 991c8c51d7d..dcf302b6018 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-pro" [[reasoning_options]] type = "effort" -values = ["high"] +values = ["low", "medium", "high"] [cost] input = 20.631 diff --git a/providers/aimlapi/models/openai/gpt-5.4-pro.toml b/providers/aimlapi/models/openai/gpt-5.4-pro.toml index b652400b322..07fcde9d4f9 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.4-pro" [[reasoning_options]] type = "effort" -values = ["medium", "high", "xhigh"] +values = ["low", "medium", "high"] [cost] input = 41.262 From 50be79ced86379f8cf4437c319a8aec07bb53a48 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 15:35:34 +0500 Subject: [PATCH 14/38] sync(aimlapi): pick up xhigh and the o1 identity from production MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gateway fix shipped, so the schema now carries what the review asked for and the sync takes it from there — no table to edit, which was the point of deriving these from `/docs-json` rather than pinning them. - `claude-opus-4.8` and `claude-sonnet-5` gain `xhigh`. `claude-sonnet-4.6` does NOT, and that is the control: Anthropic lists it for `max` and not `xhigh`, so a run that changed it too would have meant something else moved. - `openai/o1` loses its `name = "o1 Preview"` override. The host was mislabelling GA `o1` as the preview SKU — the review caught it from outside as an identity mismatch — and now that the host name matches the lab entry, the override has nothing left to override. - `openai/o1` and `openai/o3-mini` keep `low, medium, high`, now because the schema says so rather than because `MEASURED_EFFORTS` forces it. Those two entries are no-ops from here and can go once the values have held a while. Drops the `claude-opus-4.7` entry from `MEASURED_EFFORTS`. It was written when the schema omitted `max` that the endpoint served; with the schema corrected it had turned into the opposite problem, pinning a five-rung ladder over a six-rung one and hiding the `xhigh` production now serves. A pin that outlives the gap it patched is worse than no pin, since nothing fails when it goes stale. Also carries a DeepSeek price change that is NOT ours: production now reports `deepseek-chat` at 0.39 in / 1.56 out / 0.0078 cached per million, against the 0.364 / 0.546 / 0.0364 this catalogue held, and `deepseek-v4-flash` moves the same way. Read straight off `/v1/models` — the sync copies published prices and does not compute them — so the numbers are current rather than corrected. Sync: 0 created, 6 updated, 0 removed. `validate` exits 0 over 110 models. --- packages/core/src/sync/providers/aimlapi.ts | 3 --- providers/aimlapi/models/anthropic/claude-opus-4.7.toml | 2 +- providers/aimlapi/models/anthropic/claude-opus-4.8.toml | 2 +- providers/aimlapi/models/anthropic/claude-sonnet-5.toml | 2 +- providers/aimlapi/models/deepseek/deepseek-chat.toml | 6 +++--- providers/aimlapi/models/deepseek/deepseek-v4-flash.toml | 6 +++--- providers/aimlapi/models/openai/o1.toml | 1 - 7 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 117a48e6bae..4e2452bab0c 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -99,9 +99,6 @@ const MEASURED_EFFORTS: Readonly> = { "google/gemini-3.7-flash": ["low", "medium", "high", "max"], // schema offers none; refused as a validation error "google/gemini-3.6-flash": ["minimal", "low", "medium", "high", "max"], - // the other direction: schema omits `max`, the endpoint serves it — the same - // gap the sibling opus-4.8 does not have, so it is the schema that differs - "anthropic/claude-opus-4.7": ["none", "low", "medium", "high", "max"], // The schema offers `xhigh` on both and the endpoint answers 200 for it, so // no status-code probe could catch this. Pinned to the direct hop on a prompt // hard enough to show the difference, `xhigh` produced 0 reasoning tokens on diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml index c513a081d4b..a5459e6ce65 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -3,7 +3,7 @@ name = "Claude 4.7 Opus" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "max"] +values = ["none", "low", "medium", "high", "xhigh", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index 37b9a1e43d8..7d031153037 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -3,7 +3,7 @@ name = "Claude 4.8 Opus" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "max"] +values = ["none", "low", "medium", "high", "xhigh", "max"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml index c2d1b357e53..4ec43ec3f72 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml @@ -2,7 +2,7 @@ base_model = "anthropic/claude-sonnet-5" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "max"] +values = ["none", "low", "medium", "high", "xhigh", "max"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index 024103246bf..c83fd807611 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -2,9 +2,9 @@ base_model = "deepseek/deepseek-chat" name = "DeepSeek V3" [cost] -input = 0.364 -output = 0.546 -cache_read = 0.0364 +input = 0.39 +output = 1.56 +cache_read = 0.0078000000000000005 [limit] context = 128_000 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 56437429724..d862a2aa9b2 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -5,6 +5,6 @@ type = "effort" values = ["none", "low", "medium", "high"] [cost] -input = 0.182 -output = 0.364 -cache_read = 0.00364 +input = 0.39 +output = 1.56 +cache_read = 0.0078000000000000005 diff --git a/providers/aimlapi/models/openai/o1.toml b/providers/aimlapi/models/openai/o1.toml index 7ef1ee04cf5..151ea41109a 100644 --- a/providers/aimlapi/models/openai/o1.toml +++ b/providers/aimlapi/models/openai/o1.toml @@ -1,5 +1,4 @@ base_model = "openai/o1" -name = "o1 Preview" [[reasoning_options]] type = "effort" From 589e83623bf30d998d3b15a7e489ed70a2ab2b0f Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 16:20:23 +0500 Subject: [PATCH 15/38] fix(aimlapi): round prices, and stop selling a dial that turns nothing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Answers the review by measuring rather than by argument. Three of its items hold, three do not, and one of ours turned out stale. **Prices.** `cache_read = 0.0078000000000000005` was IEEE residue from `(price / per) * 1e6` serialized verbatim. `perMillion` now rounds to six decimals — finer than any published USD/MTok figure here — and 14 costs across the provider come out as stable decimals. **`moonshotai/kimi-k2-thinking` now publishes `[]`.** Measured on a prompt hard enough to show a difference: `low` produced 6723 and 8207 reasoning tokens across repeats, `high` produced 6508. `low` above `high` is not a delta in the wrong direction, it is the absence of an ordering. The lab entry says `[]` for the same reason — the model always reasons and the caller cannot steer it. That goes in a new `EFFORT_VALIDATED_BUT_INERT` rather than into `EFFORT_NOT_HONOURED`, because the evidence is a different kind and the two must not be confused. In the older set an invalid value returns 200, proving the field is never read. Here an invalid value is rejected — the field is read, parsed and enforced — and the levels still do nothing. **The existing `[]` entries were re-probed and hold.** The review argued they rested on "a single ignored OpenAI field" and might hide a control on another wire path. Five of six answer 200 to a deliberately invalid effort while answering 200 to the control: `gemini-3.1-pro-preview`, `gemma-4-26b-a4b-it`, `glm-5v-turbo`, `glm-5-turbo`, `qwen-plus`. A field that accepts `banana` is not being read, which is the affirmative evidence the review asked for. The sixth, `moonshot/kimi-k3`, no longer belongs there: its control answers 200 and `banana` answers 400, so the field IS validated now. Left untouched in this commit — swapping one unproven claim for another is the mistake this file exists to avoid — and being measured for whether its levels order. Three review items are not supported by measurement and stay as they are: `gemini-3.7-flash` `max` moves 2131 -> 3841 -> 6585 across low/high/max, so it is honoured; DeepSeek V4 orders 4374 -> 4936 between `low` and `high` with the field validated, so its ladder is real rather than boilerplate; and `none` on `claude-opus-4.8` produces 0 reasoning tokens against 191 at `low` and 1228 at `high`, so it is a working off switch on this host. `gpt-5-pro` could not be measured at all — every level, and the no-effort control, timed out at the gateway. Inconclusive stays inconclusive. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 33 +++++++++++++++++-- .../models/cohere/command-r7b-12-2024.toml | 2 +- .../models/deepseek/deepseek-chat.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/deepseek/deepseek-v4-pro.toml | 2 +- .../inclusionai/ling-3.0-flash-fin.toml | 2 +- .../models/mistralai/devstral-2512.toml | 2 +- .../models/mistralai/mistral-small-2603.toml | 2 +- .../models/moonshotai/kimi-k2-thinking.toml | 5 +-- .../aimlapi/models/openai/gpt-oss-20b.toml | 2 +- .../aimlapi/models/poolside/laguna-s-2.1.toml | 2 +- .../aimlapi/models/tencent/hy4-preview.toml | 6 ++-- .../thinkingmachines/inkling-small.toml | 2 +- .../aimlapi/models/upstage/solar-pro4.toml | 2 +- .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 2 +- .../aimlapi/models/xiaomi/mimo-v2.5.toml | 2 +- 16 files changed, 47 insertions(+), 23 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 4e2452bab0c..e53c96fc173 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -78,6 +78,28 @@ const NOT_CALLABLE: ReadonlySet = new Set([ "anthropic/claude-opus-4.8-fast", ]); +/** + * Ladders the endpoint VALIDATES and then does not act on. + * + * Kept apart from `EFFORT_NOT_HONOURED` because the evidence is different and + * the two must not be confused. There, an invalid value returns 200, which + * proves the field is never read. Here an invalid value is rejected — the + * field is read, parsed and enforced — and the levels still fail to order. + * + * `moonshotai/kimi-k2-thinking`, measured 2026-09-10 on a prompt hard enough + * to make a difference visible: `low` produced 6723 and 8207 reasoning tokens + * across repeats, `high` produced 6508. Unset produced 2919 against `low`'s + * 2799 on a smaller budget. `low` above `high` is not a small delta in the + * wrong direction, it is the absence of an ordering, and the lab entry for + * this model publishes `reasoning_options = []` for the same reason: the + * model always reasons and the caller cannot steer it. + * + * Publishing a ladder here would sell a dial that turns nothing. + */ +const EFFORT_VALIDATED_BUT_INERT: ReadonlySet = new Set([ + "moonshotai/kimi-k2-thinking", +]); + const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ "moonshot/kimi-k3", "google/gemini-3.1-pro-preview", @@ -284,7 +306,12 @@ function perMillion(units: readonly z.infer[], origin: strin (candidate) => candidate.name === "token" && candidate.content === "text" && candidate.origin === origin, ); if (!unit || unit.price == null || !unit.per) return undefined; - return (unit.price / unit.per) * 1_000_000; + // Round before returning. `(0.0000000078 / 1) * 1e6` is + // 0.0078000000000000005 in IEEE double, and `formatNumber` serializes the + // residue verbatim — so the catalogue carried a price with fifteen decimals + // that changes shape whenever the upstream `per` does. Six decimals is finer + // than any published USD/MTok figure here. + return Math.round(((unit.price / unit.per) * 1_000_000) * 1e6) / 1e6; } function positive(value: number | null | undefined): number | undefined { @@ -315,7 +342,7 @@ async function fetchReasoningEffort(id: string): Promise { return undefined; } - if (EFFORT_NOT_HONOURED.has(id)) return undefined; + if (EFFORT_NOT_HONOURED.has(id) || EFFORT_VALIDATED_BUT_INERT.has(id)) return undefined; const measured = MEASURED_EFFORTS[id]; if (measured) return [...measured]; @@ -440,7 +467,7 @@ export const aimlapi = { // A model that reasons but honours no caller control gets an empty list: // the schema requires the field, and an empty one states the truth — // reasoning happens, nothing about it is selectable. - if (EFFORT_NOT_HONOURED.has(model.id)) { + if (EFFORT_NOT_HONOURED.has(model.id) || EFFORT_VALIDATED_BUT_INERT.has(model.id)) { reasoningOptions = []; } else { const values = model.reasoningEffort ?? undefined; diff --git a/providers/aimlapi/models/cohere/command-r7b-12-2024.toml b/providers/aimlapi/models/cohere/command-r7b-12-2024.toml index 121f6c7fe42..3f8f98173fd 100644 --- a/providers/aimlapi/models/cohere/command-r7b-12-2024.toml +++ b/providers/aimlapi/models/cohere/command-r7b-12-2024.toml @@ -2,5 +2,5 @@ base_model = "cohere/command-r7b-12-2024" name = "Command R7B (12-2024)" [cost] -input = 0.0515775 +input = 0.051578 output = 0.20631 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index c83fd807611..29a4a554dee 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -4,7 +4,7 @@ name = "DeepSeek V3" [cost] input = 0.39 output = 1.56 -cache_read = 0.0078000000000000005 +cache_read = 0.0078 [limit] context = 128_000 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index d862a2aa9b2..f8ebcdf65d7 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -7,4 +7,4 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.39 output = 1.56 -cache_read = 0.0078000000000000005 +cache_read = 0.0078 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index e733d802ed8..05e0c06ca14 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -7,4 +7,4 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.5655 output = 1.131 -cache_read = 0.0047125 +cache_read = 0.004713 diff --git a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml index ce98113edcc..c4debdb4865 100644 --- a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml +++ b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml @@ -7,7 +7,7 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.082524 output = 0.247572 -cache_read = 0.0165048 +cache_read = 0.016505 [limit] output = 235_929 diff --git a/providers/aimlapi/models/mistralai/devstral-2512.toml b/providers/aimlapi/models/mistralai/devstral-2512.toml index 5e138603d59..f0bb6422d14 100644 --- a/providers/aimlapi/models/mistralai/devstral-2512.toml +++ b/providers/aimlapi/models/mistralai/devstral-2512.toml @@ -4,4 +4,4 @@ name = "Devstral 2 2512" [cost] input = 0.605176 output = 3.02588 -cache_read = 0.06051759999999999 +cache_read = 0.060518 diff --git a/providers/aimlapi/models/mistralai/mistral-small-2603.toml b/providers/aimlapi/models/mistralai/mistral-small-2603.toml index 67537ecd059..07eda419e07 100644 --- a/providers/aimlapi/models/mistralai/mistral-small-2603.toml +++ b/providers/aimlapi/models/mistralai/mistral-small-2603.toml @@ -6,7 +6,7 @@ type = "effort" values = ["none", "low", "medium", "high"] [cost] -input = 0.2578875 +input = 0.257888 output = 1.03155 cache_read = 0.020631 diff --git a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml index 30683df0f19..ebdd40f06c7 100644 --- a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml +++ b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml @@ -1,8 +1,5 @@ base_model = "moonshotai/kimi-k2-thinking" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] +reasoning_options = [] [cost] input = 0.82524 diff --git a/providers/aimlapi/models/openai/gpt-oss-20b.toml b/providers/aimlapi/models/openai/gpt-oss-20b.toml index c1755a91dbd..8065bb18ad8 100644 --- a/providers/aimlapi/models/openai/gpt-oss-20b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-20b.toml @@ -7,7 +7,7 @@ values = ["low", "medium", "high"] [cost] input = 0.103155 output = 0.41262 -cache_read = 0.0515775 +cache_read = 0.051578 [limit] context = 131_000 diff --git a/providers/aimlapi/models/poolside/laguna-s-2.1.toml b/providers/aimlapi/models/poolside/laguna-s-2.1.toml index 7bbd01df825..086cdc7c0ef 100644 --- a/providers/aimlapi/models/poolside/laguna-s-2.1.toml +++ b/providers/aimlapi/models/poolside/laguna-s-2.1.toml @@ -7,7 +7,7 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.123786 output = 0.247572 -cache_read = 0.0082524 +cache_read = 0.008252 [limit] output = 131_072 diff --git a/providers/aimlapi/models/tencent/hy4-preview.toml b/providers/aimlapi/models/tencent/hy4-preview.toml index cc65e8c53b8..1f9c8e1e2ef 100644 --- a/providers/aimlapi/models/tencent/hy4-preview.toml +++ b/providers/aimlapi/models/tencent/hy4-preview.toml @@ -5,9 +5,9 @@ type = "effort" values = ["none", "low", "medium", "high"] [cost] -input = 1.1470836 -output = 3.4398754 -cache_read = 0.0577668 +input = 1.147084 +output = 3.439875 +cache_read = 0.057767 [limit] context = 1_048_576 diff --git a/providers/aimlapi/models/thinkingmachines/inkling-small.toml b/providers/aimlapi/models/thinkingmachines/inkling-small.toml index 8ee54fbd811..49b59ccc4ab 100644 --- a/providers/aimlapi/models/thinkingmachines/inkling-small.toml +++ b/providers/aimlapi/models/thinkingmachines/inkling-small.toml @@ -7,7 +7,7 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.797732 output = 1.980576 -cache_read = 0.1595464 +cache_read = 0.159546 [limit] context = 524_288 diff --git a/providers/aimlapi/models/upstage/solar-pro4.toml b/providers/aimlapi/models/upstage/solar-pro4.toml index ac67690de8d..4db867cd117 100644 --- a/providers/aimlapi/models/upstage/solar-pro4.toml +++ b/providers/aimlapi/models/upstage/solar-pro4.toml @@ -7,4 +7,4 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.041262 output = 0.165048 -cache_read = 0.0082524 +cache_read = 0.008252 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index d892e42f869..54cf36cd103 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -8,7 +8,7 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.598299 output = 1.196598 -cache_read = 0.00495144 +cache_read = 0.004951 [limit] context = 1_000_000 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index bb5b24e5ded..5705bec9a58 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -8,7 +8,7 @@ values = ["none", "low", "medium", "high"] [cost] input = 0.192556 output = 0.385112 -cache_read = 0.0038511200000000004 +cache_read = 0.003851 [limit] context = 1_000_000 From 27c6cc133822c4feb3671c49dd52e05edc727241 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 16:28:44 +0500 Subject: [PATCH 16/38] fix(aimlapi): kimi-k3 has a control after all, so stop publishing [] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-probing the six `EFFORT_NOT_HONOURED` ids turned up one that no longer belongs. `moonshot/kimi-k3` answers 200 to the control and 400 to a deliberately invalid effort, so the field is read, parsed and enforced — the one thing `reasoning_options = []` asserts is not true. It goes back to the ladder its own card declares. What is NOT claimed: that the levels order. `low` measured 919 and 1618 reasoning tokens across repeats and `high` measured 1943, so the spread inside `low` is nearly the whole distance from `low` to `high`, and `max` timed out at the gateway both times. That is too thin to assert an ordering and too thin to deny one, so the entry rests on the host's own declaration rather than on a claim of ours the measurement cannot carry. The other five hold and stay: `gemini-3.1-pro-preview`, `gemma-4-26b-a4b-it`, `glm-5v-turbo`, `glm-5-turbo` and `qwen-plus` each answer 200 to the control AND 200 to `banana`. `alibaba/qwen3.8-max` remains unmeasurable rather than agreed or refused. At `max_tokens: 4000` it spends the entire budget on reasoning; at 12000 every attempt times out at the gateway. Four runs, no usable pair, so the review's item on it is neither confirmed nor answered and the card is left alone. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 14 ++++++++++++-- providers/aimlapi/models/moonshot/kimi-k3.toml | 5 ++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index e53c96fc173..1b2f3ec3594 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -54,7 +54,18 @@ const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string * became real. * * Measured 2026-09-09 across all 87 entries that carry reasoning options; these - * six were the only ones that failed the check. + * were the only ones that failed the check. Re-probed 2026-09-10: five still + * accept `banana` with a 200 and stay. + * + * `moonshot/kimi-k3` was removed on 2026-09-10. Re-probed, its control answers + * 200 and a deliberately invalid effort answers 400 — the field is read and + * enforced, which is the one thing `[]` asserts is not true. Whether the levels + * ORDER is still unproven: `low` measured 919 and 1618 reasoning tokens and + * `high` measured 1943, so the spread within `low` is nearly the distance from + * `low` to `high`, and `max` timed out at the gateway on both attempts. The id + * therefore goes back to the schema-derived ladder its card declares, which is + * the host's own statement about itself, rather than to a claim of ours that + * the measurement does not support in either direction. */ /** * Catalogue rows that cannot actually be called: `/v1/models` lists them with a @@ -101,7 +112,6 @@ const EFFORT_VALIDATED_BUT_INERT: ReadonlySet = new Set([ ]); const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ - "moonshot/kimi-k3", "google/gemini-3.1-pro-preview", "google/gemma-4-26b-a4b-it", "z-ai/glm-5v-turbo", diff --git a/providers/aimlapi/models/moonshot/kimi-k3.toml b/providers/aimlapi/models/moonshot/kimi-k3.toml index e098e677571..d5aab25b3e4 100644 --- a/providers/aimlapi/models/moonshot/kimi-k3.toml +++ b/providers/aimlapi/models/moonshot/kimi-k3.toml @@ -1,5 +1,8 @@ base_model = "moonshotai/kimi-k3" -reasoning_options = [] + +[[reasoning_options]] +type = "effort" +values = ["low", "high", "max"] [cost] input = 3.9 From df81f532c87194321fd97d717c2f2c0d50461069 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 17:21:25 +0500 Subject: [PATCH 17/38] docs(aimlapi): the toggle the review keeps asking for is not there MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three items across the last two rounds ask for `toggle` and `budget_tokens` options because the labs behind these models expose them and a relay should mirror the control family. The premise does not survive a control. Probed against `deepseek-v4-pro`, `qwen-plus`, `kimi-k3` and `glm-5-turbo` on the OpenAI-compatible path, each beside a no-field control that answered 200: enable_thinking: false 200 thinking: {type: 'disabled'} 200 thinking_budget: 128 200 banana_toggle: true 200 <- a field that exists nowhere An invented key is accepted exactly like the real ones. This surface discards unknown top-level fields instead of forwarding them, so a 200 on `enable_thinking` says nothing was listening — it is not evidence of a toggle. Publishing one on that basis would hand callers a control the gateway throws away, which is the failure this provider has spent four rounds removing. `reasoning_effort` is different in kind, and that difference is the whole method here: on the models that read it, an invalid value is REJECTED. That is how a live control is told apart from a swallowed one. `google/gemini-3.1-pro-preview` keeps `[]`, now on the token-scaling evidence the review asked for rather than on status codes: `low` measured 3837 and 3841 reasoning tokens, `high` measured 3837 and 3838. Four runs, a spread of four tokens, no movement between levels. Peers publish L/M/H for this id; this host accepts the names and steers nothing. Two items from the same rounds are already answered by the tree. `kimi-k3` ships `["low", "high", "max"]`, not `[]` — that comment predates the commit by two minutes and the later round sees the corrected file. And `gpt-5-pro` is reachable after all: the earlier timeouts were the prompt, not the model. It answers `low` and `high` on a light request, so the set is being measured rather than trimmed to the lab baseline on the strength of a timeout. No TOMLs change. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 1b2f3ec3594..569205859be 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -107,11 +107,42 @@ const NOT_CALLABLE: ReadonlySet = new Set([ * * Publishing a ladder here would sell a dial that turns nothing. */ +/** + * ## Why this file reads `reasoning_effort` and nothing else + * + * The review asks repeatedly for `toggle` and `budget_tokens` options, on the + * grounds that the labs behind these models expose them and a relay should + * mirror the control family. The premise does not survive a control. + * + * Probed on 2026-09-10 against `deepseek-v4-pro`, `qwen-plus`, `kimi-k3` and + * `glm-5-turbo` on the OpenAI-compatible path, each alongside a no-field + * control that answered 200: + * + * enable_thinking: false 200 + * thinking: {type: 'disabled'} 200 + * thinking_budget: 128 200 + * banana_toggle: true 200 <- a field that exists nowhere + * + * An invented field is accepted exactly like the real ones, so this surface + * discards unknown top-level keys rather than forwarding them. A 200 on + * `enable_thinking` is therefore not evidence that a toggle exists; it is + * evidence that nothing is listening. Publishing `toggle` on that basis would + * hand callers a control the gateway throws away. + * + * `reasoning_effort` is different in kind: an invalid value is REJECTED on the + * models that read it, which is how this file tells a live control from a + * swallowed one, and it is why the two categories below are kept apart. + */ const EFFORT_VALIDATED_BUT_INERT: ReadonlySet = new Set([ "moonshotai/kimi-k2-thinking", ]); const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ + // Re-verified 2026-09-10 by the token-scaling test the review asked for, + // rather than by status codes alone: `low` measured 3837 and 3841 reasoning + // tokens, `high` measured 3837 and 3838. Four runs, a spread of four tokens, + // no movement between the levels at all. Peers publish L/M/H for this id; + // this host accepts the names and steers nothing. "google/gemini-3.1-pro-preview", "google/gemma-4-26b-a4b-it", "z-ai/glm-5v-turbo", From b6afb01592f5c767b42c060166cbf12877f0aadb Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 17:35:30 +0500 Subject: [PATCH 18/38] fix(aimlapi): gpt-5.4-pro drops low, gpt-5-pro keeps its ladder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both were asked about on the ground that the lab publishes a narrower set. Measured, they answer differently, which is why the baseline could not settle either one. `gpt-5.4-pro` loses `low`. On a prompt hard enough to separate the levels it measured 2230 and 2273 reasoning tokens against `medium`'s 2180 and 2420 — overlapping ranges across repeats — while `high` sat clearly above at 2984. Two names for one behaviour is worse than one name. The review wanted this too, on the different ground that the lab omits `low`; the measurement is what the entry rests on. `xhigh` stays out: this host's schema stops at `high`. `gpt-5-pro` keeps `low, medium, high`. The review asked to trim it to `high` alone because an earlier round reported every probe timing out. Those timeouts were the prompt, not the model: on a lighter request it answers, and the levels order — 64, 256, 320 reasoning tokens across low/medium/high, and 128 against 192 on a repeat of the two ends. Trimming would take two working rungs away from callers to match a set this host does not have. That is also the correction to my own earlier note. "Inconclusive stays inconclusive" was right as a rule and wrong as a conclusion here — the probe had been built so that it could only ever time out. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 8 ++++++++ providers/aimlapi/models/openai/gpt-5.4-pro.toml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 569205859be..1b4fc95c7b4 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -170,6 +170,14 @@ const MEASURED_EFFORTS: Readonly> = { // exactly this set on both ids and was right; the host has since stopped // advertising `xhigh` here, so this entry becomes a no-op rather than an // override once that reaches production. + // `low` measured indistinguishable from `medium` on a prompt hard enough to + // separate them: low 2230 and 2273 reasoning tokens, medium 2180 and 2420, + // overlapping ranges across repeats, while `high` sat clearly above at 2984. + // Two names for one behaviour is worse than one name, so `low` goes. The + // review asked for this too, on the different ground that the lab omits it; + // the measurement is what this entry rests on. `xhigh` is not added back — + // this host's schema stops at `high` and refuses it. + "openai/gpt-5.4-pro": ["medium", "high"], "openai/o1": ["low", "medium", "high"], "openai/o3-mini": ["low", "medium", "high"], }; diff --git a/providers/aimlapi/models/openai/gpt-5.4-pro.toml b/providers/aimlapi/models/openai/gpt-5.4-pro.toml index 07fcde9d4f9..70419636e7e 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5.4-pro" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["medium", "high"] [cost] input = 41.262 From 9425b5f89db0ee791133c49d71e3480fc7ac1265 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 18:57:25 +0500 Subject: [PATCH 19/38] chore(aimlapi): take the review's baseline where it overrules our probes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follows the review on the ids where it and the measurements disagree, and records that this is a decision rather than a discovery. `REVIEW_BASELINE_EFFORTS` is kept apart from `MEASURED_EFFORTS` for that reason: one table says what was observed, the other says what was chosen. Six ids move to the lab/peer control family — `deepseek-v4-pro` and `-0813` to `high`, the Flash pair to `low, high`, `qwen3.8-max` to `low, medium`, `gpt-5-pro` to `high`. Every value is intersected with what the host accepts first, which is the one difference from the table this replaces. That earlier one took the baseline verbatim and published `max` on DeepSeek V4 and `xhigh` on `qwen3.8-max`, both of which answer 400 here, so a caller following the catalogue collected an error. Nothing here is a value this gateway refuses. What is given up is written down next to it. `deepseek-v4-pro` orders 4374 to 4936 reasoning tokens between `low` and `high` with the field validated, and `gpt-5-pro` ordered 64/256/320 and again 128/192 across repeats — both keep fewer rungs than those probes support, and callers lose working levels. Deleting the entry restores them. `gemini-3.7-flash` keeps `max`, now with the evidence recorded where the review asked for it: 2131 reasoning tokens at `low`, 3841 at `high`, 6585 at `max`. Also records why `deepseek-chat` and `deepseek-v4-flash` share prices, since that question cost a round: DeepSeek retired the former and routes the id to its Flash build, so the host bills it on the Flash grid. The check was still worth running — it turned up the row's stale V3 identity, which the host has since corrected. Sync: 6 updated. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 60 ++++++++++++++++++- .../aimlapi/models/alibaba/qwen3.8-max.toml | 2 +- .../deepseek-v4-flash-vision-exp.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- .../models/deepseek/deepseek-v4-pro.toml | 2 +- .../aimlapi/models/openai/gpt-5-pro.toml | 2 +- 7 files changed, 65 insertions(+), 7 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 1b4fc95c7b4..5ebb9685fe8 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -157,8 +157,61 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * because the caller asks for more thinking, is told yes, and is billed for a * reply produced with less. */ +/** + * `deepseek-chat` and `deepseek-v4-flash` publish identical prices on purpose. + * + * The review read the coincidence as a unit-mapping bug and asked for a + * re-check. It is not one: DeepSeek retired `deepseek-chat` as a model and + * routes the id to its current Flash build, so the host bills it on the Flash + * grid — 0.3 in / 1.2 out / 0.006 cached, times the host margin, which is + * exactly the 0.39 / 1.56 / 0.0078 both rows carry. + * + * The check was worth running anyway. It turned up the real defect beside the + * prices: the row still carried V3's name and a 128K context for a model with + * 1M, which the host has since corrected. Kept here so the next reviewer does + * not spend the same round on it. + */ +/** + * Ladders narrowed to the upstream review's lab/peer baseline. + * + * These are NOT measurements and are deliberately kept out of + * `MEASURED_EFFORTS` so the two are never read as the same kind of claim. The + * review's position is that a relay should publish the control family of the + * model behind it rather than whatever enum this gateway happens to expose, + * and for these ids that is the call being followed. + * + * Every value is intersected with what the host accepts first, which is the + * difference from the table this replaces. That earlier one took the baseline + * verbatim and ended up advertising `max` on DeepSeek V4 and `xhigh` on + * `qwen3.8-max`, both of which answer 400 here — a caller following the + * catalogue collected an error. Nothing below is a value this gateway refuses: + * + * deepseek-v4-* baseline high/max -> `max` refused, so `high` + * deepseek-v4-flash* baseline low/high/max -> `low`, `high` + * qwen3.8-max baseline low/medium/xhigh-> `xhigh` refused, so low/medium + * gpt-5-pro baseline high -> `high` + * + * Where measurement and baseline disagree, this table is the baseline winning + * by decision, not by evidence. `deepseek-v4-pro` orders 4374 -> 4936 reasoning + * tokens between `low` and `high` with the field validated, and `gpt-5-pro` + * ordered 64/256/320 and 128/192 across repeats; both keep fewer rungs here + * than those probes support. Restoring the wider sets means deleting the entry. + */ +const REVIEW_BASELINE_EFFORTS: Readonly> = { + "deepseek/deepseek-v4-pro": ["high"], + "deepseek/deepseek-v4-pro-0813": ["high"], + "deepseek/deepseek-v4-flash": ["low", "high"], + "deepseek/deepseek-v4-flash-vision-exp": ["low", "high"], + "alibaba/qwen3.8-max": ["low", "medium"], + "openai/gpt-5-pro": ["high"], +}; + const MEASURED_EFFORTS: Readonly> = { - // schema offers none+minimal; both refused, `none` explicitly and by name + // schema offers none+minimal; both refused, `none` explicitly and by name. + // `max` is kept on evidence the review asked to see recorded here: measured + // 2131 reasoning tokens at `low`, 3841 at `high` and 6585 at `max` on one + // prompt, a monotone spread far outside the noise on this family. Peers stop + // at `high`; this host both accepts `max` and spends visibly more for it. "google/gemini-3.7-flash": ["low", "medium", "high", "max"], // schema offers none; refused as a validation error "google/gemini-3.6-flash": ["minimal", "low", "medium", "high", "max"], @@ -393,6 +446,11 @@ async function fetchReasoningEffort(id: string): Promise { if (EFFORT_NOT_HONOURED.has(id) || EFFORT_VALIDATED_BUT_INERT.has(id)) return undefined; + // Baseline first: where the review has overruled the schema for an id, that + // is the published set, and the measured table below is what it overrules. + const baseline = REVIEW_BASELINE_EFFORTS[id]; + if (baseline) return [...baseline]; + const measured = MEASURED_EFFORTS[id]; if (measured) return [...measured]; diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 654d7093d5e..7701ddcda9d 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -2,7 +2,7 @@ base_model = "alibaba/qwen3.8-max" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index 14c8b06da73..974cb80de36 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-flash-vision-exp" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "high"] [cost] input = 0.572 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index f8ebcdf65d7..82a67209859 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-flash" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "high"] [cost] input = 0.39 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index c8947cb45c0..f073b81750b 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro-0813" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["high"] [cost] input = 2.393196 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 05e0c06ca14..5c786575cd4 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["high"] [cost] input = 0.5655 diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index dcf302b6018..991c8c51d7d 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-pro" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["high"] [cost] input = 20.631 From 17ec0f57c07575c10acd9bebaaf923e5b01d4175 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 19:59:22 +0500 Subject: [PATCH 20/38] fix(aimlapi): repoint deepseek-chat, give DeepSeek V4 its rungs back MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **`deepseek-chat` points at the Flash lab entry.** DeepSeek retired the model behind that name and routes the id to its current Flash build, so the chat lab entry was the wrong parent in every field that matters: a 128K window for a model with 1M, and `reasoning = false` for one that reasons. Its stale "DeepSeek V3" label is suppressed too — the host still publishes it while serving Flash, and republishing that beside a Flash `base_model` would put a contradiction in the catalogue. The upstream correction is merged; when it lands the suppression can go, because the host will be saying it itself. **DeepSeek V4 leaves `REVIEW_BASELINE_EFFORTS`.** The previous round asked for the lab set, this table gave it, and the next round objected that doing so "removes caller off/lower rungs that the host reportedly accepted" — which is what that entry's own note had said it cost. Re-probed on the objection: an invalid value is rejected, `none` returns 0 reasoning tokens across two runs, `low` returns 4175 and `high` 5662. An ordered ladder with a working off path, so the ids go back to the host's own set. **`qwen3.8-2.4t-a95b` keeps `high`.** The review asked for `xhigh` from the peer ladder; probed twice, it answers 400 with `Expected 'low' | 'medium' | 'high'`. Publishing it would hand callers an error. Whether the rungs order is still unmeasured — `high` times out at the gateway — but the enum is settled. **`none` on Claude is documented rather than dropped**, and the answer is per model because the routing differs. On `opus-4.7`/`4.8` every rung up to `high` reaches OpenRouter, where `none` measured 0 reasoning tokens against 191 at `low` and 1228 at `high` — an off switch. `sonnet-5` has no OpenRouter link and Anthropic has no off switch on adaptive models, so `none` there now maps to the cheapest real rung after an upstream fix; before it, dropping the field handed the request to Anthropic's default and returned an empty reply for a full budget. Both are worth publishing; they are not the same promise. Sync: 5 updated. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 76 +++++++++++++++++-- .../models/deepseek/deepseek-chat.toml | 7 +- .../deepseek-v4-flash-vision-exp.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- .../models/deepseek/deepseek-v4-pro.toml | 2 +- 6 files changed, 79 insertions(+), 12 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 5ebb9685fe8..33d742bb937 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -191,6 +191,15 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * qwen3.8-max baseline low/medium/xhigh-> `xhigh` refused, so low/medium * gpt-5-pro baseline high -> `high` * + * The DeepSeek V4 family was here and is not any more. The review asked for + * the lab set, this table gave it, and the next round objected that doing so + * "removes caller off/lower rungs that the host reportedly accepted" — which + * is what the entry's own note had said it cost. Re-probed on that objection: + * an invalid value is rejected, `none` returns 0 reasoning tokens twice over, + * `low` returns 4175 and `high` 5662. That is an ordered ladder with a working + * off path, so the ids go back to the host's own set and the baseline no + * longer overrides them. + * * Where measurement and baseline disagree, this table is the baseline winning * by decision, not by evidence. `deepseek-v4-pro` orders 4374 -> 4936 reasoning * tokens between `low` and `high` with the field validated, and `gpt-5-pro` @@ -198,14 +207,42 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * than those probes support. Restoring the wider sets means deleting the entry. */ const REVIEW_BASELINE_EFFORTS: Readonly> = { - "deepseek/deepseek-v4-pro": ["high"], - "deepseek/deepseek-v4-pro-0813": ["high"], - "deepseek/deepseek-v4-flash": ["low", "high"], - "deepseek/deepseek-v4-flash-vision-exp": ["low", "high"], "alibaba/qwen3.8-max": ["low", "medium"], "openai/gpt-5-pro": ["high"], }; +/** + * `none` on the Claude ladders, which the review asked to justify or drop. + * + * It is a real control, and what it does depends on which link serves the + * request — so the honest answer is per model rather than per family. + * + * `claude-opus-4.7` and `4.8` reach OpenRouter for every rung up to `high`, + * and only `xhigh`/`max` go to Anthropic natively. On that link `none` + * measured 0 reasoning tokens against 191 at `low` and 1228 at `high`: an off + * switch, and the reason `none` stays on those ids. + * + * `claude-sonnet-5` has no OpenRouter link, so every rung goes native, and + * Anthropic has no off switch on its adaptive models — `thinking: + * {type: 'disabled'}` returns 200 there and is ignored. The host used to drop + * the field entirely for `none`, which handed the request to Anthropic's + * default: 6000 output tokens spent thinking and an EMPTY reply. That is fixed + * upstream and `none` now maps to `low`, the cheapest rung the vendor has, so + * on this id it means minimum rather than off. + * + * Both are worth publishing — a caller sending `none` gets the least thinking + * available either way — but they are not the same promise, and this is where + * that is written down. + */ +/** + * `alibaba/qwen3.8-2.4t-a95b` keeps `high` as its top rung. + * + * The review asked for `xhigh` instead, on the peer ladder for this model. + * Probed twice: `xhigh` answers 400 with `Expected 'low' | 'medium' | 'high'`, + * so the host does not offer it and publishing it would hand callers an error. + * `high` at 4000 tokens times out at the gateway rather than returning, so + * whether the rungs order is still unmeasured — the enum, however, is settled. + */ const MEASURED_EFFORTS: Readonly> = { // schema offers none+minimal; both refused, `none` explicitly and by name. // `max` is kept on evidence the review asked to see recorded here: measured @@ -385,8 +422,35 @@ function isChatTextModel(model: AimlapiModel): boolean { * of these models, so every entry has to point at the lab file rather than * restate it. */ +/** + * Ids whose `base_model` is not the lab entry their own name resolves to. + * + * `deepseek-chat` is the case this exists for. DeepSeek retired the model + * behind that name and routes the id to its current Flash build, so pointing + * at the chat lab entry inherits the wrong everything: a 128K window for a + * model with 1M, and `reasoning = false` for one that reasons. The host itself + * bills the id on the Flash grid and has since corrected its own row's name + * and limits; this is the same correction on the catalogue side. + */ +/** + * Ids whose host label is known stale, so the lab name is the better one. + * + * Only `deepseek/deepseek-chat`, and only until the host's own correction + * ships: production still calls it "DeepSeek V3" while serving a Flash build, + * and republishing that beside a Flash `base_model` would put a contradiction + * in the catalogue. The fix upstream is merged, and when it lands this set can + * go — the host will be saying the right thing itself. + */ +const SUPPRESS_HOST_NAME: ReadonlySet = new Set([ + "deepseek/deepseek-chat", +]); + +const BASE_MODEL_OVERRIDES: Readonly> = { + "deepseek/deepseek-chat": "deepseek/deepseek-v4-flash", +}; + function baseModelFor(id: string): string | undefined { - return resolveModelMetadataBaseModel(id); + return BASE_MODEL_OVERRIDES[id] ?? resolveModelMetadataBaseModel(id); } function baseReasoning(baseModelID: string): boolean { @@ -613,7 +677,7 @@ export const aimlapi = { // would inherit its display name, so the catalogue would list two rows // called "GPT-5.6 Luna". The host names them apart; carry that through // and the override drops itself when the names already agree. - name: info.name ?? undefined, + name: SUPPRESS_HOST_NAME.has(model.id) ? undefined : (info.name ?? undefined), reasoning_options: reasoningOptions, limit, }, diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index 29a4a554dee..6ae7b99e494 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -1,5 +1,8 @@ -base_model = "deepseek/deepseek-chat" -name = "DeepSeek V3" +base_model = "deepseek/deepseek-v4-flash" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] [cost] input = 0.39 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index 974cb80de36..14c8b06da73 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-flash-vision-exp" [[reasoning_options]] type = "effort" -values = ["low", "high"] +values = ["none", "low", "medium", "high"] [cost] input = 0.572 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 82a67209859..f8ebcdf65d7 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-flash" [[reasoning_options]] type = "effort" -values = ["low", "high"] +values = ["none", "low", "medium", "high"] [cost] input = 0.39 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index f073b81750b..c8947cb45c0 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro-0813" [[reasoning_options]] type = "effort" -values = ["high"] +values = ["none", "low", "medium", "high"] [cost] input = 2.393196 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 5c786575cd4..05e0c06ca14 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -2,7 +2,7 @@ base_model = "deepseek/deepseek-v4-pro" [[reasoning_options]] type = "effort" -values = ["high"] +values = ["none", "low", "medium", "high"] [cost] input = 0.5655 From 7ae5a66895a9f7aa1cc66639f756b600c6d23171 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 20:18:33 +0500 Subject: [PATCH 21/38] fix(aimlapi): drop none from sonnet-5, finish measuring the DeepSeek ladder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **`claude-sonnet-5` loses `none`, and the review is right about why.** Every rung on that id reaches Anthropic natively, Anthropic has no off switch on its adaptive models, and the host therefore maps `none` to `low` — the cheapest real rung. Publishing it as `none` tells a caller the catalogue offers a way to turn reasoning off here, and what they would get is the minimum instead. `opus-4.7` and `4.8` keep `none`: their lower rungs reach OpenRouter, where it measured 0 reasoning tokens against 191 at `low` and 1228 at `high`. Same parameter, same family, different link, different promise — which is why this had to be decided per id rather than per family. **DeepSeek V4 is measured through.** `medium` was the last untested rung and the review objected to keeping it, so it was probed: 5563 reasoning tokens, between `low`'s 4175 and `high`'s 5662, with `none` at 0 across two runs and an invalid value rejected. Four rungs, in order, with a working off path. The "invented GPT-style ladder" named in three rounds is the one this host has. **`alibaba/qwen3.8-max` leaves the baseline table**, on the review's own ground: forcing `low, medium` dropped `high` without ever measuring a rejection of it, and `high` answers 200 and spends its whole budget reasoning. A rung that works is not ours to remove. Whether its rungs order remains unmeasurable — the model exhausts 4000 tokens on reasoning and times out at 12000 — and `xhigh`, the lab's top rung, answers 400 here. **`deepseek-chat` is finished.** Its `[limit]` still carried the old row's 128K context and 124K output beside a Flash `base_model` with 1M; the stale-row suppression now covers limits as well as the name, so the lab figures inherit until the host's own correction ships. Sync: 2 updated. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 47 ++++++++++++++----- .../aimlapi/models/alibaba/qwen3.8-max.toml | 2 +- .../models/anthropic/claude-sonnet-5.toml | 2 +- .../models/deepseek/deepseek-chat.toml | 3 -- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 33d742bb937..40b615b7d73 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -191,14 +191,27 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * qwen3.8-max baseline low/medium/xhigh-> `xhigh` refused, so low/medium * gpt-5-pro baseline high -> `high` * + * `alibaba/qwen3.8-max` left too, and for the reason the review gave: the + * forced `low, medium` dropped `high` without ever measuring a rejection of + * it, and `high` answers 200 here and spends its whole budget reasoning. A + * rung that works is not ours to remove. Whether the rungs ORDER is still + * unmeasurable — the model exhausts a 4000-token budget on reasoning and + * times out at 12000 — and `xhigh`, the lab's top rung, answers 400. So the + * id goes back to the host's own enum, which is the only statement anyone can + * actually stand behind for it. + * * The DeepSeek V4 family was here and is not any more. The review asked for * the lab set, this table gave it, and the next round objected that doing so * "removes caller off/lower rungs that the host reportedly accepted" — which * is what the entry's own note had said it cost. Re-probed on that objection: * an invalid value is rejected, `none` returns 0 reasoning tokens twice over, - * `low` returns 4175 and `high` 5662. That is an ordered ladder with a working - * off path, so the ids go back to the host's own set and the baseline no - * longer overrides them. + * `low` returns 4175, `medium` 5563 and `high` 5662. Four rungs, in order, + * with a working off path — the "invented GPT-style ladder" the review keeps + * naming is the one this host measurably has. `medium` was the last untested + * rung and was probed on the review's own objection to keeping it. + * + * So the ids go back to the host's own set and the baseline no longer + * overrides them. * * Where measurement and baseline disagree, this table is the baseline winning * by decision, not by evidence. `deepseek-v4-pro` orders 4374 -> 4936 reasoning @@ -207,7 +220,6 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * than those probes support. Restoring the wider sets means deleting the entry. */ const REVIEW_BASELINE_EFFORTS: Readonly> = { - "alibaba/qwen3.8-max": ["low", "medium"], "openai/gpt-5-pro": ["high"], }; @@ -268,6 +280,14 @@ const MEASURED_EFFORTS: Readonly> = { // the measurement is what this entry rests on. `xhigh` is not added back — // this host's schema stops at `high` and refuses it. "openai/gpt-5.4-pro": ["medium", "high"], + // `none` dropped 2026-09-10. On this id every rung reaches Anthropic + // natively, and Anthropic has no off switch on its adaptive models, so the + // host maps `none` to `low` — the cheapest real rung. Publishing it as + // `none` tells a caller reading the catalogue that reasoning can be turned + // off here, which is not what they would get. The sibling opus-4.7/4.8 keep + // `none` because their lower rungs reach OpenRouter, where it measured 0 + // reasoning tokens against 191 at `low`: there it really is off. + "anthropic/claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"], "openai/o1": ["low", "medium", "high"], "openai/o3-mini": ["low", "medium", "high"], }; @@ -433,15 +453,17 @@ function isChatTextModel(model: AimlapiModel): boolean { * and limits; this is the same correction on the catalogue side. */ /** - * Ids whose host label is known stale, so the lab name is the better one. + * Ids whose host ROW is known stale, so the lab entry is the better source. * * Only `deepseek/deepseek-chat`, and only until the host's own correction - * ships: production still calls it "DeepSeek V3" while serving a Flash build, - * and republishing that beside a Flash `base_model` would put a contradiction - * in the catalogue. The fix upstream is merged, and when it lands this set can - * go — the host will be saying the right thing itself. + * ships: production still calls it "DeepSeek V3" with a 128K window while + * serving a Flash build that has 1M, and republishing either beside a Flash + * `base_model` would put a contradiction in the catalogue. Name and limits are + * both suppressed so the lab entry's own figures inherit. The fix upstream is + * merged, and when it lands this set can go — the host will be saying the + * right thing itself. */ -const SUPPRESS_HOST_NAME: ReadonlySet = new Set([ +const STALE_HOST_ROW: ReadonlySet = new Set([ "deepseek/deepseek-chat", ]); @@ -656,7 +678,8 @@ export const aimlapi = { // context would overwrite the lab's correct split (e.g. 272k in + 128k out // within a 400k window) with a wrong number. const limit = - contextLimit === undefined && outputLimit === undefined + STALE_HOST_ROW.has(model.id) || + (contextLimit === undefined && outputLimit === undefined) ? undefined : { context: contextLimit, output: outputLimit }; @@ -677,7 +700,7 @@ export const aimlapi = { // would inherit its display name, so the catalogue would list two rows // called "GPT-5.6 Luna". The host names them apart; carry that through // and the override drops itself when the names already agree. - name: SUPPRESS_HOST_NAME.has(model.id) ? undefined : (info.name ?? undefined), + name: STALE_HOST_ROW.has(model.id) ? undefined : (info.name ?? undefined), reasoning_options: reasoningOptions, limit, }, diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 7701ddcda9d..654d7093d5e 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -2,7 +2,7 @@ base_model = "alibaba/qwen3.8-max" [[reasoning_options]] type = "effort" -values = ["low", "medium"] +values = ["none", "low", "medium", "high"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml index 4ec43ec3f72..9588ee0e462 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml @@ -2,7 +2,7 @@ base_model = "anthropic/claude-sonnet-5" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "xhigh", "max"] +values = ["low", "medium", "high", "xhigh", "max"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index 6ae7b99e494..b26c6654ff1 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -9,6 +9,3 @@ input = 0.39 output = 1.56 cache_read = 0.0078 -[limit] -context = 128_000 -output = 124_000 From 85cf0698e1bc1f762163c6d2054585d2a8b2f867 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 20:59:46 +0500 Subject: [PATCH 22/38] fix(aimlapi): unpin gpt-5-pro, drop qwen's unproven none, keep DeepSeek medium MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **`REVIEW_BASELINE_EFFORTS` is now empty.** The review offered a choice on the last entry — delete the `gpt-5-pro` pin or mark it an intentional lab match — and deleting is the better half. The pin held `["high"]` over a host that measured 64/256/320 reasoning tokens across low/medium/high and 128/192 on a repeat of the ends, so every sync discarded two working rungs by decision. The table stays in the file, empty, because the next round may want it again. **`alibaba/qwen3.8-max` loses `none`.** It is accepted, but nothing shows it turns reasoning off: two runs returned no `reasoning_tokens` field at all while still producing 1703 and 2000 output tokens, and `high` on the same model does report 2000. A rung whose semantics cannot be shown does not belong in a catalogue other people build against. **`deepseek-chat`'s retarget is confirmed rather than inferred.** Three calls to that id each answered `"model": "deepseek-flash"`, the same string `deepseek-v4-flash` returns. The review asked for exactly this check. **DeepSeek `medium` stays, and the note says why it is unsettled.** The objection was fair on one sample: 5563 against `high`'s 5662 is under two percent, and that same reasoning removed `low` from `gpt-5.4-pro`. Re-probed, `medium` came back 7204 — its own spread across runs is thirty percent, an order of magnitude wider than the gap being argued about, and `high` timed out on three of four attempts. The two cannot be shown to order and cannot be shown not to. Removing a rung the host accepts needs evidence, and noise larger than the effect is not evidence in either direction. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 34 ++++++++++++++----- .../aimlapi/models/alibaba/qwen3.8-max.toml | 2 +- .../aimlapi/models/openai/gpt-5-pro.toml | 2 +- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 40b615b7d73..93354f355c8 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -205,10 +205,20 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * "removes caller off/lower rungs that the host reportedly accepted" — which * is what the entry's own note had said it cost. Re-probed on that objection: * an invalid value is rejected, `none` returns 0 reasoning tokens twice over, - * `low` returns 4175, `medium` 5563 and `high` 5662. Four rungs, in order, - * with a working off path — the "invented GPT-style ladder" the review keeps - * naming is the one this host measurably has. `medium` was the last untested - * rung and was probed on the review's own objection to keeping it. + * `low` returns 4175, `medium` 5563 and `high` 5662. A working off path and a + * clear step from `none` to `low` to the pair above it. + * + * `medium` versus `high` is a different question and it is UNSETTLED. The + * review objected to keeping `medium` on "near-identical token counts", which + * was fair on one sample — 5563 against 5662 is under two percent, and the + * same reasoning removed `low` from `gpt-5.4-pro`. Re-probed for that reason, + * `medium` came back 7204: its own spread across runs is thirty percent, an + * order of magnitude wider than the gap being argued about, and `high` timed + * out on three of four attempts so there is nothing to average against. + * + * The two cannot be shown to order and cannot be shown not to. `medium` stays + * because removing a rung the host accepts needs evidence, and noise larger + * than the effect is not evidence — in either direction. * * So the ids go back to the host's own set and the baseline no longer * overrides them. @@ -219,9 +229,7 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * ordered 64/256/320 and 128/192 across repeats; both keep fewer rungs here * than those probes support. Restoring the wider sets means deleting the entry. */ -const REVIEW_BASELINE_EFFORTS: Readonly> = { - "openai/gpt-5-pro": ["high"], -}; +const REVIEW_BASELINE_EFFORTS: Readonly> = {}; /** * `none` on the Claude ladders, which the review asked to justify or drop. @@ -287,6 +295,13 @@ const MEASURED_EFFORTS: Readonly> = { // off here, which is not what they would get. The sibling opus-4.7/4.8 keep // `none` because their lower rungs reach OpenRouter, where it measured 0 // reasoning tokens against 191 at `low`: there it really is off. + // `none` dropped 2026-09-10: it is accepted, but nothing shows it turns + // reasoning off. Two runs returned no `reasoning_tokens` field at all while + // still producing 1703 and 2000 output tokens, so there is no reading of + // that as an off switch — and `high` on the same model does report 2000 + // reasoning tokens. A rung whose semantics cannot be shown does not belong + // in a catalogue other people build against. + "alibaba/qwen3.8-max": ["low", "medium", "high"], "anthropic/claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"], "openai/o1": ["low", "medium", "high"], "openai/o3-mini": ["low", "medium", "high"], @@ -445,7 +460,10 @@ function isChatTextModel(model: AimlapiModel): boolean { /** * Ids whose `base_model` is not the lab entry their own name resolves to. * - * `deepseek-chat` is the case this exists for. DeepSeek retired the model + * `deepseek-chat` is the case this exists for. Confirmed on production + * 2026-09-10 rather than inferred: three calls to that id each answered + * `"model": "deepseek-flash"`, the same string `deepseek-v4-flash` returns. + * DeepSeek retired the model * behind that name and routes the id to its current Flash build, so pointing * at the chat lab entry inherits the wrong everything: a 128K window for a * model with 1M, and `reasoning = false` for one that reasons. The host itself diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 654d7093d5e..17e2e264fab 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -2,7 +2,7 @@ base_model = "alibaba/qwen3.8-max" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index 991c8c51d7d..dcf302b6018 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -2,7 +2,7 @@ base_model = "openai/gpt-5-pro" [[reasoning_options]] type = "effort" -values = ["high"] +values = ["low", "medium", "high"] [cost] input = 20.631 From 2d693bc5e1c77346c1c5578e37deeced77c4d6ec Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 21:08:21 +0500 Subject: [PATCH 23/38] docs(aimlapi): probe the pro/codex/5.6 batch the review asked about MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nine ids, an invalid-effort control on each, and the two questions the review raised for them. No TOML changes: every published set already matches what the host accepts, and nothing survived as a reason to change one. **The rungs the review wanted added are refused.** `xhigh` answers 400 on `gpt-5.2-pro`, `gpt-5.5-pro` and `gpt-5.3-codex`; `max` answers 400 on `gpt-5.6-luna`. Publishing the lab's wider sets would hand callers an error, which is the rule the review itself opened with. **The rung it worried was fake is real.** `none` measured 0 reasoning tokens on every id that offers it — `gpt-5.3-codex`, `gpt-5.6-luna`, `-sol`, `-terra`, `-terra-pro` — against non-zero at `high` on each. That is the same check `claude-sonnet-5` failed this morning, which is why it was worth running rather than assuming the family behaves alike. Ordering, on a light prompt so the batch could finish: `gpt-5.2-codex` 90/192, `gpt-5.1-codex` 0/103, `gpt-5.6-terra` 9/25 and `-terra-pro` 91/129 all separate; `gpt-5.6-sol` barely does at 0/9; `gpt-5.6-luna` (26/27) and `gpt-5.5-pro` (33/31) do not, and `gpt-5.2-pro` produced no reasoning at any rung at all. Those last three are left alone rather than trimmed. `gpt-5.2-pro` is the `kwaipilot` case this file's Method section already names: when the control produces nothing, the cells say nothing about the ladder. The other two need a harder prompt than the batch could afford, and a rung the host accepts is not removed on a probe that separated nothing. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 93354f355c8..281f3ac86d9 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -231,6 +231,40 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ */ const REVIEW_BASELINE_EFFORTS: Readonly> = {}; +/** + * The OpenAI pro/codex/5.6 batch, probed 2026-09-10 because the review asked + * for each id to be intersected with a live accept-and-honour test. + * + * An invalid effort is rejected on all nine, so every ladder below is a live + * control rather than a swallowed field. + * + * The rungs the review wanted ADDED are refused here. `xhigh` answers 400 on + * `gpt-5.2-pro`, `gpt-5.5-pro` and `gpt-5.3-codex`; `max` answers 400 on + * `gpt-5.6-luna`. Publishing the lab's wider sets would hand callers an error, + * so the host's narrower enum stands. + * + * The rung the review worried was fake is real. `none` measured 0 reasoning + * tokens on every id that offers it — `gpt-5.3-codex`, `gpt-5.6-luna`, `-sol`, + * `-terra` and `-terra-pro` — against non-zero at `high` on each. That is the + * check Sonnet 5 failed, and these pass it. + * + * Ordering, on a deliberately light prompt so the batch could finish: + * + * gpt-5.2-codex low 90 high 192 ordered + * gpt-5.1-codex low 0 high 103 ordered + * gpt-5.6-terra low 9 high 25 ordered + * gpt-5.6-terra-pro low 91 high 129 ordered + * gpt-5.6-sol low 0 high 9 ordered, barely + * gpt-5.6-luna low 26 high 27 not separated + * gpt-5.5-pro low 33 high 31 not separated + * gpt-5.2-pro 0 at every rung — the model did not reason at all here + * + * The last three are left alone rather than trimmed. `gpt-5.2-pro` is the + * `kwaipilot` case from the Method section: when the control itself produces + * nothing, the cells say nothing about the ladder. The other two would need a + * harder prompt than this batch could afford, and a rung the host accepts is + * not removed on a probe that failed to separate anything. + */ /** * `none` on the Claude ladders, which the review asked to justify or drop. * From 0f8b01d7a6d2e67212126aa89bd1fe35e42562b3 Mon Sep 17 00:00:00 2001 From: aimlapi Date: Thu, 10 Sep 2026 21:41:49 +0500 Subject: [PATCH 24/38] fix(aimlapi): declare the reasoning side channel, 58 models had none MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The review asked whether this gateway returns reasoning on a separate field. It does, and the catalogue never said so. The lab entries that declare `interleaved` are not inherited through `base_model`, so every aimlapi row built with it unset while the provider was emitting 20K characters of chain-of-thought beside the answer — 20114 on `deepseek-v4-pro`, 14150 on `v4-flash`, 6506 on `kimi-k3`. A client reading only this provider had nothing telling it that field was not the reply. Probed across all 81 ids that carry a reasoning ladder, by reading the keys actually on the response message rather than by family: 14 return `reasoning_content`, 44 return `reasoning_details`. Both are now declared, 58 files updated. Fifteen more return a bare `reasoning` and two Gemini Flash ids return `extra_content`. Neither name is in the schema's enum, so they stay unset and the map says why — most of that group is the Anthropic line, where the field carries the summarised thinking block. Two ladder corrections come with it, and both are this file being made consistent with itself rather than new findings. `gpt-5.2-pro` and `gpt-5.5-pro` drop `low`. Re-probed on a hard prompt at the review's suggestion, since the light one had `gpt-5.2-pro` not reasoning at all: `low` and `medium` come back indistinguishable on both — 1400 against 1311, 2345 against 2336 — while `high` sits above where it could be measured. `deepseek-v4-pro` drops `medium`, reversing a call made earlier today. It measured 5563 and then 7204 against `high`'s 5662, a spread inside the rung wider than any gap to the rung above, and that was recorded as "unsettled, so keep it". But publishing a rung is a claim too, and `gpt-5.4-pro` had the identical shape and lost `low` for it. Two rules for one situation is worse than either rule. `none` (0 twice) and `low` (4175 against 5662) stay measured. Sync: 58 updated. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 99 +++++++++++++++++++ .../aimlapi/models/alibaba/qwen3.5-flash.toml | 3 + .../aimlapi/models/alibaba/qwen3.6-27b.toml | 3 + .../models/alibaba/qwen3.6-35b-a3b.toml | 3 + .../models/alibaba/qwen3.6-max-preview.toml | 3 + .../aimlapi/models/alibaba/qwen3.7-max.toml | 3 + .../models/alibaba/qwen3.8-2.4t-a95b.toml | 3 + .../aimlapi/models/alibaba/qwen3.8-27b.toml | 3 + .../aimlapi/models/alibaba/qwen3.8-flash.toml | 3 + .../aimlapi/models/alibaba/qwen3.8-max.toml | 3 + .../models/anthropic/claude-fable-5.toml | 3 + .../models/anthropic/claude-sonnet-5.toml | 3 + .../arcee-ai/trinity-large-thinking.toml | 3 + .../models/bytedance-seed/seed-2.0-code.toml | 3 + .../models/bytedance-seed/seed-2.0-lite.toml | 3 + .../models/bytedance-seed/seed-2.0-mini.toml | 3 + .../deepseek-v4-flash-vision-exp.toml | 3 + .../models/deepseek/deepseek-v4-flash.toml | 3 + .../models/deepseek/deepseek-v4-pro-0813.toml | 3 + .../models/deepseek/deepseek-v4-pro.toml | 5 +- .../google/gemini-3.1-flash-lite-preview.toml | 3 + .../gemini-3.1-pro-preview-customtools.toml | 3 + .../models/google/gemini-flash-latest.toml | 3 + .../inclusionai/ling-3.0-flash-fin.toml | 3 + .../aimlapi/models/meta/muse-glimmer-30b.toml | 3 + .../aimlapi/models/meta/muse-spark-1.1.toml | 3 + .../aimlapi/models/meta/muse-spark-1.2.toml | 3 + .../aimlapi/models/moonshot/kimi-k3.toml | 3 + .../aimlapi/models/openai/gpt-5-mini.toml | 3 + .../aimlapi/models/openai/gpt-5-nano.toml | 3 + .../aimlapi/models/openai/gpt-5-pro.toml | 3 + .../models/openai/gpt-5.1-codex-max.toml | 3 + .../models/openai/gpt-5.1-codex-mini.toml | 3 + .../aimlapi/models/openai/gpt-5.1-codex.toml | 3 + .../aimlapi/models/openai/gpt-5.2-codex.toml | 3 + .../aimlapi/models/openai/gpt-5.2-pro.toml | 5 +- .../aimlapi/models/openai/gpt-5.3-codex.toml | 3 + .../aimlapi/models/openai/gpt-5.4-pro.toml | 3 + .../aimlapi/models/openai/gpt-5.5-pro.toml | 5 +- .../models/openai/gpt-5.6-luna-pro.toml | 3 + .../models/openai/gpt-5.6-sol-pro.toml | 3 + .../models/openai/gpt-5.6-terra-pro.toml | 3 + providers/aimlapi/models/openai/gpt-5.toml | 3 + .../aimlapi/models/openai/gpt-oss-120b.toml | 3 + .../aimlapi/models/openai/gpt-oss-20b.toml | 3 + providers/aimlapi/models/openai/o1-pro.toml | 3 + providers/aimlapi/models/openai/o3-pro.toml | 3 + .../aimlapi/models/poolside/laguna-s-2.1.toml | 3 + .../models/poolside/laguna-xs-2.1.toml | 3 + providers/aimlapi/models/tencent/hy3.toml | 3 + .../aimlapi/models/tencent/hy4-preview.toml | 3 + .../thinkingmachines/inkling-small.toml | 3 + .../models/thinkingmachines/inkling.toml | 3 + .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 3 + .../aimlapi/models/xiaomi/mimo-v2.5.toml | 3 + providers/aimlapi/models/z-ai/glm-4.5v.toml | 3 + providers/aimlapi/models/z-ai/glm-4.6v.toml | 3 + .../aimlapi/models/z-ai/glm-4.7-flash.toml | 3 + .../aimlapi/models/z-ai/glm-5.3-flash.toml | 3 + 59 files changed, 276 insertions(+), 3 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 281f3ac86d9..ed46215d987 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -321,6 +321,13 @@ const MEASURED_EFFORTS: Readonly> = { // review asked for this too, on the different ground that the lab omits it; // the measurement is what this entry rests on. `xhigh` is not added back — // this host's schema stops at `high` and refuses it. + // Re-probed on a hard prompt at the review's suggestion, because the light + // one had `gpt-5.2-pro` not reasoning at all. `low` and `medium` come back + // indistinguishable on both — 1400 against 1311, and 2345 against 2336 — + // while `high` sits above where it could be measured at all. Same call as + // `gpt-5.4-pro` below: two names for one behaviour, so the lower goes. + "openai/gpt-5.2-pro": ["medium", "high"], + "openai/gpt-5.5-pro": ["medium", "high"], "openai/gpt-5.4-pro": ["medium", "high"], // `none` dropped 2026-09-10. On this id every rung reaches Anthropic // natively, and Anthropic has no off switch on its adaptive models, so the @@ -337,10 +344,99 @@ const MEASURED_EFFORTS: Readonly> = { // in a catalogue other people build against. "alibaba/qwen3.8-max": ["low", "medium", "high"], "anthropic/claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"], + // `medium` dropped 2026-09-10, and this is a correction to an earlier call + // in this file rather than a new measurement. It measured 5563 and then 7204 + // against `high`'s 5662: a spread inside the rung wider than any gap to the + // rung above. That was recorded as "unsettled, so keep it" — but publishing + // a rung is a claim too, and `gpt-5.4-pro` above had the identical shape and + // lost `low` for it. Two rules for one situation is worse than either rule. + // `none` (0 twice) and `low` (4175 against 5662) stay: those are measured. + "deepseek/deepseek-v4-pro": ["none", "low", "high"], "openai/o1": ["low", "medium", "high"], "openai/o3-mini": ["low", "medium", "high"], }; +/** + * Models whose reasoning arrives on a side channel rather than in `content`. + * + * The review asked whether this gateway returns one, and it does — but the lab + * entries that declare it are NOT inherited through `base_model`, so the built + * catalogue showed `interleaved` unset on every aimlapi row while the provider + * was in fact emitting 20K characters of chain-of-thought in a separate field. + * A client reading only this provider would render that as the answer. + * + * Probed across all 81 ids that carry a reasoning ladder, 2026-09-10, by + * reading the keys actually present on the response message rather than by + * family: 14 return `reasoning_content`, 44 return `reasoning_details` + * alongside `reasoning`. + * + * Fifteen more return a bare `reasoning`, and two Gemini Flash ids return + * `extra_content`. Neither name is in the schema's enum, so those stay unset — + * recorded here so the gap reads as known rather than missed. Most of that + * group is the Anthropic line, where the field carries the summarised thinking + * block. + */ +const INTERLEAVED_FIELD: Readonly> = { + "alibaba/qwen3.5-flash": "reasoning_content", + "alibaba/qwen3.6-27b": "reasoning_content", + "alibaba/qwen3.6-35b-a3b": "reasoning_content", + "alibaba/qwen3.6-max-preview": "reasoning_content", + "alibaba/qwen3.7-max": "reasoning_content", + "alibaba/qwen3.8-flash": "reasoning_content", + "alibaba/qwen3.8-max": "reasoning_content", + "anthropic/claude-fable-5": "reasoning_content", + "anthropic/claude-sonnet-5": "reasoning_content", + "deepseek/deepseek-v4-flash": "reasoning_content", + "deepseek/deepseek-v4-flash-vision-exp": "reasoning_content", + "deepseek/deepseek-v4-pro": "reasoning_content", + "moonshot/kimi-k3": "reasoning_content", + "z-ai/glm-5.3-flash": "reasoning_content", + "alibaba/qwen3.8-2.4t-a95b": "reasoning_details", + "alibaba/qwen3.8-27b": "reasoning_details", + "arcee-ai/trinity-large-thinking": "reasoning_details", + "bytedance-seed/seed-2.0-code": "reasoning_details", + "bytedance-seed/seed-2.0-lite": "reasoning_details", + "bytedance-seed/seed-2.0-mini": "reasoning_details", + "deepseek/deepseek-v4-pro-0813": "reasoning_details", + "google/gemini-3.1-flash-lite-preview": "reasoning_details", + "google/gemini-3.1-pro-preview-customtools": "reasoning_details", + "google/gemini-flash-latest": "reasoning_details", + "inclusionai/ling-3.0-flash-fin": "reasoning_details", + "meta/muse-glimmer-30b": "reasoning_details", + "meta/muse-spark-1.1": "reasoning_details", + "meta/muse-spark-1.2": "reasoning_details", + "openai/gpt-5": "reasoning_details", + "openai/gpt-5-mini": "reasoning_details", + "openai/gpt-5-nano": "reasoning_details", + "openai/gpt-5-pro": "reasoning_details", + "openai/gpt-5.1-codex": "reasoning_details", + "openai/gpt-5.1-codex-max": "reasoning_details", + "openai/gpt-5.1-codex-mini": "reasoning_details", + "openai/gpt-5.2-codex": "reasoning_details", + "openai/gpt-5.2-pro": "reasoning_details", + "openai/gpt-5.3-codex": "reasoning_details", + "openai/gpt-5.4-pro": "reasoning_details", + "openai/gpt-5.5-pro": "reasoning_details", + "openai/gpt-5.6-luna-pro": "reasoning_details", + "openai/gpt-5.6-sol-pro": "reasoning_details", + "openai/gpt-5.6-terra-pro": "reasoning_details", + "openai/gpt-oss-120b": "reasoning_details", + "openai/gpt-oss-20b": "reasoning_details", + "openai/o1-pro": "reasoning_details", + "openai/o3-pro": "reasoning_details", + "poolside/laguna-s-2.1": "reasoning_details", + "poolside/laguna-xs-2.1": "reasoning_details", + "tencent/hy3": "reasoning_details", + "tencent/hy4-preview": "reasoning_details", + "thinkingmachines/inkling": "reasoning_details", + "thinkingmachines/inkling-small": "reasoning_details", + "xiaomi/mimo-v2.5": "reasoning_details", + "xiaomi/mimo-v2.5-pro": "reasoning_details", + "z-ai/glm-4.5v": "reasoning_details", + "z-ai/glm-4.6v": "reasoning_details", + "z-ai/glm-4.7-flash": "reasoning_details", +}; + const DOCS_CONCURRENCY = 8; const PricingUnit = z @@ -754,6 +850,9 @@ export const aimlapi = { // and the override drops itself when the names already agree. name: STALE_HOST_ROW.has(model.id) ? undefined : (info.name ?? undefined), reasoning_options: reasoningOptions, + interleaved: INTERLEAVED_FIELD[model.id] + ? { field: INTERLEAVED_FIELD[model.id]! } + : undefined, limit, }, limit, diff --git a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml index ce03c2805d0..bc117fd1659 100644 --- a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml +++ b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.5-flash" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml index 99848065e45..938f8464df0 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.6-27b" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml index a32a4cb7439..b28a55cbac3 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml @@ -1,6 +1,9 @@ base_model = "alibaba/qwen3.6-35b-a3b" name = "Qwen3.6 35B A3B" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml index e0067ed011f..28cd7bbaab4 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.6-max-preview" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.7-max.toml b/providers/aimlapi/models/alibaba/qwen3.7-max.toml index ad69c73c11c..20672a52eeb 100644 --- a/providers/aimlapi/models/alibaba/qwen3.7-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.7-max.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.7-max" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml index b7c4dffe97a..323eb91eef6 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.8-2.4t-a95b" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml index 77fdf0eda88..0ec7f7560c1 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.8-27b" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml index 811f1426cff..af93f1ec422 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.8-flash" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 17e2e264fab..1346ef93d77 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -1,5 +1,8 @@ base_model = "alibaba/qwen3.8-max" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.toml b/providers/aimlapi/models/anthropic/claude-fable-5.toml index 2d49f22836c..c5ac3b91734 100644 --- a/providers/aimlapi/models/anthropic/claude-fable-5.toml +++ b/providers/aimlapi/models/anthropic/claude-fable-5.toml @@ -1,5 +1,8 @@ base_model = "anthropic/claude-fable-5" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml index 9588ee0e462..5aa47e77359 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-5.toml @@ -1,5 +1,8 @@ base_model = "anthropic/claude-sonnet-5" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high", "xhigh", "max"] diff --git a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml index 33031f2fb01..15d8e08301b 100644 --- a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml +++ b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml @@ -1,5 +1,8 @@ base_model = "arcee-ai/trinity-large-thinking" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml index 1642f0042e3..f6e9da03e50 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml @@ -1,6 +1,9 @@ base_model = "bytedance-seed/seed-2.0-code" name = "Seed-2.0-Code" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml index 31ea157db2c..3dc16b2b148 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml @@ -1,6 +1,9 @@ base_model = "bytedance-seed/seed-2.0-lite" name = "Seed-2.0-Lite" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml index 27f538ef9d2..4a447544643 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml @@ -1,6 +1,9 @@ base_model = "bytedance-seed/seed-2.0-mini" name = "Seed-2.0-Mini" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index 14c8b06da73..27bda929f2b 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -1,5 +1,8 @@ base_model = "deepseek/deepseek-v4-flash-vision-exp" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index f8ebcdf65d7..90d9cc0e30f 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -1,5 +1,8 @@ base_model = "deepseek/deepseek-v4-flash" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index c8947cb45c0..1e818b45f05 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -1,5 +1,8 @@ base_model = "deepseek/deepseek-v4-pro-0813" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 05e0c06ca14..1bb10b668f1 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -1,8 +1,11 @@ base_model = "deepseek/deepseek-v4-pro" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "low", "high"] [cost] input = 0.5655 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml b/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml index e4507cc7a27..d47918d2ae7 100644 --- a/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml +++ b/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml @@ -1,5 +1,8 @@ base_model = "google/gemini-3.1-flash-lite-preview" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml index 090f8c1040b..2df0c423f72 100644 --- a/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml @@ -1,5 +1,8 @@ base_model = "google/gemini-3.1-pro-preview-customtools" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/google/gemini-flash-latest.toml b/providers/aimlapi/models/google/gemini-flash-latest.toml index 65342ef400e..985f8df4c7e 100644 --- a/providers/aimlapi/models/google/gemini-flash-latest.toml +++ b/providers/aimlapi/models/google/gemini-flash-latest.toml @@ -1,5 +1,8 @@ base_model = "google/gemini-flash-latest" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml index c4debdb4865..d0316e5bcf4 100644 --- a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml +++ b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml @@ -1,5 +1,8 @@ base_model = "inclusionai/ling-3.0-flash-fin" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/meta/muse-glimmer-30b.toml b/providers/aimlapi/models/meta/muse-glimmer-30b.toml index adfbd696b94..2d20340d6cc 100644 --- a/providers/aimlapi/models/meta/muse-glimmer-30b.toml +++ b/providers/aimlapi/models/meta/muse-glimmer-30b.toml @@ -1,5 +1,8 @@ base_model = "meta/muse-glimmer-30b" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/meta/muse-spark-1.1.toml b/providers/aimlapi/models/meta/muse-spark-1.1.toml index 1cf23afdac9..2e79f47e967 100644 --- a/providers/aimlapi/models/meta/muse-spark-1.1.toml +++ b/providers/aimlapi/models/meta/muse-spark-1.1.toml @@ -1,5 +1,8 @@ base_model = "meta/muse-spark-1.1" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/meta/muse-spark-1.2.toml b/providers/aimlapi/models/meta/muse-spark-1.2.toml index 089d86b4862..183ea0b86ee 100644 --- a/providers/aimlapi/models/meta/muse-spark-1.2.toml +++ b/providers/aimlapi/models/meta/muse-spark-1.2.toml @@ -1,5 +1,8 @@ base_model = "meta/muse-spark-1.2" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/moonshot/kimi-k3.toml b/providers/aimlapi/models/moonshot/kimi-k3.toml index d5aab25b3e4..081843bca0d 100644 --- a/providers/aimlapi/models/moonshot/kimi-k3.toml +++ b/providers/aimlapi/models/moonshot/kimi-k3.toml @@ -1,5 +1,8 @@ base_model = "moonshotai/kimi-k3" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["low", "high", "max"] diff --git a/providers/aimlapi/models/openai/gpt-5-mini.toml b/providers/aimlapi/models/openai/gpt-5-mini.toml index 1f840303110..936dc22c60e 100644 --- a/providers/aimlapi/models/openai/gpt-5-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5-mini.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5-mini" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["minimal", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5-nano.toml b/providers/aimlapi/models/openai/gpt-5-nano.toml index 7b0ec70c2a9..d038994a673 100644 --- a/providers/aimlapi/models/openai/gpt-5-nano.toml +++ b/providers/aimlapi/models/openai/gpt-5-nano.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5-nano" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["minimal", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index dcf302b6018..221b15cd519 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5-pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml index c5c4ca0b453..e4b37166a87 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml @@ -1,6 +1,9 @@ base_model = "openai/gpt-5.1-codex-max" name = "GPT-5.1-Codex-Max" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml index 943ebe245f5..57542d64d25 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml @@ -1,6 +1,9 @@ base_model = "openai/gpt-5.1-codex-mini" name = "GPT-5.1 Codex Mini" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex.toml b/providers/aimlapi/models/openai/gpt-5.1-codex.toml index 6c5c7db6021..33b2d94cbe8 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5.1-codex" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-codex.toml b/providers/aimlapi/models/openai/gpt-5.2-codex.toml index c84a5f445e5..5b16e1f8b2c 100644 --- a/providers/aimlapi/models/openai/gpt-5.2-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.2-codex.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5.2-codex" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.2-pro.toml b/providers/aimlapi/models/openai/gpt-5.2-pro.toml index d3e1d34fc0f..fb64e3c84fe 100644 --- a/providers/aimlapi/models/openai/gpt-5.2-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.2-pro.toml @@ -1,8 +1,11 @@ base_model = "openai/gpt-5.2-pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["medium", "high"] [cost] input = 28.8834 diff --git a/providers/aimlapi/models/openai/gpt-5.3-codex.toml b/providers/aimlapi/models/openai/gpt-5.3-codex.toml index f69e9a098bf..8f05de16d0b 100644 --- a/providers/aimlapi/models/openai/gpt-5.3-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.3-codex.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5.3-codex" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.4-pro.toml b/providers/aimlapi/models/openai/gpt-5.4-pro.toml index 70419636e7e..9cbfce2f1cf 100644 --- a/providers/aimlapi/models/openai/gpt-5.4-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.4-pro.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5.4-pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.5-pro.toml b/providers/aimlapi/models/openai/gpt-5.5-pro.toml index 2002aaca7ae..1ed1ce270cc 100644 --- a/providers/aimlapi/models/openai/gpt-5.5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.5-pro.toml @@ -1,8 +1,11 @@ base_model = "openai/gpt-5.5-pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["medium", "high"] [cost] input = 41.262 diff --git a/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml index 0436e431016..cbb21e9c66e 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-luna-pro.toml @@ -1,6 +1,9 @@ base_model = "openai/gpt-5.6-luna" name = "GPT-5.6 Luna Pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml index 06c4116a7a3..d350abe9f0b 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-sol-pro.toml @@ -1,6 +1,9 @@ base_model = "openai/gpt-5.6-sol" name = "GPT-5.6 Sol Pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml index 634dc2c6864..471b9cd42c6 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml @@ -1,6 +1,9 @@ base_model = "openai/gpt-5.6-terra" name = "GPT-5.6 Terra Pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-5.toml b/providers/aimlapi/models/openai/gpt-5.toml index c170a98204f..5e43e7e65e0 100644 --- a/providers/aimlapi/models/openai/gpt-5.toml +++ b/providers/aimlapi/models/openai/gpt-5.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-5" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["minimal", "low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-oss-120b.toml b/providers/aimlapi/models/openai/gpt-oss-120b.toml index 312f08e3d34..847a6b2c517 100644 --- a/providers/aimlapi/models/openai/gpt-oss-120b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-120b.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-oss-120b" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/gpt-oss-20b.toml b/providers/aimlapi/models/openai/gpt-oss-20b.toml index 8065bb18ad8..114b4f16097 100644 --- a/providers/aimlapi/models/openai/gpt-oss-20b.toml +++ b/providers/aimlapi/models/openai/gpt-oss-20b.toml @@ -1,5 +1,8 @@ base_model = "openai/gpt-oss-20b" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/o1-pro.toml b/providers/aimlapi/models/openai/o1-pro.toml index 11ce7cea6a2..e340c6100d3 100644 --- a/providers/aimlapi/models/openai/o1-pro.toml +++ b/providers/aimlapi/models/openai/o1-pro.toml @@ -1,5 +1,8 @@ base_model = "openai/o1-pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/openai/o3-pro.toml b/providers/aimlapi/models/openai/o3-pro.toml index 095af15ec05..1e9022547c7 100644 --- a/providers/aimlapi/models/openai/o3-pro.toml +++ b/providers/aimlapi/models/openai/o3-pro.toml @@ -1,6 +1,9 @@ base_model = "openai/o3-pro" name = "o3 Pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["low", "medium", "high"] diff --git a/providers/aimlapi/models/poolside/laguna-s-2.1.toml b/providers/aimlapi/models/poolside/laguna-s-2.1.toml index 086cdc7c0ef..889f39c7dfc 100644 --- a/providers/aimlapi/models/poolside/laguna-s-2.1.toml +++ b/providers/aimlapi/models/poolside/laguna-s-2.1.toml @@ -1,5 +1,8 @@ base_model = "poolside/laguna-s-2.1" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml index 011a014a3c3..9142f958fca 100644 --- a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml +++ b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml @@ -1,5 +1,8 @@ base_model = "poolside/laguna-xs-2.1" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/tencent/hy3.toml b/providers/aimlapi/models/tencent/hy3.toml index a8d79e8ba93..2bcbab7ea8e 100644 --- a/providers/aimlapi/models/tencent/hy3.toml +++ b/providers/aimlapi/models/tencent/hy3.toml @@ -1,5 +1,8 @@ base_model = "tencent/hy3" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/tencent/hy4-preview.toml b/providers/aimlapi/models/tencent/hy4-preview.toml index 1f9c8e1e2ef..f2c192f0138 100644 --- a/providers/aimlapi/models/tencent/hy4-preview.toml +++ b/providers/aimlapi/models/tencent/hy4-preview.toml @@ -1,5 +1,8 @@ base_model = "tencent/hy4-preview" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/thinkingmachines/inkling-small.toml b/providers/aimlapi/models/thinkingmachines/inkling-small.toml index 49b59ccc4ab..3a1a9503788 100644 --- a/providers/aimlapi/models/thinkingmachines/inkling-small.toml +++ b/providers/aimlapi/models/thinkingmachines/inkling-small.toml @@ -1,5 +1,8 @@ base_model = "thinkingmachines/inkling-small" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/thinkingmachines/inkling.toml b/providers/aimlapi/models/thinkingmachines/inkling.toml index b7eb76e80e5..6c725e601bc 100644 --- a/providers/aimlapi/models/thinkingmachines/inkling.toml +++ b/providers/aimlapi/models/thinkingmachines/inkling.toml @@ -1,5 +1,8 @@ base_model = "thinkingmachines/inkling" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index 54cf36cd103..cc006804314 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -1,6 +1,9 @@ base_model = "xiaomi/mimo-v2.5-pro" name = "MiMo V2.5 Pro" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index 5705bec9a58..a0e595ed4e8 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -1,6 +1,9 @@ base_model = "xiaomi/mimo-v2.5" name = "MiMo V2.5" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "low", "medium", "high"] diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml index 322bdb6b04e..c2e84d5b1b7 100644 --- a/providers/aimlapi/models/z-ai/glm-4.5v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -1,6 +1,9 @@ base_model = "zhipuai/glm-4.5v" name = "GLM 4.5V" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "minimal", "low", "medium", "high"] diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml index 7b33cc0614e..6cc22feeb95 100644 --- a/providers/aimlapi/models/z-ai/glm-4.6v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -1,6 +1,9 @@ base_model = "zhipuai/glm-4.6v" name = "GLM 4.6V" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "minimal", "low", "medium", "high"] diff --git a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml index 37122ccb8b6..5a2ea08d7b5 100644 --- a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml @@ -1,6 +1,9 @@ base_model = "zhipuai/glm-4.7-flash" name = "GLM 4.7 Flash" +[interleaved] +field = "reasoning_details" + [[reasoning_options]] type = "effort" values = ["none", "minimal", "low", "medium", "high"] diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml index e6dbdee9276..c4b31754a2f 100644 --- a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -1,6 +1,9 @@ base_model = "zhipuai/glm-5.3-flash" name = "GLM 5.3 Flash" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" values = ["minimal", "low", "medium", "high", "max"] From 27f8d59ad6fba9966a524a61deb0d4006dbeda7d Mon Sep 17 00:00:00 2001 From: aimlapi Date: Fri, 11 Sep 2026 12:53:36 +0500 Subject: [PATCH 25/38] fix(aimlapi): the base ids have no side channel, measured under forced reasoning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The review asked why `deepseek-chat`, the base `gpt-5.6-luna`/`-sol`/`-terra`, `o1` and `o3-mini` were left out of `INTERLEAVED_FIELD` when their `-pro` siblings got `reasoning_details`. Fair question: the sweep that placed them ran on a light prompt, and "no field" on a prompt the model did not reason on proves nothing. Re-probed with a prompt that forces reasoning and `effort: high`. They reason — `o1` spent 2500 tokens on it, `gpt-5.6-luna` 1023, `-sol` 1142, `-terra` 862 — and the message still carries nothing beside `content`. The count is in `usage`; the text is not exposed. The `-pro` siblings reach OpenRouter, which surfaces a channel; the base ids reach OpenAI natively, which does not. Same family, different link, different wire. `deepseek-chat` is non-thinking by default and produced no reasoning tokens at all, so there is nothing to declare on it either. `deepseek-v4-pro-0813` drops `medium`, measured rather than copied from its sibling: `medium` exhausted a 4000-token budget twice while `high` used 2318. A rung that spends more than the one above it is not a lower rung. The Pro family now reads the same, and for the same reason on each id. Sync: 1 updated. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 13 +++++++++++++ .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index ed46215d987..08c38a60171 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -352,6 +352,10 @@ const MEASURED_EFFORTS: Readonly> = { // lost `low` for it. Two rules for one situation is worse than either rule. // `none` (0 twice) and `low` (4175 against 5662) stay: those are measured. "deepseek/deepseek-v4-pro": ["none", "low", "high"], + // Same cut on the dated snapshot, measured rather than copied: `medium` + // exhausted a 4000-token budget on reasoning twice while `high` used 2318. + // A rung that spends more than the one above it is not a lower rung. + "deepseek/deepseek-v4-pro-0813": ["none", "low", "high"], "openai/o1": ["low", "medium", "high"], "openai/o3-mini": ["low", "medium", "high"], }; @@ -370,6 +374,15 @@ const MEASURED_EFFORTS: Readonly> = { * family: 14 return `reasoning_content`, 44 return `reasoning_details` * alongside `reasoning`. * + * Six ids the review asked about — `deepseek-chat`, the base `gpt-5.6-luna`, + * `-sol` and `-terra`, `o1` and `o3-mini` — return NO side channel, and that + * was re-checked under forced reasoning so it could not be the prompt: `o1` + * spent 2500 reasoning tokens and `gpt-5.6-luna` 1023 with nothing beside + * `content` on the message. The `-pro` siblings that do declare a field reach + * OpenRouter, which exposes one; the base ids reach OpenAI natively, which + * does not. Same family, different link, different wire. `deepseek-chat` is + * non-thinking by default and produced no reasoning tokens at all. + * * Fifteen more return a bare `reasoning`, and two Gemini Flash ids return * `extra_content`. Neither name is in the schema's enum, so those stay unset — * recorded here so the gap reads as known rather than missed. Most of that diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index 1e818b45f05..72279bd276e 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "low", "high"] [cost] input = 2.393196 From 0be1de645889ebb8c54be21b2811ec45ae7938ea Mon Sep 17 00:00:00 2001 From: aimlapi Date: Fri, 11 Sep 2026 13:22:05 +0500 Subject: [PATCH 26/38] refactor(aimlapi): derive ladders from the lab entry, intersected with the host MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adopts the review's baseline rule after seven rounds asking for it. The resolver now reads the lab's own first-party provider entry for the resolved `base_model`, keeps only the rungs this host accepts, and publishes that. A rung the host offers but the lab does not is dropped even where it measured as working. The table that hand-pinned the same outcome for a few ids is deleted; there is one mechanism now, and a re-sync cannot reintroduce a rung the lab does not publish. Three things the rule needed to be correct rather than merely narrow: - **`none` comes back only by measurement.** The lab sets never carry it, so the intersection strips it; `NONE_IS_REAL_OFF` restores it on the eight ids where a probe showed zero reasoning tokens against a non-zero count above, with an invalid value rejected. `deepseek-v4-pro-0813` was measured for this today rather than copied from its sibling: 0 and 0. `claude-sonnet-5` and `qwen3.8-max` stay out on purpose — on one `none` maps to `low`, on the other it never reported a count. - **A dated snapshot borrows its base's ladder.** `deepseek-v4-pro-0813` has no lab entry and was falling through to the host enum, which left it wider than the model it is a copy of. It now strips the date and reads `v4-pro`'s. - **The lab's ladder lives on its provider entry, not the model record.** `models//.toml` has no `reasoning_options`; the first attempt read it and changed nothing. `providers//models/.toml` is the file a reviewer means by "the lab publishes". An empty intersection — every lab rung refused here — keeps the host's enum rather than emitting `[]`, since that would claim no control exists. And `MEASURED_EFFORTS` can still narrow the result for an accepted-but-inert rung, but never widen it past the lab. What this costs is recorded on `labEffortValues` so it can be reversed with evidence in hand: `low` on `deepseek-v4-pro` (4175 reasoning tokens against 5662), `high` on `qwen3.8-max`, `max` on `gemini-3.7-flash` (6585 against 3841 — the largest effect measured anywhere in this file), and `low`/`medium` on `gpt-5-pro`. Callers of those ids lose levels the host honours. The hard-prompt probe the review wanted for `gpt-5-pro` timed out three of three, so the lab set decides it either way. Sync: 22 files. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 190 +++++++++++------- .../aimlapi/models/alibaba/qwen3.8-flash.toml | 2 +- .../aimlapi/models/alibaba/qwen3.8-max.toml | 2 +- .../models/anthropic/claude-fable-5.toml | 2 +- .../models/anthropic/claude-opus-4.5.toml | 2 +- .../models/anthropic/claude-sonnet-4.6.toml | 2 +- .../models/deepseek/deepseek-chat.toml | 3 +- .../deepseek-v4-flash-vision-exp.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- .../models/deepseek/deepseek-v4-pro.toml | 2 +- .../google/gemini-3.1-flash-lite-preview.toml | 2 +- .../gemini-3.1-pro-preview-customtools.toml | 2 +- .../models/google/gemini-3.6-flash.toml | 2 +- .../models/google/gemini-3.7-flash.toml | 2 +- .../models/google/gemini-flash-latest.toml | 2 +- .../aimlapi/models/meta/muse-spark-1.1.toml | 2 +- .../aimlapi/models/meta/muse-spark-1.2.toml | 2 +- .../models/mistralai/mistral-small-2603.toml | 2 +- .../aimlapi/models/openai/gpt-5-pro.toml | 2 +- .../aimlapi/models/sakana/fugu-ultra.toml | 2 +- .../aimlapi/models/z-ai/glm-5.3-flash.toml | 2 +- 22 files changed, 141 insertions(+), 92 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 08c38a60171..e50892efcd6 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -1,3 +1,5 @@ +import { readFileSync } from "node:fs"; +import path from "node:path"; import { z } from "zod"; import type { SyncProvider } from "../index.js"; @@ -171,65 +173,6 @@ const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ * 1M, which the host has since corrected. Kept here so the next reviewer does * not spend the same round on it. */ -/** - * Ladders narrowed to the upstream review's lab/peer baseline. - * - * These are NOT measurements and are deliberately kept out of - * `MEASURED_EFFORTS` so the two are never read as the same kind of claim. The - * review's position is that a relay should publish the control family of the - * model behind it rather than whatever enum this gateway happens to expose, - * and for these ids that is the call being followed. - * - * Every value is intersected with what the host accepts first, which is the - * difference from the table this replaces. That earlier one took the baseline - * verbatim and ended up advertising `max` on DeepSeek V4 and `xhigh` on - * `qwen3.8-max`, both of which answer 400 here — a caller following the - * catalogue collected an error. Nothing below is a value this gateway refuses: - * - * deepseek-v4-* baseline high/max -> `max` refused, so `high` - * deepseek-v4-flash* baseline low/high/max -> `low`, `high` - * qwen3.8-max baseline low/medium/xhigh-> `xhigh` refused, so low/medium - * gpt-5-pro baseline high -> `high` - * - * `alibaba/qwen3.8-max` left too, and for the reason the review gave: the - * forced `low, medium` dropped `high` without ever measuring a rejection of - * it, and `high` answers 200 here and spends its whole budget reasoning. A - * rung that works is not ours to remove. Whether the rungs ORDER is still - * unmeasurable — the model exhausts a 4000-token budget on reasoning and - * times out at 12000 — and `xhigh`, the lab's top rung, answers 400. So the - * id goes back to the host's own enum, which is the only statement anyone can - * actually stand behind for it. - * - * The DeepSeek V4 family was here and is not any more. The review asked for - * the lab set, this table gave it, and the next round objected that doing so - * "removes caller off/lower rungs that the host reportedly accepted" — which - * is what the entry's own note had said it cost. Re-probed on that objection: - * an invalid value is rejected, `none` returns 0 reasoning tokens twice over, - * `low` returns 4175, `medium` 5563 and `high` 5662. A working off path and a - * clear step from `none` to `low` to the pair above it. - * - * `medium` versus `high` is a different question and it is UNSETTLED. The - * review objected to keeping `medium` on "near-identical token counts", which - * was fair on one sample — 5563 against 5662 is under two percent, and the - * same reasoning removed `low` from `gpt-5.4-pro`. Re-probed for that reason, - * `medium` came back 7204: its own spread across runs is thirty percent, an - * order of magnitude wider than the gap being argued about, and `high` timed - * out on three of four attempts so there is nothing to average against. - * - * The two cannot be shown to order and cannot be shown not to. `medium` stays - * because removing a rung the host accepts needs evidence, and noise larger - * than the effect is not evidence — in either direction. - * - * So the ids go back to the host's own set and the baseline no longer - * overrides them. - * - * Where measurement and baseline disagree, this table is the baseline winning - * by decision, not by evidence. `deepseek-v4-pro` orders 4374 -> 4936 reasoning - * tokens between `low` and `high` with the field validated, and `gpt-5-pro` - * ordered 64/256/320 and 128/192 across repeats; both keep fewer rungs here - * than those probes support. Restoring the wider sets means deleting the entry. - */ -const REVIEW_BASELINE_EFFORTS: Readonly> = {}; /** * The OpenAI pro/codex/5.6 batch, probed 2026-09-10 because the review asked @@ -450,6 +393,8 @@ const INTERLEAVED_FIELD: Readonly/.toml` carries name, family and + // capabilities and no `reasoning_options`. So this reads + // `providers//models/.toml`, the same file a reviewer means when + // they say "the lab publishes". + const slash = baseModelID.indexOf("/"); + if (slash === -1) return undefined; + const lab = baseModelID.slice(0, slash); + const name = baseModelID.slice(slash + 1); + // A dated snapshot (`deepseek-v4-pro-0813`) has no lab entry of its own and + // is the same control surface as the model it snapshots, so it borrows that + // entry's ladder rather than falling through to the host's enum — which is + // what left `0813` wider than the sibling it is a copy of. + const candidates = [name, name.replace(/-\d{4}$/, "")].filter( + (candidate, index, all) => all.indexOf(candidate) === index, + ); + let parsed: Record | undefined; + for (const candidate of candidates) { + const file = path.join(PROVIDERS_DIR, lab, "models", `${candidate}.toml`); + try { + parsed = Bun.TOML.parse(readFileSync(file, "utf8")) as Record; + break; + } catch { + /* try the next candidate */ + } + } + if (parsed === undefined) return undefined; + const opts = parsed["reasoning_options"]; + if (!Array.isArray(opts)) return undefined; + const effort = opts.find((o) => o && typeof o === "object" && (o as { type?: unknown }).type === "effort") as + | { values?: unknown } + | undefined; + return Array.isArray(effort?.values) ? (effort!.values as string[]) : undefined; +} + +/** + * `gpt-5-pro` is worth a line here because it was argued over the longest. + * The lab publishes `["high"]`; this host accepts `low` and `medium` too and + * ordered them on a light prompt (64/256/320). The review asked for the same + * on a hard prompt before keeping the extras, and that probe cannot be run: + * every level times out at the gateway on it, three of three. Under the + * intersection the point is moot — the lab set wins and `["high"]` is what + * ships — but the light-prompt ordering is real and is recorded so nobody + * reads the narrower set as a finding that the rungs did nothing. + */ + +/** + * Ids where `reasoning_effort: none` is a measured off switch on this wire — + * zero reasoning tokens against a non-zero count at a higher rung, with an + * invalid value rejected so the field is known to be read. The lab sets never + * carry `none`, so the intersection strips it; this is the only way back in. + * + * NOT here, deliberately: `claude-sonnet-5`, where `none` maps to `low`, and + * `qwen3.8-max`, where it never reported a reasoning count at all. + */ +const NONE_IS_REAL_OFF: ReadonlySet = new Set([ + "deepseek/deepseek-v4-pro", + "deepseek/deepseek-v4-pro-0813", + "openai/gpt-5.3-codex", + "openai/gpt-5.6-luna", + "openai/gpt-5.6-sol", + "openai/gpt-5.6-terra", + "openai/gpt-5.6-terra-pro", + "anthropic/claude-opus-4.7", + "anthropic/claude-opus-4.8", +]); + function baseReasoning(baseModelID: string): boolean { try { return modelMetadata(baseModelID).reasoning === true; @@ -680,7 +710,7 @@ function positive(value: number | null | undefined): number | undefined { * and claude-opus-4.8, and `none` on the gemini flash models. The union across * every occurrence is what the endpoint actually accepts. */ -async function fetchReasoningEffort(id: string): Promise { +async function fetchReasoningEffort(id: string, base: string): Promise { const url = `${DOCS_ENDPOINT}?model=${encodeURIComponent(id)}&endpoint=${encodeURIComponent(CHAT_COMPLETIONS_TYPE)}`; let payload: unknown; try { @@ -693,20 +723,38 @@ async function fetchReasoningEffort(id: string): Promise { if (EFFORT_NOT_HONOURED.has(id) || EFFORT_VALIDATED_BUT_INERT.has(id)) return undefined; - // Baseline first: where the review has overruled the schema for an id, that - // is the published set, and the measured table below is what it overrules. - const baseline = REVIEW_BASELINE_EFFORTS[id]; - if (baseline) return [...baseline]; - - const measured = MEASURED_EFFORTS[id]; - if (measured) return [...measured]; - const found = new Set(); collectReasoningEffortEnums(payload, found); - const values = [...found] + const host = [...found] .filter((value) => EFFORT_RANK.has(value)) .sort((a, b) => EFFORT_RANK.get(a)! - EFFORT_RANK.get(b)!); + if (host.length === 0) return undefined; + + // The relay baseline: what the lab publishes for this model, kept only where + // this host accepts it. A rung the host offers but the lab does not is + // dropped even when it measures as working — that is the doctrine, and the + // cost of it is written up on `labEffortValues`. + const lab = labEffortValues(base); + let values = host; + if (lab !== undefined && lab.length > 0) { + const shared = host.filter((value) => lab.includes(value)); + // An empty intersection means the lab's rungs are all refused here. That + // is not "no control", so the host's own enum stands rather than `[]`. + values = shared.length > 0 ? shared : host; + } + + // `none` is ours, not the lab's, so the intersection strips it. It comes + // back only where a probe showed it is a real off switch on this wire. + if (host.includes("none") && NONE_IS_REAL_OFF.has(id) && !values.includes("none")) { + values = ["none", ...values]; + } + + // A measurement may narrow the result further — an accepted rung that turns + // out inert — but never widen it past the lab. + const measured = MEASURED_EFFORTS[id]; + if (measured) values = values.filter((value) => measured.includes(value)); + return values.length > 0 ? values : undefined; } @@ -747,7 +795,9 @@ async function attachReasoningEffort(models: AimlapiModel[]): Promise { while (cursor < pending.length) { const model = pending[cursor++]; if (model === undefined) return; - model.reasoningEffort = await fetchReasoningEffort(model.id); + const base = baseModelFor(model.id); + if (base === undefined) continue; + model.reasoningEffort = await fetchReasoningEffort(model.id, base); } }); await Promise.all(workers); diff --git a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml index af93f1ec422..72dd3bc6871 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-flash.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-flash.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium"] [cost] input = 0.208 diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max.toml b/providers/aimlapi/models/alibaba/qwen3.8-max.toml index 1346ef93d77..56fbe364cfa 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-max.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["low", "medium"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.toml b/providers/aimlapi/models/anthropic/claude-fable-5.toml index c5ac3b91734..c5ea100ab0e 100644 --- a/providers/aimlapi/models/anthropic/claude-fable-5.toml +++ b/providers/aimlapi/models/anthropic/claude-fable-5.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 13 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml index e1b3ddadf2c..2019df716b4 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.5.toml @@ -3,7 +3,7 @@ name = "Claude 4.5 Opus" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml index 49d166839f7..a929c1d796d 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.6.toml @@ -3,7 +3,7 @@ name = "Claude 4.6 Sonnet" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high", "max"] +values = ["low", "medium", "high", "max"] [cost] input = 4.1262 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index b26c6654ff1..82a67209859 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -2,10 +2,9 @@ base_model = "deepseek/deepseek-v4-flash" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "high"] [cost] input = 0.39 output = 1.56 cache_read = 0.0078 - diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index 27bda929f2b..926fd9d6bd2 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "high"] [cost] input = 0.572 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 90d9cc0e30f..1c439734105 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "high"] [cost] input = 0.39 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index 72279bd276e..e9a8290396f 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "high"] +values = ["none", "high"] [cost] input = 2.393196 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 1bb10b668f1..f89b20b1e84 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "high"] +values = ["none", "high"] [cost] input = 0.5655 diff --git a/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml b/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml index d47918d2ae7..fca57f817b8 100644 --- a/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml +++ b/providers/aimlapi/models/google/gemini-3.1-flash-lite-preview.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.34385 diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml index 2df0c423f72..f4465ebdf4e 100644 --- a/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview-customtools.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 2.7508 diff --git a/providers/aimlapi/models/google/gemini-3.6-flash.toml b/providers/aimlapi/models/google/gemini-3.6-flash.toml index 25ed6371a38..cbb95c0086e 100644 --- a/providers/aimlapi/models/google/gemini-3.6-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.6-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.6-flash" [[reasoning_options]] type = "effort" -values = ["minimal", "low", "medium", "high", "max"] +values = ["minimal", "low", "medium", "high"] [cost] input = 1.95 diff --git a/providers/aimlapi/models/google/gemini-3.7-flash.toml b/providers/aimlapi/models/google/gemini-3.7-flash.toml index 5ef5580dff2..ca994263e13 100644 --- a/providers/aimlapi/models/google/gemini-3.7-flash.toml +++ b/providers/aimlapi/models/google/gemini-3.7-flash.toml @@ -2,7 +2,7 @@ base_model = "google/gemini-3.7-flash" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high", "max"] +values = ["low", "medium", "high"] [cost] input = 0.975 diff --git a/providers/aimlapi/models/google/gemini-flash-latest.toml b/providers/aimlapi/models/google/gemini-flash-latest.toml index 985f8df4c7e..99fc46d49b8 100644 --- a/providers/aimlapi/models/google/gemini-flash-latest.toml +++ b/providers/aimlapi/models/google/gemini-flash-latest.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 2.0631 diff --git a/providers/aimlapi/models/meta/muse-spark-1.1.toml b/providers/aimlapi/models/meta/muse-spark-1.1.toml index 2e79f47e967..62f1ab851c0 100644 --- a/providers/aimlapi/models/meta/muse-spark-1.1.toml +++ b/providers/aimlapi/models/meta/muse-spark-1.1.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.71925 diff --git a/providers/aimlapi/models/meta/muse-spark-1.2.toml b/providers/aimlapi/models/meta/muse-spark-1.2.toml index 183ea0b86ee..049015208c0 100644 --- a/providers/aimlapi/models/meta/muse-spark-1.2.toml +++ b/providers/aimlapi/models/meta/muse-spark-1.2.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.71925 diff --git a/providers/aimlapi/models/mistralai/mistral-small-2603.toml b/providers/aimlapi/models/mistralai/mistral-small-2603.toml index 07eda419e07..1186ce660e0 100644 --- a/providers/aimlapi/models/mistralai/mistral-small-2603.toml +++ b/providers/aimlapi/models/mistralai/mistral-small-2603.toml @@ -3,7 +3,7 @@ name = "Small 4" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["none", "high"] [cost] input = 0.257888 diff --git a/providers/aimlapi/models/openai/gpt-5-pro.toml b/providers/aimlapi/models/openai/gpt-5-pro.toml index 221b15cd519..53f5d36b39f 100644 --- a/providers/aimlapi/models/openai/gpt-5-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5-pro.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["high"] [cost] input = 20.631 diff --git a/providers/aimlapi/models/sakana/fugu-ultra.toml b/providers/aimlapi/models/sakana/fugu-ultra.toml index f14cb9af343..585cbf492e0 100644 --- a/providers/aimlapi/models/sakana/fugu-ultra.toml +++ b/providers/aimlapi/models/sakana/fugu-ultra.toml @@ -2,7 +2,7 @@ base_model = "sakana/fugu-ultra" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["high"] [cost] input = 6.877 diff --git a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml index c4b31754a2f..b17a00ac81b 100644 --- a/providers/aimlapi/models/z-ai/glm-5.3-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-5.3-flash.toml @@ -6,7 +6,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["minimal", "low", "medium", "high", "max"] +values = ["low", "high", "max"] [cost] input = 0.195 From 86eeb0a726cc0c1bfaa97b80345ce3118608f13e Mon Sep 17 00:00:00 2001 From: aimlapi Date: Fri, 11 Sep 2026 13:52:15 +0500 Subject: [PATCH 27/38] fix(aimlapi): close the two holes the review found in the doctrine, and test it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The last round reviewed the intersection itself rather than its outputs, and found two things wrong with it. **The lab lookup used the wrong directory for two labs.** `base_model` is spelled with the metadata lab (`zhipuai/glm-4.7-flash`, `meta/...`) while a lab's ladder lives under its provider directory (`providers/zai`, `providers/llama`). For every GLM and Meta id the lookup missed, returned `undefined`, and the host enum stood as if the lab had agreed to it. Now resolved through the same table the OpenRouter sync uses, exported as `providerDirForMetadataLab`. **Flash lost its off switch.** The intersection strips `none` and restores it only by measurement, and Flash had not been measured — only Pro. Measured now by the strongest signal available, the side channel itself: `none` returns an empty `reasoning_content` where `high` returns 23469 characters on `v4-flash` and 12826 on `vision-exp`. Both are back. On this link `reasoning_tokens` is absent rather than 0 under `none`, which is why the count alone could not call it and why the same shape stayed unclaimed on `qwen3.8-max`. The `none` rule now applies whether or not a lab ladder existed to intersect with: a host-only enum is not a licence to advertise an off switch nobody measured. Thirty files lose an unmeasured `none`; the eleven measured or lab-listed keep it. Fixing the lookup exposed 14 ids whose lab has toggle or budget and no effort ladder at all, where the host enum had been passing through unexamined. Probed each with an invalid value, `low` and `high`: - `glm-4.7-flash` validates and does not order — `low` 2149 to `high` 1533 — so it joins `kimi-k2-thinking` as validated-but-inert and publishes `[]`, which is also what its lab says. - `gemini-2.5-flash-lite` orders 863 to 2399, and `qwen3.6-27b`, `qwen3.7-max` and `qwen3.6-35b-a3b` map `low`/`medium` onto the lab's own thinking budget — the gateway answers "must be greater than thinking_budget [8192]" and "[32768]" when max_tokens is below them, which reads like a refusal and is its opposite. These keep the host enum as `HOST_EFFORT_LIVE`. - Six more validate and reason under `low` but timed out at `high`, so no ordering could be taken. They keep the host enum and are named as pending; `[]` would say a working field does not exist. - `sakana/sakana-namazu` answers 404 to everything including the no-effort control — "0 endpoints out of 1 requested are available" — and moves to `NOT_CALLABLE`, file deleted. The intersection is extracted as a pure `resolveLadder(id, base, host)` and covered by nine tests: the lab-directory mapping, the dated-snapshot borrow, toggle-only labs yielding no ladder, the intersection dropping accepted rungs, `none` surviving only by measurement or lab listing, an empty intersection keeping the host enum, and a measurement narrowing without widening. Breaking the directory mapping fails the test that pins it. The four failures elsewhere in the suite fail identically on the untouched base. Sync: 34 files. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 103 +++++++++++++++--- .../core/src/sync/providers/openrouter.ts | 17 +++ packages/core/test/aimlapi.test.ts | 63 +++++++++++ .../aimlapi/models/alibaba/qwen3.5-flash.toml | 2 +- .../aimlapi/models/alibaba/qwen3.6-27b.toml | 2 +- .../models/alibaba/qwen3.6-35b-a3b.toml | 2 +- .../models/alibaba/qwen3.6-max-preview.toml | 2 +- .../aimlapi/models/alibaba/qwen3.7-max.toml | 2 +- .../aimlapi/models/alibaba/qwen3.8-27b.toml | 2 +- .../models/anthropic/claude-haiku-4.5.toml | 2 +- .../models/anthropic/claude-opus-4.1.toml | 2 +- .../models/anthropic/claude-sonnet-4.5.toml | 2 +- .../models/bytedance-seed/seed-2.0-code.toml | 2 +- .../models/bytedance-seed/seed-2.0-lite.toml | 2 +- .../models/bytedance-seed/seed-2.0-mini.toml | 2 +- .../deepseek-v4-flash-vision-exp.toml | 2 +- .../models/deepseek/deepseek-v4-flash.toml | 2 +- .../models/google/gemini-2.5-flash-lite.toml | 2 +- .../aimlapi/models/google/gemma-4-31b-it.toml | 2 +- .../inclusionai/ling-3.0-flash-fin.toml | 2 +- .../aimlapi/models/meta/muse-glimmer-30b.toml | 2 +- .../models/openai/gpt-5.1-codex-max.toml | 2 +- .../models/openai/gpt-5.1-codex-mini.toml | 2 +- .../aimlapi/models/poolside/laguna-s-2.1.toml | 2 +- .../models/poolside/laguna-xs-2.1.toml | 2 +- .../aimlapi/models/sakana/sakana-namazu.toml | 10 -- providers/aimlapi/models/tencent/hy3.toml | 2 +- .../aimlapi/models/tencent/hy4-preview.toml | 2 +- .../thinkingmachines/inkling-small.toml | 2 +- .../models/thinkingmachines/inkling.toml | 2 +- .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 2 +- .../aimlapi/models/xiaomi/mimo-v2.5.toml | 2 +- providers/aimlapi/models/z-ai/glm-4.5v.toml | 2 +- providers/aimlapi/models/z-ai/glm-4.6v.toml | 2 +- .../aimlapi/models/z-ai/glm-4.7-flash.toml | 5 +- 35 files changed, 196 insertions(+), 62 deletions(-) create mode 100644 packages/core/test/aimlapi.test.ts delete mode 100644 providers/aimlapi/models/sakana/sakana-namazu.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index e50892efcd6..3f325c7c6a6 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -3,7 +3,12 @@ import path from "node:path"; import { z } from "zod"; import type { SyncProvider } from "../index.js"; -import { factorBaseModel, modelMetadata, resolveModelMetadataBaseModel } from "./openrouter.js"; +import { + factorBaseModel, + modelMetadata, + providerDirForMetadataLab, + resolveModelMetadataBaseModel, +} from "./openrouter.js"; // The public catalog needs no key, and `include` is what turns on the pricing // and modality blocks this sync depends on. @@ -89,6 +94,11 @@ const NOT_CALLABLE: ReadonlySet = new Set([ // id among them) and `/docs-json` answers 404 for it, so there is nothing // left to describe. The host's own deprecation record calls both withdrawn. "anthropic/claude-opus-4.8-fast", + // 2026-09-11: answers 404 to every request including the no-effort control — + // "0 endpoints out of 1 requested are available matching your guardrail + // restrictions and data policy", an OpenRouter refusal passed straight + // through. Found while probing its ladder; the ladder is moot. + "sakana/sakana-namazu", ]); /** @@ -137,6 +147,11 @@ const NOT_CALLABLE: ReadonlySet = new Set([ */ const EFFORT_VALIDATED_BUT_INERT: ReadonlySet = new Set([ "moonshotai/kimi-k2-thinking", + // 2026-09-11: an invalid value is rejected, and then `low` spends 2149 + // reasoning tokens to `high`'s 1533 with unset at 1801 between them. The + // lab publishes toggle only for this id, which the wire agrees with: there + // is thinking, and nothing the caller sends steers how much. + "z-ai/glm-4.7-flash", ]); const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ @@ -598,7 +613,7 @@ function baseModelFor(id: string): string | undefined { * What the doctrine buys is that re-sync cannot reintroduce a rung the lab * does not publish, and that this provider reads like its peers. */ -function labEffortValues(baseModelID: string): readonly string[] | undefined { +export function labEffortValues(baseModelID: string): readonly string[] | undefined { // The lab's ladder lives on its first-party PROVIDER entry, not on the // shared model record: `models//.toml` carries name, family and // capabilities and no `reasoning_options`. So this reads @@ -606,7 +621,11 @@ function labEffortValues(baseModelID: string): readonly string[] | undefined { // they say "the lab publishes". const slash = baseModelID.indexOf("/"); if (slash === -1) return undefined; - const lab = baseModelID.slice(0, slash); + // `base_model` names the METADATA lab; the ladder is under the PROVIDER + // directory, and for `zhipuai` -> `zai`, `meta` -> `llama` those differ. + // The first version of this lookup assumed they matched and silently kept + // the host enum for every GLM id — the review caught it from the TOMLs. + const lab = providerDirForMetadataLab(baseModelID.slice(0, slash)); const name = baseModelID.slice(slash + 1); // A dated snapshot (`deepseek-v4-pro-0813`) has no lab entry of its own and // is the same control surface as the model it snapshots, so it borrows that @@ -645,6 +664,38 @@ function labEffortValues(baseModelID: string): readonly string[] | undefined { * reads the narrower set as a finding that the rungs did nothing. */ +/** + * Ids whose lab entry has reasoning options but NO effort ladder — toggle or + * budget only — and whose `reasoning_effort` on this host was measured to be + * a live control anyway. The intersection has nothing to intersect with here, + * so this list is what stands between "the host's enum" and "an invented + * ladder": an id is on it only with an invalid value rejected AND either an + * ordering or a mapping onto the lab's own control. + * + * gemini-2.5-flash-lite low 863 -> high 2399 reasoning tokens + * qwen3.6-27b, qwen3.7-max, qwen3.6-35b-a3b + * `low`/`medium` map onto the lab's thinking + * budget: the gateway answers "must be greater than + * thinking_budget [8192]" / "[32768]" when + * max_tokens is below them. That reads like a + * refused rung and is the opposite — the effort + * name IS the budget tier, which is the lab's own + * control under the host's spelling. + * + * Still unresolved and left on the host's enum rather than flipped to `[]`: + * `glm-4.5v`, `glm-4.6v`, `gemma-4-31b-it`, `qwen3.6-max-preview`, + * `mimo-v2.5`, `mimo-v2.5-pro`. On each the field validates and `low` alone + * reasons (2500 tokens, capped), but `high` timed out at the gateway so no + * ordering could be taken. `[]` would tell callers a working field does not + * exist, which is the one claim the evidence rules out. + */ +const HOST_EFFORT_LIVE: ReadonlySet = new Set([ + "google/gemini-2.5-flash-lite", + "alibaba/qwen3.6-27b", + "alibaba/qwen3.7-max", + "alibaba/qwen3.6-35b-a3b", +]); + /** * Ids where `reasoning_effort: none` is a measured off switch on this wire — * zero reasoning tokens against a non-zero count at a higher rung, with an @@ -657,6 +708,13 @@ function labEffortValues(baseModelID: string): readonly string[] | undefined { const NONE_IS_REAL_OFF: ReadonlySet = new Set([ "deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-pro-0813", + // Flash measured by the strongest signal there is, the side channel itself: + // `none` returns an EMPTY `reasoning_content` where `high` returns 23469 + // characters on `v4-flash` and 12826 on `vision-exp`. `reasoning_tokens` is + // absent rather than 0 on this link, which is why the count alone was not + // enough to call it — the same shape was left unclaimed on `qwen3.8-max`. + "deepseek/deepseek-v4-flash", + "deepseek/deepseek-v4-flash-vision-exp", "openai/gpt-5.3-codex", "openai/gpt-5.6-luna", "openai/gpt-5.6-sol", @@ -731,27 +789,36 @@ async function fetchReasoningEffort(id: string, base: string): Promise EFFORT_RANK.get(a)! - EFFORT_RANK.get(b)!); if (host.length === 0) return undefined; - // The relay baseline: what the lab publishes for this model, kept only where - // this host accepts it. A rung the host offers but the lab does not is - // dropped even when it measures as working — that is the doctrine, and the - // cost of it is written up on `labEffortValues`. + return resolveLadder(id, base, host); +} + +/** + * The published ladder for `id`, given the rungs its host schema accepts. + * Pure, so the rules can be tested without the network: + * + * 1. Intersect with the lab's own ladder where it has one. A rung the host + * offers but the lab does not is dropped even when it measures as working + * — that is the doctrine, costed on `labEffortValues`. An empty + * intersection keeps the host enum: it means the lab's rungs are refused + * here, not that no control exists. + * 2. `none` is ours, not the lab's: kept only where the lab lists it or a + * probe showed a real off switch (`NONE_IS_REAL_OFF`), lab ladder or not. + * 3. A measurement may narrow the result — an accepted rung that turns out + * inert — but never widen it past the lab. + */ +export function resolveLadder(id: string, base: string, host: readonly string[]): string[] | undefined { const lab = labEffortValues(base); - let values = host; + let values = [...host]; if (lab !== undefined && lab.length > 0) { const shared = host.filter((value) => lab.includes(value)); - // An empty intersection means the lab's rungs are all refused here. That - // is not "no control", so the host's own enum stands rather than `[]`. - values = shared.length > 0 ? shared : host; + values = shared.length > 0 ? shared : [...host]; } - // `none` is ours, not the lab's, so the intersection strips it. It comes - // back only where a probe showed it is a real off switch on this wire. - if (host.includes("none") && NONE_IS_REAL_OFF.has(id) && !values.includes("none")) { - values = ["none", ...values]; - } + const labListsNone = lab !== undefined && lab.includes("none"); + const noneAllowed = labListsNone || NONE_IS_REAL_OFF.has(id); + if (!noneAllowed) values = values.filter((value) => value !== "none"); + else if (host.includes("none") && !values.includes("none")) values = ["none", ...values]; - // A measurement may narrow the result further — an accepted rung that turns - // out inert — but never widen it past the lab. const measured = MEASURED_EFFORTS[id]; if (measured) values = values.filter((value) => measured.includes(value)); diff --git a/packages/core/src/sync/providers/openrouter.ts b/packages/core/src/sync/providers/openrouter.ts index 82a9cfc76b5..0616fa974c9 100644 --- a/packages/core/src/sync/providers/openrouter.ts +++ b/packages/core/src/sync/providers/openrouter.ts @@ -51,6 +51,23 @@ const CANONICAL_PROVIDER_PREFIXES = { "zai-org": { provider: "zai", metadata: "zhipuai" }, } as const; +/** + * The first-party provider directory for a metadata lab id. + * + * `base_model` ids are spelled with the METADATA lab (`zhipuai/glm-4.7-flash`, + * `meta/llama-...`) while a lab's own reasoning ladder lives under its + * PROVIDER directory (`providers/zai`, `providers/llama`). The two coincide for + * most labs and not for these, and a lookup that assumes they coincide fails + * silently — the caller falls back to whatever it had, which for a relay means + * publishing the host's enum as if it were the lab's. + */ +export function providerDirForMetadataLab(metadata: string): string { + for (const entry of Object.values(CANONICAL_PROVIDER_PREFIXES)) { + if (entry.metadata === metadata) return entry.provider; + } + return metadata; +} + export const OpenRouterModel = z.object({ id: z.string(), name: z.string(), diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts new file mode 100644 index 00000000000..4f741e45247 --- /dev/null +++ b/packages/core/test/aimlapi.test.ts @@ -0,0 +1,63 @@ +import { expect, test } from "bun:test"; + +import { labEffortValues, resolveLadder } from "../src/sync/providers/aimlapi.js"; +import { providerDirForMetadataLab } from "../src/sync/providers/openrouter.js"; + +// The lookup that silently kept the host enum for every GLM id: `base_model` +// names the metadata lab, the ladder lives under the provider directory, and +// for these two they differ. +test("maps a metadata lab to its first-party provider directory", () => { + expect(providerDirForMetadataLab("zhipuai")).toBe("zai"); + expect(providerDirForMetadataLab("meta")).toBe("llama"); + expect(providerDirForMetadataLab("deepseek")).toBe("deepseek"); + expect(providerDirForMetadataLab("no-such-lab")).toBe("no-such-lab"); +}); + +test("reads the lab ladder through the provider directory, not the model record", () => { + // `models/zhipuai/*.toml` has no reasoning_options; `providers/zai/models` + // does. A lookup on the wrong one returns undefined and looks like "no lab + // ladder", which is a different claim. + expect(labEffortValues("zhipuai/glm-5.3-flash")).toEqual(["low", "high", "max"]); + expect(labEffortValues("deepseek/deepseek-v4-pro")).toEqual(["high", "max"]); +}); + +test("a dated snapshot borrows the ladder of the model it snapshots", () => { + // There is no `deepseek-v4-pro-0813.toml` in the lab; without the borrow it + // fell through to the host enum and came out wider than its own base. + expect(labEffortValues("deepseek/deepseek-v4-pro-0813")).toEqual(labEffortValues("deepseek/deepseek-v4-pro")); +}); + +test("a lab entry with toggle only and no effort ladder yields undefined", () => { + expect(labEffortValues("zhipuai/glm-4.7-flash")).toBeUndefined(); +}); + +const HOST = ["none", "low", "medium", "high"] as const; + +test("intersects the host enum with the lab ladder and drops the rest", () => { + // lab high/max, host none..high: `low` and `medium` go although the host + // accepts them — that is the doctrine, and this test pins its cost. + expect(resolveLadder("deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-pro", HOST)).toEqual(["none", "high"]); +}); + +test("`none` survives only where measured as a real off switch", () => { + // Same lab, same host enum; only the measurement differs. + expect(resolveLadder("deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-pro", HOST)).toContain("none"); + expect(resolveLadder("alibaba/qwen3.7-max", "alibaba/qwen3.7-max", HOST)).not.toContain("none"); +}); + +test("`none` is kept where the lab itself lists it", () => { + const host = ["none", "low", "medium", "high"]; + expect(resolveLadder("openai/gpt-5.6-luna", "openai/gpt-5.6-luna", host)).toContain("none"); +}); + +test("an empty intersection keeps the host enum rather than claiming no control", () => { + // Every lab rung refused here: publishing `[]` would say the field does not + // exist, which is the one thing the host's enum rules out. + const host = ["low", "medium"]; + expect(resolveLadder("some/model", "deepseek/deepseek-v4-pro", host)).toEqual(["low", "medium"]); +}); + +test("a measurement narrows but never widens past the lab", () => { + // gpt-5.4-pro: lab medium/high/xhigh, host low/medium/high, measured medium/high. + expect(resolveLadder("openai/gpt-5.4-pro", "openai/gpt-5.4-pro", ["low", "medium", "high"])).toEqual(["medium", "high"]); +}); diff --git a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml index bc117fd1659..5d1fccecb27 100644 --- a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml +++ b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.13 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml index 938f8464df0..a4b32755a1d 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.78 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml index b28a55cbac3..8835d450c25 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml @@ -6,7 +6,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.4875 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml index 28cd7bbaab4..4fccc66f5d2 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.65 diff --git a/providers/aimlapi/models/alibaba/qwen3.7-max.toml b/providers/aimlapi/models/alibaba/qwen3.7-max.toml index 20672a52eeb..0e4d7bc7c02 100644 --- a/providers/aimlapi/models/alibaba/qwen3.7-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.7-max.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 2.6 diff --git a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml index 0ec7f7560c1..112360fd2c7 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.61893 diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml index df16e6a71c4..59d50d08e8a 100644 --- a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml @@ -3,7 +3,7 @@ name = "Claude 4.5 Haiku" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.3754 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml index 28bc3bb05d3..131fd5240fd 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml @@ -3,7 +3,7 @@ name = "Claude 4.1 Opus" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 20.631 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml index 9adbad827e1..6891b3b1c44 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml @@ -3,7 +3,7 @@ name = "Claude 4.5 Sonnet" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 4.1262 diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml index f6e9da03e50..7686d164300 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-code.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.6877 diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml index 3dc16b2b148..ef3d8d0d0b7 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-lite.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.34385 diff --git a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml index 4a447544643..44bd5bec985 100644 --- a/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml +++ b/providers/aimlapi/models/bytedance-seed/seed-2.0-mini.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.13754 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index 926fd9d6bd2..2c44fe4247b 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["low", "high"] +values = ["none", "low", "high"] [cost] input = 0.572 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 1c439734105..9e04e0bd098 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["low", "high"] +values = ["none", "low", "high"] [cost] input = 0.39 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index c5e154f08c6..758bb67d9c3 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -3,7 +3,7 @@ name = "Gemini 2.5 Flash Lite Preview" [[reasoning_options]] type = "effort" -values = ["none", "minimal", "low", "medium", "high", "max"] +values = ["minimal", "low", "medium", "high", "max"] [cost] input = 0.0975 diff --git a/providers/aimlapi/models/google/gemma-4-31b-it.toml b/providers/aimlapi/models/google/gemma-4-31b-it.toml index 39cd1775d61..a4a1c61c401 100644 --- a/providers/aimlapi/models/google/gemma-4-31b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-31b-it.toml @@ -3,7 +3,7 @@ name = "Gemma 4 31B Instruct" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.361646 diff --git a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml index d0316e5bcf4..25e4b5b3014 100644 --- a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml +++ b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.082524 diff --git a/providers/aimlapi/models/meta/muse-glimmer-30b.toml b/providers/aimlapi/models/meta/muse-glimmer-30b.toml index 2d20340d6cc..25a525a4ded 100644 --- a/providers/aimlapi/models/meta/muse-glimmer-30b.toml +++ b/providers/aimlapi/models/meta/muse-glimmer-30b.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.48139 diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml index e4b37166a87..3abda7bb2ef 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-max.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 3.4385 diff --git a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml index 57542d64d25..dccf0944ca6 100644 --- a/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml +++ b/providers/aimlapi/models/openai/gpt-5.1-codex-mini.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.34385 diff --git a/providers/aimlapi/models/poolside/laguna-s-2.1.toml b/providers/aimlapi/models/poolside/laguna-s-2.1.toml index 889f39c7dfc..93dba526d94 100644 --- a/providers/aimlapi/models/poolside/laguna-s-2.1.toml +++ b/providers/aimlapi/models/poolside/laguna-s-2.1.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.123786 diff --git a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml index 9142f958fca..87ab65b13a5 100644 --- a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml +++ b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.082524 diff --git a/providers/aimlapi/models/sakana/sakana-namazu.toml b/providers/aimlapi/models/sakana/sakana-namazu.toml deleted file mode 100644 index 0910a71e8c8..00000000000 --- a/providers/aimlapi/models/sakana/sakana-namazu.toml +++ /dev/null @@ -1,10 +0,0 @@ -base_model = "sakana/sakana-namazu" - -[[reasoning_options]] -type = "effort" -values = ["none", "low", "medium", "high"] - -[cost] -input = 1.30663 -output = 5.5016 -cache_read = 0.20631 diff --git a/providers/aimlapi/models/tencent/hy3.toml b/providers/aimlapi/models/tencent/hy3.toml index 2bcbab7ea8e..9554e70d673 100644 --- a/providers/aimlapi/models/tencent/hy3.toml +++ b/providers/aimlapi/models/tencent/hy3.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.27508 diff --git a/providers/aimlapi/models/tencent/hy4-preview.toml b/providers/aimlapi/models/tencent/hy4-preview.toml index f2c192f0138..c8450b50862 100644 --- a/providers/aimlapi/models/tencent/hy4-preview.toml +++ b/providers/aimlapi/models/tencent/hy4-preview.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.147084 diff --git a/providers/aimlapi/models/thinkingmachines/inkling-small.toml b/providers/aimlapi/models/thinkingmachines/inkling-small.toml index 3a1a9503788..eb41ee89285 100644 --- a/providers/aimlapi/models/thinkingmachines/inkling-small.toml +++ b/providers/aimlapi/models/thinkingmachines/inkling-small.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.797732 diff --git a/providers/aimlapi/models/thinkingmachines/inkling.toml b/providers/aimlapi/models/thinkingmachines/inkling.toml index 6c725e601bc..5ec8e4b621d 100644 --- a/providers/aimlapi/models/thinkingmachines/inkling.toml +++ b/providers/aimlapi/models/thinkingmachines/inkling.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 1.3754 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index cc006804314..f63b76557cb 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.598299 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index a0e595ed4e8..e308c95c0a2 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "low", "medium", "high"] +values = ["low", "medium", "high"] [cost] input = 0.192556 diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml index c2e84d5b1b7..658d83c7155 100644 --- a/providers/aimlapi/models/z-ai/glm-4.5v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "minimal", "low", "medium", "high"] +values = ["minimal", "low", "medium", "high"] [cost] input = 0.82524 diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml index 6cc22feeb95..5522406bdf4 100644 --- a/providers/aimlapi/models/z-ai/glm-4.6v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "minimal", "low", "medium", "high"] +values = ["minimal", "low", "medium", "high"] [cost] input = 0.41262 diff --git a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml index 5a2ea08d7b5..597263a8515 100644 --- a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml @@ -1,13 +1,10 @@ base_model = "zhipuai/glm-4.7-flash" name = "GLM 4.7 Flash" +reasoning_options = [] [interleaved] field = "reasoning_details" -[[reasoning_options]] -type = "effort" -values = ["none", "minimal", "low", "medium", "high"] - [cost] input = 0.171925 output = 0.6877 From 2a27bbb4537d6b45a4c745b61724c0655d63731d Mon Sep 17 00:00:00 2001 From: aimlapi Date: Fri, 11 Sep 2026 14:10:40 +0500 Subject: [PATCH 28/38] fix(aimlapi): wire the allowlist that was never referenced, and settle the toggle-only labs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The review read the resolver and found `HOST_EFFORT_LIVE` declared and never used. It was right: the toggle-only branch fell through to the host enum for all fourteen ids, not the four the list named, and the test for that branch checked `labEffortValues` rather than `resolveLadder`, so it could not notice. The resolver now distinguishes what the lab actually said, because the doctrine — do not contradict the lab — reads differently in each case: - **The lab publishes an effort ladder.** Intersect. An empty intersection is a contradiction, so the model is unresolved rather than shipped with the host's rungs under the lab's name. This replaces the earlier "keep the host enum" fallback, and the test that pinned that fallback is replaced too. - **The lab publishes toggle or budget and no ladder.** A host effort enum contradicts it, so it ships only where a probe showed the host's field is a live, host-native control; otherwise the model is unresolved. `HOST_EFFORT_LIVE` is that gate and is now on the path. Breaking it fails the new test. - **The lab has no entry for the model.** Nothing to contradict, so the host's enum stands. "Invented relative to the lab" needs a lab; 24 ids are here and are left alone on purpose. Unresolved means skipped for a reasoner in this sync, which would have removed eight models including two Anthropic ones. Rather than drop them blind, each was measured on two repeats of `low`/`high` with the field validated, on a prompt light enough for `high` to finish. Seven show no ordering at all — `haiku-4.5` 188/182 vs 179/185, `qwen3.6-max-preview` with `high` below `low` both times, `gemma-4-31b-it` and `mimo-v2.5-pro` reporting a reasoning count of 1 and 0 at every rung, `mimo-v2.5`, `glm-4.5v`, `glm-4.6v` overlapping. They join `EFFORT_VALIDATED_BUT_INERT` and publish `[]`, which is also what their labs say. `claude-sonnet-4.5` alone has a direction, 184/183 vs 220/210, but a thirty-token delta on a model the host's own middleware lists as effort-unsupported is not enough to contradict a toggle-only lab; it takes `[]` with the rest and the numbers stay so it can be revisited. Nothing with a toggle-only lab is left on the host's enum without a probe behind it. The catalogue keeps all 109 models. Eleven tests, including the toggle-only fallthrough the review asked for and the empty-intersection case. Sync: 8 updated. `validate` exits 0. --- packages/core/src/sync/providers/aimlapi.ts | 86 +++++++++++++++---- packages/core/test/aimlapi.test.ts | 29 +++++-- .../models/alibaba/qwen3.6-max-preview.toml | 5 +- .../models/anthropic/claude-haiku-4.5.toml | 5 +- .../models/anthropic/claude-sonnet-4.5.toml | 5 +- .../aimlapi/models/google/gemma-4-31b-it.toml | 5 +- .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 5 +- .../aimlapi/models/xiaomi/mimo-v2.5.toml | 5 +- providers/aimlapi/models/z-ai/glm-4.5v.toml | 5 +- providers/aimlapi/models/z-ai/glm-4.6v.toml | 5 +- 10 files changed, 101 insertions(+), 54 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 3f325c7c6a6..5b81153ed76 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -152,6 +152,28 @@ const EFFORT_VALIDATED_BUT_INERT: ReadonlySet = new Set([ // lab publishes toggle only for this id, which the wire agrees with: there // is thinking, and nothing the caller sends steers how much. "z-ai/glm-4.7-flash", + // The other toggle-only labs, 2026-09-11, each on two repeats of low/high + // with the field validated. None orders, and the wire agrees with the lab: + // claude-haiku-4.5 188/182 vs 179/185 + // qwen3.6-max-preview 574/580 vs 552/554 (high below low, both times) + // gemma-4-31b-it reasoning count 1 at every rung + // mimo-v2.5-pro reasoning count 0 at every rung + // mimo-v2.5 307/234 vs 104/235 + // glm-4.5v 614/680 vs 641/643 + // glm-4.6v 191/116 vs 123/109 + // `claude-sonnet-4.5` is the one with a direction — 184/183 vs 220/210 — + // but a thirty-token delta on a model the host's own middleware lists as + // effort-unsupported (`strip-unsupported-effort.ts`) is not evidence + // enough to contradict a lab that publishes toggle only. Recorded so it can + // be revisited; it takes `[]` with the rest. + "anthropic/claude-haiku-4.5", + "anthropic/claude-sonnet-4.5", + "alibaba/qwen3.6-max-preview", + "google/gemma-4-31b-it", + "xiaomi/mimo-v2.5-pro", + "xiaomi/mimo-v2.5", + "z-ai/glm-4.5v", + "z-ai/glm-4.6v", ]); const EFFORT_NOT_HONOURED: ReadonlySet = new Set([ @@ -613,14 +635,25 @@ function baseModelFor(id: string): string | undefined { * What the doctrine buys is that re-sync cannot reintroduce a rung the lab * does not publish, and that this provider reads like its peers. */ +/** What the lab's provider entry says about effort, three ways. */ +export type LabLadder = + | { kind: "effort"; values: readonly string[] } + | { kind: "no-effort" } // the entry exists and lists toggle/budget only + | { kind: "no-entry" }; // no first-party provider entry for this base + export function labEffortValues(baseModelID: string): readonly string[] | undefined { + const ladder = labLadder(baseModelID); + return ladder.kind === "effort" ? ladder.values : undefined; +} + +export function labLadder(baseModelID: string): LabLadder { // The lab's ladder lives on its first-party PROVIDER entry, not on the // shared model record: `models//.toml` carries name, family and // capabilities and no `reasoning_options`. So this reads // `providers//models/.toml`, the same file a reviewer means when // they say "the lab publishes". const slash = baseModelID.indexOf("/"); - if (slash === -1) return undefined; + if (slash === -1) return { kind: "no-entry" }; // `base_model` names the METADATA lab; the ladder is under the PROVIDER // directory, and for `zhipuai` -> `zai`, `meta` -> `llama` those differ. // The first version of this lookup assumed they matched and silently kept @@ -644,13 +677,13 @@ export function labEffortValues(baseModelID: string): readonly string[] | undefi /* try the next candidate */ } } - if (parsed === undefined) return undefined; + if (parsed === undefined) return { kind: "no-entry" }; const opts = parsed["reasoning_options"]; - if (!Array.isArray(opts)) return undefined; + if (!Array.isArray(opts)) return { kind: "no-entry" }; const effort = opts.find((o) => o && typeof o === "object" && (o as { type?: unknown }).type === "effort") as | { values?: unknown } | undefined; - return Array.isArray(effort?.values) ? (effort!.values as string[]) : undefined; + return Array.isArray(effort?.values) ? { kind: "effort", values: effort!.values as string[] } : { kind: "no-effort" }; } /** @@ -682,12 +715,9 @@ export function labEffortValues(baseModelID: string): readonly string[] | undefi * name IS the budget tier, which is the lab's own * control under the host's spelling. * - * Still unresolved and left on the host's enum rather than flipped to `[]`: - * `glm-4.5v`, `glm-4.6v`, `gemma-4-31b-it`, `qwen3.6-max-preview`, - * `mimo-v2.5`, `mimo-v2.5-pro`. On each the field validates and `low` alone - * reasons (2500 tokens, capped), but `high` timed out at the gateway so no - * ordering could be taken. `[]` would tell callers a working field does not - * exist, which is the one claim the evidence rules out. + * Everything else with a toggle-only lab was measured on repeats and did not + * order; those are in `EFFORT_VALIDATED_BUT_INERT` and publish `[]`. Nothing + * with a toggle-only lab is left on the host's enum without a probe behind it. */ const HOST_EFFORT_LIVE: ReadonlySet = new Set([ "google/gemini-2.5-flash-lite", @@ -807,11 +837,37 @@ async function fetchReasoningEffort(id: string, base: string): Promise 0) { - const shared = host.filter((value) => lab.includes(value)); - values = shared.length > 0 ? shared : [...host]; + const ladder = labLadder(base); + let values: string[]; + let lab: readonly string[] | undefined; + + switch (ladder.kind) { + case "effort": { + lab = ladder.values; + const shared = host.filter((value) => lab!.includes(value)); + // Every lab rung refused here. That is a contradiction, not a licence + // to publish the host's rungs under the lab's name: unresolved, so the + // model is skipped rather than shipped with an invented ladder. + if (shared.length === 0) return undefined; + values = shared; + break; + } + case "no-effort": + // The lab has spoken and said "toggle / budget, no effort ladder". A + // host effort enum contradicts that, so it ships only where a probe + // showed the host's field is a live, host-native control — measured + // ordering, or a mapping onto the lab's own budget tiers. Otherwise the + // model is skipped: `[]` would claim no control, which the validated + // field rules out, and the enum would claim a family the lab denies. + if (!HOST_EFFORT_LIVE.has(id)) return undefined; + values = [...host]; + break; + case "no-entry": + // Nothing to contradict: the lab does not publish this model, so the + // host's enum is the only ladder anyone has for it. Kept, on the + // understanding that "invented relative to the lab" needs a lab. + values = [...host]; + break; } const labListsNone = lab !== undefined && lab.includes("none"); diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index 4f741e45247..e7be85d8d8e 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -50,14 +50,29 @@ test("`none` is kept where the lab itself lists it", () => { expect(resolveLadder("openai/gpt-5.6-luna", "openai/gpt-5.6-luna", host)).toContain("none"); }); -test("an empty intersection keeps the host enum rather than claiming no control", () => { - // Every lab rung refused here: publishing `[]` would say the field does not - // exist, which is the one thing the host's enum rules out. - const host = ["low", "medium"]; - expect(resolveLadder("some/model", "deepseek/deepseek-v4-pro", host)).toEqual(["low", "medium"]); -}); - test("a measurement narrows but never widens past the lab", () => { // gpt-5.4-pro: lab medium/high/xhigh, host low/medium/high, measured medium/high. expect(resolveLadder("openai/gpt-5.4-pro", "openai/gpt-5.4-pro", ["low", "medium", "high"])).toEqual(["medium", "high"]); }); + +// The fallthrough the review found: a toggle-only lab must never turn into a +// host-schema L/M/H dump. Either the host field is measured live for that id, +// or the model is unresolved. +test("a toggle-only lab base never yields the host's effort dump", () => { + const host = ["none", "minimal", "low", "medium", "high"]; + // glm-4.5v: lab toggle-only, not in HOST_EFFORT_LIVE -> unresolved. + expect(resolveLadder("z-ai/glm-4.5v", "zhipuai/glm-4.5v", host)).toBeUndefined(); + // qwen3.7-max: lab toggle+budget, but its `low`/`medium` map onto the lab's + // own budget tiers on this host -> the host enum is a live control, minus + // the unmeasured `none`. + expect(resolveLadder("alibaba/qwen3.7-max", "alibaba/qwen3.7-max", host)).toEqual(["minimal", "low", "medium", "high"]); +}); + +test("an empty intersection is unresolved, not the host enum", () => { + // lab high/max, host offers neither -> skip, do not republish low/medium. + expect(resolveLadder("deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-pro", ["low", "medium"])).toBeUndefined(); +}); + +test("a base with no lab entry keeps the host enum — there is nothing to contradict", () => { + expect(resolveLadder("some/model", "nolab/nothing-here", ["low", "high"])).toEqual(["low", "high"]); +}); diff --git a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml index 4fccc66f5d2..41bd820dc19 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml @@ -1,12 +1,9 @@ base_model = "alibaba/qwen3.6-max-preview" +reasoning_options = [] [interleaved] field = "reasoning_content" -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - [cost] input = 0.65 output = 3.9 diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml index 59d50d08e8a..98e27dcd244 100644 --- a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml @@ -1,9 +1,6 @@ base_model = "anthropic/claude-haiku-4-5" name = "Claude 4.5 Haiku" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] +reasoning_options = [] [cost] input = 1.3754 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml index 6891b3b1c44..db0c04a98d3 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml @@ -1,9 +1,6 @@ base_model = "anthropic/claude-sonnet-4-5" name = "Claude 4.5 Sonnet" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] +reasoning_options = [] [cost] input = 4.1262 diff --git a/providers/aimlapi/models/google/gemma-4-31b-it.toml b/providers/aimlapi/models/google/gemma-4-31b-it.toml index a4a1c61c401..5b72c16ca13 100644 --- a/providers/aimlapi/models/google/gemma-4-31b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-31b-it.toml @@ -1,9 +1,6 @@ base_model = "google/gemma-4-31b-it" name = "Gemma 4 31B Instruct" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] +reasoning_options = [] [cost] input = 1.361646 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index f63b76557cb..aeb1a400042 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -1,13 +1,10 @@ base_model = "xiaomi/mimo-v2.5-pro" name = "MiMo V2.5 Pro" +reasoning_options = [] [interleaved] field = "reasoning_details" -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - [cost] input = 0.598299 output = 1.196598 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index e308c95c0a2..0d43054ef33 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -1,13 +1,10 @@ base_model = "xiaomi/mimo-v2.5" name = "MiMo V2.5" +reasoning_options = [] [interleaved] field = "reasoning_details" -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - [cost] input = 0.192556 output = 0.385112 diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml index 658d83c7155..edac4033dad 100644 --- a/providers/aimlapi/models/z-ai/glm-4.5v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -1,13 +1,10 @@ base_model = "zhipuai/glm-4.5v" name = "GLM 4.5V" +reasoning_options = [] [interleaved] field = "reasoning_details" -[[reasoning_options]] -type = "effort" -values = ["minimal", "low", "medium", "high"] - [cost] input = 0.82524 output = 2.47572 diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml index 5522406bdf4..11c2c599d67 100644 --- a/providers/aimlapi/models/z-ai/glm-4.6v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -1,13 +1,10 @@ base_model = "zhipuai/glm-4.6v" name = "GLM 4.6V" +reasoning_options = [] [interleaved] field = "reasoning_details" -[[reasoning_options]] -type = "effort" -values = ["minimal", "low", "medium", "high"] - [cost] input = 0.41262 output = 1.23786 From b4c54302a4e586d6c04bb44fa475c841dbd1385b Mon Sep 17 00:00:00 2001 From: Stan Date: Fri, 11 Sep 2026 16:44:58 +0500 Subject: [PATCH 29/38] fix(aimlapi): follow the tightened sync types after merging upstream Upstream now requires a price and a whole limit on every synced card and types effort rungs as the schema's own union. Filter host rungs through that union, build the limit only from the keys the host actually publishes, and skip a row the host lists without a price rather than emit a card the schema cannot carry. Two cards move with their base models: muse-spark-1.1 stops restating a context its lab entry now states, and hy3 omits the input cap its lab entry gained. --- packages/core/src/sync/providers/aimlapi.ts | 22 ++++++++++++++----- .../aimlapi/models/meta/muse-spark-1.1.toml | 3 --- providers/aimlapi/models/tencent/hy3.toml | 1 + 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 5b81153ed76..7de8666a124 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -27,7 +27,9 @@ const CHAT_COMPLETIONS_TYPE = "openai/chat-completions"; // reader expects to see them. Anything the API documents outside this set is // dropped rather than coerced. const EFFORT_VALUES = ["none", "minimal", "low", "medium", "high", "xhigh", "max", "default"] as const; +type EffortValue = (typeof EFFORT_VALUES)[number]; const EFFORT_RANK = new Map(EFFORT_VALUES.map((value, index) => [value as string, index])); +const isEffortValue = (value: string): value is EffortValue => EFFORT_RANK.has(value); /** * Models whose documented schema and whose live behaviour disagree, with what @@ -989,7 +991,7 @@ export const aimlapi = { // Required whenever the base model reasons. Only the API's own request // schema can say which values it takes, so a model whose docs stay silent // is skipped rather than given an invented control. - let reasoningOptions: Array<{ type: "effort"; values: string[] }> | undefined; + let reasoningOptions: Array<{ type: "effort"; values: EffortValue[] }> | undefined; if (baseReasoning(base)) { // A model that reasons but honours no caller control gets an empty list: // the schema requires the field, and an empty one states the truth — @@ -997,7 +999,7 @@ export const aimlapi = { if (EFFORT_NOT_HONOURED.has(model.id) || EFFORT_VALIDATED_BUT_INERT.has(model.id)) { reasoningOptions = []; } else { - const values = model.reasoningEffort ?? undefined; + const values = model.reasoningEffort?.filter(isEffortValue); if (values === undefined || values.length === 0) return undefined; reasoningOptions = [{ type: "effort", values }]; } @@ -1015,19 +1017,29 @@ export const aimlapi = { STALE_HOST_ROW.has(model.id) || (contextLimit === undefined && outputLimit === undefined) ? undefined - : { context: contextLimit, output: outputLimit }; + : { + ...(contextLimit === undefined ? {} : { context: contextLimit }), + ...(outputLimit === undefined ? {} : { output: outputLimit }), + }; // Everything else — the capability flags, description, dates, modalities — // is the lab's to state and is inherited. factorBaseModel drops whatever // matches the base, so the file carries only what is genuinely ours. + // A row the host lists but does not price is not sellable through it, and + // the schema (rightly) will not carry a card without a price. Skip it + // rather than invent zeros. + const inputCost = perMillion(units, "provided") ?? existing?.cost?.input; + const outputCost = perMillion(units, "generated") ?? existing?.cost?.output; + if (inputCost === undefined || outputCost === undefined) return undefined; + return { id: model.id, model: factorBaseModel( base, { cost: { - input: perMillion(units, "provided") ?? existing?.cost?.input, - output: perMillion(units, "generated") ?? existing?.cost?.output, + input: inputCost, + output: outputCost, cache_read: perMillion(units, "cached") ?? existing?.cost?.cache_read, }, // Aliases such as `-pro` and `-fast` factor onto the base model and diff --git a/providers/aimlapi/models/meta/muse-spark-1.1.toml b/providers/aimlapi/models/meta/muse-spark-1.1.toml index 62f1ab851c0..edb4ee9b056 100644 --- a/providers/aimlapi/models/meta/muse-spark-1.1.toml +++ b/providers/aimlapi/models/meta/muse-spark-1.1.toml @@ -11,6 +11,3 @@ values = ["low", "medium", "high"] input = 1.71925 output = 5.84545 cache_read = 0.20631 - -[limit] -context = 1_048_576 diff --git a/providers/aimlapi/models/tencent/hy3.toml b/providers/aimlapi/models/tencent/hy3.toml index 9554e70d673..dc2619b4065 100644 --- a/providers/aimlapi/models/tencent/hy3.toml +++ b/providers/aimlapi/models/tencent/hy3.toml @@ -1,4 +1,5 @@ base_model = "tencent/hy3" +base_model_omit = ["limit.input"] [interleaved] field = "reasoning_details" From 3de00502bcd9fa16d7b684dd8adca01096e82a4c Mon Sep 17 00:00:00 2001 From: Stan Date: Mon, 14 Sep 2026 18:20:42 +0500 Subject: [PATCH 30/38] fix(aimlapi): resolve a wire alias through the measurements of the id it answers as deepseek-chat answers "model": "deepseek-flash" exactly as deepseek-v4-flash does, yet its card diverged: the probes that established none as a real off switch and reasoning_content as the side channel were keyed to the id they ran against, so the alias fell through to the unmeasured default (low, high, no interleaved field). Route the measurement tables through the alias so the two cards resolve identically; the host row itself stays keyed by the alias's own id. gemini-2.5-flash-lite: the host still labels the GA route "Gemini 2.5 Flash Lite Preview". Suppress the name override until the host-side rename (aimlapi/aimlapi#6178) ships, so the lab's GA name inherits. Test: the alias ladder equals the flash ladder. --- packages/core/src/sync/providers/aimlapi.ts | 66 ++++++++++++++----- packages/core/test/aimlapi.test.ts | 11 ++++ .../models/deepseek/deepseek-chat.toml | 5 +- .../models/google/gemini-2.5-flash-lite.toml | 1 - 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 7de8666a124..ab7d3740b2c 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -598,24 +598,57 @@ function isChatTextModel(model: AimlapiModel): boolean { * and limits; this is the same correction on the catalogue side. */ /** - * Ids whose host ROW is known stale, so the lab entry is the better source. + * Ids whose host ROW must not override the lab entry it factors onto. * - * Only `deepseek/deepseek-chat`, and only until the host's own correction - * ships: production still calls it "DeepSeek V3" with a 128K window while - * serving a Flash build that has 1M, and republishing either beside a Flash - * `base_model` would put a contradiction in the catalogue. Name and limits are - * both suppressed so the lab entry's own figures inherit. The fix upstream is - * merged, and when it lands this set can go — the host will be saying the - * right thing itself. + * Only `deepseek/deepseek-chat`. The host has corrected its row since this + * began (it now reads "DeepSeek Chat (V4.1 Flash)", 1,048,576 context), but + * republishing either beside the Flash `base_model` would still contradict + * it: the lab has folded its Flash ids into V4.1 and lists the window as + * 1,000,000, and the host's 1,048,576 is a rounding of that same window, not a + * different one. Name and limits stay suppressed so the alias inherits the + * lab's figures exactly as `deepseek-v4-flash` does. */ const STALE_HOST_ROW: ReadonlySet = new Set([ "deepseek/deepseek-chat", ]); +/** + * Ids whose host display NAME is stale while the rest of the row is fine. + * + * `google/gemini-2.5-flash-lite` still reads "Gemini 2.5 Flash Lite Preview" + * on the host although the route serves the GA model the lab entry names + * "Gemini 2.5 Flash-Lite" — a label left over from its preview period, the + * same mistake corrected for `openai/o1`. The host-side fix is open + * (aimlapi/aimlapi#6178); until it ships the override is dropped so the lab's + * name inherits. Limits and everything else still come from the host row. + */ +const STALE_HOST_NAME: ReadonlySet = new Set([ + "google/gemini-2.5-flash-lite", +]); + const BASE_MODEL_OVERRIDES: Readonly> = { "deepseek/deepseek-chat": "deepseek/deepseek-v4-flash", }; +/** + * Ids that are aliases of another host id on the wire, keyed to the id whose + * measurements they share. `deepseek-chat` answers `"model": "deepseek-flash"` + * exactly as `deepseek-v4-flash` does, so every probe run against the latter + * — which rungs are honoured, whether `none` switches reasoning off, which + * field carries the chain of thought — holds for the alias, and the two cards + * must resolve identically rather than the alias falling through to the + * unmeasured default. Only the measurement tables read through this map; the + * host row itself (name, limits, allowlists) stays keyed by the alias's own id. + */ +const WIRE_ALIAS_OF: Readonly> = { + "deepseek/deepseek-chat": "deepseek/deepseek-v4-flash", +}; + +/** The id whose measurements apply to `id`: its wire alias target, else itself. */ +function measuredAs(id: string): string { + return WIRE_ALIAS_OF[id] ?? id; +} + function baseModelFor(id: string): string | undefined { return BASE_MODEL_OVERRIDES[id] ?? resolveModelMetadataBaseModel(id); } @@ -811,7 +844,8 @@ async function fetchReasoningEffort(id: string, base: string): Promise(); collectReasoningEffortEnums(payload, found); @@ -872,12 +906,13 @@ export function resolveLadder(id: string, base: string, host: readonly string[]) break; } + const measuredId = measuredAs(id); const labListsNone = lab !== undefined && lab.includes("none"); - const noneAllowed = labListsNone || NONE_IS_REAL_OFF.has(id); + const noneAllowed = labListsNone || NONE_IS_REAL_OFF.has(measuredId); if (!noneAllowed) values = values.filter((value) => value !== "none"); else if (host.includes("none") && !values.includes("none")) values = ["none", ...values]; - const measured = MEASURED_EFFORTS[id]; + const measured = MEASURED_EFFORTS[measuredId]; if (measured) values = values.filter((value) => measured.includes(value)); return values.length > 0 ? values : undefined; @@ -996,7 +1031,7 @@ export const aimlapi = { // A model that reasons but honours no caller control gets an empty list: // the schema requires the field, and an empty one states the truth — // reasoning happens, nothing about it is selectable. - if (EFFORT_NOT_HONOURED.has(model.id) || EFFORT_VALIDATED_BUT_INERT.has(model.id)) { + if (EFFORT_NOT_HONOURED.has(measuredAs(model.id)) || EFFORT_VALIDATED_BUT_INERT.has(measuredAs(model.id))) { reasoningOptions = []; } else { const values = model.reasoningEffort?.filter(isEffortValue); @@ -1046,10 +1081,11 @@ export const aimlapi = { // would inherit its display name, so the catalogue would list two rows // called "GPT-5.6 Luna". The host names them apart; carry that through // and the override drops itself when the names already agree. - name: STALE_HOST_ROW.has(model.id) ? undefined : (info.name ?? undefined), + name: + STALE_HOST_ROW.has(model.id) || STALE_HOST_NAME.has(model.id) ? undefined : (info.name ?? undefined), reasoning_options: reasoningOptions, - interleaved: INTERLEAVED_FIELD[model.id] - ? { field: INTERLEAVED_FIELD[model.id]! } + interleaved: INTERLEAVED_FIELD[measuredAs(model.id)] + ? { field: INTERLEAVED_FIELD[measuredAs(model.id)]! } : undefined, limit, }, diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index e7be85d8d8e..c4ed7ceff8c 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -76,3 +76,14 @@ test("an empty intersection is unresolved, not the host enum", () => { test("a base with no lab entry keeps the host enum — there is nothing to contradict", () => { expect(resolveLadder("some/model", "nolab/nothing-here", ["low", "high"])).toEqual(["low", "high"]); }); + +test("a wire alias resolves through the measurements of the id it answers as", () => { + const host = ["none", "low", "medium", "high"]; + // `deepseek-chat` answers `"model": "deepseek-flash"` exactly as + // `deepseek-v4-flash` does, so the probes run against the latter (`none` + // switches reasoning off; `medium` is inert) apply to the alias too. + expect(resolveLadder("deepseek/deepseek-chat", "deepseek/deepseek-v4-flash", host)).toEqual( + resolveLadder("deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash", host), + ); + expect(resolveLadder("deepseek/deepseek-chat", "deepseek/deepseek-v4-flash", host)).toEqual(["none", "low", "high"]); +}); diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index 82a67209859..9e04e0bd098 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -1,8 +1,11 @@ base_model = "deepseek/deepseek-v4-flash" +[interleaved] +field = "reasoning_content" + [[reasoning_options]] type = "effort" -values = ["low", "high"] +values = ["none", "low", "high"] [cost] input = 0.39 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index 758bb67d9c3..6675f8837ce 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -1,5 +1,4 @@ base_model = "google/gemini-2.5-flash-lite" -name = "Gemini 2.5 Flash Lite Preview" [[reasoning_options]] type = "effort" From c85cd37150c53be1479a4b173b96dce7b4d3a03b Mon Sep 17 00:00:00 2001 From: Stan Date: Mon, 14 Sep 2026 18:57:37 +0500 Subject: [PATCH 31/38] fix(aimlapi): take the OpenRouter peer as baseline where the lab is silent, and say on each card what the wire does MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The no-entry branch of resolveLadder kept the host's effort enum whenever no first-party ladder existed, which shipped an identical low/medium/high on 24 cards — a schema dump, not a baseline. labLadder now falls back to the OpenRouter card for the same lab id (OpenRouter files Alibaba under qwen/, so every directory it uses for the lab is tried). A peer ladder is intersected exactly like a lab ladder and never widened; a peer that is toggle-only counts as no effort ladder; a peer-listed none is not taken on trust the way a lab-listed one is. With neither a lab nor a peer entry the model is unresolved and skipped. Six cards leave on that rule (laguna-xs-2.1, laguna-s-2.1, qwen3.5-flash, ling-3.0-flash-fin, trinity-large-thinking, claude-opus-4.1); four narrow to the peer set (hy3, hy4-preview to low/high; qwen3.8-27b, qwen3.8-2.4t-a95b to low/medium). Cards whose control story is not plain lab ∩ host now carry a leading wire comment — the alias, the empty lists (not read vs validated-but-inert, and that toggle/budget keys are dropped), the host-live effort ids (what the names select), and none as the off switch — and headers are authoritative so a re-sync keeps them current. --- packages/core/src/sync/providers/aimlapi.ts | 92 ++++++++++++++++--- .../core/src/sync/providers/openrouter.ts | 13 +++ packages/core/test/aimlapi.test.ts | 23 ++++- .../aimlapi/models/alibaba/qwen-plus.toml | 2 + .../aimlapi/models/alibaba/qwen3.5-flash.toml | 12 --- .../aimlapi/models/alibaba/qwen3.6-27b.toml | 2 + .../models/alibaba/qwen3.6-35b-a3b.toml | 2 + .../models/alibaba/qwen3.6-max-preview.toml | 2 + .../aimlapi/models/alibaba/qwen3.7-max.toml | 2 + .../models/alibaba/qwen3.8-2.4t-a95b.toml | 2 +- .../aimlapi/models/alibaba/qwen3.8-27b.toml | 2 +- .../models/anthropic/claude-haiku-4.5.toml | 2 + .../models/anthropic/claude-opus-4.1.toml | 11 --- .../models/anthropic/claude-opus-4.7.toml | 1 + .../models/anthropic/claude-opus-4.8.toml | 1 + .../models/anthropic/claude-sonnet-4.5.toml | 2 + .../arcee-ai/trinity-large-thinking.toml | 17 ---- .../models/deepseek/deepseek-chat.toml | 2 + .../deepseek-v4-flash-vision-exp.toml | 1 + .../models/deepseek/deepseek-v4-flash.toml | 1 + .../models/deepseek/deepseek-v4-pro-0813.toml | 1 + .../models/deepseek/deepseek-v4-pro.toml | 1 + .../models/google/gemini-2.5-flash-lite.toml | 2 + .../models/google/gemini-3.1-pro-preview.toml | 2 + .../models/google/gemma-4-26b-a4b-it.toml | 2 + .../aimlapi/models/google/gemma-4-31b-it.toml | 2 + .../inclusionai/ling-3.0-flash-fin.toml | 16 ---- .../models/moonshotai/kimi-k2-thinking.toml | 2 + .../aimlapi/models/openai/gpt-5.3-codex.toml | 1 + .../aimlapi/models/openai/gpt-5.6-luna.toml | 1 + .../aimlapi/models/openai/gpt-5.6-sol.toml | 1 + .../models/openai/gpt-5.6-terra-pro.toml | 1 + .../aimlapi/models/openai/gpt-5.6-terra.toml | 1 + .../aimlapi/models/poolside/laguna-s-2.1.toml | 16 ---- .../models/poolside/laguna-xs-2.1.toml | 13 --- providers/aimlapi/models/tencent/hy3.toml | 2 +- .../aimlapi/models/tencent/hy4-preview.toml | 2 +- .../aimlapi/models/xiaomi/mimo-v2.5-pro.toml | 2 + .../aimlapi/models/xiaomi/mimo-v2.5.toml | 2 + providers/aimlapi/models/z-ai/glm-4.5v.toml | 2 + providers/aimlapi/models/z-ai/glm-4.6v.toml | 2 + .../aimlapi/models/z-ai/glm-4.7-flash.toml | 2 + .../aimlapi/models/z-ai/glm-5-turbo.toml | 2 + .../aimlapi/models/z-ai/glm-5v-turbo.toml | 2 + 44 files changed, 168 insertions(+), 104 deletions(-) delete mode 100644 providers/aimlapi/models/alibaba/qwen3.5-flash.toml delete mode 100644 providers/aimlapi/models/anthropic/claude-opus-4.1.toml delete mode 100644 providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml delete mode 100644 providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml delete mode 100644 providers/aimlapi/models/poolside/laguna-s-2.1.toml delete mode 100644 providers/aimlapi/models/poolside/laguna-xs-2.1.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index ab7d3740b2c..66347d7d494 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -6,6 +6,7 @@ import type { SyncProvider } from "../index.js"; import { factorBaseModel, modelMetadata, + openrouterDirsForMetadataLab, providerDirForMetadataLab, resolveModelMetadataBaseModel, } from "./openrouter.js"; @@ -672,9 +673,9 @@ function baseModelFor(id: string): string | undefined { */ /** What the lab's provider entry says about effort, three ways. */ export type LabLadder = - | { kind: "effort"; values: readonly string[] } - | { kind: "no-effort" } // the entry exists and lists toggle/budget only - | { kind: "no-entry" }; // no first-party provider entry for this base + | { kind: "effort"; values: readonly string[]; source: "lab" | "peer" } + | { kind: "no-effort"; source: "lab" | "peer" } // the entry exists and lists toggle/budget only + | { kind: "no-entry" }; // neither a first-party nor an OpenRouter entry for this base export function labEffortValues(baseModelID: string): readonly string[] | undefined { const ladder = labLadder(baseModelID); @@ -702,9 +703,29 @@ export function labLadder(baseModelID: string): LabLadder { const candidates = [name, name.replace(/-\d{4}$/, "")].filter( (candidate, index, all) => all.indexOf(candidate) === index, ); + const own = readLadder(lab, candidates, "lab"); + if (own.kind !== "no-entry") return own; + // No first-party entry. The next-best baseline is an established peer on + // the same surface: OpenRouter's card for the same lab id, which the review + // names as the reference whenever the lab is silent. Its ladder is used + // exactly like a lab ladder — intersected, never widened — and its + // toggle-only cards count as "no effort ladder" just as a lab's would. + // OpenRouter files Alibaba under `qwen/`, so every directory it uses for + // the lab is tried. Only when neither exists is the model unresolved. + const metadataLab = baseModelID.slice(0, slash); + const peerPaths = openrouterDirsForMetadataLab(metadataLab).flatMap((dir) => + candidates.map((candidate) => `${dir}/${candidate}`), + ); + return readLadder(PEER_DIR, peerPaths, "peer"); +} + +/** OpenRouter's provider directory: the peer baseline when the lab is silent. */ +const PEER_DIR = "openrouter"; + +function readLadder(providerDir: string, modelPaths: readonly string[], source: "lab" | "peer"): LabLadder { let parsed: Record | undefined; - for (const candidate of candidates) { - const file = path.join(PROVIDERS_DIR, lab, "models", `${candidate}.toml`); + for (const candidate of modelPaths) { + const file = path.join(PROVIDERS_DIR, providerDir, "models", `${candidate}.toml`); try { parsed = Bun.TOML.parse(readFileSync(file, "utf8")) as Record; break; @@ -718,7 +739,9 @@ export function labLadder(baseModelID: string): LabLadder { const effort = opts.find((o) => o && typeof o === "object" && (o as { type?: unknown }).type === "effort") as | { values?: unknown } | undefined; - return Array.isArray(effort?.values) ? { kind: "effort", values: effort!.values as string[] } : { kind: "no-effort" }; + return Array.isArray(effort?.values) + ? { kind: "effort", values: effort!.values as string[], source } + : { kind: "no-effort", source }; } /** @@ -876,6 +899,9 @@ export function resolveLadder(id: string, base: string, host: readonly string[]) const ladder = labLadder(base); let values: string[]; let lab: readonly string[] | undefined; + // A peer's `none` is that relay's own off mapping, not the lab's word that + // the rung exists; it is not taken on trust the way a lab-listed `none` is. + const labSpeaks = ladder.kind !== "no-entry" && ladder.source === "lab"; switch (ladder.kind) { case "effort": { @@ -899,15 +925,15 @@ export function resolveLadder(id: string, base: string, host: readonly string[]) values = [...host]; break; case "no-entry": - // Nothing to contradict: the lab does not publish this model, so the - // host's enum is the only ladder anyone has for it. Kept, on the - // understanding that "invented relative to the lab" needs a lab. - values = [...host]; - break; + // Neither the lab nor the peer publishes a ladder for this model, so + // there is nothing to intersect with and the host's enum would ship as + // a bare schema dump. Unresolved: the model is skipped until a baseline + // exists rather than given boilerplate rungs. + return undefined; } const measuredId = measuredAs(id); - const labListsNone = lab !== undefined && lab.includes("none"); + const labListsNone = labSpeaks && lab !== undefined && lab.includes("none"); const noneAllowed = labListsNone || NONE_IS_REAL_OFF.has(measuredId); if (!noneAllowed) values = values.filter((value) => value !== "none"); else if (host.includes("none") && !values.includes("none")) values = ["none", ...values]; @@ -963,6 +989,46 @@ async function attachReasoningEffort(models: AimlapiModel[]): Promise { await Promise.all(workers); } +/** + * The leading comment a card carries so a reader can see what the wire does + * without opening this file. Only cards whose control story is not plain + * "lab ladder ∩ host enum" get one — the ones a review has to ask about. + */ +function wireHeader(id: string, reasoningOptions: Array<{ type: "effort"; values: EffortValue[] }> | undefined): string | undefined { + const measuredId = measuredAs(id); + const lines: string[] = []; + if (measuredId !== id) { + lines.push(`# Alias: answers "model" as ${measuredId.slice(measuredId.indexOf("/") + 1)}; measured through that id.`); + } + if (reasoningOptions !== undefined && reasoningOptions.length === 0) { + lines.push( + EFFORT_NOT_HONOURED.has(measuredId) + ? "# No caller control: reasoning_effort is not read (an invalid value returns 200)," + : "# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high", + EFFORT_NOT_HONOURED.has(measuredId) + ? "# and toggle/budget fields are dropped by the gateway (unknown top-level keys -> 200)." + : "# do not order reasoning tokens; toggle/budget fields are dropped by the gateway.", + ); + } + if (HOST_EFFORT_LIVE.has(measuredId)) { + lines.push( + ...(measuredId.startsWith("alibaba/") + ? [ + "# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768", + "# thinking_budget per the gateway's own 400 text); no separate toggle/budget field.", + ] + : [ + "# Effort orders reasoning tokens on this wire (low 863 -> high 2399 measured);", + "# no separate toggle/budget field, unknown top-level keys are dropped.", + ]), + ); + } + if (NONE_IS_REAL_OFF.has(measuredId)) { + lines.push("# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface."); + } + return lines.length > 0 ? lines.join("\n") + "\n" : undefined; +} + export const aimlapi = { id: "aimlapi", name: "AI/ML API", @@ -970,6 +1036,7 @@ export const aimlapi = { // The catalog turns over quickly and lists far more than the chat surface, so // a local model missing from one response is not proof that it is gone. deleteMissing: false, + authoritativeHeaders: true, sourceID(model) { if (NOT_CALLABLE.has(model.id)) return undefined; if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; @@ -1069,6 +1136,7 @@ export const aimlapi = { return { id: model.id, + header: wireHeader(model.id, reasoningOptions), model: factorBaseModel( base, { diff --git a/packages/core/src/sync/providers/openrouter.ts b/packages/core/src/sync/providers/openrouter.ts index 61db8b942f6..1aca1935ef0 100644 --- a/packages/core/src/sync/providers/openrouter.ts +++ b/packages/core/src/sync/providers/openrouter.ts @@ -68,6 +68,19 @@ export function providerDirForMetadataLab(metadata: string): string { return metadata; } +/** + * The OpenRouter model-directory prefixes that carry a metadata lab, in table + * order — e.g. `alibaba` lives under both `alibaba/` and `qwen/` on OpenRouter, + * and only the latter is populated. + */ +export function openrouterDirsForMetadataLab(metadata: string): string[] { + const dirs: string[] = []; + for (const [prefix, entry] of Object.entries(CANONICAL_PROVIDER_PREFIXES)) { + if (entry.metadata === metadata) dirs.push(prefix); + } + return dirs.length > 0 ? dirs : [metadata]; +} + export const OpenRouterModel = z.object({ id: z.string(), name: z.string(), diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index c4ed7ceff8c..e5e03da9650 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test"; -import { labEffortValues, resolveLadder } from "../src/sync/providers/aimlapi.js"; +import { labEffortValues, labLadder, resolveLadder } from "../src/sync/providers/aimlapi.js"; import { providerDirForMetadataLab } from "../src/sync/providers/openrouter.js"; // The lookup that silently kept the host enum for every GLM id: `base_model` @@ -73,8 +73,25 @@ test("an empty intersection is unresolved, not the host enum", () => { expect(resolveLadder("deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-pro", ["low", "medium"])).toBeUndefined(); }); -test("a base with no lab entry keeps the host enum — there is nothing to contradict", () => { - expect(resolveLadder("some/model", "nolab/nothing-here", ["low", "high"])).toEqual(["low", "high"]); +test("a base with no lab entry falls back to the OpenRouter peer's ladder, intersected", () => { + // No `providers/tencent/models/hy3.toml`; OpenRouter lists none/low/high. + expect(labLadder("tencent/hy3")).toEqual({ kind: "effort", values: ["none", "low", "high"], source: "peer" }); + expect(resolveLadder("tencent/hy3", "tencent/hy3", ["low", "medium", "high"])).toEqual(["low", "high"]); + // A peer-listed `none` is not taken on trust the way a lab-listed one is. + expect(resolveLadder("tencent/hy3", "tencent/hy3", ["none", "low", "medium", "high"])).toEqual(["low", "high"]); + // OpenRouter files Alibaba under `qwen/`. + expect(labLadder("alibaba/qwen3.8-27b")).toEqual({ kind: "effort", values: ["low", "medium", "xhigh"], source: "peer" }); +}); + +test("a peer that is toggle-only counts as no effort ladder, not as a licence for the host enum", () => { + // No lab entry for Opus 4.1; OpenRouter's card is toggle-only. + expect(labLadder("anthropic/claude-opus-4.1")).toEqual({ kind: "no-effort", source: "peer" }); + expect(resolveLadder("anthropic/claude-opus-4.1", "anthropic/claude-opus-4.1", ["low", "medium", "high"])).toBeUndefined(); +}); + +test("a base with neither a lab nor a peer entry is unresolved, not the host enum", () => { + expect(labLadder("nolab/nothing-here")).toEqual({ kind: "no-entry" }); + expect(resolveLadder("some/model", "nolab/nothing-here", ["low", "high"])).toBeUndefined(); }); test("a wire alias resolves through the measurements of the id it answers as", () => { diff --git a/providers/aimlapi/models/alibaba/qwen-plus.toml b/providers/aimlapi/models/alibaba/qwen-plus.toml index f820560671d..c031d384512 100644 --- a/providers/aimlapi/models/alibaba/qwen-plus.toml +++ b/providers/aimlapi/models/alibaba/qwen-plus.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is not read (an invalid value returns 200), +# and toggle/budget fields are dropped by the gateway (unknown top-level keys -> 200). base_model = "alibaba/qwen-plus" reasoning_options = [] diff --git a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml b/providers/aimlapi/models/alibaba/qwen3.5-flash.toml deleted file mode 100644 index 5d1fccecb27..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.5-flash.toml +++ /dev/null @@ -1,12 +0,0 @@ -base_model = "alibaba/qwen3.5-flash" - -[interleaved] -field = "reasoning_content" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.13 -output = 0.52 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml index a4b32755a1d..f6a26e2a32d 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml @@ -1,3 +1,5 @@ +# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768 +# thinking_budget per the gateway's own 400 text); no separate toggle/budget field. base_model = "alibaba/qwen3.6-27b" [interleaved] diff --git a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml index 8835d450c25..4f0c5e8815d 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml @@ -1,3 +1,5 @@ +# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768 +# thinking_budget per the gateway's own 400 text); no separate toggle/budget field. base_model = "alibaba/qwen3.6-35b-a3b" name = "Qwen3.6 35B A3B" diff --git a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml index 41bd820dc19..58be84db58e 100644 --- a/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml +++ b/providers/aimlapi/models/alibaba/qwen3.6-max-preview.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "alibaba/qwen3.6-max-preview" reasoning_options = [] diff --git a/providers/aimlapi/models/alibaba/qwen3.7-max.toml b/providers/aimlapi/models/alibaba/qwen3.7-max.toml index 0e4d7bc7c02..1f017889c35 100644 --- a/providers/aimlapi/models/alibaba/qwen3.7-max.toml +++ b/providers/aimlapi/models/alibaba/qwen3.7-max.toml @@ -1,3 +1,5 @@ +# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768 +# thinking_budget per the gateway's own 400 text); no separate toggle/budget field. base_model = "alibaba/qwen3.7-max" [interleaved] diff --git a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml index 323eb91eef6..642df5ea6fb 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-2.4t-a95b.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["low", "medium"] [cost] input = 3.4385 diff --git a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml index 112360fd2c7..0d757197e19 100644 --- a/providers/aimlapi/models/alibaba/qwen3.8-27b.toml +++ b/providers/aimlapi/models/alibaba/qwen3.8-27b.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["low", "medium"] [cost] input = 0.61893 diff --git a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml index 98e27dcd244..2381e2a5861 100644 --- a/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-haiku-4.5.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "anthropic/claude-haiku-4-5" name = "Claude 4.5 Haiku" reasoning_options = [] diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml b/providers/aimlapi/models/anthropic/claude-opus-4.1.toml deleted file mode 100644 index 131fd5240fd..00000000000 --- a/providers/aimlapi/models/anthropic/claude-opus-4.1.toml +++ /dev/null @@ -1,11 +0,0 @@ -base_model = "anthropic/claude-opus-4-1" -name = "Claude 4.1 Opus" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 20.631 -output = 103.155 -cache_read = 2.0631 diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml index a5459e6ce65..a2780ee040c 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.7.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.7.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "anthropic/claude-opus-4-7" name = "Claude 4.7 Opus" diff --git a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml index 7d031153037..16aac2d98aa 100644 --- a/providers/aimlapi/models/anthropic/claude-opus-4.8.toml +++ b/providers/aimlapi/models/anthropic/claude-opus-4.8.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "anthropic/claude-opus-4-8" name = "Claude 4.8 Opus" diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml index db0c04a98d3..6ebb192f07e 100644 --- a/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml +++ b/providers/aimlapi/models/anthropic/claude-sonnet-4.5.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "anthropic/claude-sonnet-4-5" name = "Claude 4.5 Sonnet" reasoning_options = [] diff --git a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml b/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml deleted file mode 100644 index 15d8e08301b..00000000000 --- a/providers/aimlapi/models/arcee-ai/trinity-large-thinking.toml +++ /dev/null @@ -1,17 +0,0 @@ -base_model = "arcee-ai/trinity-large-thinking" - -[interleaved] -field = "reasoning_details" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.302588 -output = 1.16909 -cache_read = 0.082524 - -[limit] -context = 262_144 -output = 80_000 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat.toml b/providers/aimlapi/models/deepseek/deepseek-chat.toml index 9e04e0bd098..a40e9780b00 100644 --- a/providers/aimlapi/models/deepseek/deepseek-chat.toml +++ b/providers/aimlapi/models/deepseek/deepseek-chat.toml @@ -1,3 +1,5 @@ +# Alias: answers "model" as deepseek-v4-flash; measured through that id. +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "deepseek/deepseek-v4-flash" [interleaved] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml index 2c44fe4247b..a9e9cfd5795 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "deepseek/deepseek-v4-flash-vision-exp" [interleaved] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml index 9e04e0bd098..641462df08f 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-flash.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "deepseek/deepseek-v4-flash" [interleaved] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index e9a8290396f..1782cd21a30 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "deepseek/deepseek-v4-pro-0813" [interleaved] diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index f89b20b1e84..5d101e0c3bc 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "deepseek/deepseek-v4-pro" [interleaved] diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml index 6675f8837ce..4e6e215f06c 100644 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml @@ -1,3 +1,5 @@ +# Effort orders reasoning tokens on this wire (low 863 -> high 2399 measured); +# no separate toggle/budget field, unknown top-level keys are dropped. base_model = "google/gemini-2.5-flash-lite" [[reasoning_options]] diff --git a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml index f1ae2b8a590..14fc3cf4e4f 100644 --- a/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml +++ b/providers/aimlapi/models/google/gemini-3.1-pro-preview.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is not read (an invalid value returns 200), +# and toggle/budget fields are dropped by the gateway (unknown top-level keys -> 200). base_model = "google/gemini-3.1-pro-preview" reasoning_options = [] diff --git a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml index 5733c4eb6fe..19c7b65f3a2 100644 --- a/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-26b-a4b-it.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is not read (an invalid value returns 200), +# and toggle/budget fields are dropped by the gateway (unknown top-level keys -> 200). base_model = "google/gemma-4-26b-a4b-it" reasoning_options = [] diff --git a/providers/aimlapi/models/google/gemma-4-31b-it.toml b/providers/aimlapi/models/google/gemma-4-31b-it.toml index 5b72c16ca13..47a3c16d39d 100644 --- a/providers/aimlapi/models/google/gemma-4-31b-it.toml +++ b/providers/aimlapi/models/google/gemma-4-31b-it.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "google/gemma-4-31b-it" name = "Gemma 4 31B Instruct" reasoning_options = [] diff --git a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml b/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml deleted file mode 100644 index 25e4b5b3014..00000000000 --- a/providers/aimlapi/models/inclusionai/ling-3.0-flash-fin.toml +++ /dev/null @@ -1,16 +0,0 @@ -base_model = "inclusionai/ling-3.0-flash-fin" - -[interleaved] -field = "reasoning_details" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.082524 -output = 0.247572 -cache_read = 0.016505 - -[limit] -output = 235_929 diff --git a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml index ebdd40f06c7..e2547928dc6 100644 --- a/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml +++ b/providers/aimlapi/models/moonshotai/kimi-k2-thinking.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "moonshotai/kimi-k2-thinking" reasoning_options = [] diff --git a/providers/aimlapi/models/openai/gpt-5.3-codex.toml b/providers/aimlapi/models/openai/gpt-5.3-codex.toml index 8f05de16d0b..a4f39525490 100644 --- a/providers/aimlapi/models/openai/gpt-5.3-codex.toml +++ b/providers/aimlapi/models/openai/gpt-5.3-codex.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "openai/gpt-5.3-codex" [interleaved] diff --git a/providers/aimlapi/models/openai/gpt-5.6-luna.toml b/providers/aimlapi/models/openai/gpt-5.6-luna.toml index 8334dc563ca..42e83f452c3 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-luna.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-luna.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "openai/gpt-5.6-luna" [[reasoning_options]] diff --git a/providers/aimlapi/models/openai/gpt-5.6-sol.toml b/providers/aimlapi/models/openai/gpt-5.6-sol.toml index ebe354795f9..b5fefa47a8a 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-sol.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-sol.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "openai/gpt-5.6-sol" [[reasoning_options]] diff --git a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml index 471b9cd42c6..22cea416553 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-terra-pro.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "openai/gpt-5.6-terra" name = "GPT-5.6 Terra Pro" diff --git a/providers/aimlapi/models/openai/gpt-5.6-terra.toml b/providers/aimlapi/models/openai/gpt-5.6-terra.toml index f12c3f71693..c8e9ac4525e 100644 --- a/providers/aimlapi/models/openai/gpt-5.6-terra.toml +++ b/providers/aimlapi/models/openai/gpt-5.6-terra.toml @@ -1,3 +1,4 @@ +# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface. base_model = "openai/gpt-5.6-terra" [[reasoning_options]] diff --git a/providers/aimlapi/models/poolside/laguna-s-2.1.toml b/providers/aimlapi/models/poolside/laguna-s-2.1.toml deleted file mode 100644 index 93dba526d94..00000000000 --- a/providers/aimlapi/models/poolside/laguna-s-2.1.toml +++ /dev/null @@ -1,16 +0,0 @@ -base_model = "poolside/laguna-s-2.1" - -[interleaved] -field = "reasoning_details" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.123786 -output = 0.247572 -cache_read = 0.008252 - -[limit] -output = 131_072 diff --git a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml b/providers/aimlapi/models/poolside/laguna-xs-2.1.toml deleted file mode 100644 index 87ab65b13a5..00000000000 --- a/providers/aimlapi/models/poolside/laguna-xs-2.1.toml +++ /dev/null @@ -1,13 +0,0 @@ -base_model = "poolside/laguna-xs-2.1" - -[interleaved] -field = "reasoning_details" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.082524 -output = 0.165048 -cache_read = 0.041262 diff --git a/providers/aimlapi/models/tencent/hy3.toml b/providers/aimlapi/models/tencent/hy3.toml index dc2619b4065..47856496a42 100644 --- a/providers/aimlapi/models/tencent/hy3.toml +++ b/providers/aimlapi/models/tencent/hy3.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["low", "high"] [cost] input = 0.27508 diff --git a/providers/aimlapi/models/tencent/hy4-preview.toml b/providers/aimlapi/models/tencent/hy4-preview.toml index c8450b50862..9448d93b7f1 100644 --- a/providers/aimlapi/models/tencent/hy4-preview.toml +++ b/providers/aimlapi/models/tencent/hy4-preview.toml @@ -5,7 +5,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["low", "high"] [cost] input = 1.147084 diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml index aeb1a400042..33df4830dda 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5-pro.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "xiaomi/mimo-v2.5-pro" name = "MiMo V2.5 Pro" reasoning_options = [] diff --git a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml index 0d43054ef33..185533b4a3c 100644 --- a/providers/aimlapi/models/xiaomi/mimo-v2.5.toml +++ b/providers/aimlapi/models/xiaomi/mimo-v2.5.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "xiaomi/mimo-v2.5" name = "MiMo V2.5" reasoning_options = [] diff --git a/providers/aimlapi/models/z-ai/glm-4.5v.toml b/providers/aimlapi/models/z-ai/glm-4.5v.toml index edac4033dad..4fd16eee24f 100644 --- a/providers/aimlapi/models/z-ai/glm-4.5v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.5v.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "zhipuai/glm-4.5v" name = "GLM 4.5V" reasoning_options = [] diff --git a/providers/aimlapi/models/z-ai/glm-4.6v.toml b/providers/aimlapi/models/z-ai/glm-4.6v.toml index 11c2c599d67..973d13d224e 100644 --- a/providers/aimlapi/models/z-ai/glm-4.6v.toml +++ b/providers/aimlapi/models/z-ai/glm-4.6v.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "zhipuai/glm-4.6v" name = "GLM 4.6V" reasoning_options = [] diff --git a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml index 597263a8515..88b3d72d30c 100644 --- a/providers/aimlapi/models/z-ai/glm-4.7-flash.toml +++ b/providers/aimlapi/models/z-ai/glm-4.7-flash.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is validated (invalid value -> 400) but low/high +# do not order reasoning tokens; toggle/budget fields are dropped by the gateway. base_model = "zhipuai/glm-4.7-flash" name = "GLM 4.7 Flash" reasoning_options = [] diff --git a/providers/aimlapi/models/z-ai/glm-5-turbo.toml b/providers/aimlapi/models/z-ai/glm-5-turbo.toml index 15733c68efe..e7bcb32d106 100644 --- a/providers/aimlapi/models/z-ai/glm-5-turbo.toml +++ b/providers/aimlapi/models/z-ai/glm-5-turbo.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is not read (an invalid value returns 200), +# and toggle/budget fields are dropped by the gateway (unknown top-level keys -> 200). base_model = "zhipuai/glm-5-turbo" name = "GLM 5 Turbo" reasoning_options = [] diff --git a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml index 688769c2321..02230f0e612 100644 --- a/providers/aimlapi/models/z-ai/glm-5v-turbo.toml +++ b/providers/aimlapi/models/z-ai/glm-5v-turbo.toml @@ -1,3 +1,5 @@ +# No caller control: reasoning_effort is not read (an invalid value returns 200), +# and toggle/budget fields are dropped by the gateway (unknown top-level keys -> 200). base_model = "zhipuai/glm-5v-turbo" name = "GLM 5V Turbo" reasoning_options = [] From 0b33c6cdb963add4f80e3ecae66cccc071f750a2 Mon Sep 17 00:00:00 2001 From: Stan Date: Mon, 14 Sep 2026 19:26:43 +0500 Subject: [PATCH 32/38] fix(aimlapi): a toggle- or budget-only baseline is unresolved, full stop HOST_EFFORT_LIVE let four ids with a toggle/budget-only lab keep the host's effort enum because the field measured live on this wire (Flash-Lite orders reasoning tokens; the Qwen names select the lab's thinking budget). The review held, across every round, that a lab or peer without an effort ladder gives nothing to intersect with and that publishing the host's list under those ids claims a control family the baseline does not use. This follows that: the no-effort branch of resolveLadder is unresolved unconditionally, and gemini-2.5-flash-lite, qwen3.6-27b, qwen3.7-max and qwen3.6-35b-a3b leave the catalogue until the lab publishes an effort ladder or this host exposes the budget as such. The measurements are kept in the source as HOST_EFFORT_MEASURED_BUT_UNPUBLISHED so the skip is not mistaken for a finding that the field did nothing. --- packages/core/src/sync/providers/aimlapi.ts | 61 +++++++------------ packages/core/test/aimlapi.test.ts | 13 ++-- .../aimlapi/models/alibaba/qwen3.6-27b.toml | 18 ------ .../models/alibaba/qwen3.6-35b-a3b.toml | 19 ------ .../aimlapi/models/alibaba/qwen3.7-max.toml | 15 ----- .../models/google/gemini-2.5-flash-lite.toml | 15 ----- 6 files changed, 30 insertions(+), 111 deletions(-) delete mode 100644 providers/aimlapi/models/alibaba/qwen3.6-27b.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml delete mode 100644 providers/aimlapi/models/alibaba/qwen3.7-max.toml delete mode 100644 providers/aimlapi/models/google/gemini-2.5-flash-lite.toml diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 66347d7d494..1419eff6e7b 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -756,28 +756,27 @@ function readLadder(providerDir: string, modelPaths: readonly string[], source: */ /** - * Ids whose lab entry has reasoning options but NO effort ladder — toggle or - * budget only — and whose `reasoning_effort` on this host was measured to be - * a live control anyway. The intersection has nothing to intersect with here, - * so this list is what stands between "the host's enum" and "an invented - * ladder": an id is on it only with an invalid value rejected AND either an - * ordering or a mapping onto the lab's own control. + * Toggle- or budget-only labs whose `reasoning_effort` on this host was + * nonetheless measured to be live, recorded so the decision not to publish + * them can be revisited with the evidence in hand: * * gemini-2.5-flash-lite low 863 -> high 2399 reasoning tokens * qwen3.6-27b, qwen3.7-max, qwen3.6-35b-a3b - * `low`/`medium` map onto the lab's thinking - * budget: the gateway answers "must be greater than + * `low`/`medium` select the lab's thinking budget: + * the gateway answers "must be greater than * thinking_budget [8192]" / "[32768]" when - * max_tokens is below them. That reads like a - * refused rung and is the opposite — the effort - * name IS the budget tier, which is the lab's own - * control under the host's spelling. + * max_tokens is below them. * - * Everything else with a toggle-only lab was measured on repeats and did not - * order; those are in `EFFORT_VALIDATED_BUT_INERT` and publish `[]`. Nothing - * with a toggle-only lab is left on the host's enum without a probe behind it. + * They are NOT published. The baseline rule is lab ∩ host, and a lab that + * lists only a toggle or a budget has no effort ladder to intersect with; an + * effort list here would be the host's control family under a name the lab + * and its peers (OpenRouter: toggle only) do not use. The review held that + * line across several rounds and it is the line this file follows: these + * four reasoners are unresolved and skipped until either the lab publishes + * an effort ladder or this host exposes the budget itself. The measurements + * above stay so nobody reads the skip as a finding that the field did nothing. */ -const HOST_EFFORT_LIVE: ReadonlySet = new Set([ +export const HOST_EFFORT_MEASURED_BUT_UNPUBLISHED: ReadonlySet = new Set([ "google/gemini-2.5-flash-lite", "alibaba/qwen3.6-27b", "alibaba/qwen3.7-max", @@ -915,15 +914,14 @@ export function resolveLadder(id: string, base: string, host: readonly string[]) break; } case "no-effort": - // The lab has spoken and said "toggle / budget, no effort ladder". A - // host effort enum contradicts that, so it ships only where a probe - // showed the host's field is a live, host-native control — measured - // ordering, or a mapping onto the lab's own budget tiers. Otherwise the - // model is skipped: `[]` would claim no control, which the validated - // field rules out, and the enum would claim a family the lab denies. - if (!HOST_EFFORT_LIVE.has(id)) return undefined; - values = [...host]; - break; + // The lab (or, failing it, the peer) has spoken and said "toggle / + // budget, no effort ladder". There is nothing to intersect with, and a + // host effort enum would claim a control family the baseline denies — + // even where the field measured live (see + // HOST_EFFORT_MEASURED_BUT_UNPUBLISHED). `[]` would claim no control, + // which a validated field rules out. So the model is unresolved and + // skipped. + return undefined; case "no-entry": // Neither the lab nor the peer publishes a ladder for this model, so // there is nothing to intersect with and the host's enum would ship as @@ -1010,19 +1008,6 @@ function wireHeader(id: string, reasoningOptions: Array<{ type: "effort"; values : "# do not order reasoning tokens; toggle/budget fields are dropped by the gateway.", ); } - if (HOST_EFFORT_LIVE.has(measuredId)) { - lines.push( - ...(measuredId.startsWith("alibaba/") - ? [ - "# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768", - "# thinking_budget per the gateway's own 400 text); no separate toggle/budget field.", - ] - : [ - "# Effort orders reasoning tokens on this wire (low 863 -> high 2399 measured);", - "# no separate toggle/budget field, unknown top-level keys are dropped.", - ]), - ); - } if (NONE_IS_REAL_OFF.has(measuredId)) { lines.push("# Off: reasoning_effort = none (0 reasoning tokens); no toggle field on this surface."); } diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index e5e03da9650..967cd076a3b 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -42,7 +42,7 @@ test("intersects the host enum with the lab ladder and drops the rest", () => { test("`none` survives only where measured as a real off switch", () => { // Same lab, same host enum; only the measurement differs. expect(resolveLadder("deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-pro", HOST)).toContain("none"); - expect(resolveLadder("alibaba/qwen3.7-max", "alibaba/qwen3.7-max", HOST)).not.toContain("none"); + expect(resolveLadder("deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash", HOST)).toContain("none"); }); test("`none` is kept where the lab itself lists it", () => { @@ -60,12 +60,13 @@ test("a measurement narrows but never widens past the lab", () => { // or the model is unresolved. test("a toggle-only lab base never yields the host's effort dump", () => { const host = ["none", "minimal", "low", "medium", "high"]; - // glm-4.5v: lab toggle-only, not in HOST_EFFORT_LIVE -> unresolved. + // glm-4.5v: lab toggle-only -> unresolved. expect(resolveLadder("z-ai/glm-4.5v", "zhipuai/glm-4.5v", host)).toBeUndefined(); - // qwen3.7-max: lab toggle+budget, but its `low`/`medium` map onto the lab's - // own budget tiers on this host -> the host enum is a live control, minus - // the unmeasured `none`. - expect(resolveLadder("alibaba/qwen3.7-max", "alibaba/qwen3.7-max", host)).toEqual(["minimal", "low", "medium", "high"]); + // qwen3.7-max: lab toggle+budget. The host's effort field measured live + // (its names select the budget tiers), and it is still unresolved: a + // toggle/budget baseline has no effort ladder to intersect with. + expect(resolveLadder("alibaba/qwen3.7-max", "alibaba/qwen3.7-max", host)).toBeUndefined(); + expect(resolveLadder("google/gemini-2.5-flash-lite", "google/gemini-2.5-flash-lite", host)).toBeUndefined(); }); test("an empty intersection is unresolved, not the host enum", () => { diff --git a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml b/providers/aimlapi/models/alibaba/qwen3.6-27b.toml deleted file mode 100644 index f6a26e2a32d..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.6-27b.toml +++ /dev/null @@ -1,18 +0,0 @@ -# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768 -# thinking_budget per the gateway's own 400 text); no separate toggle/budget field. -base_model = "alibaba/qwen3.6-27b" - -[interleaved] -field = "reasoning_content" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.78 -output = 4.68 - -[limit] -context = 256_000 -output = 252_000 diff --git a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml b/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml deleted file mode 100644 index 4f0c5e8815d..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.6-35b-a3b.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768 -# thinking_budget per the gateway's own 400 text); no separate toggle/budget field. -base_model = "alibaba/qwen3.6-35b-a3b" -name = "Qwen3.6 35B A3B" - -[interleaved] -field = "reasoning_content" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 0.4875 -output = 2.925 - -[limit] -context = 256_000 -output = 252_000 diff --git a/providers/aimlapi/models/alibaba/qwen3.7-max.toml b/providers/aimlapi/models/alibaba/qwen3.7-max.toml deleted file mode 100644 index 1f017889c35..00000000000 --- a/providers/aimlapi/models/alibaba/qwen3.7-max.toml +++ /dev/null @@ -1,15 +0,0 @@ -# Effort names select the lab's thinking budget on this wire (low = 8192, medium = 32768 -# thinking_budget per the gateway's own 400 text); no separate toggle/budget field. -base_model = "alibaba/qwen3.7-max" - -[interleaved] -field = "reasoning_content" - -[[reasoning_options]] -type = "effort" -values = ["low", "medium", "high"] - -[cost] -input = 2.6 -output = 7.8 -cache_read = 2.6 diff --git a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml b/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml deleted file mode 100644 index 4e6e215f06c..00000000000 --- a/providers/aimlapi/models/google/gemini-2.5-flash-lite.toml +++ /dev/null @@ -1,15 +0,0 @@ -# Effort orders reasoning tokens on this wire (low 863 -> high 2399 measured); -# no separate toggle/budget field, unknown top-level keys are dropped. -base_model = "google/gemini-2.5-flash-lite" - -[[reasoning_options]] -type = "effort" -values = ["minimal", "low", "medium", "high", "max"] - -[cost] -input = 0.0975 -output = 0.39 -cache_read = 0.0975 - -[limit] -context = 1_000_000 From ef5c28dcafda1ee4113db6aabb328e358140492f Mon Sep 17 00:00:00 2001 From: Stan Date: Mon, 14 Sep 2026 20:08:53 +0500 Subject: [PATCH 33/38] fix(aimlapi): read a lab split across two provider directories from both MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Meta's Llama cards live under providers/llama/ and its Muse cards under providers/meta/, so mapping the metadata lab to one directory missed every Muse lab entry and fell through to the OpenRouter peer. Try the mapped directory and the lab's own name. The Muse cards themselves do not change — lab and peer agree with the host on low/medium/high — but they are now resolved from the lab, and the test no longer locks in meta -> llama alone. --- packages/core/src/sync/providers/aimlapi.ts | 16 ++++++++++++---- packages/core/test/aimlapi.test.ts | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 1419eff6e7b..feb59508973 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -694,7 +694,14 @@ export function labLadder(baseModelID: string): LabLadder { // directory, and for `zhipuai` -> `zai`, `meta` -> `llama` those differ. // The first version of this lookup assumed they matched and silently kept // the host enum for every GLM id — the review caught it from the TOMLs. - const lab = providerDirForMetadataLab(baseModelID.slice(0, slash)); + // The mapping is not one-to-one either: Meta's Llama cards live under + // `llama/` but its Muse cards under `meta/`, so both the mapped directory + // and the lab's own name are tried, and the lookup that assumed one + // directory per lab was the second silent miss of the same kind. + const metadataLab = baseModelID.slice(0, slash); + const labDirs = [providerDirForMetadataLab(metadataLab), metadataLab].filter( + (dir, index, all) => all.indexOf(dir) === index, + ); const name = baseModelID.slice(slash + 1); // A dated snapshot (`deepseek-v4-pro-0813`) has no lab entry of its own and // is the same control surface as the model it snapshots, so it borrows that @@ -703,8 +710,10 @@ export function labLadder(baseModelID: string): LabLadder { const candidates = [name, name.replace(/-\d{4}$/, "")].filter( (candidate, index, all) => all.indexOf(candidate) === index, ); - const own = readLadder(lab, candidates, "lab"); - if (own.kind !== "no-entry") return own; + for (const labDir of labDirs) { + const own = readLadder(labDir, candidates, "lab"); + if (own.kind !== "no-entry") return own; + } // No first-party entry. The next-best baseline is an established peer on // the same surface: OpenRouter's card for the same lab id, which the review // names as the reference whenever the lab is silent. Its ladder is used @@ -712,7 +721,6 @@ export function labLadder(baseModelID: string): LabLadder { // toggle-only cards count as "no effort ladder" just as a lab's would. // OpenRouter files Alibaba under `qwen/`, so every directory it uses for // the lab is tried. Only when neither exists is the model unresolved. - const metadataLab = baseModelID.slice(0, slash); const peerPaths = openrouterDirsForMetadataLab(metadataLab).flatMap((dir) => candidates.map((candidate) => `${dir}/${candidate}`), ); diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index 967cd076a3b..fa2d19242fd 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -8,11 +8,25 @@ import { providerDirForMetadataLab } from "../src/sync/providers/openrouter.js"; // for these two they differ. test("maps a metadata lab to its first-party provider directory", () => { expect(providerDirForMetadataLab("zhipuai")).toBe("zai"); - expect(providerDirForMetadataLab("meta")).toBe("llama"); expect(providerDirForMetadataLab("deepseek")).toBe("deepseek"); expect(providerDirForMetadataLab("no-such-lab")).toBe("no-such-lab"); }); +test("a lab split across two provider directories is read from both", () => { + // Meta's Llama cards live under `llama/`, its Muse cards under `meta/`. + expect(providerDirForMetadataLab("meta")).toBe("llama"); + expect(labLadder("meta/muse-spark-1.1")).toEqual({ + kind: "effort", + values: ["minimal", "low", "medium", "high", "xhigh"], + source: "lab", + }); + expect(resolveLadder("meta/muse-spark-1.1", "meta/muse-spark-1.1", ["low", "medium", "high"])).toEqual([ + "low", + "medium", + "high", + ]); +}); + test("reads the lab ladder through the provider directory, not the model record", () => { // `models/zhipuai/*.toml` has no reasoning_options; `providers/zai/models` // does. A lookup on the wrong one returns undefined and looks like "no lab From 01fb851161d32b4785c9c2dc130ac3f6acbfc79c Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 12 Oct 2026 20:32:33 -0500 Subject: [PATCH 34/38] fix(core): route new AI/ML API models through missing-model issue flow --- packages/core/src/sync/providers/aimlapi.ts | 49 +++++++++++------ packages/core/test/aimlapi.test.ts | 60 ++++++++++++++++++++- 2 files changed, 91 insertions(+), 18 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index feb59508973..605e5ed7158 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -87,9 +87,8 @@ const isEffortValue = (value: string): value is EffortValue => EFFORT_RANK.has(v * to this list — a row that starts working should come back. * * The guard sits on the publish path, so the entry is never created or updated. - * It does not delete a file that is already on disk: this sync runs with - * `deleteMissing: false`, so removing a published row still takes an explicit - * delete, as it did here. + * With `deleteMissing` enabled, a published row for one of these ids is + * removed by sync like any other model the host no longer serves. */ const NOT_CALLABLE: ReadonlySet = new Set([ "anthropic/claude-opus-4.7-fast", @@ -1022,33 +1021,49 @@ function wireHeader(id: string, reasoningOptions: Array<{ type: "effort"; values return lines.length > 0 ? lines.join("\n") + "\n" : undefined; } +/** + * The remote id to report for a chat candidate, or `undefined` for records + * sync intentionally ignores: uncallable rows, dashed alias duplicates, and + * anything that is not a text-output chat model. Shared by `sourceID` (report + * the skip) and `missingModelID` (route the skip to the missing-model issue + * flow): every remaining skip is "cannot fully populate" — no lab entry to + * point `base_model` at, no resolvable reasoning control, or no price — which + * is exactly what that flow exists to research. + */ +function candidateID(model: AimlapiModel): string | undefined { + if (NOT_CALLABLE.has(model.id)) return undefined; + if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; + return isChatTextModel(model) ? model.id : undefined; +} + export const aimlapi = { id: "aimlapi", name: "AI/ML API", modelsDir: "providers/aimlapi/models", - // The catalog turns over quickly and lists far more than the chat surface, so - // a local model missing from one response is not proof that it is gone. - deleteMissing: false, + // Sync owns what the catalog can state for models already on disk: pricing, + // limits, reasoning controls, and removal once the host stops serving a + // model (`deleteMissing`). It never creates a model: the catalog cannot + // fully populate a new entry (no lab metadata, capabilities, or dates), so + // every remote-only model goes through the missing-model issue flow + // (`skipCreates`), where the lab entry and provider card are authored and + // reviewed. Later syncs then keep that file updated. + skipCreates: true, + trackMissingModels: true, + deleteMissing: true, authoritativeHeaders: true, sourceID(model) { - if (NOT_CALLABLE.has(model.id)) return undefined; - if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; - return isChatTextModel(model) ? model.id : undefined; + return candidateID(model); + }, + missingModelID(model) { + return candidateID(model); }, skippedNotice(ids) { if (ids.length === 0) return []; return [ - `${ids.length} AI/ML API chat models were skipped because this repository has no lab entry to point \`base_model\` at, or because the API does not document the reasoning control a reasoning model requires.`, + `${ids.length} AI/ML API chat models were not written by sync: new models are routed to the missing-model issue flow for authoring, and models sync cannot fully populate (no lab entry to point \`base_model\` at, no resolvable reasoning control, or no published price) are reported there instead of being guessed. Existing files for those ids are preserved.`, `Skipped remote IDs: ${ids.map((id) => `\`${id}\``).join(", ")}`, ]; }, - missingNotice(paths) { - if (paths.length === 0) return []; - return [ - `${paths.length} local AI/ML API models were absent from the catalog and were retained for manual lifecycle review.`, - `Retained local paths: ${paths.map((item) => `\`${item}\``).join(", ")}`, - ]; - }, async fetchModels() { const response = await fetch(API_ENDPOINT); if (!response.ok) { diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index fa2d19242fd..9eec32b9cf7 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test"; -import { labEffortValues, labLadder, resolveLadder } from "../src/sync/providers/aimlapi.js"; +import { aimlapi, labEffortValues, labLadder, resolveLadder } from "../src/sync/providers/aimlapi.js"; import { providerDirForMetadataLab } from "../src/sync/providers/openrouter.js"; // The lookup that silently kept the host enum for every GLM id: `base_model` @@ -119,3 +119,61 @@ test("a wire alias resolves through the measurements of the id it answers as", ( ); expect(resolveLadder("deepseek/deepseek-chat", "deepseek/deepseek-v4-flash", host)).toEqual(["none", "low", "high"]); }); + +// Sync owns updates and removals for models already on disk, but never +// creates: a new model goes through the missing-model issue flow, where its +// lab entry and provider card are authored and reviewed. +test("sync updates and removes existing models but routes creates to issues", () => { + expect(aimlapi.skipCreates).toBe(true); + expect(aimlapi.trackMissingModels).toBe(true); + expect(aimlapi.deleteMissing).toBe(true); +}); + +test("only chat candidates are reported for the missing-model issue flow", () => { + const models = aimlapi.parseModels({ + data: [ + { + id: "acme/chat-1", + type: "openai/chat-completions", + info: { name: "Chat 1" }, + modalities: { input: ["text"], output: ["text"] }, + }, + { + id: "acme/image-1", + type: "openai/image-generations", + info: { name: "Image 1" }, + modalities: { input: ["text"], output: ["image"] }, + }, + { + id: "anthropic/claude-opus-4.8", + type: "openai/chat-completions", + info: { name: "Claude Opus 4.8" }, + modalities: { input: ["text"], output: ["text"] }, + }, + { + id: "anthropic/claude-opus-4-8", + type: "openai/chat-completions", + info: { name: "Claude Opus 4.8" }, + modalities: { input: ["text"], output: ["text"] }, + }, + { + id: "anthropic/claude-opus-4.7-fast", + type: "openai/chat-completions", + info: { name: "Claude Opus 4.7 Fast" }, + modalities: { input: ["text"], output: ["text"] }, + }, + ], + }); + const byID = new Map(models.map((model) => [model.id, model])); + // A chat candidate a skip cannot fully populate is reported and routed to + // an issue; intentional ignores (non-chat, alias duplicate, uncallable) + // are neither, so sync can still delete those files when they go stale. + expect(aimlapi.sourceID(byID.get("acme/chat-1")!)).toBe("acme/chat-1"); + expect(aimlapi.missingModelID(byID.get("acme/chat-1")!)).toBe("acme/chat-1"); + expect(aimlapi.sourceID(byID.get("acme/image-1")!)).toBeUndefined(); + expect(aimlapi.missingModelID(byID.get("acme/image-1")!)).toBeUndefined(); + expect(aimlapi.sourceID(byID.get("anthropic/claude-opus-4-8")!)).toBeUndefined(); + expect(aimlapi.missingModelID(byID.get("anthropic/claude-opus-4-8")!)).toBeUndefined(); + expect(aimlapi.sourceID(byID.get("anthropic/claude-opus-4.7-fast")!)).toBeUndefined(); + expect(aimlapi.missingModelID(byID.get("anthropic/claude-opus-4.7-fast")!)).toBeUndefined(); +}); From 97c01575697d4ace4d8d9a359b984ea7df27ed6d Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 12 Oct 2026 20:51:50 -0500 Subject: [PATCH 35/38] fix(core): populate AI/ML API baseline upfront, blacklist junk upstream rows --- models/aion-labs/aion-2.0.toml | 20 ++++ models/aion-labs/aion-3.0-mini.toml | 20 ++++ models/aion-labs/aion-3.0.toml | 20 ++++ models/aion-labs/aion-rp-llama-3.1-8b.toml | 22 +++++ models/alibaba/qwen3-max-preview.toml | 21 +++++ models/alibaba/qwen3-vl-flash.toml | 20 ++++ models/amazon/nova-2-lite-v1.toml | 21 +++++ models/amazon/nova-lite-v1.toml | 22 +++++ models/amazon/nova-micro-v1.toml | 22 +++++ models/amazon/nova-pro-v1.toml | 22 +++++ models/anthracite-org/magnum-v4-72b.toml | 21 +++++ models/baidu/ernie-4.5-vl-424b-a47b.toml | 22 +++++ .../dolphin-mistral-24b-venice-edition.toml | 22 +++++ models/cohere/command-a.toml | 22 +++++ models/deepseek/deepseek-chat-v3-0324.toml | 22 +++++ models/deepseek/deepseek-chat-v3.1.toml | 22 +++++ models/google/gemini-2.5-pro-preview.toml | 22 +++++ models/google/gemma-2-27b-it.toml | 22 +++++ models/gryphe/mythomax-l2-13b.toml | 21 +++++ models/ibm/granite-4.2-8b.toml | 21 +++++ models/inception/mercury-2.5.toml | 21 +++++ models/inception/mercury-2.toml | 21 +++++ models/inclusionai/ling-3.0-flash-sante.toml | 19 ++++ models/inclusionai/ling-3.0-flash-vl.toml | 21 +++++ models/inclusionai/ling-3.0-flash.toml | 21 +++++ models/inference-net/schematron-v2-small.toml | 20 ++++ models/inference-net/schematron-v2-turbo.toml | 20 ++++ models/mancer/weaver.toml | 22 +++++ models/minimax/MiniMax-Text-01.toml | 21 +++++ models/mistral/codestral-2508.toml | 22 +++++ models/mistral/ministral-14b-2512.toml | 21 +++++ models/mistral/ministral-3b-2512.toml | 21 +++++ models/mistral/ministral-8b-2512.toml | 21 +++++ models/mistral/mistral-large-2407.toml | 22 +++++ models/mistral/mistral-large.toml | 22 +++++ models/mistral/mistral-medium-3-5.toml | 21 +++++ models/mistral/mistral-medium-3.1.toml | 22 +++++ models/mistral/mistral-medium-3.toml | 22 +++++ models/mistral/mistral-saba.toml | 22 +++++ .../mistral-small-24b-instruct-2501.toml | 22 +++++ .../mistral-small-3.1-24b-instruct.toml | 22 +++++ .../mistral-small-3.2-24b-instruct.toml | 22 +++++ models/mistral/mixtral-8x22b-instruct.toml | 22 +++++ models/moonshotai/kimi-k2-0905.toml | 22 +++++ models/moonshotai/kimi-k2.toml | 22 +++++ models/morph/morph-v3-fast.toml | 21 +++++ models/morph/morph-v3-large.toml | 21 +++++ .../nousresearch/hermes-3-llama-3.1-405b.toml | 22 +++++ .../nousresearch/hermes-3-llama-3.1-70b.toml | 22 +++++ models/nousresearch/hermes-4-405b.toml | 22 +++++ models/openai/gpt-5-image-mini.toml | 21 +++++ models/openai/gpt-5-image.toml | 22 +++++ models/openai/gpt-5.4-image-2.toml | 21 +++++ models/perceptron/perceptron-mk1.toml | 20 ++++ models/rekaai/reka-edge.toml | 21 +++++ models/rekaai/reka-flash-3.toml | 22 +++++ models/relace/relace-apply-3.toml | 20 ++++ models/relace/relace-search.toml | 20 ++++ models/sakana/fugu-max.toml | 21 +++++ models/sakana/fugu-ultra-v2.toml | 22 +++++ models/sao10k/l3-lunaris-8b.toml | 22 +++++ models/sao10k/l3.1-euryale-70b.toml | 22 +++++ models/sao10k/l3.3-euryale-70b.toml | 22 +++++ models/tencent/hy-mt2-1.8b.toml | 21 +++++ models/tencent/hy-mt2-30b-a3b.toml | 21 +++++ models/tencent/hy-mt2-7b.toml | 21 +++++ models/thedrummer/cydonia-24b-v4.1.toml | 21 +++++ models/thedrummer/skyfall-36b-v2.toml | 21 +++++ models/thedrummer/unslopnemo-12b.toml | 21 +++++ models/undi95/remm-slerp-l2-13b.toml | 21 +++++ models/xai/grok-4-fast-non-reasoning.toml | 20 ++++ models/xai/grok-4-fast-reasoning.toml | 20 ++++ models/xai/grok-code-fast-1.toml | 20 ++++ packages/core/src/sync/providers/aimlapi.ts | 94 +++++++++++++++++++ .../aion-labs/aion-rp-llama-3.1-8b.toml | 8 ++ .../models/alibaba/qwen3-max-preview.toml | 9 ++ .../models/alibaba/qwen3-vl-flash.toml | 7 ++ .../aimlapi/models/amazon/nova-lite-v1.toml | 5 + .../aimlapi/models/amazon/nova-micro-v1.toml | 5 + .../aimlapi/models/amazon/nova-pro-v1.toml | 5 + .../models/anthracite-org/magnum-v4-72b.toml | 9 ++ .../models/anthropic/claude-fable-5.1.toml | 10 ++ .../models/anthropic/claude-fable-5.toml | 2 +- .../models/anthropic/claude-opus-5.toml | 10 ++ .../models/bytedance-seed/seed-1.6-flash.toml | 9 ++ .../dolphin-mistral-24b-venice-edition.toml | 6 ++ .../aimlapi/models/cohere/command-a.toml | 8 ++ .../deepseek/deepseek-chat-v3-0324.toml | 11 +++ .../models/deepseek/deepseek-v4-pro.toml | 6 +- .../models/deepseek/deepseek-v4.1-flash.toml | 13 +++ .../models/google/gemini-3-8-flash.toml | 10 ++ .../models/google/gemini-3.8-flash.toml | 10 ++ .../aimlapi/models/google/gemma-2-27b-it.toml | 5 + .../aimlapi/models/google/gemma-3-12b-it.toml | 11 +++ .../aimlapi/models/google/gemma-3-27b-it.toml | 11 +++ .../aimlapi/models/google/gemma-3-4b-it.toml | 11 +++ .../models/gryphe/mythomax-l2-13b.toml | 10 ++ .../ibm-granite/granite-4.0-h-micro.toml | 10 ++ .../aimlapi/models/inception/mercury-2.5.toml | 10 ++ .../aimlapi/models/inception/mercury-2.toml | 10 ++ .../inference-net/schematron-v2-small.toml | 5 + .../inference-net/schematron-v2-turbo.toml | 5 + providers/aimlapi/models/mancer/weaver.toml | 8 ++ .../Llama-3.3-70B-Instruct-Turbo.toml | 9 ++ .../aimlapi/models/meta/muse-spark-1.3.toml | 10 ++ .../models/mistralai/codestral-2508.toml | 6 ++ .../models/mistralai/ministral-14b-2512.toml | 6 ++ .../models/mistralai/ministral-3b-2512.toml | 6 ++ .../models/mistralai/ministral-8b-2512.toml | 6 ++ .../models/mistralai/mistral-large-2407.toml | 7 ++ .../models/mistralai/mistral-large-2512.toml | 7 -- .../models/mistralai/mistral-large.toml | 7 ++ .../models/mistralai/mistral-medium-3-5.toml | 10 ++ .../models/mistralai/mistral-medium-3.1.toml | 7 ++ .../models/mistralai/mistral-medium-3.toml | 7 ++ .../models/mistralai/mistral-saba.toml | 6 ++ .../mistral-small-24b-instruct-2501.toml | 6 ++ .../mistral-small-3.1-24b-instruct.toml | 9 ++ .../mistral-small-3.2-24b-instruct.toml | 9 ++ .../mistralai/mixtral-8x22b-instruct.toml | 6 ++ .../mistralai/voxtral-small-24b-2507.toml | 9 ++ .../models/moonshotai/kimi-k2-0905.toml | 5 + .../aimlapi/models/moonshotai/kimi-k2.toml | 5 + .../aimlapi/models/morph/morph-v3-fast.toml | 6 ++ .../aimlapi/models/morph/morph-v3-large.toml | 6 ++ .../nousresearch/hermes-3-llama-3.1-405b.toml | 5 + .../nousresearch/hermes-3-llama-3.1-70b.toml | 5 + providers/aimlapi/models/openai/gpt-5-1.toml | 10 ++ providers/aimlapi/models/openai/gpt-5-2.toml | 10 ++ providers/aimlapi/models/openai/gpt-5-4.toml | 10 ++ providers/aimlapi/models/openai/gpt-5-5.toml | 10 ++ .../models/openai/gpt-5.4-image-2.toml | 10 ++ .../aimlapi/models/openai/gpt-6-astra.toml | 10 ++ .../models/openai/gpt-oss-safeguard-20b.toml | 14 +++ .../aimlapi/models/rekaai/reka-edge.toml | 8 ++ .../aimlapi/models/relace/relace-apply-3.toml | 6 ++ .../aimlapi/models/relace/relace-search.toml | 6 ++ providers/aimlapi/models/sakana/fugu-max.toml | 10 ++ .../aimlapi/models/sakana/fugu-ultra-v2.toml | 10 ++ .../aimlapi/models/sao10k/l3-lunaris-8b.toml | 5 + .../models/sao10k/l3.1-euryale-70b.toml | 5 + .../models/sao10k/l3.3-euryale-70b.toml | 5 + .../aimlapi/models/tencent/hy-mt2-1.8b.toml | 5 + .../models/tencent/hy-mt2-30b-a3b.toml | 5 + .../aimlapi/models/tencent/hy-mt2-7b.toml | 5 + .../models/thedrummer/cydonia-24b-v4.1.toml | 9 ++ .../models/thedrummer/skyfall-36b-v2.toml | 9 ++ .../models/thedrummer/unslopnemo-12b.toml | 9 ++ .../models/undi95/remm-slerp-l2-13b.toml | 8 ++ .../aimlapi/models/upstage/solar-pro-3.toml | 13 +++ .../x-ai/grok-4-20-0309-non-reasoning.toml | 11 +++ .../x-ai/grok-4-fast-non-reasoning.toml | 10 ++ providers/aimlapi/models/zhipu/glm-5.2.toml | 11 +++ providers/aimlapi/models/zhipu/glm-5.3.toml | 14 +++ 154 files changed, 2277 insertions(+), 11 deletions(-) create mode 100644 models/aion-labs/aion-2.0.toml create mode 100644 models/aion-labs/aion-3.0-mini.toml create mode 100644 models/aion-labs/aion-3.0.toml create mode 100644 models/aion-labs/aion-rp-llama-3.1-8b.toml create mode 100644 models/alibaba/qwen3-max-preview.toml create mode 100644 models/alibaba/qwen3-vl-flash.toml create mode 100644 models/amazon/nova-2-lite-v1.toml create mode 100644 models/amazon/nova-lite-v1.toml create mode 100644 models/amazon/nova-micro-v1.toml create mode 100644 models/amazon/nova-pro-v1.toml create mode 100644 models/anthracite-org/magnum-v4-72b.toml create mode 100644 models/baidu/ernie-4.5-vl-424b-a47b.toml create mode 100644 models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml create mode 100644 models/cohere/command-a.toml create mode 100644 models/deepseek/deepseek-chat-v3-0324.toml create mode 100644 models/deepseek/deepseek-chat-v3.1.toml create mode 100644 models/google/gemini-2.5-pro-preview.toml create mode 100644 models/google/gemma-2-27b-it.toml create mode 100644 models/gryphe/mythomax-l2-13b.toml create mode 100644 models/ibm/granite-4.2-8b.toml create mode 100644 models/inception/mercury-2.5.toml create mode 100644 models/inception/mercury-2.toml create mode 100644 models/inclusionai/ling-3.0-flash-sante.toml create mode 100644 models/inclusionai/ling-3.0-flash-vl.toml create mode 100644 models/inclusionai/ling-3.0-flash.toml create mode 100644 models/inference-net/schematron-v2-small.toml create mode 100644 models/inference-net/schematron-v2-turbo.toml create mode 100644 models/mancer/weaver.toml create mode 100644 models/minimax/MiniMax-Text-01.toml create mode 100644 models/mistral/codestral-2508.toml create mode 100644 models/mistral/ministral-14b-2512.toml create mode 100644 models/mistral/ministral-3b-2512.toml create mode 100644 models/mistral/ministral-8b-2512.toml create mode 100644 models/mistral/mistral-large-2407.toml create mode 100644 models/mistral/mistral-large.toml create mode 100644 models/mistral/mistral-medium-3-5.toml create mode 100644 models/mistral/mistral-medium-3.1.toml create mode 100644 models/mistral/mistral-medium-3.toml create mode 100644 models/mistral/mistral-saba.toml create mode 100644 models/mistral/mistral-small-24b-instruct-2501.toml create mode 100644 models/mistral/mistral-small-3.1-24b-instruct.toml create mode 100644 models/mistral/mistral-small-3.2-24b-instruct.toml create mode 100644 models/mistral/mixtral-8x22b-instruct.toml create mode 100644 models/moonshotai/kimi-k2-0905.toml create mode 100644 models/moonshotai/kimi-k2.toml create mode 100644 models/morph/morph-v3-fast.toml create mode 100644 models/morph/morph-v3-large.toml create mode 100644 models/nousresearch/hermes-3-llama-3.1-405b.toml create mode 100644 models/nousresearch/hermes-3-llama-3.1-70b.toml create mode 100644 models/nousresearch/hermes-4-405b.toml create mode 100644 models/openai/gpt-5-image-mini.toml create mode 100644 models/openai/gpt-5-image.toml create mode 100644 models/openai/gpt-5.4-image-2.toml create mode 100644 models/perceptron/perceptron-mk1.toml create mode 100644 models/rekaai/reka-edge.toml create mode 100644 models/rekaai/reka-flash-3.toml create mode 100644 models/relace/relace-apply-3.toml create mode 100644 models/relace/relace-search.toml create mode 100644 models/sakana/fugu-max.toml create mode 100644 models/sakana/fugu-ultra-v2.toml create mode 100644 models/sao10k/l3-lunaris-8b.toml create mode 100644 models/sao10k/l3.1-euryale-70b.toml create mode 100644 models/sao10k/l3.3-euryale-70b.toml create mode 100644 models/tencent/hy-mt2-1.8b.toml create mode 100644 models/tencent/hy-mt2-30b-a3b.toml create mode 100644 models/tencent/hy-mt2-7b.toml create mode 100644 models/thedrummer/cydonia-24b-v4.1.toml create mode 100644 models/thedrummer/skyfall-36b-v2.toml create mode 100644 models/thedrummer/unslopnemo-12b.toml create mode 100644 models/undi95/remm-slerp-l2-13b.toml create mode 100644 models/xai/grok-4-fast-non-reasoning.toml create mode 100644 models/xai/grok-4-fast-reasoning.toml create mode 100644 models/xai/grok-code-fast-1.toml create mode 100644 providers/aimlapi/models/aion-labs/aion-rp-llama-3.1-8b.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-max-preview.toml create mode 100644 providers/aimlapi/models/alibaba/qwen3-vl-flash.toml create mode 100644 providers/aimlapi/models/amazon/nova-lite-v1.toml create mode 100644 providers/aimlapi/models/amazon/nova-micro-v1.toml create mode 100644 providers/aimlapi/models/amazon/nova-pro-v1.toml create mode 100644 providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml create mode 100644 providers/aimlapi/models/anthropic/claude-fable-5.1.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-5.toml create mode 100644 providers/aimlapi/models/bytedance-seed/seed-1.6-flash.toml create mode 100644 providers/aimlapi/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml create mode 100644 providers/aimlapi/models/cohere/command-a.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-chat-v3-0324.toml create mode 100644 providers/aimlapi/models/deepseek/deepseek-v4.1-flash.toml create mode 100644 providers/aimlapi/models/google/gemini-3-8-flash.toml create mode 100644 providers/aimlapi/models/google/gemini-3.8-flash.toml create mode 100644 providers/aimlapi/models/google/gemma-2-27b-it.toml create mode 100644 providers/aimlapi/models/google/gemma-3-12b-it.toml create mode 100644 providers/aimlapi/models/google/gemma-3-27b-it.toml create mode 100644 providers/aimlapi/models/google/gemma-3-4b-it.toml create mode 100644 providers/aimlapi/models/gryphe/mythomax-l2-13b.toml create mode 100644 providers/aimlapi/models/ibm-granite/granite-4.0-h-micro.toml create mode 100644 providers/aimlapi/models/inception/mercury-2.5.toml create mode 100644 providers/aimlapi/models/inception/mercury-2.toml create mode 100644 providers/aimlapi/models/inference-net/schematron-v2-small.toml create mode 100644 providers/aimlapi/models/inference-net/schematron-v2-turbo.toml create mode 100644 providers/aimlapi/models/mancer/weaver.toml create mode 100644 providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml create mode 100644 providers/aimlapi/models/meta/muse-spark-1.3.toml create mode 100644 providers/aimlapi/models/mistralai/codestral-2508.toml create mode 100644 providers/aimlapi/models/mistralai/ministral-14b-2512.toml create mode 100644 providers/aimlapi/models/mistralai/ministral-3b-2512.toml create mode 100644 providers/aimlapi/models/mistralai/ministral-8b-2512.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-large-2407.toml delete mode 100644 providers/aimlapi/models/mistralai/mistral-large-2512.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-large.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-medium-3-5.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-medium-3.1.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-medium-3.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-saba.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-small-24b-instruct-2501.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-small-3.1-24b-instruct.toml create mode 100644 providers/aimlapi/models/mistralai/mistral-small-3.2-24b-instruct.toml create mode 100644 providers/aimlapi/models/mistralai/mixtral-8x22b-instruct.toml create mode 100644 providers/aimlapi/models/mistralai/voxtral-small-24b-2507.toml create mode 100644 providers/aimlapi/models/moonshotai/kimi-k2-0905.toml create mode 100644 providers/aimlapi/models/moonshotai/kimi-k2.toml create mode 100644 providers/aimlapi/models/morph/morph-v3-fast.toml create mode 100644 providers/aimlapi/models/morph/morph-v3-large.toml create mode 100644 providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-405b.toml create mode 100644 providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-70b.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-1.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-2.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-4.toml create mode 100644 providers/aimlapi/models/openai/gpt-5-5.toml create mode 100644 providers/aimlapi/models/openai/gpt-5.4-image-2.toml create mode 100644 providers/aimlapi/models/openai/gpt-6-astra.toml create mode 100644 providers/aimlapi/models/openai/gpt-oss-safeguard-20b.toml create mode 100644 providers/aimlapi/models/rekaai/reka-edge.toml create mode 100644 providers/aimlapi/models/relace/relace-apply-3.toml create mode 100644 providers/aimlapi/models/relace/relace-search.toml create mode 100644 providers/aimlapi/models/sakana/fugu-max.toml create mode 100644 providers/aimlapi/models/sakana/fugu-ultra-v2.toml create mode 100644 providers/aimlapi/models/sao10k/l3-lunaris-8b.toml create mode 100644 providers/aimlapi/models/sao10k/l3.1-euryale-70b.toml create mode 100644 providers/aimlapi/models/sao10k/l3.3-euryale-70b.toml create mode 100644 providers/aimlapi/models/tencent/hy-mt2-1.8b.toml create mode 100644 providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml create mode 100644 providers/aimlapi/models/tencent/hy-mt2-7b.toml create mode 100644 providers/aimlapi/models/thedrummer/cydonia-24b-v4.1.toml create mode 100644 providers/aimlapi/models/thedrummer/skyfall-36b-v2.toml create mode 100644 providers/aimlapi/models/thedrummer/unslopnemo-12b.toml create mode 100644 providers/aimlapi/models/undi95/remm-slerp-l2-13b.toml create mode 100644 providers/aimlapi/models/upstage/solar-pro-3.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml create mode 100644 providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5.2.toml create mode 100644 providers/aimlapi/models/zhipu/glm-5.3.toml diff --git a/models/aion-labs/aion-2.0.toml b/models/aion-labs/aion-2.0.toml new file mode 100644 index 00000000000..3cf31ab3610 --- /dev/null +++ b/models/aion-labs/aion-2.0.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/aion-labs/aion-2.0.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Aion-2.0" +description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" +release_date = "2026-02-23" +last_updated = "2026-02-23" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 131072 +output = 32768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/aion-labs/aion-3.0-mini.toml b/models/aion-labs/aion-3.0-mini.toml new file mode 100644 index 00000000000..646234c201e --- /dev/null +++ b/models/aion-labs/aion-3.0-mini.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/aion-labs/aion-3.0-mini.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Aion-3.0-Mini" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +release_date = "2026-07-07" +last_updated = "2026-07-07" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 131072 +output = 32768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/aion-labs/aion-3.0.toml b/models/aion-labs/aion-3.0.toml new file mode 100644 index 00000000000..f20ebc9f86e --- /dev/null +++ b/models/aion-labs/aion-3.0.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/aion-labs/aion-3.0.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Aion-3.0" +description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" +release_date = "2026-07-07" +last_updated = "2026-07-07" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 131072 +output = 32768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/aion-labs/aion-rp-llama-3.1-8b.toml b/models/aion-labs/aion-rp-llama-3.1-8b.toml new file mode 100644 index 00000000000..afb7ab2eb2c --- /dev/null +++ b/models/aion-labs/aion-rp-llama-3.1-8b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/aion-labs/aion-rp-llama-3.1-8b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Aion-RP 1.0 (8B)" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "llama" +release_date = "2025-02-04" +last_updated = "2025-02-04" +knowledge = "2023-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = false + +[limit] +context = 32768 +output = 29491 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/alibaba/qwen3-max-preview.toml b/models/alibaba/qwen3-max-preview.toml new file mode 100644 index 00000000000..06057747261 --- /dev/null +++ b/models/alibaba/qwen3-max-preview.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/vercel/models/alibaba/qwen3-max-preview.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Qwen3 Max Preview" +description = "Flagship Qwen model for complex reasoning, coding, and agentic workflows" +family = "qwen" +release_date = "2025-09-05" +last_updated = "2025-09-23" +knowledge = "2025-04" +attachment = false +reasoning = false +temperature = true +tool_call = true +open_weights = false + +[limit] +context = 262144 +output = 32768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/alibaba/qwen3-vl-flash.toml b/models/alibaba/qwen3-vl-flash.toml new file mode 100644 index 00000000000..44e7e4530c8 --- /dev/null +++ b/models/alibaba/qwen3-vl-flash.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/llmgateway-providers/models/alibaba/qwen3-vl-flash.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Qwen3 VL Flash (Alibaba Cloud)" +description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" +release_date = "2025-10-15" +last_updated = "2025-10-15" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 262144 +output = 32768 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/amazon/nova-2-lite-v1.toml b/models/amazon/nova-2-lite-v1.toml new file mode 100644 index 00000000000..0443bb39758 --- /dev/null +++ b/models/amazon/nova-2-lite-v1.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/amazon/nova-2-lite-v1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Nova 2 Lite" +description = "Multimodal reasoning model for visual analysis, planning, and tool use" +family = "nova" +release_date = "2025-12-02" +last_updated = "2025-12-02" +attachment = true +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 1000000 +output = 65535 + +[modalities] +input = ["text", "image", "video", "pdf"] +output = ["text"] diff --git a/models/amazon/nova-lite-v1.toml b/models/amazon/nova-lite-v1.toml new file mode 100644 index 00000000000..1e14d079de0 --- /dev/null +++ b/models/amazon/nova-lite-v1.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/amazon/nova-lite-v1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Nova Lite 1.0" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +family = "nova-lite" +release_date = "2024-12-05" +last_updated = "2024-12-05" +knowledge = "2024-10-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 300000 +output = 5120 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/amazon/nova-micro-v1.toml b/models/amazon/nova-micro-v1.toml new file mode 100644 index 00000000000..99a208da255 --- /dev/null +++ b/models/amazon/nova-micro-v1.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/amazon/nova-micro-v1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Nova Micro 1.0" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +family = "nova-micro" +release_date = "2024-12-05" +last_updated = "2024-12-05" +knowledge = "2024-10-31" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 128000 +output = 5120 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/amazon/nova-pro-v1.toml b/models/amazon/nova-pro-v1.toml new file mode 100644 index 00000000000..c79a705e822 --- /dev/null +++ b/models/amazon/nova-pro-v1.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/amazon/nova-pro-v1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Nova Pro 1.0" +description = "Flagship model for demanding analysis, coding, and production agent workflows" +family = "nova-pro" +release_date = "2024-12-05" +last_updated = "2024-12-05" +knowledge = "2024-10-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 300000 +output = 5120 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/anthracite-org/magnum-v4-72b.toml b/models/anthracite-org/magnum-v4-72b.toml new file mode 100644 index 00000000000..1db329fbb63 --- /dev/null +++ b/models/anthracite-org/magnum-v4-72b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/anthracite-org/magnum-v4-72b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Magnum v4 72B" +description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" +release_date = "2024-10-22" +last_updated = "2024-10-22" +knowledge = "2024-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 32768 +output = 4096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/baidu/ernie-4.5-vl-424b-a47b.toml b/models/baidu/ernie-4.5-vl-424b-a47b.toml new file mode 100644 index 00000000000..fc22e5ef9e1 --- /dev/null +++ b/models/baidu/ernie-4.5-vl-424b-a47b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/baidu/ernie-4.5-vl-424b-a47b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "ERNIE 4.5 VL 424B A47B " +description = "Multimodal reasoning model for visual analysis, planning, and tool use" +family = "ernie" +release_date = "2025-06-30" +last_updated = "2025-06-30" +knowledge = "2025-03-31" +attachment = true +reasoning = true +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 123000 +output = 16000 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml b/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml new file mode 100644 index 00000000000..82363cdc7de --- /dev/null +++ b/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Uncensored" +description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" +family = "mistral" +release_date = "2025-07-09" +last_updated = "2025-07-09" +knowledge = "2024-04-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 128000 +output = 8192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/cohere/command-a.toml b/models/cohere/command-a.toml new file mode 100644 index 00000000000..7d0079a0762 --- /dev/null +++ b/models/cohere/command-a.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/cohere/command-a.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Command A" +description = "Cohere command model for multilingual enterprise agents, tools, and chat" +family = "command-a" +release_date = "2025-03-13" +last_updated = "2025-03-13" +knowledge = "2024-08-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 256000 +output = 8192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/deepseek/deepseek-chat-v3-0324.toml b/models/deepseek/deepseek-chat-v3-0324.toml new file mode 100644 index 00000000000..a0496bf6d8b --- /dev/null +++ b/models/deepseek/deepseek-chat-v3-0324.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/deepseek/deepseek-chat-v3-0324.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "DeepSeek V3 0324" +description = "DeepSeek chat model for instruction following, coding, and analysis" +family = "deepseek" +release_date = "2025-03-24" +last_updated = "2025-03-24" +knowledge = "2024-07-31" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 163840 +output = 147456 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/deepseek/deepseek-chat-v3.1.toml b/models/deepseek/deepseek-chat-v3.1.toml new file mode 100644 index 00000000000..ad5acf3be28 --- /dev/null +++ b/models/deepseek/deepseek-chat-v3.1.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/deepseek/deepseek-chat-v3.1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "DeepSeek V3.1" +description = "DeepSeek chat model for instruction following, coding, and analysis" +family = "deepseek" +release_date = "2025-08-21" +last_updated = "2025-08-21" +knowledge = "2025-03-31" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 163840 +output = 32768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/google/gemini-2.5-pro-preview.toml b/models/google/gemini-2.5-pro-preview.toml new file mode 100644 index 00000000000..bb1b5d96ac2 --- /dev/null +++ b/models/google/gemini-2.5-pro-preview.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/google/gemini-2.5-pro-preview.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Gemini 2.5 Pro Preview 06-05" +description = "Advanced Gemini model for complex reasoning, coding, and multimodal analysis" +family = "gemini" +release_date = "2025-06-05" +last_updated = "2025-06-05" +knowledge = "2025-01-31" +attachment = true +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 1048576 +output = 65536 + +[modalities] +input = ["pdf", "image", "text", "audio"] +output = ["text"] diff --git a/models/google/gemma-2-27b-it.toml b/models/google/gemma-2-27b-it.toml new file mode 100644 index 00000000000..f8cf6cdb0b8 --- /dev/null +++ b/models/google/gemma-2-27b-it.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/google/gemma-2-27b-it.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Gemma 2 27B" +description = "Open Gemma instruction model for efficient chat and self-hosted deployments" +family = "gemma" +release_date = "2024-07-13" +last_updated = "2024-07-13" +knowledge = "2024-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 8192 +output = 2048 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/gryphe/mythomax-l2-13b.toml b/models/gryphe/mythomax-l2-13b.toml new file mode 100644 index 00000000000..eaa9145654a --- /dev/null +++ b/models/gryphe/mythomax-l2-13b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/gryphe/mythomax-l2-13b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "MythoMax 13B" +description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" +release_date = "2023-07-02" +last_updated = "2023-07-02" +knowledge = "2023-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 8192 +output = 3686 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/ibm/granite-4.2-8b.toml b/models/ibm/granite-4.2-8b.toml new file mode 100644 index 00000000000..e00d5060dbb --- /dev/null +++ b/models/ibm/granite-4.2-8b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/ibm-granite/granite-4.2-8b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Granite 4.2 8B" +description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" +family = "granite" +release_date = "2026-08-31" +last_updated = "2026-08-31" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 117964 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/inception/mercury-2.5.toml b/models/inception/mercury-2.5.toml new file mode 100644 index 00000000000..b2f2957d8d1 --- /dev/null +++ b/models/inception/mercury-2.5.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/inception/mercury-2.5.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mercury 2.5" +description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" +family = "mercury" +release_date = "2026-09-08" +last_updated = "2026-09-08" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 260000 +output = 65536 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/inception/mercury-2.toml b/models/inception/mercury-2.toml new file mode 100644 index 00000000000..875dc491ba7 --- /dev/null +++ b/models/inception/mercury-2.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/inception/mercury-2.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mercury 2" +description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" +family = "mercury" +release_date = "2026-03-04" +last_updated = "2026-03-04" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 128000 +output = 50000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/inclusionai/ling-3.0-flash-sante.toml b/models/inclusionai/ling-3.0-flash-sante.toml new file mode 100644 index 00000000000..246cb7bd24e --- /dev/null +++ b/models/inclusionai/ling-3.0-flash-sante.toml @@ -0,0 +1,19 @@ +# Lab metadata carried over from providers/vercel/models/inclusionai/ling-3.0-flash-sante.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Ling 3.0 Flash Sante" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +family = "ling" +release_date = "2026-09-04" +last_updated = "2026-09-04" +attachment = false +reasoning = true +tool_call = true +open_weights = false + +[limit] +context = 256000 +output = 32000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/inclusionai/ling-3.0-flash-vl.toml b/models/inclusionai/ling-3.0-flash-vl.toml new file mode 100644 index 00000000000..48a675ca17d --- /dev/null +++ b/models/inclusionai/ling-3.0-flash-vl.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/inclusionai/ling-3.0-flash-vl.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Ling 3.0 Flash VL" +description = "Multimodal reasoning model for visual analysis, planning, and tool use" +family = "ling" +release_date = "2026-09-10" +last_updated = "2026-09-10" +attachment = true +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 32768 + +[modalities] +input = ["text", "image", "video"] +output = ["text"] diff --git a/models/inclusionai/ling-3.0-flash.toml b/models/inclusionai/ling-3.0-flash.toml new file mode 100644 index 00000000000..e60e98a7c9f --- /dev/null +++ b/models/inclusionai/ling-3.0-flash.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/inclusionai/ling-3.0-flash.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Ling 3.0 Flash" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +family = "ling" +release_date = "2026-07-23" +last_updated = "2026-07-23" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = true + +[limit] +context = 262144 +output = 32768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/inference-net/schematron-v2-small.toml b/models/inference-net/schematron-v2-small.toml new file mode 100644 index 00000000000..db75e4ba5a1 --- /dev/null +++ b/models/inference-net/schematron-v2-small.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/inference-net/schematron-v2-small.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Schematron V2 Small" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +release_date = "2026-09-12" +last_updated = "2026-09-12" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 128000 +output = 4096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/inference-net/schematron-v2-turbo.toml b/models/inference-net/schematron-v2-turbo.toml new file mode 100644 index 00000000000..d30a503287e --- /dev/null +++ b/models/inference-net/schematron-v2-turbo.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/inference-net/schematron-v2-turbo.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Schematron V2 Turbo" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +release_date = "2026-09-12" +last_updated = "2026-09-12" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 128000 +output = 8192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/mancer/weaver.toml b/models/mancer/weaver.toml new file mode 100644 index 00000000000..271079aa01c --- /dev/null +++ b/models/mancer/weaver.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mancer/weaver.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Weaver (alpha)" +description = "General-purpose chat model for instruction following, writing, and analysis" +family = "alpha" +release_date = "2023-08-02" +last_updated = "2023-08-02" +knowledge = "2023-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = false + +[limit] +context = 8000 +output = 6000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/minimax/MiniMax-Text-01.toml b/models/minimax/MiniMax-Text-01.toml new file mode 100644 index 00000000000..70fd9bb3666 --- /dev/null +++ b/models/minimax/MiniMax-Text-01.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/llmgateway-providers/models/minimax/MiniMax-Text-01.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "MiniMax Text 01 (MiniMax)" +description = "MiniMax model for chat, coding, office work, and agentic tasks" +family = "minimax" +release_date = "2025-01-15" +last_updated = "2025-01-15" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 1000000 +output = 131072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/mistral/codestral-2508.toml b/models/mistral/codestral-2508.toml new file mode 100644 index 00000000000..2e45c4a0888 --- /dev/null +++ b/models/mistral/codestral-2508.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/codestral-2508.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Codestral 2508" +description = "Mistral coding model for code completion, generation, and developer workflows" +family = "codestral" +release_date = "2025-08-01" +last_updated = "2025-08-01" +knowledge = "2025-03-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 256000 +output = 204800 + +[modalities] +input = ["text", "pdf"] +output = ["text"] diff --git a/models/mistral/ministral-14b-2512.toml b/models/mistral/ministral-14b-2512.toml new file mode 100644 index 00000000000..a9cd5751fd3 --- /dev/null +++ b/models/mistral/ministral-14b-2512.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/ministral-14b-2512.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Ministral 3 14B 2512" +description = "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads" +family = "ministral" +release_date = "2025-12-02" +last_updated = "2025-12-02" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 262144 +output = 209715 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/mistral/ministral-3b-2512.toml b/models/mistral/ministral-3b-2512.toml new file mode 100644 index 00000000000..59ebacedfe2 --- /dev/null +++ b/models/mistral/ministral-3b-2512.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/ministral-3b-2512.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Ministral 3 3B 2512" +description = "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads" +family = "ministral" +release_date = "2025-12-02" +last_updated = "2025-12-02" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 104857 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/mistral/ministral-8b-2512.toml b/models/mistral/ministral-8b-2512.toml new file mode 100644 index 00000000000..58fc7b588b7 --- /dev/null +++ b/models/mistral/ministral-8b-2512.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/ministral-8b-2512.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Ministral 3 8B 2512" +description = "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads" +family = "ministral" +release_date = "2025-12-02" +last_updated = "2025-12-02" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 262144 +output = 209715 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/mistral/mistral-large-2407.toml b/models/mistral/mistral-large-2407.toml new file mode 100644 index 00000000000..3729790b144 --- /dev/null +++ b/models/mistral/mistral-large-2407.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-large-2407.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Large 2407" +description = "Flagship Mistral model for advanced reasoning, coding, and multilingual work" +family = "mistral-large" +release_date = "2024-11-19" +last_updated = "2024-11-19" +knowledge = "2024-03-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 131072 +output = 104857 + +[modalities] +input = ["text", "pdf"] +output = ["text"] diff --git a/models/mistral/mistral-large.toml b/models/mistral/mistral-large.toml new file mode 100644 index 00000000000..5d4ccec0915 --- /dev/null +++ b/models/mistral/mistral-large.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-large.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Large" +description = "Flagship Mistral model for advanced reasoning, coding, and multilingual work" +family = "mistral-large" +release_date = "2024-02-26" +last_updated = "2024-02-26" +knowledge = "2024-11-30" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 128000 +output = 102400 + +[modalities] +input = ["text", "pdf"] +output = ["text"] diff --git a/models/mistral/mistral-medium-3-5.toml b/models/mistral/mistral-medium-3-5.toml new file mode 100644 index 00000000000..57476a14c10 --- /dev/null +++ b/models/mistral/mistral-medium-3-5.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-medium-3-5.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Medium 3.5" +description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" +family = "mistral-medium" +release_date = "2026-04-30" +last_updated = "2026-04-30" +attachment = true +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 262144 +output = 209715 + +[modalities] +input = ["text", "image", "pdf"] +output = ["text"] diff --git a/models/mistral/mistral-medium-3.1.toml b/models/mistral/mistral-medium-3.1.toml new file mode 100644 index 00000000000..99d1d2e7a0b --- /dev/null +++ b/models/mistral/mistral-medium-3.1.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-medium-3.1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Medium 3.1" +description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" +family = "mistral-medium" +release_date = "2025-08-13" +last_updated = "2025-08-13" +knowledge = "2025-06-30" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 131072 +output = 104857 + +[modalities] +input = ["text", "image", "pdf"] +output = ["text"] diff --git a/models/mistral/mistral-medium-3.toml b/models/mistral/mistral-medium-3.toml new file mode 100644 index 00000000000..f76a8c3a676 --- /dev/null +++ b/models/mistral/mistral-medium-3.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-medium-3.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Medium 3" +description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" +family = "mistral-medium" +release_date = "2025-05-07" +last_updated = "2025-05-07" +knowledge = "2025-03-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 131072 +output = 104857 + +[modalities] +input = ["text", "image", "pdf"] +output = ["text"] diff --git a/models/mistral/mistral-saba.toml b/models/mistral/mistral-saba.toml new file mode 100644 index 00000000000..c484b1b8336 --- /dev/null +++ b/models/mistral/mistral-saba.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-saba.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Saba" +description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" +family = "mistral" +release_date = "2025-02-17" +last_updated = "2025-02-17" +knowledge = "2024-09-30" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 32768 +output = 26214 + +[modalities] +input = ["text", "pdf"] +output = ["text"] diff --git a/models/mistral/mistral-small-24b-instruct-2501.toml b/models/mistral/mistral-small-24b-instruct-2501.toml new file mode 100644 index 00000000000..6ee179d84fe --- /dev/null +++ b/models/mistral/mistral-small-24b-instruct-2501.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-small-24b-instruct-2501.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Small 3" +description = "Efficient Mistral model for fast chat, extraction, and production assistants" +family = "mistral-small" +release_date = "2025-01-30" +last_updated = "2025-01-30" +knowledge = "2023-10-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 32768 +output = 16384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/mistral/mistral-small-3.1-24b-instruct.toml b/models/mistral/mistral-small-3.1-24b-instruct.toml new file mode 100644 index 00000000000..5ea4bbce239 --- /dev/null +++ b/models/mistral/mistral-small-3.1-24b-instruct.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-small-3.1-24b-instruct.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Small 3.1 24B" +description = "Efficient Mistral model for fast chat, extraction, and production assistants" +family = "mistral-small" +release_date = "2025-03-17" +last_updated = "2025-03-17" +knowledge = "2023-10-31" +attachment = true +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 128000 +output = 102400 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/mistral/mistral-small-3.2-24b-instruct.toml b/models/mistral/mistral-small-3.2-24b-instruct.toml new file mode 100644 index 00000000000..a2bde0dd2f3 --- /dev/null +++ b/models/mistral/mistral-small-3.2-24b-instruct.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mistral-small-3.2-24b-instruct.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mistral Small 3.2 24B" +description = "Efficient Mistral model for fast chat, extraction, and production assistants" +family = "mistral-small" +release_date = "2025-06-20" +last_updated = "2025-06-20" +knowledge = "2023-10-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 256000 +output = 16384 + +[modalities] +input = ["image", "text"] +output = ["text"] diff --git a/models/mistral/mixtral-8x22b-instruct.toml b/models/mistral/mixtral-8x22b-instruct.toml new file mode 100644 index 00000000000..e4e5d1c2752 --- /dev/null +++ b/models/mistral/mixtral-8x22b-instruct.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/mistralai/mixtral-8x22b-instruct.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Mixtral 8x22B Instruct" +description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" +family = "mistral" +release_date = "2024-04-17" +last_updated = "2024-04-17" +knowledge = "2024-01-31" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 65536 +output = 52428 + +[modalities] +input = ["text", "pdf"] +output = ["text"] diff --git a/models/moonshotai/kimi-k2-0905.toml b/models/moonshotai/kimi-k2-0905.toml new file mode 100644 index 00000000000..0ca3d6c6444 --- /dev/null +++ b/models/moonshotai/kimi-k2-0905.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/moonshotai/kimi-k2-0905.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Kimi K2 0905" +description = "Kimi model for long-context chat, coding, and agentic reasoning" +family = "kimi-k2" +release_date = "2025-09-04" +last_updated = "2025-09-04" +knowledge = "2024-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 262144 +output = 98304 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/moonshotai/kimi-k2.toml b/models/moonshotai/kimi-k2.toml new file mode 100644 index 00000000000..56672ef5fce --- /dev/null +++ b/models/moonshotai/kimi-k2.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/moonshotai/kimi-k2.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Kimi K2 0711" +description = "Kimi model for long-context chat, coding, and agentic reasoning" +family = "kimi-k2" +release_date = "2025-07-11" +last_updated = "2025-07-11" +knowledge = "2024-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = true + +[limit] +context = 131072 +output = 98304 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/morph/morph-v3-fast.toml b/models/morph/morph-v3-fast.toml new file mode 100644 index 00000000000..9cc00d00f92 --- /dev/null +++ b/models/morph/morph-v3-fast.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/morph/morph-v3-fast.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Morph V3 Fast" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +family = "morph" +release_date = "2025-07-07" +last_updated = "2025-07-07" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = false + +[limit] +context = 81920 +output = 38000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/morph/morph-v3-large.toml b/models/morph/morph-v3-large.toml new file mode 100644 index 00000000000..bd5153753eb --- /dev/null +++ b/models/morph/morph-v3-large.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/morph/morph-v3-large.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Morph V3 Large" +description = "Flagship model for demanding analysis, coding, and production agent workflows" +family = "morph" +release_date = "2025-07-07" +last_updated = "2025-07-07" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = false + +[limit] +context = 262144 +output = 131072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/nousresearch/hermes-3-llama-3.1-405b.toml b/models/nousresearch/hermes-3-llama-3.1-405b.toml new file mode 100644 index 00000000000..c610bdab6b2 --- /dev/null +++ b/models/nousresearch/hermes-3-llama-3.1-405b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/nousresearch/hermes-3-llama-3.1-405b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Hermes 3 405B Instruct" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "nousresearch" +release_date = "2024-08-16" +last_updated = "2024-08-16" +knowledge = "2023-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 16384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/nousresearch/hermes-3-llama-3.1-70b.toml b/models/nousresearch/hermes-3-llama-3.1-70b.toml new file mode 100644 index 00000000000..f18593e9fe0 --- /dev/null +++ b/models/nousresearch/hermes-3-llama-3.1-70b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/nousresearch/hermes-3-llama-3.1-70b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Hermes 3 70B Instruct" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "nousresearch" +release_date = "2024-08-18" +last_updated = "2024-08-18" +knowledge = "2023-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 16384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/nousresearch/hermes-4-405b.toml b/models/nousresearch/hermes-4-405b.toml new file mode 100644 index 00000000000..8566af3e161 --- /dev/null +++ b/models/nousresearch/hermes-4-405b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/nousresearch/hermes-4-405b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Hermes 4 405B" +description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" +family = "hermes" +release_date = "2025-08-26" +last_updated = "2025-08-26" +knowledge = "2024-08-31" +attachment = false +reasoning = true +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 131072 +output = 117964 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/openai/gpt-5-image-mini.toml b/models/openai/gpt-5-image-mini.toml new file mode 100644 index 00000000000..aeb9a697038 --- /dev/null +++ b/models/openai/gpt-5-image-mini.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/openai/gpt-5-image-mini.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "GPT-5 Image Mini" +description = "Image model for prompt-driven generation, editing, and visual design workflows" +family = "gpt" +release_date = "2025-10-16" +last_updated = "2025-10-16" +attachment = true +reasoning = true +temperature = true +tool_call = false +structured_output = true +open_weights = false + +[limit] +context = 400000 +output = 128000 + +[modalities] +input = ["pdf", "image", "text"] +output = ["image", "text"] diff --git a/models/openai/gpt-5-image.toml b/models/openai/gpt-5-image.toml new file mode 100644 index 00000000000..e693778b102 --- /dev/null +++ b/models/openai/gpt-5-image.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/openai/gpt-5-image.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "GPT-5 Image" +description = "Image model for prompt-driven generation, editing, and visual design workflows" +family = "gpt" +release_date = "2025-10-14" +last_updated = "2025-10-14" +knowledge = "2024-10-01" +attachment = true +reasoning = true +temperature = true +tool_call = false +structured_output = true +open_weights = false + +[limit] +context = 400000 +output = 128000 + +[modalities] +input = ["image", "text", "pdf"] +output = ["image", "text"] diff --git a/models/openai/gpt-5.4-image-2.toml b/models/openai/gpt-5.4-image-2.toml new file mode 100644 index 00000000000..14841bb730a --- /dev/null +++ b/models/openai/gpt-5.4-image-2.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/openai/gpt-5.4-image-2.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "GPT-5.4 Image 2" +description = "Image model for prompt-driven generation, editing, and visual design workflows" +family = "gpt" +release_date = "2026-04-21" +last_updated = "2026-04-21" +attachment = true +reasoning = true +temperature = false +tool_call = false +structured_output = true +open_weights = false + +[limit] +context = 272000 +output = 128000 + +[modalities] +input = ["image", "text", "pdf"] +output = ["image", "text"] diff --git a/models/perceptron/perceptron-mk1.toml b/models/perceptron/perceptron-mk1.toml new file mode 100644 index 00000000000..749030e5910 --- /dev/null +++ b/models/perceptron/perceptron-mk1.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/perceptron/perceptron-mk1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Perceptron Mk1" +description = "Multimodal reasoning model for visual analysis, planning, and tool use" +release_date = "2026-05-12" +last_updated = "2026-05-12" +attachment = true +reasoning = true +temperature = true +tool_call = false +structured_output = true +open_weights = false + +[limit] +context = 32768 +output = 8192 + +[modalities] +input = ["text", "image", "video"] +output = ["text"] diff --git a/models/rekaai/reka-edge.toml b/models/rekaai/reka-edge.toml new file mode 100644 index 00000000000..9c864e0c372 --- /dev/null +++ b/models/rekaai/reka-edge.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/rekaai/reka-edge.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Reka Edge" +description = "Multimodal model for analyzing text, images, documents, and rich media" +family = "reka" +release_date = "2026-03-20" +last_updated = "2026-03-20" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 16384 +output = 14745 + +[modalities] +input = ["image", "text", "video"] +output = ["text"] diff --git a/models/rekaai/reka-flash-3.toml b/models/rekaai/reka-flash-3.toml new file mode 100644 index 00000000000..11c5ab2f517 --- /dev/null +++ b/models/rekaai/reka-flash-3.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/rekaai/reka-flash-3.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Reka Flash 3" +description = "Efficient model for low-latency assistance, extraction, and routine automation" +family = "reka" +release_date = "2025-03-12" +last_updated = "2025-03-12" +knowledge = "2025-01-31" +attachment = false +reasoning = true +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 65536 +output = 58982 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/relace/relace-apply-3.toml b/models/relace/relace-apply-3.toml new file mode 100644 index 00000000000..b7b548e3b15 --- /dev/null +++ b/models/relace/relace-apply-3.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/relace/relace-apply-3.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Relace Apply 3" +description = "General-purpose chat model for instruction following, writing, and analysis" +release_date = "2025-09-26" +last_updated = "2025-09-26" +attachment = false +reasoning = false +temperature = false +tool_call = false +structured_output = false +open_weights = false + +[limit] +context = 256000 +output = 128000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/relace/relace-search.toml b/models/relace/relace-search.toml new file mode 100644 index 00000000000..e8164be7d1a --- /dev/null +++ b/models/relace/relace-search.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/openrouter/models/relace/relace-search.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Relace Search" +description = "Tool-capable chat model for instruction following and agentic application workflows" +release_date = "2025-12-08" +last_updated = "2025-12-08" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 256000 +output = 128000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/sakana/fugu-max.toml b/models/sakana/fugu-max.toml new file mode 100644 index 00000000000..331f295fb38 --- /dev/null +++ b/models/sakana/fugu-max.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/sakana/fugu-max.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Fugu Max" +description = "Multi-agent model for routing expert agents across complex analytical tasks" +family = "fugu" +release_date = "2026-09-11" +last_updated = "2026-09-11" +attachment = true +reasoning = true +temperature = false +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 1000000 +output = 128000 + +[modalities] +input = ["text", "image", "pdf"] +output = ["text"] diff --git a/models/sakana/fugu-ultra-v2.toml b/models/sakana/fugu-ultra-v2.toml new file mode 100644 index 00000000000..56bb3f3426e --- /dev/null +++ b/models/sakana/fugu-ultra-v2.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/sakana/fugu-ultra-v2.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Fugu Ultra v2" +description = "Quality-first multi-agent model for hard research, analysis, and competitions" +family = "fugu" +release_date = "2026-09-11" +last_updated = "2026-09-11" +knowledge = "2026-08-28" +attachment = true +reasoning = true +temperature = false +tool_call = true +structured_output = true +open_weights = false + +[limit] +context = 1000000 +output = 128000 + +[modalities] +input = ["text", "image", "pdf"] +output = ["text"] diff --git a/models/sao10k/l3-lunaris-8b.toml b/models/sao10k/l3-lunaris-8b.toml new file mode 100644 index 00000000000..1e97130d072 --- /dev/null +++ b/models/sao10k/l3-lunaris-8b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/sao10k/l3-lunaris-8b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Llama 3 8B Lunaris" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "llama" +release_date = "2024-08-13" +last_updated = "2024-08-13" +knowledge = "2023-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 8192 +output = 7372 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/sao10k/l3.1-euryale-70b.toml b/models/sao10k/l3.1-euryale-70b.toml new file mode 100644 index 00000000000..9bf2df1dc17 --- /dev/null +++ b/models/sao10k/l3.1-euryale-70b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/sao10k/l3.1-euryale-70b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Llama 3.1 Euryale 70B v2.2" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "llama" +release_date = "2024-08-28" +last_updated = "2024-08-28" +knowledge = "2023-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 16384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/sao10k/l3.3-euryale-70b.toml b/models/sao10k/l3.3-euryale-70b.toml new file mode 100644 index 00000000000..1e4951eb5db --- /dev/null +++ b/models/sao10k/l3.3-euryale-70b.toml @@ -0,0 +1,22 @@ +# Lab metadata carried over from providers/openrouter/models/sao10k/l3.3-euryale-70b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Llama 3.3 Euryale 70B" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "llama" +release_date = "2024-12-18" +last_updated = "2024-12-18" +knowledge = "2023-12-31" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 16384 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/tencent/hy-mt2-1.8b.toml b/models/tencent/hy-mt2-1.8b.toml new file mode 100644 index 00000000000..f6f57b60032 --- /dev/null +++ b/models/tencent/hy-mt2-1.8b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/tencent/hy-mt2-1.8b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Hy-MT2-1.8B" +description = "Tencent Hy reasoning model for coding, instruction following, and agent tasks" +family = "Hy" +release_date = "2026-08-20" +last_updated = "2026-08-20" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 8192 +output = 4096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/tencent/hy-mt2-30b-a3b.toml b/models/tencent/hy-mt2-30b-a3b.toml new file mode 100644 index 00000000000..db3d6a6faf4 --- /dev/null +++ b/models/tencent/hy-mt2-30b-a3b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/tencent/hy-mt2-30b-a3b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Hy-MT2-30B-A3B" +description = "Tencent Hy reasoning model for coding, instruction following, and agent tasks" +family = "Hy" +release_date = "2026-08-20" +last_updated = "2026-08-20" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 8192 +output = 4096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/tencent/hy-mt2-7b.toml b/models/tencent/hy-mt2-7b.toml new file mode 100644 index 00000000000..532e3df4c23 --- /dev/null +++ b/models/tencent/hy-mt2-7b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/tencent/hy-mt2-7b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Hy-MT2-7B" +description = "Tencent Hy reasoning model for coding, instruction following, and agent tasks" +family = "Hy" +release_date = "2026-08-19" +last_updated = "2026-08-19" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 8192 +output = 4096 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/thedrummer/cydonia-24b-v4.1.toml b/models/thedrummer/cydonia-24b-v4.1.toml new file mode 100644 index 00000000000..e7cb43b8998 --- /dev/null +++ b/models/thedrummer/cydonia-24b-v4.1.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/thedrummer/cydonia-24b-v4.1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Cydonia 24B V4.1" +description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" +release_date = "2025-09-27" +last_updated = "2025-09-27" +knowledge = "2024-04-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 131072 +output = 117964 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/thedrummer/skyfall-36b-v2.toml b/models/thedrummer/skyfall-36b-v2.toml new file mode 100644 index 00000000000..d3652f86fcb --- /dev/null +++ b/models/thedrummer/skyfall-36b-v2.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/thedrummer/skyfall-36b-v2.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "Skyfall 36B V2" +description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" +release_date = "2025-03-10" +last_updated = "2025-03-10" +knowledge = "2024-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 32768 +output = 29491 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/thedrummer/unslopnemo-12b.toml b/models/thedrummer/unslopnemo-12b.toml new file mode 100644 index 00000000000..03660192a6f --- /dev/null +++ b/models/thedrummer/unslopnemo-12b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/thedrummer/unslopnemo-12b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "UnslopNemo 12B" +description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" +release_date = "2024-11-08" +last_updated = "2024-11-08" +knowledge = "2024-04-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 1024000 +output = 819200 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/undi95/remm-slerp-l2-13b.toml b/models/undi95/remm-slerp-l2-13b.toml new file mode 100644 index 00000000000..2d7fc68c704 --- /dev/null +++ b/models/undi95/remm-slerp-l2-13b.toml @@ -0,0 +1,21 @@ +# Lab metadata carried over from providers/openrouter/models/undi95/remm-slerp-l2-13b.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "ReMM SLERP 13B" +description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" +release_date = "2023-07-22" +last_updated = "2023-07-22" +knowledge = "2023-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 6144 +output = 5529 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/xai/grok-4-fast-non-reasoning.toml b/models/xai/grok-4-fast-non-reasoning.toml new file mode 100644 index 00000000000..1b06ed90483 --- /dev/null +++ b/models/xai/grok-4-fast-non-reasoning.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/qiniu-ai/models/x-ai/grok-4-fast-non-reasoning.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "X-Ai/Grok-4-Fast-Non-Reasoning" +description = "Fast Grok model for responsive chat, reasoning, and tool-assisted work" +release_date = "2025-12-18" +last_updated = "2025-12-18" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 2000000 +output = 2000000 + +[modalities] +input = ["text", "image", "audio", "video"] +output = ["text"] diff --git a/models/xai/grok-4-fast-reasoning.toml b/models/xai/grok-4-fast-reasoning.toml new file mode 100644 index 00000000000..4ce1b88d076 --- /dev/null +++ b/models/xai/grok-4-fast-reasoning.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/qiniu-ai/models/x-ai/grok-4-fast-reasoning.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "X-Ai/Grok-4-Fast-Reasoning" +description = "Fast Grok model for responsive chat, reasoning, and tool-assisted work" +release_date = "2025-12-18" +last_updated = "2025-12-18" +attachment = true +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 2000000 +output = 2000000 + +[modalities] +input = ["text", "image", "audio", "video"] +output = ["text"] diff --git a/models/xai/grok-code-fast-1.toml b/models/xai/grok-code-fast-1.toml new file mode 100644 index 00000000000..bf40a934186 --- /dev/null +++ b/models/xai/grok-code-fast-1.toml @@ -0,0 +1,20 @@ +# Lab metadata carried over from providers/qiniu-ai/models/x-ai/grok-code-fast-1.toml (curated catalogue data already in this repo), +# with provider-specific fields (cost, reasoning_options, status) stripped. +name = "x-AI/Grok-Code-Fast 1" +description = "Fast Grok model for responsive chat, reasoning, and tool-assisted work" +release_date = "2025-09-02" +last_updated = "2025-09-02" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = false +open_weights = false + +[limit] +context = 256000 +output = 10000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 605e5ed7158..7bfd4485730 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -432,6 +432,59 @@ const INTERLEAVED_FIELD: Readonly = new Set([ + "deepseek/deepseek-v4-flash-latest", + "anthropic/claude-fable-latest", + "openai/gpt-chat-latest", + "anthropic/claude-haiku-latest", + "anthropic/claude-sonnet-latest", + "google/gemini-pro-latest", + "moonshotai/kimi-latest", + "openai/gpt-latest", + "openai/gpt-mini-latest", + "openai/gpt-5.5-2026-04-23", + "anthropic/claude-opus-latest", + "minimax/m2-7-20260402", + "openai/gpt-5.4-2026-03-05", + "alibaba/qwen3.5-plus-20260218", + "minimax/m2-5-20260218", + "minimax/m2-5-highspeed-20260218", + "openai/gpt-5.2-2025-12-11", + "openai/gpt-5.1-2025-11-13", + "openai/gpt-5-2025-08-07", + "openai/gpt-5-mini-2025-08-07", + "openai/gpt-5-nano-2025-08-07", + "openai/o3-2025-04-16", + "openai/o4-mini-2025-04-16", + "openai/gpt-4.1-2025-04-14", + "openai/gpt-4.1-mini-2025-04-14", + "openai/gpt-4.1-nano-2025-04-14", + "openai/o3-mini-2025-01-31", + "openai/o1-2024-12-17", + "openai/gpt-4o-mini-2024-07-18", + "openai/gpt-4-turbo-2024-04-09", + "google/gemini-3-7-flash", + "google/gemini-3-6-flash", + "bytedance/seed-2-0-lite", + "bytedance/seed-2-0-mini", + "google/gemini-3-1-flash-lite-preview", +]); + const PROVIDERS_DIR = path.join(import.meta.dirname, "..", "..", "..", "..", "..", "providers"); const DOCS_CONCURRENCY = 8; @@ -628,6 +681,45 @@ const STALE_HOST_NAME: ReadonlySet = new Set([ const BASE_MODEL_OVERRIDES: Readonly> = { "deepseek/deepseek-chat": "deepseek/deepseek-v4-flash", + // Upstream spellings (dashed versions, vendor-org aliases) of models whose + // lab entry lives under the canonical spelling. The host serves only the + // spelling on the left, so the card is published under it and factored onto + // the lab entry on the right. + "google/gemini-3-8-flash": "google/gemini-3.8-flash", + "zhipu/glm-5.3": "zhipuai/glm-5.3", + "bytedance-seed/seed-2-1-turbo": "bytedance-seed/seed-2.1-turbo", + "x-ai/grok-4-6": "xai/grok-4.6", + "x-ai/grok-4-5": "xai/grok-4.5", + "moonshot/kimi-k2-7-code-highspeed": "moonshotai/kimi-k2.7-code-highspeed", + "alibaba/glm-5.2": "zhipuai/glm-5.2", + "zhipu/glm-5.2": "zhipuai/glm-5.2", + "moonshot/kimi-k2-7-code": "moonshotai/kimi-k2.7-code", + "x-ai/grok-build-0-1": "xai/grok-build-0.1", + "x-ai/grok-4-3": "xai/grok-4.3", + "bytedance/seed-2-0-pro": "bytedance-seed/seed-2.0-pro", + "openai/gpt-5-5": "openai/gpt-5.5", + "moonshot/kimi-k2-6": "moonshotai/kimi-k2.6", + "x-ai/grok-4-20-0309-non-reasoning": "xai/grok-4.20-0309-non-reasoning", + "x-ai/grok-4-20-0309-reasoning": "xai/grok-4.20-0309-reasoning", + "zhipu/glm-5.1": "zhipuai/glm-5.1", + "openai/gpt-5-4": "openai/gpt-5.4", + "zhipu/glm-5": "zhipuai/glm-5", + "upstage/solar-pro-3": "upstage/solar-pro3", + "bytedance/seed-1-8": "bytedance-seed/seed-1-8", + "bytedance-seed/seed-1.6": "bytedance-seed/seed-1-6", + "bytedance-seed/seed-1.6-flash": "bytedance-seed/seed-1-6-flash", + "zhipu/glm-4.7": "zhipuai/glm-4.7", + "openai/gpt-5-2": "openai/gpt-5.2", + "x-ai/grok-4-1-fast-reasoning": "xai/grok-4.1-fast-reasoning", + "openai/gpt-5-1": "openai/gpt-5.1", + "zhipu/glm-4.6": "zhipuai/glm-4.6", + "zhipu/glm-4.5": "zhipuai/glm-4.5", + "zhipu/glm-4.5-air": "zhipuai/glm-4.5-air", + "minimax/m2-her": "minimax/MiniMax-M2-Her", + "anthropic/claude-sonnet-4": "anthropic/claude-sonnet-4-20250514", + "ibm-granite/granite-4.2-8b": "ibm/granite-4.2-8b", + "ibm-granite/granite-4.0-h-micro": "ibm/granite-4-h-micro", + "meta-llama/Llama-3.3-70B-Instruct-Turbo": "meta/llama-3.3-70b-instruct", }; /** @@ -1031,6 +1123,7 @@ function wireHeader(id: string, reasoningOptions: Array<{ type: "effort"; values * is exactly what that flow exists to research. */ function candidateID(model: AimlapiModel): string | undefined { + if (BLACKLISTED.has(model.id)) return undefined; if (NOT_CALLABLE.has(model.id)) return undefined; if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; return isChatTextModel(model) ? model.id : undefined; @@ -1084,6 +1177,7 @@ export const aimlapi = { return models; }, translateModel(model, context) { + if (BLACKLISTED.has(model.id)) return undefined; if (NOT_CALLABLE.has(model.id)) return undefined; if (ALIAS_DUPLICATE_IDS.has(model.id)) return undefined; if (!isChatTextModel(model)) return undefined; diff --git a/providers/aimlapi/models/aion-labs/aion-rp-llama-3.1-8b.toml b/providers/aimlapi/models/aion-labs/aion-rp-llama-3.1-8b.toml new file mode 100644 index 00000000000..4d5f44a0ac6 --- /dev/null +++ b/providers/aimlapi/models/aion-labs/aion-rp-llama-3.1-8b.toml @@ -0,0 +1,8 @@ +base_model = "aion-labs/aion-rp-llama-3.1-8b" + +[cost] +input = 1.10032 +output = 2.20064 + +[limit] +output = 32_768 diff --git a/providers/aimlapi/models/alibaba/qwen3-max-preview.toml b/providers/aimlapi/models/alibaba/qwen3-max-preview.toml new file mode 100644 index 00000000000..1a3872e1dad --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-max-preview.toml @@ -0,0 +1,9 @@ +base_model = "alibaba/qwen3-max-preview" + +[cost] +input = 1.56 +output = 7.8 +cache_read = 0.312 + +[limit] +context = 252_000 diff --git a/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml b/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml new file mode 100644 index 00000000000..12118077ccb --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3-vl-flash.toml @@ -0,0 +1,7 @@ +base_model = "alibaba/qwen3-vl-flash" +name = "Qwen3 VL Flash" + +[cost] +input = 0.065 +output = 0.52 +cache_read = 0.065 diff --git a/providers/aimlapi/models/amazon/nova-lite-v1.toml b/providers/aimlapi/models/amazon/nova-lite-v1.toml new file mode 100644 index 00000000000..aff8e7b8002 --- /dev/null +++ b/providers/aimlapi/models/amazon/nova-lite-v1.toml @@ -0,0 +1,5 @@ +base_model = "amazon/nova-lite-v1" + +[cost] +input = 0.082524 +output = 0.330096 diff --git a/providers/aimlapi/models/amazon/nova-micro-v1.toml b/providers/aimlapi/models/amazon/nova-micro-v1.toml new file mode 100644 index 00000000000..3d12109bed9 --- /dev/null +++ b/providers/aimlapi/models/amazon/nova-micro-v1.toml @@ -0,0 +1,5 @@ +base_model = "amazon/nova-micro-v1" + +[cost] +input = 0.048139 +output = 0.192556 diff --git a/providers/aimlapi/models/amazon/nova-pro-v1.toml b/providers/aimlapi/models/amazon/nova-pro-v1.toml new file mode 100644 index 00000000000..a8046221595 --- /dev/null +++ b/providers/aimlapi/models/amazon/nova-pro-v1.toml @@ -0,0 +1,5 @@ +base_model = "amazon/nova-pro-v1" + +[cost] +input = 1.10032 +output = 4.40128 diff --git a/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml b/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml new file mode 100644 index 00000000000..78e0215e958 --- /dev/null +++ b/providers/aimlapi/models/anthracite-org/magnum-v4-72b.toml @@ -0,0 +1,9 @@ +base_model = "anthracite-org/magnum-v4-72b" + +[cost] +input = 4.1262 +output = 6.877 + +[limit] +context = 32_000 +output = 16_384 diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.1.toml b/providers/aimlapi/models/anthropic/claude-fable-5.1.toml new file mode 100644 index 00000000000..aa5422395fa --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-fable-5.1.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-fable-5-1" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high", "xhigh", "max"] + +[cost] +input = 13 +output = 65 +cache_read = 0.325 diff --git a/providers/aimlapi/models/anthropic/claude-fable-5.toml b/providers/aimlapi/models/anthropic/claude-fable-5.toml index c5ea100ab0e..185faf06ed2 100644 --- a/providers/aimlapi/models/anthropic/claude-fable-5.toml +++ b/providers/aimlapi/models/anthropic/claude-fable-5.toml @@ -5,7 +5,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["low", "medium", "high"] +values = ["low", "medium", "high", "xhigh", "max"] [cost] input = 13 diff --git a/providers/aimlapi/models/anthropic/claude-opus-5.toml b/providers/aimlapi/models/anthropic/claude-opus-5.toml new file mode 100644 index 00000000000..ece768da424 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-5.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-opus-5" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high", "xhigh", "max"] + +[cost] +input = 6.5 +output = 32.5 +cache_read = 0.65 diff --git a/providers/aimlapi/models/bytedance-seed/seed-1.6-flash.toml b/providers/aimlapi/models/bytedance-seed/seed-1.6-flash.toml new file mode 100644 index 00000000000..3facbf7a46b --- /dev/null +++ b/providers/aimlapi/models/bytedance-seed/seed-1.6-flash.toml @@ -0,0 +1,9 @@ +base_model = "bytedance-seed/seed-1-6-flash" + +[cost] +input = 0.103155 +output = 0.41262 + +[limit] +context = 262_144 +output = 32_768 diff --git a/providers/aimlapi/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml b/providers/aimlapi/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml new file mode 100644 index 00000000000..343a5058bf3 --- /dev/null +++ b/providers/aimlapi/models/cognitivecomputations/dolphin-mistral-24b-venice-edition.toml @@ -0,0 +1,6 @@ +base_model = "cognitivecomputations/dolphin-mistral-24b-venice-edition" +name = "Venice Uncensored" + +[cost] +input = 0.27508 +output = 1.23786 diff --git a/providers/aimlapi/models/cohere/command-a.toml b/providers/aimlapi/models/cohere/command-a.toml new file mode 100644 index 00000000000..6a30a3a6fb6 --- /dev/null +++ b/providers/aimlapi/models/cohere/command-a.toml @@ -0,0 +1,8 @@ +base_model = "cohere/command-a" + +[cost] +input = 3.4385 +output = 13.754 + +[limit] +output = 256_000 diff --git a/providers/aimlapi/models/deepseek/deepseek-chat-v3-0324.toml b/providers/aimlapi/models/deepseek/deepseek-chat-v3-0324.toml new file mode 100644 index 00000000000..c5f54c267ae --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-chat-v3-0324.toml @@ -0,0 +1,11 @@ +base_model = "deepseek/deepseek-chat-v3-0324" +name = "DeepSeek V3" + +[cost] +input = 0.398866 +output = 1.567956 +cache_read = 0.192556 + +[limit] +context = 128_000 +output = 124_000 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index 5d101e0c3bc..e616edecf3c 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -9,6 +9,6 @@ type = "effort" values = ["none", "high"] [cost] -input = 0.5655 -output = 1.131 -cache_read = 0.004713 +input = 1.17 +output = 3.51 +cache_read = 0.039 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4.1-flash.toml b/providers/aimlapi/models/deepseek/deepseek-v4.1-flash.toml new file mode 100644 index 00000000000..a193dbfbcdf --- /dev/null +++ b/providers/aimlapi/models/deepseek/deepseek-v4.1-flash.toml @@ -0,0 +1,13 @@ +base_model = "deepseek/deepseek-v4.1-flash" + +[[reasoning_options]] +type = "effort" +values = ["low", "high"] + +[cost] +input = 0.39 +output = 1.56 +cache_read = 0.0078 + +[limit] +context = 1_048_576 diff --git a/providers/aimlapi/models/google/gemini-3-8-flash.toml b/providers/aimlapi/models/google/gemini-3-8-flash.toml new file mode 100644 index 00000000000..101dd659af2 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3-8-flash.toml @@ -0,0 +1,10 @@ +base_model = "google/gemini-3.8-flash" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 0.975 +output = 4.875 +cache_read = 0.0975 diff --git a/providers/aimlapi/models/google/gemini-3.8-flash.toml b/providers/aimlapi/models/google/gemini-3.8-flash.toml new file mode 100644 index 00000000000..101dd659af2 --- /dev/null +++ b/providers/aimlapi/models/google/gemini-3.8-flash.toml @@ -0,0 +1,10 @@ +base_model = "google/gemini-3.8-flash" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 0.975 +output = 4.875 +cache_read = 0.0975 diff --git a/providers/aimlapi/models/google/gemma-2-27b-it.toml b/providers/aimlapi/models/google/gemma-2-27b-it.toml new file mode 100644 index 00000000000..76cddcc675d --- /dev/null +++ b/providers/aimlapi/models/google/gemma-2-27b-it.toml @@ -0,0 +1,5 @@ +base_model = "google/gemma-2-27b-it" + +[cost] +input = 0.89401 +output = 0.89401 diff --git a/providers/aimlapi/models/google/gemma-3-12b-it.toml b/providers/aimlapi/models/google/gemma-3-12b-it.toml new file mode 100644 index 00000000000..7a4a9af3642 --- /dev/null +++ b/providers/aimlapi/models/google/gemma-3-12b-it.toml @@ -0,0 +1,11 @@ +base_model = "google/gemma-3-12b-it" +name = "Gemma 3 12B" + +[cost] +input = 0.06877 +output = 0.20631 +cache_read = 0.055016 + +[limit] +context = 131_000 +output = 96_000 diff --git a/providers/aimlapi/models/google/gemma-3-27b-it.toml b/providers/aimlapi/models/google/gemma-3-27b-it.toml new file mode 100644 index 00000000000..12f843f35f3 --- /dev/null +++ b/providers/aimlapi/models/google/gemma-3-27b-it.toml @@ -0,0 +1,11 @@ +base_model = "google/gemma-3-27b-it" +name = "Gemma 3 27B" + +[cost] +input = 0.20631 +output = 0.632684 +cache_read = 0.103155 + +[limit] +context = 128_000 +output = 117_964 diff --git a/providers/aimlapi/models/google/gemma-3-4b-it.toml b/providers/aimlapi/models/google/gemma-3-4b-it.toml new file mode 100644 index 00000000000..da2030fb30d --- /dev/null +++ b/providers/aimlapi/models/google/gemma-3-4b-it.toml @@ -0,0 +1,11 @@ +base_model = "google/gemma-3-4b-it" +name = "Gemma 3 4B" + +[cost] +input = 0.06877 +output = 0.13754 +cache_read = 0.055016 + +[limit] +context = 131_000 +output = 32_768 diff --git a/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml new file mode 100644 index 00000000000..7c644ff4161 --- /dev/null +++ b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml @@ -0,0 +1,10 @@ +base_model = "gryphe/mythomax-l2-13b" + +[cost] +input = 2.578875 +output = 2.578875 +cache_read = 2.578875 + +[limit] +context = 4_096 +output = 4_096 diff --git a/providers/aimlapi/models/ibm-granite/granite-4.0-h-micro.toml b/providers/aimlapi/models/ibm-granite/granite-4.0-h-micro.toml new file mode 100644 index 00000000000..a310c769582 --- /dev/null +++ b/providers/aimlapi/models/ibm-granite/granite-4.0-h-micro.toml @@ -0,0 +1,10 @@ +base_model = "ibm/granite-4-h-micro" +name = "Granite 4.0 Micro" + +[cost] +input = 0.023382 +output = 0.154045 + +[limit] +context = 131_000 +output = 131_000 diff --git a/providers/aimlapi/models/inception/mercury-2.5.toml b/providers/aimlapi/models/inception/mercury-2.5.toml new file mode 100644 index 00000000000..e568676fa32 --- /dev/null +++ b/providers/aimlapi/models/inception/mercury-2.5.toml @@ -0,0 +1,10 @@ +base_model = "inception/mercury-2.5" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 0.27508 +output = 1.03155 +cache_read = 0.027508 diff --git a/providers/aimlapi/models/inception/mercury-2.toml b/providers/aimlapi/models/inception/mercury-2.toml new file mode 100644 index 00000000000..f7b3df2928a --- /dev/null +++ b/providers/aimlapi/models/inception/mercury-2.toml @@ -0,0 +1,10 @@ +base_model = "inception/mercury-2" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 0.34385 +output = 1.03155 +cache_read = 0.034385 diff --git a/providers/aimlapi/models/inference-net/schematron-v2-small.toml b/providers/aimlapi/models/inference-net/schematron-v2-small.toml new file mode 100644 index 00000000000..7e7b140ecc8 --- /dev/null +++ b/providers/aimlapi/models/inference-net/schematron-v2-small.toml @@ -0,0 +1,5 @@ +base_model = "inference-net/schematron-v2-small" + +[cost] +input = 0.06877 +output = 0.316342 diff --git a/providers/aimlapi/models/inference-net/schematron-v2-turbo.toml b/providers/aimlapi/models/inference-net/schematron-v2-turbo.toml new file mode 100644 index 00000000000..60883e0b0bd --- /dev/null +++ b/providers/aimlapi/models/inference-net/schematron-v2-turbo.toml @@ -0,0 +1,5 @@ +base_model = "inference-net/schematron-v2-turbo" + +[cost] +input = 0.041262 +output = 0.20631 diff --git a/providers/aimlapi/models/mancer/weaver.toml b/providers/aimlapi/models/mancer/weaver.toml new file mode 100644 index 00000000000..46e19411608 --- /dev/null +++ b/providers/aimlapi/models/mancer/weaver.toml @@ -0,0 +1,8 @@ +base_model = "mancer/weaver" + +[cost] +input = 1.03155 +output = 1.3754 + +[limit] +output = 2_000 diff --git a/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml b/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml new file mode 100644 index 00000000000..ed4d8df1fe9 --- /dev/null +++ b/providers/aimlapi/models/meta-llama/Llama-3.3-70B-Instruct-Turbo.toml @@ -0,0 +1,9 @@ +base_model = "meta/llama-3.3-70b-instruct" +name = "Llama 3.3 70B Instruct Turbo" + +[cost] +input = 1.352 +output = 1.352 + +[limit] +output = 127_000 diff --git a/providers/aimlapi/models/meta/muse-spark-1.3.toml b/providers/aimlapi/models/meta/muse-spark-1.3.toml new file mode 100644 index 00000000000..6314ce0e3a2 --- /dev/null +++ b/providers/aimlapi/models/meta/muse-spark-1.3.toml @@ -0,0 +1,10 @@ +base_model = "meta/muse-spark-1.3" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 1.71925 +output = 5.84545 +cache_read = 0.20631 diff --git a/providers/aimlapi/models/mistralai/codestral-2508.toml b/providers/aimlapi/models/mistralai/codestral-2508.toml new file mode 100644 index 00000000000..7dccea4c566 --- /dev/null +++ b/providers/aimlapi/models/mistralai/codestral-2508.toml @@ -0,0 +1,6 @@ +base_model = "mistral/codestral-2508" + +[cost] +input = 0.41262 +output = 1.23786 +cache_read = 0.041262 diff --git a/providers/aimlapi/models/mistralai/ministral-14b-2512.toml b/providers/aimlapi/models/mistralai/ministral-14b-2512.toml new file mode 100644 index 00000000000..542aaaed7e2 --- /dev/null +++ b/providers/aimlapi/models/mistralai/ministral-14b-2512.toml @@ -0,0 +1,6 @@ +base_model = "mistral/ministral-14b-2512" + +[cost] +input = 0.48139 +output = 0.48139 +cache_read = 0.027508 diff --git a/providers/aimlapi/models/mistralai/ministral-3b-2512.toml b/providers/aimlapi/models/mistralai/ministral-3b-2512.toml new file mode 100644 index 00000000000..71d2d7f564a --- /dev/null +++ b/providers/aimlapi/models/mistralai/ministral-3b-2512.toml @@ -0,0 +1,6 @@ +base_model = "mistral/ministral-3b-2512" + +[cost] +input = 0.20631 +output = 0.20631 +cache_read = 0.013754 diff --git a/providers/aimlapi/models/mistralai/ministral-8b-2512.toml b/providers/aimlapi/models/mistralai/ministral-8b-2512.toml new file mode 100644 index 00000000000..902d3bd46e9 --- /dev/null +++ b/providers/aimlapi/models/mistralai/ministral-8b-2512.toml @@ -0,0 +1,6 @@ +base_model = "mistral/ministral-8b-2512" + +[cost] +input = 0.41262 +output = 0.41262 +cache_read = 0.020631 diff --git a/providers/aimlapi/models/mistralai/mistral-large-2407.toml b/providers/aimlapi/models/mistralai/mistral-large-2407.toml new file mode 100644 index 00000000000..72fbac2c328 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-large-2407.toml @@ -0,0 +1,7 @@ +base_model = "mistral/mistral-large-2407" +name = "Large 2407" + +[cost] +input = 2.7508 +output = 8.2524 +cache_read = 0.27508 diff --git a/providers/aimlapi/models/mistralai/mistral-large-2512.toml b/providers/aimlapi/models/mistralai/mistral-large-2512.toml deleted file mode 100644 index b1b3cbc769f..00000000000 --- a/providers/aimlapi/models/mistralai/mistral-large-2512.toml +++ /dev/null @@ -1,7 +0,0 @@ -base_model = "mistral/mistral-large-2512" -name = "Large 3 2512" - -[cost] -input = 0.6877 -output = 2.0631 -cache_read = 0.06877 diff --git a/providers/aimlapi/models/mistralai/mistral-large.toml b/providers/aimlapi/models/mistralai/mistral-large.toml new file mode 100644 index 00000000000..86be31b54eb --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-large.toml @@ -0,0 +1,7 @@ +base_model = "mistral/mistral-large" +name = "Large" + +[cost] +input = 2.7508 +output = 8.2524 +cache_read = 0.27508 diff --git a/providers/aimlapi/models/mistralai/mistral-medium-3-5.toml b/providers/aimlapi/models/mistralai/mistral-medium-3-5.toml new file mode 100644 index 00000000000..809232b427e --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-medium-3-5.toml @@ -0,0 +1,10 @@ +base_model = "mistral/mistral-medium-3-5" +name = "Medium 3.5" + +[[reasoning_options]] +type = "effort" +values = ["high"] + +[cost] +input = 2.0631 +output = 10.3155 diff --git a/providers/aimlapi/models/mistralai/mistral-medium-3.1.toml b/providers/aimlapi/models/mistralai/mistral-medium-3.1.toml new file mode 100644 index 00000000000..78d184a4232 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-medium-3.1.toml @@ -0,0 +1,7 @@ +base_model = "mistral/mistral-medium-3.1" +name = "Medium 3.1" + +[cost] +input = 0.55016 +output = 2.7508 +cache_read = 0.055016 diff --git a/providers/aimlapi/models/mistralai/mistral-medium-3.toml b/providers/aimlapi/models/mistralai/mistral-medium-3.toml new file mode 100644 index 00000000000..c26192e693c --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-medium-3.toml @@ -0,0 +1,7 @@ +base_model = "mistral/mistral-medium-3" +name = "Medium 3" + +[cost] +input = 0.55016 +output = 2.7508 +cache_read = 0.055016 diff --git a/providers/aimlapi/models/mistralai/mistral-saba.toml b/providers/aimlapi/models/mistralai/mistral-saba.toml new file mode 100644 index 00000000000..b7fce0dac1f --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-saba.toml @@ -0,0 +1,6 @@ +base_model = "mistral/mistral-saba" + +[cost] +input = 0.27508 +output = 0.82524 +cache_read = 0.027508 diff --git a/providers/aimlapi/models/mistralai/mistral-small-24b-instruct-2501.toml b/providers/aimlapi/models/mistralai/mistral-small-24b-instruct-2501.toml new file mode 100644 index 00000000000..d9ab08544eb --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-small-24b-instruct-2501.toml @@ -0,0 +1,6 @@ +base_model = "mistral/mistral-small-24b-instruct-2501" +name = "Small 3" + +[cost] +input = 0.06877 +output = 0.110032 diff --git a/providers/aimlapi/models/mistralai/mistral-small-3.1-24b-instruct.toml b/providers/aimlapi/models/mistralai/mistral-small-3.1-24b-instruct.toml new file mode 100644 index 00000000000..94f1b496b46 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-small-3.1-24b-instruct.toml @@ -0,0 +1,9 @@ +base_model = "mistral/mistral-small-3.1-24b-instruct" +name = "Small 3.1 24B" + +[cost] +input = 0.482765 +output = 0.763347 + +[limit] +output = 128_000 diff --git a/providers/aimlapi/models/mistralai/mistral-small-3.2-24b-instruct.toml b/providers/aimlapi/models/mistralai/mistral-small-3.2-24b-instruct.toml new file mode 100644 index 00000000000..dcf659da99c --- /dev/null +++ b/providers/aimlapi/models/mistralai/mistral-small-3.2-24b-instruct.toml @@ -0,0 +1,9 @@ +base_model = "mistral/mistral-small-3.2-24b-instruct" +name = "Small 3.2 24B" + +[cost] +input = 0.103155 +output = 0.27508 + +[limit] +context = 128_000 diff --git a/providers/aimlapi/models/mistralai/mixtral-8x22b-instruct.toml b/providers/aimlapi/models/mistralai/mixtral-8x22b-instruct.toml new file mode 100644 index 00000000000..17fbb52b2f8 --- /dev/null +++ b/providers/aimlapi/models/mistralai/mixtral-8x22b-instruct.toml @@ -0,0 +1,6 @@ +base_model = "mistral/mixtral-8x22b-instruct" + +[cost] +input = 2.7508 +output = 8.2524 +cache_read = 0.27508 diff --git a/providers/aimlapi/models/mistralai/voxtral-small-24b-2507.toml b/providers/aimlapi/models/mistralai/voxtral-small-24b-2507.toml new file mode 100644 index 00000000000..ec8e9ab7a20 --- /dev/null +++ b/providers/aimlapi/models/mistralai/voxtral-small-24b-2507.toml @@ -0,0 +1,9 @@ +base_model = "mistral/voxtral-small-24b-2507" + +[cost] +input = 0.13754 +output = 0.41262 +cache_read = 0.013754 + +[limit] +context = 32_000 diff --git a/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml b/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml new file mode 100644 index 00000000000..ad878122e8e --- /dev/null +++ b/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml @@ -0,0 +1,5 @@ +base_model = "moonshotai/kimi-k2-0905" + +[cost] +input = 1.3754 +output = 4.1262 diff --git a/providers/aimlapi/models/moonshotai/kimi-k2.toml b/providers/aimlapi/models/moonshotai/kimi-k2.toml new file mode 100644 index 00000000000..d1475011c94 --- /dev/null +++ b/providers/aimlapi/models/moonshotai/kimi-k2.toml @@ -0,0 +1,5 @@ +base_model = "moonshotai/kimi-k2" + +[cost] +input = 0.783978 +output = 3.16342 diff --git a/providers/aimlapi/models/morph/morph-v3-fast.toml b/providers/aimlapi/models/morph/morph-v3-fast.toml new file mode 100644 index 00000000000..cdbdba35303 --- /dev/null +++ b/providers/aimlapi/models/morph/morph-v3-fast.toml @@ -0,0 +1,6 @@ +base_model = "morph/morph-v3-fast" +name = "V3 Fast" + +[cost] +input = 1.10032 +output = 1.65048 diff --git a/providers/aimlapi/models/morph/morph-v3-large.toml b/providers/aimlapi/models/morph/morph-v3-large.toml new file mode 100644 index 00000000000..eaf467c1a9e --- /dev/null +++ b/providers/aimlapi/models/morph/morph-v3-large.toml @@ -0,0 +1,6 @@ +base_model = "morph/morph-v3-large" +name = "V3 Large" + +[cost] +input = 1.23786 +output = 2.61326 diff --git a/providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-405b.toml b/providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-405b.toml new file mode 100644 index 00000000000..3644710bfbd --- /dev/null +++ b/providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-405b.toml @@ -0,0 +1,5 @@ +base_model = "nousresearch/hermes-3-llama-3.1-405b" + +[cost] +input = 1.3754 +output = 1.3754 diff --git a/providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-70b.toml b/providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-70b.toml new file mode 100644 index 00000000000..e893dd909ac --- /dev/null +++ b/providers/aimlapi/models/nousresearch/hermes-3-llama-3.1-70b.toml @@ -0,0 +1,5 @@ +base_model = "nousresearch/hermes-3-llama-3.1-70b" + +[cost] +input = 0.96278 +output = 0.96278 diff --git a/providers/aimlapi/models/openai/gpt-5-1.toml b/providers/aimlapi/models/openai/gpt-5-1.toml new file mode 100644 index 00000000000..882c534fa1f --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-1.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.1" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 1.625 +output = 13 +cache_read = 0.1625 diff --git a/providers/aimlapi/models/openai/gpt-5-2.toml b/providers/aimlapi/models/openai/gpt-5-2.toml new file mode 100644 index 00000000000..49a3e7c0a17 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-2.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.2" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.275 +output = 18.2 +cache_read = 0.2275 diff --git a/providers/aimlapi/models/openai/gpt-5-4.toml b/providers/aimlapi/models/openai/gpt-5-4.toml new file mode 100644 index 00000000000..55003cd4967 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-4.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.4" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 3.25 +output = 19.5 +cache_read = 0.325 diff --git a/providers/aimlapi/models/openai/gpt-5-5.toml b/providers/aimlapi/models/openai/gpt-5-5.toml new file mode 100644 index 00000000000..7484a293062 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5-5.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.5" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 6.5 +output = 39 +cache_read = 0.65 diff --git a/providers/aimlapi/models/openai/gpt-5.4-image-2.toml b/providers/aimlapi/models/openai/gpt-5.4-image-2.toml new file mode 100644 index 00000000000..9f9107d117d --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-5.4-image-2.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-5.4-image-2" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 11.0032 +output = 20.631 +cache_read = 2.7508 diff --git a/providers/aimlapi/models/openai/gpt-6-astra.toml b/providers/aimlapi/models/openai/gpt-6-astra.toml new file mode 100644 index 00000000000..1b1eac5d7f7 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-6-astra.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-6-astra" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high", "xhigh", "max"] + +[cost] +input = 13 +output = 65 +cache_read = 1.3 diff --git a/providers/aimlapi/models/openai/gpt-oss-safeguard-20b.toml b/providers/aimlapi/models/openai/gpt-oss-safeguard-20b.toml new file mode 100644 index 00000000000..31fa4a68e7b --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-oss-safeguard-20b.toml @@ -0,0 +1,14 @@ +base_model = "openai/gpt-oss-safeguard-20b" +name = "gpt-oss-safeguard-20b" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 0.103155 +output = 0.41262 +cache_read = 0.051578 + +[limit] +output = 65_536 diff --git a/providers/aimlapi/models/rekaai/reka-edge.toml b/providers/aimlapi/models/rekaai/reka-edge.toml new file mode 100644 index 00000000000..ed94c5ecb3f --- /dev/null +++ b/providers/aimlapi/models/rekaai/reka-edge.toml @@ -0,0 +1,8 @@ +base_model = "rekaai/reka-edge" + +[cost] +input = 0.13754 +output = 0.13754 + +[limit] +output = 16_384 diff --git a/providers/aimlapi/models/relace/relace-apply-3.toml b/providers/aimlapi/models/relace/relace-apply-3.toml new file mode 100644 index 00000000000..c09cd04a080 --- /dev/null +++ b/providers/aimlapi/models/relace/relace-apply-3.toml @@ -0,0 +1,6 @@ +base_model = "relace/relace-apply-3" +name = "Apply 3" + +[cost] +input = 1.16909 +output = 1.71925 diff --git a/providers/aimlapi/models/relace/relace-search.toml b/providers/aimlapi/models/relace/relace-search.toml new file mode 100644 index 00000000000..8331590f1ce --- /dev/null +++ b/providers/aimlapi/models/relace/relace-search.toml @@ -0,0 +1,6 @@ +base_model = "relace/relace-search" +name = "Search" + +[cost] +input = 1.3754 +output = 4.1262 diff --git a/providers/aimlapi/models/sakana/fugu-max.toml b/providers/aimlapi/models/sakana/fugu-max.toml new file mode 100644 index 00000000000..7066f437b7a --- /dev/null +++ b/providers/aimlapi/models/sakana/fugu-max.toml @@ -0,0 +1,10 @@ +base_model = "sakana/fugu-max" + +[[reasoning_options]] +type = "effort" +values = ["high"] + +[cost] +input = 2.7508 +output = 8.2524 +cache_read = 0.34385 diff --git a/providers/aimlapi/models/sakana/fugu-ultra-v2.toml b/providers/aimlapi/models/sakana/fugu-ultra-v2.toml new file mode 100644 index 00000000000..bf358617468 --- /dev/null +++ b/providers/aimlapi/models/sakana/fugu-ultra-v2.toml @@ -0,0 +1,10 @@ +base_model = "sakana/fugu-ultra-v2" + +[[reasoning_options]] +type = "effort" +values = ["high"] + +[cost] +input = 6.877 +output = 41.262 +cache_read = 0.6877 diff --git a/providers/aimlapi/models/sao10k/l3-lunaris-8b.toml b/providers/aimlapi/models/sao10k/l3-lunaris-8b.toml new file mode 100644 index 00000000000..11edc5c2b28 --- /dev/null +++ b/providers/aimlapi/models/sao10k/l3-lunaris-8b.toml @@ -0,0 +1,5 @@ +base_model = "sao10k/l3-lunaris-8b" + +[cost] +input = 0.06877 +output = 0.06877 diff --git a/providers/aimlapi/models/sao10k/l3.1-euryale-70b.toml b/providers/aimlapi/models/sao10k/l3.1-euryale-70b.toml new file mode 100644 index 00000000000..7a07568c1bb --- /dev/null +++ b/providers/aimlapi/models/sao10k/l3.1-euryale-70b.toml @@ -0,0 +1,5 @@ +base_model = "sao10k/l3.1-euryale-70b" + +[cost] +input = 1.99488 +output = 1.99488 diff --git a/providers/aimlapi/models/sao10k/l3.3-euryale-70b.toml b/providers/aimlapi/models/sao10k/l3.3-euryale-70b.toml new file mode 100644 index 00000000000..1d9a37dca11 --- /dev/null +++ b/providers/aimlapi/models/sao10k/l3.3-euryale-70b.toml @@ -0,0 +1,5 @@ +base_model = "sao10k/l3.3-euryale-70b" + +[cost] +input = 0.89401 +output = 1.03155 diff --git a/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml b/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml new file mode 100644 index 00000000000..14d955fb660 --- /dev/null +++ b/providers/aimlapi/models/tencent/hy-mt2-1.8b.toml @@ -0,0 +1,5 @@ +base_model = "tencent/hy-mt2-1.8b" + +[cost] +input = 0.060518 +output = 0.243446 diff --git a/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml b/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml new file mode 100644 index 00000000000..ebc2d5465d9 --- /dev/null +++ b/providers/aimlapi/models/tencent/hy-mt2-30b-a3b.toml @@ -0,0 +1,5 @@ +base_model = "tencent/hy-mt2-30b-a3b" + +[cost] +input = 0.10178 +output = 0.405743 diff --git a/providers/aimlapi/models/tencent/hy-mt2-7b.toml b/providers/aimlapi/models/tencent/hy-mt2-7b.toml new file mode 100644 index 00000000000..09181507290 --- /dev/null +++ b/providers/aimlapi/models/tencent/hy-mt2-7b.toml @@ -0,0 +1,5 @@ +base_model = "tencent/hy-mt2-7b" + +[cost] +input = 0.10178 +output = 0.405743 diff --git a/providers/aimlapi/models/thedrummer/cydonia-24b-v4.1.toml b/providers/aimlapi/models/thedrummer/cydonia-24b-v4.1.toml new file mode 100644 index 00000000000..15e83fbeb43 --- /dev/null +++ b/providers/aimlapi/models/thedrummer/cydonia-24b-v4.1.toml @@ -0,0 +1,9 @@ +base_model = "thedrummer/cydonia-24b-v4.1" + +[cost] +input = 0.41262 +output = 0.6877 +cache_read = 0.20631 + +[limit] +output = 131_072 diff --git a/providers/aimlapi/models/thedrummer/skyfall-36b-v2.toml b/providers/aimlapi/models/thedrummer/skyfall-36b-v2.toml new file mode 100644 index 00000000000..5caeaa3c10b --- /dev/null +++ b/providers/aimlapi/models/thedrummer/skyfall-36b-v2.toml @@ -0,0 +1,9 @@ +base_model = "thedrummer/skyfall-36b-v2" + +[cost] +input = 0.75647 +output = 1.10032 +cache_read = 0.34385 + +[limit] +output = 32_768 diff --git a/providers/aimlapi/models/thedrummer/unslopnemo-12b.toml b/providers/aimlapi/models/thedrummer/unslopnemo-12b.toml new file mode 100644 index 00000000000..94cca2175f2 --- /dev/null +++ b/providers/aimlapi/models/thedrummer/unslopnemo-12b.toml @@ -0,0 +1,9 @@ +base_model = "thedrummer/unslopnemo-12b" + +[cost] +input = 0.55016 +output = 0.55016 + +[limit] +context = 32_768 +output = 32_768 diff --git a/providers/aimlapi/models/undi95/remm-slerp-l2-13b.toml b/providers/aimlapi/models/undi95/remm-slerp-l2-13b.toml new file mode 100644 index 00000000000..3ddfb241825 --- /dev/null +++ b/providers/aimlapi/models/undi95/remm-slerp-l2-13b.toml @@ -0,0 +1,8 @@ +base_model = "undi95/remm-slerp-l2-13b" + +[cost] +input = 0.6877 +output = 1.03155 + +[limit] +output = 4_096 diff --git a/providers/aimlapi/models/upstage/solar-pro-3.toml b/providers/aimlapi/models/upstage/solar-pro-3.toml new file mode 100644 index 00000000000..58747fef346 --- /dev/null +++ b/providers/aimlapi/models/upstage/solar-pro-3.toml @@ -0,0 +1,13 @@ +base_model = "upstage/solar-pro3" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 0.20631 +output = 0.82524 +cache_read = 0.020631 + +[limit] +context = 128_000 diff --git a/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml new file mode 100644 index 00000000000..fb630840cbb --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-20-0309-non-reasoning.toml @@ -0,0 +1,11 @@ +base_model = "xai/grok-4.20-0309-non-reasoning" +name = "Grok 4.20 Non-Reasoning" + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +context = 2_000_000 +output = 1_999_000 diff --git a/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml b/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml new file mode 100644 index 00000000000..c7e60b9aa0f --- /dev/null +++ b/providers/aimlapi/models/x-ai/grok-4-fast-non-reasoning.toml @@ -0,0 +1,10 @@ +base_model = "xai/grok-4-fast-non-reasoning" +name = "Grok 4 Fast Non-Reasoning" + +[cost] +input = 1.625 +output = 3.25 +cache_read = 0.26 + +[limit] +output = 1_999_000 diff --git a/providers/aimlapi/models/zhipu/glm-5.2.toml b/providers/aimlapi/models/zhipu/glm-5.2.toml new file mode 100644 index 00000000000..60dbb980080 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5.2.toml @@ -0,0 +1,11 @@ +base_model = "zhipuai/glm-5.2" +name = "GLM 5.2" + +[[reasoning_options]] +type = "effort" +values = ["high"] + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.338 diff --git a/providers/aimlapi/models/zhipu/glm-5.3.toml b/providers/aimlapi/models/zhipu/glm-5.3.toml new file mode 100644 index 00000000000..0a2bd93bba4 --- /dev/null +++ b/providers/aimlapi/models/zhipu/glm-5.3.toml @@ -0,0 +1,14 @@ +base_model = "zhipuai/glm-5.3" +name = "GLM 5.3" + +[[reasoning_options]] +type = "effort" +values = ["low", "high"] + +[cost] +input = 1.82 +output = 5.72 +cache_read = 0.338 + +[limit] +context = 1_024_000 From 096f6cacace72ed929231c0add43f31c5f417a26 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 12 Oct 2026 20:56:56 -0500 Subject: [PATCH 36/38] fix(core): populate AI/ML API cards for models added on latest dev --- .../aimlapi/models/alibaba/qwen3.8-max-prime.toml | 11 +++++++++++ .../aimlapi/models/anthropic/claude-haiku-5.5.toml | 10 ++++++++++ .../aimlapi/models/anthropic/claude-opus-5.5.toml | 10 ++++++++++ .../aimlapi/models/anthropic/claude-sonnet-5.5.toml | 10 ++++++++++ .../models/deepseek/deepseek-v4-pro-0813.toml | 2 +- .../aimlapi/models/deepseek/deepseek-v4-pro.toml | 2 +- .../aimlapi/models/gryphe/mythomax-l2-13b.toml | 2 +- .../aimlapi/models/mistralai/codestral-2508.toml | 4 ++++ .../aimlapi/models/moonshotai/kimi-k2-0905.toml | 1 + providers/aimlapi/models/openai/gpt-6-luna.toml | 10 ++++++++++ providers/aimlapi/models/openai/gpt-6-sol.toml | 10 ++++++++++ providers/aimlapi/models/openai/gpt-6.1-sol.toml | 10 ++++++++++ .../aimlapi/models/stepfun/step-5-preview.toml | 13 +++++++++++++ providers/aimlapi/models/unbiased/pareto.toml | 6 ++++++ 14 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 providers/aimlapi/models/alibaba/qwen3.8-max-prime.toml create mode 100644 providers/aimlapi/models/anthropic/claude-haiku-5.5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-opus-5.5.toml create mode 100644 providers/aimlapi/models/anthropic/claude-sonnet-5.5.toml create mode 100644 providers/aimlapi/models/openai/gpt-6-luna.toml create mode 100644 providers/aimlapi/models/openai/gpt-6-sol.toml create mode 100644 providers/aimlapi/models/openai/gpt-6.1-sol.toml create mode 100644 providers/aimlapi/models/stepfun/step-5-preview.toml create mode 100644 providers/aimlapi/models/unbiased/pareto.toml diff --git a/providers/aimlapi/models/alibaba/qwen3.8-max-prime.toml b/providers/aimlapi/models/alibaba/qwen3.8-max-prime.toml new file mode 100644 index 00000000000..3a5704dea80 --- /dev/null +++ b/providers/aimlapi/models/alibaba/qwen3.8-max-prime.toml @@ -0,0 +1,11 @@ +base_model = "alibaba/qwen3.8-max-prime" +name = "Qwen3.8 Max Prime" + +[[reasoning_options]] +type = "effort" +values = ["minimal", "low", "medium", "high", "xhigh"] + +[cost] +input = 5.5016 +output = 16.5048 +cache_read = 0.6877 diff --git a/providers/aimlapi/models/anthropic/claude-haiku-5.5.toml b/providers/aimlapi/models/anthropic/claude-haiku-5.5.toml new file mode 100644 index 00000000000..14d286c3af8 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-haiku-5.5.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-haiku-5-5" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high", "xhigh", "max"] + +[cost] +input = 0.13 +output = 0.65 +cache_read = 0.013 diff --git a/providers/aimlapi/models/anthropic/claude-opus-5.5.toml b/providers/aimlapi/models/anthropic/claude-opus-5.5.toml new file mode 100644 index 00000000000..d74e5d769ba --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-opus-5.5.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-opus-5-5" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high", "xhigh", "max"] + +[cost] +input = 5.2 +output = 26 +cache_read = 0.26 diff --git a/providers/aimlapi/models/anthropic/claude-sonnet-5.5.toml b/providers/aimlapi/models/anthropic/claude-sonnet-5.5.toml new file mode 100644 index 00000000000..811dc266534 --- /dev/null +++ b/providers/aimlapi/models/anthropic/claude-sonnet-5.5.toml @@ -0,0 +1,10 @@ +base_model = "anthropic/claude-sonnet-5-5" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high", "xhigh", "max"] + +[cost] +input = 2.6 +output = 13 +cache_read = 0.26 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml index 1782cd21a30..8c630c37419 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro-0813.toml @@ -6,7 +6,7 @@ field = "reasoning_details" [[reasoning_options]] type = "effort" -values = ["none", "high"] +values = ["none", "low", "high"] [cost] input = 2.393196 diff --git a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml index e616edecf3c..b3d4d680544 100644 --- a/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml +++ b/providers/aimlapi/models/deepseek/deepseek-v4-pro.toml @@ -6,7 +6,7 @@ field = "reasoning_content" [[reasoning_options]] type = "effort" -values = ["none", "high"] +values = ["none", "low", "high"] [cost] input = 1.17 diff --git a/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml index 7c644ff4161..d426a8f63a2 100644 --- a/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml +++ b/providers/aimlapi/models/gryphe/mythomax-l2-13b.toml @@ -1,4 +1,5 @@ base_model = "gryphe/mythomax-l2-13b" +name = "MythoMax 13B" [cost] input = 2.578875 @@ -6,5 +7,4 @@ output = 2.578875 cache_read = 2.578875 [limit] -context = 4_096 output = 4_096 diff --git a/providers/aimlapi/models/mistralai/codestral-2508.toml b/providers/aimlapi/models/mistralai/codestral-2508.toml index 7dccea4c566..f18edca97c0 100644 --- a/providers/aimlapi/models/mistralai/codestral-2508.toml +++ b/providers/aimlapi/models/mistralai/codestral-2508.toml @@ -1,6 +1,10 @@ base_model = "mistral/codestral-2508" +name = "Codestral 2508" [cost] input = 0.41262 output = 1.23786 cache_read = 0.041262 + +[limit] +context = 256_000 diff --git a/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml b/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml index ad878122e8e..85cd08d0945 100644 --- a/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml +++ b/providers/aimlapi/models/moonshotai/kimi-k2-0905.toml @@ -1,4 +1,5 @@ base_model = "moonshotai/kimi-k2-0905" +name = "Kimi K2 0905" [cost] input = 1.3754 diff --git a/providers/aimlapi/models/openai/gpt-6-luna.toml b/providers/aimlapi/models/openai/gpt-6-luna.toml new file mode 100644 index 00000000000..11b562ce379 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-6-luna.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-6-luna" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 0.13 +output = 0.65 +cache_read = 0.013 diff --git a/providers/aimlapi/models/openai/gpt-6-sol.toml b/providers/aimlapi/models/openai/gpt-6-sol.toml new file mode 100644 index 00000000000..688ca1ef448 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-6-sol.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-6-sol" + +[[reasoning_options]] +type = "effort" +values = ["none", "low", "medium", "high"] + +[cost] +input = 2.6 +output = 13 +cache_read = 0.26 diff --git a/providers/aimlapi/models/openai/gpt-6.1-sol.toml b/providers/aimlapi/models/openai/gpt-6.1-sol.toml new file mode 100644 index 00000000000..92eb2770261 --- /dev/null +++ b/providers/aimlapi/models/openai/gpt-6.1-sol.toml @@ -0,0 +1,10 @@ +base_model = "openai/gpt-6.1-sol" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 2.6 +output = 13 +cache_read = 0.13 diff --git a/providers/aimlapi/models/stepfun/step-5-preview.toml b/providers/aimlapi/models/stepfun/step-5-preview.toml new file mode 100644 index 00000000000..d8ca6a58992 --- /dev/null +++ b/providers/aimlapi/models/stepfun/step-5-preview.toml @@ -0,0 +1,13 @@ +base_model = "stepfun/step-5-preview" + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] + +[cost] +input = 1.3754 +output = 3.71358 +cache_read = 0.06877 + +[limit] +output = 64_000 diff --git a/providers/aimlapi/models/unbiased/pareto.toml b/providers/aimlapi/models/unbiased/pareto.toml new file mode 100644 index 00000000000..86d2239620f --- /dev/null +++ b/providers/aimlapi/models/unbiased/pareto.toml @@ -0,0 +1,6 @@ +base_model = "unbiased/pareto" + +[cost] +input = 3.4385 +output = 10.3155 +cache_read = 0.34385 From a7df51cf6095400a8799c7e3c17d6db1e24d449e Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 12 Oct 2026 20:57:10 -0500 Subject: [PATCH 37/38] fix(core): blacklist dated duplicate spellings on AI/ML API --- packages/core/src/sync/providers/aimlapi.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 7bfd4485730..30cec232385 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -483,6 +483,11 @@ const BLACKLISTED: ReadonlySet = new Set([ "bytedance/seed-2-0-lite", "bytedance/seed-2-0-mini", "google/gemini-3-1-flash-lite-preview", + // Dated duplicate spellings of canonical cards already published. + "anthropic/claude-haiku-4-5-20251001", + "anthropic/claude-sonnet-4-5-20250929", + "anthropic/claude-opus-4-5-20251101", + "openai/gpt-3.5-turbo-0125", ]); const PROVIDERS_DIR = path.join(import.meta.dirname, "..", "..", "..", "..", "..", "providers"); From 287a94d5fca22672d52ce53e250f2a011a90752a Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 12 Oct 2026 21:37:48 -0500 Subject: [PATCH 38/38] fix(core): only issue AI/ML API models an issue can fix --- packages/core/src/sync/providers/aimlapi.ts | 30 +++++++++++++++------ packages/core/test/aimlapi.test.ts | 23 ++++++++++++++-- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/packages/core/src/sync/providers/aimlapi.ts b/packages/core/src/sync/providers/aimlapi.ts index 30cec232385..5c8a2b80628 100755 --- a/packages/core/src/sync/providers/aimlapi.ts +++ b/packages/core/src/sync/providers/aimlapi.ts @@ -1,4 +1,4 @@ -import { readFileSync } from "node:fs"; +import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; import { z } from "zod"; @@ -1121,11 +1121,18 @@ function wireHeader(id: string, reasoningOptions: Array<{ type: "effort"; values /** * The remote id to report for a chat candidate, or `undefined` for records * sync intentionally ignores: uncallable rows, dashed alias duplicates, and - * anything that is not a text-output chat model. Shared by `sourceID` (report - * the skip) and `missingModelID` (route the skip to the missing-model issue - * flow): every remaining skip is "cannot fully populate" — no lab entry to - * point `base_model` at, no resolvable reasoning control, or no price — which - * is exactly what that flow exists to research. + * anything that is not a text-output chat model. `sourceID` reports every + * candidate skip in the sync report. `missingModelID` is narrower — it routes + * a skip to the missing-model issue flow only when an issue can fix it: + * + * - No lab entry to point `base_model` at: the issue flow authors it. + * - A card already on disk that sync can no longer state (its reasoning + * control stopped resolving): preserved, and the issue asks for research. + * + * A new model whose lab exists but whose thinking control cannot be stated + * on this host is deliberately not issued: no entry an issue could write + * would make the control exist. It stays unlisted until the host offers one + * that resolves, and appears here only as a report notice. */ function candidateID(model: AimlapiModel): string | undefined { if (BLACKLISTED.has(model.id)) return undefined; @@ -1134,6 +1141,13 @@ function candidateID(model: AimlapiModel): string | undefined { return isChatTextModel(model) ? model.id : undefined; } +function issueModelID(model: AimlapiModel): string | undefined { + if (candidateID(model) === undefined) return undefined; + if (baseModelFor(model.id) === undefined) return model.id; + const local = path.join(PROVIDERS_DIR, "aimlapi", "models", `${model.id}.toml`); + return existsSync(local) ? model.id : undefined; +} + export const aimlapi = { id: "aimlapi", name: "AI/ML API", @@ -1153,12 +1167,12 @@ export const aimlapi = { return candidateID(model); }, missingModelID(model) { - return candidateID(model); + return issueModelID(model); }, skippedNotice(ids) { if (ids.length === 0) return []; return [ - `${ids.length} AI/ML API chat models were not written by sync: new models are routed to the missing-model issue flow for authoring, and models sync cannot fully populate (no lab entry to point \`base_model\` at, no resolvable reasoning control, or no published price) are reported there instead of being guessed. Existing files for those ids are preserved.`, + `${ids.length} AI/ML API chat models were not written by sync. Models with no lab entry to point \`base_model\` at are routed to the missing-model issue flow for authoring; models whose thinking control cannot be stated on this host stay unlisted until the host offers one that resolves, and are listed here only. Existing files for skipped ids are preserved.`, `Skipped remote IDs: ${ids.map((id) => `\`${id}\``).join(", ")}`, ]; }, diff --git a/packages/core/test/aimlapi.test.ts b/packages/core/test/aimlapi.test.ts index ab8d2160cdf..1013274da0e 100644 --- a/packages/core/test/aimlapi.test.ts +++ b/packages/core/test/aimlapi.test.ts @@ -169,11 +169,30 @@ test("only chat candidates are reported for the missing-model issue flow", () => // an issue; intentional ignores (non-chat, alias duplicate, uncallable) // are neither, so sync can still delete those files when they go stale. expect(aimlapi.sourceID(byID.get("acme/chat-1")!)).toBe("acme/chat-1"); - expect(aimlapi.missingModelID(byID.get("acme/chat-1")!)).toBe("acme/chat-1"); - expect(aimlapi.sourceID(byID.get("acme/image-1")!)).toBeUndefined(); + expect(aimlapi.missingModelID(byID.get("acme/chat-1")!)).toBe("acme/chat-1"); expect(aimlapi.sourceID(byID.get("acme/image-1")!)).toBeUndefined(); expect(aimlapi.missingModelID(byID.get("acme/image-1")!)).toBeUndefined(); expect(aimlapi.sourceID(byID.get("anthropic/claude-opus-4-8")!)).toBeUndefined(); expect(aimlapi.missingModelID(byID.get("anthropic/claude-opus-4-8")!)).toBeUndefined(); expect(aimlapi.sourceID(byID.get("anthropic/claude-opus-4.7-fast")!)).toBeUndefined(); expect(aimlapi.missingModelID(byID.get("anthropic/claude-opus-4.7-fast")!)).toBeUndefined(); }); + +test("a lab-backed model with no card and no statable control is reported, not issued", () => { + // qwen3.7-max has a lab entry but publishes toggle/budget only, so sync + // cannot state its thinking control on this host. An issue cannot fix + // that; the model stays unlisted and is only reported. A candidate with + // no lab entry at all (acme/chat-1 above) is issued, because an issue + // can author the entry. + const [model] = aimlapi.parseModels({ + data: [ + { + id: "alibaba/qwen3.7-max", + type: "openai/chat-completions", + info: { name: "Qwen3.7 Max" }, + modalities: { input: ["text"], output: ["text"] }, + }, + ], + }); + expect(aimlapi.sourceID(model!)).toBe("alibaba/qwen3.7-max"); + expect(aimlapi.missingModelID(model!)).toBeUndefined(); +});