diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index b9aa498962..a793bfb037 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -1,21 +1,15 @@ name: beta on: - push: - branches: [dev] - pull_request: - types: [opened, synchronize, labeled, unlabeled] + workflow_dispatch: + schedule: + - cron: "0 * * * *" jobs: sync: - if: | - github.event_name == 'push' || - (github.event_name == 'pull_request' && - contains(github.event.pull_request.labels.*.name, 'contributor')) runs-on: blacksmith-4vcpu-ubuntu-2404 permissions: contents: write - pull-requests: write steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f6cbb16edc..2a36c07e14 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,9 @@ name: test on: + push: + branches: + - dev pull_request: workflow_dispatch: jobs: diff --git a/bun.lock b/bun.lock index 6eebba32ee..746360f1b5 100644 --- a/bun.lock +++ b/bun.lock @@ -266,25 +266,25 @@ "@actions/core": "1.11.1", "@actions/github": "6.0.1", "@agentclientprotocol/sdk": "0.13.0", - "@ai-sdk/amazon-bedrock": "3.0.73", - "@ai-sdk/anthropic": "2.0.57", + "@ai-sdk/amazon-bedrock": "3.0.74", + "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/azure": "2.0.91", - "@ai-sdk/cerebras": "1.0.34", + "@ai-sdk/cerebras": "1.0.36", "@ai-sdk/cohere": "2.0.22", - "@ai-sdk/deepinfra": "1.0.31", - "@ai-sdk/gateway": "2.0.25", + "@ai-sdk/deepinfra": "1.0.33", + "@ai-sdk/gateway": "2.0.30", "@ai-sdk/google": "2.0.52", - "@ai-sdk/google-vertex": "3.0.97", + "@ai-sdk/google-vertex": "3.0.98", "@ai-sdk/groq": "2.0.34", "@ai-sdk/mistral": "2.0.27", "@ai-sdk/openai": "2.0.89", - "@ai-sdk/openai-compatible": "1.0.30", + "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/perplexity": "2.0.23", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", - "@ai-sdk/togetherai": "1.0.31", - "@ai-sdk/vercel": "1.0.31", - "@ai-sdk/xai": "2.0.51", + "@ai-sdk/togetherai": "1.0.34", + "@ai-sdk/vercel": "1.0.33", + "@ai-sdk/xai": "2.0.56", "@clack/prompts": "1.0.0-alpha.1", "@gitlab/gitlab-ai-provider": "3.3.1", "@hono/standard-validator": "0.1.5", @@ -297,7 +297,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@opencode-ai/util": "workspace:*", - "@openrouter/ai-sdk-provider": "1.5.2", + "@openrouter/ai-sdk-provider": "1.5.4", "@opentui/core": "0.1.75", "@opentui/solid": "0.1.75", "@parcel/watcher": "2.5.1", @@ -521,7 +521,7 @@ "@types/node": "22.13.9", "@types/semver": "7.7.1", "@typescript/native-preview": "7.0.0-dev.20251207.1", - "ai": "5.0.119", + "ai": "5.0.124", "diff": "8.0.2", "dompurify": "3.3.1", "fuzzysort": "3.1.0", @@ -559,23 +559,23 @@ "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.13.0", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Z6/Fp4cXLbYdMXr5AK752JM5qG2VKb6ShM0Ql6FimBSckMmLyK54OA20UhPYoH4C37FSFwUTARuwQOwQUToYrw=="], - "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@3.0.73", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.57", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-EAAGJ/dfbAZaqIhK3w52hq6cftSLZwXdC6uHKh8Cls1T0N4MxS6ykDf54UyFO3bZWkQxR+Mdw1B3qireGOxtJQ=="], + "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@3.0.74", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-q83HE3FBb/HPIvjXsehrHOgCuGHPorSMFt6BYnzIYZy8gNnSqV1OWX4oXVsCAuYPPMtYW/KMK35hmoIFV8QKoQ=="], "@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.0", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-uyyaO4KhxoIKZztREqLPh+6/K3ZJx/rp72JKoUEL9/kC+vfQTThUfPnY/bUryUpcnawx8IY/tSoYNOi/8PCv7w=="], "@ai-sdk/azure": ["@ai-sdk/azure@2.0.91", "", { "dependencies": { "@ai-sdk/openai": "2.0.89", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-9tznVSs6LGQNKKxb8pKd7CkBV9yk+a/ENpFicHCj2CmBUKefxzwJ9JbUqrlK3VF6dGZw3LXq0dWxt7/Yekaj1w=="], - "@ai-sdk/cerebras": ["@ai-sdk/cerebras@1.0.34", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-XOK0dJsAGoPYi/lfR4KFBi8xhvJ46oCpAxUD6FmJAuJ4eh0qlj5zDt+myvzM8gvN7S6K7zHD+mdWlOPKGQT8Vg=="], + "@ai-sdk/cerebras": ["@ai-sdk/cerebras@1.0.36", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-zoJYL33+ieyd86FSP0Whm86D79d1lKPR7wUzh1SZ1oTxwYmsGyvIrmMf2Ll0JA9Ds2Es6qik4VaFCrjwGYRTIQ=="], "@ai-sdk/cohere": ["@ai-sdk/cohere@2.0.22", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-yJ9kP5cEDJwo8qpITq5TQFD8YNfNtW+HbyvWwrKMbFzmiMvIZuk95HIaFXE7PCTuZsqMA05yYu+qX/vQ3rNKjA=="], - "@ai-sdk/deepinfra": ["@ai-sdk/deepinfra@1.0.31", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-87qFcYNvDF/89hB//MQjYTb3tlsAfmgeZrZ34RESeBTZpSgs0EzYOMqPMwFTHUNp4wteoifikDJbaS/9Da8cfw=="], + "@ai-sdk/deepinfra": ["@ai-sdk/deepinfra@1.0.33", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-hn2y8Q+2iZgGNVJyzPsH8EECECryFMVmxBJrBvBWoi8xcJPRyt0fZP5dOSLyGg3q0oxmPS9M0Eq0NNlKot/bYQ=="], - "@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.25", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Rq+FX55ne7lMiqai7NcvvDZj4HLsr+hg77WayqmySqc6zhw3tIOLxd4Ty6OpwNj0C0bVMi3iCl2zvJIEirh9XA=="], + "@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw=="], "@ai-sdk/google": ["@ai-sdk/google@2.0.52", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-2XUnGi3f7TV4ujoAhA+Fg3idUoG/+Y2xjCRg70a1/m0DH1KSQqYaCboJ1C19y6ZHGdf5KNT20eJdswP6TvrY2g=="], - "@ai-sdk/google-vertex": ["@ai-sdk/google-vertex@3.0.97", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.57", "@ai-sdk/google": "2.0.52", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "google-auth-library": "^10.5.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-s4tI7Z15i6FlbtCvS4SBRal8wRfkOXJzKxlS6cU4mJW/QfUfoVy4b22836NVNJwDvkG/HkDSfzwm/X8mn46MhA=="], + "@ai-sdk/google-vertex": ["@ai-sdk/google-vertex@3.0.98", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/google": "2.0.52", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "google-auth-library": "^10.5.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-uuv0RHkdJ5vTzeH1+iuBlv7GAjRcOPd2jiqtGLz6IKOUDH+PRQoE3ExrvOysVnKuhhTBMqvawkktDhMDQE6sVQ=="], "@ai-sdk/groq": ["@ai-sdk/groq@2.0.34", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-wfCYkVgmVjxNA32T57KbLabVnv9aFUflJ4urJ7eWgTwbnmGQHElCTu+rJ3ydxkXSqxOkXPwMOttDm7XNrvPjmg=="], @@ -591,11 +591,11 @@ "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.20", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ=="], - "@ai-sdk/togetherai": ["@ai-sdk/togetherai@1.0.31", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-RlYubjStoZQxna4Ng91Vvo8YskvL7lW9zj68IwZfCnaDBSAp1u6Nhc5BR4ZtKnY6PA3XEtu4bATIQl7yiiQ+Lw=="], + "@ai-sdk/togetherai": ["@ai-sdk/togetherai@1.0.34", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-jjJmJms6kdEc4nC3MDGFJfhV8F1ifY4nolV2dbnT7BM4ab+Wkskc0GwCsJ7G7WdRMk7xDbFh4he3DPL8KJ/cyA=="], - "@ai-sdk/vercel": ["@ai-sdk/vercel@1.0.31", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ggvwAMt/KsbqcdR6ILQrjwrRONLV/8aG6rOLbjcOGvV0Ai+WdZRRKQj5nOeQ06PvwVQtKdkp7S4IinpXIhCiHg=="], + "@ai-sdk/vercel": ["@ai-sdk/vercel@1.0.33", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Qwjm+HdwKasu7L9bDUryBMGKDMscIEzMUkjw/33uGdJpktzyNW13YaNIObOZ2HkskqDMIQJSd4Ao2BBT8fEYLw=="], - "@ai-sdk/xai": ["@ai-sdk/xai@2.0.51", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-AI3le03qiegkZvn9hpnpDwez49lOvQLj4QUBT8H41SMbrdTYOxn3ktTwrsSu90cNDdzKGMvoH0u2GHju1EdnCg=="], + "@ai-sdk/xai": ["@ai-sdk/xai@2.0.56", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-FGlqwWc3tAYqDHE8r8hQGQLcMiPUwgz90oU2QygUH930OWtCLapFkSu114DgVaIN/qoM1DUX+inv0Ee74Fgp5g=="], "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], @@ -1221,7 +1221,7 @@ "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"], - "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.5.2", "", { "dependencies": { "@openrouter/sdk": "^0.1.27" }, "peerDependencies": { "@toon-format/toon": "^2.0.0", "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" }, "optionalPeers": ["@toon-format/toon"] }, "sha512-3Th0vmJ9pjnwcPc2H1f59Mb0LFvwaREZAScfOQIpUxAHjZ7ZawVKDP27qgsteZPmMYqccNMy4r4Y3kgUnNcKAg=="], + "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.5.4", "", { "dependencies": { "@openrouter/sdk": "^0.1.27" }, "peerDependencies": { "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" } }, "sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw=="], "@openrouter/sdk": ["@openrouter/sdk@0.1.27", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ=="], @@ -1909,7 +1909,7 @@ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], + "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], @@ -1947,7 +1947,7 @@ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - "ai": ["ai@5.0.119", "", { "dependencies": { "@ai-sdk/gateway": "2.0.25", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-HUOwhc17fl2SZTJGZyA/99aNu706qKfXaUBCy9vgZiXBwrxg2eTzn2BCz7kmYDsfx6Fg2ACBy2icm41bsDXCTw=="], + "ai": ["ai@5.0.124", "", { "dependencies": { "@ai-sdk/gateway": "2.0.30", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-Li6Jw9F9qsvFJXZPBfxj38ddP2iURCnMs96f9Q3OeQzrDVcl1hvtwSEAuxA/qmfh6SDV2ERqFUOFzigvr0697g=="], "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -3975,7 +3975,9 @@ "@actions/http-client/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.57", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-DREpYqW2pylgaj69gZ+K8u92bo9DaMgFdictYnY+IwYeY3bawQ4zI7l/o1VkDsBDljAx8iYz5lPURwVZNu+Xpg=="], + "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], + + "@ai-sdk/amazon-bedrock/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.8", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.12.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw=="], "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], @@ -3983,11 +3985,11 @@ "@ai-sdk/azure/@ai-sdk/openai": ["@ai-sdk/openai@2.0.89", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw=="], - "@ai-sdk/cerebras/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], + "@ai-sdk/cerebras/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "@ai-sdk/deepinfra/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], + "@ai-sdk/deepinfra/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "@ai-sdk/google-vertex/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.57", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-DREpYqW2pylgaj69gZ+K8u92bo9DaMgFdictYnY+IwYeY3bawQ4zI7l/o1VkDsBDljAx8iYz5lPURwVZNu+Xpg=="], + "@ai-sdk/google-vertex/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], "@ai-sdk/openai/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], @@ -3997,11 +3999,11 @@ "@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.0", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.3", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-BoQZtGcBxkeSH1zK+SRYNDtJPIPpacTeiMZqnG4Rv6xXjEwM0FH4MGs9c+PlhyEWmQCzjRM2HAotEydFhD4dYw=="], - "@ai-sdk/togetherai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], + "@ai-sdk/togetherai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "@ai-sdk/vercel/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], + "@ai-sdk/vercel/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], + "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], "@astrojs/cloudflare/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], @@ -4381,11 +4383,11 @@ "nypm/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], - "opencode/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.57", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-DREpYqW2pylgaj69gZ+K8u92bo9DaMgFdictYnY+IwYeY3bawQ4zI7l/o1VkDsBDljAx8iYz5lPURwVZNu+Xpg=="], + "opencode/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], "opencode/@ai-sdk/openai": ["@ai-sdk/openai@2.0.89", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw=="], - "opencode/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], + "opencode/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], "opencontrol/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], diff --git a/nix/hashes.json b/nix/hashes.json index f50c7a23df..23ef03d88b 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-gUWzUsk81miIrjg0fZQmsIQG4pZYmEHgzN6BaXI+lfc=", - "aarch64-linux": "sha256-gwEG75ha/ojTO2iAObTmLTtEkXIXJ7BThzfI5CqlJh8=", - "aarch64-darwin": "sha256-20RGG2GkUItCzD67gDdoSLfexttM8abS//FKO9bfjoM=", - "x86_64-darwin": "sha256-i2VawFuR1UbjPVYoybU6aJDJfFo0tcvtl1aM31Y2mTQ=" + "x86_64-linux": "sha256-3wRTDLo5FZoUc2Bwm1aAJZ4dNsekX8XoY6TwTmohgYo=", + "aarch64-linux": "sha256-CKiuc6c52UV9cLEtccYEYS4QN0jYzNJv1fHSayqbHKo=", + "aarch64-darwin": "sha256-pWfXomWTDvG8WpWmUCwNXdbSHw6hPlqoT0Q/XuNceMc=", + "x86_64-darwin": "sha256-Dmg4+cUq2r6vZB2ta9tLpNAWqcl11ZCu4ZpieegRFrY=" } } diff --git a/package.json b/package.json index 4267ef6456..e1471d356a 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@tailwindcss/vite": "4.1.11", "diff": "8.0.2", "dompurify": "3.3.1", - "ai": "5.0.119", + "ai": "5.0.124", "hono": "4.10.7", "hono-openapi": "1.1.2", "fuzzysort": "3.1.0", diff --git a/packages/app/e2e/actions.ts b/packages/app/e2e/actions.ts index 3da16d3171..7308adc7e6 100644 --- a/packages/app/e2e/actions.ts +++ b/packages/app/e2e/actions.ts @@ -4,6 +4,17 @@ import os from "node:os" import path from "node:path" import { execSync } from "node:child_process" import { modKey, serverUrl } from "./utils" +import { + sessionItemSelector, + dropdownMenuTriggerSelector, + dropdownMenuContentSelector, + titlebarRightSelector, + popoverBodySelector, + listItemSelector, + listItemKeySelector, + listItemKeyStartsWithSelector, +} from "./selectors" +import type { createSdk } from "./utils" export async function defocus(page: Page) { await page.mouse.click(5, 5) @@ -158,3 +169,103 @@ export function sessionIDFromUrl(url: string) { const match = /\/session\/([^/?#]+)/.exec(url) return match?.[1] } + +export async function hoverSessionItem(page: Page, sessionID: string) { + const sessionEl = page.locator(sessionItemSelector(sessionID)).first() + await expect(sessionEl).toBeVisible() + await sessionEl.hover() + return sessionEl +} + +export async function openSessionMoreMenu(page: Page, sessionID: string) { + const sessionEl = await hoverSessionItem(page, sessionID) + + const menuTrigger = sessionEl.locator(dropdownMenuTriggerSelector).first() + await expect(menuTrigger).toBeVisible() + await menuTrigger.click() + + const menu = page.locator(dropdownMenuContentSelector).first() + await expect(menu).toBeVisible() + return menu +} + +export async function clickMenuItem(menu: Locator, itemName: string | RegExp, options?: { force?: boolean }) { + const item = menu.getByRole("menuitem").filter({ hasText: itemName }).first() + await expect(item).toBeVisible() + await item.click({ force: options?.force }) +} + +export async function confirmDialog(page: Page, buttonName: string | RegExp) { + const dialog = page.getByRole("dialog").first() + await expect(dialog).toBeVisible() + + const button = dialog.getByRole("button").filter({ hasText: buttonName }).first() + await expect(button).toBeVisible() + await button.click() +} + +export async function openSharePopover(page: Page) { + const rightSection = page.locator(titlebarRightSelector) + const shareButton = rightSection.getByRole("button", { name: "Share" }).first() + await expect(shareButton).toBeVisible() + + const popoverBody = page + .locator(popoverBodySelector) + .filter({ has: page.getByRole("button", { name: /^(Publish|Unpublish)$/ }) }) + .first() + + const opened = await popoverBody + .isVisible() + .then((x) => x) + .catch(() => false) + + if (!opened) { + await shareButton.click() + await expect(popoverBody).toBeVisible() + } + return { rightSection, popoverBody } +} + +export async function clickPopoverButton(page: Page, buttonName: string | RegExp) { + const button = page.getByRole("button").filter({ hasText: buttonName }).first() + await expect(button).toBeVisible() + await button.click() +} + +export async function clickListItem( + container: Locator | Page, + filter: string | RegExp | { key?: string; text?: string | RegExp; keyStartsWith?: string }, +): Promise { + let item: Locator + + if (typeof filter === "string" || filter instanceof RegExp) { + item = container.locator(listItemSelector).filter({ hasText: filter }).first() + } else if (filter.keyStartsWith) { + item = container.locator(listItemKeyStartsWithSelector(filter.keyStartsWith)).first() + } else if (filter.key) { + item = container.locator(listItemKeySelector(filter.key)).first() + } else if (filter.text) { + item = container.locator(listItemSelector).filter({ hasText: filter.text }).first() + } else { + throw new Error("Invalid filter provided to clickListItem") + } + + await expect(item).toBeVisible() + await item.click() + return item +} + +export async function withSession( + sdk: ReturnType, + title: string, + callback: (session: { id: string; title: string }) => Promise, +): Promise { + const session = await sdk.session.create({ title }).then((r) => r.data) + if (!session?.id) throw new Error("Session create did not return an id") + + try { + return await callback(session) + } finally { + await sdk.session.delete({ sessionID: session.id }).catch(() => undefined) + } +} diff --git a/packages/app/e2e/app/server-default.spec.ts b/packages/app/e2e/app/server-default.spec.ts index 6f44ded1a2..adbc83473b 100644 --- a/packages/app/e2e/app/server-default.spec.ts +++ b/packages/app/e2e/app/server-default.spec.ts @@ -1,5 +1,6 @@ import { test, expect } from "../fixtures" import { serverName, serverUrl } from "../utils" +import { clickListItem, closeDialog, clickMenuItem } from "../actions" const DEFAULT_SERVER_URL_KEY = "opencode.settings.dat:defaultServerUrl" @@ -33,31 +34,18 @@ test("can set a default server on web", async ({ page, gotoSession }) => { const row = dialog.locator('[data-slot="list-item"]').filter({ hasText: serverName }).first() await expect(row).toBeVisible() - const menu = row.locator('[data-component="icon-button"]').last() - await menu.click() - await page.getByRole("menuitem", { name: "Set as default" }).click() + const menuTrigger = row.locator('[data-slot="dropdown-menu-trigger"]').first() + await expect(menuTrigger).toBeVisible() + await menuTrigger.click({ force: true }) + + const menu = page.locator('[data-component="dropdown-menu-content"]').first() + await expect(menu).toBeVisible() + await clickMenuItem(menu, /set as default/i) await expect.poll(() => page.evaluate((key) => localStorage.getItem(key), DEFAULT_SERVER_URL_KEY)).toBe(serverUrl) await expect(row.getByText("Default", { exact: true })).toBeVisible() - await page.keyboard.press("Escape") - const closed = await dialog - .waitFor({ state: "detached", timeout: 1500 }) - .then(() => true) - .catch(() => false) - - if (!closed) { - await page.keyboard.press("Escape") - const closedSecond = await dialog - .waitFor({ state: "detached", timeout: 1500 }) - .then(() => true) - .catch(() => false) - - if (!closedSecond) { - await page.locator('[data-component="dialog-overlay"]').click({ position: { x: 5, y: 5 } }) - await expect(dialog).toHaveCount(0) - } - } + await closeDialog(page, dialog) await ensurePopoverOpen() diff --git a/packages/app/e2e/app/session.spec.ts b/packages/app/e2e/app/session.spec.ts index d35af7ef77..c7fdfdc542 100644 --- a/packages/app/e2e/app/session.spec.ts +++ b/packages/app/e2e/app/session.spec.ts @@ -1,21 +1,16 @@ import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" +import { withSession } from "../actions" test("can open an existing session and type into the prompt", async ({ page, sdk, gotoSession }) => { const title = `e2e smoke ${Date.now()}` - const created = await sdk.session.create({ title }).then((r) => r.data) - if (!created?.id) throw new Error("Session create did not return an id") - const sessionID = created.id - - try { - await gotoSession(sessionID) + await withSession(sdk, title, async (session) => { + await gotoSession(session.id) const prompt = page.locator(promptSelector) await prompt.click() await page.keyboard.type("hello from e2e") await expect(prompt).toContainText("hello from e2e") - } finally { - await sdk.session.delete({ sessionID }).catch(() => undefined) - } + }) }) diff --git a/packages/app/e2e/app/titlebar-history.spec.ts b/packages/app/e2e/app/titlebar-history.spec.ts index c7ff6566c1..ec65dca0b3 100644 --- a/packages/app/e2e/app/titlebar-history.spec.ts +++ b/packages/app/e2e/app/titlebar-history.spec.ts @@ -1,48 +1,42 @@ import { test, expect } from "../fixtures" -import { openSidebar } from "../actions" +import { openSidebar, withSession } from "../actions" import { promptSelector } from "../selectors" test("titlebar back/forward navigates between sessions", async ({ page, slug, sdk, gotoSession }) => { await page.setViewportSize({ width: 1400, height: 800 }) const stamp = Date.now() - const one = await sdk.session.create({ title: `e2e titlebar history 1 ${stamp}` }).then((r) => r.data) - const two = await sdk.session.create({ title: `e2e titlebar history 2 ${stamp}` }).then((r) => r.data) - if (!one?.id) throw new Error("Session create did not return an id") - if (!two?.id) throw new Error("Session create did not return an id") + await withSession(sdk, `e2e titlebar history 1 ${stamp}`, async (one) => { + await withSession(sdk, `e2e titlebar history 2 ${stamp}`, async (two) => { + await gotoSession(one.id) - try { - await gotoSession(one.id) + await openSidebar(page) - await openSidebar(page) + const link = page.locator(`[data-session-id="${two.id}"] a`).first() + await expect(link).toBeVisible() + await link.scrollIntoViewIfNeeded() + await link.click() - const link = page.locator(`[data-session-id="${two.id}"] a`).first() - await expect(link).toBeVisible() - await link.scrollIntoViewIfNeeded() - await link.click() + await expect(page).toHaveURL(new RegExp(`/${slug}/session/${two.id}(?:\\?|#|$)`)) + await expect(page.locator(promptSelector)).toBeVisible() - await expect(page).toHaveURL(new RegExp(`/${slug}/session/${two.id}(?:\\?|#|$)`)) - await expect(page.locator(promptSelector)).toBeVisible() + const back = page.getByRole("button", { name: "Back" }) + const forward = page.getByRole("button", { name: "Forward" }) - const back = page.getByRole("button", { name: "Back" }) - const forward = page.getByRole("button", { name: "Forward" }) + await expect(back).toBeVisible() + await expect(back).toBeEnabled() + await back.click() - await expect(back).toBeVisible() - await expect(back).toBeEnabled() - await back.click() + await expect(page).toHaveURL(new RegExp(`/${slug}/session/${one.id}(?:\\?|#|$)`)) + await expect(page.locator(promptSelector)).toBeVisible() - await expect(page).toHaveURL(new RegExp(`/${slug}/session/${one.id}(?:\\?|#|$)`)) - await expect(page.locator(promptSelector)).toBeVisible() + await expect(forward).toBeVisible() + await expect(forward).toBeEnabled() + await forward.click() - await expect(forward).toBeVisible() - await expect(forward).toBeEnabled() - await forward.click() - - await expect(page).toHaveURL(new RegExp(`/${slug}/session/${two.id}(?:\\?|#|$)`)) - await expect(page.locator(promptSelector)).toBeVisible() - } finally { - await sdk.session.delete({ sessionID: one.id }).catch(() => undefined) - await sdk.session.delete({ sessionID: two.id }).catch(() => undefined) - } + await expect(page).toHaveURL(new RegExp(`/${slug}/session/${two.id}(?:\\?|#|$)`)) + await expect(page.locator(promptSelector)).toBeVisible() + }) + }) }) diff --git a/packages/app/e2e/files/file-open.spec.ts b/packages/app/e2e/files/file-open.spec.ts index dea35d25ba..3c636d748a 100644 --- a/packages/app/e2e/files/file-open.spec.ts +++ b/packages/app/e2e/files/file-open.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from "../fixtures" -import { openPalette } from "../actions" +import { openPalette, clickListItem } from "../actions" test("can open a file tab from the search palette", async ({ page, gotoSession }) => { await gotoSession() @@ -9,9 +9,7 @@ test("can open a file tab from the search palette", async ({ page, gotoSession } const input = dialog.getByRole("textbox").first() await input.fill("package.json") - const fileItem = dialog.locator('[data-slot="list-item"][data-key^="file:"]').first() - await expect(fileItem).toBeVisible() - await fileItem.click() + await clickListItem(dialog, { keyStartsWith: "file:" }) await expect(dialog).toHaveCount(0) diff --git a/packages/app/e2e/files/file-viewer.spec.ts b/packages/app/e2e/files/file-viewer.spec.ts index 3dc0dead2d..5283844975 100644 --- a/packages/app/e2e/files/file-viewer.spec.ts +++ b/packages/app/e2e/files/file-viewer.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from "../fixtures" -import { openPalette } from "../actions" +import { openPalette, clickListItem } from "../actions" test("smoke file viewer renders real file content", async ({ page, gotoSession }) => { await gotoSession() @@ -12,13 +12,7 @@ test("smoke file viewer renders real file content", async ({ page, gotoSession } const input = dialog.getByRole("textbox").first() await input.fill(file) - const fileItem = dialog - .locator( - '[data-slot="list-item"][data-key^="file:"][data-key*="packages"][data-key*="app"][data-key$="package.json"]', - ) - .first() - await expect(fileItem).toBeVisible() - await fileItem.click() + await clickListItem(dialog, { text: /packages.*app.*package.json/ }) await expect(dialog).toHaveCount(0) diff --git a/packages/app/e2e/models/model-picker.spec.ts b/packages/app/e2e/models/model-picker.spec.ts index df95e04d22..01e72464cc 100644 --- a/packages/app/e2e/models/model-picker.spec.ts +++ b/packages/app/e2e/models/model-picker.spec.ts @@ -1,5 +1,6 @@ import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" +import { clickListItem } from "../actions" test("smoke model selection updates prompt footer", async ({ page, gotoSession }) => { await gotoSession() @@ -32,9 +33,7 @@ test("smoke model selection updates prompt footer", async ({ page, gotoSession } await input.fill(model) - const item = dialog.locator(`[data-slot="list-item"][data-key="${key}"]`) - await expect(item).toBeVisible() - await item.click() + await clickListItem(dialog, { key }) await expect(dialog).toHaveCount(0) diff --git a/packages/app/e2e/models/models-visibility.spec.ts b/packages/app/e2e/models/models-visibility.spec.ts index 36f14596dd..c699111793 100644 --- a/packages/app/e2e/models/models-visibility.spec.ts +++ b/packages/app/e2e/models/models-visibility.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" -import { closeDialog, openSettings } from "../actions" +import { closeDialog, openSettings, clickListItem } from "../actions" test("hiding a model removes it from the model picker", async ({ page, gotoSession }) => { await gotoSession() diff --git a/packages/app/e2e/projects/project-edit.spec.ts b/packages/app/e2e/projects/project-edit.spec.ts index 22d053f3d9..772c259517 100644 --- a/packages/app/e2e/projects/project-edit.spec.ts +++ b/packages/app/e2e/projects/project-edit.spec.ts @@ -14,7 +14,12 @@ test("dialog edit project updates name and startup script", async ({ page, gotoS await expect(trigger).toBeVisible() await trigger.click({ force: true }) - await page.getByRole("menuitem", { name: "Edit" }).click() + const menu = page.locator('[data-component="dropdown-menu-content"]').first() + await expect(menu).toBeVisible() + + const editItem = menu.getByRole("menuitem", { name: "Edit" }).first() + await expect(editItem).toBeVisible() + await editItem.click({ force: true }) const dialog = page.getByRole("dialog") await expect(dialog).toBeVisible() diff --git a/packages/app/e2e/projects/projects-close.spec.ts b/packages/app/e2e/projects/projects-close.spec.ts index c3618740dd..bd323b90c6 100644 --- a/packages/app/e2e/projects/projects-close.spec.ts +++ b/packages/app/e2e/projects/projects-close.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from "../fixtures" -import { createTestProject, seedProjects, cleanupTestProject, openSidebar } from "../actions" +import { createTestProject, seedProjects, cleanupTestProject, openSidebar, clickMenuItem } from "../actions" import { projectCloseHoverSelector, projectCloseMenuSelector, projectSwitchSelector } from "../selectors" import { dirSlug } from "../utils" @@ -33,7 +33,7 @@ test("can close a project via project header more options menu", async ({ page, await page.setViewportSize({ width: 1400, height: 800 }) const other = await createTestProject() - const otherName = other.split("/").pop() + const otherName = other.split("/").pop() ?? other const otherSlug = dirSlug(other) await seedProjects(page, { directory, extra: [other] }) @@ -59,17 +59,10 @@ test("can close a project via project header more options menu", async ({ page, await trigger.focus() await page.keyboard.press("Enter") - const close = page - .locator(projectCloseMenuSelector(otherSlug)) - .or(page.getByRole("menuitem", { name: "Close" })) - .or( - page - .locator('[data-component="dropdown-menu-content"] [data-slot="dropdown-menu-item"]') - .filter({ hasText: "Close" }), - ) - .first() - await expect(close).toBeVisible({ timeout: 10_000 }) - await close.click({ force: true }) + const menu = page.locator('[data-component="dropdown-menu-content"]').first() + await expect(menu).toBeVisible({ timeout: 10_000 }) + + await clickMenuItem(menu, /^Close$/i, { force: true }) await expect(otherButton).toHaveCount(0) } finally { await cleanupTestProject(other) diff --git a/packages/app/e2e/prompt/context.spec.ts b/packages/app/e2e/prompt/context.spec.ts index 9e8f998f27..80aa9ea334 100644 --- a/packages/app/e2e/prompt/context.spec.ts +++ b/packages/app/e2e/prompt/context.spec.ts @@ -1,16 +1,13 @@ import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" +import { withSession } from "../actions" test("context panel can be opened from the prompt", async ({ page, sdk, gotoSession }) => { const title = `e2e smoke context ${Date.now()}` - const created = await sdk.session.create({ title }).then((r) => r.data) - if (!created?.id) throw new Error("Session create did not return an id") - const sessionID = created.id - - try { + await withSession(sdk, title, async (session) => { await sdk.session.promptAsync({ - sessionID, + sessionID: session.id, noReply: true, parts: [ { @@ -22,12 +19,12 @@ test("context panel can be opened from the prompt", async ({ page, sdk, gotoSess await expect .poll(async () => { - const messages = await sdk.session.messages({ sessionID, limit: 1 }).then((r) => r.data ?? []) + const messages = await sdk.session.messages({ sessionID: session.id, limit: 1 }).then((r) => r.data ?? []) return messages.length }) .toBeGreaterThan(0) - await gotoSession(sessionID) + await gotoSession(session.id) const contextButton = page .locator('[data-component="button"]') @@ -39,7 +36,5 @@ test("context panel can be opened from the prompt", async ({ page, sdk, gotoSess const tabs = page.locator('[data-component="tabs"][data-variant="normal"]') await expect(tabs.getByRole("tab", { name: "Context" })).toBeVisible() - } finally { - await sdk.session.delete({ sessionID }).catch(() => undefined) - } + }) }) diff --git a/packages/app/e2e/prompt/prompt.spec.ts b/packages/app/e2e/prompt/prompt.spec.ts index 33f8d7ebc3..07d242c634 100644 --- a/packages/app/e2e/prompt/prompt.spec.ts +++ b/packages/app/e2e/prompt/prompt.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" -import { sessionIDFromUrl } from "../actions" +import { sessionIDFromUrl, withSession } from "../actions" test("can send a prompt and receive a reply", async ({ page, sdk, gotoSession }) => { test.setTimeout(120_000) diff --git a/packages/app/e2e/selectors.ts b/packages/app/e2e/selectors.ts index 9179a6fd57..8beade5730 100644 --- a/packages/app/e2e/selectors.ts +++ b/packages/app/e2e/selectors.ts @@ -15,3 +15,21 @@ export const projectMenuTriggerSelector = (slug: string) => `${sidebarNavSelector} [data-action="project-menu"][data-project="${slug}"]` export const projectCloseMenuSelector = (slug: string) => `[data-action="project-close-menu"][data-project="${slug}"]` + +export const titlebarRightSelector = "#opencode-titlebar-right" + +export const popoverBodySelector = '[data-slot="popover-body"]' + +export const dropdownMenuTriggerSelector = '[data-slot="dropdown-menu-trigger"]' + +export const dropdownMenuContentSelector = '[data-component="dropdown-menu-content"]' + +export const inlineInputSelector = '[data-component="inline-input"]' + +export const sessionItemSelector = (sessionID: string) => `${sidebarNavSelector} [data-session-id="${sessionID}"]` + +export const listItemSelector = '[data-slot="list-item"]' + +export const listItemKeyStartsWithSelector = (prefix: string) => `${listItemSelector}[data-key^="${prefix}"]` + +export const listItemKeySelector = (key: string) => `${listItemSelector}[data-key="${key}"]` diff --git a/packages/app/e2e/session/session.spec.ts b/packages/app/e2e/session/session.spec.ts new file mode 100644 index 0000000000..05984bbeee --- /dev/null +++ b/packages/app/e2e/session/session.spec.ts @@ -0,0 +1,115 @@ +import { test, expect } from "../fixtures" +import { + openSidebar, + openSessionMoreMenu, + clickMenuItem, + confirmDialog, + openSharePopover, + withSession, +} from "../actions" +import { sessionItemSelector, inlineInputSelector } from "../selectors" + +const shareDisabled = process.env.OPENCODE_DISABLE_SHARE === "true" || process.env.OPENCODE_DISABLE_SHARE === "1" + +test("sidebar session can be renamed", async ({ page, sdk, gotoSession }) => { + const stamp = Date.now() + const originalTitle = `e2e rename test ${stamp}` + const newTitle = `e2e renamed ${stamp}` + + await withSession(sdk, originalTitle, async (session) => { + await gotoSession(session.id) + await openSidebar(page) + + const menu = await openSessionMoreMenu(page, session.id) + await clickMenuItem(menu, /rename/i) + + const input = page.locator(sessionItemSelector(session.id)).locator(inlineInputSelector).first() + await expect(input).toBeVisible() + await input.fill(newTitle) + await input.press("Enter") + + await expect(page.locator(sessionItemSelector(session.id)).locator("a").first()).toContainText(newTitle) + }) +}) + +test("sidebar session can be archived", async ({ page, sdk, gotoSession }) => { + const stamp = Date.now() + const title = `e2e archive test ${stamp}` + + await withSession(sdk, title, async (session) => { + await gotoSession(session.id) + await openSidebar(page) + + const sessionEl = page.locator(sessionItemSelector(session.id)) + const menu = await openSessionMoreMenu(page, session.id) + await clickMenuItem(menu, /archive/i) + + await expect(sessionEl).not.toBeVisible() + }) +}) + +test("sidebar session can be deleted", async ({ page, sdk, gotoSession }) => { + const stamp = Date.now() + const title = `e2e delete test ${stamp}` + + await withSession(sdk, title, async (session) => { + await gotoSession(session.id) + await openSidebar(page) + + const sessionEl = page.locator(sessionItemSelector(session.id)) + const menu = await openSessionMoreMenu(page, session.id) + await clickMenuItem(menu, /delete/i) + await confirmDialog(page, /delete/i) + + await expect(sessionEl).not.toBeVisible() + }) +}) + +test("session can be shared and unshared via header button", async ({ page, sdk, gotoSession }) => { + test.skip(shareDisabled, "Share is disabled in this environment (OPENCODE_DISABLE_SHARE).") + + const stamp = Date.now() + const title = `e2e share test ${stamp}` + + await withSession(sdk, title, async (session) => { + await gotoSession(session.id) + + const { rightSection, popoverBody } = await openSharePopover(page) + await popoverBody.getByRole("button", { name: "Publish" }).first().click() + + await expect + .poll( + async () => { + const data = await sdk.session.get({ sessionID: session.id }).then((r) => r.data) + return data?.share?.url || undefined + }, + { timeout: 30_000 }, + ) + .not.toBeUndefined() + + const copyButton = rightSection.locator('button[aria-label="Copy link"]').first() + await expect(copyButton).toBeVisible({ timeout: 30_000 }) + + const sharedPopover = await openSharePopover(page) + const unpublish = sharedPopover.popoverBody.getByRole("button", { name: "Unpublish" }).first() + await expect(unpublish).toBeVisible({ timeout: 30_000 }) + await unpublish.click() + + await expect + .poll( + async () => { + const data = await sdk.session.get({ sessionID: session.id }).then((r) => r.data) + return data?.share?.url || undefined + }, + { timeout: 30_000 }, + ) + .toBeUndefined() + + await expect(copyButton).not.toBeVisible({ timeout: 30_000 }) + + const unsharedPopover = await openSharePopover(page) + await expect(unsharedPopover.popoverBody.getByRole("button", { name: "Publish" }).first()).toBeVisible({ + timeout: 30_000, + }) + }) +}) diff --git a/packages/app/e2e/settings/settings-providers.spec.ts b/packages/app/e2e/settings/settings-providers.spec.ts index 4b3b178cc5..2bd2616bc9 100644 --- a/packages/app/e2e/settings/settings-providers.spec.ts +++ b/packages/app/e2e/settings/settings-providers.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from "../fixtures" import { promptSelector } from "../selectors" -import { closeDialog, openSettings } from "../actions" +import { closeDialog, openSettings, clickListItem } from "../actions" test("smoke providers settings opens provider selector", async ({ page, gotoSession }) => { await gotoSession() diff --git a/packages/app/e2e/sidebar/sidebar-session-links.spec.ts b/packages/app/e2e/sidebar/sidebar-session-links.spec.ts index 1c0f4fa71d..cda2278a95 100644 --- a/packages/app/e2e/sidebar/sidebar-session-links.spec.ts +++ b/packages/app/e2e/sidebar/sidebar-session-links.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from "../fixtures" -import { openSidebar } from "../actions" +import { openSidebar, withSession } from "../actions" import { promptSelector } from "../selectors" test("sidebar session links navigate to the selected session", async ({ page, slug, sdk, gotoSession }) => { diff --git a/packages/app/script/e2e-local.ts b/packages/app/script/e2e-local.ts index 2c7be2ad95..df2107f76d 100644 --- a/packages/app/script/e2e-local.ts +++ b/packages/app/script/e2e-local.ts @@ -58,7 +58,7 @@ const sandbox = await fs.mkdtemp(path.join(os.tmpdir(), "opencode-e2e-")) const serverEnv = { ...process.env, - OPENCODE_DISABLE_SHARE: "true", + OPENCODE_DISABLE_SHARE: process.env.OPENCODE_DISABLE_SHARE ?? "true", OPENCODE_DISABLE_LSP_DOWNLOAD: "true", OPENCODE_DISABLE_DEFAULT_PLUGINS: "true", OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: "true", diff --git a/packages/app/src/components/dialog-select-model.tsx b/packages/app/src/components/dialog-select-model.tsx index 4d96c6c5f6..4f0dcc3ee6 100644 --- a/packages/app/src/components/dialog-select-model.tsx +++ b/packages/app/src/components/dialog-select-model.tsx @@ -90,7 +90,7 @@ const ModelList: Component<{ export function ModelSelectorPopover(props: { provider?: string - children?: JSX.Element | ((open: boolean) => JSX.Element) + children?: JSX.Element triggerAs?: T triggerProps?: ComponentProps }) { @@ -182,13 +182,12 @@ export function ModelSelectorPopover(props: { as={props.triggerAs ?? "div"} {...(props.triggerProps as any)} > - {typeof props.children === "function" ? props.children(store.open) : props.children} + {props.children} setStore("content", el)} + class="w-72 h-80 flex flex-col p-2 rounded-md border border-border-base bg-surface-raised-stronger-non-alpha shadow-md z-50 outline-none overflow-hidden" onEscapeKeyDown={(event) => { setStore("dismiss", "escape") setStore("open", false) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 6e614eb1d7..5c1d417eb0 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -32,9 +32,7 @@ import { useNavigate, useParams } from "@solidjs/router" import { useSync } from "@/context/sync" import { useComments } from "@/context/comments" import { FileIcon } from "@opencode-ai/ui/file-icon" -import { MorphChevron } from "@opencode-ai/ui/morph-chevron" import { Button } from "@opencode-ai/ui/button" -import { CycleLabel } from "@opencode-ai/ui/cycle-label" import { Icon } from "@opencode-ai/ui/icon" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import type { IconName } from "@opencode-ai/ui/icons/provider" @@ -44,7 +42,6 @@ import { Select } from "@opencode-ai/ui/select" import { getDirectory, getFilename, getFilenameTruncated } from "@opencode-ai/util/path" import { useDialog } from "@opencode-ai/ui/context/dialog" import { ImagePreview } from "@opencode-ai/ui/image-preview" -import { ReasoningIcon } from "@opencode-ai/ui/reasoning-icon" import { ModelSelectorPopover } from "@/components/dialog-select-model" import { DialogSelectModelUnpaid } from "@/components/dialog-select-model-unpaid" import { useProviders } from "@/hooks/use-providers" @@ -1255,7 +1252,7 @@ export const PromptInput: Component = (props) => { clearInput() client.session .shell({ - sessionID: session?.id || "", + sessionID: session.id, agent, model, command: text, @@ -1278,7 +1275,7 @@ export const PromptInput: Component = (props) => { clearInput() client.session .command({ - sessionID: session?.id || "", + sessionID: session.id, command: commandName, arguments: args.join(" "), agent, @@ -1434,13 +1431,13 @@ export const PromptInput: Component = (props) => { const optimisticParts = requestParts.map((part) => ({ ...part, - sessionID: session?.id || "", + sessionID: session.id, messageID, })) as unknown as Part[] const optimisticMessage: Message = { id: messageID, - sessionID: session?.id || "", + sessionID: session.id, role: "user", time: { created: Date.now() }, agent, @@ -1451,9 +1448,9 @@ export const PromptInput: Component = (props) => { if (sessionDirectory === projectDirectory) { sync.set( produce((draft) => { - const messages = draft.message[session?.id || ""] + const messages = draft.message[session.id] if (!messages) { - draft.message[session?.id || ""] = [optimisticMessage] + draft.message[session.id] = [optimisticMessage] } else { const result = Binary.search(messages, messageID, (m) => m.id) messages.splice(result.index, 0, optimisticMessage) @@ -1469,9 +1466,9 @@ export const PromptInput: Component = (props) => { globalSync.child(sessionDirectory)[1]( produce((draft) => { - const messages = draft.message[session?.id || ""] + const messages = draft.message[session.id] if (!messages) { - draft.message[session?.id || ""] = [optimisticMessage] + draft.message[session.id] = [optimisticMessage] } else { const result = Binary.search(messages, messageID, (m) => m.id) messages.splice(result.index, 0, optimisticMessage) @@ -1488,7 +1485,7 @@ export const PromptInput: Component = (props) => { if (sessionDirectory === projectDirectory) { sync.set( produce((draft) => { - const messages = draft.message[session?.id || ""] + const messages = draft.message[session.id] if (messages) { const result = Binary.search(messages, messageID, (m) => m.id) if (result.found) messages.splice(result.index, 1) @@ -1501,7 +1498,7 @@ export const PromptInput: Component = (props) => { globalSync.child(sessionDirectory)[1]( produce((draft) => { - const messages = draft.message[session?.id || ""] + const messages = draft.message[session.id] if (messages) { const result = Binary.search(messages, messageID, (m) => m.id) if (result.found) messages.splice(result.index, 1) @@ -1522,15 +1519,15 @@ export const PromptInput: Component = (props) => { const worktree = WorktreeState.get(sessionDirectory) if (!worktree || worktree.status !== "pending") return true - if (sessionDirectory === projectDirectory && session?.id) { - sync.set("session_status", session?.id, { type: "busy" }) + if (sessionDirectory === projectDirectory) { + sync.set("session_status", session.id, { type: "busy" }) } const controller = new AbortController() const cleanup = () => { - if (sessionDirectory === projectDirectory && session?.id) { - sync.set("session_status", session?.id, { type: "idle" }) + if (sessionDirectory === projectDirectory) { + sync.set("session_status", session.id, { type: "idle" }) } removeOptimisticMessage() for (const item of commentItems) { @@ -1547,7 +1544,7 @@ export const PromptInput: Component = (props) => { restoreInput() } - pending.set(session?.id || "", { abort: controller, cleanup }) + pending.set(session.id, { abort: controller, cleanup }) const abort = new Promise>>((resolve) => { if (controller.signal.aborted) { @@ -1575,7 +1572,7 @@ export const PromptInput: Component = (props) => { if (timer.id === undefined) return clearTimeout(timer.id) }) - pending.delete(session?.id || "") + pending.delete(session.id) if (controller.signal.aborted) return false if (result.status === "failed") throw new Error(result.message) return true @@ -1585,7 +1582,7 @@ export const PromptInput: Component = (props) => { const ok = await waitForWorktree() if (!ok) return await client.session.prompt({ - sessionID: session?.id || "", + sessionID: session.id, agent, model, messageID, @@ -1595,9 +1592,9 @@ export const PromptInput: Component = (props) => { } void send().catch((err) => { - pending.delete(session?.id || "") - if (sessionDirectory === projectDirectory && session?.id) { - sync.set("session_status", session?.id, { type: "idle" }) + pending.delete(session.id) + if (sessionDirectory === projectDirectory) { + sync.set("session_status", session.id, { type: "idle" }) } showToast({ title: language.t("prompt.toast.promptSendFailed.title"), @@ -1619,28 +1616,6 @@ export const PromptInput: Component = (props) => { }) } - const currrentModelVariant = createMemo(() => { - const modelVariant = local.model.variant.current() ?? "" - return modelVariant === "xhigh" - ? "xHigh" - : modelVariant.length > 0 - ? modelVariant[0].toUpperCase() + modelVariant.slice(1) - : "Default" - }) - - const reasoningPercentage = createMemo(() => { - const variants = local.model.variant.list() - const current = local.model.variant.current() - const totalEntries = variants.length + 1 - - if (totalEntries <= 2 || current === "Default") { - return 0 - } - - const currentIndex = current ? variants.indexOf(current) + 1 : 0 - return ((currentIndex + 1) / totalEntries) * 100 - }, [local.model.variant]) - return (
@@ -1693,7 +1668,7 @@ export const PromptInput: Component = (props) => { } > - + @{(item as { type: "agent"; name: string }).name} @@ -1754,9 +1729,9 @@ export const PromptInput: Component = (props) => { }} > -
+
- + {language.t("prompt.dropzone.label")}
@@ -1795,7 +1770,7 @@ export const PromptInput: Component = (props) => { }} >
- +
{getFilenameTruncated(item.path, 14)} @@ -1812,7 +1787,7 @@ export const PromptInput: Component = (props) => { type="button" icon="close-small" variant="ghost" - class="ml-auto size-7 opacity-0 group-hover:opacity-100 transition-all" + class="ml-auto h-5 w-5 opacity-0 group-hover:opacity-100 transition-all" onClick={(e) => { e.stopPropagation() if (item.commentID) comments.remove(item.path, item.commentID) @@ -1842,7 +1817,7 @@ export const PromptInput: Component = (props) => { when={attachment.mime.startsWith("image/")} fallback={
- +
} > @@ -1916,7 +1891,7 @@ export const PromptInput: Component = (props) => {
-
+
@@ -1947,17 +1922,12 @@ export const PromptInput: Component = (props) => { title={language.t("command.model.choose")} keybind={command.keybind("model.choose")} > - } @@ -1968,15 +1938,11 @@ export const PromptInput: Component = (props) => { keybind={command.keybind("model.choose")} > - {(open) => ( - <> - - - - {local.model.current()?.name ?? language.t("dialog.model.select.title")} - - - )} + + + + {local.model.current()?.name ?? language.t("dialog.model.select.title")} + @@ -1989,13 +1955,10 @@ export const PromptInput: Component = (props) => { @@ -2009,7 +1972,7 @@ export const PromptInput: Component = (props) => { variant="ghost" onClick={() => permission.toggleAutoAccept(params.id!, sdk.directory)} classList={{ - "_hidden group-hover/prompt-input:flex items-center justify-center": true, + "_hidden group-hover/prompt-input:flex size-6 items-center justify-center": true, "text-text-base": !permission.isAutoAccepting(params.id!, sdk.directory), "hover:bg-surface-success-base": permission.isAutoAccepting(params.id!, sdk.directory), }} @@ -2031,7 +1994,7 @@ export const PromptInput: Component = (props) => {
-
+
= (props) => { e.currentTarget.value = "" }} /> -
+
@@ -2074,7 +2036,7 @@ export const PromptInput: Component = (props) => {
{language.t("prompt.action.send")} - +
@@ -2085,7 +2047,7 @@ export const PromptInput: Component = (props) => { disabled={!prompt.dirty() && !working()} icon={working() ? "stop" : "arrow-up"} variant="primary" - class="h-6 w-5.5" + class="h-6 w-4.5" aria-label={working() ? language.t("prompt.action.stop") : language.t("prompt.action.send")} /> diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx index 92b060212d..1e37d8f6a2 100644 --- a/packages/app/src/components/session-context-usage.tsx +++ b/packages/app/src/components/session-context-usage.tsx @@ -64,8 +64,8 @@ export function SessionContextUsage(props: SessionContextUsageProps) { } const circle = () => ( -
- +
+
) @@ -101,7 +101,7 @@ export function SessionContextUsage(props: SessionContextUsageProps) {
) } diff --git a/packages/app/src/components/settings-keybinds.tsx b/packages/app/src/components/settings-keybinds.tsx index efd18c8bd6..393da0c2ab 100644 --- a/packages/app/src/components/settings-keybinds.tsx +++ b/packages/app/src/components/settings-keybinds.tsx @@ -9,7 +9,6 @@ import fuzzysort from "fuzzysort" import { formatKeybind, parseKeybind, useCommand } from "@/context/command" import { useLanguage } from "@/context/language" import { useSettings } from "@/context/settings" -import { ScrollFade } from "@opencode-ai/ui/scroll-fade" const IS_MAC = typeof navigator === "object" && /(Mac|iPod|iPhone|iPad)/.test(navigator.platform) const PALETTE_ID = "command.palette" @@ -353,12 +352,7 @@ export const SettingsKeybinds: Component = () => { }) return ( - +
@@ -435,6 +429,6 @@ export const SettingsKeybinds: Component = () => {
- +
) } diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs index d16416c9f2..29ac86f29a 100644 --- a/packages/desktop/src-tauri/src/lib.rs +++ b/packages/desktop/src-tauri/src/lib.rs @@ -345,7 +345,6 @@ pub fn run() { .decorations(false); let window = window_builder.build().expect("Failed to create window"); - let _ = window.show(); #[cfg(windows)] let _ = window.create_overlay_titlebar(); diff --git a/packages/opencode/package.json b/packages/opencode/package.json index c70d87ff98..9d60283e8c 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -50,25 +50,25 @@ "@actions/core": "1.11.1", "@actions/github": "6.0.1", "@agentclientprotocol/sdk": "0.13.0", - "@ai-sdk/amazon-bedrock": "3.0.73", - "@ai-sdk/anthropic": "2.0.57", + "@ai-sdk/amazon-bedrock": "3.0.74", + "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/azure": "2.0.91", - "@ai-sdk/cerebras": "1.0.34", + "@ai-sdk/cerebras": "1.0.36", "@ai-sdk/cohere": "2.0.22", - "@ai-sdk/deepinfra": "1.0.31", - "@ai-sdk/gateway": "2.0.25", + "@ai-sdk/deepinfra": "1.0.33", + "@ai-sdk/gateway": "2.0.30", "@ai-sdk/google": "2.0.52", - "@ai-sdk/google-vertex": "3.0.97", + "@ai-sdk/google-vertex": "3.0.98", "@ai-sdk/groq": "2.0.34", "@ai-sdk/mistral": "2.0.27", "@ai-sdk/openai": "2.0.89", - "@ai-sdk/openai-compatible": "1.0.30", + "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/perplexity": "2.0.23", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", - "@ai-sdk/togetherai": "1.0.31", - "@ai-sdk/vercel": "1.0.31", - "@ai-sdk/xai": "2.0.51", + "@ai-sdk/togetherai": "1.0.34", + "@ai-sdk/vercel": "1.0.33", + "@ai-sdk/xai": "2.0.56", "@clack/prompts": "1.0.0-alpha.1", "@gitlab/gitlab-ai-provider": "3.3.1", "@hono/standard-validator": "0.1.5", @@ -81,7 +81,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@opencode-ai/util": "workspace:*", - "@openrouter/ai-sdk-provider": "1.5.2", + "@openrouter/ai-sdk-provider": "1.5.4", "@opentui/core": "0.1.75", "@opentui/solid": "0.1.75", "@parcel/watcher": "2.5.1", diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 84a278224b..f0b3fa828a 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -14,11 +14,11 @@ process.chdir(dir) import pkg from "../package.json" import { Script } from "@opencode-ai/script" - +const modelsUrl = process.env.OPENCODE_MODELS_URL || "https://models.dev" // Fetch and generate models.dev snapshot const modelsData = process.env.MODELS_DEV_API_JSON ? await Bun.file(process.env.MODELS_DEV_API_JSON).text() - : await fetch(`https://models.dev/api.json`).then((x) => x.text()) + : await fetch(`${modelsUrl}/api.json`).then((x) => x.text()) await Bun.write( path.join(dir, "src/provider/models-snapshot.ts"), `// Auto-generated by build.ts - do not edit\nexport const snapshot = ${modelsData} as const\n`, diff --git a/packages/opencode/src/cli/cmd/acp.ts b/packages/opencode/src/cli/cmd/acp.ts index 30e919d999..99a9a81ab9 100644 --- a/packages/opencode/src/cli/cmd/acp.ts +++ b/packages/opencode/src/cli/cmd/acp.ts @@ -20,6 +20,7 @@ export const AcpCommand = cmd({ }) }, handler: async (args) => { + process.env.OPENCODE_CLIENT = "acp" await bootstrap(process.cwd(), async () => { const opts = await resolveNetworkOptions(args) const server = Server.listen(opts) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx index 718929d445..bd000e2ab0 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx @@ -345,8 +345,9 @@ export function Autocomplete(props: { const results: AutocompleteOption[] = [...command.slashes()] for (const serverCommand of sync.data.command) { + const label = serverCommand.source === "mcp" ? ":mcp" : serverCommand.source === "skill" ? ":skill" : "" results.push({ - display: "/" + serverCommand.name + (serverCommand.mcp ? " (MCP)" : ""), + display: "/" + serverCommand.name + label, description: serverCommand.description, onSelect: () => { const newText = "/" + serverCommand.name + " " diff --git a/packages/opencode/src/command/index.ts b/packages/opencode/src/command/index.ts index 976f1cd51e..14dbeb6794 100644 --- a/packages/opencode/src/command/index.ts +++ b/packages/opencode/src/command/index.ts @@ -6,6 +6,7 @@ import { Identifier } from "../id/id" import PROMPT_INITIALIZE from "./template/initialize.txt" import PROMPT_REVIEW from "./template/review.txt" import { MCP } from "../mcp" +import { Skill } from "../skill" export namespace Command { export const Event = { @@ -26,7 +27,7 @@ export namespace Command { description: z.string().optional(), agent: z.string().optional(), model: z.string().optional(), - mcp: z.boolean().optional(), + source: z.enum(["command", "mcp", "skill"]).optional(), // workaround for zod not supporting async functions natively so we use getters // https://zod.dev/v4/changelog?id=zfunction template: z.promise(z.string()).or(z.string()), @@ -94,7 +95,7 @@ export namespace Command { for (const [name, prompt] of Object.entries(await MCP.prompts())) { result[name] = { name, - mcp: true, + source: "mcp", description: prompt.description, get template() { // since a getter can't be async we need to manually return a promise here @@ -118,6 +119,21 @@ export namespace Command { } } + // Add skills as invokable commands + for (const skill of await Skill.all()) { + // Skip if a command with this name already exists + if (result[skill.name]) continue + result[skill.name] = { + name: skill.name, + description: skill.description, + source: "skill", + get template() { + return skill.content + }, + hints: [], + } + } + return result }) diff --git a/packages/opencode/src/env/index.ts b/packages/opencode/src/env/index.ts index 8c40c08edd..003b59fc71 100644 --- a/packages/opencode/src/env/index.ts +++ b/packages/opencode/src/env/index.ts @@ -2,7 +2,9 @@ import { Instance } from "../project/instance" export namespace Env { const state = Instance.state(() => { - return process.env as Record + // Create a shallow copy to isolate environment per instance + // Prevents parallel tests from interfering with each other's env vars + return { ...process.env } as Record }) export function get(key: string) { diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts index 0f6889779a..dd94cc6097 100644 --- a/packages/opencode/src/file/ripgrep.ts +++ b/packages/opencode/src/file/ripgrep.ts @@ -214,8 +214,8 @@ export namespace Ripgrep { input.signal?.throwIfAborted() const args = [await filepath(), "--files", "--glob=!.git/*"] - if (input.follow !== false) args.push("--follow") - if (input.hidden !== false) args.push("--hidden") + if (input.follow) args.push("--follow") + if (input.hidden) args.push("--hidden") if (input.maxDepth !== undefined) args.push(`--max-depth=${input.maxDepth}`) if (input.glob) { for (const g of input.glob) { @@ -381,7 +381,7 @@ export namespace Ripgrep { follow?: boolean }) { const args = [`${await filepath()}`, "--json", "--hidden", "--glob='!.git/*'"] - if (input.follow !== false) args.push("--follow") + if (input.follow) args.push("--follow") if (input.glob) { for (const g of input.glob) { diff --git a/packages/opencode/src/flag/flag.ts b/packages/opencode/src/flag/flag.ts index 9084bf4443..64ae801d18 100644 --- a/packages/opencode/src/flag/flag.ts +++ b/packages/opencode/src/flag/flag.ts @@ -25,7 +25,7 @@ export namespace Flag { OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS") export declare const OPENCODE_DISABLE_PROJECT_CONFIG: boolean export const OPENCODE_FAKE_VCS = process.env["OPENCODE_FAKE_VCS"] - export const OPENCODE_CLIENT = process.env["OPENCODE_CLIENT"] ?? "cli" + export declare const OPENCODE_CLIENT: string export const OPENCODE_SERVER_PASSWORD = process.env["OPENCODE_SERVER_PASSWORD"] export const OPENCODE_SERVER_USERNAME = process.env["OPENCODE_SERVER_USERNAME"] @@ -47,6 +47,7 @@ export namespace Flag { export const OPENCODE_EXPERIMENTAL_PLAN_MODE = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_PLAN_MODE") export const OPENCODE_EXPERIMENTAL_MARKDOWN = truthy("OPENCODE_EXPERIMENTAL_MARKDOWN") export const OPENCODE_MODELS_URL = process.env["OPENCODE_MODELS_URL"] + export const OPENCODE_MODELS_PATH = process.env["OPENCODE_MODELS_PATH"] function number(key: string) { const value = process.env[key] @@ -77,3 +78,14 @@ Object.defineProperty(Flag, "OPENCODE_CONFIG_DIR", { enumerable: true, configurable: false, }) + +// Dynamic getter for OPENCODE_CLIENT +// This must be evaluated at access time, not module load time, +// because some commands override the client at runtime +Object.defineProperty(Flag, "OPENCODE_CLIENT", { + get() { + return process.env["OPENCODE_CLIENT"] ?? "cli" + }, + enumerable: true, + configurable: false, +}) diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index 82794f35ba..07881cbfe2 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -85,7 +85,7 @@ export namespace ModelsDev { } export const Data = lazy(async () => { - const file = Bun.file(filepath) + const file = Bun.file(Flag.OPENCODE_MODELS_PATH ?? filepath) const result = await file.json().catch(() => {}) if (result) return result // @ts-ignore diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 128c4f4e6b..e79cb17089 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -24,7 +24,7 @@ import { createVertexAnthropic } from "@ai-sdk/google-vertex/anthropic" import { createOpenAI } from "@ai-sdk/openai" import { createOpenAICompatible } from "@ai-sdk/openai-compatible" import { createOpenRouter, type LanguageModelV2 } from "@openrouter/ai-sdk-provider" -import { createOpenaiCompatible as createGitHubCopilotOpenAICompatible } from "./sdk/openai-compatible/src" +import { createOpenaiCompatible as createGitHubCopilotOpenAICompatible } from "./sdk/copilot" import { createXai } from "@ai-sdk/xai" import { createMistral } from "@ai-sdk/mistral" import { createGroq } from "@ai-sdk/groq" diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/README.md b/packages/opencode/src/provider/sdk/copilot/README.md similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/README.md rename to packages/opencode/src/provider/sdk/copilot/README.md diff --git a/packages/opencode/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts b/packages/opencode/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts new file mode 100644 index 0000000000..642d7145fe --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts @@ -0,0 +1,169 @@ +import { + type LanguageModelV2Prompt, + type SharedV2ProviderMetadata, + UnsupportedFunctionalityError, +} from "@ai-sdk/provider" +import type { OpenAICompatibleChatPrompt } from "./openai-compatible-api-types" +import { convertToBase64 } from "@ai-sdk/provider-utils" + +function getOpenAIMetadata(message: { providerOptions?: SharedV2ProviderMetadata }) { + return message?.providerOptions?.copilot ?? {} +} + +export function convertToOpenAICompatibleChatMessages(prompt: LanguageModelV2Prompt): OpenAICompatibleChatPrompt { + const messages: OpenAICompatibleChatPrompt = [] + for (const { role, content, ...message } of prompt) { + const metadata = getOpenAIMetadata({ ...message }) + switch (role) { + case "system": { + messages.push({ + role: "system", + content: [ + { + type: "text", + text: content, + }, + ], + ...metadata, + }) + break + } + + case "user": { + if (content.length === 1 && content[0].type === "text") { + messages.push({ + role: "user", + content: content[0].text, + ...getOpenAIMetadata(content[0]), + }) + break + } + + messages.push({ + role: "user", + content: content.map((part) => { + const partMetadata = getOpenAIMetadata(part) + switch (part.type) { + case "text": { + return { type: "text", text: part.text, ...partMetadata } + } + case "file": { + if (part.mediaType.startsWith("image/")) { + const mediaType = part.mediaType === "image/*" ? "image/jpeg" : part.mediaType + + return { + type: "image_url", + image_url: { + url: + part.data instanceof URL + ? part.data.toString() + : `data:${mediaType};base64,${convertToBase64(part.data)}`, + }, + ...partMetadata, + } + } else { + throw new UnsupportedFunctionalityError({ + functionality: `file part media type ${part.mediaType}`, + }) + } + } + } + }), + ...metadata, + }) + + break + } + + case "assistant": { + let text = "" + let reasoningText: string | undefined + let reasoningOpaque: string | undefined + const toolCalls: Array<{ + id: string + type: "function" + function: { name: string; arguments: string } + }> = [] + + for (const part of content) { + const partMetadata = getOpenAIMetadata(part) + // Check for reasoningOpaque on any part (may be attached to text/tool-call) + const partOpaque = (part.providerOptions as { copilot?: { reasoningOpaque?: string } })?.copilot + ?.reasoningOpaque + if (partOpaque && !reasoningOpaque) { + reasoningOpaque = partOpaque + } + + switch (part.type) { + case "text": { + text += part.text + break + } + case "reasoning": { + reasoningText = part.text + break + } + case "tool-call": { + toolCalls.push({ + id: part.toolCallId, + type: "function", + function: { + name: part.toolName, + arguments: JSON.stringify(part.input), + }, + ...partMetadata, + }) + break + } + } + } + + messages.push({ + role: "assistant", + content: text || null, + tool_calls: toolCalls.length > 0 ? toolCalls : undefined, + reasoning_text: reasoningText, + reasoning_opaque: reasoningOpaque, + ...metadata, + }) + + break + } + + case "tool": { + for (const toolResponse of content) { + const output = toolResponse.output + + let contentValue: string + switch (output.type) { + case "text": + case "error-text": + contentValue = output.value + break + case "content": + case "json": + case "error-json": + contentValue = JSON.stringify(output.value) + break + } + + const toolResponseMetadata = getOpenAIMetadata(toolResponse) + messages.push({ + role: "tool", + tool_call_id: toolResponse.toolCallId, + content: contentValue, + ...toolResponseMetadata, + }) + } + break + } + + default: { + const _exhaustiveCheck: never = role + throw new Error(`Unsupported role: ${_exhaustiveCheck}`) + } + } + } + + return messages +} diff --git a/packages/opencode/src/provider/sdk/copilot/chat/get-response-metadata.ts b/packages/opencode/src/provider/sdk/copilot/chat/get-response-metadata.ts new file mode 100644 index 0000000000..708fd968e3 --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/get-response-metadata.ts @@ -0,0 +1,15 @@ +export function getResponseMetadata({ + id, + model, + created, +}: { + id?: string | undefined | null + created?: number | undefined | null + model?: string | undefined | null +}) { + return { + id: id ?? undefined, + modelId: model ?? undefined, + timestamp: created != null ? new Date(created * 1000) : undefined, + } +} diff --git a/packages/opencode/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts b/packages/opencode/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts new file mode 100644 index 0000000000..82e2ca02e9 --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts @@ -0,0 +1,17 @@ +import type { LanguageModelV2FinishReason } from "@ai-sdk/provider" + +export function mapOpenAICompatibleFinishReason(finishReason: string | null | undefined): LanguageModelV2FinishReason { + switch (finishReason) { + case "stop": + return "stop" + case "length": + return "length" + case "content_filter": + return "content-filter" + case "function_call": + case "tool_calls": + return "tool-calls" + default: + return "unknown" + } +} diff --git a/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts new file mode 100644 index 0000000000..c127b05b17 --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts @@ -0,0 +1,64 @@ +import type { JSONValue } from "@ai-sdk/provider" + +export type OpenAICompatibleChatPrompt = Array + +export type OpenAICompatibleMessage = + | OpenAICompatibleSystemMessage + | OpenAICompatibleUserMessage + | OpenAICompatibleAssistantMessage + | OpenAICompatibleToolMessage + +// Allow for arbitrary additional properties for general purpose +// provider-metadata-specific extensibility. +type JsonRecord = Record + +export interface OpenAICompatibleSystemMessage extends JsonRecord { + role: "system" + content: string | Array +} + +export interface OpenAICompatibleSystemContentPart extends JsonRecord { + type: "text" + text: string +} + +export interface OpenAICompatibleUserMessage extends JsonRecord { + role: "user" + content: string | Array +} + +export type OpenAICompatibleContentPart = OpenAICompatibleContentPartText | OpenAICompatibleContentPartImage + +export interface OpenAICompatibleContentPartImage extends JsonRecord { + type: "image_url" + image_url: { url: string } +} + +export interface OpenAICompatibleContentPartText extends JsonRecord { + type: "text" + text: string +} + +export interface OpenAICompatibleAssistantMessage extends JsonRecord { + role: "assistant" + content?: string | null + tool_calls?: Array + // Copilot-specific reasoning fields + reasoning_text?: string + reasoning_opaque?: string +} + +export interface OpenAICompatibleMessageToolCall extends JsonRecord { + type: "function" + id: string + function: { + arguments: string + name: string + } +} + +export interface OpenAICompatibleToolMessage extends JsonRecord { + role: "tool" + content: string + tool_call_id: string +} diff --git a/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts new file mode 100644 index 0000000000..94641e640e --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts @@ -0,0 +1,765 @@ +import { + APICallError, + InvalidResponseDataError, + type LanguageModelV2, + type LanguageModelV2CallWarning, + type LanguageModelV2Content, + type LanguageModelV2FinishReason, + type LanguageModelV2StreamPart, + type SharedV2ProviderMetadata, +} from "@ai-sdk/provider" +import { + combineHeaders, + createEventSourceResponseHandler, + createJsonErrorResponseHandler, + createJsonResponseHandler, + type FetchFunction, + generateId, + isParsableJson, + parseProviderOptions, + type ParseResult, + postJsonToApi, + type ResponseHandler, +} from "@ai-sdk/provider-utils" +import { z } from "zod/v4" +import { convertToOpenAICompatibleChatMessages } from "./convert-to-openai-compatible-chat-messages" +import { getResponseMetadata } from "./get-response-metadata" +import { mapOpenAICompatibleFinishReason } from "./map-openai-compatible-finish-reason" +import { type OpenAICompatibleChatModelId, openaiCompatibleProviderOptions } from "./openai-compatible-chat-options" +import { defaultOpenAICompatibleErrorStructure, type ProviderErrorStructure } from "../openai-compatible-error" +import type { MetadataExtractor } from "./openai-compatible-metadata-extractor" +import { prepareTools } from "./openai-compatible-prepare-tools" + +export type OpenAICompatibleChatConfig = { + provider: string + headers: () => Record + url: (options: { modelId: string; path: string }) => string + fetch?: FetchFunction + includeUsage?: boolean + errorStructure?: ProviderErrorStructure + metadataExtractor?: MetadataExtractor + + /** + * Whether the model supports structured outputs. + */ + supportsStructuredOutputs?: boolean + + /** + * The supported URLs for the model. + */ + supportedUrls?: () => LanguageModelV2["supportedUrls"] +} + +export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 { + readonly specificationVersion = "v2" + + readonly supportsStructuredOutputs: boolean + + readonly modelId: OpenAICompatibleChatModelId + private readonly config: OpenAICompatibleChatConfig + private readonly failedResponseHandler: ResponseHandler + private readonly chunkSchema // type inferred via constructor + + constructor(modelId: OpenAICompatibleChatModelId, config: OpenAICompatibleChatConfig) { + this.modelId = modelId + this.config = config + + // initialize error handling: + const errorStructure = config.errorStructure ?? defaultOpenAICompatibleErrorStructure + this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema) + this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure) + + this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? false + } + + get provider(): string { + return this.config.provider + } + + private get providerOptionsName(): string { + return this.config.provider.split(".")[0].trim() + } + + get supportedUrls() { + return this.config.supportedUrls?.() ?? {} + } + + private async getArgs({ + prompt, + maxOutputTokens, + temperature, + topP, + topK, + frequencyPenalty, + presencePenalty, + providerOptions, + stopSequences, + responseFormat, + seed, + toolChoice, + tools, + }: Parameters[0]) { + const warnings: LanguageModelV2CallWarning[] = [] + + // Parse provider options + const compatibleOptions = Object.assign( + (await parseProviderOptions({ + provider: "copilot", + providerOptions, + schema: openaiCompatibleProviderOptions, + })) ?? {}, + (await parseProviderOptions({ + provider: this.providerOptionsName, + providerOptions, + schema: openaiCompatibleProviderOptions, + })) ?? {}, + ) + + if (topK != null) { + warnings.push({ type: "unsupported-setting", setting: "topK" }) + } + + if (responseFormat?.type === "json" && responseFormat.schema != null && !this.supportsStructuredOutputs) { + warnings.push({ + type: "unsupported-setting", + setting: "responseFormat", + details: "JSON response format schema is only supported with structuredOutputs", + }) + } + + const { + tools: openaiTools, + toolChoice: openaiToolChoice, + toolWarnings, + } = prepareTools({ + tools, + toolChoice, + }) + + return { + args: { + // model id: + model: this.modelId, + + // model specific settings: + user: compatibleOptions.user, + + // standardized settings: + max_tokens: maxOutputTokens, + temperature, + top_p: topP, + frequency_penalty: frequencyPenalty, + presence_penalty: presencePenalty, + response_format: + responseFormat?.type === "json" + ? this.supportsStructuredOutputs === true && responseFormat.schema != null + ? { + type: "json_schema", + json_schema: { + schema: responseFormat.schema, + name: responseFormat.name ?? "response", + description: responseFormat.description, + }, + } + : { type: "json_object" } + : undefined, + + stop: stopSequences, + seed, + ...Object.fromEntries( + Object.entries(providerOptions?.[this.providerOptionsName] ?? {}).filter( + ([key]) => !Object.keys(openaiCompatibleProviderOptions.shape).includes(key), + ), + ), + + reasoning_effort: compatibleOptions.reasoningEffort, + verbosity: compatibleOptions.textVerbosity, + + // messages: + messages: convertToOpenAICompatibleChatMessages(prompt), + + // tools: + tools: openaiTools, + tool_choice: openaiToolChoice, + + // thinking_budget + thinking_budget: compatibleOptions.thinking_budget, + }, + warnings: [...warnings, ...toolWarnings], + } + } + + async doGenerate( + options: Parameters[0], + ): Promise>> { + const { args, warnings } = await this.getArgs({ ...options }) + + const body = JSON.stringify(args) + + const { + responseHeaders, + value: responseBody, + rawValue: rawResponse, + } = await postJsonToApi({ + url: this.config.url({ + path: "/chat/completions", + modelId: this.modelId, + }), + headers: combineHeaders(this.config.headers(), options.headers), + body: args, + failedResponseHandler: this.failedResponseHandler, + successfulResponseHandler: createJsonResponseHandler(OpenAICompatibleChatResponseSchema), + abortSignal: options.abortSignal, + fetch: this.config.fetch, + }) + + const choice = responseBody.choices[0] + const content: Array = [] + + // text content: + const text = choice.message.content + if (text != null && text.length > 0) { + content.push({ type: "text", text }) + } + + // reasoning content (Copilot uses reasoning_text): + const reasoning = choice.message.reasoning_text + if (reasoning != null && reasoning.length > 0) { + content.push({ + type: "reasoning", + text: reasoning, + // Include reasoning_opaque for Copilot multi-turn reasoning + providerMetadata: choice.message.reasoning_opaque + ? { copilot: { reasoningOpaque: choice.message.reasoning_opaque } } + : undefined, + }) + } + + // tool calls: + if (choice.message.tool_calls != null) { + for (const toolCall of choice.message.tool_calls) { + content.push({ + type: "tool-call", + toolCallId: toolCall.id ?? generateId(), + toolName: toolCall.function.name, + input: toolCall.function.arguments!, + }) + } + } + + // provider metadata: + const providerMetadata: SharedV2ProviderMetadata = { + [this.providerOptionsName]: {}, + ...(await this.config.metadataExtractor?.extractMetadata?.({ + parsedBody: rawResponse, + })), + } + const completionTokenDetails = responseBody.usage?.completion_tokens_details + if (completionTokenDetails?.accepted_prediction_tokens != null) { + providerMetadata[this.providerOptionsName].acceptedPredictionTokens = + completionTokenDetails?.accepted_prediction_tokens + } + if (completionTokenDetails?.rejected_prediction_tokens != null) { + providerMetadata[this.providerOptionsName].rejectedPredictionTokens = + completionTokenDetails?.rejected_prediction_tokens + } + + return { + content, + finishReason: mapOpenAICompatibleFinishReason(choice.finish_reason), + usage: { + inputTokens: responseBody.usage?.prompt_tokens ?? undefined, + outputTokens: responseBody.usage?.completion_tokens ?? undefined, + totalTokens: responseBody.usage?.total_tokens ?? undefined, + reasoningTokens: responseBody.usage?.completion_tokens_details?.reasoning_tokens ?? undefined, + cachedInputTokens: responseBody.usage?.prompt_tokens_details?.cached_tokens ?? undefined, + }, + providerMetadata, + request: { body }, + response: { + ...getResponseMetadata(responseBody), + headers: responseHeaders, + body: rawResponse, + }, + warnings, + } + } + + async doStream( + options: Parameters[0], + ): Promise>> { + const { args, warnings } = await this.getArgs({ ...options }) + + const body = { + ...args, + stream: true, + + // only include stream_options when in strict compatibility mode: + stream_options: this.config.includeUsage ? { include_usage: true } : undefined, + } + + const metadataExtractor = this.config.metadataExtractor?.createStreamExtractor() + + const { responseHeaders, value: response } = await postJsonToApi({ + url: this.config.url({ + path: "/chat/completions", + modelId: this.modelId, + }), + headers: combineHeaders(this.config.headers(), options.headers), + body, + failedResponseHandler: this.failedResponseHandler, + successfulResponseHandler: createEventSourceResponseHandler(this.chunkSchema), + abortSignal: options.abortSignal, + fetch: this.config.fetch, + }) + + const toolCalls: Array<{ + id: string + type: "function" + function: { + name: string + arguments: string + } + hasFinished: boolean + }> = [] + + let finishReason: LanguageModelV2FinishReason = "unknown" + const usage: { + completionTokens: number | undefined + completionTokensDetails: { + reasoningTokens: number | undefined + acceptedPredictionTokens: number | undefined + rejectedPredictionTokens: number | undefined + } + promptTokens: number | undefined + promptTokensDetails: { + cachedTokens: number | undefined + } + totalTokens: number | undefined + } = { + completionTokens: undefined, + completionTokensDetails: { + reasoningTokens: undefined, + acceptedPredictionTokens: undefined, + rejectedPredictionTokens: undefined, + }, + promptTokens: undefined, + promptTokensDetails: { + cachedTokens: undefined, + }, + totalTokens: undefined, + } + let isFirstChunk = true + const providerOptionsName = this.providerOptionsName + let isActiveReasoning = false + let isActiveText = false + let reasoningOpaque: string | undefined + + return { + stream: response.pipeThrough( + new TransformStream>, LanguageModelV2StreamPart>({ + start(controller) { + controller.enqueue({ type: "stream-start", warnings }) + }, + + // TODO we lost type safety on Chunk, most likely due to the error schema. MUST FIX + transform(chunk, controller) { + // Emit raw chunk if requested (before anything else) + if (options.includeRawChunks) { + controller.enqueue({ type: "raw", rawValue: chunk.rawValue }) + } + + // handle failed chunk parsing / validation: + if (!chunk.success) { + finishReason = "error" + controller.enqueue({ type: "error", error: chunk.error }) + return + } + const value = chunk.value + + metadataExtractor?.processChunk(chunk.rawValue) + + // handle error chunks: + if ("error" in value) { + finishReason = "error" + controller.enqueue({ type: "error", error: value.error.message }) + return + } + + if (isFirstChunk) { + isFirstChunk = false + + controller.enqueue({ + type: "response-metadata", + ...getResponseMetadata(value), + }) + } + + if (value.usage != null) { + const { + prompt_tokens, + completion_tokens, + total_tokens, + prompt_tokens_details, + completion_tokens_details, + } = value.usage + + usage.promptTokens = prompt_tokens ?? undefined + usage.completionTokens = completion_tokens ?? undefined + usage.totalTokens = total_tokens ?? undefined + if (completion_tokens_details?.reasoning_tokens != null) { + usage.completionTokensDetails.reasoningTokens = completion_tokens_details?.reasoning_tokens + } + if (completion_tokens_details?.accepted_prediction_tokens != null) { + usage.completionTokensDetails.acceptedPredictionTokens = + completion_tokens_details?.accepted_prediction_tokens + } + if (completion_tokens_details?.rejected_prediction_tokens != null) { + usage.completionTokensDetails.rejectedPredictionTokens = + completion_tokens_details?.rejected_prediction_tokens + } + if (prompt_tokens_details?.cached_tokens != null) { + usage.promptTokensDetails.cachedTokens = prompt_tokens_details?.cached_tokens + } + } + + const choice = value.choices[0] + + if (choice?.finish_reason != null) { + finishReason = mapOpenAICompatibleFinishReason(choice.finish_reason) + } + + if (choice?.delta == null) { + return + } + + const delta = choice.delta + + // Capture reasoning_opaque for Copilot multi-turn reasoning + if (delta.reasoning_opaque) { + if (reasoningOpaque != null) { + throw new InvalidResponseDataError({ + data: delta, + message: + "Multiple reasoning_opaque values received in a single response. Only one thinking part per response is supported.", + }) + } + reasoningOpaque = delta.reasoning_opaque + } + + // enqueue reasoning before text deltas (Copilot uses reasoning_text): + const reasoningContent = delta.reasoning_text + if (reasoningContent) { + if (!isActiveReasoning) { + controller.enqueue({ + type: "reasoning-start", + id: "reasoning-0", + }) + isActiveReasoning = true + } + + controller.enqueue({ + type: "reasoning-delta", + id: "reasoning-0", + delta: reasoningContent, + }) + } + + if (delta.content) { + // If reasoning was active and we're starting text, end reasoning first + // This handles the case where reasoning_opaque and content come in the same chunk + if (isActiveReasoning && !isActiveText) { + controller.enqueue({ + type: "reasoning-end", + id: "reasoning-0", + providerMetadata: reasoningOpaque ? { copilot: { reasoningOpaque } } : undefined, + }) + isActiveReasoning = false + } + + if (!isActiveText) { + controller.enqueue({ type: "text-start", id: "txt-0" }) + isActiveText = true + } + + controller.enqueue({ + type: "text-delta", + id: "txt-0", + delta: delta.content, + }) + } + + if (delta.tool_calls != null) { + // If reasoning was active and we're starting tool calls, end reasoning first + // This handles the case where reasoning goes directly to tool calls with no content + if (isActiveReasoning) { + controller.enqueue({ + type: "reasoning-end", + id: "reasoning-0", + providerMetadata: reasoningOpaque ? { copilot: { reasoningOpaque } } : undefined, + }) + isActiveReasoning = false + } + for (const toolCallDelta of delta.tool_calls) { + const index = toolCallDelta.index + + if (toolCalls[index] == null) { + if (toolCallDelta.id == null) { + throw new InvalidResponseDataError({ + data: toolCallDelta, + message: `Expected 'id' to be a string.`, + }) + } + + if (toolCallDelta.function?.name == null) { + throw new InvalidResponseDataError({ + data: toolCallDelta, + message: `Expected 'function.name' to be a string.`, + }) + } + + controller.enqueue({ + type: "tool-input-start", + id: toolCallDelta.id, + toolName: toolCallDelta.function.name, + }) + + toolCalls[index] = { + id: toolCallDelta.id, + type: "function", + function: { + name: toolCallDelta.function.name, + arguments: toolCallDelta.function.arguments ?? "", + }, + hasFinished: false, + } + + const toolCall = toolCalls[index] + + if (toolCall.function?.name != null && toolCall.function?.arguments != null) { + // send delta if the argument text has already started: + if (toolCall.function.arguments.length > 0) { + controller.enqueue({ + type: "tool-input-delta", + id: toolCall.id, + delta: toolCall.function.arguments, + }) + } + + // check if tool call is complete + // (some providers send the full tool call in one chunk): + if (isParsableJson(toolCall.function.arguments)) { + controller.enqueue({ + type: "tool-input-end", + id: toolCall.id, + }) + + controller.enqueue({ + type: "tool-call", + toolCallId: toolCall.id ?? generateId(), + toolName: toolCall.function.name, + input: toolCall.function.arguments, + }) + toolCall.hasFinished = true + } + } + + continue + } + + // existing tool call, merge if not finished + const toolCall = toolCalls[index] + + if (toolCall.hasFinished) { + continue + } + + if (toolCallDelta.function?.arguments != null) { + toolCall.function!.arguments += toolCallDelta.function?.arguments ?? "" + } + + // send delta + controller.enqueue({ + type: "tool-input-delta", + id: toolCall.id, + delta: toolCallDelta.function.arguments ?? "", + }) + + // check if tool call is complete + if ( + toolCall.function?.name != null && + toolCall.function?.arguments != null && + isParsableJson(toolCall.function.arguments) + ) { + controller.enqueue({ + type: "tool-input-end", + id: toolCall.id, + }) + + controller.enqueue({ + type: "tool-call", + toolCallId: toolCall.id ?? generateId(), + toolName: toolCall.function.name, + input: toolCall.function.arguments, + }) + toolCall.hasFinished = true + } + } + } + }, + + flush(controller) { + if (isActiveReasoning) { + controller.enqueue({ + type: "reasoning-end", + id: "reasoning-0", + // Include reasoning_opaque for Copilot multi-turn reasoning + providerMetadata: reasoningOpaque ? { copilot: { reasoningOpaque } } : undefined, + }) + } + + if (isActiveText) { + controller.enqueue({ type: "text-end", id: "txt-0" }) + } + + // go through all tool calls and send the ones that are not finished + for (const toolCall of toolCalls.filter((toolCall) => !toolCall.hasFinished)) { + controller.enqueue({ + type: "tool-input-end", + id: toolCall.id, + }) + + controller.enqueue({ + type: "tool-call", + toolCallId: toolCall.id ?? generateId(), + toolName: toolCall.function.name, + input: toolCall.function.arguments, + }) + } + + const providerMetadata: SharedV2ProviderMetadata = { + [providerOptionsName]: {}, + // Include reasoning_opaque for Copilot multi-turn reasoning + ...(reasoningOpaque ? { copilot: { reasoningOpaque } } : {}), + ...metadataExtractor?.buildMetadata(), + } + if (usage.completionTokensDetails.acceptedPredictionTokens != null) { + providerMetadata[providerOptionsName].acceptedPredictionTokens = + usage.completionTokensDetails.acceptedPredictionTokens + } + if (usage.completionTokensDetails.rejectedPredictionTokens != null) { + providerMetadata[providerOptionsName].rejectedPredictionTokens = + usage.completionTokensDetails.rejectedPredictionTokens + } + + controller.enqueue({ + type: "finish", + finishReason, + usage: { + inputTokens: usage.promptTokens ?? undefined, + outputTokens: usage.completionTokens ?? undefined, + totalTokens: usage.totalTokens ?? undefined, + reasoningTokens: usage.completionTokensDetails.reasoningTokens ?? undefined, + cachedInputTokens: usage.promptTokensDetails.cachedTokens ?? undefined, + }, + providerMetadata, + }) + }, + }), + ), + request: { body }, + response: { headers: responseHeaders }, + } + } +} + +const openaiCompatibleTokenUsageSchema = z + .object({ + prompt_tokens: z.number().nullish(), + completion_tokens: z.number().nullish(), + total_tokens: z.number().nullish(), + prompt_tokens_details: z + .object({ + cached_tokens: z.number().nullish(), + }) + .nullish(), + completion_tokens_details: z + .object({ + reasoning_tokens: z.number().nullish(), + accepted_prediction_tokens: z.number().nullish(), + rejected_prediction_tokens: z.number().nullish(), + }) + .nullish(), + }) + .nullish() + +// limited version of the schema, focussed on what is needed for the implementation +// this approach limits breakages when the API changes and increases efficiency +const OpenAICompatibleChatResponseSchema = z.object({ + id: z.string().nullish(), + created: z.number().nullish(), + model: z.string().nullish(), + choices: z.array( + z.object({ + message: z.object({ + role: z.literal("assistant").nullish(), + content: z.string().nullish(), + // Copilot-specific reasoning fields + reasoning_text: z.string().nullish(), + reasoning_opaque: z.string().nullish(), + tool_calls: z + .array( + z.object({ + id: z.string().nullish(), + function: z.object({ + name: z.string(), + arguments: z.string(), + }), + }), + ) + .nullish(), + }), + finish_reason: z.string().nullish(), + }), + ), + usage: openaiCompatibleTokenUsageSchema, +}) + +// limited version of the schema, focussed on what is needed for the implementation +// this approach limits breakages when the API changes and increases efficiency +const createOpenAICompatibleChatChunkSchema = (errorSchema: ERROR_SCHEMA) => + z.union([ + z.object({ + id: z.string().nullish(), + created: z.number().nullish(), + model: z.string().nullish(), + choices: z.array( + z.object({ + delta: z + .object({ + role: z.enum(["assistant"]).nullish(), + content: z.string().nullish(), + // Copilot-specific reasoning fields + reasoning_text: z.string().nullish(), + reasoning_opaque: z.string().nullish(), + tool_calls: z + .array( + z.object({ + index: z.number(), + id: z.string().nullish(), + function: z.object({ + name: z.string().nullish(), + arguments: z.string().nullish(), + }), + }), + ) + .nullish(), + }) + .nullish(), + finish_reason: z.string().nullish(), + }), + ), + usage: openaiCompatibleTokenUsageSchema, + }), + errorSchema, + ]) diff --git a/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts new file mode 100644 index 0000000000..ec5d53fbf9 --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts @@ -0,0 +1,28 @@ +import { z } from "zod/v4" + +export type OpenAICompatibleChatModelId = string + +export const openaiCompatibleProviderOptions = z.object({ + /** + * A unique identifier representing your end-user, which can help the provider to + * monitor and detect abuse. + */ + user: z.string().optional(), + + /** + * Reasoning effort for reasoning models. Defaults to `medium`. + */ + reasoningEffort: z.string().optional(), + + /** + * Controls the verbosity of the generated text. Defaults to `medium`. + */ + textVerbosity: z.string().optional(), + + /** + * Copilot thinking_budget used for Anthropic models. + */ + thinking_budget: z.number().optional(), +}) + +export type OpenAICompatibleProviderOptions = z.infer diff --git a/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts new file mode 100644 index 0000000000..ba233fbc1b --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts @@ -0,0 +1,44 @@ +import type { SharedV2ProviderMetadata } from "@ai-sdk/provider" + +/** +Extracts provider-specific metadata from API responses. +Used to standardize metadata handling across different LLM providers while allowing +provider-specific metadata to be captured. +*/ +export type MetadataExtractor = { + /** + * Extracts provider metadata from a complete, non-streaming response. + * + * @param parsedBody - The parsed response JSON body from the provider's API. + * + * @returns Provider-specific metadata or undefined if no metadata is available. + * The metadata should be under a key indicating the provider id. + */ + extractMetadata: ({ parsedBody }: { parsedBody: unknown }) => Promise + + /** + * Creates an extractor for handling streaming responses. The returned object provides + * methods to process individual chunks and build the final metadata from the accumulated + * stream data. + * + * @returns An object with methods to process chunks and build metadata from a stream + */ + createStreamExtractor: () => { + /** + * Process an individual chunk from the stream. Called for each chunk in the response stream + * to accumulate metadata throughout the streaming process. + * + * @param parsedChunk - The parsed JSON response chunk from the provider's API + */ + processChunk(parsedChunk: unknown): void + + /** + * Builds the metadata object after all chunks have been processed. + * Called at the end of the stream to generate the complete provider metadata. + * + * @returns Provider-specific metadata or undefined if no metadata is available. + * The metadata should be under a key indicating the provider id. + */ + buildMetadata(): SharedV2ProviderMetadata | undefined + } +} diff --git a/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts new file mode 100644 index 0000000000..8879d6481b --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts @@ -0,0 +1,87 @@ +import { + type LanguageModelV2CallOptions, + type LanguageModelV2CallWarning, + UnsupportedFunctionalityError, +} from "@ai-sdk/provider" + +export function prepareTools({ + tools, + toolChoice, +}: { + tools: LanguageModelV2CallOptions["tools"] + toolChoice?: LanguageModelV2CallOptions["toolChoice"] +}): { + tools: + | undefined + | Array<{ + type: "function" + function: { + name: string + description: string | undefined + parameters: unknown + } + }> + toolChoice: { type: "function"; function: { name: string } } | "auto" | "none" | "required" | undefined + toolWarnings: LanguageModelV2CallWarning[] +} { + // when the tools array is empty, change it to undefined to prevent errors: + tools = tools?.length ? tools : undefined + + const toolWarnings: LanguageModelV2CallWarning[] = [] + + if (tools == null) { + return { tools: undefined, toolChoice: undefined, toolWarnings } + } + + const openaiCompatTools: Array<{ + type: "function" + function: { + name: string + description: string | undefined + parameters: unknown + } + }> = [] + + for (const tool of tools) { + if (tool.type === "provider-defined") { + toolWarnings.push({ type: "unsupported-tool", tool }) + } else { + openaiCompatTools.push({ + type: "function", + function: { + name: tool.name, + description: tool.description, + parameters: tool.inputSchema, + }, + }) + } + } + + if (toolChoice == null) { + return { tools: openaiCompatTools, toolChoice: undefined, toolWarnings } + } + + const type = toolChoice.type + + switch (type) { + case "auto": + case "none": + case "required": + return { tools: openaiCompatTools, toolChoice: type, toolWarnings } + case "tool": + return { + tools: openaiCompatTools, + toolChoice: { + type: "function", + function: { name: toolChoice.toolName }, + }, + toolWarnings, + } + default: { + const _exhaustiveCheck: never = type + throw new UnsupportedFunctionalityError({ + functionality: `tool choice type: ${_exhaustiveCheck}`, + }) + } + } +} diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts b/packages/opencode/src/provider/sdk/copilot/copilot-provider.ts similarity index 96% rename from packages/opencode/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts rename to packages/opencode/src/provider/sdk/copilot/copilot-provider.ts index e71658c2fa..1dc373ff3c 100644 --- a/packages/opencode/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +++ b/packages/opencode/src/provider/sdk/copilot/copilot-provider.ts @@ -1,6 +1,6 @@ import type { LanguageModelV2 } from "@ai-sdk/provider" -import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible" import { type FetchFunction, withoutTrailingSlash, withUserAgentSuffix } from "@ai-sdk/provider-utils" +import { OpenAICompatibleChatLanguageModel } from "./chat/openai-compatible-chat-language-model" import { OpenAIResponsesLanguageModel } from "./responses/openai-responses-language-model" // Import the version or define it diff --git a/packages/opencode/src/provider/sdk/copilot/index.ts b/packages/opencode/src/provider/sdk/copilot/index.ts new file mode 100644 index 0000000000..4da9cc21f4 --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/index.ts @@ -0,0 +1,2 @@ +export { createOpenaiCompatible, openaiCompatible } from "./copilot-provider" +export type { OpenaiCompatibleProvider, OpenaiCompatibleProviderSettings } from "./copilot-provider" diff --git a/packages/opencode/src/provider/sdk/copilot/openai-compatible-error.ts b/packages/opencode/src/provider/sdk/copilot/openai-compatible-error.ts new file mode 100644 index 0000000000..054c694dd3 --- /dev/null +++ b/packages/opencode/src/provider/sdk/copilot/openai-compatible-error.ts @@ -0,0 +1,27 @@ +import { z, type ZodType } from "zod/v4" + +export const openaiCompatibleErrorDataSchema = z.object({ + error: z.object({ + message: z.string(), + + // The additional information below is handled loosely to support + // OpenAI-compatible providers that have slightly different error + // responses: + type: z.string().nullish(), + param: z.any().nullish(), + code: z.union([z.string(), z.number()]).nullish(), + }), +}) + +export type OpenAICompatibleErrorData = z.infer + +export type ProviderErrorStructure = { + errorSchema: ZodType + errorToMessage: (error: T) => string + isRetryable?: (response: Response, error?: T) => boolean +} + +export const defaultOpenAICompatibleErrorStructure: ProviderErrorStructure = { + errorSchema: openaiCompatibleErrorDataSchema, + errorToMessage: (data) => data.error.message, +} diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts b/packages/opencode/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts similarity index 99% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts rename to packages/opencode/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts index b53da11216..807f6ea57c 100644 --- a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +++ b/packages/opencode/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts @@ -183,7 +183,7 @@ export async function convertToOpenAIResponsesInput({ case "reasoning": { const providerOptions = await parseProviderOptions({ - provider: "openai", + provider: "copilot", providerOptions: part.providerOptions, schema: openaiResponsesReasoningProviderOptionsSchema, }) diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts b/packages/opencode/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts rename to packages/opencode/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-config.ts b/packages/opencode/src/provider/sdk/copilot/responses/openai-config.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-config.ts rename to packages/opencode/src/provider/sdk/copilot/responses/openai-config.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-error.ts b/packages/opencode/src/provider/sdk/copilot/responses/openai-error.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-error.ts rename to packages/opencode/src/provider/sdk/copilot/responses/openai-error.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts b/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-api-types.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts rename to packages/opencode/src/provider/sdk/copilot/responses/openai-responses-api-types.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts b/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-language-model.ts similarity index 99% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts rename to packages/opencode/src/provider/sdk/copilot/responses/openai-responses-language-model.ts index 0990b7e007..0a575bc02b 100644 --- a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +++ b/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-language-model.ts @@ -194,7 +194,7 @@ export class OpenAIResponsesLanguageModel implements LanguageModelV2 { } const openaiOptions = await parseProviderOptions({ - provider: "openai", + provider: "copilot", providerOptions, schema: openaiResponsesProviderOptionsSchema, }) diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts b/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts rename to packages/opencode/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts b/packages/opencode/src/provider/sdk/copilot/responses/openai-responses-settings.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts rename to packages/opencode/src/provider/sdk/copilot/responses/openai-responses-settings.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts b/packages/opencode/src/provider/sdk/copilot/responses/tool/code-interpreter.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts rename to packages/opencode/src/provider/sdk/copilot/responses/tool/code-interpreter.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts b/packages/opencode/src/provider/sdk/copilot/responses/tool/file-search.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts rename to packages/opencode/src/provider/sdk/copilot/responses/tool/file-search.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts b/packages/opencode/src/provider/sdk/copilot/responses/tool/image-generation.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts rename to packages/opencode/src/provider/sdk/copilot/responses/tool/image-generation.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts b/packages/opencode/src/provider/sdk/copilot/responses/tool/local-shell.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts rename to packages/opencode/src/provider/sdk/copilot/responses/tool/local-shell.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts b/packages/opencode/src/provider/sdk/copilot/responses/tool/web-search-preview.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts rename to packages/opencode/src/provider/sdk/copilot/responses/tool/web-search-preview.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts b/packages/opencode/src/provider/sdk/copilot/responses/tool/web-search.ts similarity index 100% rename from packages/opencode/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts rename to packages/opencode/src/provider/sdk/copilot/responses/tool/web-search.ts diff --git a/packages/opencode/src/provider/sdk/openai-compatible/src/index.ts b/packages/opencode/src/provider/sdk/openai-compatible/src/index.ts deleted file mode 100644 index a3435c53e1..0000000000 --- a/packages/opencode/src/provider/sdk/openai-compatible/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { createOpenaiCompatible, openaiCompatible } from "./openai-compatible-provider" -export type { OpenaiCompatibleProvider, OpenaiCompatibleProviderSettings } from "./openai-compatible-provider" diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index dcc2605ab6..05e2272415 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -20,6 +20,7 @@ export namespace ProviderTransform { function sdkKey(npm: string): string | undefined { switch (npm) { case "@ai-sdk/github-copilot": + return "copilot" case "@ai-sdk/openai": case "@ai-sdk/azure": return "openai" @@ -82,7 +83,11 @@ export namespace ProviderTransform { return msg }) } - if (model.providerID === "mistral" || model.api.id.toLowerCase().includes("mistral")) { + if ( + model.providerID === "mistral" || + model.api.id.toLowerCase().includes("mistral") || + model.api.id.toLocaleLowerCase().includes("devstral") + ) { const result: ModelMessage[] = [] for (let i = 0; i < msgs.length; i++) { const msg = msgs[i] @@ -179,6 +184,9 @@ export namespace ProviderTransform { openaiCompatible: { cache_control: { type: "ephemeral" }, }, + copilot: { + copilot_cache_control: { type: "ephemeral" }, + }, } for (const msg of unique([...system, ...final])) { @@ -353,6 +361,15 @@ export namespace ProviderTransform { return Object.fromEntries(OPENAI_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }])) case "@ai-sdk/github-copilot": + if (model.id.includes("gemini")) { + // currently github copilot only returns thinking + return {} + } + if (model.id.includes("claude")) { + return { + thinking: { thinking_budget: 4000 }, + } + } const copilotEfforts = iife(() => { if (id.includes("5.1-codex-max") || id.includes("5.2")) return [...WIDELY_SUPPORTED_EFFORTS, "xhigh"] return WIDELY_SUPPORTED_EFFORTS @@ -377,6 +394,31 @@ export namespace ProviderTransform { case "@ai-sdk/deepinfra": // https://v5.ai-sdk.dev/providers/ai-sdk-providers/deepinfra case "@ai-sdk/openai-compatible": + // When using openai-compatible SDK with Claude/Anthropic models, + // we must use snake_case (budget_tokens) as the SDK doesn't convert parameter names + // and the OpenAI-compatible API spec uses snake_case + if ( + model.providerID === "anthropic" || + model.api.id.includes("anthropic") || + model.api.id.includes("claude") || + model.id.includes("anthropic") || + model.id.includes("claude") + ) { + return { + high: { + thinking: { + type: "enabled", + budget_tokens: 16000, + }, + }, + max: { + thinking: { + type: "enabled", + budget_tokens: 31999, + }, + }, + } + } return Object.fromEntries(WIDELY_SUPPORTED_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }])) case "@ai-sdk/azure": @@ -656,9 +698,21 @@ export namespace ProviderTransform { const modelCap = modelLimit || globalLimit const standardLimit = Math.min(modelCap, globalLimit) - if (npm === "@ai-sdk/anthropic" || npm === "@ai-sdk/google-vertex/anthropic") { + // Handle thinking mode for @ai-sdk/anthropic, @ai-sdk/google-vertex/anthropic (budgetTokens) + // and @ai-sdk/openai-compatible with Claude (budget_tokens) + if ( + npm === "@ai-sdk/anthropic" || + npm === "@ai-sdk/google-vertex/anthropic" || + npm === "@ai-sdk/openai-compatible" + ) { const thinking = options?.["thinking"] - const budgetTokens = typeof thinking?.["budgetTokens"] === "number" ? thinking["budgetTokens"] : 0 + // Support both camelCase (for @ai-sdk/anthropic) and snake_case (for openai-compatible) + const budgetTokens = + typeof thinking?.["budgetTokens"] === "number" + ? thinking["budgetTokens"] + : typeof thinking?.["budget_tokens"] === "number" + ? thinking["budget_tokens"] + : 0 const enabled = thinking?.["type"] === "enabled" if (enabled && budgetTokens > 0) { // Return text tokens so that text + thinking <= model cap, preferring 32k text when possible. diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index 0c76521045..befa46fe4a 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -148,14 +148,15 @@ export namespace LLM { }, ) - const maxOutputTokens = isCodex - ? undefined - : ProviderTransform.maxOutputTokens( - input.model.api.npm, - params.options, - input.model.limit.output, - OUTPUT_TOKEN_MAX, - ) + const maxOutputTokens = + isCodex || provider.id.includes("github-copilot") + ? undefined + : ProviderTransform.maxOutputTokens( + input.model.api.npm, + params.options, + input.model.limit.output, + OUTPUT_TOKEN_MAX, + ) const tools = await resolveTools(input) diff --git a/packages/opencode/src/skill/skill.ts b/packages/opencode/src/skill/skill.ts index 5b300a9287..6e05d013ae 100644 --- a/packages/opencode/src/skill/skill.ts +++ b/packages/opencode/src/skill/skill.ts @@ -18,6 +18,7 @@ export namespace Skill { name: z.string(), description: z.string(), location: z.string(), + content: z.string(), }) export type Info = z.infer @@ -74,6 +75,7 @@ export namespace Skill { name: parsed.data.name, description: parsed.data.description, location: match, + content: md.content, } } diff --git a/packages/opencode/src/tool/grep.ts b/packages/opencode/src/tool/grep.ts index 6cb70d022e..c10b4dfb88 100644 --- a/packages/opencode/src/tool/grep.ts +++ b/packages/opencode/src/tool/grep.ts @@ -37,15 +37,7 @@ export const GrepTool = Tool.define("grep", { await assertExternalDirectory(ctx, searchPath, { kind: "directory" }) const rgPath = await Ripgrep.filepath() - const args = [ - "-nH", - "--hidden", - "--follow", - "--no-messages", - "--field-match-separator=|", - "--regexp", - params.pattern, - ] + const args = ["-nH", "--hidden", "--no-messages", "--field-match-separator=|", "--regexp", params.pattern] if (params.include) { args.push("--glob", params.include) } diff --git a/packages/opencode/src/tool/skill.ts b/packages/opencode/src/tool/skill.ts index 76d9fd535e..8f285d5999 100644 --- a/packages/opencode/src/tool/skill.ts +++ b/packages/opencode/src/tool/skill.ts @@ -2,7 +2,6 @@ import path from "path" import z from "zod" import { Tool } from "./tool" import { Skill } from "../skill" -import { ConfigMarkdown } from "../config/markdown" import { PermissionNext } from "../permission/next" export const SkillTool = Tool.define("skill", async (ctx) => { @@ -62,7 +61,7 @@ export const SkillTool = Tool.define("skill", async (ctx) => { always: [params.name], metadata: {}, }) - const content = (await ConfigMarkdown.parse(skill.location)).content + const content = skill.content const dir = path.dirname(skill.location) // Format output similar to plugin pattern diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts index c1b03ea821..f0d0272aff 100644 --- a/packages/opencode/test/preload.ts +++ b/packages/opencode/test/preload.ts @@ -25,6 +25,7 @@ process.env["XDG_DATA_HOME"] = path.join(dir, "share") process.env["XDG_CACHE_HOME"] = path.join(dir, "cache") process.env["XDG_CONFIG_HOME"] = path.join(dir, "config") process.env["XDG_STATE_HOME"] = path.join(dir, "state") +process.env["OPENCODE_MODELS_PATH"] = path.join(import.meta.dir, "tool", "fixtures", "models-api.json") // Write the cache version file to prevent global/index.ts from clearing the cache const cacheDir = path.join(dir, "cache", "opencode") diff --git a/packages/opencode/test/provider/copilot/convert-to-copilot-messages.test.ts b/packages/opencode/test/provider/copilot/convert-to-copilot-messages.test.ts new file mode 100644 index 0000000000..ffc7469115 --- /dev/null +++ b/packages/opencode/test/provider/copilot/convert-to-copilot-messages.test.ts @@ -0,0 +1,478 @@ +import { convertToOpenAICompatibleChatMessages as convertToCopilotMessages } from "@/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages" +import { describe, test, expect } from "bun:test" + +describe("user messages", () => { + test("should convert messages with only a text part to a string content", () => { + const result = convertToCopilotMessages([ + { + role: "user", + content: [{ type: "text", text: "Hello" }], + }, + ]) + + expect(result).toEqual([{ role: "user", content: "Hello" }]) + }) + + test("should convert messages with image parts", () => { + const result = convertToCopilotMessages([ + { + role: "user", + content: [ + { type: "text", text: "Hello" }, + { + type: "file", + data: Buffer.from([0, 1, 2, 3]).toString("base64"), + mediaType: "image/png", + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "user", + content: [ + { type: "text", text: "Hello" }, + { + type: "image_url", + image_url: { url: "data:image/png;base64,AAECAw==" }, + }, + ], + }, + ]) + }) + + test("should convert messages with image parts from Uint8Array", () => { + const result = convertToCopilotMessages([ + { + role: "user", + content: [ + { type: "text", text: "Hi" }, + { + type: "file", + data: new Uint8Array([0, 1, 2, 3]), + mediaType: "image/png", + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "user", + content: [ + { type: "text", text: "Hi" }, + { + type: "image_url", + image_url: { url: "data:image/png;base64,AAECAw==" }, + }, + ], + }, + ]) + }) + + test("should handle URL-based images", () => { + const result = convertToCopilotMessages([ + { + role: "user", + content: [ + { + type: "file", + data: new URL("https://example.com/image.jpg"), + mediaType: "image/*", + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "user", + content: [ + { + type: "image_url", + image_url: { url: "https://example.com/image.jpg" }, + }, + ], + }, + ]) + }) + + test("should handle multiple text parts without flattening", () => { + const result = convertToCopilotMessages([ + { + role: "user", + content: [ + { type: "text", text: "Part 1" }, + { type: "text", text: "Part 2" }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "user", + content: [ + { type: "text", text: "Part 1" }, + { type: "text", text: "Part 2" }, + ], + }, + ]) + }) +}) + +describe("assistant messages", () => { + test("should convert assistant text messages", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [{ type: "text", text: "Hello back!" }], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: "Hello back!", + tool_calls: undefined, + reasoning_text: undefined, + reasoning_opaque: undefined, + }, + ]) + }) + + test("should handle assistant message with null content when only tool calls", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { + type: "tool-call", + toolCallId: "call1", + toolName: "calculator", + input: { a: 1, b: 2 }, + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: null, + tool_calls: [ + { + id: "call1", + type: "function", + function: { + name: "calculator", + arguments: JSON.stringify({ a: 1, b: 2 }), + }, + }, + ], + reasoning_text: undefined, + reasoning_opaque: undefined, + }, + ]) + }) + + test("should concatenate multiple text parts", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { type: "text", text: "First part. " }, + { type: "text", text: "Second part." }, + ], + }, + ]) + + expect(result[0].content).toBe("First part. Second part.") + }) +}) + +describe("tool calls", () => { + test("should stringify arguments to tool calls", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { + type: "tool-call", + input: { foo: "bar123" }, + toolCallId: "quux", + toolName: "thwomp", + }, + ], + }, + { + role: "tool", + content: [ + { + type: "tool-result", + toolCallId: "quux", + toolName: "thwomp", + output: { type: "json", value: { oof: "321rab" } }, + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: null, + tool_calls: [ + { + id: "quux", + type: "function", + function: { + name: "thwomp", + arguments: JSON.stringify({ foo: "bar123" }), + }, + }, + ], + reasoning_text: undefined, + reasoning_opaque: undefined, + }, + { + role: "tool", + tool_call_id: "quux", + content: JSON.stringify({ oof: "321rab" }), + }, + ]) + }) + + test("should handle text output type in tool results", () => { + const result = convertToCopilotMessages([ + { + role: "tool", + content: [ + { + type: "tool-result", + toolCallId: "call-1", + toolName: "getWeather", + output: { type: "text", value: "It is sunny today" }, + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "tool", + tool_call_id: "call-1", + content: "It is sunny today", + }, + ]) + }) + + test("should handle multiple tool results as separate messages", () => { + const result = convertToCopilotMessages([ + { + role: "tool", + content: [ + { + type: "tool-result", + toolCallId: "call1", + toolName: "api1", + output: { type: "text", value: "Result 1" }, + }, + { + type: "tool-result", + toolCallId: "call2", + toolName: "api2", + output: { type: "text", value: "Result 2" }, + }, + ], + }, + ]) + + expect(result).toHaveLength(2) + expect(result[0]).toEqual({ + role: "tool", + tool_call_id: "call1", + content: "Result 1", + }) + expect(result[1]).toEqual({ + role: "tool", + tool_call_id: "call2", + content: "Result 2", + }) + }) + + test("should handle text plus multiple tool calls", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { type: "text", text: "Checking... " }, + { + type: "tool-call", + toolCallId: "call1", + toolName: "searchTool", + input: { query: "Weather" }, + }, + { type: "text", text: "Almost there..." }, + { + type: "tool-call", + toolCallId: "call2", + toolName: "mapsTool", + input: { location: "Paris" }, + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: "Checking... Almost there...", + tool_calls: [ + { + id: "call1", + type: "function", + function: { + name: "searchTool", + arguments: JSON.stringify({ query: "Weather" }), + }, + }, + { + id: "call2", + type: "function", + function: { + name: "mapsTool", + arguments: JSON.stringify({ location: "Paris" }), + }, + }, + ], + reasoning_text: undefined, + reasoning_opaque: undefined, + }, + ]) + }) +}) + +describe("reasoning (copilot-specific)", () => { + test("should include reasoning_text from reasoning part", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { type: "reasoning", text: "Let me think about this..." }, + { type: "text", text: "The answer is 42." }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: "The answer is 42.", + tool_calls: undefined, + reasoning_text: "Let me think about this...", + reasoning_opaque: undefined, + }, + ]) + }) + + test("should include reasoning_opaque from providerOptions", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { + type: "reasoning", + text: "Thinking...", + providerOptions: { + copilot: { reasoningOpaque: "opaque-signature-123" }, + }, + }, + { type: "text", text: "Done!" }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: "Done!", + tool_calls: undefined, + reasoning_text: "Thinking...", + reasoning_opaque: "opaque-signature-123", + }, + ]) + }) + + test("should handle reasoning-only assistant message", () => { + const result = convertToCopilotMessages([ + { + role: "assistant", + content: [ + { + type: "reasoning", + text: "Just thinking, no response yet", + providerOptions: { + copilot: { reasoningOpaque: "sig-abc" }, + }, + }, + ], + }, + ]) + + expect(result).toEqual([ + { + role: "assistant", + content: null, + tool_calls: undefined, + reasoning_text: "Just thinking, no response yet", + reasoning_opaque: "sig-abc", + }, + ]) + }) +}) + +describe("full conversation", () => { + test("should convert a multi-turn conversation with reasoning", () => { + const result = convertToCopilotMessages([ + { + role: "system", + content: "You are a helpful assistant.", + }, + { + role: "user", + content: [{ type: "text", text: "What is 2+2?" }], + }, + { + role: "assistant", + content: [ + { + type: "reasoning", + text: "Let me calculate 2+2...", + providerOptions: { + copilot: { reasoningOpaque: "sig-abc" }, + }, + }, + { type: "text", text: "2+2 equals 4." }, + ], + }, + { + role: "user", + content: [{ type: "text", text: "What about 3+3?" }], + }, + ]) + + expect(result).toHaveLength(4) + + const systemMsg = result[0] + expect(systemMsg.role).toBe("system") + + // Assistant message should have reasoning fields + const assistantMsg = result[2] as { + reasoning_text?: string + reasoning_opaque?: string + } + expect(assistantMsg.reasoning_text).toBe("Let me calculate 2+2...") + expect(assistantMsg.reasoning_opaque).toBe("sig-abc") + }) +}) diff --git a/packages/opencode/test/provider/copilot/copilot-chat-model.test.ts b/packages/opencode/test/provider/copilot/copilot-chat-model.test.ts new file mode 100644 index 0000000000..0b82c18684 --- /dev/null +++ b/packages/opencode/test/provider/copilot/copilot-chat-model.test.ts @@ -0,0 +1,557 @@ +import { OpenAICompatibleChatLanguageModel } from "@/provider/sdk/copilot/chat/openai-compatible-chat-language-model" +import { describe, test, expect, mock } from "bun:test" +import type { LanguageModelV2Prompt } from "@ai-sdk/provider" + +async function convertReadableStreamToArray(stream: ReadableStream): Promise { + const reader = stream.getReader() + const result: T[] = [] + while (true) { + const { done, value } = await reader.read() + if (done) break + result.push(value) + } + return result +} + +const TEST_PROMPT: LanguageModelV2Prompt = [{ role: "user", content: [{ type: "text", text: "Hello" }] }] + +// Fixtures from copilot_test.exs +const FIXTURES = { + basicText: [ + `data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"gemini-2.0-flash-001","choices":[{"index":0,"delta":{"role":"assistant","content":"Hello"},"finish_reason":null}]}`, + `data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"gemini-2.0-flash-001","choices":[{"index":0,"delta":{"content":" world"},"finish_reason":null}]}`, + `data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"gemini-2.0-flash-001","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":"stop"}]}`, + `data: [DONE]`, + ], + + reasoningWithToolCalls: [ + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Understanding Dayzee's Purpose**\\n\\nI'm starting to get a better handle on \`dayzee\`.\\n\\n"}}],"created":1764940861,"id":"OdwyabKMI9yel7oPlbzgwQM","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Assessing Dayzee's Functionality**\\n\\nI've reviewed the files.\\n\\n"}}],"created":1764940862,"id":"OdwyabKMI9yel7oPlbzgwQM","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\\"filePath\\":\\"/README.md\\"}","name":"read_file"},"id":"call_abc123","index":0,"type":"function"}],"reasoning_opaque":"4CUQ6696CwSXOdQ5rtvDimqA91tBzfmga4ieRbmZ5P67T2NLW3"}}],"created":1764940862,"id":"OdwyabKMI9yel7oPlbzgwQM","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"finish_reason":"tool_calls","index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\\"filePath\\":\\"/mix.exs\\"}","name":"read_file"},"id":"call_def456","index":1,"type":"function"}]}}],"created":1764940862,"id":"OdwyabKMI9yel7oPlbzgwQM","usage":{"completion_tokens":53,"prompt_tokens":19581,"prompt_tokens_details":{"cached_tokens":17068},"total_tokens":19768,"reasoning_tokens":134},"model":"gemini-3-pro-preview"}`, + `data: [DONE]`, + ], + + reasoningWithOpaqueAtEnd: [ + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Analyzing the Inquiry's Nature**\\n\\nI'm currently parsing the user's question.\\n\\n"}}],"created":1765201729,"id":"Ptc2afqsCIHqlOoP653UiAI","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Reconciling User's Input**\\n\\nI'm grappling with the context.\\n\\n"}}],"created":1765201730,"id":"Ptc2afqsCIHqlOoP653UiAI","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"index":0,"delta":{"content":"I am Tidewave, a highly skilled AI coding agent.\\n\\n","role":"assistant"}}],"created":1765201730,"id":"Ptc2afqsCIHqlOoP653UiAI","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"finish_reason":"stop","index":0,"delta":{"content":"How can I help you?","role":"assistant","reasoning_opaque":"/PMlTqxqSJZnUBDHgnnJKLVI4eZQ"}}],"created":1765201730,"id":"Ptc2afqsCIHqlOoP653UiAI","usage":{"completion_tokens":59,"prompt_tokens":5778,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":5932,"reasoning_tokens":95},"model":"gemini-3-pro-preview"}`, + `data: [DONE]`, + ], + + // Case where reasoning_opaque and content come in the SAME chunk + reasoningWithOpaqueAndContentSameChunk: [ + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Understanding the Query's Nature**\\n\\nI'm currently grappling with the user's philosophical query.\\n\\n"}}],"created":1766062103,"id":"FPhDacixL9zrlOoPqLSuyQ4","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-2.5-pro"}`, + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Framing the Response's Core**\\n\\nNow, I'm structuring my response.\\n\\n"}}],"created":1766062103,"id":"FPhDacixL9zrlOoPqLSuyQ4","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-2.5-pro"}`, + `data: {"choices":[{"index":0,"delta":{"content":"Of course. I'm thinking right now.","role":"assistant","reasoning_opaque":"ExXaGwW7jBo39OXRe9EPoFGN1rOtLJBx"}}],"created":1766062103,"id":"FPhDacixL9zrlOoPqLSuyQ4","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-2.5-pro"}`, + `data: {"choices":[{"finish_reason":"stop","index":0,"delta":{"content":" What's on your mind?","role":"assistant"}}],"created":1766062103,"id":"FPhDacixL9zrlOoPqLSuyQ4","usage":{"completion_tokens":78,"prompt_tokens":3767,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":3915,"reasoning_tokens":70},"model":"gemini-2.5-pro"}`, + `data: [DONE]`, + ], + + // Case where reasoning_opaque and content come in same chunk, followed by tool calls + reasoningWithOpaqueContentAndToolCalls: [ + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Analyzing the Structure**\\n\\nI'm currently trying to get a handle on the project's layout. My initial focus is on the file structure itself, specifically the directory organization. I'm hoping this will illuminate how different components interact. I'll need to identify the key modules and their dependencies.\\n\\n\\n"}}],"created":1766066995,"id":"MQtEafqbFYTZsbwPwuCVoAg","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-2.5-pro"}`, + `data: {"choices":[{"index":0,"delta":{"content":"Okay, I need to check out the project's file structure.","role":"assistant","reasoning_opaque":"WHOd3dYFnxEBOsKUXjbX6c2rJa0fS214FHbsj+A3Q+i63SFo7H/92RsownAzyo0h2qEy3cOcrvAatsMx51eCKiMSqt4dYWZhd5YVSgF0CehkpDbWBP/SoRqLU1dhCmUJV/6b5uYFBOzKLBGNadyhI7T1gWFlXntwc6SNjH6DujnFPeVr+L8DdOoUJGJrw2aOfm9NtkXA6wZh9t7dt+831yIIImjD9MHczuXoXj8K7tyLpIJ9KlVXMhnO4IKSYNdKRtoHlGTmudAp5MgH/vLWb6oSsL+ZJl/OdF3WBOeanGhYNoByCRDSvR7anAR/9m5zf9yUax+u/nFg+gzmhFacnzZGtSmcvJ4/4HWKNtUkRASTKeN94DXB8j1ptB/i6ldaMAz2ZyU+sbjPWI8aI4fKJ2MuO01u3uE87xVwpWiM+0rahIzJsllI5edwOaOFtF4tnlCTQafbxHwCZR62uON2E+IjGzW80MzyfYrbLBJKS5zTeHCgPYQSNaKzPfpzkQvdwo3JUnJYcEHgGeKzkq5sbvS5qitCYI7Xue0V98S6/KnUSPnDQBjNnas2i6BqJV2vuCEU/Y3ucrlKVbuRIFCZXCyLzrsGeRLRKlrf5S/HDAQ04IOPQVQhBPvhX0nDjhZB"}}],"created":1766066995,"id":"MQtEafqbFYTZsbwPwuCVoAg","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-2.5-pro"}`, + `data: {"choices":[{"finish_reason":"tool_calls","index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{}","name":"list_project_files"},"id":"call_MHxqRDd5WVo3NU8wUXRaMmc0MFE","index":0,"type":"function"}]}}],"created":1766066995,"id":"MQtEafqbFYTZsbwPwuCVoAg","usage":{"completion_tokens":19,"prompt_tokens":3767,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":3797,"reasoning_tokens":11},"model":"gemini-2.5-pro"}`, + `data: [DONE]`, + ], + + // Case where reasoning goes directly to tool_calls with NO content + // reasoning_opaque and tool_calls come in the same chunk + reasoningDirectlyToToolCalls: [ + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Executing and Analyzing HTML**\\n\\nI've successfully captured the HTML snapshot using the \`browser_eval\` tool, giving me a solid understanding of the page structure. Now, I'm shifting focus to Elixir code execution with \`project_eval\` to assess my ability to work within the project's environment.\\n\\n\\n"}}],"created":1766068643,"id":"oBFEaafzD9DVlOoPkY3l4Qs","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"index":0,"delta":{"content":null,"role":"assistant","reasoning_text":"**Testing Project Contexts**\\n\\nI've got the HTML body snapshot from \`browser_eval\`, which is a helpful reference. Next, I'm testing my ability to run Elixir code in the project with \`project_eval\`. I'm starting with a simple sum: \`1 + 1\`. This will confirm I'm set up to interact with the project's codebase.\\n\\n\\n"}}],"created":1766068644,"id":"oBFEaafzD9DVlOoPkY3l4Qs","usage":{"completion_tokens":0,"prompt_tokens":0,"prompt_tokens_details":{"cached_tokens":0},"total_tokens":0,"reasoning_tokens":0},"model":"gemini-3-pro-preview"}`, + `data: {"choices":[{"finish_reason":"tool_calls","index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\\"code\\":\\"1 + 1\\"}","name":"project_eval"},"id":"call_MHw3RDhmT1J5Z3B6WlhpVjlveTc","index":0,"type":"function"}],"reasoning_opaque":"ytGNWFf2doK38peANDvm7whkLPKrd+Fv6/k34zEPBF6Qwitj4bTZT0FBXleydLb6"}}],"created":1766068644,"id":"oBFEaafzD9DVlOoPkY3l4Qs","usage":{"completion_tokens":12,"prompt_tokens":8677,"prompt_tokens_details":{"cached_tokens":3692},"total_tokens":8768,"reasoning_tokens":79},"model":"gemini-3-pro-preview"}`, + `data: [DONE]`, + ], +} + +function createMockFetch(chunks: string[]) { + return mock(async () => { + const body = new ReadableStream({ + start(controller) { + for (const chunk of chunks) { + controller.enqueue(new TextEncoder().encode(chunk + "\n\n")) + } + controller.close() + }, + }) + + return new Response(body, { + status: 200, + headers: { "Content-Type": "text/event-stream" }, + }) + }) +} + +function createModel(fetchFn: ReturnType) { + return new OpenAICompatibleChatLanguageModel("test-model", { + provider: "copilot.chat", + url: () => "https://api.test.com/chat/completions", + headers: () => ({ Authorization: "Bearer test-token" }), + fetch: fetchFn as any, + }) +} + +describe("doStream", () => { + test("should stream text deltas", async () => { + const mockFetch = createMockFetch(FIXTURES.basicText) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + // Filter to just the key events + const textParts = parts.filter( + (p) => p.type === "text-start" || p.type === "text-delta" || p.type === "text-end" || p.type === "finish", + ) + + expect(textParts).toMatchObject([ + { type: "text-start", id: "txt-0" }, + { type: "text-delta", id: "txt-0", delta: "Hello" }, + { type: "text-delta", id: "txt-0", delta: " world" }, + { type: "text-delta", id: "txt-0", delta: "!" }, + { type: "text-end", id: "txt-0" }, + { type: "finish", finishReason: "stop" }, + ]) + }) + + test("should stream reasoning with tool calls and capture reasoning_opaque", async () => { + const mockFetch = createMockFetch(FIXTURES.reasoningWithToolCalls) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + // Check reasoning parts + const reasoningParts = parts.filter( + (p) => p.type === "reasoning-start" || p.type === "reasoning-delta" || p.type === "reasoning-end", + ) + + expect(reasoningParts[0]).toEqual({ + type: "reasoning-start", + id: "reasoning-0", + }) + + expect(reasoningParts[1]).toMatchObject({ + type: "reasoning-delta", + id: "reasoning-0", + }) + expect((reasoningParts[1] as { delta: string }).delta).toContain("**Understanding Dayzee's Purpose**") + + expect(reasoningParts[2]).toMatchObject({ + type: "reasoning-delta", + id: "reasoning-0", + }) + expect((reasoningParts[2] as { delta: string }).delta).toContain("**Assessing Dayzee's Functionality**") + + // reasoning_opaque should be in reasoning-end providerMetadata + const reasoningEnd = reasoningParts.find((p) => p.type === "reasoning-end") + expect(reasoningEnd).toMatchObject({ + type: "reasoning-end", + id: "reasoning-0", + providerMetadata: { + copilot: { + reasoningOpaque: "4CUQ6696CwSXOdQ5rtvDimqA91tBzfmga4ieRbmZ5P67T2NLW3", + }, + }, + }) + + // Check tool calls + const toolParts = parts.filter( + (p) => p.type === "tool-input-start" || p.type === "tool-call" || p.type === "tool-input-end", + ) + + expect(toolParts).toContainEqual({ + type: "tool-input-start", + id: "call_abc123", + toolName: "read_file", + }) + + expect(toolParts).toContainEqual( + expect.objectContaining({ + type: "tool-call", + toolCallId: "call_abc123", + toolName: "read_file", + }), + ) + + expect(toolParts).toContainEqual({ + type: "tool-input-start", + id: "call_def456", + toolName: "read_file", + }) + + // Check finish + const finish = parts.find((p) => p.type === "finish") + expect(finish).toMatchObject({ + type: "finish", + finishReason: "tool-calls", + usage: { + inputTokens: 19581, + outputTokens: 53, + }, + }) + }) + + test("should handle reasoning_opaque that comes at end with text in between", async () => { + const mockFetch = createMockFetch(FIXTURES.reasoningWithOpaqueAtEnd) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + // Check that reasoning comes first + const reasoningStart = parts.findIndex((p) => p.type === "reasoning-start") + const textStart = parts.findIndex((p) => p.type === "text-start") + expect(reasoningStart).toBeLessThan(textStart) + + // Check reasoning deltas + const reasoningDeltas = parts.filter((p) => p.type === "reasoning-delta") + expect(reasoningDeltas).toHaveLength(2) + expect((reasoningDeltas[0] as { delta: string }).delta).toContain("**Analyzing the Inquiry's Nature**") + expect((reasoningDeltas[1] as { delta: string }).delta).toContain("**Reconciling User's Input**") + + // Check text deltas + const textDeltas = parts.filter((p) => p.type === "text-delta") + expect(textDeltas).toHaveLength(2) + expect((textDeltas[0] as { delta: string }).delta).toContain("I am Tidewave") + expect((textDeltas[1] as { delta: string }).delta).toContain("How can I help you?") + + // reasoning-end should be emitted before text-start + const reasoningEndIndex = parts.findIndex((p) => p.type === "reasoning-end") + const textStartIndex = parts.findIndex((p) => p.type === "text-start") + expect(reasoningEndIndex).toBeGreaterThan(-1) + expect(reasoningEndIndex).toBeLessThan(textStartIndex) + + // In this fixture, reasoning_opaque comes AFTER content has started (in chunk 4) + // So it arrives too late to be attached to reasoning-end. But it should still + // be captured and included in the finish event's providerMetadata. + const reasoningEnd = parts.find((p) => p.type === "reasoning-end") + expect(reasoningEnd).toMatchObject({ + type: "reasoning-end", + id: "reasoning-0", + }) + + // reasoning_opaque should be in the finish event's providerMetadata + const finish = parts.find((p) => p.type === "finish") + expect(finish).toMatchObject({ + type: "finish", + finishReason: "stop", + usage: { + inputTokens: 5778, + outputTokens: 59, + }, + providerMetadata: { + copilot: { + reasoningOpaque: "/PMlTqxqSJZnUBDHgnnJKLVI4eZQ", + }, + }, + }) + }) + + test("should handle reasoning_opaque and content in the same chunk", async () => { + const mockFetch = createMockFetch(FIXTURES.reasoningWithOpaqueAndContentSameChunk) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + // The critical test: reasoning-end should come BEFORE text-start + const reasoningEndIndex = parts.findIndex((p) => p.type === "reasoning-end") + const textStartIndex = parts.findIndex((p) => p.type === "text-start") + expect(reasoningEndIndex).toBeGreaterThan(-1) + expect(textStartIndex).toBeGreaterThan(-1) + expect(reasoningEndIndex).toBeLessThan(textStartIndex) + + // Check reasoning deltas + const reasoningDeltas = parts.filter((p) => p.type === "reasoning-delta") + expect(reasoningDeltas).toHaveLength(2) + expect((reasoningDeltas[0] as { delta: string }).delta).toContain("**Understanding the Query's Nature**") + expect((reasoningDeltas[1] as { delta: string }).delta).toContain("**Framing the Response's Core**") + + // reasoning_opaque should be in reasoning-end even though it came with content + const reasoningEnd = parts.find((p) => p.type === "reasoning-end") + expect(reasoningEnd).toMatchObject({ + type: "reasoning-end", + id: "reasoning-0", + providerMetadata: { + copilot: { + reasoningOpaque: "ExXaGwW7jBo39OXRe9EPoFGN1rOtLJBx", + }, + }, + }) + + // Check text deltas + const textDeltas = parts.filter((p) => p.type === "text-delta") + expect(textDeltas).toHaveLength(2) + expect((textDeltas[0] as { delta: string }).delta).toContain("Of course. I'm thinking right now.") + expect((textDeltas[1] as { delta: string }).delta).toContain("What's on your mind?") + + // Check finish + const finish = parts.find((p) => p.type === "finish") + expect(finish).toMatchObject({ + type: "finish", + finishReason: "stop", + }) + }) + + test("should handle reasoning_opaque and content followed by tool calls", async () => { + const mockFetch = createMockFetch(FIXTURES.reasoningWithOpaqueContentAndToolCalls) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + // Check that reasoning comes first, then text, then tool calls + const reasoningEndIndex = parts.findIndex((p) => p.type === "reasoning-end") + const textStartIndex = parts.findIndex((p) => p.type === "text-start") + const toolStartIndex = parts.findIndex((p) => p.type === "tool-input-start") + + expect(reasoningEndIndex).toBeGreaterThan(-1) + expect(textStartIndex).toBeGreaterThan(-1) + expect(toolStartIndex).toBeGreaterThan(-1) + expect(reasoningEndIndex).toBeLessThan(textStartIndex) + expect(textStartIndex).toBeLessThan(toolStartIndex) + + // Check reasoning content + const reasoningDeltas = parts.filter((p) => p.type === "reasoning-delta") + expect(reasoningDeltas).toHaveLength(1) + expect((reasoningDeltas[0] as { delta: string }).delta).toContain("**Analyzing the Structure**") + + // reasoning_opaque should be in reasoning-end (comes with content in same chunk) + const reasoningEnd = parts.find((p) => p.type === "reasoning-end") + expect(reasoningEnd).toMatchObject({ + type: "reasoning-end", + id: "reasoning-0", + providerMetadata: { + copilot: { + reasoningOpaque: expect.stringContaining("WHOd3dYFnxEBOsKUXjbX6c2rJa0fS214"), + }, + }, + }) + + // Check text content + const textDeltas = parts.filter((p) => p.type === "text-delta") + expect(textDeltas).toHaveLength(1) + expect((textDeltas[0] as { delta: string }).delta).toContain( + "Okay, I need to check out the project's file structure.", + ) + + // Check tool call + const toolParts = parts.filter( + (p) => p.type === "tool-input-start" || p.type === "tool-call" || p.type === "tool-input-end", + ) + + expect(toolParts).toContainEqual({ + type: "tool-input-start", + id: "call_MHxqRDd5WVo3NU8wUXRaMmc0MFE", + toolName: "list_project_files", + }) + + expect(toolParts).toContainEqual( + expect.objectContaining({ + type: "tool-call", + toolCallId: "call_MHxqRDd5WVo3NU8wUXRaMmc0MFE", + toolName: "list_project_files", + }), + ) + + // Check finish + const finish = parts.find((p) => p.type === "finish") + expect(finish).toMatchObject({ + type: "finish", + finishReason: "tool-calls", + usage: { + inputTokens: 3767, + outputTokens: 19, + }, + }) + }) + + test("should emit reasoning-end before tool-input-start when reasoning goes directly to tool calls", async () => { + const mockFetch = createMockFetch(FIXTURES.reasoningDirectlyToToolCalls) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + // Critical check: reasoning-end MUST come before tool-input-start + const reasoningEndIndex = parts.findIndex((p) => p.type === "reasoning-end") + const toolStartIndex = parts.findIndex((p) => p.type === "tool-input-start") + + expect(reasoningEndIndex).toBeGreaterThan(-1) + expect(toolStartIndex).toBeGreaterThan(-1) + expect(reasoningEndIndex).toBeLessThan(toolStartIndex) + + // Check reasoning parts + const reasoningDeltas = parts.filter((p) => p.type === "reasoning-delta") + expect(reasoningDeltas).toHaveLength(2) + expect((reasoningDeltas[0] as { delta: string }).delta).toContain("**Executing and Analyzing HTML**") + expect((reasoningDeltas[1] as { delta: string }).delta).toContain("**Testing Project Contexts**") + + // reasoning_opaque should be in reasoning-end providerMetadata + const reasoningEnd = parts.find((p) => p.type === "reasoning-end") + expect(reasoningEnd).toMatchObject({ + type: "reasoning-end", + id: "reasoning-0", + providerMetadata: { + copilot: { + reasoningOpaque: "ytGNWFf2doK38peANDvm7whkLPKrd+Fv6/k34zEPBF6Qwitj4bTZT0FBXleydLb6", + }, + }, + }) + + // No text parts should exist + const textParts = parts.filter((p) => p.type === "text-start" || p.type === "text-delta" || p.type === "text-end") + expect(textParts).toHaveLength(0) + + // Check tool call + const toolCall = parts.find((p) => p.type === "tool-call") + expect(toolCall).toMatchObject({ + type: "tool-call", + toolCallId: "call_MHw3RDhmT1J5Z3B6WlhpVjlveTc", + toolName: "project_eval", + }) + + // Check finish + const finish = parts.find((p) => p.type === "finish") + expect(finish).toMatchObject({ + type: "finish", + finishReason: "tool-calls", + }) + }) + + test("should include response metadata from first chunk", async () => { + const mockFetch = createMockFetch(FIXTURES.basicText) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + const metadata = parts.find((p) => p.type === "response-metadata") + expect(metadata).toMatchObject({ + type: "response-metadata", + id: "chatcmpl-123", + modelId: "gemini-2.0-flash-001", + }) + }) + + test("should emit stream-start with warnings", async () => { + const mockFetch = createMockFetch(FIXTURES.basicText) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: false, + }) + + const parts = await convertReadableStreamToArray(stream) + + const streamStart = parts.find((p) => p.type === "stream-start") + expect(streamStart).toEqual({ + type: "stream-start", + warnings: [], + }) + }) + + test("should include raw chunks when requested", async () => { + const mockFetch = createMockFetch(FIXTURES.basicText) + const model = createModel(mockFetch) + + const { stream } = await model.doStream({ + prompt: TEST_PROMPT, + includeRawChunks: true, + }) + + const parts = await convertReadableStreamToArray(stream) + + const rawChunks = parts.filter((p) => p.type === "raw") + expect(rawChunks.length).toBeGreaterThan(0) + }) +}) + +describe("request body", () => { + test("should send tools in OpenAI format", async () => { + let capturedBody: unknown + const mockFetch = mock(async (_url: string, init?: RequestInit) => { + capturedBody = JSON.parse(init?.body as string) + return new Response( + new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode(`data: [DONE]\n\n`)) + controller.close() + }, + }), + { status: 200, headers: { "Content-Type": "text/event-stream" } }, + ) + }) + + const model = createModel(mockFetch) + + await model.doStream({ + prompt: TEST_PROMPT, + tools: [ + { + type: "function", + name: "get_weather", + description: "Get the weather for a location", + inputSchema: { + type: "object", + properties: { + location: { type: "string" }, + }, + required: ["location"], + }, + }, + ], + includeRawChunks: false, + }) + + expect((capturedBody as { tools: unknown[] }).tools).toEqual([ + { + type: "function", + function: { + name: "get_weather", + description: "Get the weather for a location", + parameters: { + type: "object", + properties: { + location: { type: "string" }, + }, + required: ["location"], + }, + }, + }, + ]) + }) +}) diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index b818ab98cf..0973e61585 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -267,6 +267,76 @@ describe("ProviderTransform.maxOutputTokens", () => { expect(result).toBe(OUTPUT_TOKEN_MAX) }) }) + + describe("openai-compatible with thinking options (snake_case)", () => { + test("returns 32k when budget_tokens + 32k <= modelLimit", () => { + const modelLimit = 100000 + const options = { + thinking: { + type: "enabled", + budget_tokens: 10000, + }, + } + const result = ProviderTransform.maxOutputTokens( + "@ai-sdk/openai-compatible", + options, + modelLimit, + OUTPUT_TOKEN_MAX, + ) + expect(result).toBe(OUTPUT_TOKEN_MAX) + }) + + test("returns modelLimit - budget_tokens when budget_tokens + 32k > modelLimit", () => { + const modelLimit = 50000 + const options = { + thinking: { + type: "enabled", + budget_tokens: 30000, + }, + } + const result = ProviderTransform.maxOutputTokens( + "@ai-sdk/openai-compatible", + options, + modelLimit, + OUTPUT_TOKEN_MAX, + ) + expect(result).toBe(20000) + }) + + test("returns 32k when thinking type is not enabled", () => { + const modelLimit = 100000 + const options = { + thinking: { + type: "disabled", + budget_tokens: 10000, + }, + } + const result = ProviderTransform.maxOutputTokens( + "@ai-sdk/openai-compatible", + options, + modelLimit, + OUTPUT_TOKEN_MAX, + ) + expect(result).toBe(OUTPUT_TOKEN_MAX) + }) + + test("returns 32k when budget_tokens is 0", () => { + const modelLimit = 100000 + const options = { + thinking: { + type: "enabled", + budget_tokens: 0, + }, + } + const result = ProviderTransform.maxOutputTokens( + "@ai-sdk/openai-compatible", + options, + modelLimit, + OUTPUT_TOKEN_MAX, + ) + expect(result).toBe(OUTPUT_TOKEN_MAX) + }) + }) }) describe("ProviderTransform.schema - gemini array items", () => { @@ -1031,21 +1101,21 @@ describe("ProviderTransform.message - providerOptions key remapping", () => { expect(result[0].providerOptions?.openai).toBeUndefined() }) - test("openai with github-copilot npm remaps providerID to 'openai'", () => { + test("copilot remaps providerID to 'copilot' key", () => { const model = createModel("github-copilot", "@ai-sdk/github-copilot") const msgs = [ { role: "user", content: "Hello", providerOptions: { - "github-copilot": { someOption: "value" }, + copilot: { someOption: "value" }, }, }, ] as any[] const result = ProviderTransform.message(msgs, model, {}) - expect(result[0].providerOptions?.openai).toEqual({ someOption: "value" }) + expect(result[0].providerOptions?.copilot).toEqual({ someOption: "value" }) expect(result[0].providerOptions?.["github-copilot"]).toBeUndefined() }) @@ -1494,6 +1564,67 @@ describe("ProviderTransform.variants", () => { expect(result.low).toEqual({ reasoningEffort: "low" }) expect(result.high).toEqual({ reasoningEffort: "high" }) }) + + test("Claude via LiteLLM returns thinking with snake_case budget_tokens", () => { + const model = createMockModel({ + id: "anthropic/claude-sonnet-4-5", + providerID: "anthropic", + api: { + id: "claude-sonnet-4-5-20250929", + url: "http://localhost:4000", + npm: "@ai-sdk/openai-compatible", + }, + }) + const result = ProviderTransform.variants(model) + expect(Object.keys(result)).toEqual(["high", "max"]) + expect(result.high).toEqual({ + thinking: { + type: "enabled", + budget_tokens: 16000, + }, + }) + expect(result.max).toEqual({ + thinking: { + type: "enabled", + budget_tokens: 31999, + }, + }) + }) + + test("Claude model (by model.id) via openai-compatible uses snake_case", () => { + const model = createMockModel({ + id: "litellm/claude-3-opus", + providerID: "litellm", + api: { + id: "claude-3-opus-20240229", + url: "http://localhost:4000", + npm: "@ai-sdk/openai-compatible", + }, + }) + const result = ProviderTransform.variants(model) + expect(Object.keys(result)).toEqual(["high", "max"]) + expect(result.high).toEqual({ + thinking: { + type: "enabled", + budget_tokens: 16000, + }, + }) + }) + + test("Anthropic model (by model.api.id) via openai-compatible uses snake_case", () => { + const model = createMockModel({ + id: "custom/my-model", + providerID: "custom", + api: { + id: "anthropic.claude-sonnet", + url: "http://localhost:4000", + npm: "@ai-sdk/openai-compatible", + }, + }) + const result = ProviderTransform.variants(model) + expect(Object.keys(result)).toEqual(["high", "max"]) + expect(result.high.thinking.budget_tokens).toBe(16000) + }) }) describe("@ai-sdk/azure", () => { diff --git a/packages/opencode/test/session/llm.test.ts b/packages/opencode/test/session/llm.test.ts index 8bf710a9c3..1f7e17e1bd 100644 --- a/packages/opencode/test/session/llm.test.ts +++ b/packages/opencode/test/session/llm.test.ts @@ -197,12 +197,6 @@ async function loadFixture(providerID: string, modelID: string) { return { provider, model } } -async function writeModels(models: Record) { - const modelsPath = path.join(Global.Path.cache, "models.json") - await Bun.write(modelsPath, JSON.stringify(models)) - ModelsDev.Data.reset() -} - function createEventStream(chunks: unknown[], includeDone = false) { const lines = chunks.map((chunk) => `data: ${typeof chunk === "string" ? chunk : JSON.stringify(chunk)}`) if (includeDone) { @@ -246,8 +240,6 @@ describe("session.llm.stream", () => { }), ) - await writeModels({ [providerID]: provider }) - await using tmp = await tmpdir({ init: async (dir) => { await Bun.write( @@ -342,7 +334,7 @@ describe("session.llm.stream", () => { throw new Error("Server not initialized") } - const source = await loadFixture("github-copilot", "gpt-5.1") + const source = await loadFixture("openai", "gpt-5.2") const model = source.model const responseChunks = [ @@ -377,8 +369,6 @@ describe("session.llm.stream", () => { ] const request = waitRequest("/responses", createEventResponse(responseChunks, true)) - await writeModels({}) - await using tmp = await tmpdir({ init: async (dir) => { await Bun.write( @@ -513,8 +503,6 @@ describe("session.llm.stream", () => { ] const request = waitRequest("/messages", createEventResponse(chunks)) - await writeModels({ [providerID]: provider }) - await using tmp = await tmpdir({ init: async (dir) => { await Bun.write( @@ -623,8 +611,6 @@ describe("session.llm.stream", () => { ] const request = waitRequest(pathSuffix, createEventResponse(chunks)) - await writeModels({ [providerID]: provider }) - await using tmp = await tmpdir({ init: async (dir) => { await Bun.write( diff --git a/packages/opencode/test/tool/fixtures/models-api.json b/packages/opencode/test/tool/fixtures/models-api.json index 7f55e04a56..391e783699 100644 --- a/packages/opencode/test/tool/fixtures/models-api.json +++ b/packages/opencode/test/tool/fixtures/models-api.json @@ -1,4 +1,99 @@ { + "privatemode-ai": { + "id": "privatemode-ai", + "env": ["PRIVATEMODE_API_KEY", "PRIVATEMODE_ENDPOINT"], + "npm": "@ai-sdk/openai-compatible", + "api": "http://localhost:8080/v1", + "name": "Privatemode AI", + "doc": "https://docs.privatemode.ai/api/overview", + "models": { + "whisper-large-v3": { + "id": "whisper-large-v3", + "name": "Whisper large-v3", + "family": "whisper", + "attachment": true, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "knowledge": "2023-09", + "release_date": "2023-09-01", + "last_updated": "2023-09-01", + "modalities": { "input": ["audio"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 0, "output": 4096 } + }, + "qwen3-embedding-4b": { + "id": "qwen3-embedding-4b", + "name": "Qwen3-Embedding 4B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-06-06", + "last_updated": "2025-06-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32000, "output": 2560 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "gpt-oss-120b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-08", + "release_date": "2025-08-04", + "last_updated": "2025-08-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gemma-3-27b": { + "id": "gemma-3-27b", + "name": "Gemma 3 27B", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "qwen3-coder-30b-a3b": { + "id": "qwen3-coder-30b-a3b", + "name": "Qwen3-Coder 30B-A3B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 32768 } + } + } + }, "moonshotai-cn": { "id": "moonshotai-cn", "env": ["MOONSHOT_API_KEY"], @@ -7,42 +102,10 @@ "name": "Moonshot AI (China)", "doc": "https://platform.moonshot.cn/docs/api/chat", "models": { - "kimi-k2-thinking-turbo": { - "id": "kimi-k2-thinking-turbo", - "name": "Kimi K2 Thinking Turbo", - "family": "kimi-k2", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, - "limit": { "context": 262144, "output": 262144 } - }, - "kimi-k2-thinking": { - "id": "kimi-k2-thinking", - "name": "Kimi K2 Thinking", - "family": "kimi-k2", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2024-08", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, - "limit": { "context": 262144, "output": 262144 } - }, "kimi-k2-0905-preview": { "id": "kimi-k2-0905-preview", "name": "Kimi K2 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -55,10 +118,27 @@ "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, "limit": { "context": 262144, "output": 262144 } }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, "kimi-k2-0711-preview": { "id": "kimi-k2-0711-preview", "name": "Kimi K2 0711", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -71,10 +151,28 @@ "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, "limit": { "context": 131072, "output": 16384 } }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": false, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 } + }, "kimi-k2-turbo-preview": { "id": "kimi-k2-turbo-preview", "name": "Kimi K2 Turbo", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -86,6 +184,428 @@ "open_weights": true, "cost": { "input": 2.4, "output": 10, "cache_read": 0.6 }, "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2-thinking-turbo": { + "id": "kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + } + } + }, + "firmware": { + "id": "firmware", + "env": ["FIRMWARE_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://app.firmware.ai/api/v1", + "name": "Firmware", + "doc": "https://docs.firmware.ai", + "models": { + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "Grok 4 Fast (Non-Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "grok-4-fast-reasoning": { + "id": "grok-4-fast-reasoning", + "name": "Grok 4 Fast (Reasoning)", + "family": "grok", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text", "image", "video", "audio", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "grok-code-fast-1": { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1", + "family": "grok", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2023-10", + "release_date": "2025-08-28", + "last_updated": "2025-08-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 10000 } + }, + "claude-haiku-4-5": { + "id": "claude-haiku-4-5", + "name": "Claude Haiku 4.5", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-02-28", + "release_date": "2025-10-15", + "last_updated": "2025-10-15", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "kimi-k2-thinking-turbo": { + "id": "kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.15, "output": 8 }, + "limit": { "context": 262000, "output": 128000 } + }, + "claude-opus-4-5": { + "id": "claude-opus-4-5", + "name": "Claude Opus 4.5 (latest)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "deepseek-chat": { + "id": "deepseek-chat", + "name": "DeepSeek Chat", + "family": "deepseek", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "video", "audio", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1000000, "output": 64000 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-07-17", + "last_updated": "2025-07-17", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "name": "Kimi-K2.5", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 3 }, + "limit": { "context": 262000, "output": 128000 } + }, + "claude-sonnet-4-5": { + "id": "claude-sonnet-4-5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "zai-glm-4.7": { + "id": "zai-glm-4.7", + "name": "Z.AI GLM-4.7", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 40000 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262000, "output": 128000 } + }, + "gpt-5-nano": { + "id": "gpt-5-nano", + "name": "GPT-5 Nano", + "family": "gpt-nano", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "GPT-4o", + "family": "gpt", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-08-06", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "GPT-5 Mini", + "family": "gpt-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-05-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0 }, + "limit": { "context": 400000, "output": 128000 } + }, + "deepseek-reasoner": { + "id": "deepseek-reasoner", + "name": "DeepSeek Reasoner", + "family": "deepseek-thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 128000, "output": 65536 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-03-20", + "last_updated": "2025-06-05", + "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 1048576, "output": 65536 } + }, + "gpt-oss-120b": { + "id": "gpt-oss-120b", + "name": "GPT OSS 120B", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "1970-01-01", + "last_updated": "1970-01-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 32768 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "GPT-5", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "GPT-5.2", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "output": 128000 } + } + } + }, + "nova": { + "id": "nova", + "env": ["NOVA_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.nova.amazon.com/v1", + "name": "Nova", + "doc": "https://nova.amazon.com/dev/documentation", + "models": { + "nova-2-lite-v1": { + "id": "nova-2-lite-v1", + "name": "Nova 2 Lite", + "family": "nova-lite", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text", "image", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "reasoning": 0 }, + "limit": { "context": 1000000, "output": 64000 } + }, + "nova-2-pro-v1": { + "id": "nova-2-pro-v1", + "name": "Nova 2 Pro", + "family": "nova-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2026-12-03", + "last_updated": "2026-01-03", + "modalities": { "input": ["text", "image", "video", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "reasoning": 0 }, + "limit": { "context": 1000000, "output": 64000 } } } }, @@ -100,7 +620,7 @@ "lucidquery-nexus-coder": { "id": "lucidquery-nexus-coder", "name": "LucidQuery Nexus Coder", - "family": "lucidquery-nexus-coder", + "family": "lucid", "attachment": true, "reasoning": true, "tool_call": true, @@ -142,7 +662,7 @@ "kimi-k2-thinking-turbo": { "id": "kimi-k2-thinking-turbo", "name": "Kimi K2 Thinking Turbo", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -159,7 +679,7 @@ "kimi-k2-turbo-preview": { "id": "kimi-k2-turbo-preview", "name": "Kimi K2 Turbo", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -172,10 +692,28 @@ "cost": { "input": 2.4, "output": 10, "cache_read": 0.6 }, "limit": { "context": 262144, "output": 262144 } }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": false, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 } + }, "kimi-k2-0711-preview": { "id": "kimi-k2-0711-preview", "name": "Kimi K2 0711", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -191,7 +729,7 @@ "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -208,7 +746,7 @@ "kimi-k2-0905-preview": { "id": "kimi-k2-0905-preview", "name": "Kimi K2 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -223,6 +761,984 @@ } } }, + "302ai": { + "id": "302ai", + "env": ["302AI_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.302.ai/v1", + "name": "302.AI", + "doc": "https://doc.302.ai", + "models": { + "gpt-4.1-nano": { + "id": "gpt-4.1-nano", + "name": "gpt-4.1-nano", + "family": "gpt-nano", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "doubao-seed-code-preview-251028": { + "id": "doubao-seed-code-preview-251028", + "name": "doubao-seed-code-preview-251028", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-11-11", + "last_updated": "2025-11-11", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.17, "output": 1.14 }, + "limit": { "context": 256000, "output": 32000 } + }, + "glm-4.7": { + "id": "glm-4.7", + "name": "glm-4.7", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.286, "output": 1.142 }, + "limit": { "context": 200000, "output": 131072 } + }, + "grok-4-fast-non-reasoning": { + "id": "grok-4-fast-non-reasoning", + "name": "grok-4-fast-non-reasoning", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "qwen3-235b-a22b-instruct-2507": { + "id": "qwen3-235b-a22b-instruct-2507", + "name": "qwen3-235b-a22b-instruct-2507", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-30", + "last_updated": "2025-07-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 1.143 }, + "limit": { "context": 128000, "output": 65536 } + }, + "grok-4-fast-reasoning": { + "id": "grok-4-fast-reasoning", + "name": "grok-4-fast-reasoning", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "mistral-large-2512": { + "id": "mistral-large-2512", + "name": "mistral-large-2512", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 3.3 }, + "limit": { "context": 128000, "output": 262144 } + }, + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "gemini-3-flash-preview", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-12-18", + "last_updated": "2025-12-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 3 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "MiniMax-M2": { + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-26", + "last_updated": "2025-10-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.33, "output": 1.32 }, + "limit": { "context": 1000000, "output": 128000 } + }, + "grok-4-1-fast-reasoning": { + "id": "grok-4-1-fast-reasoning", + "name": "grok-4-1-fast-reasoning", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "deepseek-v3.2-thinking": { + "id": "deepseek-v3.2-thinking", + "name": "DeepSeek-V3.2-Thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 0.43 }, + "limit": { "context": 128000, "output": 128000 } + }, + "ministral-14b-2512": { + "id": "ministral-14b-2512", + "name": "ministral-14b-2512", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.33, "output": 0.33 }, + "limit": { "context": 128000, "output": 128000 } + }, + "glm-4.5": { + "id": "glm-4.5", + "name": "GLM-4.5", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.286, "output": 1.142 }, + "limit": { "context": 128000, "output": 98304 } + }, + "gpt-5-thinking": { + "id": "gpt-5-thinking", + "name": "gpt-5-thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "kimi-k2-thinking-turbo": { + "id": "kimi-k2-thinking-turbo", + "name": "kimi-k2-thinking-turbo", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.265, "output": 9.119 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gemini-2.5-flash-image": { + "id": "gemini-2.5-flash-image", + "name": "gemini-2.5-flash-image", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-10-08", + "last_updated": "2025-10-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 30 }, + "limit": { "context": 32768, "output": 32768 } + }, + "deepseek-chat": { + "id": "deepseek-chat", + "name": "Deepseek-Chat", + "family": "deepseek", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-11-29", + "last_updated": "2024-11-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 0.43 }, + "limit": { "context": 128000, "output": 8192 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "gemini-3-pro-preview", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-11-19", + "last_updated": "2025-11-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 12 }, + "limit": { "context": 1000000, "output": 64000 } + }, + "gemini-2.5-flash": { + "id": "gemini-2.5-flash", + "name": "gemini-2.5-flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "gpt-4.1-mini": { + "id": "gpt-4.1-mini", + "name": "gpt-4.1-mini", + "family": "gpt-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 1.6 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "gemini-2.0-flash-lite": { + "id": "gemini-2.0-flash-lite", + "name": "gemini-2.0-flash-lite", + "family": "gemini-flash-lite", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2025-06-16", + "last_updated": "2025-06-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.075, "output": 0.3 }, + "limit": { "context": 2000000, "output": 8192 } + }, + "claude-sonnet-4-5-20250929-thinking": { + "id": "claude-sonnet-4-5-20250929-thinking", + "name": "claude-sonnet-4-5-20250929-thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-opus-4-5-20251101": { + "id": "claude-opus-4-5-20251101", + "name": "claude-opus-4-5-20251101", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "qwen3-max-2025-09-23": { + "id": "qwen3-max-2025-09-23", + "name": "qwen3-max-2025-09-23", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.86, "output": 3.43 }, + "limit": { "context": 258048, "output": 65536 } + }, + "claude-sonnet-4-5-20250929": { + "id": "claude-sonnet-4-5-20250929", + "name": "claude-sonnet-4-5-20250929", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 64000 } + }, + "grok-4.1": { + "id": "grok-4.1", + "name": "grok-4.1", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 10 }, + "limit": { "context": 200000, "output": 64000 } + }, + "chatgpt-4o-latest": { + "id": "chatgpt-4o-latest", + "name": "chatgpt-4o-latest", + "family": "gpt", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-09", + "release_date": "2024-08-08", + "last_updated": "2024-08-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 15 }, + "limit": { "context": 128000, "output": 16384 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "kimi-k2-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.575, "output": 2.3 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-5.2-chat-latest": { + "id": "gpt-5.2-chat-latest", + "name": "gpt-5.2-chat-latest", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-12", + "last_updated": "2025-12-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14 }, + "limit": { "context": 128000, "output": 16384 } + }, + "gpt-5.1": { + "id": "gpt-5.1", + "name": "gpt-5.1", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "doubao-seed-1-6-vision-250815": { + "id": "doubao-seed-1-6-vision-250815", + "name": "doubao-seed-1-6-vision-250815", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.114, "output": 1.143 }, + "limit": { "context": 256000, "output": 32000 } + }, + "qwen-flash": { + "id": "qwen-flash", + "name": "Qwen-Flash", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.022, "output": 0.22 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "gemini-3-pro-image-preview": { + "id": "gemini-3-pro-image-preview", + "name": "gemini-3-pro-image-preview", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 120 }, + "limit": { "context": 32768, "output": 64000 } + }, + "kimi-k2-0905-preview": { + "id": "kimi-k2-0905-preview", + "name": "kimi-k2-0905-preview", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.632, "output": 2.53 }, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-4o": { + "id": "gpt-4o", + "name": "gpt-4o", + "family": "gpt", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-09", + "release_date": "2024-05-13", + "last_updated": "2024-05-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 128000, "output": 16384 } + }, + "doubao-seed-1-6-thinking-250715": { + "id": "doubao-seed-1-6-thinking-250715", + "name": "doubao-seed-1-6-thinking-250715", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-15", + "last_updated": "2025-07-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.121, "output": 1.21 }, + "limit": { "context": 256000, "output": 16000 } + }, + "gpt-4.1": { + "id": "gpt-4.1", + "name": "gpt-4.1", + "family": "gpt", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-04-14", + "last_updated": "2025-04-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2, "output": 8 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "qwen-plus": { + "id": "qwen-plus", + "name": "Qwen-Plus", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.12, "output": 1.2 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "glm-4.5v": { + "id": "glm-4.5v", + "name": "GLM-4.5V", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-07-29", + "last_updated": "2025-07-29", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 0.86 }, + "limit": { "context": 64000, "output": 16384 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "glm-4.6", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.286, "output": 1.142 }, + "limit": { "context": 200000, "output": 131072 } + }, + "gemini-2.5-flash-preview-09-2025": { + "id": "gemini-2.5-flash-preview-09-2025", + "name": "gemini-2.5-flash-preview-09-2025", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "gpt-5-mini": { + "id": "gpt-5-mini", + "name": "gpt-5-mini", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2 }, + "limit": { "context": 400000, "output": 128000 } + }, + "claude-opus-4-1-20250805-thinking": { + "id": "claude-opus-4-1-20250805-thinking", + "name": "claude-opus-4-1-20250805-thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-05-27", + "last_updated": "2025-05-27", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "qwen3-235b-a22b": { + "id": "qwen3-235b-a22b", + "name": "Qwen3-235B-A22B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 2.86 }, + "limit": { "context": 128000, "output": 16384 } + }, + "MiniMax-M1": { + "id": "MiniMax-M1", + "name": "MiniMax-M1", + "family": "minimax", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-16", + "last_updated": "2025-06-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.132, "output": 1.254 }, + "limit": { "context": 1000000, "output": 128000 } + }, + "deepseek-reasoner": { + "id": "deepseek-reasoner", + "name": "Deepseek-Reasoner", + "family": "deepseek-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 0.43 }, + "limit": { "context": 128000, "output": 128000 } + }, + "gemini-2.5-pro": { + "id": "gemini-2.5-pro", + "name": "gemini-2.5-pro", + "family": "gemini-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "qwen-max-latest": { + "id": "qwen-max-latest", + "name": "Qwen-Max-Latest", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-11", + "release_date": "2024-04-03", + "last_updated": "2025-01-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.343, "output": 1.372 }, + "limit": { "context": 131072, "output": 8192 } + }, + "qwen3-coder-480b-a35b-instruct": { + "id": "qwen3-coder-480b-a35b-instruct", + "name": "qwen3-coder-480b-a35b-instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.86, "output": 3.43 }, + "limit": { "context": 262144, "output": 65536 } + }, + "gpt-5": { + "id": "gpt-5", + "name": "gpt-5", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 400000, "output": 128000 } + }, + "qwen3-30b-a3b": { + "id": "qwen3-30b-a3b", + "name": "Qwen3-30B-A3B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.11, "output": 1.08 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "deepseek-v3.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.29, "output": 0.43 }, + "limit": { "context": 128000, "output": 8192 } + }, + "MiniMax-M2.1": { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-19", + "last_updated": "2025-12-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 1000000, "output": 131072 } + }, + "gemini-2.5-flash-lite-preview-09-2025": { + "id": "gemini-2.5-flash-lite-preview-09-2025", + "name": "gemini-2.5-flash-lite-preview-09-2025", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-09-26", + "last_updated": "2025-09-26", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.4 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "grok-4-1-fast-non-reasoning": { + "id": "grok-4-1-fast-non-reasoning", + "name": "grok-4-1-fast-non-reasoning", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-11-20", + "last_updated": "2025-11-20", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "doubao-seed-1-8-251215": { + "id": "doubao-seed-1-8-251215", + "name": "doubao-seed-1-8-251215", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-18", + "last_updated": "2025-12-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.114, "output": 0.286 }, + "limit": { "context": 224000, "output": 64000 } + }, + "gpt-5-pro": { + "id": "gpt-5-pro", + "name": "gpt-5-pro", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-10-08", + "last_updated": "2025-10-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 400000, "output": 272000 } + }, + "gemini-2.5-flash-nothink": { + "id": "gemini-2.5-flash-nothink", + "name": "gemini-2.5-flash-nothink", + "family": "gemini-flash", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-06-24", + "last_updated": "2025-06-24", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 1000000, "output": 65536 } + }, + "claude-opus-4-1-20250805": { + "id": "claude-opus-4-1-20250805", + "name": "claude-opus-4-1-20250805", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 15, "output": 75 }, + "limit": { "context": 200000, "output": 32000 } + }, + "gpt-5.2": { + "id": "gpt-5.2", + "name": "gpt-5.2", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-12", + "last_updated": "2025-12-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5.1-chat-latest": { + "id": "gpt-5.1-chat-latest", + "name": "gpt-5.1-chat-latest", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10 }, + "limit": { "context": 128000, "output": 16384 } + }, + "glm-4.6v": { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.145, "output": 0.43 }, + "limit": { "context": 128000, "output": 32768 } + }, + "claude-opus-4-5-20251101-thinking": { + "id": "claude-opus-4-5-20251101-thinking", + "name": "claude-opus-4-5-20251101-thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-11-25", + "last_updated": "2025-11-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25 }, + "limit": { "context": 200000, "output": 64000 } + }, + "claude-haiku-4-5-20251001": { + "id": "claude-haiku-4-5-20251001", + "name": "claude-haiku-4-5-20251001", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-10-16", + "last_updated": "2025-10-16", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1, "output": 5 }, + "limit": { "context": 200000, "output": 64000 } + } + } + }, "zai-coding-plan": { "id": "zai-coding-plan", "env": ["ZHIPU_API_KEY"], @@ -234,7 +1750,7 @@ "glm-4.7": { "id": "glm-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -251,7 +1767,7 @@ "glm-4.5-flash": { "id": "glm-4.5-flash", "name": "GLM-4.5-Flash", - "family": "glm-4.5-flash", + "family": "glm-flash", "attachment": false, "reasoning": true, "tool_call": true, @@ -267,7 +1783,7 @@ "glm-4.5": { "id": "glm-4.5", "name": "GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -280,10 +1796,26 @@ "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, "limit": { "context": 131072, "output": 98304 } }, + "glm-4.7-flash": { + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "family": "glm-flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 131072 } + }, "glm-4.5-air": { "id": "glm-4.5-air", "name": "GLM-4.5-Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -299,7 +1831,7 @@ "glm-4.5v": { "id": "glm-4.5v", "name": "GLM-4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -315,7 +1847,7 @@ "glm-4.6": { "id": "glm-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -331,7 +1863,7 @@ "glm-4.6v": { "id": "glm-4.6v", "name": "GLM-4.6V", - "family": "glm-4.6v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -354,185 +1886,385 @@ "name": "Ollama Cloud", "doc": "https://docs.ollama.com/cloud", "models": { - "kimi-k2-thinking:cloud": { - "id": "kimi-k2-thinking:cloud", - "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "glm-4.7": { + "id": "glm-4.7", + "name": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-11-06", - "last_updated": "2025-11-06", + "release_date": "2025-12-22", + "last_updated": "2026-01-19", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 256000, "output": 8192 } + "limit": { "context": 202752, "output": 131072 } }, - "qwen3-vl-235b-cloud": { - "id": "qwen3-vl-235b-cloud", - "name": "Qwen3-VL 235B Instruct", - "family": "qwen3-vl", - "attachment": true, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 200000, "output": 8192 } - }, - "qwen3-coder:480b-cloud": { - "id": "qwen3-coder:480b-cloud", - "name": "Qwen3 Coder 480B", - "family": "qwen3-coder", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-22", - "last_updated": "2025-07-22", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 200000, "output": 8192 } - }, - "gpt-oss:120b-cloud": { - "id": "gpt-oss:120b-cloud", - "name": "GPT-OSS 120B", - "family": "gpt-oss:120b", + "qwen3-next:80b": { + "id": "qwen3-next:80b", + "name": "qwen3-next:80b", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "release_date": "2025-09-15", + "last_updated": "2026-01-19", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 200000, "output": 8192 } + "limit": { "context": 262144, "output": 32768 } }, - "deepseek-v3.1:671b-cloud": { - "id": "deepseek-v3.1:671b-cloud", - "name": "DeepSeek-V3.1 671B", - "family": "deepseek-v3", + "cogito-2.1:671b": { + "id": "cogito-2.1:671b", + "name": "cogito-2.1:671b", + "family": "cogito", "attachment": false, "reasoning": true, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-08-21", - "last_updated": "2025-08-21", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 160000, "output": 8192 } - }, - "glm-4.6:cloud": { - "id": "glm-4.6:cloud", - "name": "GLM-4.6", - "family": "glm-4.6", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-09-29", - "last_updated": "2025-09-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 200000, "output": 8192 } - }, - "cogito-2.1:671b-cloud": { - "id": "cogito-2.1:671b-cloud", - "name": "Cogito 2.1 671B", - "family": "cogito-2.1:671b-cloud", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, "release_date": "2025-11-19", - "last_updated": "2025-11-19", + "last_updated": "2026-01-19", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 160000, "output": 8192 } + "limit": { "context": 163840, "output": 32000 } }, - "gpt-oss:20b-cloud": { - "id": "gpt-oss:20b-cloud", - "name": "GPT-OSS 20B", - "family": "gpt-oss:20b", + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "gemini-3-flash-preview", + "family": "gemini-flash", "attachment": false, "reasoning": true, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2026-01-19", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 200000, "output": 8192 } + "limit": { "context": 1048576, "output": 65536 } }, - "qwen3-vl-235b-instruct-cloud": { - "id": "qwen3-vl-235b-instruct-cloud", - "name": "Qwen3-VL 235B Instruct", - "family": "qwen3-vl", + "qwen3-vl:235b": { + "id": "qwen3-vl:235b", + "name": "qwen3-vl:235b", + "family": "qwen", + "attachment": true, + "reasoning": true, + "tool_call": true, + "release_date": "2025-09-22", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 32768 } + }, + "ministral-3:3b": { + "id": "ministral-3:3b", + "name": "ministral-3:3b", + "family": "ministral", "attachment": true, "reasoning": false, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-09-22", - "last_updated": "2025-09-22", + "release_date": "2024-10-22", + "last_updated": "2026-01-19", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 200000, "output": 8192 } + "limit": { "context": 262144, "output": 128000 } }, - "kimi-k2:1t-cloud": { - "id": "kimi-k2:1t-cloud", - "name": "Kimi K2", - "family": "kimi-k2", - "attachment": false, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "gemini-3-pro-preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "release_date": "2025-11-18", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 1048576, "output": 64000 } + }, + "qwen3-vl:235b-instruct": { + "id": "qwen3-vl:235b-instruct", + "name": "qwen3-vl:235b-instruct", + "family": "qwen", + "attachment": true, "reasoning": false, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-09-05", - "last_updated": "2025-09-05", - "modalities": { "input": ["text"], "output": ["text"] }, + "release_date": "2025-09-22", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 256000, "output": 8192 } + "limit": { "context": 262144, "output": 131072 } }, - "minimax-m2:cloud": { - "id": "minimax-m2:cloud", - "name": "MiniMax M2", + "devstral-small-2:24b": { + "id": "devstral-small-2:24b", + "name": "devstral-small-2:24b", + "family": "devstral", + "attachment": true, + "reasoning": false, + "tool_call": true, + "release_date": "2025-12-09", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 262144 } + }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "name": "kimi-k2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 262144 } + }, + "minimax-m2": { + "id": "minimax-m2", + "name": "minimax-m2", "family": "minimax", "attachment": false, "reasoning": false, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2025-10-23", + "last_updated": "2026-01-19", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 200000, "output": 8192 } + "limit": { "context": 204800, "output": 128000 } }, - "gemini-3-pro-preview:latest": { - "id": "gemini-3-pro-preview:latest", - "name": "Gemini 3 Pro Preview", - "family": "gemini-pro", + "qwen3-coder:480b": { + "id": "qwen3-coder:480b", + "name": "qwen3-coder:480b", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "release_date": "2025-07-22", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 65536 } + }, + "gpt-oss:20b": { + "id": "gpt-oss:20b", + "name": "gpt-oss:20b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-08-05", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 32768 } + }, + "gemma3:27b": { + "id": "gemma3:27b", + "name": "gemma3:27b", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "release_date": "2025-07-27", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 131072 } + }, + "kimi-k2-thinking": { + "id": "kimi-k2-thinking", + "name": "kimi-k2-thinking", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 262144 } + }, + "rnj-1:8b": { + "id": "rnj-1:8b", + "name": "rnj-1:8b", + "family": "rnj", + "attachment": false, + "reasoning": false, + "tool_call": true, + "release_date": "2025-12-06", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 32768, "output": 4096 } + }, + "deepseek-v3.1:671b": { + "id": "deepseek-v3.1:671b", + "name": "deepseek-v3.1:671b", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-08-21", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 163840, "output": 163840 } + }, + "ministral-3:8b": { + "id": "ministral-3:8b", + "name": "ministral-3:8b", + "family": "ministral", "attachment": true, "reasoning": false, "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-11-18", - "last_updated": "2025-11-18", - "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, - "open_weights": false, - "limit": { "context": 1000000, "output": 64000 } + "release_date": "2024-12-01", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 128000 } + }, + "glm-4.6": { + "id": "glm-4.6", + "name": "glm-4.6", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-09-29", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 202752, "output": 131072 } + }, + "kimi-k2:1t": { + "id": "kimi-k2:1t", + "name": "kimi-k2:1t", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "knowledge": "2024-10", + "release_date": "2025-07-11", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 262144 } + }, + "devstral-2:123b": { + "id": "devstral-2:123b", + "name": "devstral-2:123b", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "release_date": "2025-12-09", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 262144 } + }, + "gpt-oss:120b": { + "id": "gpt-oss:120b", + "name": "gpt-oss:120b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-08-05", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 32768 } + }, + "gemma3:4b": { + "id": "gemma3:4b", + "name": "gemma3:4b", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "release_date": "2024-12-01", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 131072 } + }, + "nemotron-3-nano:30b": { + "id": "nemotron-3-nano:30b", + "name": "nemotron-3-nano:30b", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-12-15", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 1048576, "output": 131072 } + }, + "ministral-3:14b": { + "id": "ministral-3:14b", + "name": "ministral-3:14b", + "family": "ministral", + "attachment": true, + "reasoning": false, + "tool_call": true, + "release_date": "2024-12-01", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 128000 } + }, + "mistral-large-3:675b": { + "id": "mistral-large-3:675b", + "name": "mistral-large-3:675b", + "family": "mistral-large", + "attachment": true, + "reasoning": false, + "tool_call": true, + "release_date": "2025-12-02", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 262144, "output": 262144 } + }, + "minimax-m2.1": { + "id": "minimax-m2.1", + "name": "minimax-m2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-12-23", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 204800, "output": 131072 } + }, + "deepseek-v3.2": { + "id": "deepseek-v3.2", + "name": "deepseek-v3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "release_date": "2025-06-15", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 163840, "output": 65536 } + }, + "gemma3:12b": { + "id": "gemma3:12b", + "name": "gemma3:12b", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "release_date": "2024-12-01", + "last_updated": "2026-01-19", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "limit": { "context": 131072, "output": 131072 } } } }, @@ -547,7 +2279,7 @@ "mimo-v2-flash": { "id": "mimo-v2-flash", "name": "MiMo-V2-Flash", - "family": "mimo-v2-flash", + "family": "mimo", "attachment": false, "reasoning": true, "tool_call": true, @@ -574,7 +2306,7 @@ "qwen3-livetranslate-flash-realtime": { "id": "qwen3-livetranslate-flash-realtime", "name": "Qwen3-LiveTranslate Flash Realtime", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -590,7 +2322,7 @@ "qwen3-asr-flash": { "id": "qwen3-asr-flash", "name": "Qwen3-ASR Flash", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -606,7 +2338,7 @@ "qwen-omni-turbo": { "id": "qwen-omni-turbo", "name": "Qwen-Omni Turbo", - "family": "qwen-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -622,7 +2354,7 @@ "qwen-vl-max": { "id": "qwen-vl-max", "name": "Qwen-VL Max", - "family": "qwen-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -638,7 +2370,7 @@ "qwen3-next-80b-a3b-instruct": { "id": "qwen3-next-80b-a3b-instruct", "name": "Qwen3-Next 80B-A3B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -654,7 +2386,7 @@ "qwen-turbo": { "id": "qwen-turbo", "name": "Qwen Turbo", - "family": "qwen-turbo", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -670,7 +2402,7 @@ "qwen3-vl-235b-a22b": { "id": "qwen3-vl-235b-a22b", "name": "Qwen3-VL 235B-A22B", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -686,7 +2418,7 @@ "qwen3-coder-flash": { "id": "qwen3-coder-flash", "name": "Qwen3 Coder Flash", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -702,7 +2434,7 @@ "qwen3-vl-30b-a3b": { "id": "qwen3-vl-30b-a3b", "name": "Qwen3-VL 30B-A3B", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -718,7 +2450,7 @@ "qwen3-14b": { "id": "qwen3-14b", "name": "Qwen3 14B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -734,7 +2466,7 @@ "qvq-max": { "id": "qvq-max", "name": "QVQ Max", - "family": "qvq-max", + "family": "qvq", "attachment": false, "reasoning": true, "tool_call": true, @@ -750,7 +2482,7 @@ "qwen-plus-character-ja": { "id": "qwen-plus-character-ja", "name": "Qwen Plus Character (Japanese)", - "family": "qwen-plus", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -766,7 +2498,7 @@ "qwen2-5-14b-instruct": { "id": "qwen2-5-14b-instruct", "name": "Qwen2.5 14B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -782,7 +2514,7 @@ "qwq-plus": { "id": "qwq-plus", "name": "QwQ Plus", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -798,7 +2530,7 @@ "qwen3-coder-30b-a3b-instruct": { "id": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -814,7 +2546,7 @@ "qwen-vl-ocr": { "id": "qwen-vl-ocr", "name": "Qwen-VL OCR", - "family": "qwen-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -830,7 +2562,7 @@ "qwen2-5-72b-instruct": { "id": "qwen2-5-72b-instruct", "name": "Qwen2.5 72B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -846,7 +2578,7 @@ "qwen3-omni-flash": { "id": "qwen3-omni-flash", "name": "Qwen3-Omni Flash", - "family": "qwen3-omni", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -862,7 +2594,7 @@ "qwen-flash": { "id": "qwen-flash", "name": "Qwen Flash", - "family": "qwen-flash", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -878,7 +2610,7 @@ "qwen3-8b": { "id": "qwen3-8b", "name": "Qwen3 8B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -894,7 +2626,7 @@ "qwen3-omni-flash-realtime": { "id": "qwen3-omni-flash-realtime", "name": "Qwen3-Omni Flash Realtime", - "family": "qwen3-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -910,7 +2642,7 @@ "qwen2-5-vl-72b-instruct": { "id": "qwen2-5-vl-72b-instruct", "name": "Qwen2.5-VL 72B Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -926,7 +2658,7 @@ "qwen3-vl-plus": { "id": "qwen3-vl-plus", "name": "Qwen3-VL Plus", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -942,7 +2674,7 @@ "qwen-plus": { "id": "qwen-plus", "name": "Qwen Plus", - "family": "qwen-plus", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -958,7 +2690,7 @@ "qwen2-5-32b-instruct": { "id": "qwen2-5-32b-instruct", "name": "Qwen2.5 32B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -974,7 +2706,7 @@ "qwen2-5-omni-7b": { "id": "qwen2-5-omni-7b", "name": "Qwen2.5-Omni 7B", - "family": "qwen2.5-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -990,7 +2722,7 @@ "qwen-max": { "id": "qwen-max", "name": "Qwen Max", - "family": "qwen-max", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1006,7 +2738,7 @@ "qwen2-5-7b-instruct": { "id": "qwen2-5-7b-instruct", "name": "Qwen2.5 7B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1022,7 +2754,7 @@ "qwen2-5-vl-7b-instruct": { "id": "qwen2-5-vl-7b-instruct", "name": "Qwen2.5-VL 7B Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1038,7 +2770,7 @@ "qwen3-235b-a22b": { "id": "qwen3-235b-a22b", "name": "Qwen3 235B-A22B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -1054,7 +2786,7 @@ "qwen-omni-turbo-realtime": { "id": "qwen-omni-turbo-realtime", "name": "Qwen-Omni Turbo Realtime", - "family": "qwen-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1070,7 +2802,7 @@ "qwen-mt-turbo": { "id": "qwen-mt-turbo", "name": "Qwen-MT Turbo", - "family": "qwen-mt", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -1086,7 +2818,7 @@ "qwen3-coder-480b-a35b-instruct": { "id": "qwen3-coder-480b-a35b-instruct", "name": "Qwen3-Coder 480B-A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1102,7 +2834,7 @@ "qwen-mt-plus": { "id": "qwen-mt-plus", "name": "Qwen-MT Plus", - "family": "qwen-mt", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -1118,7 +2850,7 @@ "qwen3-max": { "id": "qwen3-max", "name": "Qwen3 Max", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1134,7 +2866,7 @@ "qwen3-coder-plus": { "id": "qwen3-coder-plus", "name": "Qwen3 Coder Plus", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1150,7 +2882,7 @@ "qwen3-next-80b-a3b-thinking": { "id": "qwen3-next-80b-a3b-thinking", "name": "Qwen3-Next 80B-A3B (Thinking)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -1166,7 +2898,7 @@ "qwen3-32b": { "id": "qwen3-32b", "name": "Qwen3 32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -1182,7 +2914,7 @@ "qwen-vl-plus": { "id": "qwen-vl-plus", "name": "Qwen-VL Plus", - "family": "qwen-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1223,7 +2955,7 @@ "grok-3-fast": { "id": "grok-3-fast", "name": "Grok 3 Fast", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1255,7 +2987,7 @@ "grok-2-vision": { "id": "grok-2-vision", "name": "Grok 2 Vision", - "family": "grok-2", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -1287,7 +3019,7 @@ "grok-2": { "id": "grok-2", "name": "Grok 2", - "family": "grok-2", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1303,7 +3035,7 @@ "grok-3-mini-fast-latest": { "id": "grok-3-mini-fast-latest", "name": "Grok 3 Mini Fast Latest", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -1319,7 +3051,7 @@ "grok-2-vision-1212": { "id": "grok-2-vision-1212", "name": "Grok 2 Vision (1212)", - "family": "grok-2", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -1335,7 +3067,7 @@ "grok-3": { "id": "grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1367,7 +3099,7 @@ "grok-2-latest": { "id": "grok-2-latest", "name": "Grok 2 Latest", - "family": "grok-2", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1399,7 +3131,7 @@ "grok-2-1212": { "id": "grok-2-1212", "name": "Grok 2 (1212)", - "family": "grok-2", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1415,7 +3147,7 @@ "grok-3-fast-latest": { "id": "grok-3-fast-latest", "name": "Grok 3 Fast Latest", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1431,7 +3163,7 @@ "grok-3-latest": { "id": "grok-3-latest", "name": "Grok 3 Latest", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -1447,7 +3179,7 @@ "grok-2-vision-latest": { "id": "grok-2-vision-latest", "name": "Grok 2 Vision Latest", - "family": "grok-2", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -1479,7 +3211,7 @@ "grok-3-mini": { "id": "grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -1511,7 +3243,7 @@ "grok-3-mini-latest": { "id": "grok-3-mini-latest", "name": "Grok 3 Mini Latest", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -1543,7 +3275,7 @@ "grok-3-mini-fast": { "id": "grok-3-mini-fast", "name": "Grok 3 Mini Fast", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -1585,7 +3317,7 @@ "qwen2.5-coder-32b-instruct": { "id": "qwen2.5-coder-32b-instruct", "name": "Qwen2.5 Coder 32B Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -1601,7 +3333,7 @@ "kimi-k2-instruct": { "id": "kimi-k2-instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -1617,7 +3349,7 @@ "deepseek-r1-distill-llama-70b": { "id": "deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -1656,10 +3388,27 @@ "name": "Nvidia", "doc": "https://docs.api.nvidia.com/nim/", "models": { + "moonshotai/kimi-k2.5": { + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, "moonshotai/kimi-k2-instruct-0905": { "id": "moonshotai/kimi-k2-instruct-0905", "name": "Kimi K2 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -1675,7 +3424,7 @@ "moonshotai/kimi-k2-thinking": { "id": "moonshotai/kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -1693,7 +3442,7 @@ "moonshotai/kimi-k2-instruct": { "id": "moonshotai/kimi-k2-instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": true, "tool_call": true, @@ -1773,7 +3522,7 @@ "nvidia/parakeet-tdt-0.6b-v2": { "id": "nvidia/parakeet-tdt-0.6b-v2", "name": "Parakeet TDT 0.6B v2", - "family": "parakeet-tdt-0.6b", + "family": "parakeet", "attachment": false, "reasoning": false, "tool_call": false, @@ -1789,7 +3538,7 @@ "nvidia/nemoretriever-ocr-v1": { "id": "nvidia/nemoretriever-ocr-v1", "name": "NeMo Retriever OCR v1", - "family": "nemoretriever-ocr", + "family": "nemoretriever", "attachment": false, "reasoning": false, "tool_call": false, @@ -1850,7 +3599,7 @@ "nvidia/llama-3.1-nemotron-ultra-253b-v1": { "id": "nvidia/llama-3.1-nemotron-ultra-253b-v1", "name": "Llama-3.1-Nemotron-Ultra-253B-v1", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -1924,6 +3673,21 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 16384 } }, + "minimaxai/minimax-m2.1": { + "id": "minimaxai/minimax-m2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, "google/gemma-3n-e2b-it": { "id": "google/gemma-3n-e2b-it", "name": "Gemma 3n E2b It", @@ -2049,7 +3813,7 @@ "google/gemma-3-27b-it": { "id": "google/gemma-3-27b-it", "name": "Gemma-3-27B-IT", - "family": "gemma-3", + "family": "gemma", "attachment": true, "reasoning": true, "tool_call": true, @@ -2143,7 +3907,7 @@ "microsoft/phi-4-mini-instruct": { "id": "microsoft/phi-4-mini-instruct", "name": "Phi-4-Mini", - "family": "phi-4", + "family": "phi", "attachment": true, "reasoning": true, "tool_call": true, @@ -2190,7 +3954,7 @@ "openai/whisper-large-v3": { "id": "openai/whisper-large-v3", "name": "Whisper Large v3", - "family": "whisper-large", + "family": "whisper", "attachment": false, "reasoning": false, "tool_call": false, @@ -2219,10 +3983,27 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 8192 } }, + "z-ai/glm4.7": { + "id": "z-ai/glm4.7", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, "qwen/qwen3-next-80b-a3b-instruct": { "id": "qwen/qwen3-next-80b-a3b-instruct", "name": "Qwen3-Next-80B-A3B-Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -2268,7 +4049,7 @@ "qwen/qwen3-235b-a22b": { "id": "qwen/qwen3-235b-a22b", "name": "Qwen3-235B-A22B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -2284,7 +4065,7 @@ "qwen/qwen3-coder-480b-a35b-instruct": { "id": "qwen/qwen3-coder-480b-a35b-instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -2315,7 +4096,7 @@ "qwen/qwen3-next-80b-a3b-thinking": { "id": "qwen/qwen3-next-80b-a3b-thinking", "name": "Qwen3-Next-80B-A3B-Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -2626,7 +4407,7 @@ "deepseek-ai/deepseek-v3.1-terminus": { "id": "deepseek-ai/deepseek-v3.1-terminus", "name": "DeepSeek V3.1 Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -2642,7 +4423,7 @@ "deepseek-ai/deepseek-v3.1": { "id": "deepseek-ai/deepseek-v3.1", "name": "DeepSeek V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -2655,6 +4436,22 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 8192 } }, + "deepseek-ai/deepseek-v3.2": { + "id": "deepseek-ai/deepseek-v3.2", + "name": "DeepSeek V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 163840, "output": 65536 } + }, "deepseek-ai/deepseek-coder-6.7b-instruct": { "id": "deepseek-ai/deepseek-coder-6.7b-instruct", "name": "Deepseek Coder 6.7b Instruct", @@ -2746,7 +4543,7 @@ "command-r-plus-08-2024": { "id": "command-r-plus-08-2024", "name": "Command R+", - "family": "command-r-plus", + "family": "command-r", "attachment": false, "reasoning": true, "tool_call": true, @@ -2813,7 +4610,7 @@ "id": "upstage", "env": ["UPSTAGE_API_KEY"], "npm": "@ai-sdk/openai-compatible", - "api": "https://api.upstage.ai", + "api": "https://api.upstage.ai/v1/solar", "name": "Upstage", "doc": "https://developers.upstage.ai/docs/apis/chat", "models": { @@ -2833,6 +4630,22 @@ "cost": { "input": 0.15, "output": 0.15 }, "limit": { "context": 32768, "output": 4096 } }, + "solar-pro3": { + "id": "solar-pro3", + "name": "solar-pro3", + "family": "solar-pro", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2026-01", + "last_updated": "2026-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 0.25 }, + "limit": { "context": 131072, "output": 8192 } + }, "solar-pro2": { "id": "solar-pro2", "name": "solar-pro2", @@ -2861,7 +4674,7 @@ "llama-3.1-8b-instant": { "id": "llama-3.1-8b-instant", "name": "Llama 3.1 8B Instant", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -2911,7 +4724,7 @@ "qwen-qwq-32b": { "id": "qwen-qwq-32b", "name": "Qwen QwQ 32B", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -2945,7 +4758,7 @@ "deepseek-r1-distill-llama-70b": { "id": "deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -2978,7 +4791,7 @@ "gemma2-9b-it": { "id": "gemma2-9b-it", "name": "Gemma 2 9B", - "family": "gemma-2", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": true, @@ -2995,7 +4808,7 @@ "llama-3.3-70b-versatile": { "id": "llama-3.3-70b-versatile", "name": "Llama 3.3 70B Versatile", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -3011,7 +4824,7 @@ "moonshotai/kimi-k2-instruct-0905": { "id": "moonshotai/kimi-k2-instruct-0905", "name": "Kimi K2 Instruct 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -3028,7 +4841,7 @@ "moonshotai/kimi-k2-instruct": { "id": "moonshotai/kimi-k2-instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -3077,7 +4890,7 @@ "qwen/qwen3-32b": { "id": "qwen/qwen3-32b", "name": "Qwen3 32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -3093,7 +4906,7 @@ "meta-llama/llama-4-scout-17b-16e-instruct": { "id": "meta-llama/llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout 17B", - "family": "llama-4-scout", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -3110,7 +4923,7 @@ "meta-llama/llama-4-maverick-17b-128e-instruct": { "id": "meta-llama/llama-4-maverick-17b-128e-instruct", "name": "Llama 4 Maverick 17B", - "family": "llama-4-maverick", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -3152,7 +4965,7 @@ "Ling-1T": { "id": "Ling-1T", "name": "Ling-1T", - "family": "ling-1t", + "family": "ling", "attachment": false, "reasoning": false, "tool_call": true, @@ -3168,7 +4981,7 @@ "Ring-1T": { "id": "Ring-1T", "name": "Ring-1T", - "family": "ring-1t", + "family": "ring", "attachment": false, "reasoning": true, "tool_call": false, @@ -3191,40 +5004,6 @@ "name": "GitHub Copilot", "doc": "https://docs.github.com/en/copilot", "models": { - "gemini-2.0-flash-001": { - "id": "gemini-2.0-flash-001", - "name": "Gemini 2.0 Flash", - "family": "gemini-flash", - "attachment": true, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-06", - "release_date": "2024-12-11", - "last_updated": "2024-12-11", - "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 1000000, "output": 8192 }, - "status": "deprecated" - }, - "claude-opus-4": { - "id": "claude-opus-4", - "name": "Claude Opus 4", - "family": "claude-opus", - "attachment": true, - "reasoning": true, - "tool_call": false, - "temperature": false, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 80000, "output": 16000 }, - "status": "deprecated" - }, "gemini-3-flash-preview": { "id": "gemini-3-flash-preview", "name": "Gemini 3 Flash", @@ -3242,6 +5021,22 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 64000 } }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 272000, "output": 128000 } + }, "grok-code-fast-1": { "id": "grok-code-fast-1", "name": "Grok Code Fast 1", @@ -3261,7 +5056,7 @@ "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "GPT-5.1-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -3307,43 +5102,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 64000 } }, - "oswe-vscode-prime": { - "id": "oswe-vscode-prime", - "name": "Raptor Mini (Preview)", - "family": "oswe-vscode-prime", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2024-10", - "release_date": "2025-11-10", - "last_updated": "2025-11-10", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 200000, "output": 64000 } - }, - "claude-3.5-sonnet": { - "id": "claude-3.5-sonnet", - "name": "Claude Sonnet 3.5", - "family": "claude-sonnet", - "attachment": true, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-04", - "release_date": "2024-10-22", - "last_updated": "2024-10-22", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 90000, "output": 8192 }, - "status": "deprecated" - }, "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "GPT-5.1-Codex-mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -3356,27 +5118,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 100000 } }, - "o3-mini": { - "id": "o3-mini", - "name": "o3-mini", - "family": "o3-mini", - "attachment": false, - "reasoning": true, - "tool_call": false, - "temperature": false, - "knowledge": "2024-10", - "release_date": "2024-12-20", - "last_updated": "2025-01-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 65536 }, - "status": "deprecated" - }, "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -3389,26 +5134,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 128000 } }, - "gpt-5-codex": { - "id": "gpt-5-codex", - "name": "GPT-5-Codex", - "family": "gpt-5-codex", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": false, - "knowledge": "2024-09-30", - "release_date": "2025-09-15", - "last_updated": "2025-09-15", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 128000 } - }, "gpt-4o": { "id": "gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -3424,7 +5153,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -3435,24 +5164,7 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 16384 } - }, - "o4-mini": { - "id": "o4-mini", - "name": "o4-mini (Preview)", - "family": "o4-mini", - "attachment": false, - "reasoning": true, - "tool_call": false, - "temperature": false, - "knowledge": "2024-10", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 65536 }, - "status": "deprecated" + "limit": { "context": 64000, "output": 16384 } }, "claude-opus-41": { "id": "claude-opus-41", @@ -3473,7 +5185,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "GPT-5-mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -3486,23 +5198,6 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 64000 } }, - "claude-3.7-sonnet": { - "id": "claude-3.7-sonnet", - "name": "Claude Sonnet 3.7", - "family": "claude-sonnet", - "attachment": true, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-04", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 200000, "output": 16384 }, - "status": "deprecated" - }, "gemini-2.5-pro": { "id": "gemini-2.5-pro", "name": "Gemini 2.5 Pro", @@ -3522,7 +5217,7 @@ "gpt-5.1-codex-max": { "id": "gpt-5.1-codex-max", "name": "GPT-5.1-Codex-max", - "family": "gpt-5-codex-max", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -3535,23 +5230,6 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 128000 } }, - "o3": { - "id": "o3", - "name": "o3 (Preview)", - "family": "o3", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": false, - "knowledge": "2024-05", - "release_date": "2025-04-16", - "last_updated": "2025-04-16", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 16384 }, - "status": "deprecated" - }, "claude-sonnet-4": { "id": "claude-sonnet-4", "name": "Claude Sonnet 4", @@ -3571,7 +5249,7 @@ "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -3584,23 +5262,6 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 128000 } }, - "claude-3.7-sonnet-thought": { - "id": "claude-3.7-sonnet-thought", - "name": "Claude Sonnet 3.7 Thinking", - "family": "claude-sonnet", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2024-04", - "release_date": "2025-02-19", - "last_updated": "2025-02-19", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 200000, "output": 16384 }, - "status": "deprecated" - }, "claude-opus-4.5": { "id": "claude-opus-4.5", "name": "Claude Opus 4.5", @@ -3620,7 +5281,7 @@ "gpt-5.2": { "id": "gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -3661,7 +5322,7 @@ "devstral-medium-2507": { "id": "devstral-medium-2507", "name": "Devstral Medium", - "family": "devstral-medium", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3693,7 +5354,7 @@ "open-mixtral-8x22b": { "id": "open-mixtral-8x22b", "name": "Mixtral 8x22B", - "family": "mixtral-8x22b", + "family": "mixtral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3709,7 +5370,7 @@ "ministral-8b-latest": { "id": "ministral-8b-latest", "name": "Ministral 8B", - "family": "ministral-8b", + "family": "ministral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3725,7 +5386,7 @@ "pixtral-large-latest": { "id": "pixtral-large-latest", "name": "Pixtral Large", - "family": "pixtral-large", + "family": "pixtral", "attachment": true, "reasoning": false, "tool_call": true, @@ -3757,7 +5418,7 @@ "devstral-2512": { "id": "devstral-2512", "name": "Devstral 2", - "family": "devstral-medium", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3767,13 +5428,13 @@ "last_updated": "2025-12-09", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0, "output": 0 }, + "cost": { "input": 0.4, "output": 2 }, "limit": { "context": 262144, "output": 262144 } }, "ministral-3b-latest": { "id": "ministral-3b-latest", "name": "Ministral 3B", - "family": "ministral-3b", + "family": "ministral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3821,7 +5482,7 @@ "labs-devstral-small-2512": { "id": "labs-devstral-small-2512", "name": "Devstral Small 2", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3837,7 +5498,7 @@ "devstral-medium-latest": { "id": "devstral-medium-latest", "name": "Devstral 2", - "family": "devstral-medium", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3853,7 +5514,7 @@ "devstral-small-2505": { "id": "devstral-small-2505", "name": "Devstral Small 2505", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3932,7 +5593,7 @@ "devstral-small-2507": { "id": "devstral-small-2507", "name": "Devstral Small", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3964,7 +5625,7 @@ "open-mixtral-8x7b": { "id": "open-mixtral-8x7b", "name": "Mixtral 8x7B", - "family": "mixtral-8x7b", + "family": "mixtral", "attachment": false, "reasoning": false, "tool_call": true, @@ -3996,7 +5657,7 @@ "open-mistral-7b": { "id": "open-mistral-7b", "name": "Mistral 7B", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -4079,14 +5740,14 @@ "id": "abacus", "env": ["ABACUS_API_KEY"], "npm": "@ai-sdk/openai-compatible", - "api": "https://routellm.abacus.ai/v1/chat/completions", + "api": "https://routellm.abacus.ai/v1", "name": "Abacus", "doc": "https://abacus.ai/help/api", "models": { "gpt-4.1-nano": { "id": "gpt-4.1-nano", "name": "GPT-4.1 Nano", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -4102,7 +5763,7 @@ "grok-4-fast-non-reasoning": { "id": "grok-4-fast-non-reasoning", "name": "Grok 4 Fast (Non-Reasoning)", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -4129,36 +5790,6 @@ "cost": { "input": 0.1, "output": 0.4 }, "limit": { "context": 1000000, "output": 8192 } }, - "deepseek-ai-DeepSeek-V3.2": { - "id": "deepseek-ai-DeepSeek-V3.2", - "name": "DeepSeek V3.2", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-06-15", - "last_updated": "2025-06-15", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.27, "output": 0.4 }, - "limit": { "context": 128000, "output": 8192 } - }, - "meta-llama-Meta-Llama-3.1-405B-Instruct-Turbo": { - "id": "meta-llama-Meta-Llama-3.1-405B-Instruct-Turbo", - "name": "Llama 3.1 405B Instruct Turbo", - "family": "llama-3.1", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 3.5, "output": 3.5 }, - "limit": { "context": 128000, "output": 4096 } - }, "gemini-3-flash-preview": { "id": "gemini-3-flash-preview", "name": "Gemini 3 Flash Preview", @@ -4175,40 +5806,26 @@ "cost": { "input": 0.5, "output": 3 }, "limit": { "context": 1048576, "output": 65536 } }, - "Qwen-Qwen3-235B-A22B-Instruct-2507": { - "id": "Qwen-Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct", - "family": "qwen-3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-07-01", - "last_updated": "2025-07-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.13, "output": 0.6 }, - "limit": { "context": 262144, "output": 8192 } - }, - "meta-llama-Meta-Llama-3.1-8B-Instruct": { - "id": "meta-llama-Meta-Llama-3.1-8B-Instruct", - "name": "Llama 3.1 8B Instruct", - "family": "llama-3.1", - "attachment": false, + "route-llm": { + "id": "route-llm", + "name": "Route LLM", + "family": "gpt", + "attachment": true, "reasoning": false, "tool_call": true, "temperature": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.02, "output": 0.05 }, - "limit": { "context": 128000, "output": 4096 } + "knowledge": "2024-10", + "release_date": "2024-01-01", + "last_updated": "2024-01-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 128000, "output": 16384 } }, "grok-code-fast-1": { "id": "grok-code-fast-1", "name": "Grok Code Fast 1", - "family": "grok-code", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -4220,25 +5837,10 @@ "cost": { "input": 0.2, "output": 1.5 }, "limit": { "context": 256000, "output": 16384 } }, - "deepseek-ai-DeepSeek-R1": { - "id": "deepseek-ai-DeepSeek-R1", - "name": "DeepSeek R1", - "family": "deepseek-r1", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-01-20", - "last_updated": "2025-01-20", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 3, "output": 7 }, - "limit": { "context": 128000, "output": 8192 } - }, "kimi-k2-turbo-preview": { "id": "kimi-k2-turbo-preview", "name": "Kimi K2 Turbo Preview", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -4265,21 +5867,6 @@ "cost": { "input": 2, "output": 12 }, "limit": { "context": 1000000, "output": 65000 } }, - "qwen-qwen3-coder-480b-a35b-instruct": { - "id": "qwen-qwen3-coder-480b-a35b-instruct", - "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen-3-coder", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-07-22", - "last_updated": "2025-07-22", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.29, "output": 1.2 }, - "limit": { "context": 262144, "output": 65536 } - }, "gemini-2.5-flash": { "id": "gemini-2.5-flash", "name": "Gemini 2.5 Flash", @@ -4299,7 +5886,7 @@ "gpt-4.1-mini": { "id": "gpt-4.1-mini", "name": "GPT-4.1 Mini", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -4331,7 +5918,7 @@ "qwen-2.5-coder-32b": { "id": "qwen-2.5-coder-32b", "name": "Qwen 2.5 Coder 32B", - "family": "qwen-2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -4359,40 +5946,10 @@ "cost": { "input": 3, "output": 15 }, "limit": { "context": 200000, "output": 64000 } }, - "openai-gpt-oss-120b": { - "id": "openai-gpt-oss-120b", - "name": "GPT-OSS 120B", - "family": "gpt-oss", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-08-05", - "last_updated": "2025-08-05", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.08, "output": 0.44 }, - "limit": { "context": 128000, "output": 32768 } - }, - "qwen-qwen3-Max": { - "id": "qwen-qwen3-Max", - "name": "Qwen3 Max", - "family": "qwen-3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-05-28", - "last_updated": "2025-05-28", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 1.2, "output": 6 }, - "limit": { "context": 131072, "output": 16384 } - }, "grok-4-0709": { "id": "grok-4-0709", "name": "Grok 4", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -4404,25 +5961,10 @@ "cost": { "input": 3, "output": 15 }, "limit": { "context": 256000, "output": 16384 } }, - "meta-llama-Meta-Llama-3.1-70B-Instruct": { - "id": "meta-llama-Meta-Llama-3.1-70B-Instruct", - "name": "Llama 3.1 70B Instruct", - "family": "llama-3.1", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "release_date": "2024-07-23", - "last_updated": "2024-07-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.4, "output": 0.4 }, - "limit": { "context": 128000, "output": 4096 } - }, "o3-mini": { "id": "o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -4435,20 +5977,21 @@ "cost": { "input": 1.1, "output": 4.4 }, "limit": { "context": 200000, "output": 100000 } }, - "zai-org-glm-4.5": { - "id": "zai-org-glm-4.5", - "name": "GLM-4.5", - "family": "glm-4", - "attachment": false, + "gpt-5.2-chat-latest": { + "id": "gpt-5.2-chat-latest", + "name": "GPT-5.2 Chat Latest", + "family": "gpt", + "attachment": true, "reasoning": true, "tool_call": true, "temperature": true, - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.6, "output": 2.2 }, - "limit": { "context": 128000, "output": 8192 } + "knowledge": "2024-09-30", + "release_date": "2026-01-01", + "last_updated": "2026-01-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 12 }, + "limit": { "context": 400000, "output": 128000 } }, "gemini-2.0-pro-exp-02-05": { "id": "gemini-2.0-pro-exp-02-05", @@ -4467,7 +6010,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -4483,7 +6026,7 @@ "gpt-5-nano": { "id": "gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -4514,7 +6057,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -4530,7 +6073,7 @@ "o4-mini": { "id": "o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -4543,21 +6086,6 @@ "cost": { "input": 1.1, "output": 4.4 }, "limit": { "context": 200000, "output": 100000 } }, - "Qwen-Qwen3-32B": { - "id": "Qwen-Qwen3-32B", - "name": "Qwen3 32B", - "family": "qwen-3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-04-29", - "last_updated": "2025-04-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.09, "output": 0.29 }, - "limit": { "context": 128000, "output": 8192 } - }, "claude-opus-4-20250514": { "id": "claude-opus-4-20250514", "name": "Claude Opus 4", @@ -4576,7 +6104,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -4589,26 +6117,10 @@ "cost": { "input": 0.25, "output": 2 }, "limit": { "context": 400000, "output": 128000 } }, - "meta-llama-Llama-4-Maverick-17B-128E-Instruct-FP8": { - "id": "meta-llama-Llama-4-Maverick-17B-128E-Instruct-FP8", - "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "family": "llama-4", - "attachment": true, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-08", - "release_date": "2025-04-05", - "last_updated": "2025-04-05", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.14, "output": 0.59 }, - "limit": { "context": 1000000, "output": 32768 } - }, "o3-pro": { "id": "o3-pro", "name": "o3-pro", - "family": "o3-pro", + "family": "o-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -4637,21 +6149,6 @@ "cost": { "input": 3, "output": 15 }, "limit": { "context": 200000, "output": 64000 } }, - "deepseek-ai-DeepSeek-V3.1-Terminus": { - "id": "deepseek-ai-DeepSeek-V3.1-Terminus", - "name": "DeepSeek V3.1 Terminus", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-06-01", - "last_updated": "2025-06-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.27, "output": 1 }, - "limit": { "context": 128000, "output": 8192 } - }, "gemini-2.5-pro": { "id": "gemini-2.5-pro", "name": "Gemini 2.5 Pro", @@ -4671,7 +6168,7 @@ "gpt-4o-2024-11-20": { "id": "gpt-4o-2024-11-20", "name": "GPT-4o (2024-11-20)", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -4687,7 +6184,7 @@ "o3": { "id": "o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -4700,70 +6197,10 @@ "cost": { "input": 2, "output": 8 }, "limit": { "context": 200000, "output": 100000 } }, - "Qwen-Qwen2.5-72B-Instruct": { - "id": "Qwen-Qwen2.5-72B-Instruct", - "name": "Qwen 2.5 72B Instruct", - "family": "qwen-2.5", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "release_date": "2024-09-19", - "last_updated": "2024-09-19", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.11, "output": 0.38 }, - "limit": { "context": 128000, "output": 8192 } - }, - "zai-org-glm-4.6": { - "id": "zai-org-glm-4.6", - "name": "GLM-4.6", - "family": "glm-4", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "release_date": "2025-03-01", - "last_updated": "2025-03-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.6, "output": 2.2 }, - "limit": { "context": 128000, "output": 8192 } - }, - "deepseek-deepseek-v3.1": { - "id": "deepseek-deepseek-v3.1", - "name": "DeepSeek V3.1", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-08-01", - "last_updated": "2025-08-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.55, "output": 1.66 }, - "limit": { "context": 128000, "output": 8192 } - }, - "Qwen-QwQ-32B": { - "id": "Qwen-QwQ-32B", - "name": "QwQ 32B", - "family": "qwq", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2024-11-28", - "last_updated": "2024-11-28", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.4, "output": 0.4 }, - "limit": { "context": 32768, "output": 32768 } - }, "gpt-4o-mini": { "id": "gpt-4o-mini", "name": "GPT-4o Mini", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -4776,10 +6213,25 @@ "cost": { "input": 0.15, "output": 0.6 }, "limit": { "context": 128000, "output": 16384 } }, + "qwen3-max": { + "id": "qwen3-max", + "name": "Qwen3 Max", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 6 }, + "limit": { "context": 131072, "output": 16384 } + }, "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -4795,7 +6247,7 @@ "grok-4-1-fast-non-reasoning": { "id": "grok-4-1-fast-non-reasoning", "name": "Grok 4.1 Fast (Non-Reasoning)", - "family": "grok-4.1", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -4810,7 +6262,7 @@ "llama-3.3-70b-versatile": { "id": "llama-3.3-70b-versatile", "name": "Llama 3.3 70B Versatile", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -4840,7 +6292,7 @@ "gpt-5.2": { "id": "gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -4856,7 +6308,7 @@ "gpt-5.1-chat-latest": { "id": "gpt-5.1-chat-latest", "name": "GPT-5.1 Chat Latest", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -4884,6 +6336,262 @@ "open_weights": false, "cost": { "input": 1, "output": 5 }, "limit": { "context": 200000, "output": 64000 } + }, + "deepseek/deepseek-v3.1": { + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek V3.1", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.14, "output": 0.28 }, + "limit": { "context": 128000, "output": 8192 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B", + "family": "gpt-oss", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-08-05", + "last_updated": "2025-08-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.08, "output": 0.44 }, + "limit": { "context": 128000, "output": 32768 } + }, + "meta-llama/Meta-Llama-3.1-8B-Instruct": { + "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.02, "output": 0.05 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo": { + "id": "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + "name": "Llama 3.1 405B Instruct Turbo", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 3.5, "output": 3.5 }, + "limit": { "context": 128000, "output": 4096 } + }, + "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick 17B 128E Instruct FP8", + "family": "llama", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-04-05", + "last_updated": "2025-04-05", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.14, "output": 0.59 }, + "limit": { "context": 1000000, "output": 32768 } + }, + "meta-llama/Meta-Llama-3.1-70B-Instruct": { + "id": "meta-llama/Meta-Llama-3.1-70B-Instruct", + "name": "Llama 3.1 70B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 0.4 }, + "limit": { "context": 128000, "output": 4096 } + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", + "name": "Qwen3 235B A22B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-01", + "last_updated": "2025-07-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.6 }, + "limit": { "context": 262144, "output": 8192 } + }, + "Qwen/Qwen2.5-72B-Instruct": { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-09-19", + "last_updated": "2024-09-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.11, "output": 0.38 }, + "limit": { "context": 128000, "output": 8192 } + }, + "Qwen/QwQ-32B": { + "id": "Qwen/QwQ-32B", + "name": "QwQ 32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2024-11-28", + "last_updated": "2024-11-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 0.4 }, + "limit": { "context": 32768, "output": 32768 } + }, + "Qwen/Qwen3-32B": { + "id": "Qwen/Qwen3-32B", + "name": "Qwen3 32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.29 }, + "limit": { "context": 128000, "output": 8192 } + }, + "Qwen/qwen3-coder-480b-a35b-instruct": { + "id": "Qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.29, "output": 1.2 }, + "limit": { "context": 262144, "output": 65536 } + }, + "zai-org/glm-4.7": { + "id": "zai-org/glm-4.7", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-01", + "last_updated": "2025-06-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.5 }, + "limit": { "context": 128000, "output": 8192 } + }, + "zai-org/glm-4.5": { + "id": "zai-org/glm-4.5", + "name": "GLM-4.5", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "zai-org/glm-4.6": { + "id": "zai-org/glm-4.6", + "name": "GLM-4.6", + "family": "glm", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-01", + "last_updated": "2025-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-ai/DeepSeek-R1": { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1", + "family": "deepseek-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-01-20", + "last_updated": "2025-01-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 3, "output": 7 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-ai/DeepSeek-V3.1-Terminus": { + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-01", + "last_updated": "2025-06-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "deepseek-ai/DeepSeek-V3.2": { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-15", + "last_updated": "2025-06-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 0.4 }, + "limit": { "context": 128000, "output": 8192 } } } }, @@ -4894,10 +6602,91 @@ "name": "Vercel AI Gateway", "doc": "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", "models": { + "moonshotai/kimi-k2-thinking-turbo": { + "id": "moonshotai/kimi-k2-thinking-turbo", + "name": "Kimi K2 Thinking Turbo", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, + "limit": { "context": 262114, "output": 262114 } + }, + "moonshotai/kimi-k2-turbo": { + "id": "moonshotai/kimi-k2-turbo", + "name": "Kimi K2 Turbo", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.4, "output": 10 }, + "limit": { "context": 256000, "output": 16384 } + }, + "moonshotai/kimi-k2.5": { + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01-26", + "last_updated": "2026-01-26", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 1.2 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/kimi-k2-0905": { + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 0905", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 131072, "output": 16384 } + }, + "moonshotai/kimi-k2-thinking": { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.47, "output": 2, "cache_read": 0.14 }, + "limit": { "context": 216144, "output": 216144 } + }, "moonshotai/kimi-k2": { "id": "moonshotai/kimi-k2", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -4911,10 +6700,42 @@ "limit": { "context": 131072, "output": 16384 }, "status": "deprecated" }, + "xiaomi/mimo-v2-flash": { + "id": "xiaomi/mimo-v2-flash", + "name": "MiMo V2 Flash", + "family": "mimo", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.29 }, + "limit": { "context": 262144, "output": 32000 } + }, + "alibaba/qwen3-coder": { + "id": "alibaba/qwen3-coder", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.38, "output": 1.53 }, + "limit": { "context": 262144, "output": 66536 } + }, "alibaba/qwen3-next-80b-a3b-instruct": { "id": "alibaba/qwen3-next-80b-a3b-instruct", "name": "Qwen3 Next 80B A3B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -4924,13 +6745,29 @@ "last_updated": "2025-09-12", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.5, "output": 2 }, - "limit": { "context": 131072, "output": 32768 } + "cost": { "input": 0.09, "output": 1.1 }, + "limit": { "context": 262144, "output": 32768 } + }, + "alibaba/qwen-3-32b": { + "id": "alibaba/qwen-3-32b", + "name": "Qwen 3.32B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 40960, "output": 16384 } }, "alibaba/qwen3-vl-instruct": { "id": "alibaba/qwen3-vl-instruct", "name": "Qwen3 VL Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -4943,10 +6780,104 @@ "cost": { "input": 0.7, "output": 2.8 }, "limit": { "context": 131072, "output": 129024 } }, + "alibaba/qwen-3-235b": { + "id": "alibaba/qwen-3-235b", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.13, "output": 0.6 }, + "limit": { "context": 40960, "output": 16384 } + }, + "alibaba/qwen-3-14b": { + "id": "alibaba/qwen-3-14b", + "name": "Qwen3-14B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.06, "output": 0.24 }, + "limit": { "context": 40960, "output": 16384 } + }, + "alibaba/qwen3-embedding-4b": { + "id": "alibaba/qwen3-embedding-4b", + "name": "Qwen3 Embedding 4B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "alibaba/qwen3-235b-a22b-thinking": { + "id": "alibaba/qwen3-235b-a22b-thinking", + "name": "Qwen3 235B A22B Thinking 2507", + "family": "qwen", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.9 }, + "limit": { "context": 262114, "output": 262114 } + }, + "alibaba/qwen-3-30b": { + "id": "alibaba/qwen-3-30b", + "name": "Qwen3-30B-A3B", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.08, "output": 0.29 }, + "limit": { "context": 40960, "output": 16384 } + }, + "alibaba/qwen3-embedding-0.6b": { + "id": "alibaba/qwen3-embedding-0.6b", + "name": "Qwen3 Embedding 0.6B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-11-14", + "last_updated": "2025-11-14", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.01, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, "alibaba/qwen3-vl-thinking": { "id": "alibaba/qwen3-vl-thinking", "name": "Qwen3 VL Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -4962,7 +6893,7 @@ "alibaba/qwen3-max": { "id": "alibaba/qwen3-max", "name": "Qwen3 Max", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -4975,10 +6906,41 @@ "cost": { "input": 1.2, "output": 6 }, "limit": { "context": 262144, "output": 32768 } }, + "alibaba/qwen3-embedding-8b": { + "id": "alibaba/qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-06-05", + "last_updated": "2025-06-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0 }, + "limit": { "context": 32768, "output": 32768 } + }, + "alibaba/qwen3-max-preview": { + "id": "alibaba/qwen3-max-preview", + "name": "Qwen3 Max Preview", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 6, "cache_read": 0.24 }, + "limit": { "context": 262144, "output": 32768 } + }, "alibaba/qwen3-coder-plus": { "id": "alibaba/qwen3-coder-plus", "name": "Qwen3 Coder Plus", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -4994,7 +6956,7 @@ "alibaba/qwen3-next-80b-a3b-thinking": { "id": "alibaba/qwen3-next-80b-a3b-thinking", "name": "Qwen3 Next 80B A3B Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -5004,13 +6966,108 @@ "last_updated": "2025-09-12", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.5, "output": 6 }, - "limit": { "context": 131072, "output": 32768 } + "cost": { "input": 0.15, "output": 1.5 }, + "limit": { "context": 131072, "output": 65536 } + }, + "alibaba/qwen3-coder-30b-a3b": { + "id": "alibaba/qwen3-coder-30b-a3b", + "name": "Qwen 3 Coder 30B A3B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-04", + "last_updated": "2025-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.07, "output": 0.27 }, + "limit": { "context": 160000, "output": 32768 } + }, + "meituan/longcat-flash-thinking": { + "id": "meituan/longcat-flash-thinking", + "name": "LongCat Flash Thinking", + "family": "longcat", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 1.5 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meituan/longcat-flash-chat": { + "id": "meituan/longcat-flash-chat", + "name": "LongCat Flash Chat", + "family": "longcat", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-30", + "last_updated": "2025-08-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 128000, "output": 8192 } + }, + "xai/grok-4-fast-reasoning": { + "id": "xai/grok-4-fast-reasoning", + "name": "Grok 4 Fast Reasoning", + "family": "grok", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 256000 } + }, + "xai/grok-4.1-fast-reasoning": { + "id": "xai/grok-4.1-fast-reasoning", + "name": "Grok 4.1 Fast Reasoning", + "family": "grok", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } + }, + "xai/grok-4.1-fast-non-reasoning": { + "id": "xai/grok-4.1-fast-non-reasoning", + "name": "Grok 4.1 Fast Non-Reasoning", + "family": "grok", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, + "limit": { "context": 2000000, "output": 30000 } }, "xai/grok-3-mini-fast": { "id": "xai/grok-3-mini-fast", "name": "Grok 3 Mini Fast", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -5026,7 +7083,7 @@ "xai/grok-3-mini": { "id": "xai/grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -5039,26 +7096,10 @@ "cost": { "input": 0.3, "output": 0.5, "reasoning": 0.5, "cache_read": 0.075 }, "limit": { "context": 131072, "output": 8192 } }, - "xai/grok-4-fast": { - "id": "xai/grok-4-fast", - "name": "Grok 4 Fast", - "family": "grok", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-07", - "release_date": "2025-09-19", - "last_updated": "2025-09-19", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, - "limit": { "context": 2000000, "output": 30000 } - }, "xai/grok-3": { "id": "xai/grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -5071,22 +7112,6 @@ "cost": { "input": 3, "output": 15, "cache_read": 0.75 }, "limit": { "context": 131072, "output": 8192 } }, - "xai/grok-2": { - "id": "xai/grok-2", - "name": "Grok 2", - "family": "grok-2", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-08", - "release_date": "2024-08-20", - "last_updated": "2024-08-20", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 2, "output": 10, "cache_read": 2 }, - "limit": { "context": 131072, "output": 8192 } - }, "xai/grok-code-fast-1": { "id": "xai/grok-code-fast-1", "name": "Grok Code Fast 1", @@ -5106,7 +7131,7 @@ "xai/grok-2-vision": { "id": "xai/grok-2-vision", "name": "Grok 2 Vision", - "family": "grok-2", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -5138,7 +7163,7 @@ "xai/grok-3-fast": { "id": "xai/grok-3-fast", "name": "Grok 3 Fast", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -5167,6 +7192,240 @@ "cost": { "input": 0.2, "output": 0.5, "cache_read": 0.05 }, "limit": { "context": 2000000, "output": 30000 } }, + "nvidia/nemotron-nano-9b-v2": { + "id": "nvidia/nemotron-nano-9b-v2", + "name": "Nvidia Nemotron Nano 9B V2", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-18", + "last_updated": "2025-08-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.04, "output": 0.16 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nvidia/nemotron-nano-12b-v2-vl": { + "id": "nvidia/nemotron-nano-12b-v2-vl", + "name": "Nvidia Nemotron Nano 12B V2 VL", + "family": "nemotron", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-12", + "last_updated": "2024-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nvidia/nemotron-3-nano-30b-a3b": { + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "Nemotron 3 Nano 30B A3B", + "family": "nemotron", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-12", + "last_updated": "2024-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.06, "output": 0.24 }, + "limit": { "context": 262144, "output": 262144 } + }, + "cohere/embed-v4.0": { + "id": "cohere/embed-v4.0", + "name": "Embed v4.0", + "family": "cohere-embed", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-04-15", + "last_updated": "2025-04-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.12, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "cohere/command-a": { + "id": "cohere/command-a", + "name": "Command A", + "family": "command", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.5, "output": 10 }, + "limit": { "context": 256000, "output": 8000 } + }, + "kwaipilot/kat-coder-pro-v1": { + "id": "kwaipilot/kat-coder-pro-v1", + "name": "KAT-Coder-Pro V1", + "family": "kat-coder", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-10-24", + "last_updated": "2025-10-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 256000, "output": 32000 } + }, + "mistral/mistral-medium": { + "id": "mistral/mistral-medium", + "name": "Mistral Medium 3.1", + "family": "mistral-medium", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 128000, "output": 64000 } + }, + "mistral/codestral-embed": { + "id": "mistral/codestral-embed", + "name": "Codestral Embed", + "family": "codestral-embed", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "mistral/devstral-2": { + "id": "mistral/devstral-2", + "name": "Devstral 2", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-09", + "last_updated": "2025-12-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 256000, "output": 256000 } + }, + "mistral/devstral-small": { + "id": "mistral/devstral-small", + "name": "Devstral Small 1.1", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 128000, "output": 64000 } + }, + "mistral/mistral-large-3": { + "id": "mistral/mistral-large-3", + "name": "Mistral Large 3", + "family": "mistral-large", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-02", + "last_updated": "2025-12-02", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 256000, "output": 256000 } + }, + "mistral/mistral-embed": { + "id": "mistral/mistral-embed", + "name": "Mistral Embed", + "family": "mistral-embed", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2023-12-11", + "last_updated": "2023-12-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "mistral/mistral-nemo": { + "id": "mistral/mistral-nemo", + "name": "Mistral Nemo", + "family": "mistral-nemo", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-07-01", + "last_updated": "2024-07-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.04, "output": 0.17 }, + "limit": { "context": 60288, "output": 16000 } + }, + "mistral/ministral-14b": { + "id": "mistral/ministral-14b", + "name": "Ministral 14B", + "family": "ministral", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.2 }, + "limit": { "context": 256000, "output": 256000 } + }, + "mistral/devstral-small-2": { + "id": "mistral/devstral-small-2", + "name": "Devstral Small 2", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-05-07", + "last_updated": "2025-05-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 256000, "output": 256000 } + }, "mistral/codestral": { "id": "mistral/codestral", "name": "Codestral", @@ -5199,26 +7458,10 @@ "cost": { "input": 2, "output": 5 }, "limit": { "context": 128000, "output": 16384 } }, - "mistral/mistral-large": { - "id": "mistral/mistral-large", - "name": "Mistral Large", - "family": "mistral-large", - "attachment": true, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-11", - "release_date": "2024-11-01", - "last_updated": "2025-12-02", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.5, "output": 1.5 }, - "limit": { "context": 262144, "output": 262144 } - }, "mistral/pixtral-large": { "id": "mistral/pixtral-large", "name": "Pixtral Large", - "family": "pixtral-large", + "family": "pixtral", "attachment": true, "reasoning": false, "tool_call": true, @@ -5234,7 +7477,7 @@ "mistral/ministral-8b": { "id": "mistral/ministral-8b", "name": "Ministral 8B", - "family": "ministral-8b", + "family": "ministral", "attachment": false, "reasoning": false, "tool_call": true, @@ -5250,7 +7493,7 @@ "mistral/ministral-3b": { "id": "mistral/ministral-3b", "name": "Ministral 3B", - "family": "ministral-3b", + "family": "ministral", "attachment": false, "reasoning": false, "tool_call": true, @@ -5314,7 +7557,7 @@ "mistral/mixtral-8x22b-instruct": { "id": "mistral/mixtral-8x22b-instruct", "name": "Mixtral 8x22B", - "family": "mixtral-8x22b", + "family": "mixtral", "attachment": false, "reasoning": false, "tool_call": true, @@ -5357,26 +7600,42 @@ "cost": { "input": 3, "output": 15 }, "limit": { "context": 128000, "output": 32000 } }, - "deepseek/deepseek-v3.2-exp-thinking": { - "id": "deepseek/deepseek-v3.2-exp-thinking", - "name": "DeepSeek V3.2 Exp Thinking", - "family": "deepseek-v3", + "deepseek/deepseek-v3": { + "id": "deepseek/deepseek-v3", + "name": "DeepSeek V3 0324", + "family": "deepseek", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2024-12-26", + "last_updated": "2024-12-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.77, "output": 0.77 }, + "limit": { "context": 163840, "output": 16384 } + }, + "deepseek/deepseek-v3.2-thinking": { + "id": "deepseek/deepseek-v3.2-thinking", + "name": "DeepSeek V3.2 Thinking", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, "temperature": true, - "knowledge": "2025-09", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.28, "output": 0.42 }, - "limit": { "context": 163840, "output": 8192 } + "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.03 }, + "limit": { "context": 128000, "output": 64000 } }, "deepseek/deepseek-v3.1-terminus": { "id": "deepseek/deepseek-v3.1-terminus", "name": "DeepSeek V3.1 Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -5387,14 +7646,30 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.27, "output": 1 }, - "limit": { "context": 128000, "output": 8192 } + "limit": { "context": 131072, "output": 65536 } + }, + "deepseek/deepseek-v3.1": { + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek-V3.1", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1 }, + "limit": { "context": 163840, "output": 128000 } }, "deepseek/deepseek-v3.2-exp": { "id": "deepseek/deepseek-v3.2-exp", "name": "DeepSeek V3.2 Exp", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, - "reasoning": false, + "reasoning": true, "tool_call": true, "temperature": true, "knowledge": "2025-09", @@ -5402,30 +7677,29 @@ "last_updated": "2025-09-29", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.28, "output": 0.42 }, - "limit": { "context": 163840, "output": 8192 } + "cost": { "input": 0.27, "output": 0.4 }, + "limit": { "context": 163840, "output": 163840 } }, - "deepseek/deepseek-r1-distill-llama-70b": { - "id": "deepseek/deepseek-r1-distill-llama-70b", - "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "deepseek/deepseek-v3.2": { + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek V3.2", + "family": "deepseek", "attachment": false, - "reasoning": true, - "tool_call": true, + "reasoning": false, + "tool_call": false, "temperature": true, "knowledge": "2024-07", - "release_date": "2025-01-20", - "last_updated": "2025-01-20", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.75, "output": 0.99 }, - "limit": { "context": 131072, "output": 8192 }, - "status": "deprecated" + "open_weights": false, + "cost": { "input": 0.27, "output": 0.4, "cache_read": 0.22 }, + "limit": { "context": 163842, "output": 8000 } }, "deepseek/deepseek-r1": { "id": "deepseek/deepseek-r1", "name": "DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -5438,6 +7712,120 @@ "cost": { "input": 1.35, "output": 5.4 }, "limit": { "context": 128000, "output": 32768 } }, + "recraft/recraft-v3": { + "id": "recraft/recraft-v3", + "name": "Recraft V3", + "family": "recraft", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-10", + "last_updated": "2024-10", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "recraft/recraft-v2": { + "id": "recraft/recraft-v2", + "name": "Recraft V2", + "family": "recraft", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-03", + "last_updated": "2024-03", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "bfl/flux-kontext-pro": { + "id": "bfl/flux-kontext-pro", + "name": "FLUX.1 Kontext Pro", + "family": "flux", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-06", + "last_updated": "2025-06", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "bfl/flux-kontext-max": { + "id": "bfl/flux-kontext-max", + "name": "FLUX.1 Kontext Max", + "family": "flux", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-06", + "last_updated": "2025-06", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "bfl/flux-pro-1.1": { + "id": "bfl/flux-pro-1.1", + "name": "FLUX1.1 [pro]", + "family": "flux", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-10", + "last_updated": "2024-10", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "bfl/flux-pro-1.1-ultra": { + "id": "bfl/flux-pro-1.1-ultra", + "name": "FLUX1.1 [pro] Ultra", + "family": "flux", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-11", + "last_updated": "2024-11", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "bfl/flux-pro-1.0-fill": { + "id": "bfl/flux-pro-1.0-fill", + "name": "FLUX.1 Fill [pro]", + "family": "flux", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-10", + "last_updated": "2024-10", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 512, "output": 0 } + }, + "arcee-ai/trinity-mini": { + "id": "arcee-ai/trinity-mini", + "name": "Trinity Mini", + "family": "trinity", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12", + "last_updated": "2025-12", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.05, "output": 0.15 }, + "limit": { "context": 131072, "output": 131072 } + }, "minimax/minimax-m2": { "id": "minimax/minimax-m2", "name": "MiniMax M2", @@ -5451,8 +7839,250 @@ "last_updated": "2025-10-27", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, + "cost": { "input": 0.27, "output": 1.15, "cache_read": 0.03, "cache_write": 0.38 }, + "limit": { "context": 262114, "output": 262114 } + }, + "minimax/minimax-m2.1-lightning": { + "id": "minimax/minimax-m2.1-lightning", + "name": "MiniMax M2.1 Lightning", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.4, "cache_read": 0.03, "cache_write": 0.38 }, + "limit": { "context": 204800, "output": 131072 } + }, + "minimax/minimax-m2.1": { + "id": "minimax/minimax-m2.1", + "name": "MiniMax M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03, "cache_write": 0.38 }, - "limit": { "context": 205000, "output": 131072 } + "limit": { "context": 204800, "output": 131072 } + }, + "bytedance/seed-1.6": { + "id": "bytedance/seed-1.6", + "name": "Seed 1.6", + "family": "seed", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-09", + "last_updated": "2025-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.05 }, + "limit": { "context": 256000, "output": 32000 } + }, + "bytedance/seed-1.8": { + "id": "bytedance/seed-1.8", + "name": "Seed 1.8", + "family": "seed", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-10", + "last_updated": "2025-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.05 }, + "limit": { "context": 256000, "output": 64000 } + }, + "voyage/voyage-code-2": { + "id": "voyage/voyage-code-2", + "name": "voyage-code-2", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-01", + "last_updated": "2024-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.12, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "voyage/voyage-3.5-lite": { + "id": "voyage/voyage-3.5-lite", + "name": "voyage-3.5-lite", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "voyage/voyage-3.5": { + "id": "voyage/voyage-3.5", + "name": "voyage-3.5", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.06, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "voyage/voyage-finance-2": { + "id": "voyage/voyage-finance-2", + "name": "voyage-finance-2", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-03", + "last_updated": "2024-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.12, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "voyage/voyage-law-2": { + "id": "voyage/voyage-law-2", + "name": "voyage-law-2", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-03", + "last_updated": "2024-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.12, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "voyage/voyage-code-3": { + "id": "voyage/voyage-code-3", + "name": "voyage-code-3", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-09", + "last_updated": "2024-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "voyage/voyage-3-large": { + "id": "voyage/voyage-3-large", + "name": "voyage-3-large", + "family": "voyage", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-09", + "last_updated": "2024-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.18, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "google/gemini-embedding-001": { + "id": "google/gemini-embedding-001", + "name": "Gemini Embedding 001", + "family": "gemini-embedding", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-05-20", + "last_updated": "2025-05-20", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "google/imagen-4.0-ultra-generate-001": { + "id": "google/imagen-4.0-ultra-generate-001", + "name": "Imagen 4 Ultra", + "family": "imagen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-05-24", + "last_updated": "2025-05-24", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 480, "output": 0 } + }, + "google/gemini-2.5-flash-image": { + "id": "google/gemini-2.5-flash-image", + "name": "Nano Banana (Gemini 2.5 Flash Image)", + "family": "gemini-flash", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-03-20", + "last_updated": "2025-03-20", + "modalities": { "input": ["text"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 32768, "output": 32768 } + }, + "google/imagen-4.0-fast-generate-001": { + "id": "google/imagen-4.0-fast-generate-001", + "name": "Imagen 4 Fast", + "family": "imagen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-06", + "last_updated": "2025-06", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 480, "output": 0 } + }, + "google/imagen-4.0-generate-001": { + "id": "google/imagen-4.0-generate-001", + "name": "Imagen 4", + "family": "imagen", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text"], "output": ["image"] }, + "open_weights": false, + "limit": { "context": 480, "output": 0 } }, "google/gemini-3-pro-preview": { "id": "google/gemini-3-pro-preview", @@ -5461,7 +8091,6 @@ "attachment": true, "reasoning": true, "tool_call": true, - "structured_output": true, "temperature": true, "knowledge": "2025-01", "release_date": "2025-11-18", @@ -5489,9 +8118,71 @@ "last_updated": "2025-06-17", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.01 }, "limit": { "context": 1048576, "output": 65536 } }, + "google/text-multilingual-embedding-002": { + "id": "google/text-multilingual-embedding-002", + "name": "Text Multilingual Embedding 002", + "family": "text-embedding", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-03", + "last_updated": "2024-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.03, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "google/gemini-3-pro-image": { + "id": "google/gemini-3-pro-image", + "name": "Nano Banana Pro (Gemini 3 Pro Image)", + "family": "gemini-pro", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-09", + "last_updated": "2025-09", + "modalities": { "input": ["text"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 2, "output": 120 }, + "limit": { "context": 65536, "output": 32768 } + }, + "google/text-embedding-005": { + "id": "google/text-embedding-005", + "name": "Text Embedding 005", + "family": "text-embedding", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-08", + "last_updated": "2024-08", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.03, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "google/gemini-2.5-flash-image-preview": { + "id": "google/gemini-2.5-flash-image-preview", + "name": "Nano Banana Preview (Gemini 2.5 Flash Image Preview)", + "family": "gemini-flash", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-03-20", + "last_updated": "2025-03-20", + "modalities": { "input": ["text"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 32768, "output": 32768 } + }, "google/gemini-2.5-flash-preview-09-2025": { "id": "google/gemini-2.5-flash-preview-09-2025", "name": "Gemini 2.5 Flash Preview 09-25", @@ -5505,9 +8196,25 @@ "last_updated": "2025-09-25", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "cache_write": 0.383 }, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.03, "cache_write": 0.383 }, "limit": { "context": 1048576, "output": 65536 } }, + "google/gemini-3-flash": { + "id": "google/gemini-3-flash", + "name": "Gemini 3 Flash", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 3, "cache_read": 0.05 }, + "limit": { "context": 1000000, "output": 64000 } + }, "google/gemini-2.5-flash-lite-preview-09-2025": { "id": "google/gemini-2.5-flash-lite-preview-09-2025", "name": "Gemini 2.5 Flash Lite Preview 09-25", @@ -5521,7 +8228,7 @@ "last_updated": "2025-09-25", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.01 }, "limit": { "context": 1048576, "output": 65536 } }, "google/gemini-2.5-pro": { @@ -5592,6 +8299,323 @@ "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, "limit": { "context": 1048576, "output": 65536 } }, + "prime-intellect/intellect-3": { + "id": "prime-intellect/intellect-3", + "name": "INTELLECT 3", + "family": "intellect", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-11-26", + "last_updated": "2025-11-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 1.1 }, + "limit": { "context": 131072, "output": 131072 } + }, + "inception/mercury-coder-small": { + "id": "inception/mercury-coder-small", + "name": "Mercury Coder Small Beta", + "family": "mercury", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-02-26", + "last_updated": "2025-02-26", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 32000, "output": 16384 } + }, + "openai/text-embedding-3-small": { + "id": "openai/text-embedding-3-small", + "name": "text-embedding-3-small", + "family": "text-embedding", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "openai/gpt-5.2-chat": { + "id": "openai/gpt-5.2-chat", + "name": "GPT-5.2 Chat", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.18 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-oss-safeguard-20b": { + "id": "openai/gpt-oss-safeguard-20b", + "name": "gpt-oss-safeguard-20b", + "family": "gpt-oss", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.08, "output": 0.3, "cache_read": 0.04 }, + "limit": { "context": 131072, "output": 65536 } + }, + "openai/gpt-5.2-codex": { + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12", + "last_updated": "2025-12", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5.1-codex": { + "id": "openai/gpt-5.1-codex", + "name": "GPT-5.1-Codex", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5-chat": { + "id": "openai/gpt-5-chat", + "name": "GPT-5 Chat", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/o3-deep-research": { + "id": "openai/o3-deep-research", + "name": "o3-deep-research", + "family": "o", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-10", + "release_date": "2024-06-26", + "last_updated": "2024-06-26", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 10, "output": 40, "cache_read": 2.5 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-3.5-turbo": { + "id": "openai/gpt-3.5-turbo", + "name": "GPT-3.5 Turbo", + "family": "gpt", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2021-09", + "release_date": "2023-03-01", + "last_updated": "2023-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 1.5 }, + "limit": { "context": 16385, "output": 4096 } + }, + "openai/gpt-5.2-pro": { + "id": "openai/gpt-5.2-pro", + "name": "GPT 5.2 ", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 21, "output": 168 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/text-embedding-3-large": { + "id": "openai/text-embedding-3-large", + "name": "text-embedding-3-large", + "family": "text-embedding", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-01-25", + "last_updated": "2024-01-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.13, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "openai/gpt-5.1-codex-mini": { + "id": "openai/gpt-5.1-codex-mini", + "name": "GPT-5.1 Codex mini", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-05-16", + "last_updated": "2025-05-16", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-5.1-instant": { + "id": "openai/gpt-5.1-instant", + "name": "GPT-5.1 Instant", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 128000, "output": 16384 } + }, + "openai/gpt-5.1-thinking": { + "id": "openai/gpt-5.1-thinking", + "name": "GPT 5.1 Thinking", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/text-embedding-ada-002": { + "id": "openai/text-embedding-ada-002", + "name": "text-embedding-ada-002", + "family": "text-embedding", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2022-12-15", + "last_updated": "2022-12-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, + "openai/o3-pro": { + "id": "openai/o3-pro", + "name": "o3 Pro", + "family": "o-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2024-10", + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 20, "output": 80 }, + "limit": { "context": 200000, "output": 100000 } + }, + "openai/gpt-5.1-codex-max": { + "id": "openai/gpt-5.1-codex-max", + "name": "GPT 5.1 Codex Max", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, + "limit": { "context": 400000, "output": 128000 } + }, + "openai/gpt-3.5-turbo-instruct": { + "id": "openai/gpt-3.5-turbo-instruct", + "name": "GPT-3.5 Turbo Instruct", + "family": "gpt", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2021-09", + "release_date": "2023-03-01", + "last_updated": "2023-03-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 2 }, + "limit": { "context": 8192, "output": 4096 } + }, + "openai/codex-mini": { + "id": "openai/codex-mini", + "name": "Codex Mini", + "family": "gpt-codex-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-05-16", + "last_updated": "2025-05-16", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.5, "output": 6, "cache_read": 0.38 }, + "limit": { "context": 200000, "output": 100000 } + }, "openai/gpt-oss-20b": { "id": "openai/gpt-oss-20b", "name": "GPT OSS 20B", @@ -5600,6 +8624,7 @@ "reasoning": true, "tool_call": true, "temperature": true, + "knowledge": "2024-10", "release_date": "2025-08-05", "last_updated": "2025-08-05", "modalities": { "input": ["text"], "output": ["text"] }, @@ -5615,17 +8640,50 @@ "reasoning": true, "tool_call": true, "temperature": true, + "knowledge": "2024-10", "release_date": "2025-08-05", "last_updated": "2025-08-05", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.1, "output": 0.5 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 131072, "output": 131072 } + }, + "openai/gpt-5-pro": { + "id": "openai/gpt-5-pro", + "name": "GPT-5 pro", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text", "image"] }, + "open_weights": false, + "cost": { "input": 15, "output": 120 }, + "limit": { "context": 400000, "output": 272000 } + }, + "openai/gpt-5.2": { + "id": "openai/gpt-5.2", + "name": "GPT-5.2", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-08-07", + "last_updated": "2025-08-07", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.18 }, + "limit": { "context": 400000, "output": 128000 } }, "openai/gpt-5": { "id": "openai/gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -5636,13 +8694,13 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, - "limit": { "context": 400000, "output": 128000 } + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "openai/gpt-4o-mini": { "id": "openai/gpt-4o-mini", "name": "GPT-4o mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -5659,7 +8717,7 @@ "openai/o3": { "id": "openai/o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -5676,7 +8734,7 @@ "openai/gpt-5-mini": { "id": "openai/gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -5687,13 +8745,13 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, - "limit": { "context": 400000, "output": 128000 } + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "openai/o1": { "id": "openai/o1", "name": "o1", - "family": "o1", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -5710,7 +8768,7 @@ "openai/o4-mini": { "id": "openai/o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -5727,7 +8785,7 @@ "openai/gpt-4.1": { "id": "openai/gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -5744,7 +8802,7 @@ "openai/gpt-4o": { "id": "openai/gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -5761,7 +8819,7 @@ "openai/gpt-5-codex": { "id": "openai/gpt-5-codex", "name": "GPT-5-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -5773,12 +8831,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "openai/gpt-5-nano": { "id": "openai/gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -5789,13 +8847,13 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, - "limit": { "context": 400000, "output": 128000 } + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.005 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "openai/o3-mini": { "id": "openai/o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -5812,7 +8870,7 @@ "openai/gpt-4-turbo": { "id": "openai/gpt-4-turbo", "name": "GPT-4 Turbo", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -5829,7 +8887,7 @@ "openai/gpt-4.1-mini": { "id": "openai/gpt-4.1-mini", "name": "GPT-4.1 mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -5846,7 +8904,7 @@ "openai/gpt-4.1-nano": { "id": "openai/gpt-4.1-nano", "name": "GPT-4.1 nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -5880,9 +8938,9 @@ "id": "perplexity/sonar", "name": "Sonar", "family": "sonar", - "attachment": false, + "attachment": true, "reasoning": false, - "tool_call": false, + "tool_call": true, "temperature": true, "knowledge": "2025-02", "release_date": "2025-02-19", @@ -5896,9 +8954,9 @@ "id": "perplexity/sonar-pro", "name": "Sonar Pro", "family": "sonar-pro", - "attachment": false, + "attachment": true, "reasoning": false, - "tool_call": false, + "tool_call": true, "temperature": true, "knowledge": "2025-09", "release_date": "2025-02-19", @@ -5924,10 +8982,41 @@ "cost": { "input": 2, "output": 8 }, "limit": { "context": 127000, "output": 8000 } }, + "zai/glm-4.7": { + "id": "zai/glm-4.7", + "name": "GLM 4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.43, "output": 1.75, "cache_read": 0.08 }, + "limit": { "context": 202752, "output": 120000 } + }, + "zai/glm-4.6v-flash": { + "id": "zai/glm-4.6v-flash", + "name": "GLM-4.6V-Flash", + "family": "glm", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "limit": { "context": 128000, "output": 24000 } + }, "zai/glm-4.5": { "id": "zai/glm-4.5", "name": "GLM 4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -5938,12 +9027,12 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.6, "output": 2.2 }, - "limit": { "context": 128000, "output": 96000 } + "limit": { "context": 131072, "output": 131072 } }, "zai/glm-4.5-air": { "id": "zai/glm-4.5-air", "name": "GLM 4.5 Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -5959,7 +9048,7 @@ "zai/glm-4.5v": { "id": "zai/glm-4.5v", "name": "GLM 4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -5970,12 +9059,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.6, "output": 1.8 }, - "limit": { "context": 66000, "output": 16000 } + "limit": { "context": 66000, "output": 66000 } }, "zai/glm-4.6": { "id": "zai/glm-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -5985,9 +9074,56 @@ "last_updated": "2025-09-30", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.6, "output": 2.2 }, + "cost": { "input": 0.45, "output": 1.8 }, "limit": { "context": 200000, "output": 96000 } }, + "zai/glm-4.6v": { + "id": "zai/glm-4.6v", + "name": "GLM-4.6V", + "family": "glm", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.9, "cache_read": 0.05 }, + "limit": { "context": 128000, "output": 24000 } + }, + "amazon/nova-2-lite": { + "id": "amazon/nova-2-lite", + "name": "Nova 2 Lite", + "family": "nova", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2024-12-01", + "last_updated": "2024-12-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 2.5 }, + "limit": { "context": 1000000, "output": 1000000 } + }, + "amazon/titan-embed-text-v2": { + "id": "amazon/titan-embed-text-v2", + "name": "Titan Text Embeddings V2", + "family": "titan-embed", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": false, + "release_date": "2024-04", + "last_updated": "2024-04", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.02, "output": 0 }, + "limit": { "context": 8192, "output": 1536 } + }, "amazon/nova-micro": { "id": "amazon/nova-micro", "name": "Nova Micro", @@ -6039,7 +9175,7 @@ "morph/morph-v3-fast": { "id": "morph/morph-v3-fast", "name": "Morph v3 Fast", - "family": "morph-v3-fast", + "family": "morph", "attachment": false, "reasoning": false, "tool_call": false, @@ -6054,7 +9190,7 @@ "morph/morph-v3-large": { "id": "morph/morph-v3-large", "name": "Morph v3 Large", - "family": "morph-v3-large", + "family": "morph", "attachment": false, "reasoning": false, "tool_call": false, @@ -6066,10 +9202,106 @@ "cost": { "input": 0.9, "output": 1.9 }, "limit": { "context": 32000, "output": 32000 } }, + "meta/llama-3.1-8b": { + "id": "meta/llama-3.1-8b", + "name": "Llama 3.1 8B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.03, "output": 0.05 }, + "limit": { "context": 131072, "output": 16384 } + }, + "meta/llama-3.2-90b": { + "id": "meta/llama-3.2-90b", + "name": "Llama 3.2 90B Vision Instruct", + "family": "llama", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.72, "output": 0.72 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/llama-3.2-1b": { + "id": "meta/llama-3.2-1b", + "name": "Llama 3.2 1B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-18", + "last_updated": "2024-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.1, "output": 0.1 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/llama-3.2-11b": { + "id": "meta/llama-3.2-11b", + "name": "Llama 3.2 11B Vision Instruct", + "family": "llama", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-25", + "last_updated": "2024-09-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.16, "output": 0.16 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/llama-3.2-3b": { + "id": "meta/llama-3.2-3b", + "name": "Llama 3.2 3B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-09-18", + "last_updated": "2024-09-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.15, "output": 0.15 }, + "limit": { "context": 128000, "output": 8192 } + }, + "meta/llama-3.1-70b": { + "id": "meta/llama-3.1-70b", + "name": "Llama 3.1 70B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-07-23", + "last_updated": "2024-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 0.4 }, + "limit": { "context": 131072, "output": 16384 } + }, "meta/llama-4-scout": { "id": "meta/llama-4-scout", "name": "Llama-4-Scout-17B-16E-Instruct-FP8", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -6085,7 +9317,7 @@ "meta/llama-3.3-70b": { "id": "meta/llama-3.3-70b", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -6101,7 +9333,7 @@ "meta/llama-4-maverick": { "id": "meta/llama-4-maverick", "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -6127,9 +9359,25 @@ "last_updated": "2025-10-15", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 1, "output": 1.25, "cache_read": 0.1, "cache_write": 1.25 }, + "cost": { "input": 1, "output": 5, "cache_read": 0.1, "cache_write": 1.25 }, "limit": { "context": 200000, "output": 64000 } }, + "anthropic/claude-3.5-sonnet-20240620": { + "id": "anthropic/claude-3.5-sonnet-20240620", + "name": "Claude 3.5 Sonnet (2024-06-20)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-06-20", + "last_updated": "2024-06-20", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15 }, + "limit": { "context": 200000, "output": 8192 } + }, "anthropic/claude-opus-4.5": { "id": "anthropic/claude-opus-4.5", "name": "Claude Opus 4.5", @@ -6143,7 +9391,39 @@ "last_updated": "2025-11-24", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-sonnet-4.5": { + "id": "anthropic/claude-sonnet-4.5", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07-31", + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, + "limit": { "context": 200000, "output": 64000 } + }, + "anthropic/claude-sonnet-4": { + "id": "anthropic/claude-sonnet-4", + "name": "Claude Sonnet 4", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, "limit": { "context": 200000, "output": 64000 } }, "anthropic/claude-3.5-haiku": { @@ -6178,21 +9458,21 @@ "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, "limit": { "context": 200000, "output": 64000 } }, - "anthropic/claude-4.5-sonnet": { - "id": "anthropic/claude-4.5-sonnet", - "name": "Claude Sonnet 4.5", - "family": "claude-sonnet", + "anthropic/claude-opus-4.1": { + "id": "anthropic/claude-opus-4.1", + "name": "Claude Opus 4", + "family": "claude-opus", "attachment": true, "reasoning": true, "tool_call": true, "temperature": true, - "knowledge": "2025-07-31", - "release_date": "2025-09-29", - "last_updated": "2025-09-29", + "knowledge": "2025-03-31", + "release_date": "2025-05-22", + "last_updated": "2025-05-22", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, - "limit": { "context": 200000, "output": 64000 } + "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, + "limit": { "context": 200000, "output": 32000 } }, "anthropic/claude-3.5-sonnet": { "id": "anthropic/claude-3.5-sonnet", @@ -6210,38 +9490,6 @@ "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, "limit": { "context": 200000, "output": 8192 } }, - "anthropic/claude-4-1-opus": { - "id": "anthropic/claude-4-1-opus", - "name": "Claude Opus 4", - "family": "claude-opus", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", - "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 15, "output": 75, "cache_read": 1.5, "cache_write": 18.75 }, - "limit": { "context": 200000, "output": 32000 } - }, - "anthropic/claude-4-sonnet": { - "id": "anthropic/claude-4-sonnet", - "name": "Claude Sonnet 4", - "family": "claude-sonnet", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-03-31", - "release_date": "2025-05-22", - "last_updated": "2025-05-22", - "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, - "limit": { "context": 200000, "output": 64000 } - }, "anthropic/claude-3-opus": { "id": "anthropic/claude-3-opus", "name": "Claude Opus 3", @@ -6274,8 +9522,8 @@ "cost": { "input": 0.25, "output": 1.25, "cache_read": 0.03, "cache_write": 0.3 }, "limit": { "context": 200000, "output": 4096 } }, - "anthropic/claude-4-opus": { - "id": "anthropic/claude-4-opus", + "anthropic/claude-opus-4": { + "id": "anthropic/claude-opus-4", "name": "Claude Opus 4", "family": "claude-opus", "attachment": true, @@ -6335,7 +9583,7 @@ "moonshotai/kimi-k2-instruct": { "id": "moonshotai/kimi-k2-instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": true, "tool_call": true, @@ -6351,7 +9599,7 @@ "nvidia/llama-3_1-nemotron-ultra-253b-v1": { "id": "nvidia/llama-3_1-nemotron-ultra-253b-v1", "name": "Llama 3.1 Nemotron Ultra 253B v1", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -6399,7 +9647,7 @@ "qwen/qwen3-235b-a22b-instruct-2507": { "id": "qwen/qwen3-235b-a22b-instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6415,7 +9663,7 @@ "qwen/qwen3-235b-a22b-thinking-2507": { "id": "qwen/qwen3-235b-a22b-thinking-2507", "name": "Qwen3 235B A22B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6431,7 +9679,7 @@ "qwen/qwen3-coder-480b-a35b-instruct": { "id": "qwen/qwen3-coder-480b-a35b-instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6447,7 +9695,7 @@ "meta-llama/llama-3_1-405b-instruct": { "id": "meta-llama/llama-3_1-405b-instruct", "name": "Llama 3.1 405B Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -6463,7 +9711,7 @@ "meta-llama/llama-3.3-70b-instruct-fast": { "id": "meta-llama/llama-3.3-70b-instruct-fast", "name": "Llama-3.3-70B-Instruct (Fast)", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -6479,7 +9727,7 @@ "meta-llama/llama-3.3-70b-instruct-base": { "id": "meta-llama/llama-3.3-70b-instruct-base", "name": "Llama-3.3-70B-Instruct (Base)", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -6495,7 +9743,7 @@ "zai-org/glm-4.5": { "id": "zai-org/glm-4.5", "name": "GLM 4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -6511,7 +9759,7 @@ "zai-org/glm-4.5-air": { "id": "zai-org/glm-4.5-air", "name": "GLM 4.5 Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -6527,7 +9775,7 @@ "deepseek-ai/deepseek-v3": { "id": "deepseek-ai/deepseek-v3", "name": "DeepSeek V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -6553,7 +9801,7 @@ "deepseek-chat": { "id": "deepseek-chat", "name": "DeepSeek Chat", - "family": "deepseek-chat", + "family": "deepseek", "attachment": true, "reasoning": false, "tool_call": true, @@ -6569,7 +9817,7 @@ "deepseek-reasoner": { "id": "deepseek-reasoner", "name": "DeepSeek Reasoner", - "family": "deepseek", + "family": "deepseek-thinking", "attachment": true, "reasoning": true, "tool_call": true, @@ -6611,7 +9859,7 @@ "qwen3-asr-flash": { "id": "qwen3-asr-flash", "name": "Qwen3-ASR Flash", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -6627,7 +9875,7 @@ "deepseek-r1-0528": { "id": "deepseek-r1-0528", "name": "DeepSeek R1 0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -6642,7 +9890,7 @@ "deepseek-v3": { "id": "deepseek-v3", "name": "DeepSeek V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -6657,7 +9905,7 @@ "qwen-omni-turbo": { "id": "qwen-omni-turbo", "name": "Qwen-Omni Turbo", - "family": "qwen-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6673,7 +9921,7 @@ "qwen-vl-max": { "id": "qwen-vl-max", "name": "Qwen-VL Max", - "family": "qwen-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6689,7 +9937,7 @@ "deepseek-v3-2-exp": { "id": "deepseek-v3-2-exp", "name": "DeepSeek V3.2 Exp", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -6704,7 +9952,7 @@ "qwen3-next-80b-a3b-instruct": { "id": "qwen3-next-80b-a3b-instruct", "name": "Qwen3-Next 80B-A3B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6720,7 +9968,7 @@ "deepseek-r1": { "id": "deepseek-r1", "name": "DeepSeek R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -6735,7 +9983,7 @@ "qwen-turbo": { "id": "qwen-turbo", "name": "Qwen Turbo", - "family": "qwen-turbo", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6751,7 +9999,7 @@ "qwen3-vl-235b-a22b": { "id": "qwen3-vl-235b-a22b", "name": "Qwen3-VL 235B-A22B", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6767,7 +10015,7 @@ "qwen3-coder-flash": { "id": "qwen3-coder-flash", "name": "Qwen3 Coder Flash", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6783,7 +10031,7 @@ "qwen3-vl-30b-a3b": { "id": "qwen3-vl-30b-a3b", "name": "Qwen3-VL 30B-A3B", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6799,7 +10047,7 @@ "qwen3-14b": { "id": "qwen3-14b", "name": "Qwen3 14B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6815,7 +10063,7 @@ "qvq-max": { "id": "qvq-max", "name": "QVQ Max", - "family": "qvq-max", + "family": "qvq", "attachment": false, "reasoning": true, "tool_call": true, @@ -6846,7 +10094,7 @@ "qwen-plus-character": { "id": "qwen-plus-character", "name": "Qwen Plus Character", - "family": "qwen-plus", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6862,7 +10110,7 @@ "qwen2-5-14b-instruct": { "id": "qwen2-5-14b-instruct", "name": "Qwen2.5 14B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6878,7 +10126,7 @@ "qwq-plus": { "id": "qwq-plus", "name": "QwQ Plus", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -6894,7 +10142,7 @@ "qwen2-5-coder-32b-instruct": { "id": "qwen2-5-coder-32b-instruct", "name": "Qwen2.5-Coder 32B Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6910,7 +10158,7 @@ "qwen3-coder-30b-a3b-instruct": { "id": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6926,7 +10174,7 @@ "qwen-math-plus": { "id": "qwen-math-plus", "name": "Qwen Math Plus", - "family": "qwen-math", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6942,7 +10190,7 @@ "qwen-vl-ocr": { "id": "qwen-vl-ocr", "name": "Qwen-VL OCR", - "family": "qwen-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -6958,7 +10206,7 @@ "qwen-doc-turbo": { "id": "qwen-doc-turbo", "name": "Qwen Doc Turbo", - "family": "qwen-doc", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6974,7 +10222,7 @@ "qwen-deep-research": { "id": "qwen-deep-research", "name": "Qwen Deep Research", - "family": "qwen-deep-research", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -6990,7 +10238,7 @@ "qwen2-5-72b-instruct": { "id": "qwen2-5-72b-instruct", "name": "Qwen2.5 72B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7006,7 +10254,7 @@ "qwen3-omni-flash": { "id": "qwen3-omni-flash", "name": "Qwen3-Omni Flash", - "family": "qwen3-omni", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7022,7 +10270,7 @@ "qwen-flash": { "id": "qwen-flash", "name": "Qwen Flash", - "family": "qwen-flash", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7038,7 +10286,7 @@ "qwen3-8b": { "id": "qwen3-8b", "name": "Qwen3 8B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7054,7 +10302,7 @@ "qwen3-omni-flash-realtime": { "id": "qwen3-omni-flash-realtime", "name": "Qwen3-Omni Flash Realtime", - "family": "qwen3-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7070,7 +10318,7 @@ "qwen2-5-vl-72b-instruct": { "id": "qwen2-5-vl-72b-instruct", "name": "Qwen2.5-VL 72B Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7086,7 +10334,7 @@ "qwen3-vl-plus": { "id": "qwen3-vl-plus", "name": "Qwen3-VL Plus", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7102,7 +10350,7 @@ "qwen-plus": { "id": "qwen-plus", "name": "Qwen Plus", - "family": "qwen-plus", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7118,7 +10366,7 @@ "qwen2-5-32b-instruct": { "id": "qwen2-5-32b-instruct", "name": "Qwen2.5 32B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7134,7 +10382,7 @@ "qwen2-5-omni-7b": { "id": "qwen2-5-omni-7b", "name": "Qwen2.5-Omni 7B", - "family": "qwen2.5-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7150,7 +10398,7 @@ "qwen-max": { "id": "qwen-max", "name": "Qwen Max", - "family": "qwen-max", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7166,7 +10414,7 @@ "qwen-long": { "id": "qwen-long", "name": "Qwen Long", - "family": "qwen-long", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7182,7 +10430,7 @@ "qwen2-5-math-72b-instruct": { "id": "qwen2-5-math-72b-instruct", "name": "Qwen2.5-Math 72B Instruct", - "family": "qwen2.5-math", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7198,7 +10446,7 @@ "moonshot-kimi-k2-instruct": { "id": "moonshot-kimi-k2-instruct", "name": "Moonshot Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -7229,7 +10477,7 @@ "qwen2-5-7b-instruct": { "id": "qwen2-5-7b-instruct", "name": "Qwen2.5 7B Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7245,7 +10493,7 @@ "qwen2-5-vl-7b-instruct": { "id": "qwen2-5-vl-7b-instruct", "name": "Qwen2.5-VL 7B Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7261,7 +10509,7 @@ "deepseek-v3-1": { "id": "deepseek-v3-1", "name": "DeepSeek V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -7276,7 +10524,7 @@ "deepseek-r1-distill-llama-70b": { "id": "deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -7291,7 +10539,7 @@ "qwen3-235b-a22b": { "id": "qwen3-235b-a22b", "name": "Qwen3 235B-A22B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7307,7 +10555,7 @@ "qwen2-5-coder-7b-instruct": { "id": "qwen2-5-coder-7b-instruct", "name": "Qwen2.5-Coder 7B Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7338,7 +10586,7 @@ "qwen-omni-turbo-realtime": { "id": "qwen-omni-turbo-realtime", "name": "Qwen-Omni Turbo Realtime", - "family": "qwen-omni", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7354,7 +10602,7 @@ "qwen-math-turbo": { "id": "qwen-math-turbo", "name": "Qwen Math Turbo", - "family": "qwen-math", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7370,7 +10618,7 @@ "qwen-mt-turbo": { "id": "qwen-mt-turbo", "name": "Qwen-MT Turbo", - "family": "qwen-mt", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -7386,7 +10634,7 @@ "deepseek-r1-distill-llama-8b": { "id": "deepseek-r1-distill-llama-8b", "name": "DeepSeek R1 Distill Llama 8B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -7401,7 +10649,7 @@ "qwen3-coder-480b-a35b-instruct": { "id": "qwen3-coder-480b-a35b-instruct", "name": "Qwen3-Coder 480B-A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7417,7 +10665,7 @@ "qwen-mt-plus": { "id": "qwen-mt-plus", "name": "Qwen-MT Plus", - "family": "qwen-mt", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -7433,7 +10681,7 @@ "qwen3-max": { "id": "qwen3-max", "name": "Qwen3 Max", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7449,7 +10697,7 @@ "qwq-32b": { "id": "qwq-32b", "name": "QwQ 32B", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7465,7 +10713,7 @@ "qwen2-5-math-7b-instruct": { "id": "qwen2-5-math-7b-instruct", "name": "Qwen2.5-Math 7B Instruct", - "family": "qwen2.5-math", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7481,7 +10729,7 @@ "qwen3-next-80b-a3b-thinking": { "id": "qwen3-next-80b-a3b-thinking", "name": "Qwen3-Next 80B-A3B (Thinking)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7512,7 +10760,7 @@ "qwen3-32b": { "id": "qwen3-32b", "name": "Qwen3 32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7528,7 +10776,7 @@ "qwen-vl-plus": { "id": "qwen-vl-plus", "name": "Qwen-VL Plus", - "family": "qwen-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7544,7 +10792,7 @@ "qwen3-coder-plus": { "id": "qwen3-coder-plus", "name": "Qwen3 Coder Plus", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7562,7 +10810,7 @@ "google-vertex-anthropic": { "id": "google-vertex-anthropic", "env": ["GOOGLE_VERTEX_PROJECT", "GOOGLE_VERTEX_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS"], - "npm": "@ai-sdk/google-vertex", + "npm": "@ai-sdk/google-vertex/anthropic", "name": "Vertex (Anthropic)", "doc": "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", "models": { @@ -7712,11 +10960,1235 @@ } } }, + "novita-ai": { + "id": "novita-ai", + "env": ["NOVITA_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://api.novita.ai/openai", + "name": "NovitaAI", + "doc": "https://novita.ai/docs/guides/introduction", + "models": { + "baichuan/baichuan-m2-32b": { + "id": "baichuan/baichuan-m2-32b", + "name": "baichuan-m2-32b", + "family": "baichuan", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-08-13", + "last_updated": "2025-08-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.07 }, + "limit": { "context": 131072, "output": 131072 } + }, + "moonshotai/kimi-k2.5": { + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/kimi-k2-0905": { + "id": "moonshotai/kimi-k2-0905", + "name": "Kimi K2 0905", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/kimi-k2-thinking": { + "id": "moonshotai/kimi-k2-thinking", + "name": "Kimi K2 Thinking", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-07", + "last_updated": "2025-11-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5 }, + "limit": { "context": 262144, "output": 262144 } + }, + "moonshotai/kimi-k2-instruct": { + "id": "moonshotai/kimi-k2-instruct", + "name": "Kimi K2 Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-07-11", + "last_updated": "2025-07-11", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.57, "output": 2.3 }, + "limit": { "context": 131072, "output": 131072 } + }, + "nousresearch/hermes-2-pro-llama-3-8b": { + "id": "nousresearch/hermes-2-pro-llama-3-8b", + "name": "Hermes 2 Pro Llama 3 8B", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2024-06-27", + "last_updated": "2024-06-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.14, "output": 0.14 }, + "limit": { "context": 8192, "output": 8192 } + }, + "paddlepaddle/paddleocr-vl": { + "id": "paddlepaddle/paddleocr-vl", + "name": "PaddleOCR-VL", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-10-22", + "last_updated": "2025-10-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.02, "output": 0.02 }, + "limit": { "context": 16384, "output": 16384 } + }, + "kwaipilot/kat-coder": { + "id": "kwaipilot/kat-coder", + "name": "KAT-Coder-Pro V1(Free)", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 256000, "output": 32000 } + }, + "kwaipilot/kat-coder-pro": { + "id": "kwaipilot/kat-coder-pro", + "name": "Kat Coder Pro", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-05", + "last_updated": "2026-01-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.06 }, + "limit": { "context": 256000, "output": 128000 } + }, + "xiaomimimo/mimo-v2-flash": { + "id": "xiaomimimo/mimo-v2-flash", + "name": "XiaomiMiMo/MiMo-V2-Flash", + "family": "mimo", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-12-19", + "last_updated": "2025-12-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.3, "cache_read": 0.3 }, + "limit": { "context": 262144, "output": 32000 } + }, + "deepseek/deepseek-prover-v2-671b": { + "id": "deepseek/deepseek-prover-v2-671b", + "name": "Deepseek Prover V2 671B", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-30", + "last_updated": "2025-04-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.5 }, + "limit": { "context": 160000, "output": 160000 } + }, + "deepseek/deepseek-r1-0528": { + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek R1 0528", + "family": "deepseek-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-05-28", + "last_updated": "2025-05-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.5, "cache_read": 0.35 }, + "limit": { "context": 163840, "output": 32768 } + }, + "deepseek/deepseek-r1-0528-qwen3-8b": { + "id": "deepseek/deepseek-r1-0528-qwen3-8b", + "name": "DeepSeek R1 0528 Qwen3 8B", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-05-29", + "last_updated": "2025-05-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.06, "output": 0.09 }, + "limit": { "context": 128000, "output": 32000 } + }, + "deepseek/deepseek-v3.1-terminus": { + "id": "deepseek/deepseek-v3.1-terminus", + "name": "Deepseek V3.1 Terminus", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-22", + "last_updated": "2025-09-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1, "cache_read": 0.135 }, + "limit": { "context": 131072, "output": 32768 } + }, + "deepseek/deepseek-v3.1": { + "id": "deepseek/deepseek-v3.1", + "name": "DeepSeek V3.1", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-21", + "last_updated": "2025-08-21", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1, "cache_read": 0.135 }, + "limit": { "context": 131072, "output": 32768 } + }, + "deepseek/deepseek-v3-0324": { + "id": "deepseek/deepseek-v3-0324", + "name": "DeepSeek V3 0324", + "family": "deepseek", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-03-25", + "last_updated": "2025-03-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1.12, "cache_read": 0.135 }, + "limit": { "context": 163840, "output": 163840 } + }, + "deepseek/deepseek-r1-turbo": { + "id": "deepseek/deepseek-r1-turbo", + "name": "DeepSeek R1 (Turbo)\t", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-05", + "last_updated": "2025-03-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.7, "output": 2.5 }, + "limit": { "context": 64000, "output": 16000 } + }, + "deepseek/deepseek-v3.2-exp": { + "id": "deepseek/deepseek-v3.2-exp", + "name": "Deepseek V3.2 Exp", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-29", + "last_updated": "2025-09-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 0.41 }, + "limit": { "context": 163840, "output": 65536 } + }, + "deepseek/deepseek-r1-distill-llama-70b": { + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek R1 Distill LLama 70B", + "family": "deepseek-thinking", + "attachment": false, + "reasoning": true, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-01-27", + "last_updated": "2025-01-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.8, "output": 0.8 }, + "limit": { "context": 8192, "output": 8192 } + }, + "deepseek/deepseek-ocr": { + "id": "deepseek/deepseek-ocr", + "name": "DeepSeek-OCR", + "attachment": true, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-24", + "last_updated": "2025-10-24", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.03, "output": 0.03 }, + "limit": { "context": 8192, "output": 8192 } + }, + "deepseek/deepseek-v3.2": { + "id": "deepseek/deepseek-v3.2", + "name": "Deepseek V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.269, "output": 0.4, "cache_read": 0.1345 }, + "limit": { "context": 163840, "output": 65536 } + }, + "deepseek/deepseek-v3-turbo": { + "id": "deepseek/deepseek-v3-turbo", + "name": "DeepSeek V3 (Turbo)\t", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2025-03-05", + "last_updated": "2025-03-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 1.3 }, + "limit": { "context": 64000, "output": 16000 } + }, + "sao10k/l3-8b-lunaris": { + "id": "sao10k/l3-8b-lunaris", + "name": "Sao10k L3 8B Lunaris\t", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2024-11-28", + "last_updated": "2024-11-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 8192, "output": 8192 } + }, + "sao10k/L3-8B-Stheno-v3.2": { + "id": "sao10k/L3-8B-Stheno-v3.2", + "name": "L3 8B Stheno V3.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-11-29", + "last_updated": "2024-11-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.05 }, + "limit": { "context": 8192, "output": 32000 } + }, + "sao10k/l31-70b-euryale-v2.2": { + "id": "sao10k/l31-70b-euryale-v2.2", + "name": "L31 70B Euryale V2.2", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-09-19", + "last_updated": "2024-09-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.48, "output": 1.48 }, + "limit": { "context": 8192, "output": 8192 } + }, + "sao10k/l3-70b-euryale-v2.1": { + "id": "sao10k/l3-70b-euryale-v2.1", + "name": "L3 70B Euryale V2.1\t", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2024-06-18", + "last_updated": "2024-06-18", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.48, "output": 1.48 }, + "limit": { "context": 8192, "output": 8192 } + }, + "skywork/r1v4-lite": { + "id": "skywork/r1v4-lite", + "name": "Skywork R1V4-Lite", + "family": "skywork", + "attachment": true, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 262144, "output": 65536 } + }, + "minimaxai/minimax-m1-80k": { + "id": "minimaxai/minimax-m1-80k", + "name": "MiniMax M1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-17", + "last_updated": "2025-06-17", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.2 }, + "limit": { "context": 1000000, "output": 40000 } + }, + "minimax/minimax-m2": { + "id": "minimax/minimax-m2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03 }, + "limit": { "context": 204800, "output": 131072 } + }, + "minimax/minimax-m2.1": { + "id": "minimax/minimax-m2.1", + "name": "Minimax M2.1", + "family": "minimax", + "attachment": false, + "reasoning": false, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.03 }, + "limit": { "context": 204800, "output": 131072 } + }, + "google/gemma-3-27b-it": { + "id": "google/gemma-3-27b-it", + "name": "Gemma 3 27B", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-03-25", + "last_updated": "2025-03-25", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.119, "output": 0.2 }, + "limit": { "context": 98304, "output": 16384 } + }, + "microsoft/wizardlm-2-8x22b": { + "id": "microsoft/wizardlm-2-8x22b", + "name": "Wizardlm 2 8x22B", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2024-04-24", + "last_updated": "2024-04-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.62, "output": 0.62 }, + "limit": { "context": 65535, "output": 8000 } + }, + "openai/gpt-oss-20b": { + "id": "openai/gpt-oss-20b", + "name": "OpenAI: GPT OSS 20B", + "attachment": true, + "reasoning": true, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-06", + "last_updated": "2025-08-06", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.04, "output": 0.15 }, + "limit": { "context": 131072, "output": 32768 } + }, + "openai/gpt-oss-120b": { + "id": "openai/gpt-oss-120b", + "name": "OpenAI GPT OSS 120B", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-08-06", + "last_updated": "2025-08-06", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.05, "output": 0.25 }, + "limit": { "context": 131072, "output": 32768 } + }, + "gryphe/mythomax-l2-13b": { + "id": "gryphe/mythomax-l2-13b", + "name": "Mythomax L2 13B", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2024-04-25", + "last_updated": "2024-04-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.09 }, + "limit": { "context": 4096, "output": 3200 } + }, + "baidu/ernie-4.5-vl-28b-a3b-thinking": { + "id": "baidu/ernie-4.5-vl-28b-a3b-thinking", + "name": "ERNIE-4.5-VL-28B-A3B-Thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-26", + "last_updated": "2025-11-26", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.39, "output": 0.39 }, + "limit": { "context": 131072, "output": 65536 } + }, + "baidu/ernie-4.5-300b-a47b-paddle": { + "id": "baidu/ernie-4.5-300b-a47b-paddle", + "name": "ERNIE 4.5 300B A47B", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.28, "output": 1.1 }, + "limit": { "context": 123000, "output": 12000 } + }, + "baidu/ernie-4.5-21B-a3b": { + "id": "baidu/ernie-4.5-21B-a3b", + "name": "ERNIE 4.5 21B A3B", + "family": "ernie", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-06-30", + "last_updated": "2025-06-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 120000, "output": 8000 } + }, + "baidu/ernie-4.5-21B-a3b-thinking": { + "id": "baidu/ernie-4.5-21B-a3b-thinking", + "name": "ERNIE-4.5-21B-A3B-Thinking", + "family": "ernie", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "knowledge": "2025-03", + "release_date": "2025-09-19", + "last_updated": "2025-09-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.28 }, + "limit": { "context": 131072, "output": 65536 } + }, + "baidu/ernie-4.5-vl-424b-a47b": { + "id": "baidu/ernie-4.5-vl-424b-a47b", + "name": "ERNIE 4.5 VL 424B A47B", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.42, "output": 1.25 }, + "limit": { "context": 123000, "output": 16000 } + }, + "baidu/ernie-4.5-vl-28b-a3b": { + "id": "baidu/ernie-4.5-vl-28b-a3b", + "name": "ERNIE 4.5 VL 28B A3B", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-06-30", + "last_updated": "2025-06-30", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.4, "output": 5.6 }, + "limit": { "context": 30000, "output": 8000 } + }, + "qwen/qwen3-vl-30b-a3b-thinking": { + "id": "qwen/qwen3-vl-30b-a3b-thinking", + "name": "qwen/qwen3-vl-30b-a3b-thinking", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-11", + "last_updated": "2025-10-11", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 1 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-235b-a22b-instruct-2507": { + "id": "qwen/qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B Instruct 2507", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-22", + "last_updated": "2025-07-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.58 }, + "limit": { "context": 131072, "output": 16384 } + }, + "qwen/qwen3-omni-30b-a3b-thinking": { + "id": "qwen/qwen3-omni-30b-a3b-thinking", + "name": "Qwen3 Omni 30B A3B Thinking", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text", "audio", "video", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.25, "output": 0.97, "input_audio": 2.2, "output_audio": 1.788 }, + "limit": { "context": 65536, "output": 16384 } + }, + "qwen/qwen3-next-80b-a3b-instruct": { + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen3 Next 80B A3B Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-10", + "last_updated": "2025-09-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 1.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-8b-fp8": { + "id": "qwen/qwen3-8b-fp8", + "name": "Qwen3 8B", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.035, "output": 0.138 }, + "limit": { "context": 128000, "output": 20000 } + }, + "qwen/qwen2.5-vl-72b-instruct": { + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen2.5 VL 72B Instruct", + "family": "qwen", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-03-25", + "last_updated": "2025-03-25", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.8, "output": 0.8 }, + "limit": { "context": 32768, "output": 32768 } + }, + "qwen/qwen3-4b-fp8": { + "id": "qwen/qwen3-4b-fp8", + "name": "Qwen3 4B", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.03, "output": 0.03 }, + "limit": { "context": 128000, "output": 20000 } + }, + "qwen/qwen3-coder-30b-a3b-instruct": { + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30b A3B Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-09", + "last_updated": "2025-10-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.27 }, + "limit": { "context": 160000, "output": 32768 } + }, + "qwen/qwen3-vl-8b-instruct": { + "id": "qwen/qwen3-vl-8b-instruct", + "name": "qwen/qwen3-vl-8b-instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-17", + "last_updated": "2025-10-17", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.08, "output": 0.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-235b-a22b-thinking-2507": { + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22b Thinking 2507", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 3 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen2.5-7b-instruct": { + "id": "qwen/qwen2.5-7b-instruct", + "name": "Qwen2.5 7B Instruct", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-04-16", + "last_updated": "2025-04-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.07 }, + "limit": { "context": 32000, "output": 32000 } + }, + "qwen/qwen3-30b-a3b-fp8": { + "id": "qwen/qwen3-30b-a3b-fp8", + "name": "Qwen3 30B A3B", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.09, "output": 0.45 }, + "limit": { "context": 40960, "output": 20000 } + }, + "qwen/qwen3-32b-fp8": { + "id": "qwen/qwen3-32b-fp8", + "name": "Qwen3 32B", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.45 }, + "limit": { "context": 40960, "output": 20000 } + }, + "qwen/qwen3-omni-30b-a3b-instruct": { + "id": "qwen/qwen3-omni-30b-a3b-instruct", + "name": "Qwen3 Omni 30B A3B Instruct", + "family": "qwen", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text", "video", "audio", "image"], "output": ["text", "audio"] }, + "open_weights": true, + "cost": { "input": 0.25, "output": 0.97, "input_audio": 2.2, "output_audio": 1.788 }, + "limit": { "context": 65536, "output": 16384 } + }, + "qwen/qwen-2.5-72b-instruct": { + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen 2.5 72B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2024-10-15", + "last_updated": "2024-10-15", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.38, "output": 0.4 }, + "limit": { "context": 32000, "output": 8192 } + }, + "qwen/qwen3-coder-480b-a35b-instruct": { + "id": "qwen/qwen3-coder-480b-a35b-instruct", + "name": "Qwen3 Coder 480B A35B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-23", + "last_updated": "2025-07-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.3 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen/qwen3-vl-235b-a22b-thinking": { + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen3 VL 235B A22B Thinking", + "attachment": true, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.98, "output": 3.95 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen-mt-plus": { + "id": "qwen/qwen-mt-plus", + "name": "Qwen MT Plus", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-09-03", + "last_updated": "2025-09-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.25, "output": 0.75 }, + "limit": { "context": 16384, "output": 8192 } + }, + "qwen/qwen3-max": { + "id": "qwen/qwen3-max", + "name": "Qwen3 Max", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.11, "output": 8.45 }, + "limit": { "context": 262144, "output": 65536 } + }, + "qwen/qwen3-vl-235b-a22b-instruct": { + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen3 VL 235B A22B Instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-24", + "last_updated": "2025-09-24", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-vl-30b-a3b-instruct": { + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "qwen/qwen3-vl-30b-a3b-instruct", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-10-11", + "last_updated": "2025-10-11", + "modalities": { "input": ["text", "video", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.7 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-next-80b-a3b-thinking": { + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen3 Next 80B A3B Thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-10", + "last_updated": "2025-09-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 1.5 }, + "limit": { "context": 131072, "output": 32768 } + }, + "qwen/qwen3-235b-a22b-fp8": { + "id": "qwen/qwen3-235b-a22b-fp8", + "name": "Qwen3 235B A22B", + "attachment": false, + "reasoning": true, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-29", + "last_updated": "2025-04-29", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.8 }, + "limit": { "context": 40960, "output": 20000 } + }, + "mistralai/mistral-nemo": { + "id": "mistralai/mistral-nemo", + "name": "Mistral Nemo", + "family": "mistral-nemo", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2024-07-30", + "last_updated": "2024-07-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.04, "output": 0.17 }, + "limit": { "context": 60288, "output": 16000 } + }, + "meta-llama/llama-3-70b-instruct": { + "id": "meta-llama/llama-3-70b-instruct", + "name": "Llama3 70B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": true, + "temperature": true, + "release_date": "2024-04-25", + "last_updated": "2024-04-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.51, "output": 0.74 }, + "limit": { "context": 8192, "output": 8000 } + }, + "meta-llama/llama-3-8b-instruct": { + "id": "meta-llama/llama-3-8b-instruct", + "name": "Llama 3 8B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2024-04-25", + "last_updated": "2024-04-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.04, "output": 0.04 }, + "limit": { "context": 8192, "output": 8192 } + }, + "meta-llama/llama-3.1-8b-instruct": { + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2024-07-24", + "last_updated": "2024-07-24", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.02, "output": 0.05 }, + "limit": { "context": 16384, "output": 16384 } + }, + "meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { + "id": "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "name": "Llama 4 Maverick Instruct", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-06", + "last_updated": "2025-04-06", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 0.85 }, + "limit": { "context": 1048576, "output": 8192 } + }, + "meta-llama/llama-3.3-70b-instruct": { + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama 3.3 70B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2023-12", + "release_date": "2024-12-07", + "last_updated": "2024-12-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.135, "output": 0.4 }, + "limit": { "context": 131072, "output": 120000 } + }, + "meta-llama/llama-4-scout-17b-16e-instruct": { + "id": "meta-llama/llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout Instruct", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-04-06", + "last_updated": "2025-04-06", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.18, "output": 0.59 }, + "limit": { "context": 131072, "output": 131072 } + }, + "zai-org/glm-4.7": { + "id": "zai-org/glm-4.7", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11 }, + "limit": { "context": 204800, "output": 131072 } + }, + "zai-org/glm-4.5": { + "id": "zai-org/glm-4.5", + "name": "GLM-4.5", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "release_date": "2025-07-28", + "last_updated": "2025-07-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11 }, + "limit": { "context": 131072, "output": 98304 } + }, + "zai-org/glm-4.7-flash": { + "id": "zai-org/glm-4.7-flash", + "name": "GLM-4.7-Flash", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.4, "cache_read": 0.01 }, + "limit": { "context": 200000, "output": 128000 } + }, + "zai-org/glm-4.5-air": { + "id": "zai-org/glm-4.5-air", + "name": "GLM 4.5 Air", + "family": "glm-air", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-10-13", + "last_updated": "2025-10-13", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.13, "output": 0.85 }, + "limit": { "context": 131072, "output": 98304 } + }, + "zai-org/glm-4.5v": { + "id": "zai-org/glm-4.5v", + "name": "GLM 4.5V", + "family": "glmv", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-08-11", + "last_updated": "2025-08-11", + "modalities": { "input": ["text", "video", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 1.8, "cache_read": 0.11 }, + "limit": { "context": 65536, "output": 16384 } + }, + "zai-org/glm-4.6": { + "id": "zai-org/glm-4.6", + "name": "GLM 4.6", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-30", + "last_updated": "2025-09-30", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.2, "cache_read": 0.11 }, + "limit": { "context": 204800, "output": 131072 } + }, + "zai-org/glm-4.6v": { + "id": "zai-org/glm-4.6v", + "name": "GLM 4.6V", + "family": "glmv", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text", "video", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 0.9, "cache_read": 0.055 }, + "limit": { "context": 131072, "output": 32768 } + }, + "zai-org/autoglm-phone-9b-multilingual": { + "id": "zai-org/autoglm-phone-9b-multilingual", + "name": "AutoGLM-Phone-9B-Multilingual", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "release_date": "2025-12-10", + "last_updated": "2025-12-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.035, "output": 0.138 }, + "limit": { "context": 65536, "output": 65536 } + } + } + }, "venice": { "id": "venice", "env": ["VENICE_API_KEY"], - "npm": "@ai-sdk/openai-compatible", - "api": "https://api.venice.ai/api/v1", + "npm": "venice-ai-sdk-provider", "name": "Venice AI", "doc": "https://docs.venice.ai", "models": { @@ -7731,16 +12203,16 @@ "temperature": true, "knowledge": "2025-07", "release_date": "2025-12-01", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0.5, "output": 1.25, "cache_read": 0.125 }, - "limit": { "context": 262144, "output": 65536 } + "limit": { "context": 256000, "output": 64000 } }, "qwen3-235b-a22b-instruct-2507": { "id": "qwen3-235b-a22b-instruct-2507", "name": "Qwen 3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -7748,11 +12220,11 @@ "temperature": true, "knowledge": "2025-07", "release_date": "2025-04-29", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.15, "output": 0.75 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } }, "gemini-3-flash-preview": { "id": "gemini-3-flash-preview", @@ -7761,16 +12233,16 @@ "attachment": true, "reasoning": true, "tool_call": true, - "interleaved": { "field": "reasoning_details" }, + "interleaved": { "field": "reasoning_content" }, "structured_output": true, "temperature": true, "knowledge": "2025-01", "release_date": "2025-12-19", - "last_updated": "2025-12-30", + "last_updated": "2026-01-28", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0.7, "output": 3.75, "cache_read": 0.07 }, - "limit": { "context": 262144, "output": 65536 } + "limit": { "context": 256000, "output": 64000 } }, "claude-opus-45": { "id": "claude-opus-45", @@ -7783,11 +12255,11 @@ "temperature": true, "knowledge": "2025-03", "release_date": "2025-12-06", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 6, "output": 30, "cache_read": 0.6 }, - "limit": { "context": 202752, "output": 50688 } + "cost": { "input": 6, "output": 30, "cache_read": 0.6, "cache_write": 7.5 }, + "limit": { "context": 198000, "output": 49500 } }, "mistral-31-24b": { "id": "mistral-31-24b", @@ -7800,11 +12272,11 @@ "temperature": true, "knowledge": "2023-10", "release_date": "2025-03-18", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.5, "output": 2 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } }, "grok-code-fast-1": { "id": "grok-code-fast-1", @@ -7816,33 +12288,50 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-01", - "last_updated": "2026-01-02", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0.25, "output": 1.87, "cache_read": 0.03 }, - "limit": { "context": 262144, "output": 65536 } + "limit": { "context": 256000, "output": 64000 } }, "zai-org-glm-4.7": { "id": "zai-org-glm-4.7", "name": "GLM 4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, - "reasoning": false, + "reasoning": true, "tool_call": true, + "interleaved": { "field": "reasoning_content" }, "structured_output": true, "temperature": true, "knowledge": "2025-04", "release_date": "2025-12-24", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.85, "output": 2.75 }, - "limit": { "context": 131072, "output": 32768 } + "cost": { "input": 0.55, "output": 2.65, "cache_read": 0.11 }, + "limit": { "context": 198000, "output": 49500 } + }, + "qwen3-vl-235b-a22b": { + "id": "qwen3-vl-235b-a22b", + "name": "Qwen3 VL 235B", + "family": "qwen", + "attachment": true, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-16", + "last_updated": "2026-01-28", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.25, "output": 1.5 }, + "limit": { "context": 256000, "output": 64000 } }, "venice-uncensored": { "id": "venice-uncensored", "name": "Venice Uncensored 1.1", - "family": "venice-uncensored", + "family": "venice", "attachment": false, "reasoning": false, "tool_call": false, @@ -7850,11 +12339,11 @@ "temperature": true, "knowledge": "2023-10", "release_date": "2025-03-18", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.2, "output": 0.9 }, - "limit": { "context": 32768, "output": 8192 } + "limit": { "context": 32000, "output": 8000 } }, "gemini-3-pro-preview": { "id": "gemini-3-pro-preview", @@ -7867,16 +12356,16 @@ "temperature": true, "knowledge": "2024-04", "release_date": "2025-12-02", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }, "open_weights": false, "cost": { "input": 2.5, "output": 15, "cache_read": 0.625 }, - "limit": { "context": 202752, "output": 50688 } + "limit": { "context": 198000, "output": 49500 } }, "openai-gpt-52": { "id": "openai-gpt-52", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": false, "reasoning": true, "tool_call": true, @@ -7884,16 +12373,16 @@ "temperature": true, "knowledge": "2025-08-31", "release_date": "2025-12-13", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": false, "cost": { "input": 2.19, "output": 17.5, "cache_read": 0.219 }, - "limit": { "context": 262144, "output": 65536 } + "limit": { "context": 256000, "output": 64000 } }, "qwen3-4b": { "id": "qwen3-4b", "name": "Venice Small", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -7901,48 +12390,66 @@ "temperature": true, "knowledge": "2024-07", "release_date": "2025-04-29", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.05, "output": 0.15 }, - "limit": { "context": 32768, "output": 8192 } + "limit": { "context": 32000, "output": 8000 } }, "llama-3.3-70b": { "id": "llama-3.3-70b", "name": "Llama 3.3 70B", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, "temperature": true, "knowledge": "2023-12", "release_date": "2025-04-06", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.7, "output": 2.8 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } + }, + "claude-sonnet-45": { + "id": "claude-sonnet-45", + "name": "Claude Sonnet 4.5", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-01-15", + "last_updated": "2026-01-28", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 3.75, "output": 18.75, "cache_read": 0.375, "cache_write": 4.69 }, + "limit": { "context": 198000, "output": 49500 } }, "openai-gpt-oss-120b": { "id": "openai-gpt-oss-120b", "name": "OpenAI GPT OSS 120B", - "family": "openai-gpt-oss", + "family": "gpt-oss", "attachment": false, "reasoning": false, "tool_call": true, "temperature": true, "knowledge": "2025-07", "release_date": "2025-11-06", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.07, "output": 0.3 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } }, "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -7950,50 +12457,50 @@ "temperature": true, "knowledge": "2024-04", "release_date": "2025-12-10", - "last_updated": "2025-12-30", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.75, "output": 3.2, "cache_read": 0.375 }, - "limit": { "context": 262144, "output": 65536 } + "limit": { "context": 256000, "output": 64000 } }, "qwen3-235b-a22b-thinking-2507": { "id": "qwen3-235b-a22b-thinking-2507", "name": "Qwen 3 235B A22B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, + "interleaved": { "field": "reasoning_content" }, "structured_output": true, "temperature": true, "knowledge": "2025-07", "release_date": "2025-04-29", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.45, "output": 3.5 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } }, "llama-3.2-3b": { "id": "llama-3.2-3b", "name": "Llama 3.2 3B", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, - "structured_output": true, "temperature": true, "knowledge": "2023-12", "release_date": "2024-10-03", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.15, "output": 0.6 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } }, "google-gemma-3-27b-it": { "id": "google-gemma-3-27b-it", "name": "Google Gemma 3 27B Instruct", - "family": "gemma-3", + "family": "gemma", "attachment": true, "reasoning": false, "tool_call": true, @@ -8001,43 +12508,45 @@ "temperature": true, "knowledge": "2025-07", "release_date": "2025-11-04", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.12, "output": 0.2 }, - "limit": { "context": 202752, "output": 50688 } + "limit": { "context": 198000, "output": 49500 } + }, + "kimi-k2-5": { + "id": "kimi-k2-5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "knowledge": "2024-04", + "release_date": "2026-01-27", + "last_updated": "2026-01-28", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.75, "output": 3.75, "cache_read": 0.125 }, + "limit": { "context": 256000, "output": 64000 } }, "hermes-3-llama-3.1-405b": { "id": "hermes-3-llama-3.1-405b", "name": "Hermes 3 Llama 3.1 405b", - "family": "llama-3.1", + "family": "hermes", "attachment": false, "reasoning": false, "tool_call": false, "temperature": true, "knowledge": "2024-04", "release_date": "2025-09-25", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 1.1, "output": 3 }, - "limit": { "context": 131072, "output": 32768 } - }, - "zai-org-glm-4.6v": { - "id": "zai-org-glm-4.6v", - "name": "GLM 4.6V", - "family": "glm-4.6", - "attachment": true, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-12-11", - "last_updated": "2025-12-29", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.39, "output": 1.13 }, - "limit": { "context": 131072, "output": 32768 } + "limit": { "context": 128000, "output": 32000 } }, "minimax-m21": { "id": "minimax-m21", @@ -8050,16 +12559,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-01", - "last_updated": "2026-01-02", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, + "open_weights": true, "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.04 }, - "limit": { "context": 202752, "output": 50688 } + "limit": { "context": 198000, "output": 49500 } }, "qwen3-next-80b": { "id": "qwen3-next-80b", "name": "Qwen 3 Next 80b", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8067,33 +12576,16 @@ "temperature": true, "knowledge": "2025-07", "release_date": "2025-04-29", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.35, "output": 1.9 }, - "limit": { "context": 262144, "output": 65536 } - }, - "zai-org-glm-4.6": { - "id": "zai-org-glm-4.6", - "name": "GLM 4.6", - "family": "glm-4.6", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "knowledge": "2024-04", - "release_date": "2025-10-18", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.85, "output": 2.75 }, - "limit": { "context": 202752, "output": 50688 } + "limit": { "context": 256000, "output": 64000 } }, "qwen3-coder-480b-a35b-instruct": { "id": "qwen3-coder-480b-a35b-instruct", "name": "Qwen 3 Coder 480b", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8101,33 +12593,50 @@ "temperature": true, "knowledge": "2025-07", "release_date": "2025-04-29", - "last_updated": "2025-12-18", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.75, "output": 3 }, - "limit": { "context": 262144, "output": 65536 } + "limit": { "context": 256000, "output": 64000 } + }, + "openai-gpt-52-codex": { + "id": "openai-gpt-52-codex", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-08", + "release_date": "2025-01-15", + "last_updated": "2026-01-28", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 2.19, "output": 17.5, "cache_read": 0.219 }, + "limit": { "context": 256000, "output": 64000 } }, "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "DeepSeek V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": false, "temperature": true, "knowledge": "2025-10", "release_date": "2025-12-04", - "last_updated": "2025-12-29", + "last_updated": "2026-01-28", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.4, "output": 1, "cache_read": 0.2 }, - "limit": { "context": 163840, "output": 40960 } + "limit": { "context": 160000, "output": 40000 } } } }, "siliconflow-cn": { "id": "siliconflow-cn", - "env": ["SILICONFLOW_API_KEY"], + "env": ["SILICONFLOW_CN_API_KEY"], "npm": "@ai-sdk/openai-compatible", "api": "https://api.siliconflow.cn/v1", "name": "SiliconFlow (China)", @@ -8136,7 +12645,7 @@ "inclusionAI/Ring-flash-2.0": { "id": "inclusionAI/Ring-flash-2.0", "name": "inclusionAI/Ring-flash-2.0", - "family": "inclusionai-ring-flash", + "family": "ring", "attachment": false, "reasoning": true, "tool_call": true, @@ -8152,7 +12661,7 @@ "inclusionAI/Ling-flash-2.0": { "id": "inclusionAI/Ling-flash-2.0", "name": "inclusionAI/Ling-flash-2.0", - "family": "inclusionai-ling-flash", + "family": "ling", "attachment": false, "reasoning": false, "tool_call": true, @@ -8168,7 +12677,7 @@ "inclusionAI/Ling-mini-2.0": { "id": "inclusionAI/Ling-mini-2.0", "name": "inclusionAI/Ling-mini-2.0", - "family": "inclusionai-ling-mini", + "family": "ling", "attachment": false, "reasoning": false, "tool_call": true, @@ -8181,10 +12690,26 @@ "cost": { "input": 0.07, "output": 0.28 }, "limit": { "context": 131000, "output": 131000 } }, + "Kwaipilot/KAT-Dev": { + "id": "Kwaipilot/KAT-Dev", + "name": "Kwaipilot/KAT-Dev", + "family": "kat-coder", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-27", + "last_updated": "2026-01-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 128000, "output": 128000 } + }, "moonshotai/Kimi-K2-Thinking": { "id": "moonshotai/Kimi-K2-Thinking", "name": "moonshotai/Kimi-K2-Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -8200,7 +12725,7 @@ "moonshotai/Kimi-K2-Instruct-0905": { "id": "moonshotai/Kimi-K2-Instruct-0905", "name": "moonshotai/Kimi-K2-Instruct-0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -8229,22 +12754,6 @@ "cost": { "input": 0.29, "output": 1.15 }, "limit": { "context": 131000, "output": 131000 } }, - "moonshotai/Kimi-K2-Instruct": { - "id": "moonshotai/Kimi-K2-Instruct", - "name": "moonshotai/Kimi-K2-Instruct", - "family": "kimi-k2", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-13", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.58, "output": 2.29 }, - "limit": { "context": 131000, "output": 131000 } - }, "tencent/Hunyuan-A13B-Instruct": { "id": "tencent/Hunyuan-A13B-Instruct", "name": "tencent/Hunyuan-A13B-Instruct", @@ -8312,7 +12821,7 @@ "THUDM/GLM-Z1-32B-0414": { "id": "THUDM/GLM-Z1-32B-0414", "name": "THUDM/GLM-Z1-32B-0414", - "family": "glm-z1", + "family": "glm-z", "attachment": false, "reasoning": true, "tool_call": true, @@ -8328,7 +12837,7 @@ "THUDM/GLM-4-9B-0414": { "id": "THUDM/GLM-4-9B-0414", "name": "THUDM/GLM-4-9B-0414", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -8344,7 +12853,7 @@ "THUDM/GLM-Z1-9B-0414": { "id": "THUDM/GLM-Z1-9B-0414", "name": "THUDM/GLM-Z1-9B-0414", - "family": "glm-z1", + "family": "glm-z", "attachment": false, "reasoning": true, "tool_call": true, @@ -8360,7 +12869,7 @@ "THUDM/GLM-4.1V-9B-Thinking": { "id": "THUDM/GLM-4.1V-9B-Thinking", "name": "THUDM/GLM-4.1V-9B-Thinking", - "family": "glm-4v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -8376,7 +12885,7 @@ "THUDM/GLM-4-32B-0414": { "id": "THUDM/GLM-4-32B-0414", "name": "THUDM/GLM-4-32B-0414", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -8389,42 +12898,26 @@ "cost": { "input": 0.27, "output": 0.27 }, "limit": { "context": 33000, "output": 33000 } }, - "openai/gpt-oss-120b": { - "id": "openai/gpt-oss-120b", - "name": "openai/gpt-oss-120b", - "family": "openai-gpt-oss", + "ascend-tribe/pangu-pro-moe": { + "id": "ascend-tribe/pangu-pro-moe", + "name": "ascend-tribe/pangu-pro-moe", + "family": "pangu", "attachment": false, "reasoning": true, - "tool_call": true, + "tool_call": false, "structured_output": true, "temperature": true, - "release_date": "2025-08-13", - "last_updated": "2025-11-25", + "release_date": "2025-07-02", + "last_updated": "2026-01-16", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.05, "output": 0.45 }, - "limit": { "context": 131000, "output": 8000 } - }, - "openai/gpt-oss-20b": { - "id": "openai/gpt-oss-20b", - "name": "openai/gpt-oss-20b", - "family": "openai-gpt-oss", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-08-13", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.04, "output": 0.18 }, - "limit": { "context": 131000, "output": 8000 } + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 128000, "output": 128000 } }, "stepfun-ai/step3": { "id": "stepfun-ai/step3", "name": "stepfun-ai/step3", - "family": "stepfun-ai-step3", + "family": "step", "attachment": true, "reasoning": false, "tool_call": true, @@ -8437,26 +12930,10 @@ "cost": { "input": 0.57, "output": 1.42 }, "limit": { "context": 66000, "output": 66000 } }, - "nex-agi/DeepSeek-V3.1-Nex-N1": { - "id": "nex-agi/DeepSeek-V3.1-Nex-N1", - "name": "nex-agi/DeepSeek-V3.1-Nex-N1", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-01-01", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.5, "output": 2 }, - "limit": { "context": 131000, "output": 131000 } - }, "baidu/ERNIE-4.5-300B-A47B": { "id": "baidu/ERNIE-4.5-300B-A47B", "name": "baidu/ERNIE-4.5-300B-A47B", - "family": "ernie-4", + "family": "ernie", "attachment": false, "reasoning": false, "tool_call": true, @@ -8469,42 +12946,10 @@ "cost": { "input": 0.28, "output": 1.1 }, "limit": { "context": 131000, "output": 131000 } }, - "z-ai/GLM-4.5-Air": { - "id": "z-ai/GLM-4.5-Air", - "name": "z-ai/GLM-4.5-Air", - "family": "glm-4.5-air", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.14, "output": 0.86 }, - "limit": { "context": 131000, "output": 131000 } - }, - "z-ai/GLM-4.5": { - "id": "z-ai/GLM-4.5", - "name": "z-ai/GLM-4.5", - "family": "glm-4.5", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.4, "output": 2 }, - "limit": { "context": 131000, "output": 131000 } - }, "ByteDance-Seed/Seed-OSS-36B-Instruct": { "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "family": "bytedance-seed-seed-oss", + "family": "seed", "attachment": false, "reasoning": false, "tool_call": true, @@ -8517,26 +12962,10 @@ "cost": { "input": 0.21, "output": 0.57 }, "limit": { "context": 262000, "output": 262000 } }, - "meta-llama/Meta-Llama-3.1-8B-Instruct": { - "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", - "name": "meta-llama/Meta-Llama-3.1-8B-Instruct", - "family": "llama-3.1", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-04-23", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.06, "output": 0.06 }, - "limit": { "context": 33000, "output": 4000 } - }, "Qwen/Qwen3-Next-80B-A3B-Thinking": { "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", "name": "Qwen/Qwen3-Next-80B-A3B-Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -8552,7 +12981,7 @@ "Qwen/Qwen2.5-14B-Instruct": { "id": "Qwen/Qwen2.5-14B-Instruct", "name": "Qwen/Qwen2.5-14B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8568,7 +12997,7 @@ "Qwen/Qwen3-Next-80B-A3B-Instruct": { "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8584,7 +13013,7 @@ "Qwen/Qwen3-VL-32B-Instruct": { "id": "Qwen/Qwen3-VL-32B-Instruct", "name": "Qwen/Qwen3-VL-32B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -8600,7 +13029,7 @@ "Qwen/Qwen3-Omni-30B-A3B-Thinking": { "id": "Qwen/Qwen3-Omni-30B-A3B-Thinking", "name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", - "family": "qwen3-omni", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -8616,7 +13045,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -8632,7 +13061,7 @@ "Qwen/Qwen3-VL-32B-Thinking": { "id": "Qwen/Qwen3-VL-32B-Thinking", "name": "Qwen/Qwen3-VL-32B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -8648,7 +13077,7 @@ "Qwen/Qwen3-VL-30B-A3B-Thinking": { "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -8664,7 +13093,7 @@ "Qwen/Qwen3-30B-A3B-Instruct-2507": { "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8680,7 +13109,7 @@ "Qwen/Qwen3-VL-235B-A22B-Thinking": { "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -8696,7 +13125,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8712,7 +13141,7 @@ "Qwen/Qwen3-VL-235B-A22B-Instruct": { "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -8728,7 +13157,7 @@ "Qwen/Qwen3-VL-8B-Instruct": { "id": "Qwen/Qwen3-VL-8B-Instruct", "name": "Qwen/Qwen3-VL-8B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -8744,7 +13173,7 @@ "Qwen/Qwen3-32B": { "id": "Qwen/Qwen3-32B", "name": "Qwen/Qwen3-32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8757,26 +13186,10 @@ "cost": { "input": 0.14, "output": 0.57 }, "limit": { "context": 131000, "output": 131000 } }, - "Qwen/Qwen2.5-VL-7B-Instruct": { - "id": "Qwen/Qwen2.5-VL-7B-Instruct", - "name": "Qwen/Qwen2.5-VL-7B-Instruct", - "family": "qwen2.5-vl", - "attachment": true, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-01-28", - "last_updated": "2025-11-25", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.05, "output": 0.05 }, - "limit": { "context": 33000, "output": 4000 } - }, "Qwen/QwQ-32B": { "id": "Qwen/QwQ-32B", "name": "Qwen/QwQ-32B", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -8792,7 +13205,7 @@ "Qwen/Qwen2.5-VL-72B-Instruct": { "id": "Qwen/Qwen2.5-VL-72B-Instruct", "name": "Qwen/Qwen2.5-VL-72B-Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -8805,26 +13218,10 @@ "cost": { "input": 0.59, "output": 0.59 }, "limit": { "context": 131000, "output": 4000 } }, - "Qwen/Qwen3-235B-A22B": { - "id": "Qwen/Qwen3-235B-A22B", - "name": "Qwen/Qwen3-235B-A22B", - "family": "qwen3", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-04-30", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.35, "output": 1.42 }, - "limit": { "context": 131000, "output": 131000 } - }, "Qwen/Qwen2.5-7B-Instruct": { "id": "Qwen/Qwen2.5-7B-Instruct", "name": "Qwen/Qwen2.5-7B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8840,7 +13237,7 @@ "Qwen/Qwen3-Coder-30B-A3B-Instruct": { "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8856,7 +13253,7 @@ "Qwen/Qwen2.5-72B-Instruct": { "id": "Qwen/Qwen2.5-72B-Instruct", "name": "Qwen/Qwen2.5-72B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8872,7 +13269,7 @@ "Qwen/Qwen2.5-72B-Instruct-128K": { "id": "Qwen/Qwen2.5-72B-Instruct-128K", "name": "Qwen/Qwen2.5-72B-Instruct-128K", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8888,7 +13285,7 @@ "Qwen/Qwen2.5-32B-Instruct": { "id": "Qwen/Qwen2.5-32B-Instruct", "name": "Qwen/Qwen2.5-32B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8904,7 +13301,7 @@ "Qwen/Qwen2.5-Coder-32B-Instruct": { "id": "Qwen/Qwen2.5-Coder-32B-Instruct", "name": "Qwen/Qwen2.5-Coder-32B-Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8920,7 +13317,7 @@ "Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8936,7 +13333,7 @@ "Qwen/Qwen3-VL-8B-Thinking": { "id": "Qwen/Qwen3-VL-8B-Thinking", "name": "Qwen/Qwen3-VL-8B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -8952,7 +13349,7 @@ "Qwen/Qwen3-Omni-30B-A3B-Instruct": { "id": "Qwen/Qwen3-Omni-30B-A3B-Instruct", "name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", - "family": "qwen3-omni", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -8968,7 +13365,7 @@ "Qwen/Qwen3-8B": { "id": "Qwen/Qwen3-8B", "name": "Qwen/Qwen3-8B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -8984,7 +13381,7 @@ "Qwen/Qwen3-Omni-30B-A3B-Captioner": { "id": "Qwen/Qwen3-Omni-30B-A3B-Captioner", "name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", - "family": "qwen3-omni", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -9000,7 +13397,7 @@ "Qwen/Qwen2.5-VL-32B-Instruct": { "id": "Qwen/Qwen2.5-VL-32B-Instruct", "name": "Qwen/Qwen2.5-VL-32B-Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -9016,7 +13413,7 @@ "Qwen/Qwen3-14B": { "id": "Qwen/Qwen3-14B", "name": "Qwen/Qwen3-14B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -9032,7 +13429,7 @@ "Qwen/Qwen3-VL-30B-A3B-Instruct": { "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -9048,7 +13445,7 @@ "Qwen/Qwen3-30B-A3B-Thinking-2507": { "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", "name": "Qwen/Qwen3-30B-A3B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -9064,7 +13461,7 @@ "Qwen/Qwen3-30B-A3B": { "id": "Qwen/Qwen3-30B-A3B", "name": "Qwen/Qwen3-30B-A3B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -9080,7 +13477,7 @@ "zai-org/GLM-4.5-Air": { "id": "zai-org/GLM-4.5-Air", "name": "zai-org/GLM-4.5-Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": false, "tool_call": true, @@ -9096,7 +13493,7 @@ "zai-org/GLM-4.5V": { "id": "zai-org/GLM-4.5V", "name": "zai-org/GLM-4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": false, "tool_call": true, @@ -9112,7 +13509,7 @@ "zai-org/GLM-4.6": { "id": "zai-org/GLM-4.6", "name": "zai-org/GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -9125,42 +13522,26 @@ "cost": { "input": 0.5, "output": 1.9 }, "limit": { "context": 205000, "output": 205000 } }, - "zai-org/GLM-4.5": { - "id": "zai-org/GLM-4.5", - "name": "zai-org/GLM-4.5", - "family": "glm-4.5", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.4, "output": 2 }, - "limit": { "context": 131000, "output": 131000 } - }, - "deepseek-ai/DeepSeek-V3.1": { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "deepseek-ai/DeepSeek-V3.1", - "family": "deepseek-v3", - "attachment": false, + "zai-org/GLM-4.6V": { + "id": "zai-org/GLM-4.6V", + "name": "zai-org/GLM-4.6V", + "family": "glm", + "attachment": true, "reasoning": true, "tool_call": true, - "structured_output": true, + "structured_output": false, "temperature": true, - "release_date": "2025-08-25", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, + "release_date": "2025-12-07", + "last_updated": "2025-12-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.27, "output": 1 }, - "limit": { "context": 164000, "output": 164000 } + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 131000, "output": 131000 } }, "deepseek-ai/DeepSeek-V3": { "id": "deepseek-ai/DeepSeek-V3", "name": "deepseek-ai/DeepSeek-V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -9173,6 +13554,22 @@ "cost": { "input": 0.25, "output": 1 }, "limit": { "context": 164000, "output": 164000 } }, + "deepseek-ai/DeepSeek-V3.2": { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "deepseek-ai/DeepSeek-V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.42 }, + "limit": { "context": 164000, "output": 164000 } + }, "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B": { "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", @@ -9192,7 +13589,7 @@ "deepseek-ai/DeepSeek-V3.1-Terminus": { "id": "deepseek-ai/DeepSeek-V3.1-Terminus", "name": "deepseek-ai/DeepSeek-V3.1-Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -9205,22 +13602,6 @@ "cost": { "input": 0.27, "output": 1 }, "limit": { "context": 164000, "output": 164000 } }, - "deepseek-ai/DeepSeek-V3.2-Exp": { - "id": "deepseek-ai/DeepSeek-V3.2-Exp", - "name": "deepseek-ai/DeepSeek-V3.2-Exp", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-10-10", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.27, "output": 0.41 }, - "limit": { "context": 164000, "output": 164000 } - }, "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B": { "id": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", "name": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", @@ -9272,7 +13653,7 @@ "deepseek-ai/DeepSeek-R1": { "id": "deepseek-ai/DeepSeek-R1", "name": "deepseek-ai/DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -9284,6 +13665,240 @@ "open_weights": false, "cost": { "input": 0.5, "output": 2.18 }, "limit": { "context": 164000, "output": 164000 } + }, + "Pro/moonshotai/Kimi-K2-Instruct-0905": { + "id": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "name": "Pro/moonshotai/Kimi-K2-Instruct-0905", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-08", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Pro/moonshotai/Kimi-K2-Thinking": { + "id": "Pro/moonshotai/Kimi-K2-Thinking", + "name": "Pro/moonshotai/Kimi-K2-Thinking", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-11-07", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.55, "output": 2.5 }, + "limit": { "context": 262000, "output": 262000 } + }, + "Pro/MiniMaxAI/MiniMax-M2.1": { + "id": "Pro/MiniMaxAI/MiniMax-M2.1", + "name": "Pro/MiniMaxAI/MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 197000, "output": 131000 } + }, + "Pro/zai-org/GLM-4.7": { + "id": "Pro/zai-org/GLM-4.7", + "name": "Pro/zai-org/GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 205000, "output": 205000 } + }, + "Pro/deepseek-ai/DeepSeek-R1": { + "id": "Pro/deepseek-ai/DeepSeek-R1", + "name": "Pro/deepseek-ai/DeepSeek-R1", + "family": "deepseek-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-05-28", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.5, "output": 2.18 }, + "limit": { "context": 164000, "output": 164000 } + }, + "Pro/deepseek-ai/DeepSeek-V3.1-Terminus": { + "id": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-09-29", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + }, + "Pro/deepseek-ai/DeepSeek-V3.2": { + "id": "Pro/deepseek-ai/DeepSeek-V3.2", + "name": "Pro/deepseek-ai/DeepSeek-V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.42 }, + "limit": { "context": 164000, "output": 164000 } + }, + "Pro/deepseek-ai/DeepSeek-V3": { + "id": "Pro/deepseek-ai/DeepSeek-V3", + "name": "Pro/deepseek-ai/DeepSeek-V3", + "family": "deepseek", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-12-26", + "last_updated": "2025-11-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.25, "output": 1 }, + "limit": { "context": 164000, "output": 164000 } + } + } + }, + "vivgrid": { + "id": "vivgrid", + "env": ["VIVGRID_API_KEY"], + "npm": "@ai-sdk/openai", + "api": "https://api.vivgrid.com/v1", + "name": "Vivgrid", + "doc": "https://docs.vivgrid.com/models", + "models": { + "gemini-3-flash-preview": { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview", + "family": "gemini-flash", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-12-17", + "last_updated": "2025-12-17", + "modalities": { "input": ["text", "image", "video", "audio", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { + "input": 0.5, + "output": 3, + "cache_read": 0.05, + "context_over_200k": { "input": 0.5, "output": 3, "cache_read": 0.05 } + }, + "limit": { "context": 1048576, "output": 65536 }, + "provider": { "npm": "@ai-sdk/openai-compatible" } + }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gpt-5.1-codex": { + "id": "gpt-5.1-codex", + "name": "GPT-5.1 Codex", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } + }, + "gemini-3-pro-preview": { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview", + "family": "gemini-pro", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-11-18", + "last_updated": "2025-11-18", + "modalities": { "input": ["text", "image", "video", "audio", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { + "input": 2, + "output": 12, + "cache_read": 0.2, + "context_over_200k": { "input": 4, "output": 18, "cache_read": 0.4 } + }, + "limit": { "context": 1048576, "output": 65536 }, + "provider": { "npm": "@ai-sdk/openai-compatible" } + }, + "gpt-5.1-codex-max": { + "id": "gpt-5.1-codex-max", + "name": "GPT-5.1 Codex Max", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "output": 128000 } } } }, @@ -9305,18 +13920,11 @@ "structured_output": false, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.1, - "output": 0.39, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 40960, "output": 40960 } + "cost": { "input": 0.1, "output": 0.39 }, + "limit": { "context": 32768, "output": 8192 } }, "NousResearch/Hermes-4-70B": { "id": "NousResearch/Hermes-4-70B", @@ -9329,18 +13937,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.11, - "output": 0.38, - "reasoning": 0.5700000000000001, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.11, "output": 0.38 }, "limit": { "context": 131072, "output": 131072 } }, "NousResearch/Hermes-4-14B": { @@ -9354,18 +13954,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.01, - "output": 0.05, - "reasoning": 0.07500000000000001, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.01, "output": 0.05 }, "limit": { "context": 40960, "output": 40960 } }, "NousResearch/Hermes-4-405B-FP8-TEE": { @@ -9373,41 +13965,17 @@ "name": "Hermes 4 405B FP8 TEE", "family": "nousresearch", "attachment": false, - "reasoning": false, - "tool_call": false, - "structured_output": false, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.3, "output": 1.2, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, - "limit": { "context": 40960, "output": 40960 } - }, - "NousResearch/Hermes-4-405B-FP8": { - "id": "NousResearch/Hermes-4-405B-FP8", - "name": "Hermes 4 405B FP8", - "family": "nousresearch", - "attachment": false, "reasoning": true, "tool_call": true, "interleaved": { "field": "reasoning_content" }, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 131072, "output": 131072 } + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 131072, "output": 65536 } }, "NousResearch/DeepHermes-3-Mistral-24B-Preview": { "id": "NousResearch/DeepHermes-3-Mistral-24B-Preview", @@ -9419,69 +13987,66 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.02, - "output": 0.1, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.02, "output": 0.1 }, "limit": { "context": 32768, "output": 32768 } }, "rednote-hilab/dots.ocr": { "id": "rednote-hilab/dots.ocr", "name": "dots.ocr", - "family": "rednote-hilab", + "family": "rednote", "attachment": false, "reasoning": false, "tool_call": false, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.01, - "output": 0.01, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.01, "output": 0.01 }, "limit": { "context": 131072, "output": 131072 } }, + "moonshotai/Kimi-K2.5-TEE": { + "id": "moonshotai/Kimi-K2.5-TEE", + "name": "Kimi K2.5 TEE", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "structured_output": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3 }, + "limit": { "context": 262144, "output": 65535 } + }, "moonshotai/Kimi-K2-Instruct-0905": { "id": "moonshotai/Kimi-K2-Instruct-0905", "name": "Kimi K2 Instruct 0905", - "family": "moonshotai", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.39, - "output": 1.9, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.39, "output": 1.9 }, "limit": { "context": 262144, "output": 262144 } }, "moonshotai/Kimi-K2-Thinking-TEE": { "id": "moonshotai/Kimi-K2-Thinking-TEE", "name": "Kimi K2 Thinking TEE", - "family": "moonshotai", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -9489,49 +14054,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.4, - "output": 1.75, - "reasoning": 2.625, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.4, "output": 1.75 }, "limit": { "context": 262144, "output": 65535 } }, - "MiniMaxAI/MiniMax-M2": { - "id": "MiniMaxAI/MiniMax-M2", - "name": "MiniMax M2", - "family": "minimaxai", - "attachment": false, - "reasoning": true, - "tool_call": true, - "interleaved": { "field": "reasoning_content" }, - "structured_output": true, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { - "input": 0.26, - "output": 1.02, - "reasoning": 1.53, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 196608, "output": 196608 } - }, "MiniMaxAI/MiniMax-M2.1-TEE": { "id": "MiniMaxAI/MiniMax-M2.1-TEE", "name": "MiniMax M2.1 TEE", - "family": "minimaxai", + "family": "minimax", "attachment": false, "reasoning": true, "tool_call": true, @@ -9539,67 +14071,42 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-27", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.27, "output": 1.12 }, "limit": { "context": 196608, "output": 65536 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": { "id": "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", "name": "NVIDIA Nemotron 3 Nano 30B A3B BF16", - "family": "nvidia", + "family": "nemotron", "attachment": false, "reasoning": false, "tool_call": true, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.06, - "output": 0.24, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.06, "output": 0.24 }, "limit": { "context": 262144, "output": 262144 } }, - "ArliAI/QwQ-32B-ArliAI-RpR-v1": { - "id": "ArliAI/QwQ-32B-ArliAI-RpR-v1", - "name": "QwQ 32B ArliAI RpR v1", - "family": "arliai", + "tngtech/TNG-R1T-Chimera-Turbo": { + "id": "tngtech/TNG-R1T-Chimera-Turbo", + "name": "TNG R1T Chimera Turbo", "attachment": false, "reasoning": true, - "tool_call": false, - "interleaved": { "field": "reasoning_content" }, + "tool_call": true, "structured_output": true, "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.03, - "output": 0.11, - "reasoning": 0.165, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 32768, "output": 32768 } + "cost": { "input": 0.22, "output": 0.6 }, + "limit": { "context": 163840, "output": 65536 } }, "tngtech/DeepSeek-R1T-Chimera": { "id": "tngtech/DeepSeek-R1T-Chimera", @@ -9612,18 +14119,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.3, "output": 1.2 }, "limit": { "context": 163840, "output": 163840 } }, "tngtech/DeepSeek-TNG-R1T2-Chimera": { @@ -9637,18 +14136,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.25, "output": 0.85 }, "limit": { "context": 163840, "output": 163840 } }, "tngtech/TNG-R1T-Chimera-TEE": { @@ -9662,70 +14153,48 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.25, "output": 0.85 }, "limit": { "context": 163840, "output": 65536 } }, "XiaomiMiMo/MiMo-V2-Flash": { "id": "XiaomiMiMo/MiMo-V2-Flash", "name": "MiMo V2 Flash", - "family": "xiaomimimo", + "family": "mimo", "attachment": false, "reasoning": false, "tool_call": false, "structured_output": false, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-27", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.17, - "output": 0.65, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 40960, "output": 40960 } + "cost": { "input": 0.09, "output": 0.29 }, + "limit": { "context": 32768, "output": 8192 } }, - "OpenGVLab/InternVL3-78B": { - "id": "OpenGVLab/InternVL3-78B", - "name": "InternVL3 78B", + "OpenGVLab/InternVL3-78B-TEE": { + "id": "OpenGVLab/InternVL3-78B-TEE", + "name": "InternVL3 78B TEE", "family": "opengvlab", "attachment": false, "reasoning": false, "tool_call": false, "structured_output": true, "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "release_date": "2025-01-06", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.1, - "output": 0.39, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.1, "output": 0.39 }, "limit": { "context": 32768, "output": 32768 } }, "openai/gpt-oss-120b-TEE": { "id": "openai/gpt-oss-120b-TEE", "name": "gpt oss 120b TEE", - "family": "openai", + "family": "gpt-oss", "attachment": false, "reasoning": true, "tool_call": true, @@ -9733,24 +14202,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.04, - "output": 0.25, - "reasoning": 0.375, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.04, "output": 0.18 }, "limit": { "context": 131072, "output": 65536 } }, "openai/gpt-oss-20b": { "id": "openai/gpt-oss-20b", "name": "gpt oss 20b", - "family": "openai", + "family": "gpt-oss", "attachment": false, "reasoning": true, "tool_call": true, @@ -9758,18 +14219,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.02, - "output": 0.1, - "reasoning": 0.15000000000000002, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.02, "output": 0.1 }, "limit": { "context": 131072, "output": 131072 } }, "chutesai/Mistral-Small-3.1-24B-Instruct-2503": { @@ -9782,17 +14235,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.03, - "output": 0.11, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.03, "output": 0.11 }, "limit": { "context": 131072, "output": 131072 } }, "chutesai/Mistral-Small-3.2-24B-Instruct-2506": { @@ -9805,65 +14251,25 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.06, - "output": 0.18, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.06, "output": 0.18 }, "limit": { "context": 131072, "output": 131072 } }, - "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B": { - "id": "Alibaba-NLP/Tongyi-DeepResearch-30B-A3B", - "name": "Tongyi DeepResearch 30B A3B", - "family": "alibaba-nlp", - "attachment": false, - "reasoning": true, - "tool_call": true, - "interleaved": { "field": "reasoning_content" }, - "structured_output": true, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { - "input": 0.1, - "output": 0.39, - "reasoning": 0.585, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 131072, "output": 131072 } - }, - "mistralai/Devstral-2-123B-Instruct-2512": { - "id": "mistralai/Devstral-2-123B-Instruct-2512", - "name": "Devstral 2 123B Instruct 2512", - "family": "mistralai", + "mistralai/Devstral-2-123B-Instruct-2512-TEE": { + "id": "mistralai/Devstral-2-123B-Instruct-2512-TEE", + "name": "Devstral 2 123B Instruct 2512 TEE", "attachment": false, "reasoning": false, "tool_call": true, "structured_output": true, "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "release_date": "2026-01-10", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.05, - "output": 0.22, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.05, "output": 0.22 }, "limit": { "context": 262144, "output": 65536 } }, "unsloth/Mistral-Nemo-Instruct-2407": { @@ -9876,17 +14282,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.02, - "output": 0.04, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.02, "output": 0.04 }, "limit": { "context": 131072, "output": 131072 } }, "unsloth/gemma-3-4b-it": { @@ -9899,17 +14298,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.01, - "output": 0.03, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.01, "output": 0.03 }, "limit": { "context": 96000, "output": 96000 } }, "unsloth/Mistral-Small-24B-Instruct-2501": { @@ -9922,19 +14314,27 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.03, - "output": 0.11, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.03, "output": 0.11 }, "limit": { "context": 32768, "output": 32768 } }, + "unsloth/Llama-3.2-1B-Instruct": { + "id": "unsloth/Llama-3.2-1B-Instruct", + "name": "Llama 3.2 1B Instruct", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.01, "output": 0.01 }, + "limit": { "context": 32768, "output": 8192 } + }, "unsloth/gemma-3-12b-it": { "id": "unsloth/gemma-3-12b-it", "name": "gemma 3 12b it", @@ -9942,20 +14342,13 @@ "attachment": false, "reasoning": false, "tool_call": false, - "structured_output": false, + "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.03, - "output": 0.1, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.03, "output": 0.1 }, "limit": { "context": 131072, "output": 131072 } }, "unsloth/gemma-3-27b-it": { @@ -9968,17 +14361,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.04, - "output": 0.15, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.04, "output": 0.15 }, "limit": { "context": 96000, "output": 96000 } }, "Qwen/Qwen3-30B-A3B": { @@ -9992,18 +14378,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.06, - "output": 0.22, - "reasoning": 0.33, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.06, "output": 0.22 }, "limit": { "context": 40960, "output": 40960 } }, "Qwen/Qwen3-14B": { @@ -10017,18 +14395,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.05, - "output": 0.22, - "reasoning": 0.33, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.05, "output": 0.22 }, "limit": { "context": 40960, "output": 40960 } }, "Qwen/Qwen2.5-VL-32B-Instruct": { @@ -10041,17 +14411,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.05, - "output": 0.22, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.05, "output": 0.22 }, "limit": { "context": 16384, "output": 16384 } }, "Qwen/Qwen3Guard-Gen-0.6B": { @@ -10064,41 +14427,11 @@ "structured_output": false, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.01, - "output": 0.01, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 40960, "output": 40960 } - }, - "Qwen/Qwen3-235B-A22B-Instruct-2507": { - "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { - "input": 0.08, - "output": 0.55, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 262144, "output": 262144 } + "cost": { "input": 0.01, "output": 0.01 }, + "limit": { "context": 32768, "output": 8192 } }, "Qwen/Qwen2.5-Coder-32B-Instruct": { "id": "Qwen/Qwen2.5-Coder-32B-Instruct", @@ -10110,17 +14443,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.03, - "output": 0.11, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.03, "output": 0.11 }, "limit": { "context": 32768, "output": 32768 } }, "Qwen/Qwen2.5-72B-Instruct": { @@ -10133,17 +14459,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.13, - "output": 0.52, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.13, "output": 0.52 }, "limit": { "context": 32768, "output": 32768 } }, "Qwen/Qwen2.5-VL-72B-Instruct-TEE": { @@ -10153,21 +14472,14 @@ "attachment": false, "reasoning": false, "tool_call": false, - "structured_output": false, + "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, + "last_updated": "2026-01-10", + "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.15, - "output": 0.6, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 40960, "output": 40960 } + "cost": { "input": 0.15, "output": 0.6 }, + "limit": { "context": 32768, "output": 32768 } }, "Qwen/Qwen3-235B-A22B": { "id": "Qwen/Qwen3-235B-A22B", @@ -10180,43 +14492,12 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.3, "output": 1.2 }, "limit": { "context": 40960, "output": 40960 } }, - "Qwen/Qwen2.5-VL-72B-Instruct": { - "id": "Qwen/Qwen2.5-VL-72B-Instruct", - "name": "Qwen2.5 VL 72B Instruct", - "family": "qwen", - "attachment": false, - "reasoning": false, - "tool_call": false, - "structured_output": true, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { - "input": 0.07, - "output": 0.26, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 32768, "output": 32768 } - }, "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-TEE", "name": "Qwen3 235B A22B Instruct 2507 TEE", @@ -10227,17 +14508,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.08, - "output": 0.55, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.08, "output": 0.55 }, "limit": { "context": 262144, "output": 65536 } }, "Qwen/Qwen3-32B": { @@ -10251,18 +14525,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.08, - "output": 0.24, - "reasoning": 0.36, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.08, "output": 0.24 }, "limit": { "context": 40960, "output": 40960 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct": { @@ -10272,38 +14538,13 @@ "attachment": false, "reasoning": false, "tool_call": true, - "structured_output": false, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.3, "output": 1.2, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, - "limit": { "context": 262144, "output": 262144 } - }, - "Qwen/Qwen3-VL-235B-A22B-Thinking": { - "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "name": "Qwen3 VL 235B A22B Thinking", - "family": "qwen", - "attachment": false, - "reasoning": true, - "tool_call": true, - "interleaved": { "field": "reasoning_content" }, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.3, "output": 1.2 }, "limit": { "context": 262144, "output": 262144 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { @@ -10316,17 +14557,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.08, - "output": 0.33, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.08, "output": 0.33 }, "limit": { "context": 262144, "output": 262144 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE": { @@ -10339,17 +14573,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.22, - "output": 0.95, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.22, "output": 0.95 }, "limit": { "context": 262144, "output": 262144 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { @@ -10363,18 +14590,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.11, - "output": 0.6, - "reasoning": 0.8999999999999999, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.11, "output": 0.6 }, "limit": { "context": 262144, "output": 262144 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { @@ -10387,16 +14606,31 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.1, "output": 0.8, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, + "cost": { "input": 0.1, "output": 0.8 }, "limit": { "context": 262144, "output": 262144 } }, + "miromind-ai/MiroThinker-v1.5-235B": { + "id": "miromind-ai/MiroThinker-v1.5-235B", + "name": "MiroThinker V1.5 235B", + "attachment": false, + "reasoning": false, + "tool_call": false, + "structured_output": false, + "temperature": true, + "release_date": "2026-01-10", + "last_updated": "2026-01-10", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 32768, "output": 8192 } + }, "zai-org/GLM-4.6-TEE": { "id": "zai-org/GLM-4.6-TEE", "name": "GLM 4.6 TEE", - "family": "zai-org", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -10404,24 +14638,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.4, - "output": 1.75, - "reasoning": 2.625, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.35, "output": 1.5 }, "limit": { "context": 202752, "output": 65536 } }, "zai-org/GLM-4.5-TEE": { "id": "zai-org/GLM-4.5-TEE", "name": "GLM 4.5 TEE", - "family": "zai-org", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -10429,24 +14655,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.35, - "output": 1.55, - "reasoning": 2.325, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.35, "output": 1.55 }, "limit": { "context": 131072, "output": 65536 } }, "zai-org/GLM-4.6V": { "id": "zai-org/GLM-4.6V", "name": "GLM 4.6V", - "family": "zai-org", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -10454,24 +14672,46 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 0.9, - "reasoning": 1.35, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.3, "output": 0.9 }, "limit": { "context": 131072, "output": 65536 } }, + "zai-org/GLM-4.7-FP8": { + "id": "zai-org/GLM-4.7-FP8", + "name": "GLM 4.7 FP8", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 202752, "output": 65535 } + }, + "zai-org/GLM-4.6-FP8": { + "id": "zai-org/GLM-4.6-FP8", + "name": "GLM 4.6 FP8", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 202752, "output": 65535 } + }, "zai-org/GLM-4.7-TEE": { "id": "zai-org/GLM-4.7-TEE", "name": "GLM 4.7 TEE", - "family": "zai-org", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -10479,24 +14719,46 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.4, - "output": 1.5, - "reasoning": 2.25, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.4, "output": 1.5 }, + "limit": { "context": 202752, "output": 65535 } + }, + "zai-org/GLM-4.5-FP8": { + "id": "zai-org/GLM-4.5-FP8", + "name": "GLM 4.5 FP8", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 131072, "output": 65536 } + }, + "zai-org/GLM-4.7-Flash": { + "id": "zai-org/GLM-4.7-Flash", + "name": "GLM 4.7 Flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.06, "output": 0.35 }, "limit": { "context": 202752, "output": 65535 } }, "zai-org/GLM-4.5-Air": { "id": "zai-org/GLM-4.5-Air", "name": "GLM 4.5 Air", - "family": "zai-org", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -10504,47 +14766,32 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.05, - "output": 0.22, - "reasoning": 0.33, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.05, "output": 0.22 }, "limit": { "context": 131072, "output": 131072 } }, "deepseek-ai/DeepSeek-V3-0324-TEE": { "id": "deepseek-ai/DeepSeek-V3-0324-TEE", "name": "DeepSeek V3 0324 TEE", - "family": "deepseek-ai", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.24, - "output": 0.84, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.19, "output": 0.87 }, "limit": { "context": 163840, "output": 65536 } }, "deepseek-ai/DeepSeek-V3.2-Speciale-TEE": { "id": "deepseek-ai/DeepSeek-V3.2-Speciale-TEE", "name": "DeepSeek V3.2 Speciale TEE", - "family": "deepseek-ai", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": false, @@ -10552,24 +14799,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.27, - "output": 0.41, - "reasoning": 0.615, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.27, "output": 0.41 }, "limit": { "context": 163840, "output": 65536 } }, "deepseek-ai/DeepSeek-V3.1-Terminus-TEE": { "id": "deepseek-ai/DeepSeek-V3.1-Terminus-TEE", "name": "DeepSeek V3.1 Terminus TEE", - "family": "deepseek-ai", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -10577,40 +14816,32 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.23, - "output": 0.9, - "reasoning": 1.35, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.23, "output": 0.9 }, "limit": { "context": 163840, "output": 65536 } }, "deepseek-ai/DeepSeek-V3": { "id": "deepseek-ai/DeepSeek-V3", "name": "DeepSeek V3", - "family": "deepseek-ai", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": false, "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.3, "output": 1.2, "cache_read": 0, "cache_write": 0, "input_audio": 0, "output_audio": 0 }, + "cost": { "input": 0.3, "output": 1.2 }, "limit": { "context": 163840, "output": 163840 } }, "deepseek-ai/DeepSeek-R1-TEE": { "id": "deepseek-ai/DeepSeek-R1-TEE", "name": "DeepSeek R1 TEE", - "family": "deepseek-ai", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -10618,24 +14849,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.3, - "output": 1.2, - "reasoning": 1.7999999999999998, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.3, "output": 1.2 }, "limit": { "context": 163840, "output": 163840 } }, "deepseek-ai/DeepSeek-R1-Distill-Llama-70B": { "id": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-ai", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -10643,49 +14866,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.03, - "output": 0.11, - "reasoning": 0.165, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.03, "output": 0.11 }, "limit": { "context": 131072, "output": 131072 } }, - "deepseek-ai/DeepSeek-V3.1": { - "id": "deepseek-ai/DeepSeek-V3.1", - "name": "DeepSeek V3.1", - "family": "deepseek-ai", - "attachment": false, - "reasoning": true, - "tool_call": true, - "interleaved": { "field": "reasoning_content" }, - "structured_output": true, - "temperature": true, - "release_date": "2025-12-29", - "last_updated": "2025-12-29", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { - "input": 0.2, - "output": 0.8, - "reasoning": 1.2000000000000002, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 163840, "output": 65536 } - }, "deepseek-ai/DeepSeek-R1-0528-TEE": { "id": "deepseek-ai/DeepSeek-R1-0528-TEE", "name": "DeepSeek R1 0528 TEE", - "family": "deepseek-ai", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -10693,24 +14883,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.4, - "output": 1.75, - "reasoning": 2.625, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 163840, "output": 163840 } + "cost": { "input": 0.4, "output": 1.75 }, + "limit": { "context": 163840, "output": 65536 } }, "deepseek-ai/DeepSeek-V3.2-TEE": { "id": "deepseek-ai/DeepSeek-V3.2-TEE", "name": "DeepSeek V3.2 TEE", - "family": "deepseek-ai", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -10718,24 +14900,16 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.27, - "output": 0.41, - "reasoning": 0.615, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, - "limit": { "context": 163840, "output": 16384 } + "cost": { "input": 0.25, "output": 0.38 }, + "limit": { "context": 163840, "output": 65536 } }, "deepseek-ai/DeepSeek-V3.1-TEE": { "id": "deepseek-ai/DeepSeek-V3.1-TEE", "name": "DeepSeek V3.1 TEE", - "family": "deepseek-ai", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -10743,18 +14917,10 @@ "structured_output": true, "temperature": true, "release_date": "2025-12-29", - "last_updated": "2025-12-29", + "last_updated": "2026-01-10", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { - "input": 0.2, - "output": 0.8, - "reasoning": 1.2000000000000002, - "cache_read": 0, - "cache_write": 0, - "input_audio": 0, - "output_audio": 0 - }, + "cost": { "input": 0.2, "output": 0.8 }, "limit": { "context": 163840, "output": 65536 } } } @@ -10767,10 +14933,27 @@ "name": "Kimi For Coding", "doc": "https://www.kimi.com/coding/docs/en/third-party-agents.html", "models": { + "k2p5": { + "id": "k2p5", + "name": "Kimi K2.5", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 262144, "output": 32768 } + }, "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -10859,7 +15042,7 @@ "deepseek-v3-0324": { "id": "deepseek-v3-0324", "name": "DeepSeek V3 0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -10891,7 +15074,7 @@ "kimi-k2-instruct": { "id": "kimi-k2-instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -10907,7 +15090,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT 4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -10970,7 +15153,7 @@ "qwen3-coder-480b-a35b-instruct": { "id": "qwen3-coder-480b-a35b-instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -11002,7 +15185,7 @@ "llama-3.1-405b-instruct": { "id": "llama-3.1-405b-instruct", "name": "Llama 3.1 405B Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -11033,7 +15216,7 @@ "qwen3-32b": { "id": "qwen3-32b", "name": "Qwen3 32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -11075,7 +15258,7 @@ "xai/grok-3": { "id": "xai/grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -11091,7 +15274,7 @@ "xai/grok-3-mini": { "id": "xai/grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -11139,7 +15322,7 @@ "cohere/cohere-command-r-plus-08-2024": { "id": "cohere/cohere-command-r-plus-08-2024", "name": "Cohere Command R+ 08-2024", - "family": "command-r-plus", + "family": "command-r", "attachment": false, "reasoning": true, "tool_call": true, @@ -11171,7 +15354,7 @@ "cohere/cohere-command-r-plus": { "id": "cohere/cohere-command-r-plus", "name": "Cohere Command R+", - "family": "command-r-plus", + "family": "command-r", "attachment": false, "reasoning": true, "tool_call": true, @@ -11187,7 +15370,7 @@ "deepseek/deepseek-r1-0528": { "id": "deepseek/deepseek-r1-0528", "name": "DeepSeek-R1-0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -11203,7 +15386,7 @@ "deepseek/deepseek-r1": { "id": "deepseek/deepseek-r1", "name": "DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -11219,7 +15402,7 @@ "deepseek/deepseek-v3-0324": { "id": "deepseek/deepseek-v3-0324", "name": "DeepSeek-V3-0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -11251,7 +15434,7 @@ "mistral-ai/ministral-3b": { "id": "mistral-ai/ministral-3b", "name": "Ministral 3B", - "family": "ministral-3b", + "family": "ministral", "attachment": false, "reasoning": true, "tool_call": true, @@ -11331,7 +15514,7 @@ "microsoft/phi-3-medium-128k-instruct": { "id": "microsoft/phi-3-medium-128k-instruct", "name": "Phi-3-medium instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11347,7 +15530,7 @@ "microsoft/phi-3-mini-4k-instruct": { "id": "microsoft/phi-3-mini-4k-instruct", "name": "Phi-3-mini instruct (4k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11363,7 +15546,7 @@ "microsoft/phi-3-small-128k-instruct": { "id": "microsoft/phi-3-small-128k-instruct", "name": "Phi-3-small instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11379,7 +15562,7 @@ "microsoft/phi-3.5-vision-instruct": { "id": "microsoft/phi-3.5-vision-instruct", "name": "Phi-3.5-vision instruct (128k)", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11395,7 +15578,7 @@ "microsoft/phi-4": { "id": "microsoft/phi-4", "name": "Phi-4", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11411,7 +15594,7 @@ "microsoft/phi-4-mini-reasoning": { "id": "microsoft/phi-4-mini-reasoning", "name": "Phi-4-mini-reasoning", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11427,7 +15610,7 @@ "microsoft/phi-3-small-8k-instruct": { "id": "microsoft/phi-3-small-8k-instruct", "name": "Phi-3-small instruct (8k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11443,7 +15626,7 @@ "microsoft/phi-3.5-mini-instruct": { "id": "microsoft/phi-3.5-mini-instruct", "name": "Phi-3.5-mini instruct (128k)", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11459,7 +15642,7 @@ "microsoft/phi-4-multimodal-instruct": { "id": "microsoft/phi-4-multimodal-instruct", "name": "Phi-4-multimodal-instruct", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11475,7 +15658,7 @@ "microsoft/phi-3-mini-128k-instruct": { "id": "microsoft/phi-3-mini-128k-instruct", "name": "Phi-3-mini instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11491,7 +15674,7 @@ "microsoft/phi-3.5-moe-instruct": { "id": "microsoft/phi-3.5-moe-instruct", "name": "Phi-3.5-MoE instruct (128k)", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11507,7 +15690,7 @@ "microsoft/phi-4-mini-instruct": { "id": "microsoft/phi-4-mini-instruct", "name": "Phi-4-mini-instruct", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11523,7 +15706,7 @@ "microsoft/phi-3-medium-4k-instruct": { "id": "microsoft/phi-3-medium-4k-instruct", "name": "Phi-3-medium instruct (4k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11539,7 +15722,7 @@ "microsoft/phi-4-reasoning": { "id": "microsoft/phi-4-reasoning", "name": "Phi-4-Reasoning", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -11555,7 +15738,7 @@ "microsoft/mai-ds-r1": { "id": "microsoft/mai-ds-r1", "name": "MAI-DS-R1", - "family": "mai-ds-r1", + "family": "mai", "attachment": false, "reasoning": true, "tool_call": true, @@ -11571,7 +15754,7 @@ "openai/gpt-4.1-nano": { "id": "openai/gpt-4.1-nano", "name": "GPT-4.1-nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -11587,7 +15770,7 @@ "openai/gpt-4.1-mini": { "id": "openai/gpt-4.1-mini", "name": "GPT-4.1-mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -11603,7 +15786,7 @@ "openai/o1-preview": { "id": "openai/o1-preview", "name": "OpenAI o1-preview", - "family": "o1-preview", + "family": "o", "attachment": false, "reasoning": true, "tool_call": false, @@ -11619,7 +15802,7 @@ "openai/o3-mini": { "id": "openai/o3-mini", "name": "OpenAI o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": false, @@ -11635,7 +15818,7 @@ "openai/gpt-4o": { "id": "openai/gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -11651,7 +15834,7 @@ "openai/gpt-4.1": { "id": "openai/gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -11667,7 +15850,7 @@ "openai/o4-mini": { "id": "openai/o4-mini", "name": "OpenAI o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": false, @@ -11683,7 +15866,7 @@ "openai/o1": { "id": "openai/o1", "name": "OpenAI o1", - "family": "o1", + "family": "o", "attachment": false, "reasoning": true, "tool_call": false, @@ -11699,7 +15882,7 @@ "openai/o1-mini": { "id": "openai/o1-mini", "name": "OpenAI o1-mini", - "family": "o1-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": false, @@ -11715,7 +15898,7 @@ "openai/o3": { "id": "openai/o3", "name": "OpenAI o3", - "family": "o3", + "family": "o", "attachment": false, "reasoning": true, "tool_call": false, @@ -11731,7 +15914,7 @@ "openai/gpt-4o-mini": { "id": "openai/gpt-4o-mini", "name": "GPT-4o mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -11747,7 +15930,7 @@ "meta/llama-3.2-11b-vision-instruct": { "id": "meta/llama-3.2-11b-vision-instruct", "name": "Llama-3.2-11B-Vision-Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11763,7 +15946,7 @@ "meta/meta-llama-3.1-405b-instruct": { "id": "meta/meta-llama-3.1-405b-instruct", "name": "Meta-Llama-3.1-405B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11779,7 +15962,7 @@ "meta/llama-4-maverick-17b-128e-instruct-fp8": { "id": "meta/llama-4-maverick-17b-128e-instruct-fp8", "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "family": "llama-4-maverick", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11795,7 +15978,7 @@ "meta/meta-llama-3-70b-instruct": { "id": "meta/meta-llama-3-70b-instruct", "name": "Meta-Llama-3-70B-Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11811,7 +15994,7 @@ "meta/meta-llama-3.1-70b-instruct": { "id": "meta/meta-llama-3.1-70b-instruct", "name": "Meta-Llama-3.1-70B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11827,7 +16010,7 @@ "meta/llama-3.3-70b-instruct": { "id": "meta/llama-3.3-70b-instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11843,7 +16026,7 @@ "meta/llama-3.2-90b-vision-instruct": { "id": "meta/llama-3.2-90b-vision-instruct", "name": "Llama-3.2-90B-Vision-Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11859,7 +16042,7 @@ "meta/meta-llama-3-8b-instruct": { "id": "meta/meta-llama-3-8b-instruct", "name": "Meta-Llama-3-8B-Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11875,7 +16058,7 @@ "meta/llama-4-scout-17b-16e-instruct": { "id": "meta/llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout 17B 16E Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11891,7 +16074,7 @@ "meta/meta-llama-3.1-8b-instruct": { "id": "meta/meta-llama-3.1-8b-instruct", "name": "Meta-Llama-3.1-8B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -11907,7 +16090,7 @@ "ai21-labs/ai21-jamba-1.5-large": { "id": "ai21-labs/ai21-jamba-1.5-large", "name": "AI21 Jamba 1.5 Large", - "family": "jamba-1.5-large", + "family": "jamba", "attachment": false, "reasoning": true, "tool_call": true, @@ -11923,7 +16106,7 @@ "ai21-labs/ai21-jamba-1.5-mini": { "id": "ai21-labs/ai21-jamba-1.5-mini", "name": "AI21 Jamba 1.5 Mini", - "family": "jamba-1.5-mini", + "family": "jamba", "attachment": false, "reasoning": true, "tool_call": true, @@ -11948,7 +16131,7 @@ "moonshotai/Kimi-K2-Instruct": { "id": "moonshotai/Kimi-K2-Instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -11961,10 +16144,43 @@ "cost": { "input": 1, "output": 3 }, "limit": { "context": 131072, "output": 32768 } }, + "moonshotai/Kimi-K2.5": { + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "temperature": true, + "knowledge": "2026-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 2.8 }, + "limit": { "context": 262144, "output": 32768 } + }, + "moonshotai/Kimi-K2-Instruct-0905": { + "id": "moonshotai/Kimi-K2-Instruct-0905", + "name": "Kimi K2 Instruct-0905", + "family": "kimi", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-09", + "release_date": "2025-09-05", + "last_updated": "2025-09-05", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1, "output": 3 }, + "limit": { "context": 262144, "output": 32768 } + }, "moonshotai/Kimi-K2-Thinking": { "id": "moonshotai/Kimi-K2-Thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -11978,6 +16194,23 @@ "cost": { "input": 1.2, "output": 4 }, "limit": { "context": 262144, "output": 32768 } }, + "moonshotai/Kimi-K2-5": { + "id": "moonshotai/Kimi-K2-5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.5, "output": 2.8 }, + "limit": { "context": 262144, "output": 32768 } + }, "essentialai/Rnj-1-Instruct": { "id": "essentialai/Rnj-1-Instruct", "name": "Rnj-1 Instruct", @@ -12013,7 +16246,7 @@ "meta-llama/Llama-3.3-70B-Instruct-Turbo": { "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", "name": "Llama 3.3 70B", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -12029,7 +16262,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -12042,10 +16275,58 @@ "cost": { "input": 2, "output": 2 }, "limit": { "context": 262144, "output": 66536 } }, + "Qwen/Qwen3-235B-A22B-Instruct-2507-tput": { + "id": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", + "name": "Qwen3 235B A22B Instruct 2507 FP8", + "family": "qwen", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.2, "output": 0.6 }, + "limit": { "context": 262144, "output": 131072 } + }, + "Qwen/Qwen3-Next-80B-A3B-Instruct": { + "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "name": "Qwen3-Next-80B-A3B-Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.15, "output": 1.5 }, + "limit": { "context": 262144, "output": 131072 } + }, + "zai-org/GLM-4.7": { + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2025-07-25", + "last_updated": "2025-07-25", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.45, "output": 2 }, + "limit": { "context": 200000, "output": 128000 } + }, "zai-org/GLM-4.6": { "id": "zai-org/GLM-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -12061,7 +16342,7 @@ "deepseek-ai/DeepSeek-R1": { "id": "deepseek-ai/DeepSeek-R1", "name": "DeepSeek R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -12077,7 +16358,7 @@ "deepseek-ai/DeepSeek-V3": { "id": "deepseek-ai/DeepSeek-V3", "name": "DeepSeek V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -12093,7 +16374,7 @@ "deepseek-ai/DeepSeek-V3-1": { "id": "deepseek-ai/DeepSeek-V3-1", "name": "DeepSeek V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -12118,7 +16399,7 @@ "gpt-4.1-nano": { "id": "gpt-4.1-nano", "name": "GPT-4.1 nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -12134,7 +16415,7 @@ "text-embedding-3-small": { "id": "text-embedding-3-small", "name": "text-embedding-3-small", - "family": "text-embedding-3-small", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -12164,7 +16445,7 @@ "deepseek-r1-0528": { "id": "deepseek-r1-0528", "name": "DeepSeek-R1-0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -12196,7 +16477,7 @@ "phi-3-medium-128k-instruct": { "id": "phi-3-medium-128k-instruct", "name": "Phi-3-medium-instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -12212,7 +16493,7 @@ "gpt-4": { "id": "gpt-4", "name": "GPT-4", - "family": "gpt-4", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -12246,7 +16527,7 @@ "gpt-5.2-chat": { "id": "gpt-5.2-chat", "name": "GPT-5.2 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -12263,7 +16544,7 @@ "llama-3.2-11b-vision-instruct": { "id": "llama-3.2-11b-vision-instruct", "name": "Llama-3.2-11B-Vision-Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -12341,7 +16622,7 @@ "phi-4-mini": { "id": "phi-4-mini", "name": "Phi-4-mini", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": true, @@ -12357,7 +16638,7 @@ "gpt-4-32k": { "id": "gpt-4-32k", "name": "GPT-4 32K", - "family": "gpt-4", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -12370,10 +16651,26 @@ "cost": { "input": 60, "output": 120 }, "limit": { "context": 32768, "output": 32768 } }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, "meta-llama-3.1-405b-instruct": { "id": "meta-llama-3.1-405b-instruct", "name": "Meta-Llama-3.1-405B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -12389,7 +16686,7 @@ "deepseek-r1": { "id": "deepseek-r1", "name": "DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -12421,7 +16718,7 @@ "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -12437,7 +16734,7 @@ "phi-3-mini-4k-instruct": { "id": "phi-3-mini-4k-instruct", "name": "Phi-3-mini-instruct (4k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -12471,7 +16768,7 @@ "deepseek-v3.2-speciale": { "id": "deepseek-v3.2-speciale", "name": "DeepSeek-V3.2-Speciale", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": false, @@ -12481,7 +16778,7 @@ "last_updated": "2025-12-01", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.28, "output": 0.42 }, + "cost": { "input": 0.58, "output": 1.68 }, "limit": { "context": 128000, "output": 128000 } }, "mistral-medium-2505": { @@ -12513,14 +16810,14 @@ "last_updated": "2025-08-01", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, "limit": { "context": 200000, "output": 64000 }, "provider": { "npm": "@ai-sdk/anthropic" } }, "phi-3-small-128k-instruct": { "id": "phi-3-small-128k-instruct", "name": "Phi-3-small-instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -12552,7 +16849,7 @@ "cohere-command-r-plus-08-2024": { "id": "cohere-command-r-plus-08-2024", "name": "Command R+", - "family": "command-r-plus", + "family": "command-r", "attachment": false, "reasoning": true, "tool_call": true, @@ -12568,7 +16865,7 @@ "llama-4-maverick-17b-128e-instruct-fp8": { "id": "llama-4-maverick-17b-128e-instruct-fp8", "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -12584,7 +16881,7 @@ "gpt-4.1-mini": { "id": "gpt-4.1-mini", "name": "GPT-4.1 mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -12600,7 +16897,7 @@ "gpt-5-chat": { "id": "gpt-5-chat", "name": "GPT-5 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": false, @@ -12616,7 +16913,7 @@ "deepseek-v3.1": { "id": "deepseek-v3.1", "name": "DeepSeek-V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -12632,7 +16929,7 @@ "phi-4": { "id": "phi-4", "name": "Phi-4", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -12648,7 +16945,7 @@ "phi-4-mini-reasoning": { "id": "phi-4-mini-reasoning", "name": "Phi-4-mini-reasoning", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -12682,7 +16979,7 @@ "gpt-3.5-turbo-0125": { "id": "gpt-3.5-turbo-0125", "name": "GPT-3.5 Turbo 0125", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -12698,7 +16995,7 @@ "grok-3": { "id": "grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -12714,7 +17011,7 @@ "text-embedding-3-large": { "id": "text-embedding-3-large", "name": "text-embedding-3-large", - "family": "text-embedding-3-large", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -12728,7 +17025,7 @@ "meta-llama-3-70b-instruct": { "id": "meta-llama-3-70b-instruct", "name": "Meta-Llama-3-70B-Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -12744,7 +17041,7 @@ "deepseek-v3-0324": { "id": "deepseek-v3-0324", "name": "DeepSeek-V3-0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -12760,7 +17057,7 @@ "phi-3-small-8k-instruct": { "id": "phi-3-small-8k-instruct", "name": "Phi-3-small-instruct (8k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -12776,7 +17073,7 @@ "meta-llama-3.1-70b-instruct": { "id": "meta-llama-3.1-70b-instruct", "name": "Meta-Llama-3.1-70B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -12792,7 +17089,7 @@ "gpt-4-turbo": { "id": "gpt-4-turbo", "name": "GPT-4 Turbo", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -12808,7 +17105,7 @@ "gpt-3.5-turbo-0613": { "id": "gpt-3.5-turbo-0613", "name": "GPT-3.5 Turbo 0613", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -12824,7 +17121,7 @@ "phi-3.5-mini-instruct": { "id": "phi-3.5-mini-instruct", "name": "Phi-3.5-mini-instruct", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -12840,7 +17137,7 @@ "o1-preview": { "id": "o1-preview", "name": "o1-preview", - "family": "o1-preview", + "family": "o", "attachment": false, "reasoning": true, "tool_call": true, @@ -12856,7 +17153,7 @@ "llama-3.3-70b-instruct": { "id": "llama-3.3-70b-instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -12872,7 +17169,7 @@ "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "GPT-5.1 Codex Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -12888,7 +17185,7 @@ "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -12919,7 +17216,7 @@ "o3-mini": { "id": "o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -12935,7 +17232,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -12951,7 +17248,7 @@ "gpt-5-nano": { "id": "gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -12967,7 +17264,7 @@ "gpt-5-codex": { "id": "gpt-5-codex", "name": "GPT-5-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -12983,7 +17280,7 @@ "llama-3.2-90b-vision-instruct": { "id": "llama-3.2-90b-vision-instruct", "name": "Llama-3.2-90B-Vision-Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -12999,7 +17296,7 @@ "phi-3-mini-128k-instruct": { "id": "phi-3-mini-128k-instruct", "name": "Phi-3-mini-instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -13015,7 +17312,7 @@ "gpt-4o": { "id": "gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -13031,7 +17328,7 @@ "gpt-3.5-turbo-0301": { "id": "gpt-3.5-turbo-0301", "name": "GPT-3.5 Turbo 0301", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -13047,7 +17344,7 @@ "ministral-3b": { "id": "ministral-3b", "name": "Ministral 3B", - "family": "ministral-3b", + "family": "ministral", "attachment": false, "reasoning": false, "tool_call": true, @@ -13063,7 +17360,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -13079,7 +17376,7 @@ "o4-mini": { "id": "o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -13095,7 +17392,7 @@ "phi-4-multimodal": { "id": "phi-4-multimodal", "name": "Phi-4-multimodal", - "family": "phi-4", + "family": "phi", "attachment": true, "reasoning": false, "tool_call": false, @@ -13111,7 +17408,7 @@ "meta-llama-3-8b-instruct": { "id": "meta-llama-3-8b-instruct", "name": "Meta-Llama-3-8B-Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -13127,7 +17424,7 @@ "o1": { "id": "o1", "name": "o1", - "family": "o1", + "family": "o", "attachment": false, "reasoning": true, "tool_call": true, @@ -13143,7 +17440,7 @@ "grok-3-mini": { "id": "grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -13159,7 +17456,7 @@ "gpt-5.1-chat": { "id": "gpt-5.1-chat", "name": "GPT-5.1 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -13175,7 +17472,7 @@ "phi-3.5-moe-instruct": { "id": "phi-3.5-moe-instruct", "name": "Phi-3.5-MoE-instruct", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -13191,7 +17488,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -13207,7 +17504,7 @@ "o1-mini": { "id": "o1-mini", "name": "o1-mini", - "family": "o1-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -13223,7 +17520,7 @@ "llama-4-scout-17b-16e-instruct": { "id": "llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout 17B 16E Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -13254,7 +17551,7 @@ "text-embedding-ada-002": { "id": "text-embedding-ada-002", "name": "text-embedding-ada-002", - "family": "text-embedding-ada", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -13268,7 +17565,7 @@ "meta-llama-3.1-8b-instruct": { "id": "meta-llama-3.1-8b-instruct", "name": "Meta-Llama-3.1-8B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -13284,7 +17581,7 @@ "gpt-5.1-codex-max": { "id": "gpt-5.1-codex-max", "name": "GPT-5.1 Codex Max", - "family": "gpt-5-codex-max", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -13301,7 +17598,7 @@ "gpt-3.5-turbo-instruct": { "id": "gpt-3.5-turbo-instruct", "name": "GPT-3.5 Turbo Instruct", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -13333,7 +17630,7 @@ "o3": { "id": "o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -13349,7 +17646,7 @@ "codex-mini": { "id": "codex-mini", "name": "Codex Mini", - "family": "codex", + "family": "gpt-codex-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -13365,7 +17662,7 @@ "phi-3-medium-4k-instruct": { "id": "phi-3-medium-4k-instruct", "name": "Phi-3-medium-instruct (4k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -13381,7 +17678,7 @@ "phi-4-reasoning": { "id": "phi-4-reasoning", "name": "Phi-4-reasoning", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": false, @@ -13397,7 +17694,7 @@ "gpt-4-turbo-vision": { "id": "gpt-4-turbo-vision", "name": "GPT-4 Turbo Vision", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -13413,7 +17710,7 @@ "phi-4-reasoning-plus": { "id": "phi-4-reasoning-plus", "name": "Phi-4-reasoning-plus", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": false, @@ -13429,7 +17726,7 @@ "gpt-4o-mini": { "id": "gpt-4o-mini", "name": "GPT-4o mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -13445,7 +17742,7 @@ "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -13461,7 +17758,7 @@ "mai-ds-r1": { "id": "mai-ds-r1", "name": "MAI-DS-R1", - "family": "mai-ds-r1", + "family": "mai", "attachment": false, "reasoning": true, "tool_call": false, @@ -13477,7 +17774,7 @@ "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "DeepSeek-V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -13487,13 +17784,13 @@ "last_updated": "2025-12-01", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.028 }, + "cost": { "input": 0.58, "output": 1.68 }, "limit": { "context": 128000, "output": 128000 } }, "gpt-5-pro": { "id": "gpt-5-pro", "name": "GPT-5 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -13526,7 +17823,7 @@ "gpt-5.2": { "id": "gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -13574,7 +17871,7 @@ "gpt-3.5-turbo-1106": { "id": "gpt-3.5-turbo-1106", "name": "GPT-3.5 Turbo 1106", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -13600,7 +17897,7 @@ "moonshotai/Kimi-K2-Instruct-0905": { "id": "moonshotai/Kimi-K2-Instruct-0905", "name": "Kimi K2 Instruct 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -13616,7 +17913,7 @@ "moonshotai/Kimi-K2-Thinking": { "id": "moonshotai/Kimi-K2-Thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -13633,7 +17930,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -13649,7 +17946,7 @@ "zai-org/GLM-4.7": { "id": "zai-org/GLM-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -13666,7 +17963,7 @@ "zai-org/GLM-4.6": { "id": "zai-org/GLM-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -13682,7 +17979,7 @@ "deepseek-ai/DeepSeek-V3.2": { "id": "deepseek-ai/DeepSeek-V3.2", "name": "DeepSeek V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -13698,6 +17995,48 @@ } } }, + "moark": { + "id": "moark", + "env": ["MOARK_API_KEY"], + "npm": "@ai-sdk/openai-compatible", + "api": "https://moark.com/v1", + "name": "Moark", + "doc": "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", + "models": { + "GLM-4.7": { + "id": "GLM-4.7", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 3.5, "output": 14 }, + "limit": { "context": 204800, "output": 131072 } + }, + "MiniMax-M2.1": { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 2.1, "output": 8.4 }, + "limit": { "context": 204800, "output": 131072 } + } + } + }, "siliconflow": { "id": "siliconflow", "env": ["SILICONFLOW_API_KEY"], @@ -13709,7 +18048,7 @@ "inclusionAI/Ling-mini-2.0": { "id": "inclusionAI/Ling-mini-2.0", "name": "inclusionAI/Ling-mini-2.0", - "family": "inclusionai-ling-mini", + "family": "ling", "attachment": false, "reasoning": false, "tool_call": true, @@ -13725,7 +18064,7 @@ "inclusionAI/Ling-flash-2.0": { "id": "inclusionAI/Ling-flash-2.0", "name": "inclusionAI/Ling-flash-2.0", - "family": "inclusionai-ling-flash", + "family": "ling", "attachment": false, "reasoning": false, "tool_call": true, @@ -13741,7 +18080,7 @@ "inclusionAI/Ring-flash-2.0": { "id": "inclusionAI/Ring-flash-2.0", "name": "inclusionAI/Ring-flash-2.0", - "family": "inclusionai-ring-flash", + "family": "ring", "attachment": false, "reasoning": true, "tool_call": true, @@ -13757,7 +18096,7 @@ "moonshotai/Kimi-K2-Instruct": { "id": "moonshotai/Kimi-K2-Instruct", "name": "moonshotai/Kimi-K2-Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -13789,7 +18128,7 @@ "moonshotai/Kimi-K2-Instruct-0905": { "id": "moonshotai/Kimi-K2-Instruct-0905", "name": "moonshotai/Kimi-K2-Instruct-0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -13805,7 +18144,7 @@ "moonshotai/Kimi-K2-Thinking": { "id": "moonshotai/Kimi-K2-Thinking", "name": "moonshotai/Kimi-K2-Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -13882,10 +18221,26 @@ "cost": { "input": 0.55, "output": 2.2 }, "limit": { "context": 131000, "output": 131000 } }, + "MiniMaxAI/MiniMax-M2.1": { + "id": "MiniMaxAI/MiniMax-M2.1", + "name": "MiniMaxAI/MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 197000, "output": 131000 } + }, "THUDM/GLM-4-32B-0414": { "id": "THUDM/GLM-4-32B-0414", "name": "THUDM/GLM-4-32B-0414", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -13901,7 +18256,7 @@ "THUDM/GLM-4.1V-9B-Thinking": { "id": "THUDM/GLM-4.1V-9B-Thinking", "name": "THUDM/GLM-4.1V-9B-Thinking", - "family": "glm-4v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -13917,7 +18272,7 @@ "THUDM/GLM-Z1-9B-0414": { "id": "THUDM/GLM-Z1-9B-0414", "name": "THUDM/GLM-Z1-9B-0414", - "family": "glm-z1", + "family": "glm-z", "attachment": false, "reasoning": true, "tool_call": true, @@ -13933,7 +18288,7 @@ "THUDM/GLM-4-9B-0414": { "id": "THUDM/GLM-4-9B-0414", "name": "THUDM/GLM-4-9B-0414", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -13949,7 +18304,7 @@ "THUDM/GLM-Z1-32B-0414": { "id": "THUDM/GLM-Z1-32B-0414", "name": "THUDM/GLM-Z1-32B-0414", - "family": "glm-z1", + "family": "glm-z", "attachment": false, "reasoning": true, "tool_call": true, @@ -13965,7 +18320,7 @@ "openai/gpt-oss-20b": { "id": "openai/gpt-oss-20b", "name": "openai/gpt-oss-20b", - "family": "openai-gpt-oss", + "family": "gpt-oss", "attachment": false, "reasoning": false, "tool_call": true, @@ -13981,7 +18336,7 @@ "openai/gpt-oss-120b": { "id": "openai/gpt-oss-120b", "name": "openai/gpt-oss-120b", - "family": "openai-gpt-oss", + "family": "gpt-oss", "attachment": false, "reasoning": true, "tool_call": true, @@ -13997,7 +18352,7 @@ "stepfun-ai/step3": { "id": "stepfun-ai/step3", "name": "stepfun-ai/step3", - "family": "stepfun-ai-step3", + "family": "step", "attachment": true, "reasoning": false, "tool_call": true, @@ -14013,7 +18368,7 @@ "nex-agi/DeepSeek-V3.1-Nex-N1": { "id": "nex-agi/DeepSeek-V3.1-Nex-N1", "name": "nex-agi/DeepSeek-V3.1-Nex-N1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -14029,7 +18384,7 @@ "baidu/ERNIE-4.5-300B-A47B": { "id": "baidu/ERNIE-4.5-300B-A47B", "name": "baidu/ERNIE-4.5-300B-A47B", - "family": "ernie-4", + "family": "ernie", "attachment": false, "reasoning": false, "tool_call": true, @@ -14042,42 +18397,10 @@ "cost": { "input": 0.28, "output": 1.1 }, "limit": { "context": 131000, "output": 131000 } }, - "z-ai/GLM-4.5": { - "id": "z-ai/GLM-4.5", - "name": "z-ai/GLM-4.5", - "family": "glm-4.5", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.4, "output": 2 }, - "limit": { "context": 131000, "output": 131000 } - }, - "z-ai/GLM-4.5-Air": { - "id": "z-ai/GLM-4.5-Air", - "name": "z-ai/GLM-4.5-Air", - "family": "glm-4.5-air", - "attachment": false, - "reasoning": false, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-28", - "last_updated": "2025-11-25", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0.14, "output": 0.86 }, - "limit": { "context": 131000, "output": 131000 } - }, "ByteDance-Seed/Seed-OSS-36B-Instruct": { "id": "ByteDance-Seed/Seed-OSS-36B-Instruct", "name": "ByteDance-Seed/Seed-OSS-36B-Instruct", - "family": "bytedance-seed-seed-oss", + "family": "seed", "attachment": false, "reasoning": false, "tool_call": true, @@ -14093,7 +18416,7 @@ "meta-llama/Meta-Llama-3.1-8B-Instruct": { "id": "meta-llama/Meta-Llama-3.1-8B-Instruct", "name": "meta-llama/Meta-Llama-3.1-8B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -14109,7 +18432,7 @@ "Qwen/Qwen3-30B-A3B": { "id": "Qwen/Qwen3-30B-A3B", "name": "Qwen/Qwen3-30B-A3B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14125,7 +18448,7 @@ "Qwen/Qwen3-30B-A3B-Thinking-2507": { "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", "name": "Qwen/Qwen3-30B-A3B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -14141,7 +18464,7 @@ "Qwen/Qwen3-VL-30B-A3B-Instruct": { "id": "Qwen/Qwen3-VL-30B-A3B-Instruct", "name": "Qwen/Qwen3-VL-30B-A3B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14157,7 +18480,7 @@ "Qwen/Qwen3-14B": { "id": "Qwen/Qwen3-14B", "name": "Qwen/Qwen3-14B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14173,7 +18496,7 @@ "Qwen/Qwen2.5-VL-32B-Instruct": { "id": "Qwen/Qwen2.5-VL-32B-Instruct", "name": "Qwen/Qwen2.5-VL-32B-Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14189,7 +18512,7 @@ "Qwen/Qwen3-Omni-30B-A3B-Captioner": { "id": "Qwen/Qwen3-Omni-30B-A3B-Captioner", "name": "Qwen/Qwen3-Omni-30B-A3B-Captioner", - "family": "qwen3-omni", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14205,7 +18528,7 @@ "Qwen/Qwen3-8B": { "id": "Qwen/Qwen3-8B", "name": "Qwen/Qwen3-8B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14221,7 +18544,7 @@ "Qwen/Qwen3-Omni-30B-A3B-Instruct": { "id": "Qwen/Qwen3-Omni-30B-A3B-Instruct", "name": "Qwen/Qwen3-Omni-30B-A3B-Instruct", - "family": "qwen3-omni", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14237,7 +18560,7 @@ "Qwen/Qwen3-VL-8B-Thinking": { "id": "Qwen/Qwen3-VL-8B-Thinking", "name": "Qwen/Qwen3-VL-8B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -14253,7 +18576,7 @@ "Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen/Qwen3-235B-A22B-Instruct-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14269,7 +18592,7 @@ "Qwen/Qwen2.5-Coder-32B-Instruct": { "id": "Qwen/Qwen2.5-Coder-32B-Instruct", "name": "Qwen/Qwen2.5-Coder-32B-Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14285,7 +18608,7 @@ "Qwen/Qwen2.5-32B-Instruct": { "id": "Qwen/Qwen2.5-32B-Instruct", "name": "Qwen/Qwen2.5-32B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14301,7 +18624,7 @@ "Qwen/Qwen2.5-72B-Instruct-128K": { "id": "Qwen/Qwen2.5-72B-Instruct-128K", "name": "Qwen/Qwen2.5-72B-Instruct-128K", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14317,7 +18640,7 @@ "Qwen/Qwen2.5-72B-Instruct": { "id": "Qwen/Qwen2.5-72B-Instruct", "name": "Qwen/Qwen2.5-72B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14333,7 +18656,7 @@ "Qwen/Qwen3-Coder-30B-A3B-Instruct": { "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", "name": "Qwen/Qwen3-Coder-30B-A3B-Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14349,7 +18672,7 @@ "Qwen/Qwen2.5-7B-Instruct": { "id": "Qwen/Qwen2.5-7B-Instruct", "name": "Qwen/Qwen2.5-7B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14365,7 +18688,7 @@ "Qwen/Qwen3-235B-A22B": { "id": "Qwen/Qwen3-235B-A22B", "name": "Qwen/Qwen3-235B-A22B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14381,7 +18704,7 @@ "Qwen/Qwen2.5-VL-72B-Instruct": { "id": "Qwen/Qwen2.5-VL-72B-Instruct", "name": "Qwen/Qwen2.5-VL-72B-Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14397,7 +18720,7 @@ "Qwen/QwQ-32B": { "id": "Qwen/QwQ-32B", "name": "Qwen/QwQ-32B", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -14413,7 +18736,7 @@ "Qwen/Qwen2.5-VL-7B-Instruct": { "id": "Qwen/Qwen2.5-VL-7B-Instruct", "name": "Qwen/Qwen2.5-VL-7B-Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14429,7 +18752,7 @@ "Qwen/Qwen3-32B": { "id": "Qwen/Qwen3-32B", "name": "Qwen/Qwen3-32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14445,7 +18768,7 @@ "Qwen/Qwen3-VL-8B-Instruct": { "id": "Qwen/Qwen3-VL-8B-Instruct", "name": "Qwen/Qwen3-VL-8B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14461,7 +18784,7 @@ "Qwen/Qwen3-VL-235B-A22B-Instruct": { "id": "Qwen/Qwen3-VL-235B-A22B-Instruct", "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14477,7 +18800,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen/Qwen3-Coder-480B-A35B-Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14493,7 +18816,7 @@ "Qwen/Qwen3-VL-235B-A22B-Thinking": { "id": "Qwen/Qwen3-VL-235B-A22B-Thinking", "name": "Qwen/Qwen3-VL-235B-A22B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -14509,7 +18832,7 @@ "Qwen/Qwen3-30B-A3B-Instruct-2507": { "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", "name": "Qwen/Qwen3-30B-A3B-Instruct-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14525,7 +18848,7 @@ "Qwen/Qwen3-VL-30B-A3B-Thinking": { "id": "Qwen/Qwen3-VL-30B-A3B-Thinking", "name": "Qwen/Qwen3-VL-30B-A3B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -14541,7 +18864,7 @@ "Qwen/Qwen3-VL-32B-Thinking": { "id": "Qwen/Qwen3-VL-32B-Thinking", "name": "Qwen/Qwen3-VL-32B-Thinking", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -14557,7 +18880,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -14573,7 +18896,7 @@ "Qwen/Qwen3-Omni-30B-A3B-Thinking": { "id": "Qwen/Qwen3-Omni-30B-A3B-Thinking", "name": "Qwen/Qwen3-Omni-30B-A3B-Thinking", - "family": "qwen3-omni", + "family": "qwen", "attachment": true, "reasoning": true, "tool_call": true, @@ -14589,7 +18912,7 @@ "Qwen/Qwen3-VL-32B-Instruct": { "id": "Qwen/Qwen3-VL-32B-Instruct", "name": "Qwen/Qwen3-VL-32B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -14605,7 +18928,7 @@ "Qwen/Qwen3-Next-80B-A3B-Instruct": { "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14621,7 +18944,7 @@ "Qwen/Qwen2.5-14B-Instruct": { "id": "Qwen/Qwen2.5-14B-Instruct", "name": "Qwen/Qwen2.5-14B-Instruct", - "family": "qwen2.5", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14637,7 +18960,7 @@ "Qwen/Qwen3-Next-80B-A3B-Thinking": { "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", "name": "Qwen/Qwen3-Next-80B-A3B-Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -14650,10 +18973,26 @@ "cost": { "input": 0.14, "output": 0.57 }, "limit": { "context": 262000, "output": 262000 } }, + "zai-org/GLM-4.6V": { + "id": "zai-org/GLM-4.6V", + "name": "zai-org/GLM-4.6V", + "family": "glm", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-07", + "last_updated": "2025-12-07", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.3, "output": 0.9 }, + "limit": { "context": 131000, "output": 131000 } + }, "zai-org/GLM-4.5": { "id": "zai-org/GLM-4.5", "name": "zai-org/GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -14666,10 +19005,26 @@ "cost": { "input": 0.4, "output": 2 }, "limit": { "context": 131000, "output": 131000 } }, + "zai-org/GLM-4.7": { + "id": "zai-org/GLM-4.7", + "name": "zai-org/GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": false, + "temperature": true, + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 205000, "output": 205000 } + }, "zai-org/GLM-4.6": { "id": "zai-org/GLM-4.6", "name": "zai-org/GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -14685,7 +19040,7 @@ "zai-org/GLM-4.5V": { "id": "zai-org/GLM-4.5V", "name": "zai-org/GLM-4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": false, "tool_call": true, @@ -14701,7 +19056,7 @@ "zai-org/GLM-4.5-Air": { "id": "zai-org/GLM-4.5-Air", "name": "zai-org/GLM-4.5-Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": false, "tool_call": true, @@ -14717,7 +19072,7 @@ "deepseek-ai/DeepSeek-R1": { "id": "deepseek-ai/DeepSeek-R1", "name": "deepseek-ai/DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -14781,7 +19136,7 @@ "deepseek-ai/DeepSeek-V3.2-Exp": { "id": "deepseek-ai/DeepSeek-V3.2-Exp", "name": "deepseek-ai/DeepSeek-V3.2-Exp", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -14797,7 +19152,7 @@ "deepseek-ai/DeepSeek-V3.1-Terminus": { "id": "deepseek-ai/DeepSeek-V3.1-Terminus", "name": "deepseek-ai/DeepSeek-V3.1-Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -14826,10 +19181,26 @@ "cost": { "input": 0.05, "output": 0.05 }, "limit": { "context": 33000, "output": 16000 } }, + "deepseek-ai/DeepSeek-V3.2": { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "deepseek-ai/DeepSeek-V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2025-12-03", + "last_updated": "2025-12-03", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.27, "output": 0.42 }, + "limit": { "context": 164000, "output": 164000 } + }, "deepseek-ai/DeepSeek-V3": { "id": "deepseek-ai/DeepSeek-V3", "name": "deepseek-ai/DeepSeek-V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -14845,7 +19216,7 @@ "deepseek-ai/DeepSeek-V3.1": { "id": "deepseek-ai/DeepSeek-V3.1", "name": "deepseek-ai/DeepSeek-V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -14871,7 +19242,7 @@ "gpt-4.1-nano": { "id": "gpt-4.1-nano", "name": "OpenAI GPT-4.1 Nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": false, "reasoning": false, "tool_call": true, @@ -14903,7 +19274,7 @@ "qwen3-coder": { "id": "qwen3-coder", "name": "Qwen3 Coder 480B A35B Instruct Turbo", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -14919,7 +19290,7 @@ "deepseek-v3": { "id": "deepseek-v3", "name": "DeepSeek V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -14967,7 +19338,7 @@ "llama-3.1-8b-instant": { "id": "llama-3.1-8b-instant", "name": "Meta Llama 3.1 8B Instant", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -15015,7 +19386,7 @@ "qwen3-next-80b-a3b-instruct": { "id": "qwen3-next-80b-a3b-instruct", "name": "Qwen3 Next 80B A3B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -15031,7 +19402,7 @@ "llama-4-maverick": { "id": "llama-4-maverick", "name": "Meta Llama 4 Maverick 17B 128E", - "family": "llama-4-maverick", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -15111,7 +19482,7 @@ "llama-3.1-8b-instruct-turbo": { "id": "llama-3.1-8b-instruct-turbo", "name": "Meta Llama 3.1 8B Instruct Turbo", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -15127,7 +19498,7 @@ "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "OpenAI: GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": false, "tool_call": true, @@ -15143,7 +19514,7 @@ "gpt-4.1-mini-2025-04-14": { "id": "gpt-4.1-mini-2025-04-14", "name": "OpenAI GPT-4.1 Mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -15175,7 +19546,7 @@ "llama-3.1-8b-instruct": { "id": "llama-3.1-8b-instruct", "name": "Meta Llama 3.1 8B Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -15223,7 +19594,7 @@ "gpt-4.1-mini": { "id": "gpt-4.1-mini", "name": "OpenAI GPT-4.1 Mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -15239,7 +19610,7 @@ "deepseek-v3.1-terminus": { "id": "deepseek-v3.1-terminus", "name": "DeepSeek V3.1 Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -15340,7 +19711,7 @@ "grok-3": { "id": "grok-3", "name": "xAI Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -15372,7 +19743,7 @@ "kimi-k2-0711": { "id": "kimi-k2-0711", "name": "Kimi K2 (07/11)", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -15388,7 +19759,7 @@ "chatgpt-4o-latest": { "id": "chatgpt-4o-latest", "name": "OpenAI ChatGPT-4o", - "family": "chatgpt-4o", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -15404,7 +19775,7 @@ "qwen3-coder-30b-a3b-instruct": { "id": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3 Coder 30B A3B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -15420,7 +19791,7 @@ "kimi-k2-0905": { "id": "kimi-k2-0905", "name": "Kimi K2 (09/05)", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -15452,7 +19823,7 @@ "llama-3.3-70b-instruct": { "id": "llama-3.3-70b-instruct", "name": "Meta Llama 3.3 70B Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -15468,7 +19839,7 @@ "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "OpenAI: GPT-5.1 Codex Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": false, "reasoning": false, "tool_call": true, @@ -15484,7 +19855,7 @@ "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": false, "tool_call": true, @@ -15500,7 +19871,7 @@ "o3-mini": { "id": "o3-mini", "name": "OpenAI o3 Mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -15532,7 +19903,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "OpenAI GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -15548,7 +19919,7 @@ "codex-mini-latest": { "id": "codex-mini-latest", "name": "OpenAI Codex Mini Latest", - "family": "codex", + "family": "gpt-codex-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -15564,7 +19935,7 @@ "gpt-5-nano": { "id": "gpt-5-nano", "name": "OpenAI GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": false, "reasoning": false, "tool_call": true, @@ -15580,7 +19951,7 @@ "gpt-5-codex": { "id": "gpt-5-codex", "name": "OpenAI: GPT-5 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": false, "tool_call": true, @@ -15596,7 +19967,7 @@ "gpt-4o": { "id": "gpt-4o", "name": "OpenAI GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -15612,7 +19983,7 @@ "deepseek-tng-r1t2-chimera": { "id": "deepseek-tng-r1t2-chimera", "name": "DeepSeek TNG R1T2 Chimera", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": false, "tool_call": true, @@ -15638,13 +20009,13 @@ "last_updated": "2025-11-24", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 5, "output": 25, "cache_read": 0.5000000000000001, "cache_write": 6.25 }, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, "limit": { "context": 200000, "output": 64000 } }, "gpt-4.1": { "id": "gpt-4.1", "name": "OpenAI GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -15676,7 +20047,7 @@ "glm-4.6": { "id": "glm-4.6", "name": "Zai GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -15692,7 +20063,7 @@ "o4-mini": { "id": "o4-mini", "name": "OpenAI o4 Mini", - "family": "o4-mini", + "family": "o-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -15708,7 +20079,7 @@ "qwen3-235b-a22b-thinking": { "id": "qwen3-235b-a22b-thinking", "name": "Qwen3 235B A22B Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": false, @@ -15724,7 +20095,7 @@ "hermes-2-pro-llama-3-8b": { "id": "hermes-2-pro-llama-3-8b", "name": "Hermes 2 Pro Llama 3 8B", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -15740,7 +20111,7 @@ "o1": { "id": "o1", "name": "OpenAI: o1", - "family": "o1", + "family": "o", "attachment": false, "reasoning": false, "tool_call": false, @@ -15756,7 +20127,7 @@ "grok-3-mini": { "id": "grok-3-mini", "name": "xAI Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -15788,7 +20159,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "OpenAI GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -15804,7 +20175,7 @@ "deepseek-r1-distill-llama-70b": { "id": "deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -15820,7 +20191,7 @@ "o1-mini": { "id": "o1-mini", "name": "OpenAI: o1-mini", - "family": "o1-mini", + "family": "o-mini", "attachment": false, "reasoning": false, "tool_call": false, @@ -15868,7 +20239,7 @@ "o3-pro": { "id": "o3-pro", "name": "OpenAI o3 Pro", - "family": "o3-pro", + "family": "o-pro", "attachment": false, "reasoning": false, "tool_call": true, @@ -15884,7 +20255,7 @@ "qwen2.5-coder-7b-fast": { "id": "qwen2.5-coder-7b-fast", "name": "Qwen2.5 Coder 7B fast", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -15900,7 +20271,7 @@ "deepseek-reasoner": { "id": "deepseek-reasoner", "name": "DeepSeek Reasoner", - "family": "deepseek", + "family": "deepseek-thinking", "attachment": false, "reasoning": false, "tool_call": false, @@ -15932,7 +20303,7 @@ "gemma-3-12b-it": { "id": "gemma-3-12b-it", "name": "Google Gemma 3 12B", - "family": "gemma-3", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": false, @@ -15964,7 +20335,7 @@ "o3": { "id": "o3", "name": "OpenAI o3", - "family": "o3", + "family": "o", "attachment": false, "reasoning": false, "tool_call": true, @@ -16028,7 +20399,7 @@ "gpt-5-chat-latest": { "id": "gpt-5-chat-latest", "name": "OpenAI GPT-5 Chat Latest", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": false, "reasoning": false, "tool_call": true, @@ -16044,7 +20415,7 @@ "gpt-4o-mini": { "id": "gpt-4o-mini", "name": "OpenAI GPT-4o-mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": false, "reasoning": false, "tool_call": true, @@ -16060,7 +20431,7 @@ "gemma2-9b-it": { "id": "gemma2-9b-it", "name": "Google Gemma 2", - "family": "gemma-2", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": false, @@ -16108,7 +20479,7 @@ "gpt-5": { "id": "gpt-5", "name": "OpenAI GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -16124,7 +20495,7 @@ "qwen3-vl-235b-a22b-instruct": { "id": "qwen3-vl-235b-a22b-instruct", "name": "Qwen3 VL 235B A22B Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -16140,7 +20511,7 @@ "qwen3-30b-a3b": { "id": "qwen3-30b-a3b", "name": "Qwen3 30B A3B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -16156,7 +20527,7 @@ "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "DeepSeek V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -16188,7 +20559,7 @@ "gpt-5-pro": { "id": "gpt-5-pro", "name": "OpenAI: GPT-5 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": false, "reasoning": false, "tool_call": false, @@ -16204,7 +20575,7 @@ "llama-3.3-70b-versatile": { "id": "llama-3.3-70b-versatile", "name": "Meta Llama 3.3 70B Versatile", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -16252,7 +20623,7 @@ "ernie-4.5-21b-a3b-thinking": { "id": "ernie-4.5-21b-a3b-thinking", "name": "Baidu Ernie 4.5 21B A3B Thinking", - "family": "ernie-4", + "family": "ernie", "attachment": false, "reasoning": true, "tool_call": false, @@ -16268,7 +20639,7 @@ "gpt-5.1-chat-latest": { "id": "gpt-5.1-chat-latest", "name": "OpenAI GPT-5.1 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": false, "reasoning": false, "tool_call": true, @@ -16284,7 +20655,7 @@ "qwen3-32b": { "id": "qwen3-32b", "name": "Qwen3 32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -16316,7 +20687,7 @@ "llama-4-scout": { "id": "llama-4-scout", "name": "Meta Llama 4 Scout 17B 16E", - "family": "llama-4-scout", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -16342,7 +20713,7 @@ "moonshotai/Kimi-K2-Instruct": { "id": "moonshotai/Kimi-K2-Instruct", "name": "Kimi-K2-Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -16355,10 +20726,27 @@ "cost": { "input": 1, "output": 3 }, "limit": { "context": 131072, "output": 16384 } }, + "moonshotai/Kimi-K2.5": { + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi-K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01-01", + "last_updated": "2026-01-01", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 } + }, "moonshotai/Kimi-K2-Instruct-0905": { "id": "moonshotai/Kimi-K2-Instruct-0905", "name": "Kimi-K2-Instruct-0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -16371,26 +20759,60 @@ "cost": { "input": 1, "output": 3 }, "limit": { "context": 262144, "output": 16384 } }, - "MiniMaxAI/MiniMax-M2": { - "id": "MiniMaxAI/MiniMax-M2", - "name": "MiniMax-M2", + "moonshotai/Kimi-K2-Thinking": { + "id": "moonshotai/Kimi-K2-Thinking", + "name": "Kimi-K2-Thinking", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2024-08", + "release_date": "2025-11-06", + "last_updated": "2025-11-06", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.15 }, + "limit": { "context": 262144, "output": 262144 } + }, + "MiniMaxAI/MiniMax-M2.1": { + "id": "MiniMaxAI/MiniMax-M2.1", + "name": "MiniMax-M2.1", "family": "minimax", "attachment": false, "reasoning": true, "tool_call": true, + "interleaved": { "field": "reasoning_details" }, "temperature": true, "knowledge": "2025-10", - "release_date": "2025-10-27", - "last_updated": "2025-10-27", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.3, "output": 1.2 }, - "limit": { "context": 204800, "output": 204800 } + "limit": { "context": 204800, "output": 131072 } + }, + "XiaomiMiMo/MiMo-V2-Flash": { + "id": "XiaomiMiMo/MiMo-V2-Flash", + "name": "MiMo-V2-Flash", + "family": "mimo", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-12", + "release_date": "2025-12-16", + "last_updated": "2025-12-16", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.1, "output": 0.3 }, + "limit": { "context": 262144, "output": 4096 } }, "Qwen/Qwen3-Embedding-8B": { "id": "Qwen/Qwen3-Embedding-8B", "name": "Qwen 3 Embedding 8B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -16406,7 +20828,7 @@ "Qwen/Qwen3-Embedding-4B": { "id": "Qwen/Qwen3-Embedding-4B", "name": "Qwen 3 Embedding 4B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -16422,7 +20844,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen3-Coder-480B-A35B-Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -16438,7 +20860,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen3-235B-A22B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -16454,7 +20876,7 @@ "Qwen/Qwen3-Next-80B-A3B-Instruct": { "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", "name": "Qwen3-Next-80B-A3B-Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -16470,7 +20892,7 @@ "Qwen/Qwen3-Next-80B-A3B-Thinking": { "id": "Qwen/Qwen3-Next-80B-A3B-Thinking", "name": "Qwen3-Next-80B-A3B-Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -16483,74 +20905,44 @@ "cost": { "input": 0.3, "output": 2 }, "limit": { "context": 262144, "output": 131072 } }, - "zai-org/GLM-4.5": { - "id": "zai-org/GLM-4.5", - "name": "GLM-4.5", - "family": "glm-4.5", + "zai-org/GLM-4.7": { + "id": "zai-org/GLM-4.7", + "name": "GLM-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, + "interleaved": { "field": "reasoning_details" }, "temperature": true, "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.6, "output": 2.2 }, - "limit": { "context": 131072, "output": 98304 } - }, - "zai-org/GLM-4.6": { - "id": "zai-org/GLM-4.6", - "name": "GLM-4.6", - "family": "glm-4.6", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-04", - "release_date": "2025-09-30", - "last_updated": "2025-09-30", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11 }, - "limit": { "context": 200000, "output": 128000 } + "limit": { "context": 204800, "output": 131072 } }, - "zai-org/GLM-4.5-Air": { - "id": "zai-org/GLM-4.5-Air", - "name": "GLM-4.5-Air", - "family": "glm-4.5-air", + "zai-org/GLM-4.7-Flash": { + "id": "zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, + "interleaved": { "field": "reasoning_details" }, "temperature": true, "knowledge": "2025-04", - "release_date": "2025-07-28", - "last_updated": "2025-07-28", + "release_date": "2025-08-08", + "last_updated": "2025-08-08", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.2, "output": 1.1 }, - "limit": { "context": 128000, "output": 96000 } - }, - "deepseek-ai/Deepseek-V3-0324": { - "id": "deepseek-ai/Deepseek-V3-0324", - "name": "DeepSeek-V3-0324", - "family": "deepseek-v3", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-10", - "release_date": "2025-03-24", - "last_updated": "2025-03-24", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 1.25, "output": 1.25 }, - "limit": { "context": 16384, "output": 8192 } + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 200000, "output": 128000 } }, "deepseek-ai/DeepSeek-R1-0528": { "id": "deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek-R1-0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -16562,6 +20954,22 @@ "open_weights": true, "cost": { "input": 3, "output": 5 }, "limit": { "context": 163840, "output": 163840 } + }, + "deepseek-ai/DeepSeek-V3.2": { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek-V3.2", + "family": "deepseek", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.28, "output": 0.4 }, + "limit": { "context": 163840, "output": 65536 } } } }, @@ -16573,10 +20981,27 @@ "name": "OpenCode Zen", "doc": "https://opencode.ai/docs/zen", "models": { + "glm-4.7": { + "id": "glm-4.7", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.1 }, + "limit": { "context": 204800, "output": 131072 } + }, "qwen3-coder": { "id": "qwen3-coder", "name": "Qwen3 Coder", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -16609,7 +21034,7 @@ "kimi-k2": { "id": "kimi-k2", "name": "Kimi K2", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -16622,10 +21047,28 @@ "cost": { "input": 0.4, "output": 2.5, "cache_read": 0.4 }, "limit": { "context": 262144, "output": 262144 } }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, + "provider": { "npm": "@ai-sdk/openai" } + }, "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -16657,6 +21100,22 @@ "limit": { "context": 200000, "output": 64000 }, "provider": { "npm": "@ai-sdk/anthropic" } }, + "trinity-large-preview-free": { + "id": "trinity-large-preview-free", + "name": "Trinity Large Preview", + "family": "trinity", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2026-01-28", + "last_updated": "2026-01-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, "claude-opus-4-5": { "id": "claude-opus-4-5", "name": "Claude Opus 4.5", @@ -16674,6 +21133,23 @@ "limit": { "context": 200000, "output": 64000 }, "provider": { "npm": "@ai-sdk/anthropic" } }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.08 }, + "limit": { "context": 262144, "output": 262144 } + }, "gemini-3-pro": { "id": "gemini-3-pro", "name": "Gemini 3 Pro", @@ -16697,24 +21173,6 @@ "limit": { "context": 1048576, "output": 65536 }, "provider": { "npm": "@ai-sdk/google" } }, - "alpha-glm-4.7": { - "id": "alpha-glm-4.7", - "name": "Alpha GLM-4.7", - "family": "alpha-glm", - "attachment": false, - "reasoning": true, - "tool_call": true, - "interleaved": { "field": "reasoning_content" }, - "temperature": true, - "knowledge": "2025-04", - "release_date": "2025-12-22", - "last_updated": "2025-12-22", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.6 }, - "limit": { "context": 204800, "output": 131072 }, - "status": "alpha" - }, "claude-sonnet-4-5": { "id": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5", @@ -16742,7 +21200,7 @@ "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "GPT-5.1 Codex Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -16757,28 +21215,10 @@ "limit": { "context": 400000, "input": 272000, "output": 128000 }, "provider": { "npm": "@ai-sdk/openai" } }, - "alpha-gd4": { - "id": "alpha-gd4", - "name": "Alpha GD4", - "family": "alpha-gd4", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-01", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.5, "output": 2, "cache_read": 0.15 }, - "limit": { "context": 262144, "output": 32768 }, - "status": "alpha", - "provider": { "npm": "@ai-sdk/anthropic" } - }, "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -16795,7 +21235,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -16807,13 +21247,13 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, - "limit": { "context": 400000, "output": 128000 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, "provider": { "npm": "@ai-sdk/openai" } }, "gpt-5-nano": { "id": "gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -16825,13 +21265,13 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0, "output": 0, "cache_read": 0 }, - "limit": { "context": 400000, "output": 128000 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, "provider": { "npm": "@ai-sdk/openai" } }, "gpt-5-codex": { "id": "gpt-5-codex", "name": "GPT-5 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -16843,7 +21283,7 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, - "limit": { "context": 400000, "output": 128000 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, "provider": { "npm": "@ai-sdk/openai" } }, "big-pickle": { @@ -16897,7 +21337,7 @@ }, "glm-4.7-free": { "id": "glm-4.7-free", - "name": "GLM-4.7", + "name": "GLM-4.7 Free", "family": "glm-free", "attachment": false, "reasoning": true, @@ -16925,7 +21365,8 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, - "limit": { "context": 256000, "output": 256000 } + "limit": { "context": 256000, "output": 256000 }, + "status": "deprecated" }, "gemini-3-flash": { "id": "gemini-3-flash", @@ -16948,7 +21389,7 @@ "gpt-5.1-codex-max": { "id": "gpt-5.1-codex-max", "name": "GPT-5.1 Codex Max", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -16965,7 +21406,7 @@ }, "minimax-m2.1-free": { "id": "minimax-m2.1-free", - "name": "MiniMax M2.1", + "name": "MiniMax M2.1 Free", "family": "minimax-free", "attachment": false, "reasoning": true, @@ -16980,6 +21421,23 @@ "limit": { "context": 204800, "output": 131072 }, "provider": { "npm": "@ai-sdk/anthropic" } }, + "kimi-k2.5-free": { + "id": "kimi-k2.5-free", + "name": "Kimi K2.5 Free", + "family": "kimi-free", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0 }, + "limit": { "context": 262144, "output": 262144 } + }, "claude-sonnet-4": { "id": "claude-sonnet-4", "name": "Claude Sonnet 4", @@ -17006,7 +21464,7 @@ "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -17018,13 +21476,30 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.07, "output": 8.5, "cache_read": 0.107 }, - "limit": { "context": 400000, "output": 128000 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, "provider": { "npm": "@ai-sdk/openai" } }, + "minimax-m2.1": { + "id": "minimax-m2.1", + "name": "MiniMax M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.3, "output": 1.2, "cache_read": 0.1 }, + "limit": { "context": 204800, "output": 131072 } + }, "gpt-5.2": { "id": "gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -17036,7 +21511,7 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, - "limit": { "context": 400000, "output": 128000 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 }, "provider": { "npm": "@ai-sdk/openai" } } } @@ -17052,7 +21527,7 @@ "moonshotai/kimi-k2": { "id": "moonshotai/kimi-k2", "name": "Kimi K2", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -17068,7 +21543,7 @@ "x-ai/grok-4": { "id": "x-ai/grok-4", "name": "Grok 4", - "family": "grok-4", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -17116,7 +21591,7 @@ "openai/gpt-5-nano": { "id": "openai/gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -17132,7 +21607,7 @@ "openai/gpt-4.1": { "id": "openai/gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -17148,7 +21623,7 @@ "openai/gpt-5-mini": { "id": "openai/gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -17194,7 +21669,7 @@ "openai/gpt-5": { "id": "openai/gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -17210,7 +21685,7 @@ "qwen/qwen3-coder": { "id": "qwen/qwen3-coder", "name": "Qwen3 Coder", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -17258,7 +21733,7 @@ "deepseek-ai/deepseek-r1-distill-llama-70b": { "id": "deepseek-ai/deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -17278,7 +21753,7 @@ "env": ["MINIMAX_API_KEY"], "npm": "@ai-sdk/anthropic", "api": "https://api.minimax.io/anthropic/v1", - "name": "MiniMax", + "name": "MiniMax (minimax.io)", "doc": "https://platform.minimax.io/docs/guides/quickstart", "models": { "MiniMax-M2": { @@ -17361,7 +21836,7 @@ "gemini-2.5-flash-image": { "id": "gemini-2.5-flash-image", "name": "Gemini 2.5 Flash Image", - "family": "gemini-flash-image", + "family": "gemini-flash", "attachment": true, "reasoning": true, "tool_call": false, @@ -17484,7 +21959,7 @@ "gemini-2.5-flash-preview-tts": { "id": "gemini-2.5-flash-preview-tts", "name": "Gemini 2.5 Flash Preview TTS", - "family": "gemini-flash-tts", + "family": "gemini-flash", "attachment": false, "reasoning": false, "tool_call": false, @@ -17616,7 +22091,7 @@ "gemini-2.5-flash-image-preview": { "id": "gemini-2.5-flash-image-preview", "name": "Gemini 2.5 Flash Image (Preview)", - "family": "gemini-flash-image", + "family": "gemini-flash", "attachment": true, "reasoning": true, "tool_call": false, @@ -17665,7 +22140,7 @@ "gemini-2.5-pro-preview-tts": { "id": "gemini-2.5-pro-preview-tts", "name": "Gemini 2.5 Pro Preview TTS", - "family": "gemini-flash-tts", + "family": "gemini-flash", "attachment": false, "reasoning": false, "tool_call": false, @@ -17938,7 +22413,7 @@ "last_updated": "2024-12-11", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, + "cost": { "input": 0.15, "output": 0.6, "cache_read": 0.025 }, "limit": { "context": 1048576, "output": 8192 } }, "gemini-2.5-flash-lite": { @@ -18082,6 +22557,23 @@ "open_weights": true, "cost": { "input": 0.07, "output": 0.25 }, "limit": { "context": 131072, "output": 32768 } + }, + "zai-org/glm-4.7-maas": { + "id": "zai-org/glm-4.7-maas", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 2.2 }, + "limit": { "context": 204800, "output": 131072 } } } }, @@ -18095,7 +22587,7 @@ "mistral-7b-instruct-v0.1-awq": { "id": "mistral-7b-instruct-v0.1-awq", "name": "@hf/thebloke/mistral-7b-instruct-v0.1-awq", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -18126,7 +22618,7 @@ "mistral-7b-instruct-v0.2": { "id": "mistral-7b-instruct-v0.2", "name": "@hf/mistral/mistral-7b-instruct-v0.2", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -18173,7 +22665,7 @@ "llama-3.2-11b-vision-instruct": { "id": "llama-3.2-11b-vision-instruct", "name": "@cf/meta/llama-3.2-11b-vision-instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18188,7 +22680,7 @@ "llama-2-13b-chat-awq": { "id": "llama-2-13b-chat-awq", "name": "@hf/thebloke/llama-2-13b-chat-awq", - "family": "llama-2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18204,7 +22696,7 @@ "llama-3.1-8b-instruct-fp8": { "id": "llama-3.1-8b-instruct-fp8", "name": "@cf/meta/llama-3.1-8b-instruct-fp8", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18249,7 +22741,7 @@ "llama-2-7b-chat-fp16": { "id": "llama-2-7b-chat-fp16", "name": "@cf/meta/llama-2-7b-chat-fp16", - "family": "llama-2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18309,7 +22801,7 @@ "llama-3-8b-instruct": { "id": "llama-3-8b-instruct", "name": "@cf/meta/llama-3-8b-instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18324,7 +22816,7 @@ "llama-2-7b-chat-hf-lora": { "id": "llama-2-7b-chat-hf-lora", "name": "@cf/meta-llama/llama-2-7b-chat-hf-lora", - "family": "llama-2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18339,7 +22831,7 @@ "llama-3.1-8b-instruct": { "id": "llama-3.1-8b-instruct", "name": "@cf/meta/llama-3.1-8b-instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18370,7 +22862,7 @@ "openhermes-2.5-mistral-7b-awq": { "id": "openhermes-2.5-mistral-7b-awq", "name": "@hf/thebloke/openhermes-2.5-mistral-7b-awq", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -18386,7 +22878,7 @@ "lucid-origin": { "id": "lucid-origin", "name": "@cf/leonardo/lucid-origin", - "family": "lucid-origin", + "family": "lucid", "attachment": false, "reasoning": false, "tool_call": false, @@ -18401,7 +22893,7 @@ "bart-large-cnn": { "id": "bart-large-cnn", "name": "@cf/facebook/bart-large-cnn", - "family": "bart-large-cnn", + "family": "bart", "attachment": false, "reasoning": false, "tool_call": false, @@ -18416,7 +22908,7 @@ "flux-1-schnell": { "id": "flux-1-schnell", "name": "@cf/black-forest-labs/flux-1-schnell", - "family": "flux-1", + "family": "flux", "attachment": false, "reasoning": false, "tool_call": false, @@ -18446,7 +22938,7 @@ "gemma-2b-it-lora": { "id": "gemma-2b-it-lora", "name": "@cf/google/gemma-2b-it-lora", - "family": "gemma-2", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": true, @@ -18492,7 +22984,7 @@ "m2m100-1.2b": { "id": "m2m100-1.2b", "name": "@cf/meta/m2m100-1.2b", - "family": "m2m100-1.2b", + "family": "m2m", "attachment": false, "reasoning": false, "tool_call": false, @@ -18507,7 +22999,7 @@ "llama-3.2-3b-instruct": { "id": "llama-3.2-3b-instruct", "name": "@cf/meta/llama-3.2-3b-instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18522,7 +23014,7 @@ "qwen2.5-coder-32b-instruct": { "id": "qwen2.5-coder-32b-instruct", "name": "@cf/qwen/qwen2.5-coder-32b-instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -18629,7 +23121,7 @@ "qwen3-30b-a3b-fp8": { "id": "qwen3-30b-a3b-fp8", "name": "@cf/qwen/qwen3-30b-a3b-fp8", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -18660,7 +23152,7 @@ "hermes-2-pro-mistral-7b": { "id": "hermes-2-pro-mistral-7b", "name": "@hf/nousresearch/hermes-2-pro-mistral-7b", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -18690,7 +23182,7 @@ "falcon-7b-instruct": { "id": "falcon-7b-instruct", "name": "@cf/tiiuae/falcon-7b-instruct", - "family": "falcon-7b", + "family": "falcon", "attachment": false, "reasoning": false, "tool_call": true, @@ -18706,7 +23198,7 @@ "llama-3.3-70b-instruct-fp8-fast": { "id": "llama-3.3-70b-instruct-fp8-fast", "name": "@cf/meta/llama-3.3-70b-instruct-fp8-fast", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18721,7 +23213,7 @@ "llama-3-8b-instruct-awq": { "id": "llama-3-8b-instruct-awq", "name": "@cf/meta/llama-3-8b-instruct-awq", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18766,7 +23258,7 @@ "dreamshaper-8-lcm": { "id": "dreamshaper-8-lcm", "name": "@cf/lykon/dreamshaper-8-lcm", - "family": "dreamshaper-8-lcm", + "family": "dreamshaper", "attachment": true, "reasoning": false, "tool_call": false, @@ -18781,7 +23273,7 @@ "discolm-german-7b-v1-awq": { "id": "discolm-german-7b-v1-awq", "name": "@cf/thebloke/discolm-german-7b-v1-awq", - "family": "discolm-german", + "family": "discolm", "attachment": false, "reasoning": false, "tool_call": true, @@ -18797,7 +23289,7 @@ "llama-2-7b-chat-int8": { "id": "llama-2-7b-chat-int8", "name": "@cf/meta/llama-2-7b-chat-int8", - "family": "llama-2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18812,7 +23304,7 @@ "llama-3.2-1b-instruct": { "id": "llama-3.2-1b-instruct", "name": "@cf/meta/llama-3.2-1b-instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18827,7 +23319,7 @@ "whisper-large-v3-turbo": { "id": "whisper-large-v3-turbo", "name": "@cf/openai/whisper-large-v3-turbo", - "family": "whisper-large", + "family": "whisper", "attachment": false, "reasoning": false, "tool_call": false, @@ -18842,7 +23334,7 @@ "llama-4-scout-17b-16e-instruct": { "id": "llama-4-scout-17b-16e-instruct", "name": "@cf/meta/llama-4-scout-17b-16e-instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -18857,7 +23349,7 @@ "starling-lm-7b-beta": { "id": "starling-lm-7b-beta", "name": "@hf/nexusflow/starling-lm-7b-beta", - "family": "starling-lm", + "family": "starling", "attachment": false, "reasoning": false, "tool_call": true, @@ -18873,7 +23365,7 @@ "deepseek-coder-6.7b-base-awq": { "id": "deepseek-coder-6.7b-base-awq", "name": "@hf/thebloke/deepseek-coder-6.7b-base-awq", - "family": "deepseek-coder", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -18889,7 +23381,7 @@ "gemma-3-12b-it": { "id": "gemma-3-12b-it", "name": "@cf/google/gemma-3-12b-it", - "family": "gemma-3", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": true, @@ -18919,7 +23411,7 @@ "neural-chat-7b-v3-1-awq": { "id": "neural-chat-7b-v3-1-awq", "name": "@hf/thebloke/neural-chat-7b-v3-1-awq", - "family": "neural-chat-7b-v3", + "family": "neural-chat", "attachment": false, "reasoning": false, "tool_call": true, @@ -18965,7 +23457,7 @@ "mistral-7b-instruct-v0.1": { "id": "mistral-7b-instruct-v0.1", "name": "@cf/mistral/mistral-7b-instruct-v0.1", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -18980,7 +23472,7 @@ "llava-1.5-7b-hf": { "id": "llava-1.5-7b-hf", "name": "@cf/llava-hf/llava-1.5-7b-hf", - "family": "llava-1.5-7b-hf", + "family": "llava", "attachment": true, "reasoning": false, "tool_call": false, @@ -19072,7 +23564,7 @@ "llama-3.1-8b-instruct-fast": { "id": "llama-3.1-8b-instruct-fast", "name": "@cf/meta/llama-3.1-8b-instruct-fast", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -19102,7 +23594,7 @@ "llama-3.1-70b-instruct": { "id": "llama-3.1-70b-instruct", "name": "@cf/meta/llama-3.1-70b-instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -19117,7 +23609,7 @@ "qwq-32b": { "id": "qwq-32b", "name": "@cf/qwen/qwq-32b", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -19148,7 +23640,7 @@ "deepseek-coder-6.7b-instruct-awq": { "id": "deepseek-coder-6.7b-instruct-awq", "name": "@hf/thebloke/deepseek-coder-6.7b-instruct-awq", - "family": "deepseek-coder", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -19164,7 +23656,7 @@ "llama-3.1-8b-instruct-awq": { "id": "llama-3.1-8b-instruct-awq", "name": "@cf/meta/llama-3.1-8b-instruct-awq", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -19179,7 +23671,7 @@ "mistral-7b-instruct-v0.2-lora": { "id": "mistral-7b-instruct-v0.2-lora", "name": "@cf/mistral/mistral-7b-instruct-v0.2-lora", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -19219,7 +23711,7 @@ "mercury-coder": { "id": "mercury-coder", "name": "Mercury Coder", - "family": "mercury-coder", + "family": "mercury", "attachment": false, "reasoning": false, "tool_call": true, @@ -19261,7 +23753,7 @@ "moonshotai/Kimi-K2-Instruct": { "id": "moonshotai/Kimi-K2-Instruct", "name": "Kimi-K2-Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -19277,7 +23769,7 @@ "microsoft/Phi-4-mini-instruct": { "id": "microsoft/Phi-4-mini-instruct", "name": "Phi-4-mini-instruct", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -19293,7 +23785,7 @@ "meta-llama/Llama-3.1-8B-Instruct": { "id": "meta-llama/Llama-3.1-8B-Instruct", "name": "Meta-Llama-3.1-8B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -19309,7 +23801,7 @@ "meta-llama/Llama-3.3-70B-Instruct": { "id": "meta-llama/Llama-3.3-70B-Instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -19325,7 +23817,7 @@ "meta-llama/Llama-4-Scout-17B-16E-Instruct": { "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", "name": "Llama 4 Scout 17B 16E Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -19341,7 +23833,7 @@ "Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -19357,7 +23849,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen3-Coder-480B-A35B-Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -19373,7 +23865,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen3-235B-A22B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -19389,7 +23881,7 @@ "deepseek-ai/DeepSeek-R1-0528": { "id": "deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek-R1-0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -19405,7 +23897,7 @@ "deepseek-ai/DeepSeek-V3-0324": { "id": "deepseek-ai/DeepSeek-V3-0324", "name": "DeepSeek-V3-0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -19431,7 +23923,7 @@ "workers-ai/@cf/ibm-granite/granite-4.0-h-micro": { "id": "workers-ai/@cf/ibm-granite/granite-4.0-h-micro", "name": "IBM Granite 4.0 H Micro", - "family": "granite-4", + "family": "granite", "attachment": false, "reasoning": false, "tool_call": false, @@ -19461,7 +23953,7 @@ "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1": { "id": "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", "name": "Mistral 7B Instruct v0.1", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": false, @@ -19506,7 +23998,7 @@ "workers-ai/@cf/google/gemma-3-12b-it": { "id": "workers-ai/@cf/google/gemma-3-12b-it", "name": "Gemma 3 12B IT", - "family": "gemma-3", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": false, @@ -19521,7 +24013,7 @@ "workers-ai/@cf/pfnet/plamo-embedding-1b": { "id": "workers-ai/@cf/pfnet/plamo-embedding-1b", "name": "PLaMo Embedding 1B", - "family": "plamo-embedding", + "family": "plamo", "attachment": false, "reasoning": false, "tool_call": false, @@ -19564,7 +24056,7 @@ "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B": { "id": "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", "name": "IndicTrans2 EN-Indic 1B", - "family": "indictrans2", + "family": "indictrans", "attachment": false, "reasoning": false, "tool_call": false, @@ -19594,7 +24086,7 @@ "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct": { "id": "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", "name": "Qwen 2.5 Coder 32B Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -19609,7 +24101,7 @@ "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8": { "id": "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", "name": "Qwen3 30B A3B FP8", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -19624,7 +24116,7 @@ "workers-ai/@cf/qwen/qwen3-embedding-0.6b": { "id": "workers-ai/@cf/qwen/qwen3-embedding-0.6b", "name": "Qwen3 Embedding 0.6B", - "family": "qwen3-embedding", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -19639,7 +24131,7 @@ "workers-ai/@cf/qwen/qwq-32b": { "id": "workers-ai/@cf/qwen/qwq-32b", "name": "QwQ 32B", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -19669,7 +24161,7 @@ "workers-ai/@cf/deepgram/aura-2-es": { "id": "workers-ai/@cf/deepgram/aura-2-es", "name": "Deepgram Aura 2 (ES)", - "family": "aura-2", + "family": "aura", "attachment": false, "reasoning": false, "tool_call": false, @@ -19684,7 +24176,7 @@ "workers-ai/@cf/deepgram/aura-2-en": { "id": "workers-ai/@cf/deepgram/aura-2-en", "name": "Deepgram Aura 2 (EN)", - "family": "aura-2", + "family": "aura", "attachment": false, "reasoning": false, "tool_call": false, @@ -19714,7 +24206,7 @@ "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { "id": "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it", "name": "Gemma SEA-LION v4 27B IT", - "family": "gemma-sea-lion", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": false, @@ -19729,7 +24221,7 @@ "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct": { "id": "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", "name": "Llama 3.2 11B Vision Instruct", - "family": "llama-3.2-vision", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19744,7 +24236,7 @@ "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8": { "id": "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", "name": "Llama 3.1 8B Instruct FP8", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19759,7 +24251,7 @@ "workers-ai/@cf/meta/llama-2-7b-chat-fp16": { "id": "workers-ai/@cf/meta/llama-2-7b-chat-fp16", "name": "Llama 2 7B Chat FP16", - "family": "llama-2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19774,7 +24266,7 @@ "workers-ai/@cf/meta/llama-3-8b-instruct": { "id": "workers-ai/@cf/meta/llama-3-8b-instruct", "name": "Llama 3 8B Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19789,7 +24281,7 @@ "workers-ai/@cf/meta/llama-3.1-8b-instruct": { "id": "workers-ai/@cf/meta/llama-3.1-8b-instruct", "name": "Llama 3.1 8B Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19804,7 +24296,7 @@ "workers-ai/@cf/meta/m2m100-1.2b": { "id": "workers-ai/@cf/meta/m2m100-1.2b", "name": "M2M100 1.2B", - "family": "m2m100", + "family": "m2m", "attachment": false, "reasoning": false, "tool_call": false, @@ -19819,7 +24311,7 @@ "workers-ai/@cf/meta/llama-3.2-3b-instruct": { "id": "workers-ai/@cf/meta/llama-3.2-3b-instruct", "name": "Llama 3.2 3B Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19834,7 +24326,7 @@ "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast": { "id": "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", "name": "Llama 3.3 70B Instruct FP8 Fast", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19849,7 +24341,7 @@ "workers-ai/@cf/meta/llama-3-8b-instruct-awq": { "id": "workers-ai/@cf/meta/llama-3-8b-instruct-awq", "name": "Llama 3 8B Instruct AWQ", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19864,7 +24356,7 @@ "workers-ai/@cf/meta/llama-3.2-1b-instruct": { "id": "workers-ai/@cf/meta/llama-3.2-1b-instruct", "name": "Llama 3.2 1B Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19879,7 +24371,7 @@ "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct": { "id": "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout 17B 16E Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19894,7 +24386,7 @@ "workers-ai/@cf/meta/llama-guard-3-8b": { "id": "workers-ai/@cf/meta/llama-guard-3-8b", "name": "Llama Guard 3 8B", - "family": "llama-guard", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19909,7 +24401,7 @@ "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq": { "id": "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq", "name": "Llama 3.1 8B Instruct AWQ", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -19924,7 +24416,7 @@ "workers-ai/@cf/baai/bge-m3": { "id": "workers-ai/@cf/baai/bge-m3", "name": "BGE M3", - "family": "bge-m3", + "family": "bge", "attachment": false, "reasoning": false, "tool_call": false, @@ -19939,7 +24431,7 @@ "workers-ai/@cf/baai/bge-base-en-v1.5": { "id": "workers-ai/@cf/baai/bge-base-en-v1.5", "name": "BGE Base EN v1.5", - "family": "bge-base", + "family": "bge", "attachment": false, "reasoning": false, "tool_call": false, @@ -19954,7 +24446,7 @@ "workers-ai/@cf/baai/bge-large-en-v1.5": { "id": "workers-ai/@cf/baai/bge-large-en-v1.5", "name": "BGE Large EN v1.5", - "family": "bge-large", + "family": "bge", "attachment": false, "reasoning": false, "tool_call": false, @@ -19969,7 +24461,7 @@ "workers-ai/@cf/baai/bge-reranker-base": { "id": "workers-ai/@cf/baai/bge-reranker-base", "name": "BGE Reranker Base", - "family": "bge-reranker", + "family": "bge", "attachment": false, "reasoning": false, "tool_call": false, @@ -19984,7 +24476,7 @@ "workers-ai/@cf/baai/bge-small-en-v1.5": { "id": "workers-ai/@cf/baai/bge-small-en-v1.5", "name": "BGE Small EN v1.5", - "family": "bge-small", + "family": "bge", "attachment": false, "reasoning": false, "tool_call": false, @@ -19999,7 +24491,7 @@ "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { "id": "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", "name": "DeepSeek R1 Distill Qwen 32B", - "family": "deepseek-r1-distill-qwen", + "family": "deepseek-thinking", "attachment": false, "reasoning": false, "tool_call": false, @@ -20014,7 +24506,7 @@ "openai/gpt-4": { "id": "openai/gpt-4", "name": "GPT-4", - "family": "gpt-4", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20031,7 +24523,7 @@ "openai/gpt-5.1-codex": { "id": "openai/gpt-5.1-codex", "name": "GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -20048,7 +24540,7 @@ "openai/gpt-3.5-turbo": { "id": "openai/gpt-3.5-turbo", "name": "GPT-3.5-turbo", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -20065,7 +24557,7 @@ "openai/gpt-4-turbo": { "id": "openai/gpt-4-turbo", "name": "GPT-4 Turbo", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20082,7 +24574,7 @@ "openai/o3-mini": { "id": "openai/o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -20099,7 +24591,7 @@ "openai/gpt-5.1": { "id": "openai/gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -20115,7 +24607,7 @@ "openai/gpt-4o": { "id": "openai/gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20132,7 +24624,7 @@ "openai/o4-mini": { "id": "openai/o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -20149,7 +24641,7 @@ "openai/o1": { "id": "openai/o1", "name": "o1", - "family": "o1", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -20166,7 +24658,7 @@ "openai/o3-pro": { "id": "openai/o3-pro", "name": "o3-pro", - "family": "o3-pro", + "family": "o-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -20183,7 +24675,7 @@ "openai/o3": { "id": "openai/o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -20200,7 +24692,7 @@ "openai/gpt-4o-mini": { "id": "openai/gpt-4o-mini", "name": "GPT-4o mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -20217,7 +24709,7 @@ "openai/gpt-5.2": { "id": "openai/gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -20434,7 +24926,7 @@ "gpt-4.1-nano": { "id": "gpt-4.1-nano", "name": "GPT-4.1 nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -20451,7 +24943,7 @@ "text-embedding-3-small": { "id": "text-embedding-3-small", "name": "text-embedding-3-small", - "family": "text-embedding-3-small", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -20467,7 +24959,7 @@ "gpt-4": { "id": "gpt-4", "name": "GPT-4", - "family": "gpt-4", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20484,7 +24976,7 @@ "o1-pro": { "id": "o1-pro", "name": "o1-pro", - "family": "o1-pro", + "family": "o-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -20501,7 +24993,7 @@ "gpt-4o-2024-05-13": { "id": "gpt-4o-2024-05-13", "name": "GPT-4o (2024-05-13)", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20515,10 +25007,27 @@ "cost": { "input": 5, "output": 15 }, "limit": { "context": 128000, "output": 4096 } }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2025-12-11", + "last_updated": "2025-12-11", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } + }, "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -20530,12 +25039,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "gpt-4o-2024-08-06": { "id": "gpt-4o-2024-08-06", "name": "GPT-4o (2024-08-06)", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20552,7 +25061,7 @@ "gpt-4.1-mini": { "id": "gpt-4.1-mini", "name": "GPT-4.1 mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -20569,7 +25078,7 @@ "o3-deep-research": { "id": "o3-deep-research", "name": "o3-deep-research", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -20585,7 +25094,7 @@ "gpt-3.5-turbo": { "id": "gpt-3.5-turbo", "name": "GPT-3.5-turbo", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -20602,7 +25111,7 @@ "gpt-5.2-pro": { "id": "gpt-5.2-pro", "name": "GPT-5.2 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -20614,12 +25123,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 21, "output": 168 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "text-embedding-3-large": { "id": "text-embedding-3-large", "name": "text-embedding-3-large", - "family": "text-embedding-3-large", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -20635,7 +25144,7 @@ "gpt-4-turbo": { "id": "gpt-4-turbo", "name": "GPT-4 Turbo", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20652,7 +25161,7 @@ "o1-preview": { "id": "o1-preview", "name": "o1-preview", - "family": "o1-preview", + "family": "o", "attachment": false, "reasoning": true, "tool_call": false, @@ -20668,7 +25177,7 @@ "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "GPT-5.1 Codex mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -20680,12 +25189,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "o3-mini": { "id": "o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -20702,7 +25211,7 @@ "gpt-5.2-chat-latest": { "id": "gpt-5.2-chat-latest", "name": "GPT-5.2 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -20719,7 +25228,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -20730,12 +25239,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "codex-mini-latest": { "id": "codex-mini-latest", "name": "Codex Mini", - "family": "codex", + "family": "gpt-codex-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -20751,7 +25260,7 @@ "gpt-5-nano": { "id": "gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -20762,13 +25271,13 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.01 }, - "limit": { "context": 400000, "output": 128000 } + "cost": { "input": 0.05, "output": 0.4, "cache_read": 0.005 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "gpt-5-codex": { "id": "gpt-5-codex", "name": "GPT-5-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -20780,12 +25289,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "gpt-4o": { "id": "gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20802,7 +25311,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20819,7 +25328,7 @@ "o4-mini": { "id": "o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -20836,7 +25345,7 @@ "o1": { "id": "o1", "name": "o1", - "family": "o1", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -20853,7 +25362,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -20864,13 +25373,13 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, - "limit": { "context": 400000, "output": 128000 } + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "o1-mini": { "id": "o1-mini", "name": "o1-mini", - "family": "o1-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": false, @@ -20887,7 +25396,7 @@ "text-embedding-ada-002": { "id": "text-embedding-ada-002", "name": "text-embedding-ada-002", - "family": "text-embedding-ada", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -20903,7 +25412,7 @@ "o3-pro": { "id": "o3-pro", "name": "o3-pro", - "family": "o3-pro", + "family": "o-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -20920,7 +25429,7 @@ "gpt-4o-2024-11-20": { "id": "gpt-4o-2024-11-20", "name": "GPT-4o (2024-11-20)", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -20937,7 +25446,7 @@ "gpt-5.1-codex-max": { "id": "gpt-5.1-codex-max", "name": "GPT-5.1 Codex Max", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -20949,12 +25458,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "o3": { "id": "o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -20971,7 +25480,7 @@ "o4-mini-deep-research": { "id": "o4-mini-deep-research", "name": "o4-mini-deep-research", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -20987,7 +25496,7 @@ "gpt-5-chat-latest": { "id": "gpt-5-chat-latest", "name": "GPT-5 Chat (latest)", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": false, @@ -20999,12 +25508,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.25, "output": 10 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "gpt-4o-mini": { "id": "gpt-4o-mini", "name": "GPT-4o mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -21021,7 +25530,7 @@ "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -21032,13 +25541,13 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 1.25, "output": 10, "cache_read": 0.13 }, - "limit": { "context": 400000, "output": 128000 } + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "gpt-5-pro": { "id": "gpt-5-pro", "name": "GPT-5 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -21050,12 +25559,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 15, "output": 120 }, - "limit": { "context": 400000, "output": 272000 } + "limit": { "context": 400000, "input": 272000, "output": 272000 } }, "gpt-5.2": { "id": "gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -21066,12 +25575,12 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, - "limit": { "context": 400000, "output": 128000 } + "limit": { "context": 400000, "input": 272000, "output": 128000 } }, "gpt-5.1-chat-latest": { "id": "gpt-5.1-chat-latest", "name": "GPT-5.1 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -21098,7 +25607,7 @@ "glm-4.6v-flash": { "id": "glm-4.6v-flash", "name": "GLM-4.6V-Flash", - "family": "glm-4.6v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -21114,7 +25623,7 @@ "glm-4.6v": { "id": "glm-4.6v", "name": "GLM-4.6V", - "family": "glm-4.6v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -21130,7 +25639,7 @@ "glm-4.6": { "id": "glm-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -21146,7 +25655,7 @@ "glm-4.5v": { "id": "glm-4.5v", "name": "GLM-4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -21162,7 +25671,7 @@ "glm-4.5-air": { "id": "glm-4.5-air", "name": "GLM-4.5-Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -21178,7 +25687,7 @@ "glm-4.5": { "id": "glm-4.5", "name": "GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -21194,7 +25703,7 @@ "glm-4.5-flash": { "id": "glm-4.5-flash", "name": "GLM-4.5-Flash", - "family": "glm-4.5-flash", + "family": "glm-flash", "attachment": false, "reasoning": true, "tool_call": true, @@ -21210,7 +25719,7 @@ "glm-4.7": { "id": "glm-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -21231,7 +25740,7 @@ "env": ["MINIMAX_API_KEY"], "npm": "@ai-sdk/anthropic", "api": "https://api.minimaxi.com/anthropic/v1", - "name": "MiniMax (China)", + "name": "MiniMax (minimaxi.com)", "doc": "https://platform.minimaxi.com/docs/guides/quickstart", "models": { "MiniMax-M2.1": { @@ -21334,7 +25843,7 @@ "moonshotai/kimi-k2": { "id": "moonshotai/kimi-k2", "name": "Kimi K2", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -21347,10 +25856,28 @@ "cost": { "input": 0.55, "output": 2.2 }, "limit": { "context": 131072, "output": 32768 } }, + "moonshotai/kimi-k2.5": { + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, "moonshotai/kimi-k2-0905": { "id": "moonshotai/kimi-k2-0905", "name": "Kimi K2 Instruct 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -21382,7 +25909,7 @@ "moonshotai/kimi-k2-thinking": { "id": "moonshotai/kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -21400,7 +25927,7 @@ "moonshotai/kimi-k2-0905:exacto": { "id": "moonshotai/kimi-k2-0905:exacto", "name": "Kimi K2 Instruct 0905 (exacto)", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -21416,7 +25943,7 @@ "moonshotai/kimi-k2:free": { "id": "moonshotai/kimi-k2:free", "name": "Kimi K2 (free)", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -21432,7 +25959,7 @@ "thudm/glm-z1-32b:free": { "id": "thudm/glm-z1-32b:free", "name": "GLM Z1 32B (free)", - "family": "glm-z1", + "family": "glm-z", "attachment": false, "reasoning": true, "tool_call": true, @@ -21480,7 +26007,7 @@ "nousresearch/deephermes-3-llama-3-8b-preview": { "id": "nousresearch/deephermes-3-llama-3-8b-preview", "name": "DeepHermes 3 Llama 3 8B Preview", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -21512,7 +26039,7 @@ "x-ai/grok-4": { "id": "x-ai/grok-4", "name": "Grok 4", - "family": "grok-4", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -21544,7 +26071,7 @@ "x-ai/grok-3": { "id": "x-ai/grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -21560,7 +26087,7 @@ "x-ai/grok-4-fast": { "id": "x-ai/grok-4-fast", "name": "Grok 4 Fast", - "family": "grok-4", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -21576,7 +26103,7 @@ "x-ai/grok-3-beta": { "id": "x-ai/grok-3-beta", "name": "Grok 3 Beta", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -21592,7 +26119,7 @@ "x-ai/grok-3-mini-beta": { "id": "x-ai/grok-3-mini-beta", "name": "Grok 3 Mini Beta", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -21608,7 +26135,7 @@ "x-ai/grok-3-mini": { "id": "x-ai/grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -21624,7 +26151,7 @@ "x-ai/grok-4.1-fast": { "id": "x-ai/grok-4.1-fast", "name": "Grok 4.1 Fast", - "family": "grok-4", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -21640,7 +26167,7 @@ "kwaipilot/kat-coder-pro:free": { "id": "kwaipilot/kat-coder-pro:free", "name": "Kat Coder Pro (free)", - "family": "kat-coder-pro", + "family": "kat-coder", "attachment": false, "reasoning": false, "tool_call": true, @@ -21688,7 +26215,7 @@ "deepseek/deepseek-chat-v3.1": { "id": "deepseek/deepseek-chat-v3.1", "name": "DeepSeek-V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21704,7 +26231,7 @@ "deepseek/deepseek-r1:free": { "id": "deepseek/deepseek-r1:free", "name": "R1 (free)", - "family": "deepseek-r1", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21720,7 +26247,7 @@ "deepseek/deepseek-v3.2-speciale": { "id": "deepseek/deepseek-v3.2-speciale", "name": "DeepSeek V3.2 Speciale", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21737,7 +26264,7 @@ "deepseek/deepseek-v3-base:free": { "id": "deepseek/deepseek-v3-base:free", "name": "DeepSeek V3 Base (free)", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": false, @@ -21753,7 +26280,7 @@ "deepseek/deepseek-v3.1-terminus": { "id": "deepseek/deepseek-v3.1-terminus", "name": "DeepSeek V3.1 Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21769,7 +26296,7 @@ "deepseek/deepseek-r1-0528-qwen3-8b:free": { "id": "deepseek/deepseek-r1-0528-qwen3-8b:free", "name": "Deepseek R1 0528 Qwen3 8B (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -21785,7 +26312,7 @@ "deepseek/deepseek-chat-v3-0324": { "id": "deepseek/deepseek-chat-v3-0324", "name": "DeepSeek V3 0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": false, @@ -21801,7 +26328,7 @@ "deepseek/deepseek-r1-0528:free": { "id": "deepseek/deepseek-r1-0528:free", "name": "R1 0528 (free)", - "family": "deepseek-r1", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21817,7 +26344,7 @@ "deepseek/deepseek-r1-distill-llama-70b": { "id": "deepseek/deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -21849,7 +26376,7 @@ "deepseek/deepseek-v3.1-terminus:exacto": { "id": "deepseek/deepseek-v3.1-terminus:exacto", "name": "DeepSeek V3.1 Terminus (exacto)", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21865,7 +26392,7 @@ "deepseek/deepseek-v3.2": { "id": "deepseek/deepseek-v3.2", "name": "DeepSeek V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -21898,7 +26425,7 @@ "tngtech/deepseek-r1t2-chimera:free": { "id": "tngtech/deepseek-r1t2-chimera:free", "name": "DeepSeek R1T2 Chimera (free)", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -21911,6 +26438,38 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 163840, "output": 163840 } }, + "arcee-ai/trinity-mini:free": { + "id": "arcee-ai/trinity-mini:free", + "name": "Trinity Mini", + "family": "trinity-mini", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2026-01-28", + "last_updated": "2026-01-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, + "arcee-ai/trinity-large-preview:free": { + "id": "arcee-ai/trinity-large-preview:free", + "name": "Trinity Large Preview", + "family": "trinity", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2026-01-28", + "last_updated": "2026-01-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 131072 } + }, "minimax/minimax-m1": { "id": "minimax/minimax-m1", "name": "MiniMax M1", @@ -21991,22 +26550,6 @@ "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, "limit": { "context": 1048576, "output": 8192 } }, - "google/gemma-2-9b-it:free": { - "id": "google/gemma-2-9b-it:free", - "name": "Gemma 2 9B (free)", - "family": "gemma-2", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-06", - "release_date": "2024-06-28", - "last_updated": "2024-06-28", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 8192, "output": 8192 } - }, "google/gemini-3-flash-preview": { "id": "google/gemini-3-flash-preview", "name": "Gemini 3 Flash Preview", @@ -22025,6 +26568,22 @@ "limit": { "context": 1048576, "output": 65536 }, "provider": { "npm": "@openrouter/ai-sdk-provider" } }, + "google/gemma-3-27b-it:free": { + "id": "google/gemma-3-27b-it:free", + "name": "Gemma 3 27B (free)", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-12", + "last_updated": "2025-03-12", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 131072, "output": 8192 } + }, "google/gemini-3-pro-preview": { "id": "google/gemini-3-pro-preview", "name": "Gemini 3 Pro Preview", @@ -22077,19 +26636,19 @@ }, "google/gemma-3n-e4b-it": { "id": "google/gemma-3n-e4b-it", - "name": "Gemma 3n E4B IT", - "family": "gemma-3", + "name": "Gemma 3n 4B", + "family": "gemma", "attachment": true, "reasoning": false, "tool_call": false, "temperature": true, - "knowledge": "2024-10", + "knowledge": "2024-06", "release_date": "2025-05-20", "last_updated": "2025-05-20", - "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 8192, "output": 8192 } + "cost": { "input": 0.02, "output": 0.04 }, + "limit": { "context": 32768, "output": 32768 } }, "google/gemini-2.5-flash-lite": { "id": "google/gemini-2.5-flash-lite", @@ -22123,6 +26682,38 @@ "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, "limit": { "context": 1048576, "output": 65536 } }, + "google/gemma-3-4b-it": { + "id": "google/gemma-3-4b-it", + "name": "Gemma 3 4B", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.01703, "output": 0.06815 }, + "limit": { "context": 96000, "output": 96000 } + }, + "google/gemma-2-9b-it": { + "id": "google/gemma-2-9b-it", + "name": "Gemma 2 9B", + "family": "gemma", + "attachment": false, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2024-06-28", + "last_updated": "2024-06-28", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.03, "output": 0.09 }, + "limit": { "context": 8192, "output": 8192 } + }, "google/gemini-2.5-flash-preview-09-2025": { "id": "google/gemini-2.5-flash-preview-09-2025", "name": "Gemini 2.5 Flash Preview 09-25", @@ -22139,6 +26730,22 @@ "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.031 }, "limit": { "context": 1048576, "output": 65536 } }, + "google/gemma-3-12b-it:free": { + "id": "google/gemma-3-12b-it:free", + "name": "Gemma 3 12B (free)", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, "google/gemini-2.5-pro": { "id": "google/gemini-2.5-pro", "name": "Gemini 2.5 Pro", @@ -22157,35 +26764,51 @@ }, "google/gemma-3-12b-it": { "id": "google/gemma-3-12b-it", - "name": "Gemma 3 12B IT", - "family": "gemma-3", + "name": "Gemma 3 12B", + "family": "gemma", "attachment": true, "reasoning": false, - "tool_call": true, + "tool_call": false, "temperature": true, "knowledge": "2024-10", "release_date": "2025-03-13", "last_updated": "2025-03-13", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, + "cost": { "input": 0.03, "output": 0.1 }, + "limit": { "context": 131072, "output": 131072 } + }, + "google/gemma-3n-e2b-it:free": { + "id": "google/gemma-3n-e2b-it:free", + "name": "Gemma 3n 2B (free)", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-06", + "release_date": "2025-07-09", + "last_updated": "2025-07-09", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, "cost": { "input": 0, "output": 0 }, - "limit": { "context": 96000, "output": 8192 } + "limit": { "context": 8192, "output": 2000 } }, "google/gemma-3n-e4b-it:free": { "id": "google/gemma-3n-e4b-it:free", "name": "Gemma 3n 4B (free)", - "family": "gemma-3", + "family": "gemma", "attachment": true, "reasoning": false, - "tool_call": true, + "tool_call": false, "temperature": true, - "knowledge": "2025-05", + "knowledge": "2024-06", "release_date": "2025-05-20", "last_updated": "2025-05-20", - "modalities": { "input": ["text", "image", "audio"], "output": ["text"] }, + "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0, "output": 0 }, - "limit": { "context": 8192, "output": 8192 } + "limit": { "context": 8192, "output": 2000 } }, "google/gemini-2.5-flash-lite-preview-09-2025": { "id": "google/gemini-2.5-flash-lite-preview-09-2025", @@ -22203,6 +26826,22 @@ "cost": { "input": 0.1, "output": 0.4, "cache_read": 0.025 }, "limit": { "context": 1048576, "output": 65536 } }, + "google/gemma-3-4b-it:free": { + "id": "google/gemma-3-4b-it:free", + "name": "Gemma 3 4B (free)", + "family": "gemma", + "attachment": true, + "reasoning": false, + "tool_call": false, + "temperature": true, + "knowledge": "2024-10", + "release_date": "2025-03-13", + "last_updated": "2025-03-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 32768, "output": 8192 } + }, "google/gemini-2.0-flash-exp:free": { "id": "google/gemini-2.0-flash-exp:free", "name": "Gemini 2.0 Flash Experimental (free)", @@ -22221,8 +26860,8 @@ }, "google/gemma-3-27b-it": { "id": "google/gemma-3-27b-it", - "name": "Gemma 3 27B IT", - "family": "gemma-3", + "name": "Gemma 3 27B", + "family": "gemma", "attachment": true, "reasoning": false, "tool_call": true, @@ -22232,13 +26871,13 @@ "last_updated": "2025-03-12", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 96000, "output": 8192 } + "cost": { "input": 0.04, "output": 0.15 }, + "limit": { "context": 96000, "output": 96000 } }, "microsoft/mai-ds-r1:free": { "id": "microsoft/mai-ds-r1:free", "name": "MAI DS R1 (free)", - "family": "mai-ds-r1", + "family": "mai", "attachment": false, "reasoning": true, "tool_call": true, @@ -22266,10 +26905,27 @@ "cost": { "input": 0.075, "output": 0.3 }, "limit": { "context": 131072, "output": 65536 } }, + "openai/gpt-5.2-codex": { + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, "openai/gpt-5.1-codex": { "id": "openai/gpt-5.1-codex", "name": "GPT-5.1-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -22286,7 +26942,7 @@ "openai/gpt-4.1-mini": { "id": "openai/gpt-4.1-mini", "name": "GPT-4.1 Mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -22302,7 +26958,7 @@ "openai/gpt-5-chat": { "id": "openai/gpt-5-chat", "name": "GPT-5 Chat (latest)", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": false, @@ -22318,7 +26974,7 @@ "openai/gpt-5.2-pro": { "id": "openai/gpt-5.2-pro", "name": "GPT-5.2 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -22335,7 +26991,7 @@ "openai/gpt-5.1-codex-mini": { "id": "openai/gpt-5.1-codex-mini", "name": "GPT-5.1-Codex-Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -22352,7 +27008,7 @@ "openai/gpt-5.2-chat-latest": { "id": "openai/gpt-5.2-chat-latest", "name": "GPT-5.2 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -22369,7 +27025,7 @@ "openai/gpt-5.1": { "id": "openai/gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -22386,7 +27042,7 @@ "openai/gpt-5-nano": { "id": "openai/gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -22402,7 +27058,7 @@ "openai/gpt-5-codex": { "id": "openai/gpt-5-codex", "name": "GPT-5 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -22418,7 +27074,7 @@ "openai/gpt-4.1": { "id": "openai/gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -22449,7 +27105,7 @@ "openai/o4-mini": { "id": "openai/o4-mini", "name": "o4 Mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -22465,7 +27121,7 @@ "openai/gpt-5.1-chat": { "id": "openai/gpt-5.1-chat", "name": "GPT-5.1 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -22482,7 +27138,7 @@ "openai/gpt-5-mini": { "id": "openai/gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -22498,7 +27154,7 @@ "openai/gpt-5-image": { "id": "openai/gpt-5-image", "name": "GPT-5 Image", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -22511,6 +27167,23 @@ "cost": { "input": 5, "output": 10, "cache_read": 1.25 }, "limit": { "context": 400000, "output": 128000 } }, + "openai/gpt-5.1-codex-max": { + "id": "openai/gpt-5.1-codex-max", + "name": "GPT-5.1-Codex-Max", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": true, + "knowledge": "2024-09-30", + "release_date": "2025-11-13", + "last_updated": "2025-11-13", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.1, "output": 9, "cache_read": 0.11 }, + "limit": { "context": 400000, "output": 128000 } + }, "openai/gpt-oss-20b": { "id": "openai/gpt-oss-20b", "name": "GPT OSS 20B", @@ -22544,7 +27217,7 @@ "openai/gpt-4o-mini": { "id": "openai/gpt-4o-mini", "name": "GPT-4o-mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -22560,7 +27233,7 @@ "openai/gpt-5": { "id": "openai/gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -22576,7 +27249,7 @@ "openai/gpt-5-pro": { "id": "openai/gpt-5-pro", "name": "GPT-5 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -22592,7 +27265,7 @@ "openai/gpt-5.2": { "id": "openai/gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -22640,7 +27313,7 @@ "z-ai/glm-4.7": { "id": "z-ai/glm-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -22658,7 +27331,7 @@ "z-ai/glm-4.5": { "id": "z-ai/glm-4.5", "name": "GLM 4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -22671,10 +27344,28 @@ "cost": { "input": 0.6, "output": 2.2 }, "limit": { "context": 128000, "output": 96000 } }, + "z-ai/glm-4.7-flash": { + "id": "z-ai/glm-4.7-flash", + "name": "GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "structured_output": true, + "temperature": true, + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.4 }, + "limit": { "context": 200000, "output": 65535 }, + "provider": { "npm": "@openrouter/ai-sdk-provider" } + }, "z-ai/glm-4.5-air": { "id": "z-ai/glm-4.5-air", "name": "GLM 4.5 Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -22690,7 +27381,7 @@ "z-ai/glm-4.5v": { "id": "z-ai/glm-4.5v", "name": "GLM 4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -22706,7 +27397,7 @@ "z-ai/glm-4.6": { "id": "z-ai/glm-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -22722,7 +27413,7 @@ "z-ai/glm-4.6:exacto": { "id": "z-ai/glm-4.6:exacto", "name": "GLM 4.6 (exacto)", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -22738,7 +27429,7 @@ "z-ai/glm-4.5-air:free": { "id": "z-ai/glm-4.5-air:free", "name": "GLM 4.5 Air (free)", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": false, @@ -22754,7 +27445,7 @@ "qwen/qwen3-coder": { "id": "qwen/qwen3-coder", "name": "Qwen3 Coder", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -22770,7 +27461,7 @@ "qwen/qwen3-32b:free": { "id": "qwen/qwen3-32b:free", "name": "Qwen3 32B (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22786,7 +27477,7 @@ "qwen/qwen3-next-80b-a3b-instruct": { "id": "qwen/qwen3-next-80b-a3b-instruct", "name": "Qwen3 Next 80B A3B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -22818,7 +27509,7 @@ "qwen/qwen3-235b-a22b:free": { "id": "qwen/qwen3-235b-a22b:free", "name": "Qwen3 235B A22B (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22834,7 +27525,7 @@ "qwen/qwen3-coder-flash": { "id": "qwen/qwen3-coder-flash", "name": "Qwen3 Coder Flash", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -22851,7 +27542,7 @@ "qwen/qwq-32b:free": { "id": "qwen/qwq-32b:free", "name": "QwQ 32B (free)", - "family": "qwq", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22867,7 +27558,7 @@ "qwen/qwen3-30b-a3b-thinking-2507": { "id": "qwen/qwen3-30b-a3b-thinking-2507", "name": "Qwen3 30B A3B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22883,7 +27574,7 @@ "qwen/qwen3-30b-a3b:free": { "id": "qwen/qwen3-30b-a3b:free", "name": "Qwen3 30B A3B (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22899,7 +27590,7 @@ "qwen/qwen2.5-vl-72b-instruct": { "id": "qwen/qwen2.5-vl-72b-instruct", "name": "Qwen2.5 VL 72B Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": false, @@ -22915,7 +27606,7 @@ "qwen/qwen3-14b:free": { "id": "qwen/qwen3-14b:free", "name": "Qwen3 14B (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22931,7 +27622,7 @@ "qwen/qwen3-30b-a3b-instruct-2507": { "id": "qwen/qwen3-30b-a3b-instruct-2507", "name": "Qwen3 30B A3B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -22944,10 +27635,26 @@ "cost": { "input": 0.2, "output": 0.8 }, "limit": { "context": 262000, "output": 262000 } }, + "qwen/qwen3-coder-30b-a3b-instruct": { + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen3 Coder 30B A3B Instruct", + "family": "qwen", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-07-31", + "last_updated": "2025-07-31", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.07, "output": 0.27 }, + "limit": { "context": 160000, "output": 65536 } + }, "qwen/qwen3-235b-a22b-thinking-2507": { "id": "qwen/qwen3-235b-a22b-thinking-2507", "name": "Qwen3 235B A22B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -22963,7 +27670,7 @@ "qwen/qwen2.5-vl-32b-instruct:free": { "id": "qwen/qwen2.5-vl-32b-instruct:free", "name": "Qwen2.5 VL 32B Instruct (free)", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -22979,7 +27686,7 @@ "qwen/qwen2.5-vl-72b-instruct:free": { "id": "qwen/qwen2.5-vl-72b-instruct:free", "name": "Qwen2.5 VL 72B Instruct (free)", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -22995,7 +27702,7 @@ "qwen/qwen3-235b-a22b-07-25:free": { "id": "qwen/qwen3-235b-a22b-07-25:free", "name": "Qwen3 235B A22B Instruct 2507 (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -23011,7 +27718,7 @@ "qwen/qwen3-coder:free": { "id": "qwen/qwen3-coder:free", "name": "Qwen3 Coder 480B A35B Instruct (free)", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -23027,7 +27734,7 @@ "qwen/qwen3-235b-a22b-07-25": { "id": "qwen/qwen3-235b-a22b-07-25", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -23043,7 +27750,7 @@ "qwen/qwen3-8b:free": { "id": "qwen/qwen3-8b:free", "name": "Qwen3 8B (free)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -23059,7 +27766,7 @@ "qwen/qwen3-max": { "id": "qwen/qwen3-max", "name": "Qwen3 Max", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -23074,7 +27781,7 @@ "qwen/qwen3-next-80b-a3b-thinking": { "id": "qwen/qwen3-next-80b-a3b-thinking", "name": "Qwen3 Next 80B A3B Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -23090,7 +27797,7 @@ "qwen/qwen3-coder:exacto": { "id": "qwen/qwen3-coder:exacto", "name": "Qwen3 Coder (exacto)", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -23106,7 +27813,7 @@ "mistralai/devstral-medium-2507": { "id": "mistralai/devstral-medium-2507", "name": "Devstral Medium", - "family": "devstral-medium", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -23170,7 +27877,7 @@ "mistralai/mistral-7b-instruct:free": { "id": "mistralai/mistral-7b-instruct:free", "name": "Mistral 7B Instruct (free)", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -23186,7 +27893,7 @@ "mistralai/devstral-small-2505": { "id": "mistralai/devstral-small-2505", "name": "Devstral Small", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -23218,7 +27925,7 @@ "mistralai/devstral-small-2505:free": { "id": "mistralai/devstral-small-2505:free", "name": "Devstral Small 2505 (free)", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -23282,7 +27989,7 @@ "mistralai/devstral-small-2507": { "id": "mistralai/devstral-small-2507", "name": "Devstral Small 1.1", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -23330,7 +28037,7 @@ "rekaai/reka-flash-3": { "id": "rekaai/reka-flash-3", "name": "Reka Flash 3", - "family": "reka-flash", + "family": "reka", "attachment": false, "reasoning": true, "tool_call": true, @@ -23346,7 +28053,7 @@ "meta-llama/llama-3.2-11b-vision-instruct": { "id": "meta-llama/llama-3.2-11b-vision-instruct", "name": "Llama 3.2 11B Vision Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": false, @@ -23362,7 +28069,7 @@ "meta-llama/llama-3.3-70b-instruct:free": { "id": "meta-llama/llama-3.3-70b-instruct:free", "name": "Llama 3.3 70B Instruct (free)", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -23378,7 +28085,7 @@ "meta-llama/llama-4-scout:free": { "id": "meta-llama/llama-4-scout:free", "name": "Llama 4 Scout (free)", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -23534,7 +28241,7 @@ "sarvamai/sarvam-m:free": { "id": "sarvamai/sarvam-m:free", "name": "Sarvam-M (free)", - "family": "sarvam-m", + "family": "sarvam", "attachment": false, "reasoning": true, "tool_call": true, @@ -23575,7 +28282,7 @@ "moonshotai/kimi-k2-thinking-turbo": { "id": "moonshotai/kimi-k2-thinking-turbo", "name": "Kimi K2 Thinking Turbo", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -23588,6 +28295,23 @@ "cost": { "input": 1.15, "output": 8, "cache_read": 0.15 }, "limit": { "context": 262144, "output": 64000 } }, + "moonshotai/kimi-k2.5": { + "id": "moonshotai/kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2026-01-25", + "last_updated": "2026-01-25", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.58, "output": 3.02, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 } + }, "moonshotai/kimi-k2-0905": { "id": "moonshotai/kimi-k2-0905", "name": "Kimi K2 0905", @@ -23606,7 +28330,7 @@ "moonshotai/kimi-k2-thinking": { "id": "moonshotai/kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -23935,6 +28659,21 @@ "cost": { "input": 0.11, "output": 0.28, "cache_read": 0.02, "cache_write": 0 }, "limit": { "context": 256000, "output": 64000 } }, + "openai/gpt-5.2-codex": { + "id": "openai/gpt-5.2-codex", + "name": "GPT-5.2-Codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2026-01-15", + "last_updated": "2026-01-15", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, "openai/gpt-5.1-codex": { "id": "openai/gpt-5.1-codex", "name": "GPT-5.1-Codex", @@ -24163,7 +28902,7 @@ "z-ai/glm-4.6": { "id": "z-ai/glm-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -24176,6 +28915,23 @@ "cost": { "input": 0.35, "output": 1.54, "cache_read": 0.07 }, "limit": { "context": 200000, "output": 128000 } }, + "z-ai/glm-4.7-flashx": { + "id": "z-ai/glm-4.7-flashx", + "name": "GLM 4.7 FlashX", + "family": "glm", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0.0715, "output": 0.425, "cache_read": 0.014 }, + "limit": { "context": 200000, "output": 128000 } + }, "z-ai/glm-4.6v": { "id": "z-ai/glm-4.6v", "name": "GLM 4.6V", @@ -24191,6 +28947,21 @@ "cost": { "input": 0.14, "output": 0.42, "cache_read": 0.03 }, "limit": { "context": 200000, "output": 64000 } }, + "qwen/qwen3-max-thinking": { + "id": "qwen/qwen3-max-thinking", + "name": "Qwen3-Max-Thinking", + "attachment": true, + "reasoning": false, + "tool_call": true, + "temperature": true, + "knowledge": "2025-01-01", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.2, "output": 6 }, + "limit": { "context": 256000, "output": 32000 } + }, "qwen/qwen3-coder-plus": { "id": "qwen/qwen3-coder-plus", "name": "Qwen3-Coder-Plus", @@ -24331,6 +29102,46 @@ } } }, + "minimax-coding-plan": { + "id": "minimax-coding-plan", + "env": ["MINIMAX_API_KEY"], + "npm": "@ai-sdk/anthropic", + "api": "https://api.minimax.io/anthropic/v1", + "name": "MiniMax Coding Plan (minimax.io)", + "doc": "https://platform.minimax.io/docs/coding-plan/intro", + "models": { + "MiniMax-M2": { + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 196608, "output": 128000 } + }, + "MiniMax-M2.1": { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 204800, "output": 131072 } + } + } + }, "ovhcloud": { "id": "ovhcloud", "env": ["OVHCLOUD_API_KEY"], @@ -24342,7 +29153,6 @@ "mixtral-8x7b-instruct-v0.1": { "id": "mixtral-8x7b-instruct-v0.1", "name": "Mixtral-8x7B-Instruct-v0.1", - "family": "mixtral-8x7b", "attachment": false, "reasoning": false, "tool_call": false, @@ -24353,12 +29163,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.7, "output": 0.7 }, - "limit": { "context": 32000, "output": 32000 } + "limit": { "context": 32768, "output": 32768 } }, "mistral-7b-instruct-v0.3": { "id": "mistral-7b-instruct-v0.3", "name": "Mistral-7B-Instruct-v0.3", - "family": "mistral-7b", "attachment": false, "reasoning": false, "tool_call": true, @@ -24369,12 +29178,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.11, "output": 0.11 }, - "limit": { "context": 127000, "output": 127000 } + "limit": { "context": 65536, "output": 65536 } }, "llama-3.1-8b-instruct": { "id": "llama-3.1-8b-instruct", "name": "Llama-3.1-8B-Instruct", - "family": "llama-3.1", "attachment": false, "reasoning": false, "tool_call": true, @@ -24385,12 +29193,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.11, "output": 0.11 }, - "limit": { "context": 131000, "output": 131000 } + "limit": { "context": 131072, "output": 131072 } }, "qwen2.5-vl-72b-instruct": { "id": "qwen2.5-vl-72b-instruct", "name": "Qwen2.5-VL-72B-Instruct", - "family": "qwen2.5-vl", "attachment": true, "reasoning": false, "tool_call": false, @@ -24401,12 +29208,11 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, "cost": { "input": 1.01, "output": 1.01 }, - "limit": { "context": 32000, "output": 32000 } + "limit": { "context": 32768, "output": 32768 } }, "mistral-nemo-instruct-2407": { "id": "mistral-nemo-instruct-2407", "name": "Mistral-Nemo-Instruct-2407", - "family": "mistral-nemo", "attachment": false, "reasoning": false, "tool_call": true, @@ -24417,12 +29223,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.14, "output": 0.14 }, - "limit": { "context": 118000, "output": 118000 } + "limit": { "context": 65536, "output": 65536 } }, "mistral-small-3.2-24b-instruct-2506": { "id": "mistral-small-3.2-24b-instruct-2506", "name": "Mistral-Small-3.2-24B-Instruct-2506", - "family": "mistral-small", "attachment": true, "reasoning": false, "tool_call": true, @@ -24433,12 +29238,11 @@ "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.1, "output": 0.31 }, - "limit": { "context": 128000, "output": 128000 } + "limit": { "context": 131072, "output": 131072 } }, "qwen2.5-coder-32b-instruct": { "id": "qwen2.5-coder-32b-instruct", "name": "Qwen2.5-Coder-32B-Instruct", - "family": "qwen2.5-coder", "attachment": false, "reasoning": false, "tool_call": false, @@ -24449,12 +29253,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.96, "output": 0.96 }, - "limit": { "context": 32000, "output": 32000 } + "limit": { "context": 32768, "output": 32768 } }, "qwen3-coder-30b-a3b-instruct": { "id": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder-30B-A3B-Instruct", - "family": "qwen3-coder", "attachment": false, "reasoning": false, "tool_call": true, @@ -24465,28 +29268,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.07, "output": 0.26 }, - "limit": { "context": 256000, "output": 256000 } - }, - "llava-next-mistral-7b": { - "id": "llava-next-mistral-7b", - "name": "llava-next-mistral-7b", - "family": "mistral-7b", - "attachment": true, - "reasoning": false, - "tool_call": false, - "structured_output": true, - "temperature": true, - "release_date": "2025-01-08", - "last_updated": "2025-01-08", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.32, "output": 0.32 }, - "limit": { "context": 32000, "output": 32000 } + "limit": { "context": 262144, "output": 262144 } }, "deepseek-r1-distill-llama-70b": { "id": "deepseek-r1-distill-llama-70b", "name": "DeepSeek-R1-Distill-Llama-70B", - "family": "deepseek-r1-distill-llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -24497,27 +29283,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.74, "output": 0.74 }, - "limit": { "context": 131000, "output": 131000 } - }, - "meta-llama-3_1-70b-instruct": { - "id": "meta-llama-3_1-70b-instruct", - "name": "Meta-Llama-3_1-70B-Instruct", - "family": "llama-3", - "attachment": false, - "reasoning": false, - "tool_call": false, - "temperature": true, - "release_date": "2025-04-01", - "last_updated": "2025-04-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0.74, "output": 0.74 }, - "limit": { "context": 131000, "output": 131000 } + "limit": { "context": 131072, "output": 131072 } }, "gpt-oss-20b": { "id": "gpt-oss-20b", "name": "gpt-oss-20b", - "family": "gpt-oss", "attachment": false, "reasoning": true, "tool_call": true, @@ -24527,12 +29297,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.05, "output": 0.18 }, - "limit": { "context": 131000, "output": 131000 } + "limit": { "context": 131072, "output": 131072 } }, "gpt-oss-120b": { "id": "gpt-oss-120b", "name": "gpt-oss-120b", - "family": "gpt-oss", "attachment": false, "reasoning": true, "tool_call": true, @@ -24542,12 +29311,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.09, "output": 0.47 }, - "limit": { "context": 131000, "output": 131000 } + "limit": { "context": 131072, "output": 131072 } }, "meta-llama-3_3-70b-instruct": { "id": "meta-llama-3_3-70b-instruct", "name": "Meta-Llama-3_3-70B-Instruct", - "family": "llama-3", "attachment": false, "reasoning": false, "tool_call": true, @@ -24558,12 +29326,11 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.74, "output": 0.74 }, - "limit": { "context": 131000, "output": 131000 } + "limit": { "context": 131072, "output": 131072 } }, "qwen3-32b": { "id": "qwen3-32b", "name": "Qwen3-32B", - "family": "qwen3", "attachment": false, "reasoning": true, "tool_call": true, @@ -24574,7 +29341,7 @@ "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.09, "output": 0.25 }, - "limit": { "context": 32000, "output": 32000 } + "limit": { "context": 32768, "output": 32768 } } } }, @@ -24640,26 +29407,10 @@ "name": "iFlow", "doc": "https://platform.iflow.cn/en/docs", "models": { - "qwen3-coder": { - "id": "qwen3-coder", - "name": "Qwen3-Coder-480B-A35B", - "family": "qwen3-coder", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2025-04", - "release_date": "2025-07-01", - "last_updated": "2025-07-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 256000, "output": 64000 } - }, "deepseek-v3": { "id": "deepseek-v3", "name": "DeepSeek-V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -24675,7 +29426,7 @@ "kimi-k2": { "id": "kimi-k2", "name": "Kimi-K2", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -24691,7 +29442,7 @@ "deepseek-r1": { "id": "deepseek-r1", "name": "DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -24704,41 +29455,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 32000 } }, - "deepseek-v3.1": { - "id": "deepseek-v3.1", - "name": "DeepSeek-V3.1-Terminus", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2024-12", - "release_date": "2025-01-01", - "last_updated": "2025-01-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 64000 } - }, - "minimax-m2": { - "id": "minimax-m2", - "name": "MiniMax-M2", - "family": "minimax", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "release_date": "2025-11-13", - "last_updated": "2025-11-13", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, - "limit": { "context": 204800, "output": 131100 } - }, "qwen3-235b": { "id": "qwen3-235b", "name": "Qwen3-235B-A22B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -24751,26 +29471,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 128000, "output": 32000 } }, - "deepseek-v3.2-chat": { - "id": "deepseek-v3.2-chat", - "name": "DeepSeek-V3.2", - "family": "deepseek-v3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-11", - "release_date": "2025-12-01", - "last_updated": "2025-12-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 64000 } - }, "kimi-k2-0905": { "id": "kimi-k2-0905", "name": "Kimi-K2-0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -24783,26 +29487,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 256000, "output": 64000 } }, - "kimi-k2-thinking": { - "id": "kimi-k2-thinking", - "name": "Kimi-K2-Thinking", - "family": "kimi-k2", - "attachment": false, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-11", - "release_date": "2025-11-06", - "last_updated": "2025-11-06", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 64000 } - }, "qwen3-235b-a22b-thinking-2507": { "id": "qwen3-235b-a22b-thinking-2507", "name": "Qwen3-235B-A22B-Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -24818,7 +29506,7 @@ "qwen3-vl-plus": { "id": "qwen3-vl-plus", "name": "Qwen3-VL-Plus", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -24834,7 +29522,7 @@ "glm-4.6": { "id": "glm-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -24847,26 +29535,10 @@ "cost": { "input": 0, "output": 0 }, "limit": { "context": 200000, "output": 128000 } }, - "tstars2.0": { - "id": "tstars2.0", - "name": "TStars-2.0", - "family": "tstars2.0", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2024-01", - "release_date": "2024-01-01", - "last_updated": "2025-01-01", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 64000 } - }, "qwen3-235b-a22b-instruct": { "id": "qwen3-235b-a22b-instruct", "name": "Qwen3-235B-A22B-Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -24882,7 +29554,7 @@ "qwen3-max": { "id": "qwen3-max", "name": "Qwen3-Max", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -24898,7 +29570,7 @@ "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "DeepSeek-V3.2-Exp", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -24914,7 +29586,7 @@ "qwen3-max-preview": { "id": "qwen3-max-preview", "name": "Qwen3-Max-Preview", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -24930,7 +29602,7 @@ "qwen3-coder-plus": { "id": "qwen3-coder-plus", "name": "Qwen3-Coder-Plus", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -24946,7 +29618,7 @@ "qwen3-32b": { "id": "qwen3-32b", "name": "Qwen3-32B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -24972,7 +29644,7 @@ "hf:Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "hf:Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen 3 235B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -24988,7 +29660,7 @@ "hf:Qwen/Qwen2.5-Coder-32B-Instruct": { "id": "hf:Qwen/Qwen2.5-Coder-32B-Instruct", "name": "Qwen2.5-Coder-32B-Instruct", - "family": "qwen2.5-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -25004,7 +29676,7 @@ "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "hf:Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen 3 Coder 480B", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -25020,7 +29692,7 @@ "hf:Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "hf:Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen3 235B A22B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -25067,7 +29739,7 @@ "hf:meta-llama/Llama-3.1-70B-Instruct": { "id": "hf:meta-llama/Llama-3.1-70B-Instruct", "name": "Llama-3.1-70B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -25083,7 +29755,7 @@ "hf:meta-llama/Llama-3.1-8B-Instruct": { "id": "hf:meta-llama/Llama-3.1-8B-Instruct", "name": "Llama-3.1-8B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -25099,7 +29771,7 @@ "hf:meta-llama/Llama-3.3-70B-Instruct": { "id": "hf:meta-llama/Llama-3.3-70B-Instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -25115,7 +29787,7 @@ "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct": { "id": "hf:meta-llama/Llama-4-Scout-17B-16E-Instruct", "name": "Llama-4-Scout-17B-16E-Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -25131,7 +29803,7 @@ "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { "id": "hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -25147,7 +29819,7 @@ "hf:meta-llama/Llama-3.1-405B-Instruct": { "id": "hf:meta-llama/Llama-3.1-405B-Instruct", "name": "Llama-3.1-405B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": true, "tool_call": true, @@ -25160,10 +29832,27 @@ "cost": { "input": 3, "output": 3 }, "limit": { "context": 128000, "output": 32768 } }, + "hf:moonshotai/Kimi-K2.5": { + "id": "hf:moonshotai/Kimi-K2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01", + "last_updated": "2026-01", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.55, "output": 2.19 }, + "limit": { "context": 262144, "output": 65536 } + }, "hf:moonshotai/Kimi-K2-Instruct-0905": { "id": "hf:moonshotai/Kimi-K2-Instruct-0905", "name": "Kimi K2 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -25179,7 +29868,7 @@ "hf:moonshotai/Kimi-K2-Thinking": { "id": "hf:moonshotai/Kimi-K2-Thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -25195,7 +29884,7 @@ "hf:zai-org/GLM-4.5": { "id": "hf:zai-org/GLM-4.5", "name": "GLM 4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25211,7 +29900,7 @@ "hf:zai-org/GLM-4.7": { "id": "hf:zai-org/GLM-4.7", "name": "GLM 4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25228,7 +29917,7 @@ "hf:zai-org/GLM-4.6": { "id": "hf:zai-org/GLM-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25244,7 +29933,7 @@ "hf:deepseek-ai/DeepSeek-R1": { "id": "hf:deepseek-ai/DeepSeek-R1", "name": "DeepSeek R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -25260,7 +29949,7 @@ "hf:deepseek-ai/DeepSeek-R1-0528": { "id": "hf:deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek R1 (0528)", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -25275,7 +29964,7 @@ "hf:deepseek-ai/DeepSeek-V3.1-Terminus": { "id": "hf:deepseek-ai/DeepSeek-V3.1-Terminus", "name": "DeepSeek V3.1 Terminus", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -25290,7 +29979,7 @@ "hf:deepseek-ai/DeepSeek-V3.2": { "id": "hf:deepseek-ai/DeepSeek-V3.2", "name": "DeepSeek V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -25306,7 +29995,7 @@ "hf:deepseek-ai/DeepSeek-V3": { "id": "hf:deepseek-ai/DeepSeek-V3", "name": "DeepSeek V3", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -25322,7 +30011,7 @@ "hf:deepseek-ai/DeepSeek-V3.1": { "id": "hf:deepseek-ai/DeepSeek-V3.1", "name": "DeepSeek V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -25337,7 +30026,7 @@ "hf:deepseek-ai/DeepSeek-V3-0324": { "id": "hf:deepseek-ai/DeepSeek-V3-0324", "name": "DeepSeek V3 (0324)", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -25376,7 +30065,7 @@ "moonshotai/Kimi-K2-Instruct": { "id": "moonshotai/Kimi-K2-Instruct", "name": "Kimi K2", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -25392,7 +30081,7 @@ "moonshotai/Kimi-K2-Thinking": { "id": "moonshotai/Kimi-K2-Thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -25423,6 +30112,22 @@ "cost": { "input": 0.254, "output": 1.02 }, "limit": { "context": 262144, "output": 32768 } }, + "MiniMaxAI/MiniMax-M2.1": { + "id": "MiniMaxAI/MiniMax-M2.1", + "name": "MiniMax M2.1", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-06", + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.28, "output": 1.2 }, + "limit": { "context": 196608, "output": 196608 } + }, "openai/gpt-oss-20b": { "id": "openai/gpt-oss-20b", "name": "GPT OSS 20B", @@ -25456,7 +30161,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -25472,7 +30177,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", "name": "Qwen3 Coder 480B A35B Instruct Turbo", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -25488,7 +30193,7 @@ "zai-org/GLM-4.5": { "id": "zai-org/GLM-4.5", "name": "GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -25505,7 +30210,7 @@ "zai-org/GLM-4.7": { "id": "zai-org/GLM-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25529,26 +30234,10 @@ "name": "Zhipu AI", "doc": "https://docs.z.ai/guides/overview/pricing", "models": { - "glm-4.6v-flash": { - "id": "glm-4.6v-flash", - "name": "GLM-4.6V-Flash", - "family": "glm-4.6v", - "attachment": true, - "reasoning": true, - "tool_call": true, - "temperature": true, - "knowledge": "2025-04", - "release_date": "2025-12-08", - "last_updated": "2025-12-08", - "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 128000, "output": 32768 } - }, "glm-4.6v": { "id": "glm-4.6v", "name": "GLM-4.6V", - "family": "glm-4.6v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -25564,7 +30253,7 @@ "glm-4.6": { "id": "glm-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25580,7 +30269,7 @@ "glm-4.5v": { "id": "glm-4.5v", "name": "GLM-4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -25596,7 +30285,7 @@ "glm-4.5-air": { "id": "glm-4.5-air", "name": "GLM-4.5-Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -25609,10 +30298,26 @@ "cost": { "input": 0.2, "output": 1.1, "cache_read": 0.03, "cache_write": 0 }, "limit": { "context": 131072, "output": 98304 } }, + "glm-4.7-flash": { + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "family": "glm-flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 131072 } + }, "glm-4.5": { "id": "glm-4.5", "name": "GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25628,7 +30333,7 @@ "glm-4.5-flash": { "id": "glm-4.5-flash", "name": "GLM-4.5-Flash", - "family": "glm-4.5-flash", + "family": "glm-flash", "attachment": false, "reasoning": true, "tool_call": true, @@ -25644,7 +30349,7 @@ "glm-4.7": { "id": "glm-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25686,7 +30391,7 @@ "Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -25701,7 +30406,7 @@ "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { "id": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -25716,7 +30421,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen3 235B A22B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -25731,7 +30436,7 @@ "zai-org/GLM-4.5-FP8": { "id": "zai-org/GLM-4.5-FP8", "name": "GLM 4.5 FP8", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -25746,7 +30451,7 @@ "zai-org/GLM-4.5-Air": { "id": "zai-org/GLM-4.5-Air", "name": "GLM 4.5 Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": false, "tool_call": true, @@ -25761,7 +30466,7 @@ "deepseek-ai/DeepSeek-R1-0528": { "id": "deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek R1 0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -25776,7 +30481,7 @@ "deepseek-ai/DeepSeek-V3.1": { "id": "deepseek-ai/DeepSeek-V3.1", "name": "DeepSeek V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -25791,7 +30496,7 @@ "deepseek-ai/DeepSeek-V3-0324": { "id": "deepseek-ai/DeepSeek-V3-0324", "name": "DeepSeek V3 0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -25816,7 +30521,7 @@ "moonshotai/kimi-k2-thinking": { "id": "moonshotai/kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -26180,7 +30885,7 @@ "glm-4.7": { "id": "glm-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -26197,7 +30902,7 @@ "glm-4.5-flash": { "id": "glm-4.5-flash", "name": "GLM-4.5-Flash", - "family": "glm-4.5-flash", + "family": "glm-flash", "attachment": false, "reasoning": true, "tool_call": true, @@ -26213,7 +30918,7 @@ "glm-4.5": { "id": "glm-4.5", "name": "GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -26226,10 +30931,26 @@ "cost": { "input": 0.6, "output": 2.2, "cache_read": 0.11, "cache_write": 0 }, "limit": { "context": 131072, "output": 98304 } }, + "glm-4.7-flash": { + "id": "glm-4.7-flash", + "name": "GLM-4.7-Flash", + "family": "glm-flash", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2026-01-19", + "last_updated": "2026-01-19", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 131072 } + }, "glm-4.5-air": { "id": "glm-4.5-air", "name": "GLM-4.5-Air", - "family": "glm-4.5-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -26245,7 +30966,7 @@ "glm-4.5v": { "id": "glm-4.5v", "name": "GLM-4.5V", - "family": "glm-4.5v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -26261,7 +30982,7 @@ "glm-4.6": { "id": "glm-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -26277,7 +30998,7 @@ "glm-4.6v": { "id": "glm-4.6v", "name": "GLM-4.6V", - "family": "glm-4.6v", + "family": "glm", "attachment": true, "reasoning": true, "tool_call": true, @@ -26319,7 +31040,7 @@ "google/gemma-3": { "id": "google/gemma-3", "name": "Google Gemma 3", - "family": "gemma-3", + "family": "gemma", "attachment": true, "reasoning": false, "tool_call": true, @@ -26335,7 +31056,7 @@ "osmosis/osmosis-structure-0.6b": { "id": "osmosis/osmosis-structure-0.6b", "name": "Osmosis Structure 0.6B", - "family": "osmosis-structure-0.6b", + "family": "osmosis", "attachment": false, "reasoning": false, "tool_call": true, @@ -26351,7 +31072,7 @@ "qwen/qwen3-embedding-4b": { "id": "qwen/qwen3-embedding-4b", "name": "Qwen 3 Embedding 4B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": false, @@ -26383,7 +31104,7 @@ "meta/llama-3.2-11b-vision-instruct": { "id": "meta/llama-3.2-11b-vision-instruct", "name": "Llama 3.2 11B Vision Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -26399,7 +31120,7 @@ "meta/llama-3.1-8b-instruct": { "id": "meta/llama-3.1-8b-instruct", "name": "Llama 3.1 8B Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -26415,7 +31136,7 @@ "meta/llama-3.2-3b-instruct": { "id": "meta/llama-3.2-3b-instruct", "name": "Llama 3.2 3B Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -26431,7 +31152,7 @@ "meta/llama-3.2-1b-instruct": { "id": "meta/llama-3.2-1b-instruct", "name": "Llama 3.2 1B Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -26457,7 +31178,7 @@ "xai/grok-4": { "id": "xai/grok-4", "name": "Grok 4", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -26473,7 +31194,7 @@ "xai/grok-4-fast": { "id": "xai/grok-4-fast", "name": "Grok 4 Fast", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -26552,7 +31273,7 @@ "openai/gpt-4.1-mini": { "id": "openai/gpt-4.1-mini", "name": "GPT-4.1 Mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -26568,7 +31289,7 @@ "openai/gpt-5-nano": { "id": "openai/gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -26584,7 +31305,7 @@ "openai/gpt-4.1": { "id": "openai/gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -26600,7 +31321,7 @@ "openai/o4-mini": { "id": "openai/o4-mini", "name": "o4 Mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -26616,7 +31337,7 @@ "openai/gpt-5-mini": { "id": "openai/gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -26632,7 +31353,7 @@ "openai/gpt-4o-mini": { "id": "openai/gpt-4o-mini", "name": "GPT-4o Mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -26648,7 +31369,7 @@ "openai/gpt-5": { "id": "openai/gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -26786,7 +31507,7 @@ "morph-v3-large": { "id": "morph-v3-large", "name": "Morph v3 Large", - "family": "morph-v3-large", + "family": "morph", "attachment": false, "reasoning": false, "tool_call": false, @@ -26816,7 +31537,7 @@ "morph-v3-fast": { "id": "morph-v3-fast", "name": "Morph v3 Fast", - "family": "morph-v3-fast", + "family": "morph", "attachment": false, "reasoning": false, "tool_call": false, @@ -26856,7 +31577,7 @@ "qwen/qwen3-30b-a3b-2507": { "id": "qwen/qwen3-30b-a3b-2507", "name": "Qwen3 30B A3B 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -26872,7 +31593,7 @@ "qwen/qwen3-coder-30b": { "id": "qwen/qwen3-coder-30b", "name": "Qwen3 Coder 30B", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -26895,37 +31616,36 @@ "name": "Friendli", "doc": "https://friendli.ai/docs/guides/serverless_endpoints/introduction", "models": { - "meta-llama-3.3-70b-instruct": { - "id": "meta-llama-3.3-70b-instruct", - "name": "Llama 3.3 70B Instruct", - "family": "llama-3.3", + "MiniMaxAI/MiniMax-M2.1": { + "id": "MiniMaxAI/MiniMax-M2.1", + "name": "MiniMax M2.1", "attachment": false, - "reasoning": false, + "reasoning": true, "tool_call": true, "structured_output": true, "temperature": true, - "release_date": "2024-08-01", - "last_updated": "2025-12-23", + "release_date": "2026-01-13", + "last_updated": "2026-01-29", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.6, "output": 0.6 }, - "limit": { "context": 131072, "output": 131072 } + "cost": { "input": 0.3, "output": 1.2 }, + "limit": { "context": 196608, "output": 196608 } }, - "meta-llama-3.1-8b-instruct": { - "id": "meta-llama-3.1-8b-instruct", - "name": "Llama 3.1 8B Instruct", - "family": "llama-3.1", + "LGAI-EXAONE/K-EXAONE-236B-A23B": { + "id": "LGAI-EXAONE/K-EXAONE-236B-A23B", + "name": "K EXAONE 236B A23B", + "family": "exaone", "attachment": false, - "reasoning": false, + "reasoning": true, "tool_call": true, "structured_output": true, "temperature": true, - "release_date": "2024-08-01", - "last_updated": "2025-12-23", + "release_date": "2025-12-31", + "last_updated": "2026-01-08", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.1, "output": 0.1 }, - "limit": { "context": 131072, "output": 8000 } + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 262144, "output": 262144 } }, "LGAI-EXAONE/EXAONE-4.0.1-32B": { "id": "LGAI-EXAONE/EXAONE-4.0.1-32B", @@ -26943,136 +31663,94 @@ "cost": { "input": 0.6, "output": 1 }, "limit": { "context": 131072, "output": 131072 } }, - "meta-llama/Llama-4-Maverick-17B-128E-Instruct": { - "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct", - "name": "Llama 4 Maverick 17B 128E Instruct", - "family": "llama-4", + "meta-llama/Llama-3.1-8B-Instruct": { + "id": "meta-llama/Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B Instruct", + "family": "llama", "attachment": false, - "reasoning": true, - "tool_call": false, - "structured_output": true, - "temperature": true, - "release_date": "2025-06-16", - "last_updated": "2025-12-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 131072, "output": 8000 } - }, - "meta-llama/Llama-4-Scout-17B-16E-Instruct": { - "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", - "name": "Llama 4 Scout 17B 16E Instruct", - "family": "llama-4", - "attachment": false, - "reasoning": true, - "tool_call": false, - "structured_output": true, - "temperature": true, - "release_date": "2025-06-16", - "last_updated": "2025-12-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 131072, "output": 8000 } - }, - "Qwen/Qwen3-30B-A3B": { - "id": "Qwen/Qwen3-30B-A3B", - "name": "Qwen3 30B A3B", - "family": "qwen3", - "attachment": false, - "reasoning": true, + "reasoning": false, "tool_call": true, "structured_output": true, "temperature": true, - "release_date": "2025-06-16", + "release_date": "2024-08-01", "last_updated": "2025-12-23", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, + "cost": { "input": 0.1, "output": 0.1 }, "limit": { "context": 131072, "output": 8000 } }, + "meta-llama/Llama-3.3-70B-Instruct": { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct", + "family": "llama", + "attachment": false, + "reasoning": false, + "tool_call": true, + "structured_output": true, + "temperature": true, + "release_date": "2024-08-01", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 0.6 }, + "limit": { "context": 131072, "output": 131072 } + }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, "structured_output": true, "temperature": true, "release_date": "2025-07-29", - "last_updated": "2025-12-23", + "last_updated": "2026-01-29", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, "cost": { "input": 0.2, "output": 0.8 }, - "limit": { "context": 131072, "output": 131072 } + "limit": { "context": 262144, "output": 262144 } }, - "Qwen/Qwen3-32B": { - "id": "Qwen/Qwen3-32B", - "name": "Qwen3 32B", - "family": "qwen3", + "zai-org/GLM-4.7": { + "id": "zai-org/GLM-4.7", + "name": "GLM 4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, "structured_output": true, "temperature": true, - "release_date": "2025-06-16", - "last_updated": "2025-12-23", + "release_date": "2025-12-22", + "last_updated": "2026-01-29", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "limit": { "context": 131072, "output": 8000 } - }, - "Qwen/Qwen3-235B-A22B-Thinking-2507": { - "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", - "name": "Qwen3 235B A22B Thinking 2507", - "family": "qwen3", - "attachment": false, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-29", - "last_updated": "2025-12-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 131072, "output": 131072 } - }, - "zai-org/GLM-4.6": { - "id": "zai-org/GLM-4.6", - "name": "GLM 4.6", - "family": "glm-4", - "attachment": false, - "reasoning": true, - "tool_call": true, - "structured_output": true, - "temperature": true, - "release_date": "2025-10-31", - "last_updated": "2025-12-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 131072, "output": 131072 } - }, - "deepseek-ai/DeepSeek-R1-0528": { - "id": "deepseek-ai/DeepSeek-R1-0528", - "name": "DeepSeek R1 0528", - "family": "deepseek-r1", - "attachment": false, - "reasoning": true, - "tool_call": false, - "structured_output": true, - "temperature": true, - "release_date": "2025-07-11", - "last_updated": "2025-12-23", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "limit": { "context": 163840, "output": 163840 } + "limit": { "context": 202752, "output": 202752 } } } }, "sap-ai-core": { "id": "sap-ai-core", "env": ["AICORE_SERVICE_KEY"], - "npm": "@mymediset/sap-ai-provider", + "npm": "@jerome-benoit/sap-ai-provider-v2", "name": "SAP AI Core", "doc": "https://help.sap.com/docs/sap-ai-core", "models": { + "anthropic--claude-4.5-opus": { + "id": "anthropic--claude-4.5-opus", + "name": "anthropic--claude-4.5-opus", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04-30", + "release_date": "2025-11-24", + "last_updated": "2025-11-24", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, + "limit": { "context": 200000, "output": 64000 } + }, "anthropic--claude-3.5-sonnet": { "id": "anthropic--claude-3.5-sonnet", "name": "anthropic--claude-3.5-sonnet", @@ -27135,7 +31813,7 @@ "last_updated": "2025-06-05", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.075, "input_audio": 1 }, + "cost": { "input": 0.3, "output": 2.5, "cache_read": 0.03, "input_audio": 1 }, "limit": { "context": 1048576, "output": 65536 } }, "anthropic--claude-3-haiku": { @@ -27167,13 +31845,13 @@ "last_updated": "2024-03-04", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 0.3 }, + "cost": { "input": 3, "output": 15, "cache_read": 0.3, "cache_write": 3.75 }, "limit": { "context": 200000, "output": 4096 } }, "gpt-5-nano": { "id": "gpt-5-nano", "name": "gpt-5-nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -27206,7 +31884,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "gpt-5-mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -27217,7 +31895,7 @@ "last_updated": "2025-08-07", "modalities": { "input": ["text", "image"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 0.25, "output": 2, "cache_read": 0.03 }, + "cost": { "input": 0.25, "output": 2, "cache_read": 0.025 }, "limit": { "context": 400000, "output": 128000 } }, "anthropic--claude-4.5-sonnet": { @@ -27250,7 +31928,7 @@ "last_updated": "2025-06-05", "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 1.25, "output": 10, "cache_read": 0.31 }, + "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, "limit": { "context": 1048576, "output": 65536 } }, "anthropic--claude-3-opus": { @@ -27288,7 +31966,7 @@ "gpt-5": { "id": "gpt-5", "name": "gpt-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -27652,14 +32330,15 @@ "aihubmix": { "id": "aihubmix", "env": ["AIHUBMIX_API_KEY"], - "npm": "@aihubmix/ai-sdk-provider", + "npm": "@ai-sdk/openai-compatible", + "api": "https://aihubmix.com/v1", "name": "AIHubMix", "doc": "https://docs.aihubmix.com", "models": { "gpt-4.1-nano": { "id": "gpt-4.1-nano", "name": "GPT-4.1 nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -27675,7 +32354,7 @@ "glm-4.7": { "id": "glm-4.7", "name": "GLM-4.7", - "family": "glm-4.7", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -27692,7 +32371,7 @@ "qwen3-235b-a22b-instruct-2507": { "id": "qwen3-235b-a22b-instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -27721,10 +32400,43 @@ "cost": { "input": 16.5, "output": 82.5, "cache_read": 1.5, "cache_write": 18.75 }, "limit": { "context": 200000, "output": 32000 } }, + "coding-glm-4.7": { + "id": "coding-glm-4.7", + "name": "Coding-GLM-4.7", + "family": "glm", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-22", + "last_updated": "2025-12-22", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.27, "output": 1.1, "cache_read": 0.548 }, + "limit": { "context": 204800, "output": 131072 } + }, + "coding-minimax-m2.1-free": { + "id": "coding-minimax-m2.1-free", + "name": "Coding MiniMax M2.1 Free", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_details" }, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 204800, "output": 131072 } + }, "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -27803,7 +32515,7 @@ "gpt-4.1-mini": { "id": "gpt-4.1-mini", "name": "GPT-4.1 mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -27816,6 +32528,23 @@ "cost": { "input": 0.4, "output": 1.6, "cache_read": 0.1 }, "limit": { "context": 1047576, "output": 32768 } }, + "kimi-k2.5": { + "id": "kimi-k2.5", + "name": "Kimi K2.5", + "family": "kimi", + "attachment": true, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-07", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 262144, "output": 262144 } + }, "claude-sonnet-4-5": { "id": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5", @@ -27832,9 +32561,25 @@ "cost": { "input": 3.3, "output": 16.5, "cache_read": 0.3, "cache_write": 3.75 }, "limit": { "context": 200000, "output": 64000 } }, + "deepseek-v3.2-fast": { + "id": "deepseek-v3.2-fast", + "name": "DeepSeek-V3.2-Fast", + "family": "deepseek", + "attachment": false, + "reasoning": false, + "tool_call": false, + "knowledge": "2024-07", + "release_date": "2025-12-01", + "last_updated": "2025-12-01", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 1.1, "output": 3.29 }, + "limit": { "context": 128000, "output": 128000 } + }, "coding-glm-4.7-free": { "id": "coding-glm-4.7-free", - "name": "Coding GLM-4.7 Free", + "name": "Coding GLM 4.7 Free", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -27851,7 +32596,7 @@ "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "GPT-5.1 Codex Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -27867,7 +32612,7 @@ "qwen3-235b-a22b-thinking-2507": { "id": "qwen3-235b-a22b-thinking-2507", "name": "Qwen3 235B A22B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -27883,7 +32628,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -27899,7 +32644,7 @@ "gpt-5-nano": { "id": "gpt-5-nano", "name": "GPT-5-Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -27915,7 +32660,7 @@ "gpt-5-codex": { "id": "gpt-5-codex", "name": "GPT-5-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -27931,7 +32676,7 @@ "gpt-4o": { "id": "gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -27947,7 +32692,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -27963,7 +32708,7 @@ "o4-mini": { "id": "o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": false, @@ -27979,7 +32724,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "GPT-5-Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -28008,22 +32753,6 @@ "cost": { "input": 1.25, "output": 5, "cache_read": 0.31 }, "limit": { "context": 2000000, "output": 65000 } }, - "gpt-4o-2024-11-20": { - "id": "gpt-4o-2024-11-20", - "name": "GPT-4o (2024-11-20)", - "family": "gpt-4o", - "attachment": true, - "reasoning": false, - "tool_call": true, - "temperature": true, - "knowledge": "2023-09", - "release_date": "2024-11-20", - "last_updated": "2024-11-20", - "modalities": { "input": ["text", "image"], "output": ["text"] }, - "open_weights": false, - "cost": { "input": 2.5, "output": 10, "cache_read": 1.25 }, - "limit": { "context": 128000, "output": 16384 } - }, "gpt-5.1-codex-max": { "id": "gpt-5.1-codex-max", "name": "GPT-5.1-Codex-Max", @@ -28040,26 +32769,26 @@ "cost": { "input": 1.25, "output": 10, "cache_read": 0.125 }, "limit": { "context": 400000, "output": 128000 } }, - "minimax-m2.1-free": { - "id": "minimax-m2.1-free", - "name": "MiniMax M2.1 Free", - "family": "minimax", + "qwen3-max-2026-01-23": { + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max", + "family": "qwen", "attachment": false, - "reasoning": true, + "reasoning": false, "tool_call": true, - "interleaved": { "field": "reasoning_details" }, "temperature": true, - "release_date": "2025-12-23", - "last_updated": "2025-12-23", + "knowledge": "2025-04", + "release_date": "2025-09-23", + "last_updated": "2025-09-23", "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0 }, - "limit": { "context": 204800, "output": 131072 } + "open_weights": false, + "cost": { "input": 0.34, "output": 1.37 }, + "limit": { "context": 262144, "output": 65536 } }, "qwen3-coder-480b-a35b-instruct": { "id": "qwen3-coder-480b-a35b-instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28074,7 +32803,7 @@ "deepseek-v3.2-think": { "id": "deepseek-v3.2-think", "name": "DeepSeek-V3.2-Think", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -28090,7 +32819,7 @@ "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -28122,7 +32851,7 @@ "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "DeepSeek-V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -28138,7 +32867,7 @@ "Kimi-K2-0905": { "id": "Kimi-K2-0905", "name": "Kimi K2 0905", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -28154,7 +32883,7 @@ "gpt-5-pro": { "id": "gpt-5-pro", "name": "GPT-5-Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -28170,7 +32899,7 @@ "gpt-5.2": { "id": "gpt-5.2", "name": "GPT-5.2", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -28182,6 +32911,164 @@ "open_weights": false, "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, "limit": { "context": 400000, "output": 128000 } + }, + "glm-4.6v": { + "id": "glm-4.6v", + "name": "GLM-4.6V", + "family": "glm", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-04", + "release_date": "2025-12-08", + "last_updated": "2025-12-08", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.14, "output": 0.41 }, + "limit": { "context": 128000, "output": 32768 } + } + } + }, + "gitlab": { + "id": "gitlab", + "env": ["GITLAB_TOKEN"], + "npm": "@gitlab/gitlab-ai-provider", + "name": "GitLab Duo", + "doc": "https://docs.gitlab.com/user/duo_agent_platform/", + "models": { + "duo-chat-gpt-5-1": { + "id": "duo-chat-gpt-5-1", + "name": "Agentic Chat (GPT-5.1)", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } + }, + "duo-chat-opus-4-5": { + "id": "duo-chat-opus-4-5", + "name": "Agentic Chat (Claude Opus 4.5)", + "family": "claude-opus", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-03-31", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "duo-chat-sonnet-4-5": { + "id": "duo-chat-sonnet-4-5", + "name": "Agentic Chat (Claude Sonnet 4.5)", + "family": "claude-sonnet", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-07-31", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 64000 } + }, + "duo-chat-gpt-5-mini": { + "id": "duo-chat-gpt-5-mini", + "name": "Agentic Chat (GPT-5 Mini)", + "family": "gpt-mini", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-05-30", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } + }, + "duo-chat-gpt-5-2": { + "id": "duo-chat-gpt-5-2", + "name": "Agentic Chat (GPT-5.2)", + "family": "gpt", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-23", + "last_updated": "2026-01-23", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } + }, + "duo-chat-gpt-5-2-codex": { + "id": "duo-chat-gpt-5-2-codex", + "name": "Agentic Chat (GPT-5.2 Codex)", + "family": "gpt-codex", + "attachment": true, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } + }, + "duo-chat-gpt-5-codex": { + "id": "duo-chat-gpt-5-codex", + "name": "Agentic Chat (GPT-5 Codex)", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "structured_output": true, + "temperature": false, + "knowledge": "2024-09-30", + "release_date": "2026-01-22", + "last_updated": "2026-01-22", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 400000, "input": 272000, "output": 128000 } + }, + "duo-chat-haiku-4-5": { + "id": "duo-chat-haiku-4-5", + "name": "Agentic Chat (Claude Haiku 4.5)", + "family": "claude-haiku", + "attachment": true, + "reasoning": true, + "tool_call": true, + "temperature": true, + "knowledge": "2025-02-28", + "release_date": "2026-01-08", + "last_updated": "2026-01-08", + "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, + "limit": { "context": 200000, "output": 64000 } } } }, @@ -28196,7 +33083,7 @@ "accounts/fireworks/models/deepseek-r1-0528": { "id": "accounts/fireworks/models/deepseek-r1-0528", "name": "Deepseek R1 05/28", - "family": "deepseek-r1", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -28212,7 +33099,7 @@ "accounts/fireworks/models/deepseek-v3p1": { "id": "accounts/fireworks/models/deepseek-v3p1", "name": "DeepSeek V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -28228,7 +33115,7 @@ "accounts/fireworks/models/deepseek-v3p2": { "id": "accounts/fireworks/models/deepseek-v3p2", "name": "DeepSeek V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -28278,7 +33165,7 @@ "accounts/fireworks/models/glm-4p7": { "id": "accounts/fireworks/models/glm-4p7", "name": "GLM 4.7", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -28295,7 +33182,7 @@ "accounts/fireworks/models/deepseek-v3-0324": { "id": "accounts/fireworks/models/deepseek-v3-0324", "name": "Deepseek V3 03-24", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -28311,7 +33198,7 @@ "accounts/fireworks/models/glm-4p6": { "id": "accounts/fireworks/models/glm-4p6", "name": "GLM 4.6", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -28328,7 +33215,7 @@ "accounts/fireworks/models/kimi-k2-thinking": { "id": "accounts/fireworks/models/kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -28338,13 +33225,13 @@ "last_updated": "2025-11-06", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.6, "output": 2.5 }, + "cost": { "input": 0.6, "output": 2.5, "cache_read": 0.3 }, "limit": { "context": 256000, "output": 256000 } }, "accounts/fireworks/models/kimi-k2-instruct": { "id": "accounts/fireworks/models/kimi-k2-instruct", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -28357,10 +33244,27 @@ "cost": { "input": 1, "output": 3 }, "limit": { "context": 128000, "output": 16384 } }, + "accounts/fireworks/models/kimi-k2p5": { + "id": "accounts/fireworks/models/kimi-k2p5", + "name": "Kimi K2.5", + "family": "kimi-thinking", + "attachment": false, + "reasoning": true, + "tool_call": true, + "interleaved": { "field": "reasoning_content" }, + "temperature": true, + "knowledge": "2025-01", + "release_date": "2026-01-27", + "last_updated": "2026-01-27", + "modalities": { "input": ["text", "image", "video"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.6, "output": 3, "cache_read": 0.1 }, + "limit": { "context": 256000, "output": 256000 } + }, "accounts/fireworks/models/qwen3-235b-a22b": { "id": "accounts/fireworks/models/qwen3-235b-a22b", "name": "Qwen3 235B-A22B", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -28406,7 +33310,7 @@ "accounts/fireworks/models/glm-4p5-air": { "id": "accounts/fireworks/models/glm-4p5-air", "name": "GLM 4.5 Air", - "family": "glm-4-air", + "family": "glm-air", "attachment": false, "reasoning": true, "tool_call": true, @@ -28422,7 +33326,7 @@ "accounts/fireworks/models/qwen3-coder-480b-a35b-instruct": { "id": "accounts/fireworks/models/qwen3-coder-480b-a35b-instruct", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28437,7 +33341,7 @@ "accounts/fireworks/models/glm-4p5": { "id": "accounts/fireworks/models/glm-4p5", "name": "GLM 4.5", - "family": "glm-4", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -28464,7 +33368,7 @@ "moonshotai/Kimi-K2-Instruct-0905": { "id": "moonshotai/Kimi-K2-Instruct-0905", "name": "Kimi K2 Instruct", - "family": "kimi-k2", + "family": "kimi", "attachment": false, "reasoning": false, "tool_call": true, @@ -28480,7 +33384,7 @@ "moonshotai/Kimi-K2-Thinking": { "id": "moonshotai/Kimi-K2-Thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -28528,7 +33432,7 @@ "mistralai/Devstral-Small-2505": { "id": "mistralai/Devstral-Small-2505", "name": "Devstral Small 2505", - "family": "devstral-small", + "family": "devstral", "attachment": false, "reasoning": false, "tool_call": true, @@ -28592,7 +33496,7 @@ "meta-llama/Llama-3.3-70B-Instruct": { "id": "meta-llama/Llama-3.3-70B-Instruct", "name": "Llama 3.3 70B Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -28608,7 +33512,7 @@ "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", "name": "Llama 4 Maverick 17B 128E Instruct", - "family": "llama-4-maverick", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -28624,7 +33528,7 @@ "meta-llama/Llama-3.2-90B-Vision-Instruct": { "id": "meta-llama/Llama-3.2-90B-Vision-Instruct", "name": "Llama 3.2 90B Vision Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -28640,7 +33544,7 @@ "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar": { "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", "name": "Qwen 3 Coder 480B", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28656,7 +33560,7 @@ "Qwen/Qwen2.5-VL-32B-Instruct": { "id": "Qwen/Qwen2.5-VL-32B-Instruct", "name": "Qwen 2.5 VL 32B Instruct", - "family": "qwen2.5-vl", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28672,7 +33576,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen 3 235B Thinking", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -28688,7 +33592,7 @@ "Qwen/Qwen3-Next-80B-A3B-Instruct": { "id": "Qwen/Qwen3-Next-80B-A3B-Instruct", "name": "Qwen 3 Next 80B Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28704,7 +33608,7 @@ "zai-org/GLM-4.6": { "id": "zai-org/GLM-4.6", "name": "GLM 4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": false, "tool_call": true, @@ -28720,7 +33624,7 @@ "deepseek-ai/DeepSeek-R1-0528": { "id": "deepseek-ai/DeepSeek-R1-0528", "name": "DeepSeek R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -28746,7 +33650,7 @@ "ZhipuAI/GLM-4.5": { "id": "ZhipuAI/GLM-4.5", "name": "GLM-4.5", - "family": "glm-4.5", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -28762,7 +33666,7 @@ "ZhipuAI/GLM-4.6": { "id": "ZhipuAI/GLM-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": false, "reasoning": true, "tool_call": true, @@ -28778,7 +33682,7 @@ "Qwen/Qwen3-30B-A3B-Thinking-2507": { "id": "Qwen/Qwen3-30B-A3B-Thinking-2507", "name": "Qwen3 30B A3B Thinking 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -28794,7 +33698,7 @@ "Qwen/Qwen3-235B-A22B-Instruct-2507": { "id": "Qwen/Qwen3-235B-A22B-Instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28810,7 +33714,7 @@ "Qwen/Qwen3-Coder-30B-A3B-Instruct": { "id": "Qwen/Qwen3-Coder-30B-A3B-Instruct", "name": "Qwen3 Coder 30B A3B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28826,7 +33730,7 @@ "Qwen/Qwen3-30B-A3B-Instruct-2507": { "id": "Qwen/Qwen3-30B-A3B-Instruct-2507", "name": "Qwen3 30B A3B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -28842,7 +33746,7 @@ "Qwen/Qwen3-235B-A22B-Thinking-2507": { "id": "Qwen/Qwen3-235B-A22B-Thinking-2507", "name": "Qwen3-235B-A22B-Thinking-2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -28867,7 +33771,7 @@ "gpt-3.5-turbo-1106": { "id": "gpt-3.5-turbo-1106", "name": "GPT-3.5 Turbo 1106", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -28931,7 +33835,7 @@ "gpt-5-pro": { "id": "gpt-5-pro", "name": "GPT-5 Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -28948,7 +33852,7 @@ "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "DeepSeek-V3.2", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -28958,13 +33862,13 @@ "last_updated": "2025-12-01", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.28, "output": 0.42, "cache_read": 0.028 }, + "cost": { "input": 0.58, "output": 1.68 }, "limit": { "context": 128000, "output": 128000 } }, "mai-ds-r1": { "id": "mai-ds-r1", "name": "MAI-DS-R1", - "family": "mai-ds-r1", + "family": "mai", "attachment": false, "reasoning": true, "tool_call": false, @@ -28980,7 +33884,7 @@ "gpt-5": { "id": "gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -28996,7 +33900,7 @@ "gpt-4o-mini": { "id": "gpt-4o-mini", "name": "GPT-4o mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -29012,7 +33916,7 @@ "phi-4-reasoning-plus": { "id": "phi-4-reasoning-plus", "name": "Phi-4-reasoning-plus", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": false, @@ -29028,7 +33932,7 @@ "gpt-4-turbo-vision": { "id": "gpt-4-turbo-vision", "name": "GPT-4 Turbo Vision", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -29044,7 +33948,7 @@ "phi-4-reasoning": { "id": "phi-4-reasoning", "name": "Phi-4-reasoning", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": false, @@ -29060,7 +33964,7 @@ "phi-3-medium-4k-instruct": { "id": "phi-3-medium-4k-instruct", "name": "Phi-3-medium-instruct (4k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29076,7 +33980,7 @@ "codex-mini": { "id": "codex-mini", "name": "Codex Mini", - "family": "codex", + "family": "gpt-codex-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -29092,7 +33996,7 @@ "o3": { "id": "o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -29124,7 +34028,7 @@ "gpt-3.5-turbo-instruct": { "id": "gpt-3.5-turbo-instruct", "name": "GPT-3.5 Turbo Instruct", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -29140,7 +34044,7 @@ "meta-llama-3.1-8b-instruct": { "id": "meta-llama-3.1-8b-instruct", "name": "Meta-Llama-3.1-8B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -29156,7 +34060,7 @@ "text-embedding-ada-002": { "id": "text-embedding-ada-002", "name": "text-embedding-ada-002", - "family": "text-embedding-ada", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -29185,7 +34089,7 @@ "llama-4-scout-17b-16e-instruct": { "id": "llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout 17B 16E Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -29201,7 +34105,7 @@ "o1-mini": { "id": "o1-mini", "name": "o1-mini", - "family": "o1-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -29217,7 +34121,7 @@ "gpt-5-mini": { "id": "gpt-5-mini", "name": "GPT-5 Mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -29233,7 +34137,7 @@ "phi-3.5-moe-instruct": { "id": "phi-3.5-moe-instruct", "name": "Phi-3.5-MoE-instruct", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29249,7 +34153,7 @@ "gpt-5.1-chat": { "id": "gpt-5.1-chat", "name": "GPT-5.1 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -29265,7 +34169,7 @@ "grok-3-mini": { "id": "grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": true, "tool_call": true, @@ -29281,7 +34185,7 @@ "o1": { "id": "o1", "name": "o1", - "family": "o1", + "family": "o", "attachment": false, "reasoning": true, "tool_call": true, @@ -29297,7 +34201,7 @@ "meta-llama-3-8b-instruct": { "id": "meta-llama-3-8b-instruct", "name": "Meta-Llama-3-8B-Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -29313,7 +34217,7 @@ "phi-4-multimodal": { "id": "phi-4-multimodal", "name": "Phi-4-multimodal", - "family": "phi-4", + "family": "phi", "attachment": true, "reasoning": false, "tool_call": false, @@ -29329,7 +34233,7 @@ "o4-mini": { "id": "o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -29345,7 +34249,7 @@ "gpt-4.1": { "id": "gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -29361,7 +34265,7 @@ "ministral-3b": { "id": "ministral-3b", "name": "Ministral 3B", - "family": "ministral-3b", + "family": "ministral", "attachment": false, "reasoning": false, "tool_call": true, @@ -29377,7 +34281,7 @@ "gpt-3.5-turbo-0301": { "id": "gpt-3.5-turbo-0301", "name": "GPT-3.5 Turbo 0301", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -29393,7 +34297,7 @@ "gpt-4o": { "id": "gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -29409,7 +34313,7 @@ "phi-3-mini-128k-instruct": { "id": "phi-3-mini-128k-instruct", "name": "Phi-3-mini-instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29425,7 +34329,7 @@ "llama-3.2-90b-vision-instruct": { "id": "llama-3.2-90b-vision-instruct", "name": "Llama-3.2-90B-Vision-Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -29441,7 +34345,7 @@ "gpt-5-codex": { "id": "gpt-5-codex", "name": "GPT-5-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -29457,7 +34361,7 @@ "gpt-5-nano": { "id": "gpt-5-nano", "name": "GPT-5 Nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -29473,7 +34377,7 @@ "gpt-5.1": { "id": "gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -29489,7 +34393,7 @@ "o3-mini": { "id": "o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": false, "reasoning": true, "tool_call": true, @@ -29519,7 +34423,7 @@ "kimi-k2-thinking": { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking", - "family": "kimi-k2", + "family": "kimi-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -29536,7 +34440,7 @@ "gpt-5.1-codex-mini": { "id": "gpt-5.1-codex-mini", "name": "GPT-5.1 Codex Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -29552,7 +34456,7 @@ "llama-3.3-70b-instruct": { "id": "llama-3.3-70b-instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -29568,7 +34472,7 @@ "o1-preview": { "id": "o1-preview", "name": "o1-preview", - "family": "o1-preview", + "family": "o", "attachment": false, "reasoning": true, "tool_call": true, @@ -29584,7 +34488,7 @@ "phi-3.5-mini-instruct": { "id": "phi-3.5-mini-instruct", "name": "Phi-3.5-mini-instruct", - "family": "phi-3.5", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29600,7 +34504,7 @@ "gpt-3.5-turbo-0613": { "id": "gpt-3.5-turbo-0613", "name": "GPT-3.5 Turbo 0613", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -29616,7 +34520,7 @@ "gpt-4-turbo": { "id": "gpt-4-turbo", "name": "GPT-4 Turbo", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -29632,7 +34536,7 @@ "meta-llama-3.1-70b-instruct": { "id": "meta-llama-3.1-70b-instruct", "name": "Meta-Llama-3.1-70B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -29648,7 +34552,7 @@ "phi-3-small-8k-instruct": { "id": "phi-3-small-8k-instruct", "name": "Phi-3-small-instruct (8k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29664,7 +34568,7 @@ "deepseek-v3-0324": { "id": "deepseek-v3-0324", "name": "DeepSeek-V3-0324", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": false, "tool_call": true, @@ -29680,7 +34584,7 @@ "meta-llama-3-70b-instruct": { "id": "meta-llama-3-70b-instruct", "name": "Meta-Llama-3-70B-Instruct", - "family": "llama-3", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": false, @@ -29696,7 +34600,7 @@ "text-embedding-3-large": { "id": "text-embedding-3-large", "name": "text-embedding-3-large", - "family": "text-embedding-3-large", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -29710,7 +34614,7 @@ "grok-3": { "id": "grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": false, "reasoning": false, "tool_call": true, @@ -29726,7 +34630,7 @@ "gpt-3.5-turbo-0125": { "id": "gpt-3.5-turbo-0125", "name": "GPT-3.5 Turbo 0125", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": false, @@ -29760,7 +34664,7 @@ "phi-4-mini-reasoning": { "id": "phi-4-mini-reasoning", "name": "Phi-4-mini-reasoning", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": true, "tool_call": true, @@ -29776,7 +34680,7 @@ "phi-4": { "id": "phi-4", "name": "Phi-4", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29792,7 +34696,7 @@ "deepseek-v3.1": { "id": "deepseek-v3.1", "name": "DeepSeek-V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -29808,7 +34712,7 @@ "gpt-5-chat": { "id": "gpt-5-chat", "name": "GPT-5 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": false, @@ -29824,7 +34728,7 @@ "gpt-4.1-mini": { "id": "gpt-4.1-mini", "name": "GPT-4.1 mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -29840,7 +34744,7 @@ "llama-4-maverick-17b-128e-instruct-fp8": { "id": "llama-4-maverick-17b-128e-instruct-fp8", "name": "Llama 4 Maverick 17B 128E Instruct FP8", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -29856,7 +34760,7 @@ "cohere-command-r-plus-08-2024": { "id": "cohere-command-r-plus-08-2024", "name": "Command R+", - "family": "command-r-plus", + "family": "command-r", "attachment": false, "reasoning": true, "tool_call": true, @@ -29888,7 +34792,7 @@ "phi-3-small-128k-instruct": { "id": "phi-3-small-128k-instruct", "name": "Phi-3-small-instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29914,7 +34818,7 @@ "last_updated": "2025-08-01", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, "limit": { "context": 200000, "output": 64000 }, "provider": { "npm": "@ai-sdk/anthropic" } }, @@ -29937,7 +34841,7 @@ "deepseek-v3.2-speciale": { "id": "deepseek-v3.2-speciale", "name": "DeepSeek-V3.2-Speciale", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": false, @@ -29947,7 +34851,7 @@ "last_updated": "2025-12-01", "modalities": { "input": ["text"], "output": ["text"] }, "open_weights": true, - "cost": { "input": 0.28, "output": 0.42 }, + "cost": { "input": 0.58, "output": 1.68 }, "limit": { "context": 128000, "output": 128000 } }, "claude-haiku-4-5": { @@ -29971,7 +34875,7 @@ "phi-3-mini-4k-instruct": { "id": "phi-3-mini-4k-instruct", "name": "Phi-3-mini-instruct (4k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -29987,7 +34891,7 @@ "gpt-5.1-codex": { "id": "gpt-5.1-codex", "name": "GPT-5.1 Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": false, "reasoning": true, "tool_call": true, @@ -30019,7 +34923,7 @@ "deepseek-r1": { "id": "deepseek-r1", "name": "DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": false, @@ -30035,7 +34939,7 @@ "meta-llama-3.1-405b-instruct": { "id": "meta-llama-3.1-405b-instruct", "name": "Meta-Llama-3.1-405B-Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -30048,10 +34952,26 @@ "cost": { "input": 5.33, "output": 16 }, "limit": { "context": 128000, "output": 32768 } }, + "gpt-5.2-codex": { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex", + "family": "gpt-codex", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": false, + "knowledge": "2025-08-31", + "release_date": "2026-01-14", + "last_updated": "2026-01-14", + "modalities": { "input": ["text", "image"], "output": ["text"] }, + "open_weights": false, + "cost": { "input": 1.75, "output": 14, "cache_read": 0.175 }, + "limit": { "context": 400000, "output": 128000 } + }, "gpt-4-32k": { "id": "gpt-4-32k", "name": "GPT-4 32K", - "family": "gpt-4", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -30067,7 +34987,7 @@ "phi-4-mini": { "id": "phi-4-mini", "name": "Phi-4-mini", - "family": "phi-4", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": true, @@ -30145,7 +35065,7 @@ "llama-3.2-11b-vision-instruct": { "id": "llama-3.2-11b-vision-instruct", "name": "Llama-3.2-11B-Vision-Instruct", - "family": "llama-3.2", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30161,7 +35081,7 @@ "gpt-5.2-chat": { "id": "gpt-5.2-chat", "name": "GPT-5.2 Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -30196,7 +35116,7 @@ "gpt-4": { "id": "gpt-4", "name": "GPT-4", - "family": "gpt-4", + "family": "gpt", "attachment": false, "reasoning": false, "tool_call": true, @@ -30212,7 +35132,7 @@ "phi-3-medium-128k-instruct": { "id": "phi-3-medium-128k-instruct", "name": "Phi-3-medium-instruct (128k)", - "family": "phi-3", + "family": "phi", "attachment": false, "reasoning": false, "tool_call": false, @@ -30244,7 +35164,7 @@ "deepseek-r1-0528": { "id": "deepseek-r1-0528", "name": "DeepSeek-R1-0528", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -30276,7 +35196,7 @@ "text-embedding-3-small": { "id": "text-embedding-3-small", "name": "text-embedding-3-small", - "family": "text-embedding-3-small", + "family": "text-embedding", "attachment": false, "reasoning": false, "tool_call": false, @@ -30290,7 +35210,7 @@ "gpt-4.1-nano": { "id": "gpt-4.1-nano", "name": "GPT-4.1 nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -30316,7 +35236,7 @@ "llama-3.3-8b-instruct": { "id": "llama-3.3-8b-instruct", "name": "Llama-3.3-8B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30332,7 +35252,7 @@ "llama-4-maverick-17b-128e-instruct-fp8": { "id": "llama-4-maverick-17b-128e-instruct-fp8", "name": "Llama-4-Maverick-17B-128E-Instruct-FP8", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30348,7 +35268,7 @@ "llama-3.3-70b-instruct": { "id": "llama-3.3-70b-instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30364,7 +35284,7 @@ "llama-4-scout-17b-16e-instruct-fp8": { "id": "llama-4-scout-17b-16e-instruct-fp8", "name": "Llama-4-Scout-17B-16E-Instruct-FP8", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30380,7 +35300,7 @@ "groq-llama-4-maverick-17b-128e-instruct": { "id": "groq-llama-4-maverick-17b-128e-instruct", "name": "Groq-Llama-4-Maverick-17B-128E-Instruct", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30396,7 +35316,7 @@ "cerebras-llama-4-scout-17b-16e-instruct": { "id": "cerebras-llama-4-scout-17b-16e-instruct", "name": "Cerebras-Llama-4-Scout-17B-16E-Instruct", - "family": "llama-4-scout", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30412,7 +35332,7 @@ "cerebras-llama-4-maverick-17b-128e-instruct": { "id": "cerebras-llama-4-maverick-17b-128e-instruct", "name": "Cerebras-Llama-4-Maverick-17B-128E-Instruct", - "family": "llama-4-maverick", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30438,7 +35358,7 @@ "qwen3-235b-a22b-instruct-2507": { "id": "qwen3-235b-a22b-instruct-2507", "name": "Qwen3 235B A22B Instruct 2507", - "family": "qwen3", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -30450,6 +35370,21 @@ "cost": { "input": 0.75, "output": 2.25 }, "limit": { "context": 260000, "output": 8192 } }, + "devstral-2-123b-instruct-2512": { + "id": "devstral-2-123b-instruct-2512", + "name": "Devstral 2 123B Instruct (2512)", + "family": "devstral", + "attachment": false, + "reasoning": false, + "tool_call": true, + "temperature": true, + "release_date": "2026-01-07", + "last_updated": "2026-01-07", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0.4, "output": 2 }, + "limit": { "context": 256000, "output": 8192 } + }, "pixtral-12b-2409": { "id": "pixtral-12b-2409", "name": "Pixtral 12B 2409", @@ -30468,7 +35403,7 @@ "llama-3.1-8b-instruct": { "id": "llama-3.1-8b-instruct", "name": "Llama 3.1 8B Instruct", - "family": "llama-3.1", + "family": "llama", "attachment": false, "reasoning": false, "tool_call": true, @@ -30514,7 +35449,7 @@ "qwen3-coder-30b-a3b-instruct": { "id": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -30530,7 +35465,7 @@ "llama-3.3-70b-instruct": { "id": "llama-3.3-70b-instruct", "name": "Llama-3.3-70B-Instruct", - "family": "llama-3.3", + "family": "llama", "attachment": true, "reasoning": false, "tool_call": true, @@ -30546,7 +35481,7 @@ "whisper-large-v3": { "id": "whisper-large-v3", "name": "Whisper Large v3", - "family": "whisper-large", + "family": "whisper", "attachment": false, "reasoning": false, "tool_call": false, @@ -30562,7 +35497,7 @@ "deepseek-r1-distill-llama-70b": { "id": "deepseek-r1-distill-llama-70b", "name": "DeepSeek R1 Distill Llama 70B", - "family": "deepseek-r1-distill-llama", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -30578,7 +35513,7 @@ "voxtral-small-24b-2507": { "id": "voxtral-small-24b-2507", "name": "Voxtral Small 24B 2507", - "family": "voxtral-small", + "family": "voxtral", "attachment": true, "reasoning": false, "tool_call": true, @@ -30608,7 +35543,7 @@ "bge-multilingual-gemma2": { "id": "bge-multilingual-gemma2", "name": "BGE Multilingual Gemma2", - "family": "gemma-2", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": false, @@ -30623,7 +35558,7 @@ "gemma-3-27b-it": { "id": "gemma-3-27b-it", "name": "Gemma-3-27B-IT", - "family": "gemma-3", + "family": "gemma", "attachment": true, "reasoning": true, "tool_call": true, @@ -30648,7 +35583,7 @@ "cohere.command-r-plus-v1:0": { "id": "cohere.command-r-plus-v1:0", "name": "Command R+", - "family": "command-r-plus", + "family": "command-r", "attachment": false, "reasoning": false, "tool_call": true, @@ -30712,7 +35647,7 @@ "qwen.qwen3-coder-30b-a3b-v1:0": { "id": "qwen.qwen3-coder-30b-a3b-v1:0", "name": "Qwen3 Coder 30B A3B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -30728,7 +35663,7 @@ "google.gemma-3-4b-it": { "id": "google.gemma-3-4b-it", "name": "Gemma 3 4B IT", - "family": "gemma-3", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": true, @@ -30775,7 +35710,7 @@ "qwen.qwen3-next-80b-a3b": { "id": "qwen.qwen3-next-80b-a3b", "name": "Qwen/Qwen3-Next-80B-A3B-Instruct", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -30823,7 +35758,7 @@ "qwen.qwen3-vl-235b-a22b": { "id": "qwen.qwen3-vl-235b-a22b", "name": "Qwen/Qwen3-VL-235B-A22B-Instruct", - "family": "qwen3-vl", + "family": "qwen", "attachment": true, "reasoning": false, "tool_call": true, @@ -30871,7 +35806,7 @@ "deepseek.v3-v1:0": { "id": "deepseek.v3-v1:0", "name": "DeepSeek-V3.1", - "family": "deepseek-v3", + "family": "deepseek", "attachment": false, "reasoning": true, "tool_call": true, @@ -30897,7 +35832,7 @@ "last_updated": "2025-08-01", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, "limit": { "context": 200000, "output": 64000 } }, "cohere.command-light-text-v14": { @@ -30934,7 +35869,7 @@ "google.gemma-3-27b-it": { "id": "google.gemma-3-27b-it", "name": "Google Gemma 3 27B Instruct", - "family": "gemma-3", + "family": "gemma", "attachment": true, "reasoning": false, "tool_call": true, @@ -30965,7 +35900,7 @@ "google.gemma-3-12b-it": { "id": "google.gemma-3-12b-it", "name": "Google Gemma 3 12B", - "family": "gemma-3", + "family": "gemma", "attachment": false, "reasoning": false, "tool_call": false, @@ -30981,7 +35916,7 @@ "ai21.jamba-1-5-large-v1:0": { "id": "ai21.jamba-1-5-large-v1:0", "name": "Jamba 1.5 Large", - "family": "jamba-1.5-large", + "family": "jamba", "attachment": false, "reasoning": false, "tool_call": true, @@ -31061,7 +35996,7 @@ "openai.gpt-oss-120b-1:0": { "id": "openai.gpt-oss-120b-1:0", "name": "gpt-oss-120b", - "family": "openai.gpt-oss", + "family": "gpt-oss", "attachment": false, "reasoning": false, "tool_call": true, @@ -31076,7 +36011,7 @@ "qwen.qwen3-32b-v1:0": { "id": "qwen.qwen3-32b-v1:0", "name": "Qwen3 32B (dense)", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": true, "tool_call": true, @@ -31203,7 +36138,7 @@ "deepseek.r1-v1:0": { "id": "deepseek.r1-v1:0", "name": "DeepSeek-R1", - "family": "deepseek-r1", + "family": "deepseek-thinking", "attachment": false, "reasoning": true, "tool_call": true, @@ -31307,7 +36242,7 @@ "last_updated": "2025-08-01", "modalities": { "input": ["text", "image", "pdf"], "output": ["text"] }, "open_weights": false, - "cost": { "input": 5, "output": 25, "cache_read": 1.5, "cache_write": 18.75 }, + "cost": { "input": 5, "output": 25, "cache_read": 0.5, "cache_write": 6.25 }, "limit": { "context": 200000, "output": 64000 } }, "amazon.nova-2-lite-v1:0": { @@ -31328,7 +36263,7 @@ "qwen.qwen3-coder-480b-a35b-v1:0": { "id": "qwen.qwen3-coder-480b-a35b-v1:0", "name": "Qwen3 Coder 480B A35B Instruct", - "family": "qwen3-coder", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -31360,7 +36295,7 @@ "openai.gpt-oss-safeguard-20b": { "id": "openai.gpt-oss-safeguard-20b", "name": "GPT OSS Safeguard 20B", - "family": "openai.gpt-oss-safeguard", + "family": "gpt-oss", "attachment": false, "reasoning": false, "tool_call": true, @@ -31375,7 +36310,7 @@ "openai.gpt-oss-20b-1:0": { "id": "openai.gpt-oss-20b-1:0", "name": "gpt-oss-20b", - "family": "openai.gpt-oss", + "family": "gpt-oss", "attachment": false, "reasoning": false, "tool_call": true, @@ -31438,7 +36373,7 @@ "mistral.mistral-7b-instruct-v0:2": { "id": "mistral.mistral-7b-instruct-v0:2", "name": "Mistral-7B-Instruct-v0.3", - "family": "mistral-7b", + "family": "mistral", "attachment": false, "reasoning": false, "tool_call": true, @@ -31454,7 +36389,7 @@ "mistral.mixtral-8x7b-instruct-v0:1": { "id": "mistral.mixtral-8x7b-instruct-v0:1", "name": "Mixtral-8x7B-Instruct-v0.1", - "family": "mixtral-8x7b", + "family": "mixtral", "attachment": false, "reasoning": false, "tool_call": false, @@ -31502,7 +36437,7 @@ "ai21.jamba-1-5-mini-v1:0": { "id": "ai21.jamba-1-5-mini-v1:0", "name": "Jamba 1.5 Mini", - "family": "jamba-1.5-mini", + "family": "jamba", "attachment": false, "reasoning": false, "tool_call": true, @@ -31534,7 +36469,7 @@ "amazon.titan-text-express-v1:0:8k": { "id": "amazon.titan-text-express-v1:0:8k", "name": "Titan Text G1 - Express", - "family": "titan-text-express", + "family": "titan", "attachment": false, "reasoning": false, "tool_call": true, @@ -31580,7 +36515,7 @@ "amazon.titan-text-express-v1": { "id": "amazon.titan-text-express-v1", "name": "Titan Text G1 - Express", - "family": "titan-text-express", + "family": "titan", "attachment": false, "reasoning": false, "tool_call": true, @@ -31626,7 +36561,7 @@ "openai.gpt-oss-safeguard-120b": { "id": "openai.gpt-oss-safeguard-120b", "name": "GPT OSS Safeguard 120B", - "family": "openai.gpt-oss-safeguard", + "family": "gpt-oss", "attachment": false, "reasoning": false, "tool_call": true, @@ -31641,7 +36576,7 @@ "qwen.qwen3-235b-a22b-2507-v1:0": { "id": "qwen.qwen3-235b-a22b-2507-v1:0", "name": "Qwen3 235B A22B 2507", - "family": "qwen3", + "family": "qwen", "attachment": false, "reasoning": false, "tool_call": true, @@ -31714,7 +36649,7 @@ "xai/grok-4-fast-non-reasoning": { "id": "xai/grok-4-fast-non-reasoning", "name": "Grok-4-Fast-Non-Reasoning", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -31729,7 +36664,7 @@ "xai/grok-4-fast-reasoning": { "id": "xai/grok-4-fast-reasoning", "name": "Grok 4 Fast Reasoning", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -31744,7 +36679,7 @@ "xai/grok-4.1-fast-reasoning": { "id": "xai/grok-4.1-fast-reasoning", "name": "Grok-4.1-Fast-Reasoning", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -31758,7 +36693,7 @@ "xai/grok-4": { "id": "xai/grok-4", "name": "Grok 4", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -31788,7 +36723,7 @@ "xai/grok-4.1-fast-non-reasoning": { "id": "xai/grok-4.1-fast-non-reasoning", "name": "Grok-4.1-Fast-Non-Reasoning", - "family": "grok-4", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -31802,7 +36737,7 @@ "xai/grok-3": { "id": "xai/grok-3", "name": "Grok 3", - "family": "grok-3", + "family": "grok", "attachment": true, "reasoning": false, "tool_call": true, @@ -31817,7 +36752,7 @@ "xai/grok-3-mini": { "id": "xai/grok-3-mini", "name": "Grok 3 Mini", - "family": "grok-3", + "family": "grok", "attachment": true, "reasoning": true, "tool_call": true, @@ -31902,7 +36837,7 @@ "runwayml/runway-gen-4-turbo": { "id": "runwayml/runway-gen-4-turbo", "name": "Runway-Gen-4-Turbo", - "family": "runway-gen-4-turbo", + "family": "runway", "attachment": true, "reasoning": false, "tool_call": true, @@ -31943,7 +36878,7 @@ "elevenlabs/elevenlabs-music": { "id": "elevenlabs/elevenlabs-music", "name": "ElevenLabs-Music", - "family": "elevenlabs-music", + "family": "elevenlabs", "attachment": true, "reasoning": false, "tool_call": true, @@ -31957,7 +36892,7 @@ "elevenlabs/elevenlabs-v2.5-turbo": { "id": "elevenlabs/elevenlabs-v2.5-turbo", "name": "ElevenLabs-v2.5-Turbo", - "family": "elevenlabs-v2.5-turbo", + "family": "elevenlabs", "attachment": true, "reasoning": false, "tool_call": true, @@ -32028,7 +36963,7 @@ "google/imagen-4-ultra": { "id": "google/imagen-4-ultra", "name": "Imagen-4-Ultra", - "family": "imagen-4-ultra", + "family": "imagen", "attachment": true, "reasoning": false, "tool_call": true, @@ -32101,7 +37036,7 @@ "google/imagen-3-fast": { "id": "google/imagen-3-fast", "name": "Imagen-3-Fast", - "family": "imagen-3-fast", + "family": "imagen", "attachment": true, "reasoning": false, "tool_call": true, @@ -32173,7 +37108,7 @@ "google/veo-3-fast": { "id": "google/veo-3-fast", "name": "Veo-3-Fast", - "family": "veo-3-fast", + "family": "veo", "attachment": true, "reasoning": false, "tool_call": true, @@ -32187,7 +37122,7 @@ "google/imagen-4-fast": { "id": "google/imagen-4-fast", "name": "Imagen-4-Fast", - "family": "imagen-4-fast", + "family": "imagen", "attachment": true, "reasoning": false, "tool_call": true, @@ -32229,7 +37164,7 @@ "google/nano-banana-pro": { "id": "google/nano-banana-pro", "name": "Nano-Banana-Pro", - "family": "nano-banana-pro", + "family": "nano-banana", "attachment": true, "reasoning": false, "tool_call": true, @@ -32259,7 +37194,7 @@ "google/veo-3.1-fast": { "id": "google/veo-3.1-fast", "name": "Veo-3.1-Fast", - "family": "veo-3.1-fast", + "family": "veo", "attachment": true, "reasoning": false, "tool_call": true, @@ -32273,7 +37208,7 @@ "openai/gpt-4.1-nano": { "id": "openai/gpt-4.1-nano", "name": "GPT-4.1-nano", - "family": "gpt-4.1-nano", + "family": "gpt-nano", "attachment": true, "reasoning": false, "tool_call": true, @@ -32316,7 +37251,7 @@ "openai/o1-pro": { "id": "openai/o1-pro", "name": "o1-pro", - "family": "o1-pro", + "family": "o-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -32331,7 +37266,7 @@ "openai/gpt-5.1-codex": { "id": "openai/gpt-5.1-codex", "name": "GPT-5.1-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -32346,7 +37281,7 @@ "openai/gpt-3.5-turbo-raw": { "id": "openai/gpt-3.5-turbo-raw", "name": "GPT-3.5-Turbo-Raw", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32361,7 +37296,7 @@ "openai/gpt-4-classic": { "id": "openai/gpt-4-classic", "name": "GPT-4-Classic", - "family": "gpt-4", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32376,7 +37311,7 @@ "openai/gpt-4.1-mini": { "id": "openai/gpt-4.1-mini", "name": "GPT-4.1-mini", - "family": "gpt-4.1-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -32391,7 +37326,7 @@ "openai/gpt-5-chat": { "id": "openai/gpt-5-chat", "name": "GPT-5-Chat", - "family": "gpt-5-chat", + "family": "gpt-codex", "attachment": true, "reasoning": false, "tool_call": true, @@ -32406,7 +37341,7 @@ "openai/o3-deep-research": { "id": "openai/o3-deep-research", "name": "o3-deep-research", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -32421,7 +37356,7 @@ "openai/gpt-4o-search": { "id": "openai/gpt-4o-search", "name": "GPT-4o-Search", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32449,7 +37384,7 @@ "openai/gpt-image-1-mini": { "id": "openai/gpt-image-1-mini", "name": "GPT-Image-1-Mini", - "family": "gpt-image", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32463,7 +37398,7 @@ "openai/gpt-3.5-turbo": { "id": "openai/gpt-3.5-turbo", "name": "GPT-3.5-Turbo", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32492,7 +37427,7 @@ "openai/o3-mini-high": { "id": "openai/o3-mini-high", "name": "o3-mini-high", - "family": "o3-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -32507,7 +37442,7 @@ "openai/chatgpt-4o-latest": { "id": "openai/chatgpt-4o-latest", "name": "ChatGPT-4o-Latest", - "family": "chatgpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32522,7 +37457,7 @@ "openai/gpt-4-turbo": { "id": "openai/gpt-4-turbo", "name": "GPT-4-Turbo", - "family": "gpt-4-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32537,7 +37472,7 @@ "openai/gpt-5.1-codex-mini": { "id": "openai/gpt-5.1-codex-mini", "name": "GPT-5.1-Codex-Mini", - "family": "gpt-5-codex-mini", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -32552,7 +37487,7 @@ "openai/gpt-5.1-instant": { "id": "openai/gpt-5.1-instant", "name": "GPT-5.1-Instant", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32567,7 +37502,7 @@ "openai/o3-mini": { "id": "openai/o3-mini", "name": "o3-mini", - "family": "o3-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -32582,7 +37517,7 @@ "openai/gpt-5.1": { "id": "openai/gpt-5.1", "name": "GPT-5.1", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -32597,7 +37532,7 @@ "openai/gpt-5-nano": { "id": "openai/gpt-5-nano", "name": "GPT-5-nano", - "family": "gpt-5-nano", + "family": "gpt-nano", "attachment": true, "reasoning": true, "tool_call": true, @@ -32612,7 +37547,7 @@ "openai/gpt-5-codex": { "id": "openai/gpt-5-codex", "name": "GPT-5-Codex", - "family": "gpt-5-codex", + "family": "gpt-codex", "attachment": true, "reasoning": true, "tool_call": true, @@ -32627,7 +37562,7 @@ "openai/gpt-4o": { "id": "openai/gpt-4o", "name": "GPT-4o", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32641,7 +37576,7 @@ "openai/gpt-4.1": { "id": "openai/gpt-4.1", "name": "GPT-4.1", - "family": "gpt-4.1", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32656,7 +37591,7 @@ "openai/o4-mini": { "id": "openai/o4-mini", "name": "o4-mini", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -32671,7 +37606,7 @@ "openai/o1": { "id": "openai/o1", "name": "o1", - "family": "o1", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -32686,7 +37621,7 @@ "openai/gpt-5-mini": { "id": "openai/gpt-5-mini", "name": "GPT-5-mini", - "family": "gpt-5-mini", + "family": "gpt-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -32701,7 +37636,7 @@ "openai/gpt-4o-aug": { "id": "openai/gpt-4o-aug", "name": "GPT-4o-Aug", - "family": "gpt-4o", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32716,7 +37651,7 @@ "openai/o3-pro": { "id": "openai/o3-pro", "name": "o3-pro", - "family": "o3-pro", + "family": "o-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -32731,7 +37666,7 @@ "openai/gpt-image-1": { "id": "openai/gpt-image-1", "name": "GPT-Image-1", - "family": "gpt-image", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32759,7 +37694,7 @@ "openai/gpt-3.5-turbo-instruct": { "id": "openai/gpt-3.5-turbo-instruct", "name": "GPT-3.5-Turbo-Instruct", - "family": "gpt-3.5-turbo", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32774,7 +37709,7 @@ "openai/o3": { "id": "openai/o3", "name": "o3", - "family": "o3", + "family": "o", "attachment": true, "reasoning": true, "tool_call": true, @@ -32789,7 +37724,7 @@ "openai/o4-mini-deep-research": { "id": "openai/o4-mini-deep-research", "name": "o4-mini-deep-research", - "family": "o4-mini", + "family": "o-mini", "attachment": true, "reasoning": true, "tool_call": true, @@ -32804,7 +37739,7 @@ "openai/gpt-4-classic-0314": { "id": "openai/gpt-4-classic-0314", "name": "GPT-4-Classic-0314", - "family": "gpt-4", + "family": "gpt", "attachment": true, "reasoning": false, "tool_call": true, @@ -32819,7 +37754,7 @@ "openai/gpt-4o-mini": { "id": "openai/gpt-4o-mini", "name": "GPT-4o-mini", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -32834,7 +37769,7 @@ "openai/gpt-5": { "id": "openai/gpt-5", "name": "GPT-5", - "family": "gpt-5", + "family": "gpt", "attachment": true, "reasoning": true, "tool_call": true, @@ -32849,7 +37784,7 @@ "openai/dall-e-3": { "id": "openai/dall-e-3", "name": "DALL-E-3", - "family": "dall-e-3", + "family": "dall-e", "attachment": true, "reasoning": false, "tool_call": true, @@ -32863,7 +37798,7 @@ "openai/sora-2-pro": { "id": "openai/sora-2-pro", "name": "Sora-2-Pro", - "family": "sora-2-pro", + "family": "sora", "attachment": true, "reasoning": false, "tool_call": true, @@ -32877,7 +37812,7 @@ "openai/gpt-5-pro": { "id": "openai/gpt-5-pro", "name": "GPT-5-Pro", - "family": "gpt-5-pro", + "family": "gpt-pro", "attachment": true, "reasoning": true, "tool_call": true, @@ -32906,7 +37841,7 @@ "openai/gpt-4o-mini-search": { "id": "openai/gpt-4o-mini-search", "name": "GPT-4o-mini-Search", - "family": "gpt-4o-mini", + "family": "gpt-mini", "attachment": true, "reasoning": false, "tool_call": true, @@ -32921,7 +37856,7 @@ "stabilityai/stablediffusionxl": { "id": "stabilityai/stablediffusionxl", "name": "StableDiffusionXL", - "family": "stablediffusionxl", + "family": "stable-diffusion", "attachment": true, "reasoning": false, "tool_call": true, @@ -32949,7 +37884,7 @@ "lumalabs/ray2": { "id": "lumalabs/ray2", "name": "Ray2", - "family": "ray2", + "family": "ray", "attachment": true, "reasoning": false, "tool_call": true, @@ -33289,7 +38224,7 @@ "novita/kimi-k2-thinking": { "id": "novita/kimi-k2-thinking", "name": "kimi-k2-thinking", - "family": "kimi-k2", + "family": "kimi", "attachment": true, "reasoning": true, "tool_call": true, @@ -33316,7 +38251,7 @@ "novita/glm-4.6": { "id": "novita/glm-4.6", "name": "GLM-4.6", - "family": "glm-4.6", + "family": "glm", "attachment": true, "reasoning": false, "tool_call": true, @@ -33381,6 +38316,46 @@ } } }, + "minimax-cn-coding-plan": { + "id": "minimax-cn-coding-plan", + "env": ["MINIMAX_API_KEY"], + "npm": "@ai-sdk/anthropic", + "api": "https://api.minimaxi.com/anthropic/v1", + "name": "MiniMax Coding Plan (minimaxi.com)", + "doc": "https://platform.minimaxi.com/docs/coding-plan/intro", + "models": { + "MiniMax-M2": { + "id": "MiniMax-M2", + "name": "MiniMax-M2", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-10-27", + "last_updated": "2025-10-27", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 196608, "output": 128000 } + }, + "MiniMax-M2.1": { + "id": "MiniMax-M2.1", + "name": "MiniMax-M2.1", + "family": "minimax", + "attachment": false, + "reasoning": true, + "tool_call": true, + "temperature": true, + "release_date": "2025-12-23", + "last_updated": "2025-12-23", + "modalities": { "input": ["text"], "output": ["text"] }, + "open_weights": true, + "cost": { "input": 0, "output": 0 }, + "limit": { "context": 204800, "output": 131072 } + } + } + }, "cerebras": { "id": "cerebras", "env": ["CEREBRAS_API_KEY"], @@ -33418,21 +38393,6 @@ "cost": { "input": 0.6, "output": 1.2 }, "limit": { "context": 131000, "output": 32000 } }, - "zai-glm-4.6": { - "id": "zai-glm-4.6", - "name": "Z.AI GLM-4.6", - "family": "glm-4.6", - "attachment": false, - "reasoning": false, - "tool_call": true, - "temperature": true, - "release_date": "2025-11-05", - "last_updated": "2025-11-05", - "modalities": { "input": ["text"], "output": ["text"] }, - "open_weights": true, - "cost": { "input": 0, "output": 0, "cache_read": 0, "cache_write": 0 }, - "limit": { "context": 131072, "output": 40960 } - }, "gpt-oss-120b": { "id": "gpt-oss-120b", "name": "GPT OSS 120B", diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts index afa14bc6cb..187d9a9fc8 100644 --- a/packages/opencode/test/tool/read.test.ts +++ b/packages/opencode/test/tool/read.test.ts @@ -173,7 +173,9 @@ describe("tool.read truncation", () => { test("truncates large file by bytes and sets truncated metadata", async () => { await using tmp = await tmpdir({ init: async (dir) => { - const content = await Bun.file(path.join(FIXTURES_DIR, "models-api.json")).text() + const base = await Bun.file(path.join(FIXTURES_DIR, "models-api.json")).text() + const target = 60 * 1024 + const content = base.length >= target ? base : base.repeat(Math.ceil(target / base.length)) await Bun.write(path.join(dir, "large.json"), content) }, }) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index a8c61c4daa..cb2f586775 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -2116,7 +2116,7 @@ export type Command = { description?: string agent?: string model?: string - mcp?: boolean + source?: "command" | "mcp" | "skill" template: string subtask?: boolean hints: Array @@ -4913,6 +4913,7 @@ export type AppSkillsResponses = { name: string description: string location: string + content: string }> } diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 91e7a46974..4be0a87f98 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -5723,9 +5723,12 @@ }, "location": { "type": "string" + }, + "content": { + "type": "string" } }, - "required": ["name", "description", "location"] + "required": ["name", "description", "location", "content"] } } } @@ -10770,8 +10773,9 @@ "model": { "type": "string" }, - "mcp": { - "type": "boolean" + "source": { + "type": "string", + "enum": ["command", "mcp", "skill"] }, "template": { "anyOf": [ diff --git a/packages/ui/src/components/accordion.css b/packages/ui/src/components/accordion.css index b310eeedb6..7bf287fe54 100644 --- a/packages/ui/src/components/accordion.css +++ b/packages/ui/src/components/accordion.css @@ -36,9 +36,7 @@ border-radius: var(--radius-md); overflow: clip; color: var(--text-strong); - transition-property: background-color, border-color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: background-color 0.15s ease; /* text-12-regular */ font-family: var(--font-family-sans); @@ -60,48 +58,41 @@ } } - [data-slot="accordion-arrow"] { - flex-shrink: 0; - width: 16px; - height: 16px; - display: flex; - align-items: center; - justify-content: center; - color: var(--text-weak); - } + &[data-expanded] { + [data-slot="accordion-trigger"] { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } - [data-slot="accordion-content"] { - display: grid; - grid-template-rows: 0fr; - transition-property: grid-template-rows, opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); - width: 100%; - - > * { - overflow: hidden; + [data-slot="accordion-content"] { + border: 1px solid var(--border-weak-base); + border-top: none; + border-bottom-left-radius: var(--radius-md); + border-bottom-right-radius: var(--radius-md); } } - [data-slot="accordion-content"][data-expanded] { - grid-template-rows: 1fr; - } - - [data-slot="accordion-content"][data-closed] { - grid-template-rows: 0fr; - } - - &[data-expanded] [data-slot="accordion-trigger"] { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } - - &[data-expanded] [data-slot="accordion-content"] { - border: 1px solid var(--border-weak-base); - border-top: none; - border-bottom-left-radius: var(--radius-md); - border-bottom-right-radius: var(--radius-md); - height: auto; + [data-slot="accordion-content"] { + overflow: hidden; + width: 100%; } } } + +@keyframes slideDown { + from { + height: 0; + } + to { + height: var(--kb-accordion-content-height); + } +} + +@keyframes slideUp { + from { + height: var(--kb-accordion-content-height); + } + to { + height: 0; + } +} diff --git a/packages/ui/src/components/accordion.tsx b/packages/ui/src/components/accordion.tsx index e30be95e05..535d38e3d0 100644 --- a/packages/ui/src/components/accordion.tsx +++ b/packages/ui/src/components/accordion.tsx @@ -1,7 +1,6 @@ import { Accordion as Kobalte } from "@kobalte/core/accordion" -import { Accessor, createContext, splitProps, useContext } from "solid-js" +import { splitProps } from "solid-js" import type { ComponentProps, ParentProps } from "solid-js" -import { MorphChevron } from "./morph-chevron" export interface AccordionProps extends ComponentProps {} export interface AccordionItemProps extends ComponentProps {} @@ -9,8 +8,6 @@ export interface AccordionHeaderProps extends ComponentProps {} export interface AccordionContentProps extends ComponentProps {} -const AccordionItemContext = createContext>() - function AccordionRoot(props: AccordionProps) { const [split, rest] = splitProps(props, ["class", "classList"]) return ( @@ -25,19 +22,17 @@ function AccordionRoot(props: AccordionProps) { ) } -function AccordionItem(props: AccordionItemProps & { expanded?: boolean }) { - const [split, rest] = splitProps(props, ["class", "classList", "expanded"]) +function AccordionItem(props: AccordionItemProps) { + const [split, rest] = splitProps(props, ["class", "classList"]) return ( - split.expanded ?? false}> - - + ) } @@ -89,25 +84,9 @@ function AccordionContent(props: ParentProps) { ) } -export interface AccordionArrowProps extends ComponentProps<"div"> { - expanded?: boolean -} - -function AccordionArrow(props: AccordionArrowProps = {}) { - const [local, rest] = splitProps(props, ["expanded"]) - const contextExpanded = useContext(AccordionItemContext) - const isExpanded = () => local.expanded ?? contextExpanded?.() ?? false - return ( -
- -
- ) -} - export const Accordion = Object.assign(AccordionRoot, { Item: AccordionItem, Header: AccordionHeader, Trigger: AccordionTrigger, Content: AccordionContent, - Arrow: AccordionArrow, }) diff --git a/packages/ui/src/components/button.css b/packages/ui/src/components/button.css index 02a7ade712..d9b3459230 100644 --- a/packages/ui/src/components/button.css +++ b/packages/ui/src/components/button.css @@ -8,13 +8,8 @@ text-decoration: none; user-select: none; cursor: default; - padding: 4px 8px; - white-space: nowrap; - transition-property: background-color, border-color, color, box-shadow, opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); outline: none; - line-height: 20px; + white-space: nowrap; &[data-variant="primary"] { background-color: var(--button-primary-base); @@ -99,6 +94,7 @@ &:active:not(:disabled) { background-color: var(--button-secondary-base); scale: 0.99; + transition: all 150ms ease-out; } &:disabled { border-color: var(--border-disabled); @@ -113,27 +109,34 @@ } &[data-size="small"] { - padding: 2px 8px; + height: 22px; + padding: 0 8px; &[data-icon] { - padding: 2px 12px 2px 4px; + padding: 0 12px 0 4px; } + font-size: var(--font-size-small); + line-height: var(--line-height-large); gap: 4px; /* text-12-medium */ font-family: var(--font-family-sans); - font-size: var(--font-size-base); + font-size: var(--font-size-small); font-style: normal; font-weight: var(--font-weight-medium); + line-height: var(--line-height-large); /* 166.667% */ letter-spacing: var(--letter-spacing-normal); } &[data-size="normal"] { - padding: 4px 6px; + height: 24px; + line-height: 24px; + padding: 0 6px; &[data-icon] { - padding: 4px 12px 4px 4px; + padding: 0 12px 0 4px; } + font-size: var(--font-size-small); gap: 6px; /* text-12-medium */ @@ -145,10 +148,11 @@ } &[data-size="large"] { + height: 32px; padding: 6px 12px; &[data-icon] { - padding: 6px 12px 6px 8px; + padding: 0 12px 0 8px; } gap: 4px; @@ -158,6 +162,7 @@ font-size: 14px; font-style: normal; font-weight: var(--font-weight-medium); + line-height: var(--line-height-large); /* 142.857% */ letter-spacing: var(--letter-spacing-normal); } diff --git a/packages/ui/src/components/button.tsx b/packages/ui/src/components/button.tsx index b2d2004d3c..7f974b2f76 100644 --- a/packages/ui/src/components/button.tsx +++ b/packages/ui/src/components/button.tsx @@ -4,7 +4,7 @@ import { Icon, IconProps } from "./icon" export interface ButtonProps extends ComponentProps, - Pick, "class" | "classList" | "children" | "style"> { + Pick, "class" | "classList" | "children"> { size?: "small" | "normal" | "large" variant?: "primary" | "secondary" | "ghost" icon?: IconProps["name"] diff --git a/packages/ui/src/components/card.css b/packages/ui/src/components/card.css index 809fbdacde..6dae47223d 100644 --- a/packages/ui/src/components/card.css +++ b/packages/ui/src/components/card.css @@ -4,9 +4,7 @@ flex-direction: column; background-color: var(--surface-inset-base); border: 1px solid var(--border-weaker-base); - transition-property: background-color, border-color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: background-color 0.15s ease; border-radius: var(--radius-md); padding: 6px 12px; overflow: clip; diff --git a/packages/ui/src/components/checkbox.css b/packages/ui/src/components/checkbox.css index cad0dd2dd6..b10ebbbd19 100644 --- a/packages/ui/src/components/checkbox.css +++ b/packages/ui/src/components/checkbox.css @@ -4,18 +4,6 @@ gap: 12px; cursor: default; - [data-slot="checkbox-checkbox-control"] { - transition-property: border-color, background-color, box-shadow; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); - } - - [data-slot="checkbox-checkbox-indicator"] { - transition-property: opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); - } - [data-slot="checkbox-checkbox-input"] { position: absolute; width: 1px; diff --git a/packages/ui/src/components/collapsible.css b/packages/ui/src/components/collapsible.css index cc62b2b87c..1f20cf85d9 100644 --- a/packages/ui/src/components/collapsible.css +++ b/packages/ui/src/components/collapsible.css @@ -4,9 +4,7 @@ flex-direction: column; background-color: var(--surface-inset-base); border: 1px solid var(--border-weaker-base); - transition-property: background-color, border-color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: background-color 0.15s ease; border-radius: var(--radius-md); overflow: clip; @@ -46,28 +44,16 @@ display: flex; align-items: center; justify-content: center; - color: var(--text-weak); } } [data-slot="collapsible-content"] { - display: grid; - grid-template-rows: 0fr; - transition-property: grid-template-rows, opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + overflow: hidden; + /* animation: slideUp 250ms ease-out; */ - > * { - overflow: hidden; - } - - &[data-expanded] { - grid-template-rows: 1fr; - } - - &[data-closed] { - grid-template-rows: 0fr; - } + /* &[data-expanded] { */ + /* animation: slideDown 250ms ease-out; */ + /* } */ } &[data-variant="ghost"] { @@ -97,3 +83,21 @@ } } } + +@keyframes slideDown { + from { + height: 0; + } + to { + height: var(--kb-collapsible-content-height); + } +} + +@keyframes slideUp { + from { + height: var(--kb-collapsible-content-height); + } + to { + height: 0; + } +} diff --git a/packages/ui/src/components/collapsible.tsx b/packages/ui/src/components/collapsible.tsx index 55b7b60333..903afc3085 100644 --- a/packages/ui/src/components/collapsible.tsx +++ b/packages/ui/src/components/collapsible.tsx @@ -1,8 +1,6 @@ import { Collapsible as Kobalte, CollapsibleRootProps } from "@kobalte/core/collapsible" -import { Accessor, ComponentProps, createContext, createSignal, ParentProps, splitProps, useContext } from "solid-js" -import { MorphChevron } from "./morph-chevron" - -const CollapsibleContext = createContext>() +import { ComponentProps, ParentProps, splitProps } from "solid-js" +import { Icon } from "./icon" export interface CollapsibleProps extends ParentProps { class?: string @@ -11,30 +9,17 @@ export interface CollapsibleProps extends ParentProps { } function CollapsibleRoot(props: CollapsibleProps) { - const [local, others] = splitProps(props, ["class", "classList", "variant", "open", "onOpenChange", "children"]) - const [internalOpen, setInternalOpen] = createSignal(local.open ?? false) - - const handleOpenChange = (open: boolean) => { - setInternalOpen(open) - local.onOpenChange?.(open) - } - + const [local, others] = splitProps(props, ["class", "classList", "variant"]) return ( - - - {local.children} - - + ) } @@ -47,10 +32,9 @@ function CollapsibleContent(props: ComponentProps) { } function CollapsibleArrow(props?: ComponentProps<"div">) { - const isOpen = useContext(CollapsibleContext) return (
- +
) } diff --git a/packages/ui/src/components/cycle-label.css b/packages/ui/src/components/cycle-label.css deleted file mode 100644 index e3b5256d4f..0000000000 --- a/packages/ui/src/components/cycle-label.css +++ /dev/null @@ -1,51 +0,0 @@ -.cycle-label { - --c-dur: 200ms; - --c-stag: 30ms; - --c-ease: cubic-bezier(0.25, 0, 0.5, 1); - --c-opacity-start: 0; - --c-opacity-end: 1; - --c-blur-start: 0px; - --c-blur-end: 0px; - --c-skew: 10deg; - - display: inline-flex; - position: relative; - - transform-style: preserve-3d; - perspective: 500px; - transition: width 200ms var(--c-ease); - will-change: width; - overflow: hidden; - - .cycle-char { - display: inline-block; - transform-style: preserve-3d; - min-width: 0.25em; - backface-visibility: hidden; - - transition: - transform var(--c-dur) var(--c-ease), - opacity var(--c-dur) var(--c-ease), - filter var(--c-dur) var(--c-ease); - transition-delay: calc(var(--i, 0) * var(--c-stag)); - - &.enter { - opacity: var(--c-opacity-end); - filter: blur(var(--c-blur-end)); - transform: translateY(0) rotateX(0) skewX(0); - } - - &.exit { - opacity: var(--c-opacity-start); - filter: blur(var(--c-blur-start)); - transform: translateY(50%) rotateX(90deg) skewX(var(--c-skew)); - } - - &.pre { - opacity: var(--c-opacity-start); - filter: blur(var(--c-blur-start)); - transition: none; - transform: translateY(-50%) rotateX(-90deg) skewX(calc(var(--c-skew) * -1)); - } - } -} diff --git a/packages/ui/src/components/cycle-label.tsx b/packages/ui/src/components/cycle-label.tsx deleted file mode 100644 index e34385a2c2..0000000000 --- a/packages/ui/src/components/cycle-label.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import "./cycle-label.css" -import { createEffect, createSignal, JSX, on } from "solid-js" - -export interface CycleLabelProps extends JSX.HTMLAttributes { - value: string - onValueChange?: (value: string) => void - duration?: number | ((value: string) => number) - stagger?: number - opacity?: [number, number] - blur?: [number, number] - skewX?: number - onAnimationStart?: () => void - onAnimationEnd?: () => void -} - -const segmenter = - typeof Intl !== "undefined" && Intl.Segmenter ? new Intl.Segmenter("en", { granularity: "grapheme" }) : null - -const getChars = (text: string): string[] => - segmenter ? Array.from(segmenter.segment(text), (s) => s.segment) : text.split("") - -const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) - -export function CycleLabel(props: CycleLabelProps) { - const getDuration = (text: string) => { - const d = props?.duration ?? 200 - return typeof d === "function" ? d(text) : d - } - const stagger = () => props?.stagger ?? 20 - const opacity = () => props?.opacity ?? [0, 1] - const blur = () => props?.blur ?? [0, 0] - const skewX = () => props?.skewX ?? 10 - - let containerRef: HTMLSpanElement | undefined - let isAnimating = false - const [currentText, setCurrentText] = createSignal(props.value) - - const setChars = (el: HTMLElement, text: string, state: "enter" | "exit" | "pre" = "enter") => { - el.innerHTML = "" - const chars = getChars(text) - chars.forEach((char, i) => { - const span = document.createElement("span") - span.textContent = char === " " ? "\u00A0" : char - span.className = `cycle-char ${state}` - span.style.setProperty("--i", String(i)) - el.appendChild(span) - }) - } - - const animateToText = async (newText: string) => { - if (!containerRef || isAnimating) return - if (newText === currentText()) return - - isAnimating = true - props.onAnimationStart?.() - - const dur = getDuration(newText) - const stag = stagger() - - containerRef.style.width = containerRef.offsetWidth + "px" - - const oldChars = containerRef.querySelectorAll(".cycle-char") - oldChars.forEach((c) => c.classList.replace("enter", "exit")) - - const clone = containerRef.cloneNode(false) as HTMLElement - Object.assign(clone.style, { - position: "absolute", - visibility: "hidden", - width: "auto", - transition: "none", - }) - setChars(clone, newText) - document.body.appendChild(clone) - const nextWidth = clone.offsetWidth - clone.remove() - - const exitTime = oldChars.length * stag + dur - await wait(exitTime * 0.3) - - containerRef.style.width = nextWidth + "px" - - const widthDur = 200 - await wait(widthDur * 0.3) - - setChars(containerRef, newText, "pre") - containerRef.offsetWidth - - Array.from(containerRef.children).forEach((c) => (c.className = "cycle-char enter")) - setCurrentText(newText) - props.onValueChange?.(newText) - - const enterTime = getChars(newText).length * stag + dur - await wait(enterTime) - - containerRef.style.width = "" - isAnimating = false - props.onAnimationEnd?.() - } - - createEffect( - on( - () => props.value, - (newValue) => { - if (newValue !== currentText()) { - animateToText(newValue) - } - }, - ), - ) - - const initRef = (el: HTMLSpanElement) => { - containerRef = el - setChars(el, props.value) - } - - return ( - - ) -} diff --git a/packages/ui/src/components/dialog.css b/packages/ui/src/components/dialog.css index b788945dce..2e66b644fc 100644 --- a/packages/ui/src/components/dialog.css +++ b/packages/ui/src/components/dialog.css @@ -5,16 +5,6 @@ inset: 0; z-index: 50; background-color: hsl(from var(--background-base) h s l / 0.2); - - animation: overlayHide var(--transition-duration) var(--transition-easing) forwards; - - &[data-expanded] { - animation: overlayShow var(--transition-duration) var(--transition-easing) forwards; - } - - @starting-style { - animation: none; - } } [data-component="dialog"] { @@ -35,6 +25,7 @@ flex-direction: column; align-items: center; justify-items: start; + overflow: visible; [data-slot="dialog-content"] { display: flex; @@ -44,8 +35,16 @@ width: 100%; max-height: 100%; min-height: 280px; + overflow: auto; pointer-events: auto; + /* Hide scrollbar */ + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } + /* padding: 8px; */ /* padding: 8px 8px 0 8px; */ border-radius: var(--radius-xl); @@ -53,16 +52,6 @@ background-clip: padding-box; box-shadow: var(--shadow-lg-border-base); - animation: contentHide var(--transition-duration) var(--transition-easing) forwards; - - &[data-expanded] { - animation: contentShow var(--transition-duration) var(--transition-easing) forwards; - } - - @starting-style { - animation: none; - } - [data-slot="dialog-header"] { display: flex; padding: 20px; @@ -173,7 +162,7 @@ @keyframes contentShow { from { opacity: 0; - transform: translateY(2.5%) scale(0.975); + transform: scale(0.98); } to { opacity: 1; @@ -187,6 +176,6 @@ } to { opacity: 0; - transform: translateY(-2.5%) scale(0.975); + transform: scale(0.98); } } diff --git a/packages/ui/src/components/dropdown-menu.css b/packages/ui/src/components/dropdown-menu.css index 18266ac1a1..cba041613e 100644 --- a/packages/ui/src/components/dropdown-menu.css +++ b/packages/ui/src/components/dropdown-menu.css @@ -2,29 +2,26 @@ [data-component="dropdown-menu-sub-content"] { min-width: 8rem; overflow: hidden; - border: none; border-radius: var(--radius-md); - box-shadow: var(--shadow-xs-border); + border: 1px solid color-mix(in oklch, var(--border-base) 50%, transparent); background-clip: padding-box; background-color: var(--surface-raised-stronger-non-alpha); padding: 4px; - z-index: 100; + box-shadow: var(--shadow-md); + z-index: 50; transform-origin: var(--kb-menu-content-transform-origin); - &:focus-within, - &:focus { + &:focus, + &:focus-visible { outline: none; } - animation: dropdownMenuContentHide var(--transition-duration) var(--transition-easing) forwards; - - @starting-style { - animation: none; + &[data-closed] { + animation: dropdown-menu-close 0.15s ease-out; } &[data-expanded] { - pointer-events: auto; - animation: dropdownMenuContentShow var(--transition-duration) var(--transition-easing) forwards; + animation: dropdown-menu-open 0.15s ease-out; } } @@ -41,22 +38,18 @@ padding: 4px 8px; border-radius: var(--radius-sm); cursor: default; + user-select: none; outline: none; font-family: var(--font-family-sans); - font-size: var(--font-size-base); + font-size: var(--font-size-small); font-weight: var(--font-weight-medium); line-height: var(--line-height-large); letter-spacing: var(--letter-spacing-normal); color: var(--text-strong); - transition-property: background-color, color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); - user-select: none; - - &:hover { - background-color: var(--surface-raised-base-hover); + &[data-highlighted] { + background: var(--surface-raised-base-hover); } &[data-disabled] { @@ -68,8 +61,6 @@ [data-slot="dropdown-menu-sub-trigger"] { &[data-expanded] { background: var(--surface-raised-base-hover); - outline: none; - border: none; } } @@ -111,24 +102,24 @@ } } -@keyframes dropdownMenuContentShow { +@keyframes dropdown-menu-open { from { opacity: 0; - transform: scaleY(0.95); + transform: scale(0.96); } to { opacity: 1; - transform: scaleY(1); + transform: scale(1); } } -@keyframes dropdownMenuContentHide { +@keyframes dropdown-menu-close { from { opacity: 1; - transform: scaleY(1); + transform: scale(1); } to { opacity: 0; - transform: scaleY(0.95); + transform: scale(0.96); } } diff --git a/packages/ui/src/components/hover-card.css b/packages/ui/src/components/hover-card.css index d23e43946d..02d1f10ad1 100644 --- a/packages/ui/src/components/hover-card.css +++ b/packages/ui/src/components/hover-card.css @@ -24,11 +24,11 @@ } &[data-closed] { - animation: hover-card-close var(--transition-duration) var(--transition-easing); + animation: hover-card-close 0.15s ease-out; } &[data-expanded] { - animation: hover-card-open var(--transition-duration) var(--transition-easing); + animation: hover-card-open 0.15s ease-out; } [data-slot="hover-card-body"] { diff --git a/packages/ui/src/components/icon-button.css b/packages/ui/src/components/icon-button.css index f1371bfa9a..aa550e990f 100644 --- a/packages/ui/src/components/icon-button.css +++ b/packages/ui/src/components/icon-button.css @@ -7,9 +7,6 @@ user-select: none; aspect-ratio: 1; flex-shrink: 0; - transition-property: background-color, color, opacity, box-shadow; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); &[data-variant="primary"] { background-color: var(--icon-strong-base); @@ -102,7 +99,7 @@ /* color: var(--icon-active); */ /* } */ } - &[data-selected]:not(:disabled) { + &:selected:not(:disabled) { background-color: var(--surface-raised-base-active); /* [data-slot="icon-svg"] { */ /* color: var(--icon-selected); */ diff --git a/packages/ui/src/components/icon.css b/packages/ui/src/components/icon.css index 467ff21bcc..a2ebee30bc 100644 --- a/packages/ui/src/components/icon.css +++ b/packages/ui/src/components/icon.css @@ -4,7 +4,7 @@ justify-content: center; flex-shrink: 0; /* resize: both; */ - aspect-ratio: 1 / 1; + aspect-ratio: 1/1; color: var(--icon-base); &[data-size="small"] { diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index 97488a42f0..544c6abdd2 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -80,16 +80,13 @@ const icons = { export interface IconProps extends ComponentProps<"svg"> { name: keyof typeof icons - size?: "small" | "normal" | "medium" | "large" | number + size?: "small" | "normal" | "medium" | "large" } export function Icon(props: IconProps) { const [local, others] = splitProps(props, ["name", "size", "class", "classList"]) return ( -
+
('[data-slot="list-item"][data-key]') @@ -268,7 +267,7 @@ export function List(props: ListProps & { ref?: (ref: ListRef) => void }) {searchAction()}
- +
0 || showAdd()} fallback={ @@ -340,7 +339,7 @@ export function List(props: ListProps & { ref?: (ref: ListRef) => void })
-
+
) } diff --git a/packages/ui/src/components/logo.css b/packages/ui/src/components/logo.css index 091649e8bb..a909782b77 100644 --- a/packages/ui/src/components/logo.css +++ b/packages/ui/src/components/logo.css @@ -1,4 +1,4 @@ [data-component="logo-mark"] { width: 16px; - aspect-ratio: 4 / 5; + aspect-ratio: 4/5; } diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 9c975d5490..7aad01acea 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -49,7 +49,6 @@ import { Tooltip } from "./tooltip" import { IconButton } from "./icon-button" import { createAutoScroll } from "../hooks" import { createResizeObserver } from "@solid-primitives/resize-observer" -import { MorphChevron } from "./morph-chevron" interface Diagnostic { range: { @@ -416,7 +415,7 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp toggleExpanded() }} > - +
props.expanded, - (expanded, prev) => { - if (prev === undefined) { - // Set initial state without animation - path?.setAttribute("d", expanded ? EXPANDED : COLLAPSED) - return - } - if (expanded) { - expandAnim?.beginElement() - } else { - collapseAnim?.beginElement() - } - }, - ), - ) - - return ( - - ) -} diff --git a/packages/ui/src/components/popover.css b/packages/ui/src/components/popover.css index d200fe8b24..b49542afd9 100644 --- a/packages/ui/src/components/popover.css +++ b/packages/ui/src/components/popover.css @@ -15,35 +15,16 @@ transform-origin: var(--kb-popover-content-transform-origin); - animation: popoverContentHide var(--transition-duration) var(--transition-easing) forwards; + &:focus-within { + outline: none; + } - @starting-style { - animation: none; + &[data-closed] { + animation: popover-close 0.15s ease-out; } &[data-expanded] { - pointer-events: auto; - animation: popoverContentShow var(--transition-duration) var(--transition-easing) forwards; - } - - [data-origin-top-right] { - transform-origin: top right; - } - - [data-origin-top-left] { - transform-origin: top left; - } - - [data-origin-bottom-right] { - transform-origin: bottom right; - } - - [data-origin-bottom-left] { - transform-origin: bottom left; - } - - &:focus-within { - outline: none; + animation: popover-open 0.15s ease-out; } [data-slot="popover-header"] { @@ -94,39 +75,24 @@ } } -@keyframes popoverContentShow { +@keyframes popover-open { from { opacity: 0; - transform: scaleY(0.95); + transform: scale(0.96); } to { opacity: 1; - transform: scaleY(1); + transform: scale(1); } } -@keyframes popoverContentHide { +@keyframes popover-close { from { opacity: 1; - transform: scaleY(1); + transform: scale(1); } to { opacity: 0; - transform: scaleY(0.95); - } -} - -[data-component="model-popover-content"] { - transform-origin: var(--kb-popper-content-transform-origin); - pointer-events: none; - animation: popoverContentHide var(--transition-duration) var(--transition-easing) forwards; - - @starting-style { - animation: none; - } - - &[data-expanded] { - pointer-events: auto; - animation: popoverContentShow var(--transition-duration) var(--transition-easing) forwards; + transform: scale(0.96); } } diff --git a/packages/ui/src/components/progress-circle.css b/packages/ui/src/components/progress-circle.css index d8dc4e1d05..afaf72af61 100644 --- a/packages/ui/src/components/progress-circle.css +++ b/packages/ui/src/components/progress-circle.css @@ -1,10 +1,12 @@ [data-component="progress-circle"] { - color: inherit; + transform: rotate(-90deg); [data-slot="progress-circle-background"] { - transform-origin: 50% 50%; - transform: rotate(270deg); - stroke-opacity: 0.5; + stroke: var(--border-weak-base); + } + + [data-slot="progress-circle-progress"] { + stroke: var(--border-active); transition: stroke-dashoffset 0.35s cubic-bezier(0.65, 0, 0.35, 1); } } diff --git a/packages/ui/src/components/progress-circle.tsx b/packages/ui/src/components/progress-circle.tsx index 40d1e2022f..02bd36bb71 100644 --- a/packages/ui/src/components/progress-circle.tsx +++ b/packages/ui/src/components/progress-circle.tsx @@ -1,4 +1,4 @@ -import { type ComponentProps, splitProps } from "solid-js" +import { type ComponentProps, createMemo, splitProps } from "solid-js" export interface ProgressCircleProps extends Pick, "class" | "classList"> { percentage: number @@ -9,15 +9,26 @@ export interface ProgressCircleProps extends Pick, "class" export function ProgressCircle(props: ProgressCircleProps) { const [split, rest] = splitProps(props, ["percentage", "size", "strokeWidth", "class", "classList"]) - const size = () => split.size || 18 - const r = 7 + const size = () => split.size || 16 + const strokeWidth = () => split.strokeWidth || 3 + + const viewBoxSize = 16 + const center = viewBoxSize / 2 + const radius = () => center - strokeWidth() / 2 + const circumference = createMemo(() => 2 * Math.PI * radius()) + + const offset = createMemo(() => { + const clampedPercentage = Math.max(0, Math.min(100, split.percentage || 0)) + const progress = clampedPercentage / 100 + return circumference() * (1 - progress) + }) return ( - - { - const pct = Math.min(100, Math.max(0, split.percentage)) - const angle = (pct / 100) * 2 * Math.PI - Math.PI / 2 - const x = 9 + r * Math.cos(angle) - const y = 9 + r * Math.sin(angle) - const largeArc = pct > 50 ? 1 : 0 - return `M9 2A${r} ${r} 0 ${largeArc} 1 ${x} ${y}L9 9Z` - })()} - fill="currentColor" + + ) diff --git a/packages/ui/src/components/radio-group.css b/packages/ui/src/components/radio-group.css index df51fc8e86..3d672bb300 100644 --- a/packages/ui/src/components/radio-group.css +++ b/packages/ui/src/components/radio-group.css @@ -27,9 +27,12 @@ content: ""; opacity: var(--indicator-opacity, 1); position: absolute; - transition-property: opacity, box-shadow, width, height, transform; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: + opacity 300ms ease-in-out, + box-shadow 100ms ease-in-out, + width 150ms ease, + height 150ms ease, + transform 150ms ease; } [data-slot="radio-group-item"] { @@ -43,9 +46,7 @@ content: ""; inset: 6px 0; position: absolute; - transition-property: opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: opacity 150ms ease; width: 1px; transform: translateX(-0.5px); } @@ -71,9 +72,9 @@ padding: 6px 12px; place-content: center; position: relative; + transition-duration: 150ms; transition-property: color, opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition-timing-function: ease-in-out; user-select: none; } diff --git a/packages/ui/src/components/reasoning-icon.css b/packages/ui/src/components/reasoning-icon.css deleted file mode 100644 index b03f69a931..0000000000 --- a/packages/ui/src/components/reasoning-icon.css +++ /dev/null @@ -1,8 +0,0 @@ -[data-component="reasoning-icon"] { - color: var(--icon-strong-base); - - [data-slot="reasoning-icon-percentage"] { - transition: clip-path 200ms cubic-bezier(0.25, 0, 0.5, 1); - clip-path: inset(calc(100% - var(--reasoning-icon-percentage) * 100%) 0 0 0); - } -} diff --git a/packages/ui/src/components/reasoning-icon.tsx b/packages/ui/src/components/reasoning-icon.tsx deleted file mode 100644 index 7bac49ffd2..0000000000 --- a/packages/ui/src/components/reasoning-icon.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { type ComponentProps, splitProps } from "solid-js" - -export interface ReasoningIconProps extends Pick, "class" | "classList"> { - percentage: number - size?: number - strokeWidth?: number -} - -export function ReasoningIcon(props: ReasoningIconProps) { - const [split, rest] = splitProps(props, ["percentage", "size", "strokeWidth", "class", "classList"]) - - const size = () => split.size || 16 - const strokeWidth = () => split.strokeWidth || 1.25 - - return ( - - - - - ) -} diff --git a/packages/ui/src/components/resize-handle.css b/packages/ui/src/components/resize-handle.css index 0aad9b9678..c309ff838b 100644 --- a/packages/ui/src/components/resize-handle.css +++ b/packages/ui/src/components/resize-handle.css @@ -6,9 +6,7 @@ content: ""; position: absolute; opacity: 0; - transition-property: opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: opacity 0.15s ease-in-out; } &:hover::after, diff --git a/packages/ui/src/components/scroll-fade.css b/packages/ui/src/components/scroll-fade.css deleted file mode 100644 index ede5fabec4..0000000000 --- a/packages/ui/src/components/scroll-fade.css +++ /dev/null @@ -1,82 +0,0 @@ -[data-component="scroll-fade"] { - overflow: auto; - overscroll-behavior: contain; - scrollbar-width: none; - box-sizing: border-box; - color: inherit; - font: inherit; - -ms-overflow-style: none; - - &::-webkit-scrollbar { - display: none; - } - - &[data-direction="horizontal"] { - overflow-x: auto; - overflow-y: hidden; - - /* Both fades */ - &[data-fade-start][data-fade-end] { - mask-image: linear-gradient( - to right, - transparent, - black var(--scroll-fade-start), - black calc(100% - var(--scroll-fade-end)), - transparent - ); - -webkit-mask-image: linear-gradient( - to right, - transparent, - black var(--scroll-fade-start), - black calc(100% - var(--scroll-fade-end)), - transparent - ); - } - - /* Only start fade */ - &[data-fade-start]:not([data-fade-end]) { - mask-image: linear-gradient(to right, transparent, black var(--scroll-fade-start), black 100%); - -webkit-mask-image: linear-gradient(to right, transparent, black var(--scroll-fade-start), black 100%); - } - - /* Only end fade */ - &:not([data-fade-start])[data-fade-end] { - mask-image: linear-gradient(to right, black 0%, black calc(100% - var(--scroll-fade-end)), transparent); - -webkit-mask-image: linear-gradient(to right, black 0%, black calc(100% - var(--scroll-fade-end)), transparent); - } - } - - &[data-direction="vertical"] { - overflow-y: auto; - overflow-x: hidden; - - &[data-fade-start][data-fade-end] { - mask-image: linear-gradient( - to bottom, - transparent, - black var(--scroll-fade-start), - black calc(100% - var(--scroll-fade-end)), - transparent - ); - -webkit-mask-image: linear-gradient( - to bottom, - transparent, - black var(--scroll-fade-start), - black calc(100% - var(--scroll-fade-end)), - transparent - ); - } - - /* Only start fade */ - &[data-fade-start]:not([data-fade-end]) { - mask-image: linear-gradient(to bottom, transparent, black var(--scroll-fade-start), black 100%); - -webkit-mask-image: linear-gradient(to bottom, transparent, black var(--scroll-fade-start), black 100%); - } - - /* Only end fade */ - &:not([data-fade-start])[data-fade-end] { - mask-image: linear-gradient(to bottom, black 0%, black calc(100% - var(--scroll-fade-end)), transparent); - -webkit-mask-image: linear-gradient(to bottom, black 0%, black calc(100% - var(--scroll-fade-end)), transparent); - } - } -} diff --git a/packages/ui/src/components/scroll-fade.tsx b/packages/ui/src/components/scroll-fade.tsx deleted file mode 100644 index 0effb678a5..0000000000 --- a/packages/ui/src/components/scroll-fade.tsx +++ /dev/null @@ -1,207 +0,0 @@ -import { type JSX, createEffect, createSignal, onCleanup, onMount, splitProps } from "solid-js" -import "./scroll-fade.css" - -export interface ScrollFadeProps extends JSX.HTMLAttributes { - direction?: "horizontal" | "vertical" - fadeStartSize?: number - fadeEndSize?: number - trackTransformSelector?: string - ref?: (el: HTMLDivElement) => void -} - -export function ScrollFade(props: ScrollFadeProps) { - const [local, others] = splitProps(props, [ - "children", - "direction", - "fadeStartSize", - "fadeEndSize", - "trackTransformSelector", - "class", - "style", - "ref", - ]) - - const direction = () => local.direction ?? "vertical" - const fadeStartSize = () => local.fadeStartSize ?? 20 - const fadeEndSize = () => local.fadeEndSize ?? 20 - - const getTransformOffset = (element: Element): number => { - const style = getComputedStyle(element) - const transform = style.transform - if (!transform || transform === "none") return 0 - - const match = transform.match(/matrix(?:3d)?\(([^)]+)\)/) - if (!match) return 0 - - const values = match[1].split(",").map((v) => parseFloat(v.trim())) - const isHorizontal = direction() === "horizontal" - - if (transform.startsWith("matrix3d")) { - return isHorizontal ? -(values[12] || 0) : -(values[13] || 0) - } else { - return isHorizontal ? -(values[4] || 0) : -(values[5] || 0) - } - } - - let containerRef: HTMLDivElement | undefined - - const [fadeStart, setFadeStart] = createSignal(0) - const [fadeEnd, setFadeEnd] = createSignal(0) - const [isScrollable, setIsScrollable] = createSignal(false) - - let lastScrollPos = 0 - let lastTransformPos = 0 - let lastScrollSize = 0 - let lastClientSize = 0 - - const updateFade = () => { - if (!containerRef) return - - const isHorizontal = direction() === "horizontal" - const scrollPos = isHorizontal ? containerRef.scrollLeft : containerRef.scrollTop - const scrollSize = isHorizontal ? containerRef.scrollWidth : containerRef.scrollHeight - const clientSize = isHorizontal ? containerRef.clientWidth : containerRef.clientHeight - - let transformPos = 0 - if (local.trackTransformSelector) { - const transformElement = containerRef.querySelector(local.trackTransformSelector) - if (transformElement) { - transformPos = getTransformOffset(transformElement) - } - } - - const effectiveScrollPos = Math.max(scrollPos, transformPos) - - if ( - effectiveScrollPos === lastScrollPos && - transformPos === lastTransformPos && - scrollSize === lastScrollSize && - clientSize === lastClientSize - ) { - return - } - - lastScrollPos = effectiveScrollPos - lastTransformPos = transformPos - lastScrollSize = scrollSize - lastClientSize = clientSize - - const maxScroll = scrollSize - clientSize - const canScroll = maxScroll > 1 - - setIsScrollable(canScroll) - - if (!canScroll) { - setFadeStart(0) - setFadeEnd(0) - return - } - - const progress = maxScroll > 0 ? effectiveScrollPos / maxScroll : 0 - - const startProgress = Math.min(progress / 0.1, 1) - setFadeStart(startProgress * fadeStartSize()) - - const endProgress = progress > 0.9 ? (1 - progress) / 0.1 : 1 - setFadeEnd(Math.max(0, endProgress) * fadeEndSize()) - } - - onMount(() => { - if (!containerRef) return - - updateFade() - - let rafId: number | undefined - let isPolling = false - let pollTimeout: ReturnType | undefined - - const startPolling = () => { - if (isPolling) return - isPolling = true - - const pollScroll = () => { - updateFade() - rafId = requestAnimationFrame(pollScroll) - } - rafId = requestAnimationFrame(pollScroll) - } - - const stopPolling = () => { - if (!isPolling) return - isPolling = false - if (rafId !== undefined) { - cancelAnimationFrame(rafId) - rafId = undefined - } - } - - const schedulePollingStop = () => { - if (pollTimeout !== undefined) clearTimeout(pollTimeout) - pollTimeout = setTimeout(stopPolling, 1000) - } - - const onActivity = () => { - updateFade() - if (local.trackTransformSelector) { - startPolling() - schedulePollingStop() - } - } - - containerRef.addEventListener("scroll", onActivity, { passive: true }) - - const resizeObserver = new ResizeObserver(() => { - lastScrollSize = 0 - lastClientSize = 0 - onActivity() - }) - resizeObserver.observe(containerRef) - - const mutationObserver = new MutationObserver(() => { - lastScrollSize = 0 - lastClientSize = 0 - requestAnimationFrame(onActivity) - }) - mutationObserver.observe(containerRef, { - childList: true, - subtree: true, - characterData: true, - }) - - onCleanup(() => { - containerRef?.removeEventListener("scroll", onActivity) - resizeObserver.disconnect() - mutationObserver.disconnect() - stopPolling() - if (pollTimeout !== undefined) clearTimeout(pollTimeout) - }) - }) - - createEffect(() => { - local.children - requestAnimationFrame(updateFade) - }) - - return ( -
{ - containerRef = el - local.ref?.(el) - }} - data-component="scroll-fade" - data-direction={direction()} - data-scrollable={isScrollable() || undefined} - data-fade-start={fadeStart() > 0 || undefined} - data-fade-end={fadeEnd() > 0 || undefined} - class={local.class} - style={{ - ...(typeof local.style === "object" ? local.style : {}), - "--scroll-fade-start": `${fadeStart()}px`, - "--scroll-fade-end": `${fadeEnd()}px`, - }} - {...others} - > - {local.children} -
- ) -} diff --git a/packages/ui/src/components/scroll-reveal.tsx b/packages/ui/src/components/scroll-reveal.tsx deleted file mode 100644 index 6e5072dc81..0000000000 --- a/packages/ui/src/components/scroll-reveal.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { type JSX, onCleanup, splitProps } from "solid-js" -import { ScrollFade, type ScrollFadeProps } from "./scroll-fade" - -const SCROLL_SPEED = 60 -const PAUSE_DURATION = 800 - -type ScrollAnimationState = { - rafId: number | null - startTime: number - running: boolean -} - -const startScrollAnimation = (containerEl: HTMLElement): ScrollAnimationState | null => { - containerEl.offsetHeight - - const extraWidth = containerEl.scrollWidth - containerEl.clientWidth - - if (extraWidth <= 0) { - return null - } - - const scrollDuration = (extraWidth / SCROLL_SPEED) * 1000 - const totalDuration = PAUSE_DURATION + scrollDuration + PAUSE_DURATION + scrollDuration + PAUSE_DURATION - - const state: ScrollAnimationState = { - rafId: null, - startTime: performance.now(), - running: true, - } - - const animate = (currentTime: number) => { - if (!state.running) return - - const elapsed = currentTime - state.startTime - const progress = (elapsed % totalDuration) / totalDuration - - const pausePercent = PAUSE_DURATION / totalDuration - const scrollPercent = scrollDuration / totalDuration - - const pauseEnd1 = pausePercent - const scrollEnd1 = pauseEnd1 + scrollPercent - const pauseEnd2 = scrollEnd1 + pausePercent - const scrollEnd2 = pauseEnd2 + scrollPercent - - let scrollPos = 0 - - if (progress < pauseEnd1) { - scrollPos = 0 - } else if (progress < scrollEnd1) { - const scrollProgress = (progress - pauseEnd1) / scrollPercent - scrollPos = scrollProgress * extraWidth - } else if (progress < pauseEnd2) { - scrollPos = extraWidth - } else if (progress < scrollEnd2) { - const scrollProgress = (progress - pauseEnd2) / scrollPercent - scrollPos = extraWidth * (1 - scrollProgress) - } else { - scrollPos = 0 - } - - containerEl.scrollLeft = scrollPos - state.rafId = requestAnimationFrame(animate) - } - - state.rafId = requestAnimationFrame(animate) - return state -} - -const stopScrollAnimation = (state: ScrollAnimationState | null, containerEl?: HTMLElement) => { - if (state) { - state.running = false - if (state.rafId !== null) { - cancelAnimationFrame(state.rafId) - } - } - if (containerEl) { - containerEl.scrollLeft = 0 - } -} - -export interface ScrollRevealProps extends Omit { - hoverDelay?: number -} - -export function ScrollReveal(props: ScrollRevealProps) { - const [local, others] = splitProps(props, ["children", "hoverDelay", "ref"]) - - const hoverDelay = () => local.hoverDelay ?? 300 - - let containerRef: HTMLDivElement | undefined - let hoverTimeout: ReturnType | undefined - let scrollAnimationState: ScrollAnimationState | null = null - - const handleMouseEnter: JSX.EventHandler = () => { - hoverTimeout = setTimeout(() => { - if (!containerRef) return - - containerRef.offsetHeight - - const isScrollable = containerRef.scrollWidth > containerRef.clientWidth + 1 - - if (isScrollable) { - stopScrollAnimation(scrollAnimationState, containerRef) - scrollAnimationState = startScrollAnimation(containerRef) - } - }, hoverDelay()) - } - - const handleMouseLeave: JSX.EventHandler = () => { - if (hoverTimeout) { - clearTimeout(hoverTimeout) - hoverTimeout = undefined - } - stopScrollAnimation(scrollAnimationState, containerRef) - scrollAnimationState = null - } - - onCleanup(() => { - if (hoverTimeout) { - clearTimeout(hoverTimeout) - } - stopScrollAnimation(scrollAnimationState, containerRef) - }) - - return ( - { - containerRef = el - local.ref?.(el) - }} - fadeStartSize={8} - fadeEndSize={8} - direction="horizontal" - onMouseEnter={handleMouseEnter} - onMouseLeave={handleMouseLeave} - {...others} - > - {local.children} - - ) -} diff --git a/packages/ui/src/components/select.css b/packages/ui/src/components/select.css index 5c79698835..25dd2eb40b 100644 --- a/packages/ui/src/components/select.css +++ b/packages/ui/src/components/select.css @@ -1,13 +1,7 @@ [data-component="select"] { [data-slot="select-select-trigger"] { - display: flex; - padding: 4px 8px !important; - align-items: center; - justify-content: space-between; + padding: 0 4px 0 8px; box-shadow: none; - transition-property: background-color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); [data-slot="select-select-trigger-value"] { overflow: hidden; @@ -21,10 +15,10 @@ align-items: center; justify-content: center; flex-shrink: 0; - color: var(--icon-base); + color: var(--text-weak); + transition: transform 0.1s ease-in-out; } - &:hover, &[data-expanded] { &[data-variant="secondary"] { background-color: var(--button-secondary-hover); @@ -36,42 +30,78 @@ background-color: var(--icon-strong-active); } } - &:not([data-expanded]):focus, + &:not([data-expanded]):focus-visible { &[data-variant="secondary"] { background-color: var(--button-secondary-base); } &[data-variant="ghost"] { - background-color: transparent; + background-color: var(--surface-raised-base-hover); } &[data-variant="primary"] { background-color: var(--icon-strong-base); } } } + + &[data-trigger-style="settings"] { + [data-slot="select-select-trigger"] { + padding: 6px 6px 6px 12px; + box-shadow: none; + border-radius: 6px; + min-width: 160px; + height: 32px; + justify-content: flex-end; + gap: 12px; + background-color: transparent; + + [data-slot="select-select-trigger-value"] { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: var(--font-size-base); + font-weight: var(--font-weight-regular); + } + [data-slot="select-select-trigger-icon"] { + width: 16px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: var(--text-weak); + background-color: var(--surface-raised-base); + border-radius: 4px; + transition: transform 0.1s ease-in-out; + } + + &[data-slot="select-select-trigger"]:hover:not(:disabled), + &[data-slot="select-select-trigger"][data-expanded], + &[data-slot="select-select-trigger"][data-expanded]:hover:not(:disabled) { + background-color: var(--input-base); + box-shadow: var(--shadow-xs-border-base); + } + + &:not([data-expanded]):focus { + background-color: transparent; + box-shadow: none; + } + } + } } [data-component="select-content"] { - min-width: 8rem; + min-width: 104px; max-width: 23rem; overflow: hidden; border-radius: var(--radius-md); background-color: var(--surface-raised-stronger-non-alpha); padding: 4px; box-shadow: var(--shadow-xs-border); - z-index: 50; - transform-origin: var(--kb-popper-content-transform-origin); - pointer-events: none; - - animation: selectContentHide var(--transition-duration) var(--transition-easing) forwards; - - @starting-style { - animation: none; - } + z-index: 60; &[data-expanded] { - pointer-events: auto; - animation: selectContentShow var(--transition-duration) var(--transition-easing) forwards; + animation: select-open 0.15s ease-out; } [data-slot="select-select-content-list"] { @@ -81,38 +111,43 @@ overflow-x: hidden; display: flex; flex-direction: column; + &:focus { outline: none; } + > *:not([role="presentation"]) + *:not([role="presentation"]) { margin-top: 2px; } } + [data-slot="select-select-item"] { position: relative; display: flex; align-items: center; - padding: 4px 8px; + padding: 2px 8px; gap: 12px; - border-radius: var(--radius-sm); + border-radius: 4px; + cursor: default; /* text-12-medium */ font-family: var(--font-family-sans); - font-size: var(--font-size-base); + font-size: var(--font-size-small); font-style: normal; font-weight: var(--font-weight-medium); line-height: var(--line-height-large); /* 166.667% */ letter-spacing: var(--letter-spacing-normal); + color: var(--text-strong); - transition-property: background-color, color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: + background-color 0.2s ease-in-out, + color 0.2s ease-in-out; outline: none; user-select: none; - &:hover { - background-color: var(--surface-raised-base-hover); + &[data-highlighted] { + background: var(--surface-raised-base-hover); } &[data-disabled] { background-color: var(--surface-raised-base); @@ -125,11 +160,6 @@ margin-left: auto; width: 16px; height: 16px; - color: var(--icon-strong-base); - - svg { - color: var(--icon-strong-base); - } } &:focus { outline: none; @@ -140,24 +170,33 @@ } } -@keyframes selectContentShow { - from { - opacity: 0; - transform: scaleY(0.95); +[data-component="select-content"][data-trigger-style="settings"] { + min-width: 160px; + border-radius: 8px; + padding: 0; + + [data-slot="select-select-content-list"] { + padding: 4px; } - to { - opacity: 1; - transform: scaleY(1); + + [data-slot="select-select-item"] { + /* text-14-regular */ + font-family: var(--font-family-sans); + font-size: var(--font-size-base); + font-style: normal; + font-weight: var(--font-weight-regular); + line-height: var(--line-height-large); + letter-spacing: var(--letter-spacing-normal); } } -@keyframes selectContentHide { +@keyframes select-open { from { - opacity: 1; - transform: scaleY(1); + opacity: 0; + transform: scale(0.95); } to { - opacity: 0; - transform: scaleY(0.95); + opacity: 1; + transform: scale(1); } } diff --git a/packages/ui/src/components/select.tsx b/packages/ui/src/components/select.tsx index fef00500a7..0386c329ec 100644 --- a/packages/ui/src/components/select.tsx +++ b/packages/ui/src/components/select.tsx @@ -1,10 +1,8 @@ import { Select as Kobalte } from "@kobalte/core/select" -import { createMemo, createSignal, onCleanup, splitProps, type ComponentProps, type JSX } from "solid-js" +import { createMemo, onCleanup, splitProps, type ComponentProps, type JSX } from "solid-js" import { pipe, groupBy, entries, map } from "remeda" -import { Show } from "solid-js" import { Button, ButtonProps } from "./button" import { Icon } from "./icon" -import { MorphChevron } from "./morph-chevron" export type SelectProps = Omit>, "value" | "onSelect" | "children"> & { placeholder?: string @@ -40,8 +38,6 @@ export function Select(props: SelectProps & Omit) "triggerVariant", ]) - const [isOpen, setIsOpen] = createSignal(false) - const state = { key: undefined as string | undefined, cleanup: undefined as (() => void) | void, @@ -89,7 +85,7 @@ export function Select(props: SelectProps & Omit) data-component="select" data-trigger-style={local.triggerVariant} placement={local.triggerVariant === "settings" ? "bottom-end" : "bottom-start"} - gutter={8} + gutter={4} value={local.current} options={grouped()} optionValue={(x) => (local.value ? local.value(x) : (x as string))} @@ -119,7 +115,7 @@ export function Select(props: SelectProps & Omit) : (itemProps.item.rawValue as string)} - + )} @@ -128,7 +124,6 @@ export function Select(props: SelectProps & Omit) stop() }} onOpenChange={(open) => { - setIsOpen(open) local.onOpenChange?.(open) if (!open) stop() }} @@ -154,12 +149,7 @@ export function Select(props: SelectProps & Omit) }} - - - - - - + diff --git a/packages/ui/src/components/session-review.css b/packages/ui/src/components/session-review.css index 4fc88b1994..20d2fef152 100644 --- a/packages/ui/src/components/session-review.css +++ b/packages/ui/src/components/session-review.css @@ -63,8 +63,12 @@ [data-slot="accordion-item"] { [data-slot="accordion-content"] { - /* Use grid-template-rows for smooth height transition */ - display: grid; + display: none; + } + &[data-expanded] { + [data-slot="accordion-content"] { + display: block; + } } } @@ -126,9 +130,7 @@ cursor: pointer; border-radius: 4px; opacity: 0; - transition-property: opacity, background-color, color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: opacity 0.15s ease; &:hover { color: var(--text-strong); diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx index b5a359707c..84ec934e24 100644 --- a/packages/ui/src/components/session-review.tsx +++ b/packages/ui/src/components/session-review.tsx @@ -290,8 +290,8 @@ export const SessionReview = (props: SessionReviewProps) => {
{i18n.t("ui.sessionReview.title")}
- - options={["unified", "split"]} + style} label={(style) => @@ -501,7 +501,6 @@ export const SessionReview = (props: SessionReviewProps) => { value={diff.file} id={diffId(diff.file)} data-file={diff.file} - expanded={open().includes(diff.file)} data-slot="session-review-accordion-item" data-selected={props.focusedFile === diff.file ? "" : undefined} > diff --git a/packages/ui/src/components/session-turn.css b/packages/ui/src/components/session-turn.css index 088b377cb7..d1ade879e2 100644 --- a/packages/ui/src/components/session-turn.css +++ b/packages/ui/src/components/session-turn.css @@ -102,11 +102,10 @@ [data-component="user-message"] [data-slot="user-message-text"] { max-height: var(--user-message-collapsed-height, 64px); - transition: max-height 200ms cubic-bezier(0.25, 0, 0.5, 1); } [data-component="user-message"][data-expanded="true"] [data-slot="user-message-text"] { - max-height: 2000px; + max-height: none; } [data-component="user-message"][data-can-expand="true"] [data-slot="user-message-text"] { @@ -152,6 +151,17 @@ background: transparent; cursor: pointer; color: var(--text-weak); + + [data-slot="icon-svg"] { + transition: transform 0.15s ease; + } + } + + [data-component="user-message"][data-expanded="true"] + [data-slot="user-message-text"] + [data-slot="user-message-expand"] + [data-slot="icon-svg"] { + transform: rotate(180deg); } [data-component="user-message"] [data-slot="user-message-text"] [data-slot="user-message-expand"]:hover { @@ -457,7 +467,6 @@ gap: 16px; align-items: center; justify-content: flex-end; - color: var(--icon-base); } [data-slot="session-turn-accordion-content"] { diff --git a/packages/ui/src/components/switch.css b/packages/ui/src/components/switch.css index 9ea722760a..89e8447322 100644 --- a/packages/ui/src/components/switch.css +++ b/packages/ui/src/components/switch.css @@ -26,9 +26,9 @@ border-radius: 3px; border: 1px solid var(--border-weak-base); background: var(--surface-base); - transition-property: background-color, border-color, box-shadow; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: + background-color 150ms, + border-color 150ms; } [data-slot="switch-thumb"] { @@ -47,9 +47,9 @@ 0 1px 3px 0 rgba(19, 16, 16, 0.08); transform: translateX(-1px); - transition-property: transform, background-color, border-color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); + transition: + transform 150ms, + background-color 150ms; } [data-slot="switch-label"] { diff --git a/packages/ui/src/components/tabs.css b/packages/ui/src/components/tabs.css index dab07dab91..56c3e083f5 100644 --- a/packages/ui/src/components/tabs.css +++ b/packages/ui/src/components/tabs.css @@ -58,9 +58,6 @@ border-bottom: 1px solid var(--border-weak-base); border-right: 1px solid var(--border-weak-base); background-color: var(--background-base); - transition-property: background-color, border-color, color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); [data-slot="tabs-trigger"] { display: flex; diff --git a/packages/ui/src/components/tag.css b/packages/ui/src/components/tag.css index 5ffd2b9115..0e8b7b9f10 100644 --- a/packages/ui/src/components/tag.css +++ b/packages/ui/src/components/tag.css @@ -8,9 +8,6 @@ border: 0.5px solid var(--border-weak-base); background: var(--surface-raised-base); color: var(--text-base); - transition-property: background-color, border-color, color; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); &[data-size="normal"] { height: 18px; diff --git a/packages/ui/src/context/dialog.tsx b/packages/ui/src/context/dialog.tsx index 4132125122..afba5f648c 100644 --- a/packages/ui/src/context/dialog.tsx +++ b/packages/ui/src/context/dialog.tsx @@ -28,7 +28,6 @@ const Context = createContext>() function init() { const [active, setActive] = createSignal() - const [renders, setRenders] = createSignal>({}) const timer = { current: undefined as ReturnType | undefined } const lock = { value: false } @@ -119,32 +118,12 @@ function init() { setActive({ id, node, dispose, owner, onClose, setClosing }) } - const render = (element: JSX.Element, id: string, owner: Owner) => { - setRenders((renders) => ({ ...renders, [id]: element })) - show( - () => element, - owner, - () => { - setRenders((renders) => { - const { [id]: _, ...rest } = renders - return rest - }) - }, - ) - } - - const isActive = (id: string) => { - return renders()[id] !== undefined - } - return { get active() { return active() }, - isActive, close, show, - render, } } @@ -173,17 +152,10 @@ export function useDialog() { get active() { return ctx.active }, - isActive(id: string) { - return ctx.isActive(id) - }, show(element: DialogElement, onClose?: () => void) { const base = ctx.active?.owner ?? owner ctx.show(element, base, onClose) }, - render(element: JSX.Element, id: string) { - const base = ctx.active?.owner ?? owner - ctx.render(element, id, base) - }, close() { ctx.close() }, diff --git a/packages/ui/src/styles/index.css b/packages/ui/src/styles/index.css index 7c8548734d..3ed0310ef2 100644 --- a/packages/ui/src/styles/index.css +++ b/packages/ui/src/styles/index.css @@ -33,10 +33,8 @@ @import "../components/markdown.css" layer(components); @import "../components/message-part.css" layer(components); @import "../components/message-nav.css" layer(components); -@import "../components/morph-chevron.css" layer(components); @import "../components/popover.css" layer(components); @import "../components/progress-circle.css" layer(components); -@import "../components/reasoning-icon.css" layer(components); @import "../components/radio-group.css" layer(components); @import "../components/resize-handle.css" layer(components); @import "../components/select.css" layer(components); diff --git a/packages/ui/src/styles/utilities.css b/packages/ui/src/styles/utilities.css index 82a913c883..8c954f1fe4 100644 --- a/packages/ui/src/styles/utilities.css +++ b/packages/ui/src/styles/utilities.css @@ -1,17 +1,6 @@ :root { interpolate-size: allow-keywords; - /* Transition tokens */ - --transition-duration: 200ms; - --transition-easing: cubic-bezier(0.25, 0, 0.5, 1); - --transition-fast: 150ms; - --transition-slow: 300ms; - - /* Allow height transitions from 0 to auto */ - @supports (interpolate-size: allow-keywords) { - interpolate-size: allow-keywords; - } - [data-popper-positioner] { pointer-events: none; } @@ -140,34 +129,3 @@ line-height: var(--line-height-x-large); /* 120% */ letter-spacing: var(--letter-spacing-tightest); } - -/* Transition utility classes */ -.transition-colors { - transition-property: background-color, border-color, color, fill, stroke; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); -} - -.transition-opacity { - transition-property: opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); -} - -.transition-transform { - transition-property: transform; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); -} - -.transition-shadow { - transition-property: box-shadow; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); -} - -.transition-interactive { - transition-property: background-color, border-color, color, box-shadow, opacity; - transition-duration: var(--transition-duration); - transition-timing-function: var(--transition-easing); -} diff --git a/turbo.json b/turbo.json index 5de1b8d751..f06ddb0e8b 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,7 @@ { "$schema": "https://turborepo.com/schema.json", + "globalEnv": ["CI", "OPENCODE_DISABLE_SHARE"], + "globalPassThroughEnv": ["CI", "OPENCODE_DISABLE_SHARE"], "tasks": { "typecheck": {}, "build": {