diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d1c9be97..22818844 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -24,6 +24,7 @@ ModelInfo 的模型数据全部在 `data/models/*.json`,一个模型一个文 ```bash pnpm install node scripts/validate-data.mjs data/models/.json + node scripts/check-official.mjs data/models/.json pnpm check && pnpm build ``` 5. 提交 PR 并按模板填写来源与检查项。CI 会运行完整校验与构建,合并到 `main` 后自动部署。 @@ -56,6 +57,7 @@ All model data lives in `data/models/*.json`, one file per model. Issues and pul ```bash pnpm install node scripts/validate-data.mjs data/models/.json + node scripts/check-official.mjs data/models/.json pnpm check && pnpm build ``` 5. Open the PR and fill in sources and the checklist. CI runs full validation and a build; merges to `main` deploy automatically. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d2a2c3c..3c6290af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,8 @@ jobs: - run: pnpm install --frozen-lockfile - name: 数据校验 / Validate data run: node scripts/validate-data.mjs + - name: 官方来源与范围 / Official sources + run: node scripts/check-official.mjs - run: pnpm check - run: pnpm test - run: pnpm build diff --git a/data/models/chat-latest.json b/data/models/chat-latest.json index 8572170f..1b401b26 100644 --- a/data/models/chat-latest.json +++ b/data/models/chat-latest.json @@ -53,7 +53,7 @@ "knowledge_cutoff": "2025-08-31", "description": "Points to the latest Instant model currently used in ChatGPT.", "docs": "https://developers.openai.com/api/docs/models/chat-latest", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -65,7 +65,7 @@ { "title": "chat-latest Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/chat-latest", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/chatgpt-4o-latest.json b/data/models/chatgpt-4o-latest.json index 578f932f..fad1b96c 100644 --- a/data/models/chatgpt-4o-latest.json +++ b/data/models/chatgpt-4o-latest.json @@ -50,7 +50,7 @@ "knowledge_cutoff": "2023-10-01", "description": "GPT-4o model used in ChatGPT", "docs": "https://developers.openai.com/api/docs/models/chatgpt-4o-latest", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -62,7 +62,7 @@ { "title": "ChatGPT-4o Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/chatgpt-4o-latest", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/devstral-small-2505.json b/data/models/devstral-small-2505.json index 38fe25b0..fc6a2298 100644 --- a/data/models/devstral-small-2505.json +++ b/data/models/devstral-small-2505.json @@ -34,7 +34,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0.1, + "output": 0.3, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "structured_output", @@ -46,7 +53,7 @@ "knowledge_cutoff": null, "description": "A 24B text model, open source model that excels at using tools to explore codebases, editing multiple files and power software engineering agents.", "docs": "https://docs.mistral.ai/models/devstral-small-1-0-25-05", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -58,7 +65,7 @@ { "title": "Devstral Small 1.0 | Mistral Docs", "url": "https://docs.mistral.ai/models/devstral-small-1-0-25-05", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -99,6 +106,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Devstral Small 1.0 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/devstral-small-1-0-25-05.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/devstral-small-2507.json b/data/models/devstral-small-2507.json index f17742da..4247fccb 100644 --- a/data/models/devstral-small-2507.json +++ b/data/models/devstral-small-2507.json @@ -51,16 +51,21 @@ "status": "retired", "release_date": "2025-07-10", "knowledge_cutoff": null, - "description": null, + "description": "An update to our open source model that excels at using tools to explore codebases, editing multiple files and power software engineering agents.", "docs": "https://docs.mistral.ai/models/devstral-small-1-1-25-07", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], + "translations": { + "zh": { + "description": "开源模型的更新版本,擅长用工具探索代码库、编辑多个文件,并支撑软件工程智能体。" + } + }, "sources": [ { "title": "Devstral Small 1.1 | Mistral Docs", "url": "https://docs.mistral.ai/models/devstral-small-1-1-25-07", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -106,6 +111,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Devstral Small 1.1 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/devstral-small-1-1-25-07.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/fugu-ultra.json b/data/models/fugu-ultra.json new file mode 100644 index 00000000..8411e10b --- /dev/null +++ b/data/models/fugu-ultra.json @@ -0,0 +1,95 @@ +{ + "id": "fugu-ultra", + "object": "model", + "created": null, + "owned_by": "sakana", + "name": "Fugu Ultra", + "api": { + "types": [ + "chat", + "responses", + "messages" + ], + "sdk": [ + "openai" + ] + }, + "limits": { + "context": 1000000, + "input": null, + "output": null + }, + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "reasoning": { + "supported": true, + "efforts": [ + "high", + "xhigh" + ] + }, + "pricing": null, + "features": [ + "tools", + "structured_output", + "streaming" + ], + "info": { + "status": "active", + "release_date": null, + "knowledge_cutoff": "2026-08-28", + "description": "Fugu Ultra coordinates a deeper pool of expert agents to maximize answer quality on hard, high-stakes problems. v2.0 accepts reasoning efforts high and xhigh; max is accepted as an alias of xhigh. The Responses API defaults to xhigh for fugu-ultra.", + "docs": "https://console.sakana.ai/models", + "verified_at": "2026-10-13" + }, + "aliases": [ + "fugu-ultra-v2.0" + ], + "translations": { + "zh": { + "description": "Fugu Ultra 协调更深的专家模型池,在高风险难题上尽量提高回答质量。v2.0 的思考档位是 high 与 xhigh;max 作为 xhigh 的别名被接受。Responses API 对 fugu-ultra 的默认档位是 xhigh。" + } + }, + "sources": [ + { + "title": "Models | Sakana AI Console(fugu-ultra 默认 v2.0;Responses 默认 effort 为 xhigh,max 与 xhigh 同义)", + "url": "https://console.sakana.ai/models", + "retrieved_at": "2026-10-13" + }, + { + "title": "Get started | Sakana AI Console", + "url": "https://console.sakana.ai/get-started", + "retrieved_at": "2026-10-13" + }, + { + "title": "SDK support — openai (api.sdk only)", + "url": "https://github.com/openai/openai-node", + "retrieved_at": "2026-10-13" + } + ], + "providers": [ + { + "id": "sakana", + "model": "fugu-ultra", + "base_url": "https://api.sakana.ai", + "endpoints": { + "chat": "POST /v1/chat/completions", + "responses": "POST /v1/responses", + "messages": "POST /v1/messages" + }, + "reasoning_param": "reasoning_effort", + "reasoning_params": { + "chat": "reasoning_effort", + "responses": "reasoning.effort", + "messages": null + } + } + ] +} diff --git a/data/models/gemini-3.1-flash-image-preview.json b/data/models/gemini-3.1-flash-image-preview.json index d8b15ee4..da5cb682 100644 --- a/data/models/gemini-3.1-flash-image-preview.json +++ b/data/models/gemini-3.1-flash-image-preview.json @@ -6,7 +6,8 @@ "name": "Gemini 3.1 Flash Image Preview", "api": { "types": [ - "generate" + "generate", + "batch" ], "sdk": [ "@ai-sdk/google", @@ -15,13 +16,14 @@ }, "limits": { "context": null, - "input": null, - "output": null + "input": 131072, + "output": 32768 }, "modalities": { "input": [ "text", - "image" + "image", + "document" ], "output": [ "text", @@ -29,25 +31,27 @@ ] }, "reasoning": { - "supported": null, + "supported": true, "efforts": [] }, "pricing": { "currency": "USD", "unit": "1M_tokens", - "input": 0.25, + "input": 0.5, "output": 60, "cache_read": null, "cache_write": null }, - "features": [], + "features": [ + "batch" + ], "info": { "status": "retired", "release_date": "2026-02-26", - "knowledge_cutoff": null, + "knowledge_cutoff": "2025-01", "description": null, "docs": "https://ai.google.dev/gemini-api/docs/deprecations", - "verified_at": "2026-10-11" + "verified_at": "2026-10-13" }, "aliases": [], "sources": [ @@ -71,6 +75,16 @@ "url": "https://web.archive.org/web/20260301172429/https://ai.google.dev/gemini-api/docs/pricing", "retrieved_at": "2026-10-11" }, + { + "title": "Gemini 3.1 Flash Image Preview model card — archived May 21, 2026(知识截止 2025-01,输入含 PDF)", + "url": "https://web.archive.org/web/20260521181054/https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-image-preview", + "retrieved_at": "2026-10-13" + }, + { + "title": "Gemini API pricing — archived May 21, 2026 (standard vs batch)", + "url": "https://web.archive.org/web/20260521030432/https://ai.google.dev/gemini-api/docs/pricing", + "retrieved_at": "2026-10-13" + }, { "title": "models.dev — SDK npm mapping (api.sdk only)", "url": "https://models.dev/api.json", diff --git a/data/models/gemini-4-argon.json b/data/models/gemini-4-argon.json new file mode 100644 index 00000000..ae3c56ee --- /dev/null +++ b/data/models/gemini-4-argon.json @@ -0,0 +1,118 @@ +{ + "id": "gemini-4-argon", + "object": "model", + "created": 1791849600, + "owned_by": "google", + "name": "Gemini 4 Argon", + "api": { + "types": [ + "generate", + "batch", + "interactions" + ], + "sdk": [ + "@google/genai" + ] + }, + "limits": { + "context": 1048576, + "input": null, + "output": 65536 + }, + "modalities": { + "input": [ + "text", + "image", + "video", + "audio", + "document" + ], + "output": [ + "text" + ] + }, + "reasoning": { + "supported": true, + "efforts": [ + "low", + "medium", + "high" + ] + }, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 4, + "output": 20, + "cache_read": 0.2, + "cache_write": null + }, + "features": [ + "tools", + "structured_output", + "caching", + "batch" + ], + "info": { + "status": "active", + "release_date": "2026-10-13", + "knowledge_cutoff": null, + "description": "Flagship reasoning model for complex software engineering, deep mathematical and scientific problem solving, and autonomous multi-step agents. The default synchronous max output is 65,536 tokens; long decode can continue up to 1,048,576 tokens minus the input. Standard price is $4 input, $20 output, and $0.20 implicit cache read per 1M tokens. Also supports code execution, computer use (preview), search grounding, URL context, and file search.", + "docs": "https://ai.google.dev/gemini-api/docs/models/gemini-4-argon", + "verified_at": "2026-10-15" + }, + "aliases": [], + "translations": { + "zh": { + "description": "旗舰推理模型,面向复杂软件工程、深度数学与科学问题求解,以及自主多步智能体。同步默认最大输出为 65,536 token;开启 long decode 后,输出可延续到 1,048,576 减去输入。标准价为每百万 token 输入 4 美元、输出 20 美元、隐式缓存读取 0.20 美元。另支持代码执行、Computer use(预览)、搜索接地、URL context 和 File search。" + } + }, + "sources": [ + { + "title": "Gemini 4 Argon | Gemini API", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-4-argon", + "retrieved_at": "2026-10-14" + }, + { + "title": "What's new in Gemini 4 Argon | Gemini API", + "url": "https://ai.google.dev/gemini-api/docs/latest-model", + "retrieved_at": "2026-10-14" + }, + { + "title": "Pricing | Gemini API", + "url": "https://ai.google.dev/gemini-api/docs/pricing", + "retrieved_at": "2026-10-14" + }, + { + "title": "Gemini 4 Argon is now available for developers | Google Blog", + "url": "https://blog.google/innovation-and-ai/technology/developers-tools/build-with-gemini-4-argon/", + "retrieved_at": "2026-10-14" + }, + { + "title": "SDK support — @google/genai (api.sdk only)", + "url": "https://github.com/googleapis/js-genai", + "retrieved_at": "2026-10-13" + }, + { + "title": "Long decode with the GenerateContent API | Gemini API", + "url": "https://ai.google.dev/gemini-api/docs/generate-content/long-decode", + "retrieved_at": "2026-10-15" + } + ], + "providers": [ + { + "id": "google", + "model": "gemini-4-argon", + "base_url": "https://generativelanguage.googleapis.com", + "endpoints": { + "interactions": "POST /v1beta/interactions", + "generate": "POST /v1beta/models/gemini-4-argon:generateContent" + }, + "reasoning_param": "generation_config.thinking_level", + "reasoning_params": { + "interactions": "generation_config.thinking_level", + "generate": "generationConfig.thinkingConfig.thinkingLevel" + } + } + ] +} diff --git a/data/models/gemini-omni-flash-preview.json b/data/models/gemini-omni-flash-preview.json index a5991423..49b723b9 100644 --- a/data/models/gemini-omni-flash-preview.json +++ b/data/models/gemini-omni-flash-preview.json @@ -14,7 +14,7 @@ ] }, "limits": { - "context": null, + "context": 1048576, "input": null, "output": null }, @@ -25,31 +25,52 @@ "video" ], "output": [ - "video", - "audio" + "video" ] }, "reasoning": { "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 1.5, + "output": 17.5, + "cache_read": null, + "cache_write": null + }, "features": [], "info": { "status": "deprecated", "release_date": "2026-06-30", "knowledge_cutoff": null, - "description": null, - "docs": "https://ai.google.dev/gemini-api/docs/deprecations", - "verified_at": "2026-10-11" + "description": "High-performance model for fast, conversational video generation and editing. Output is video. Standard price is $1.50 per 1M input tokens; text output is $9 per 1M tokens, and video output is $17.50 per 1M tokens.", + "docs": "https://ai.google.dev/gemini-api/docs/models/gemini-omni-flash", + "verified_at": "2026-10-14" }, "aliases": [], + "translations": { + "zh": { + "description": "面向快速对话式视频生成与编辑的高性能模型。输出为视频。标准价为每百万 token 输入 1.50 美元;文本输出为 9 美元,视频输出为 17.50 美元。" + } + }, "sources": [ { "title": "deprecations | Gemini API", "url": "https://ai.google.dev/gemini-api/docs/deprecations", "retrieved_at": "2026-10-11" }, + { + "title": "Gemini Omni Flash(含预览版 gemini-omni-flash-preview,输出 Video,上下文 1048576)| Gemini API", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-omni-flash", + "retrieved_at": "2026-10-14" + }, + { + "title": "Pricing(Gemini Omni Flash Preview:输入 1.50,文本输出 9,视频输出 17.50)| Gemini API", + "url": "https://ai.google.dev/gemini-api/docs/pricing", + "retrieved_at": "2026-10-14" + }, { "title": "changelog | Gemini API", "url": "https://ai.google.dev/gemini-api/docs/changelog", diff --git a/data/models/glm-4-flash-250414.json b/data/models/glm-4-flash-250414.json index 5381db85..ac38d940 100644 --- a/data/models/glm-4-flash-250414.json +++ b/data/models/glm-4-flash-250414.json @@ -18,7 +18,7 @@ "limits": { "context": 131072, "input": null, - "output": null + "output": 16384 }, "modalities": { "input": [ @@ -51,7 +51,7 @@ "knowledge_cutoff": null, "description": "Free GLM-4 series text model.", "docs": "https://docs.bigmodel.cn/cn/guide/models/text/glm-4", - "verified_at": "2026-10-11" + "verified_at": "2026-10-14" }, "aliases": [], "translations": { @@ -63,7 +63,7 @@ { "title": "GLM-4 | 智谱 AI 开放文档", "url": "https://docs.bigmodel.cn/cn/guide/models/text/glm-4", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "API 定价 | 智谱 AI 开放文档", diff --git a/data/models/gpt-3.5-turbo-16k-0613.json b/data/models/gpt-3.5-turbo-16k-0613.json index 5a800e1f..ee96c8e7 100644 --- a/data/models/gpt-3.5-turbo-16k-0613.json +++ b/data/models/gpt-3.5-turbo-16k-0613.json @@ -44,11 +44,16 @@ "status": "retired", "release_date": "2023-06-13", "knowledge_cutoff": "2021-09-01", - "description": null, + "description": "Legacy GPT model for cheaper chat and non-chat tasks", "docs": "https://developers.openai.com/api/docs/models/gpt-3.5-turbo-16k-0613", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], + "translations": { + "zh": { + "description": "用于更低成本对话与非对话任务的旧版 GPT 模型。" + } + }, "sources": [ { "title": "Deprecations | OpenAI API", @@ -58,7 +63,7 @@ { "title": "gpt-3.5-turbo-16k-0613 Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-3.5-turbo-16k-0613.md", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Official model release / pricing documentation", diff --git a/data/models/gpt-3.5-turbo-instruct.json b/data/models/gpt-3.5-turbo-instruct.json index 6fdf8280..46fb5751 100644 --- a/data/models/gpt-3.5-turbo-instruct.json +++ b/data/models/gpt-3.5-turbo-instruct.json @@ -46,7 +46,7 @@ "knowledge_cutoff": "2021-09-01", "description": "An older model only compatible with the legacy Completions endpoint", "docs": "https://developers.openai.com/api/docs/models/gpt-3.5-turbo-instruct", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -58,7 +58,7 @@ { "title": "gpt-3.5-turbo-instruct Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-3.5-turbo-instruct", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-3.5-turbo.json b/data/models/gpt-3.5-turbo.json index c0fa8ad6..9a89511f 100644 --- a/data/models/gpt-3.5-turbo.json +++ b/data/models/gpt-3.5-turbo.json @@ -50,7 +50,7 @@ "knowledge_cutoff": "2021-09-01", "description": "Legacy GPT model for cheaper chat and non-chat tasks.", "docs": "https://developers.openai.com/api/docs/models/gpt-3.5-turbo", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-3.5-turbo-0125" @@ -64,7 +64,7 @@ { "title": "GPT-3.5 Turbo Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-3.5-turbo", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4-turbo-preview.json b/data/models/gpt-4-turbo-preview.json index 1bfa8af4..069f57f6 100644 --- a/data/models/gpt-4-turbo-preview.json +++ b/data/models/gpt-4-turbo-preview.json @@ -47,7 +47,7 @@ "knowledge_cutoff": "2023-12-01", "description": "An older fast GPT model", "docs": "https://developers.openai.com/api/docs/models/gpt-4-turbo-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4-0125-preview", @@ -62,7 +62,7 @@ { "title": "GPT-4 Turbo Preview Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4-turbo-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4-turbo.json b/data/models/gpt-4-turbo.json index b3485474..b9136288 100644 --- a/data/models/gpt-4-turbo.json +++ b/data/models/gpt-4-turbo.json @@ -53,7 +53,7 @@ "knowledge_cutoff": "2023-12-01", "description": "An older high-intelligence GPT model.", "docs": "https://developers.openai.com/api/docs/models/gpt-4-turbo", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4-turbo-2024-04-09" @@ -67,7 +67,7 @@ { "title": "GPT-4 Turbo Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4-turbo", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4.5-preview.json b/data/models/gpt-4.5-preview.json index 504b03b6..b49bee15 100644 --- a/data/models/gpt-4.5-preview.json +++ b/data/models/gpt-4.5-preview.json @@ -55,7 +55,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Deprecated large model.", "docs": "https://developers.openai.com/api/docs/models/gpt-4.5-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4.5-preview-2025-02-27" @@ -69,7 +69,7 @@ { "title": "GPT-4.5 Preview Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4.5-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4.json b/data/models/gpt-4.json index effb7d17..a2644ce7 100644 --- a/data/models/gpt-4.json +++ b/data/models/gpt-4.json @@ -51,7 +51,7 @@ "knowledge_cutoff": "2023-12-01", "description": "An older high-intelligence GPT model.", "docs": "https://developers.openai.com/api/docs/models/gpt-4", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4-0613", @@ -66,7 +66,7 @@ { "title": "GPT-4 Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4o-audio-preview.json b/data/models/gpt-4o-audio-preview.json index ade409e8..0352c3b8 100644 --- a/data/models/gpt-4o-audio-preview.json +++ b/data/models/gpt-4o-audio-preview.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2023-10-01", "description": "GPT-4o models capable of audio inputs and outputs", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-audio-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-audio-preview-2025-06-03", @@ -60,7 +60,7 @@ { "title": "GPT-4o Audio Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-audio-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4o-mini-audio-preview.json b/data/models/gpt-4o-mini-audio-preview.json index 017491e9..4a8a1760 100644 --- a/data/models/gpt-4o-mini-audio-preview.json +++ b/data/models/gpt-4o-mini-audio-preview.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Smaller model capable of audio inputs and outputs", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-mini-audio-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-mini-audio-preview-2024-12-17" @@ -58,7 +58,7 @@ { "title": "GPT-4o Mini Audio Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-mini-audio-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4o-mini-realtime-preview.json b/data/models/gpt-4o-mini-realtime-preview.json index 9d1d0707..267a1b4f 100644 --- a/data/models/gpt-4o-mini-realtime-preview.json +++ b/data/models/gpt-4o-mini-realtime-preview.json @@ -43,7 +43,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Smaller realtime model for text and audio inputs and outputs", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-mini-realtime-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-mini-realtime-preview-2024-12-17" @@ -57,7 +57,7 @@ { "title": "GPT-4o Mini Realtime Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-mini-realtime-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4o-mini-search-preview.json b/data/models/gpt-4o-mini-search-preview.json index a78b38d1..83b0e996 100644 --- a/data/models/gpt-4o-mini-search-preview.json +++ b/data/models/gpt-4o-mini-search-preview.json @@ -49,7 +49,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Fast, affordable small model for web search", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-mini-search-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-mini-search-preview-2025-03-11" @@ -63,7 +63,7 @@ { "title": "GPT-4o Mini Search Preview Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-mini-search-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4o-mini-transcribe.json b/data/models/gpt-4o-mini-transcribe.json index c921cbc4..27da074e 100644 --- a/data/models/gpt-4o-mini-transcribe.json +++ b/data/models/gpt-4o-mini-transcribe.json @@ -47,7 +47,7 @@ "knowledge_cutoff": "2024-06-01", "description": "Speech-to-text model powered by GPT-4o Mini.", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-mini-transcribe", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-mini-transcribe-2025-03-20", @@ -62,7 +62,7 @@ { "title": "GPT-4o Mini Transcribe Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-mini-transcribe", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4o-mini.json b/data/models/gpt-4o-mini.json index 022b6940..1af7312e 100644 --- a/data/models/gpt-4o-mini.json +++ b/data/models/gpt-4o-mini.json @@ -55,7 +55,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Fast, affordable small model for focused tasks.", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-mini", - "verified_at": "2026-10-10" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-mini-2024-07-18" @@ -69,7 +69,7 @@ { "title": "GPT-4o Mini Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-mini", - "retrieved_at": "2026-10-10" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4o-realtime-preview.json b/data/models/gpt-4o-realtime-preview.json index fe936080..e2d71003 100644 --- a/data/models/gpt-4o-realtime-preview.json +++ b/data/models/gpt-4o-realtime-preview.json @@ -43,7 +43,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Model capable of realtime text and audio inputs and outputs", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-realtime-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-realtime-preview-2025-06-03", @@ -59,7 +59,7 @@ { "title": "GPT-4o Realtime Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-realtime-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4o-search-preview.json b/data/models/gpt-4o-search-preview.json index 678fcea1..9cf7adf1 100644 --- a/data/models/gpt-4o-search-preview.json +++ b/data/models/gpt-4o-search-preview.json @@ -49,7 +49,7 @@ "knowledge_cutoff": "2023-10-01", "description": "GPT model for web search in Chat Completions", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-search-preview", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-search-preview-2025-03-11" @@ -63,7 +63,7 @@ { "title": "GPT-4o Search Preview Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-search-preview", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-4o-transcribe-diarize.json b/data/models/gpt-4o-transcribe-diarize.json index f44d5e1c..6227c733 100644 --- a/data/models/gpt-4o-transcribe-diarize.json +++ b/data/models/gpt-4o-transcribe-diarize.json @@ -46,7 +46,7 @@ "knowledge_cutoff": "2024-06-01", "description": "Transcription model that identifies who is speaking when.", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-transcribe-diarize", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -58,7 +58,7 @@ { "title": "GPT-4o Transcribe Diarize Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-transcribe-diarize", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4o-transcribe.json b/data/models/gpt-4o-transcribe.json index 68359739..76c298a5 100644 --- a/data/models/gpt-4o-transcribe.json +++ b/data/models/gpt-4o-transcribe.json @@ -47,7 +47,7 @@ "knowledge_cutoff": "2024-06-01", "description": "Speech-to-text model powered by GPT-4o.", "docs": "https://developers.openai.com/api/docs/models/gpt-4o-transcribe", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -59,7 +59,7 @@ { "title": "GPT-4o Transcribe Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o-transcribe", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-4o.json b/data/models/gpt-4o.json index 18944b3a..c7561472 100644 --- a/data/models/gpt-4o.json +++ b/data/models/gpt-4o.json @@ -55,7 +55,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Fast, intelligent, flexible GPT model.", "docs": "https://developers.openai.com/api/docs/models/gpt-4o", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-4o-2024-08-06", @@ -71,7 +71,7 @@ { "title": "GPT-4o Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-4o", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-5-chat-latest.json b/data/models/gpt-5-chat-latest.json index 878c8f93..3e200682 100644 --- a/data/models/gpt-5-chat-latest.json +++ b/data/models/gpt-5-chat-latest.json @@ -52,7 +52,7 @@ "knowledge_cutoff": "2024-09-30", "description": "GPT-5 model used in ChatGPT", "docs": "https://developers.openai.com/api/docs/models/gpt-5-chat-latest", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -64,7 +64,7 @@ { "title": "GPT-5 Chat Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-5-chat-latest", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-5.1-chat-latest.json b/data/models/gpt-5.1-chat-latest.json index 41690388..8511b6d8 100644 --- a/data/models/gpt-5.1-chat-latest.json +++ b/data/models/gpt-5.1-chat-latest.json @@ -52,7 +52,7 @@ "knowledge_cutoff": "2024-09-30", "description": "GPT-5.1 model used in ChatGPT", "docs": "https://developers.openai.com/api/docs/models/gpt-5.1-chat-latest", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -64,7 +64,7 @@ { "title": "GPT-5.1 Chat Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-5.1-chat-latest", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-5.2-chat-latest.json b/data/models/gpt-5.2-chat-latest.json index 0bf9479d..e5a696d4 100644 --- a/data/models/gpt-5.2-chat-latest.json +++ b/data/models/gpt-5.2-chat-latest.json @@ -52,7 +52,7 @@ "knowledge_cutoff": "2025-08-31", "description": "GPT-5.2 model used in ChatGPT", "docs": "https://developers.openai.com/api/docs/models/gpt-5.2-chat-latest", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -64,7 +64,7 @@ { "title": "GPT-5.2 Chat Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-5.2-chat-latest", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-5.3-chat-latest.json b/data/models/gpt-5.3-chat-latest.json index 214afa06..187311bf 100644 --- a/data/models/gpt-5.3-chat-latest.json +++ b/data/models/gpt-5.3-chat-latest.json @@ -52,7 +52,7 @@ "knowledge_cutoff": "2025-08-31", "description": "GPT-5.3 Instant model used in ChatGPT", "docs": "https://developers.openai.com/api/docs/models/gpt-5.3-chat-latest", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -64,7 +64,7 @@ { "title": "GPT-5.3 Chat Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-5.3-chat-latest", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-audio-1.5.json b/data/models/gpt-audio-1.5.json index e35619a5..9ae9e5b7 100644 --- a/data/models/gpt-audio-1.5.json +++ b/data/models/gpt-audio-1.5.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2024-09-30", "description": "Voice model for audio-in, audio-out use with Chat Completions.", "docs": "https://developers.openai.com/api/docs/models/gpt-audio-1.5", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -56,7 +56,7 @@ { "title": "GPT-Audio-1.5 Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-audio-1.5", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-audio-mini.json b/data/models/gpt-audio-mini.json index d37d1a18..ad71e82d 100644 --- a/data/models/gpt-audio-mini.json +++ b/data/models/gpt-audio-mini.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2023-10-01", "description": "A cost-efficient version of GPT Audio", "docs": "https://developers.openai.com/api/docs/models/gpt-audio-mini", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-audio-mini-2025-10-06", @@ -59,7 +59,7 @@ { "title": "gpt-audio-mini Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-audio-mini.md", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-audio.json b/data/models/gpt-audio.json index 0c9ce1dc..bd4d232e 100644 --- a/data/models/gpt-audio.json +++ b/data/models/gpt-audio.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2023-10-01", "description": "For audio inputs and outputs with Chat Completions API", "docs": "https://developers.openai.com/api/docs/models/gpt-audio", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-audio-2025-08-28" @@ -58,7 +58,7 @@ { "title": "gpt-audio Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-audio.md", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-realtime-1.5.json b/data/models/gpt-realtime-1.5.json index a7e4fae6..3e2192f0 100644 --- a/data/models/gpt-realtime-1.5.json +++ b/data/models/gpt-realtime-1.5.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2024-09-30", "description": "Best voice model for audio in, audio out.", "docs": "https://developers.openai.com/api/docs/models/gpt-realtime-1.5", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -56,7 +56,7 @@ { "title": "GPT-Realtime-1.5 Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-realtime-1.5", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-realtime-mini.json b/data/models/gpt-realtime-mini.json index ee3e9f2a..e15ebf47 100644 --- a/data/models/gpt-realtime-mini.json +++ b/data/models/gpt-realtime-mini.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2023-10-01", "description": "A cost-efficient version of GPT-Realtime", "docs": "https://developers.openai.com/api/docs/models/gpt-realtime-mini", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-realtime-mini-2025-10-06", @@ -59,7 +59,7 @@ { "title": "gpt-realtime-mini Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-realtime-mini.md", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/gpt-realtime-translate.json b/data/models/gpt-realtime-translate.json index 27d0b220..19f58f0a 100644 --- a/data/models/gpt-realtime-translate.json +++ b/data/models/gpt-realtime-translate.json @@ -48,7 +48,7 @@ "knowledge_cutoff": "2024-09-30", "description": "Streaming speech-to-speech translation model for live multilingual audio.", "docs": "https://developers.openai.com/api/docs/models/gpt-realtime-translate", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -60,7 +60,7 @@ { "title": "GPT-Realtime-Translate Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-realtime-translate", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-realtime-whisper.json b/data/models/gpt-realtime-whisper.json index bd316ea5..732e2010 100644 --- a/data/models/gpt-realtime-whisper.json +++ b/data/models/gpt-realtime-whisper.json @@ -48,7 +48,7 @@ "knowledge_cutoff": "2024-09-30", "description": "Streaming speech-to-text model for realtime transcription.", "docs": "https://developers.openai.com/api/docs/models/gpt-realtime-whisper", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -60,7 +60,7 @@ { "title": "GPT-Realtime-Whisper Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-realtime-whisper", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Pricing | OpenAI API", diff --git a/data/models/gpt-realtime.json b/data/models/gpt-realtime.json index cd5eed86..0bd3bcd0 100644 --- a/data/models/gpt-realtime.json +++ b/data/models/gpt-realtime.json @@ -44,7 +44,7 @@ "knowledge_cutoff": "2023-10-01", "description": "Model capable of realtime text and audio inputs and outputs", "docs": "https://developers.openai.com/api/docs/models/gpt-realtime", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "gpt-realtime-2025-08-28" @@ -58,7 +58,7 @@ { "title": "gpt-realtime Model | OpenAI API", "url": "https://developers.openai.com/api/docs/models/gpt-realtime.md", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Deprecations | OpenAI API", diff --git a/data/models/grok-voice-3.0.json b/data/models/grok-voice-3.0.json new file mode 100644 index 00000000..2f0a8391 --- /dev/null +++ b/data/models/grok-voice-3.0.json @@ -0,0 +1,101 @@ +{ + "id": "grok-voice-3.0", + "object": "model", + "created": 1791936000, + "owned_by": "xai", + "name": "Grok Voice 3.0", + "api": { + "types": [ + "realtime" + ], + "sdk": [ + "openai" + ] + }, + "limits": { + "context": null, + "input": null, + "output": null + }, + "modalities": { + "input": [ + "text", + "audio" + ], + "output": [ + "text", + "audio" + ] + }, + "reasoning": { + "supported": true, + "efforts": [ + "high", + "none" + ] + }, + "pricing": null, + "features": [ + "tools", + "streaming" + ], + "info": { + "status": "active", + "release_date": "2026-10-14", + "knowledge_cutoff": null, + "description": "The world’s most intelligent voice model.", + "docs": "https://docs.x.ai/developers/models/grok-voice-3.0", + "verified_at": "2026-10-15" + }, + "aliases": [ + "grok-voice-latest" + ], + "translations": { + "zh": { + "description": "全球最智能的语音模型。" + } + }, + "sources": [ + { + "title": "Grok Voice 3.0 | xAI Docs", + "url": "https://docs.x.ai/developers/models/grok-voice-3.0", + "retrieved_at": "2026-10-15" + }, + { + "title": "Speech to Speech | xAI Docs", + "url": "https://docs.x.ai/developers/model-capabilities/audio/speech-to-speech", + "retrieved_at": "2026-10-15" + }, + { + "title": "Pricing(Speech to Speech grok-voice-3.0 为 $0.08/min 另加文本输入 $0.004)| xAI Docs", + "url": "https://docs.x.ai/developers/pricing", + "retrieved_at": "2026-10-15" + }, + { + "title": "Speech to Speech Pricing and Rate Limits | xAI Docs", + "url": "https://docs.x.ai/developers/models/speech-to-speech", + "retrieved_at": "2026-10-15" + }, + { + "title": "Release Notes(grok-voice-3.0 可用,grok-voice-latest 指向它,grok-voice-2.0 弃用)| xAI Docs", + "url": "https://docs.x.ai/developers/release-notes", + "retrieved_at": "2026-10-15" + }, + { + "title": "Introducing Grok Voice 3.0", + "url": "https://x.ai/news/grok-voice-3", + "retrieved_at": "2026-10-15" + } + ], + "providers": [ + { + "id": "xai", + "model": "grok-voice-3.0", + "base_url": "wss://api.x.ai", + "endpoints": { + "realtime": "WS /v1/realtime" + }, + "reasoning_param": "reasoning.effort" + } + ] +} diff --git a/data/models/grok-voice-think-fast-2.0.json b/data/models/grok-voice-think-fast-2.0.json index fd08f50a..9d8ae8d4 100644 --- a/data/models/grok-voice-think-fast-2.0.json +++ b/data/models/grok-voice-think-fast-2.0.json @@ -41,11 +41,9 @@ "knowledge_cutoff": null, "description": "xAI speech-to-speech voice model with improved intelligence, transcription accuracy and conversational capabilities.", "docs": "https://docs.x.ai/developers/models/grok-voice-think-fast-2.0", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, - "aliases": [ - "grok-voice-latest" - ], + "aliases": [], "translations": { "zh": { "description": "xAI 语音到语音模型,智能水平、转写准确率和对话能力均有提升。" @@ -63,9 +61,9 @@ "retrieved_at": "2026-10-11" }, { - "title": "Release Notes | xAI Docs", + "title": "Release Notes(grok-voice-latest 现指向 grok-voice-3.0)| xAI Docs", "url": "https://docs.x.ai/developers/release-notes", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-15" }, { "title": "Introducing Grok Voice Think Fast 2.0", diff --git a/data/models/labs-leanstral-1-5.json b/data/models/labs-leanstral-1-5.json index c5970919..5602abb2 100644 --- a/data/models/labs-leanstral-1-5.json +++ b/data/models/labs-leanstral-1-5.json @@ -34,7 +34,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0, + "output": 0, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "structured_output" @@ -45,7 +52,7 @@ "knowledge_cutoff": null, "description": "An updated Lean 4 formal proof engineering model optimised for automated theorem proving and autoformalization. 119B total parameters, 6.5B active.", "docs": "https://docs.mistral.ai/models/leanstral-1-5", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -57,7 +64,7 @@ { "title": "Leanstral 1.5 | Mistral Docs", "url": "https://docs.mistral.ai/models/leanstral-1-5", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -93,6 +100,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Leanstral 1.5 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/leanstral-1-5.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/labs-leanstral-2603.json b/data/models/labs-leanstral-2603.json index d62f196c..38a37ee6 100644 --- a/data/models/labs-leanstral-2603.json +++ b/data/models/labs-leanstral-2603.json @@ -34,7 +34,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0, + "output": 0, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "structured_output" @@ -45,7 +52,7 @@ "knowledge_cutoff": null, "description": "Our first open-source code agent designed for Lean 4, built for formal proof engineering in realistic repositories. 119B parameters with 6.5B active.", "docs": "https://docs.mistral.ai/models/leanstral-26-03", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -57,7 +64,7 @@ { "title": "Leanstral | Mistral Docs", "url": "https://docs.mistral.ai/models/leanstral-26-03", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -93,6 +100,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Leanstral | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/leanstral-26-03.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/labs-mistral-small-creative.json b/data/models/labs-mistral-small-creative.json index d52d2670..ccf2e3a3 100644 --- a/data/models/labs-mistral-small-creative.json +++ b/data/models/labs-mistral-small-creative.json @@ -34,7 +34,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0.1, + "output": 0.3, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "structured_output", @@ -46,7 +53,7 @@ "knowledge_cutoff": null, "description": "An experimental specialized small model trained on meticulously curated data, designed for creative writing, narrative generation, roleplay and character-driven dialog, general-purpose instruction following and conversational agents.", "docs": "https://docs.mistral.ai/models/mistral-small-creative-25-12", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -58,7 +65,7 @@ { "title": "Mistral Small Creative | Mistral Docs", "url": "https://docs.mistral.ai/models/mistral-small-creative-25-12", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -94,6 +101,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral Small Creative | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/mistral-small-creative-25-12.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/magistral-medium-2506.json b/data/models/magistral-medium-2506.json index b88064d9..1648254e 100644 --- a/data/models/magistral-medium-2506.json +++ b/data/models/magistral-medium-2506.json @@ -34,7 +34,14 @@ "supported": true, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 2, + "output": 5, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "batch" @@ -45,7 +52,7 @@ "knowledge_cutoff": null, "description": "Our first frontier-class reasoning model released June 2025.", "docs": "https://docs.mistral.ai/models/magistral-medium-1-0-25-06", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -57,7 +64,7 @@ { "title": "Magistral Medium 1.0 | Mistral Docs", "url": "https://docs.mistral.ai/models/magistral-medium-1-0-25-06", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -93,6 +100,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Magistral Medium 1.0 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/magistral-medium-1-0-25-06.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/magistral-small-2506.json b/data/models/magistral-small-2506.json index c75da964..fd5039e3 100644 --- a/data/models/magistral-small-2506.json +++ b/data/models/magistral-small-2506.json @@ -34,7 +34,14 @@ "supported": true, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0.5, + "output": 1.5, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "batch" @@ -43,16 +50,21 @@ "status": "retired", "release_date": "2025-06-10", "knowledge_cutoff": null, - "description": null, + "description": "Our first small reasoning model released June 2025.", "docs": "https://docs.mistral.ai/models/magistral-small-1-0-25-06", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], + "translations": { + "zh": { + "description": "2025 年 6 月发布的首个小型推理模型。" + } + }, "sources": [ { "title": "Magistral Small 1.0 | Mistral Docs", "url": "https://docs.mistral.ai/models/magistral-small-1-0-25-06", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -88,6 +100,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Magistral Small 1.0 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/magistral-small-1-0-25-06.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/ministral-8b-2410.json b/data/models/ministral-8b-2410.json index bb4edfb3..f9fefc82 100644 --- a/data/models/ministral-8b-2410.json +++ b/data/models/ministral-8b-2410.json @@ -51,16 +51,21 @@ "status": "retired", "release_date": "2024-10-09", "knowledge_cutoff": null, - "description": null, + "description": "Powerful edge model with extremely high performance/price ratio.", "docs": "https://docs.mistral.ai/models/ministral-8b-24-1", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], + "translations": { + "zh": { + "description": "性能价格比极高的端侧模型。" + } + }, "sources": [ { "title": "Ministral 8B | Mistral Docs", "url": "https://docs.mistral.ai/models/ministral-8b-24-1", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -101,6 +106,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Ministral 8B | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/ministral-8b-24-1.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-medium-2505.json b/data/models/mistral-medium-2505.json index a154e852..4e1b7705 100644 --- a/data/models/mistral-medium-2505.json +++ b/data/models/mistral-medium-2505.json @@ -52,16 +52,21 @@ "status": "retired", "release_date": "2025-05-07", "knowledge_cutoff": null, - "description": null, + "description": "Our frontier-class multimodal model released May 2025.", "docs": "https://docs.mistral.ai/models/mistral-medium-3-25-05", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], + "translations": { + "zh": { + "description": "2025 年 5 月发布的前沿多模态模型。" + } + }, "sources": [ { "title": "Mistral Medium 3 | Mistral Docs", "url": "https://docs.mistral.ai/models/mistral-medium-3-25-05", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -107,6 +112,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral Medium 3 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/mistral-medium-3-25-05.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-medium-2508.json b/data/models/mistral-medium-2508.json index 21b9b037..8d64533f 100644 --- a/data/models/mistral-medium-2508.json +++ b/data/models/mistral-medium-2508.json @@ -35,7 +35,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0.4, + "output": 2, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "structured_output", @@ -47,7 +54,7 @@ "knowledge_cutoff": null, "description": "Our frontier-class multimodal model released August 2025. Improving tone and performance.", "docs": "https://docs.mistral.ai/models/mistral-medium-3-1-25-08", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -59,7 +66,7 @@ { "title": "Mistral Medium 3.1 | Mistral Docs", "url": "https://docs.mistral.ai/models/mistral-medium-3-1-25-08", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -100,6 +107,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral Medium 3.1 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/mistral-medium-3-1-25-08.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-moderation-2603.json b/data/models/mistral-moderation-2603.json index 9d121ef8..0debe266 100644 --- a/data/models/mistral-moderation-2603.json +++ b/data/models/mistral-moderation-2603.json @@ -31,7 +31,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0, + "output": null, + "cache_read": null, + "cache_write": null + }, "features": [ "batch" ], @@ -41,7 +48,7 @@ "knowledge_cutoff": null, "description": "Moderation model with a 128k context window and jailbreak detection, strong on multilingual and multi-turn conversations.", "docs": "https://docs.mistral.ai/models/mistral-moderation-26-03", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -53,7 +60,7 @@ { "title": "Mistral Moderation 2 | Mistral Docs", "url": "https://docs.mistral.ai/models/mistral-moderation-26-03", - "retrieved_at": "2026-10-10" + "retrieved_at": "2026-10-14" }, { "title": "API pricing | Mistral Docs", @@ -89,6 +96,11 @@ "title": "SDK support — openai (api.sdk only)", "url": "https://github.com/openai/openai-node", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral Moderation 2 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/mistral-moderation-26-03.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-ocr-2503.json b/data/models/mistral-ocr-2503.json index a2a765a7..4e260794 100644 --- a/data/models/mistral-ocr-2503.json +++ b/data/models/mistral-ocr-2503.json @@ -23,7 +23,8 @@ "document" ], "output": [ - "text" + "text", + "image" ] }, "reasoning": { @@ -45,7 +46,7 @@ "knowledge_cutoff": null, "description": "Our first OCR optimized model.", "docs": "https://docs.mistral.ai/models/ocr-25-03", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -57,7 +58,7 @@ { "title": "OCR | Mistral Docs", "url": "https://docs.mistral.ai/models/ocr-25-03", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -78,6 +79,11 @@ "title": "SDK support — @mistralai/mistralai (api.sdk only)", "url": "https://github.com/mistralai/client-ts", "retrieved_at": "2026-10-13" + }, + { + "title": "OCR | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/ocr-25-03.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-ocr-2505.json b/data/models/mistral-ocr-2505.json index e2568193..85e216b4 100644 --- a/data/models/mistral-ocr-2505.json +++ b/data/models/mistral-ocr-2505.json @@ -24,7 +24,8 @@ "document" ], "output": [ - "text" + "text", + "image" ] }, "reasoning": { @@ -48,7 +49,7 @@ "knowledge_cutoff": null, "description": "Our OCR service powering our Document AI stack that enables our users to extract interleaved text and images", "docs": "https://docs.mistral.ai/models/ocr-2-25-05", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -60,7 +61,7 @@ { "title": "OCR 2 | Mistral Docs", "url": "https://docs.mistral.ai/models/ocr-2-25-05", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -81,6 +82,11 @@ "title": "SDK support — @mistralai/mistralai (api.sdk only)", "url": "https://github.com/mistralai/client-ts", "retrieved_at": "2026-10-13" + }, + { + "title": "OCR 2 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/ocr-2-25-05.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-ocr-2512.json b/data/models/mistral-ocr-2512.json index e473b4b5..62e2434a 100644 --- a/data/models/mistral-ocr-2512.json +++ b/data/models/mistral-ocr-2512.json @@ -24,7 +24,8 @@ "document" ], "output": [ - "text" + "text", + "image" ] }, "reasoning": { @@ -48,7 +49,7 @@ "knowledge_cutoff": null, "description": "OCR service powering Mistral's Document AI stack that extracts interleaved text and images.", "docs": "https://docs.mistral.ai/models/ocr-3-25-12", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -60,7 +61,7 @@ { "title": "Mistral OCR 3 | Mistral Docs", "url": "https://docs.mistral.ai/models/ocr-3-25-12", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "API pricing | Mistral Docs", @@ -86,6 +87,11 @@ "title": "SDK support — @mistralai/mistralai (api.sdk only)", "url": "https://github.com/mistralai/client-ts", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral OCR 3 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/ocr-3-25-12.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-ocr-4-0.json b/data/models/mistral-ocr-4-0.json index fe5b6b51..b43fc42f 100644 --- a/data/models/mistral-ocr-4-0.json +++ b/data/models/mistral-ocr-4-0.json @@ -24,7 +24,8 @@ "document" ], "output": [ - "text" + "text", + "image" ] }, "reasoning": { @@ -48,7 +49,7 @@ "knowledge_cutoff": null, "description": "Our latest OCR service powering our Document AI stack, with native paragraph-level bounding box extraction and structural block labels.", "docs": "https://docs.mistral.ai/models/ocr-4-0", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -60,7 +61,7 @@ { "title": "OCR 4.0 | Mistral Docs", "url": "https://docs.mistral.ai/models/ocr-4-0", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -81,6 +82,11 @@ "title": "SDK support — @mistralai/mistralai (api.sdk only)", "url": "https://github.com/mistralai/client-ts", "retrieved_at": "2026-10-13" + }, + { + "title": "OCR 4.0 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/ocr-4-0.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-ocr-4-1.json b/data/models/mistral-ocr-4-1.json index b3b50ddf..214dd799 100644 --- a/data/models/mistral-ocr-4-1.json +++ b/data/models/mistral-ocr-4-1.json @@ -24,7 +24,8 @@ "document" ], "output": [ - "text" + "text", + "image" ] }, "reasoning": { @@ -48,7 +49,7 @@ "knowledge_cutoff": null, "description": "OCR service powering Mistral's Document AI stack, with paragraph-level bounding boxes, block labels, and confidence scores.", "docs": "https://docs.mistral.ai/models/ocr-4-1", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "mistral-ocr-latest" @@ -62,7 +63,7 @@ { "title": "Mistral OCR 4.1 | Mistral Docs", "url": "https://docs.mistral.ai/models/ocr-4-1", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "API pricing | Mistral Docs", @@ -88,6 +89,11 @@ "title": "SDK support — @mistralai/mistralai (api.sdk only)", "url": "https://github.com/mistralai/client-ts", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral OCR 4.1 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/ocr-4-1.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/mistral-small-2501.json b/data/models/mistral-small-2501.json index 8f42ef03..54f6a141 100644 --- a/data/models/mistral-small-2501.json +++ b/data/models/mistral-small-2501.json @@ -34,7 +34,14 @@ "supported": null, "efforts": [] }, - "pricing": null, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0.1, + "output": 0.3, + "cache_read": null, + "cache_write": null + }, "features": [ "tools", "structured_output", @@ -46,7 +53,7 @@ "knowledge_cutoff": null, "description": "A small efficient and powerfull 24B open model for personal or commercial use.", "docs": "https://docs.mistral.ai/models/mistral-small-3-0-25-01", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -58,7 +65,7 @@ { "title": "Mistral Small 3.0 | Mistral Docs", "url": "https://docs.mistral.ai/models/mistral-small-3-0-25-01", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -94,6 +101,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Mistral Small 3.0 | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/mistral-small-3-0-25-01.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/nova-premier.json b/data/models/nova-premier.json new file mode 100644 index 00000000..65e63037 --- /dev/null +++ b/data/models/nova-premier.json @@ -0,0 +1,87 @@ +{ + "id": "nova-premier", + "object": "model", + "created": null, + "owned_by": "amazon", + "name": "Amazon Nova Premier", + "api": { + "types": [ + "chat", + "batch" + ], + "sdk": [ + "@ai-sdk/amazon-bedrock", + "@aws-sdk/client-bedrock-runtime" + ] + }, + "limits": { + "context": 1000000, + "input": null, + "output": 10000 + }, + "modalities": { + "input": [ + "text", + "image", + "video", + "document" + ], + "output": [ + "text" + ] + }, + "reasoning": { + "supported": null, + "efforts": [] + }, + "pricing": null, + "features": [ + "streaming", + "batch" + ], + "info": { + "status": "active", + "release_date": null, + "knowledge_cutoff": null, + "description": "Amazon's most capable multimodal model for complex tasks. It comprehends text, images, video, documents, and code. The category table lists US East (N. Virginia) and AWS GovCloud (US-West); the specifications table lists US East (N. Virginia), with cross-region inference to additional commercial regions.", + "docs": "https://docs.aws.amazon.com/nova/latest/userguide/what-is-nova.html", + "verified_at": "2026-10-13" + }, + "aliases": [ + "amazon.nova-premier-v1:0", + "us.amazon.nova-premier-v1:0" + ], + "translations": { + "zh": { + "description": "Amazon 面向复杂任务的最强大多模态模型,可理解文本、图像、视频、文档和代码。分类表列出美国东部(弗吉尼亚北部)与 AWS GovCloud(美国西部);规格表列出美国东部(弗吉尼亚北部),并可通过跨区域推理访问其他商业区域。" + } + }, + "sources": [ + { + "title": "What is Amazon Nova? | Amazon Nova User Guide", + "url": "https://docs.aws.amazon.com/nova/latest/userguide/what-is-nova.html", + "retrieved_at": "2026-10-13" + }, + { + "title": "SDK support — @aws-sdk/client-bedrock-runtime (api.sdk only)", + "url": "https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-runtime/", + "retrieved_at": "2026-10-13" + }, + { + "title": "SDK support — @ai-sdk/amazon-bedrock (api.sdk only)", + "url": "https://ai-sdk.dev/providers/ai-sdk-providers/amazon-bedrock", + "retrieved_at": "2026-10-13" + } + ], + "providers": [ + { + "id": "amazon-bedrock", + "model": "amazon.nova-premier-v1:0", + "base_url": "https://bedrock-runtime.us-east-1.amazonaws.com", + "endpoints": { + "chat": "POST /model/{modelId}/converse" + }, + "reasoning_param": null + } + ] +} diff --git a/data/models/pixtral-large-2411.json b/data/models/pixtral-large-2411.json index adee9ed1..149bd8fa 100644 --- a/data/models/pixtral-large-2411.json +++ b/data/models/pixtral-large-2411.json @@ -52,18 +52,23 @@ "status": "retired", "release_date": "2024-11-18", "knowledge_cutoff": null, - "description": null, + "description": "Our first frontier-class multimodal model released November 2024.", "docs": "https://docs.mistral.ai/models/pixtral-large-24-11", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "pixtral-large-latest" ], + "translations": { + "zh": { + "description": "2024 年 11 月发布的首个前沿多模态模型。" + } + }, "sources": [ { "title": "Pixtral Large | Mistral Docs", "url": "https://docs.mistral.ai/models/pixtral-large-24-11", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "Models overview(含 Deprecation 与 Retirement 日期表) | Mistral Docs", @@ -104,6 +109,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Pixtral Large | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/pixtral-large-24-11.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/models/qwen2.5-vl-72b-instruct.json b/data/models/qwen2.5-vl-72b-instruct.json index b6b4e254..11ae459a 100644 --- a/data/models/qwen2.5-vl-72b-instruct.json +++ b/data/models/qwen2.5-vl-72b-instruct.json @@ -31,7 +31,7 @@ ] }, "reasoning": { - "supported": null, + "supported": false, "efforts": [] }, "pricing": { @@ -49,7 +49,7 @@ "knowledge_cutoff": null, "description": null, "docs": "https://www.alibabacloud.com/en/notice/model_studio_notice_on_the_decommissioning_of_selected_historical_snapshot_models_730", - "verified_at": "2026-10-11" + "verified_at": "2026-10-13" }, "aliases": [], "sources": [ @@ -68,6 +68,11 @@ "url": "https://qwenlm.github.io/blog/qwen2.5-vl/", "retrieved_at": "2026-10-11" }, + { + "title": "Text generation models(qwen2.5-vl-72b-instruct:Thinking、Function Calling、Structured output 均为 Unsupported)| Alibaba Cloud Model Studio", + "url": "https://www.alibabacloud.com/help/en/model-studio/text-generation-model", + "retrieved_at": "2026-10-13" + }, { "title": "SDK support — @ai-sdk/alibaba (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/alibaba", diff --git a/data/models/solar-pro4.json b/data/models/solar-pro4.json index 9fae677c..d7129919 100644 --- a/data/models/solar-pro4.json +++ b/data/models/solar-pro4.json @@ -18,7 +18,7 @@ "limits": { "context": null, "input": null, - "output": null + "output": 131072 }, "modalities": { "input": [ @@ -59,7 +59,7 @@ "knowledge_cutoff": "2026-02", "description": "Upstage flagship Solar model specialized for agentic use, with reasoning, tool calling and structured outputs.", "docs": "https://console.upstage.ai/docs/models/solar-pro-4", - "verified_at": "2026-10-11" + "verified_at": "2026-10-13" }, "aliases": [ "solar-pro4-260806" @@ -96,9 +96,9 @@ "retrieved_at": "2026-10-11" }, { - "title": "Official API reference", + "title": "Responses API(max_output_tokens 最大 131072,适用于 solar-pro4)| Upstage", "url": "https://console.upstage.ai/api/responses", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-13" }, { "title": "SDK support — openai (api.sdk only)", diff --git a/data/models/step-5-preview.json b/data/models/step-5-preview.json index 19c0d0e8..6c4aa99e 100644 --- a/data/models/step-5-preview.json +++ b/data/models/step-5-preview.json @@ -20,7 +20,7 @@ "limits": { "context": 1000000, "input": 1000000, - "output": 65536 + "output": null }, "modalities": { "input": [ @@ -41,11 +41,11 @@ ] }, "pricing": { - "currency": "USD", + "currency": "CNY", "unit": "1M_tokens", - "input": 1, - "output": 2.7, - "cache_read": 0.1, + "input": 7, + "output": 20, + "cache_read": 0.7, "cache_write": null }, "features": [ @@ -59,8 +59,8 @@ "release_date": "2026-09-20", "knowledge_cutoff": null, "description": "Flagship multimodal reasoning model for agentic work with a 1M-token context.", - "docs": "https://platform.stepfun.ai/docs/en/guides/models/step-5-preview", - "verified_at": "2026-10-11" + "docs": "https://platform.stepfun.com/docs/zh/guides/models/step-5-preview", + "verified_at": "2026-10-15" }, "aliases": [], "translations": { @@ -70,9 +70,39 @@ }, "sources": [ { - "title": "Step Platform pricing | StepFun Documentation", + "title": "API 定价(step-5-preview 标准价输入 7、缓存命中 0.70、输出 20 元/百万 tokens)| StepFun", + "url": "https://platform.stepfun.com/docs/zh/guides/pricing/details", + "retrieved_at": "2026-10-15" + }, + { + "title": "Step 5 Preview | StepFun 开放平台", + "url": "https://platform.stepfun.com/docs/zh/guides/models/step-5-preview", + "retrieved_at": "2026-10-15" + }, + { + "title": "阶跃发布旗舰模型 Step 5 Preview", + "url": "https://www.stepfun.com/news/step-5-preview", + "retrieved_at": "2026-10-15" + }, + { + "title": "Step 5 Preview | StepFun", + "url": "https://www.stepfun.com/step-5-preview", + "retrieved_at": "2026-10-15" + }, + { + "title": "Chat Completions API | StepFun 开放平台", + "url": "https://platform.stepfun.com/docs/zh/api-reference/chat/chat-completion-create", + "retrieved_at": "2026-10-15" + }, + { + "title": "Messages API | StepFun 开放平台", + "url": "https://platform.stepfun.com/docs/zh/api-reference/chat/messages-create", + "retrieved_at": "2026-10-15" + }, + { + "title": "Pricing and Rate Limits(国际站 step-5-preview 为 $1.00 / $0.10 / $2.70)| StepFun", "url": "https://platform.stepfun.ai/docs/en/guides/pricing/details", - "retrieved_at": "2026-10-10" + "retrieved_at": "2026-10-15" }, { "title": "Model overview | StepFun Documentation", @@ -87,7 +117,7 @@ { "title": "Step 5 Preview | StepFun Documentation", "url": "https://platform.stepfun.ai/docs/en/guides/models/step-5-preview", - "retrieved_at": "2026-10-10" + "retrieved_at": "2026-10-15" }, { "title": "Messages API | StepFun Documentation", @@ -134,12 +164,16 @@ { "id": "stepfun", "model": "step-5-preview", - "base_url": "https://api.stepfun.ai", + "base_url": "https://api.stepfun.com", "endpoints": { "chat": "POST /v1/chat/completions", "messages": "POST /v1/messages" }, - "reasoning_param": "reasoning_effort" + "reasoning_param": "reasoning_effort", + "reasoning_params": { + "chat": "reasoning_effort", + "messages": "output_config.effort" + } } ] } diff --git a/data/models/text-embedding-3-large.json b/data/models/text-embedding-3-large.json index 6ec54091..0eab3d7a 100644 --- a/data/models/text-embedding-3-large.json +++ b/data/models/text-embedding-3-large.json @@ -49,7 +49,7 @@ "knowledge_cutoff": "2021-09", "description": "Most capable embedding model for both English and non-English tasks.", "docs": "https://developers.openai.com/api/docs/models/text-embedding-3-large", - "verified_at": "2026-10-11" + "verified_at": "2026-10-13" }, "aliases": [], "translations": { @@ -79,9 +79,9 @@ "retrieved_at": "2026-10-11" }, { - "title": "Vector embeddings | OpenAI API", + "title": "Embeddings guide(text-embedding-3-large 最大输入 8192)| OpenAI API", "url": "https://developers.openai.com/api/docs/guides/embeddings", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-13" }, { "title": "models.dev — SDK npm mapping (api.sdk only)", diff --git a/data/models/text-embedding-3-small.json b/data/models/text-embedding-3-small.json index 83f79a60..52be2e1a 100644 --- a/data/models/text-embedding-3-small.json +++ b/data/models/text-embedding-3-small.json @@ -49,7 +49,7 @@ "knowledge_cutoff": "2021-09", "description": "Small embedding model, an improved and more performant version of the ada embedding model.", "docs": "https://developers.openai.com/api/docs/models/text-embedding-3-small", - "verified_at": "2026-10-11" + "verified_at": "2026-10-13" }, "aliases": [], "translations": { @@ -79,9 +79,9 @@ "retrieved_at": "2026-10-11" }, { - "title": "Vector embeddings | OpenAI API", + "title": "Embeddings guide(text-embedding-3-small 最大输入 8192)| OpenAI API", "url": "https://developers.openai.com/api/docs/guides/embeddings", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-13" }, { "title": "models.dev — SDK npm mapping (api.sdk only)", diff --git a/data/models/text-embedding-ada-002.json b/data/models/text-embedding-ada-002.json index dc0fcc75..76a2f948 100644 --- a/data/models/text-embedding-ada-002.json +++ b/data/models/text-embedding-ada-002.json @@ -49,7 +49,7 @@ "knowledge_cutoff": null, "description": "Older embedding model.", "docs": "https://developers.openai.com/api/docs/models/text-embedding-ada-002", - "verified_at": "2026-10-11" + "verified_at": "2026-10-13" }, "aliases": [], "translations": { @@ -79,9 +79,9 @@ "retrieved_at": "2026-10-11" }, { - "title": "Vector embeddings | OpenAI API", + "title": "Embeddings guide(text-embedding-ada-002 最大输入 8192)| OpenAI API", "url": "https://developers.openai.com/api/docs/guides/embeddings", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-13" }, { "title": "Official model release / pricing documentation", diff --git a/data/models/ultramarine-1-flash.json b/data/models/ultramarine-1-flash.json new file mode 100644 index 00000000..52b5e1fe --- /dev/null +++ b/data/models/ultramarine-1-flash.json @@ -0,0 +1,136 @@ +{ + "id": "ultramarine-1-flash", + "object": "model", + "created": 1791936000, + "owned_by": "paperinstruments", + "name": "Ultramarine 1 Flash", + "api": { + "types": [ + "chat", + "responses", + "messages" + ], + "sdk": [ + "@anthropic-ai/sdk", + "openai" + ] + }, + "limits": { + "context": null, + "input": null, + "output": 32768 + }, + "modalities": { + "input": [ + "text", + "image" + ], + "output": [ + "text" + ] + }, + "reasoning": { + "supported": true, + "efforts": [ + "low", + "high", + "max" + ] + }, + "pricing": { + "currency": "USD", + "unit": "1M_tokens", + "input": 0.15, + "output": 0.5, + "cache_read": 0.03, + "cache_write": null + }, + "features": [ + "tools", + "structured_output", + "streaming", + "caching" + ], + "info": { + "status": "active", + "release_date": "2026-10-14", + "knowledge_cutoff": null, + "description": "We present Ultramarine 1 Flash, an agentic model for professional knowledge work.", + "docs": "https://docs.paperinstruments.com/docs/ultramarine", + "verified_at": "2026-10-15" + }, + "aliases": [], + "translations": { + "zh": { + "description": "我们推出 Ultramarine 1 Flash,一款面向专业知识工作的智能体模型。" + } + }, + "sources": [ + { + "title": "Ultramarine 1 Flash: Scaling Non-Verifiable RL", + "url": "https://www.paperinstruments.com/blog/ultramarine", + "retrieved_at": "2026-10-15" + }, + { + "title": "Billing(输入 $0.15、缓存输入 $0.03、输出含推理 $0.50/百万 tokens)| Paper Instruments", + "url": "https://docs.paperinstruments.com/docs/ultramarine/billing", + "retrieved_at": "2026-10-15" + }, + { + "title": "Quickstart | Paper Instruments", + "url": "https://docs.paperinstruments.com/docs/ultramarine", + "retrieved_at": "2026-10-15" + }, + { + "title": "Chat completions | Paper Instruments", + "url": "https://docs.paperinstruments.com/docs/ultramarine/chat-completions", + "retrieved_at": "2026-10-15" + }, + { + "title": "Responses | Paper Instruments", + "url": "https://docs.paperinstruments.com/docs/ultramarine/responses", + "retrieved_at": "2026-10-15" + }, + { + "title": "Messages | Paper Instruments", + "url": "https://docs.paperinstruments.com/docs/ultramarine/messages", + "retrieved_at": "2026-10-15" + } + ], + "providers": [ + { + "id": "paperinstruments", + "model": "ultramarine-1-flash", + "base_url": "https://api.paperinstruments.com/v1", + "endpoints": { + "chat": "POST /chat/completions", + "messages": "POST /messages" + }, + "reasoning_param": "reasoning_effort", + "reasoning_params": { + "chat": "reasoning_effort", + "messages": "output_config.effort" + } + }, + { + "id": "paperinstruments", + "model": "ultramarine-1-flash", + "base_url": "https://api.paperinstruments.com/v1", + "endpoints": { + "responses": "POST /responses" + }, + "reasoning_param": "reasoning.effort", + "reasoning_params": { + "responses": "reasoning.effort" + }, + "modalities": { + "input": [ + "text" + ], + "output": [ + "text" + ] + } + } + ] +} diff --git a/data/models/voxtral-mini-tts-2603.json b/data/models/voxtral-mini-tts-2603.json index 2948ffeb..fcb55220 100644 --- a/data/models/voxtral-mini-tts-2603.json +++ b/data/models/voxtral-mini-tts-2603.json @@ -22,7 +22,8 @@ }, "modalities": { "input": [ - "text" + "text", + "audio" ], "output": [ "audio" @@ -47,7 +48,7 @@ "knowledge_cutoff": null, "description": "Text-to-speech model with zero-shot voice cloning, 9 languages, and streaming with about 90ms time-to-first-audio.", "docs": "https://docs.mistral.ai/models/voxtral-tts-26-03", - "verified_at": "2026-10-11" + "verified_at": "2026-10-15" }, "aliases": [ "voxtral-mini-tts-latest" @@ -61,7 +62,7 @@ { "title": "Voxtral TTS | Mistral Docs", "url": "https://docs.mistral.ai/models/voxtral-tts-26-03", - "retrieved_at": "2026-10-11" + "retrieved_at": "2026-10-14" }, { "title": "API pricing | Mistral Docs", @@ -92,6 +93,11 @@ "title": "SDK support — @ai-sdk/openai (api.sdk only)", "url": "https://ai-sdk.dev/providers/ai-sdk-providers/openai", "retrieved_at": "2026-10-13" + }, + { + "title": "Voxtral TTS | Mistral Docs (official Markdown)", + "url": "https://docs.mistral.ai/models/voxtral-tts-26-03.md", + "retrieved_at": "2026-10-15" } ], "providers": [ diff --git a/data/vendors/paperinstruments.json b/data/vendors/paperinstruments.json new file mode 100644 index 00000000..4b86c875 --- /dev/null +++ b/data/vendors/paperinstruments.json @@ -0,0 +1,5 @@ +{ + "id": "paperinstruments", + "name": "Paper Instruments", + "url": "https://www.paperinstruments.com" +} diff --git a/docs/README.md b/docs/README.md index d0a65838..8641a5ae 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ | --- | --- | | [development.md](development.md) | 环境、命令、目录、代码边界、多语言、自查 | | [spec-v1-models.md](spec-v1-models.md) | `/v1/models` 接口与数据文件规范 | -| [maintenance.md](maintenance.md) | 数据收录范围、数据约定、维护流程 | +| [maintenance.md](maintenance.md) | 数据收录范围、数据约定、维护流程、官方来源检查 | | [design.md](design.md) | 视觉设计、组件与响应式约定 | | [deployment.md](deployment.md) | Cloudflare Workers Builds 部署、自定义域名、CI 检查 | | [../.github/CONTRIBUTING.md](../.github/CONTRIBUTING.md) | 贡献指南(中英):Issue、PR、数据更新流程 | diff --git a/docs/audits/completeness-2026-10-14.json b/docs/audits/completeness-2026-10-14.json new file mode 100644 index 00000000..e298c5cf --- /dev/null +++ b/docs/audits/completeness-2026-10-14.json @@ -0,0 +1,2518 @@ +{ + "generated_at": "2026-10-14T02:40:54.963Z", + "source_directory": "data/models", + "scope": "Local model records only. Null is not an error: values may be unpublished, inapplicable, mixed-price, historical, or conflicting.", + "modalities": "modalities.input and modalities.output are required non-empty arrays, so they are not listed as null gaps.", + "all": { + "models": 1299, + "statuses": { + "preview": 34, + "active": 713, + "deprecated": 79, + "retired": 473 + }, + "null_fields": { + "limits.context": 715, + "limits.input": 1033, + "limits.output": 900, + "pricing": 377, + "reasoning.supported": 801, + "info.release_date": 326, + "info.knowledge_cutoff": 1142, + "info.description": 177, + "info.docs": 16, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 180, + "output": 201, + "cache_read": 682, + "cache_write": 870 + }, + "features_empty": 805, + "reasoning_true_efforts_empty": 213, + "sources_empty": 0, + "providers_empty": 15 + }, + "callable": { + "models": 826, + "statuses": { + "preview": 34, + "active": 713, + "deprecated": 79 + }, + "null_fields": { + "limits.context": 440, + "limits.input": 639, + "limits.output": 553, + "pricing": 168, + "reasoning.supported": 456, + "info.release_date": 181, + "info.knowledge_cutoff": 720, + "info.description": 22, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 152, + "output": 189, + "cache_read": 478, + "cache_write": 618 + }, + "features_empty": 469, + "reasoning_true_efforts_empty": 131, + "sources_empty": 0, + "providers_empty": 0 + }, + "vendors": { + "ai21": { + "models": 7, + "statuses": { + "active": 2, + "retired": 5 + }, + "null_fields": { + "limits.context": 1, + "limits.input": 7, + "limits.output": 5, + "pricing": 0, + "reasoning.supported": 5, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 5, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 7, + "cache_write": 7 + }, + "features_empty": 5, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 2, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 0, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "aisingapore": { + "models": 4, + "statuses": { + "active": 4 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 4, + "limits.output": 4, + "pricing": 4, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 3, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 4, + "limits.output": 4, + "pricing": 4, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "alibaba": { + "models": 211, + "statuses": { + "active": 134, + "retired": 77 + }, + "null_fields": { + "limits.context": 111, + "limits.input": 105, + "limits.output": 116, + "pricing": 31, + "reasoning.supported": 56, + "info.release_date": 19, + "info.knowledge_cutoff": 211, + "info.description": 51, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 46, + "output": 33, + "cache_read": 165, + "cache_write": 166 + }, + "features_empty": 133, + "reasoning_true_efforts_empty": 45, + "callable_null_fields": { + "limits.context": 85, + "limits.input": 79, + "limits.output": 91, + "pricing": 15, + "reasoning.supported": 23, + "info.release_date": 11, + "info.knowledge_cutoff": 134, + "info.description": 15, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "amazon": { + "models": 12, + "statuses": { + "active": 9, + "retired": 3 + }, + "null_fields": { + "limits.context": 7, + "limits.input": 12, + "limits.output": 7, + "pricing": 1, + "reasoning.supported": 4, + "info.release_date": 0, + "info.knowledge_cutoff": 8, + "info.description": 3, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 2, + "output": 4, + "cache_read": 7, + "cache_write": 11 + }, + "features_empty": 7, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 4, + "limits.input": 9, + "limits.output": 4, + "pricing": 0, + "reasoning.supported": 1, + "info.release_date": 0, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "ant": { + "models": 10, + "statuses": { + "active": 6, + "deprecated": 2, + "retired": 2 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 10, + "limits.output": 10, + "pricing": 5, + "reasoning.supported": 4, + "info.release_date": 1, + "info.knowledge_cutoff": 10, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 5 + }, + "features_empty": 4, + "reasoning_true_efforts_empty": 5, + "callable_null_fields": { + "limits.context": 3, + "limits.input": 8, + "limits.output": 8, + "pricing": 3, + "reasoning.supported": 3, + "info.release_date": 1, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "anthropic": { + "models": 33, + "statuses": { + "active": 13, + "deprecated": 1, + "retired": 19 + }, + "null_fields": { + "limits.context": 6, + "limits.input": 19, + "limits.output": 6, + "pricing": 5, + "reasoning.supported": 10, + "info.release_date": 7, + "info.knowledge_cutoff": 10, + "info.description": 24, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 5, + "cache_write": 5 + }, + "features_empty": 10, + "reasoning_true_efforts_empty": 7, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 0, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 0, + "info.description": 5, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "assemblyai": { + "models": 5, + "statuses": { + "active": 5 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 5, + "limits.output": 5, + "pricing": 0, + "reasoning.supported": 5, + "info.release_date": 0, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 5, + "cache_read": 5, + "cache_write": 5 + }, + "features_empty": 5, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 5, + "limits.input": 5, + "limits.output": 5, + "pricing": 0, + "reasoning.supported": 5, + "info.release_date": 0, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "baichuan": { + "models": 3, + "statuses": { + "active": 2, + "retired": 1 + }, + "null_fields": { + "limits.context": 1, + "limits.input": 3, + "limits.output": 1, + "pricing": 0, + "reasoning.supported": 1, + "info.release_date": 3, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 3, + "cache_write": 3 + }, + "features_empty": 1, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 2, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 2, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "baidu": { + "models": 84, + "statuses": { + "preview": 1, + "active": 6, + "deprecated": 8, + "retired": 69 + }, + "null_fields": { + "limits.context": 70, + "limits.input": 71, + "limits.output": 71, + "pricing": 59, + "reasoning.supported": 75, + "info.release_date": 24, + "info.knowledge_cutoff": 84, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 1, + "output": 3, + "cache_read": 22, + "cache_write": 25 + }, + "features_empty": 72, + "reasoning_true_efforts_empty": 7, + "callable_null_fields": { + "limits.context": 3, + "limits.input": 4, + "limits.output": 4, + "pricing": 0, + "reasoning.supported": 9, + "info.release_date": 5, + "info.knowledge_cutoff": 15, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "black-forest-labs": { + "models": 13, + "statuses": { + "preview": 1, + "active": 12 + }, + "null_fields": { + "limits.context": 13, + "limits.input": 13, + "limits.output": 13, + "pricing": 1, + "reasoning.supported": 13, + "info.release_date": 1, + "info.knowledge_cutoff": 13, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 12, + "output": 0, + "cache_read": 12, + "cache_write": 12 + }, + "features_empty": 13, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 13, + "limits.input": 13, + "limits.output": 13, + "pricing": 1, + "reasoning.supported": 13, + "info.release_date": 1, + "info.knowledge_cutoff": 13, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "bytedance": { + "models": 63, + "statuses": { + "active": 16, + "deprecated": 7, + "retired": 40 + }, + "null_fields": { + "limits.context": 52, + "limits.input": 53, + "limits.output": 53, + "pricing": 23, + "reasoning.supported": 36, + "info.release_date": 57, + "info.knowledge_cutoff": 63, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 15, + "output": 1, + "cache_read": 23, + "cache_write": 40 + }, + "features_empty": 53, + "reasoning_true_efforts_empty": 4, + "callable_null_fields": { + "limits.context": 12, + "limits.input": 13, + "limits.output": 13, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 17, + "info.knowledge_cutoff": 23, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "cartesia": { + "models": 7, + "statuses": { + "active": 4, + "deprecated": 2, + "retired": 1 + }, + "null_fields": { + "limits.context": 7, + "limits.input": 7, + "limits.output": 7, + "pricing": 7, + "reasoning.supported": 7, + "info.release_date": 0, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 7, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 6, + "limits.input": 6, + "limits.output": 6, + "pricing": 6, + "reasoning.supported": 6, + "info.release_date": 0, + "info.knowledge_cutoff": 6, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "cohere": { + "models": 42, + "statuses": { + "active": 31, + "retired": 11 + }, + "null_fields": { + "limits.context": 2, + "limits.input": 42, + "limits.output": 20, + "pricing": 14, + "reasoning.supported": 40, + "info.release_date": 7, + "info.knowledge_cutoff": 34, + "info.description": 11, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 17, + "cache_read": 28, + "cache_write": 28 + }, + "features_empty": 34, + "reasoning_true_efforts_empty": 2, + "callable_null_fields": { + "limits.context": 2, + "limits.input": 31, + "limits.output": 15, + "pricing": 13, + "reasoning.supported": 29, + "info.release_date": 0, + "info.knowledge_cutoff": 23, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "contextual-ai": { + "models": 3, + "statuses": { + "active": 3 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 3, + "limits.output": 3, + "pricing": 1, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 2, + "cache_read": 2, + "cache_write": 2 + }, + "features_empty": 3, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 3, + "limits.output": 3, + "pricing": 1, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "deepgram": { + "models": 17, + "statuses": { + "active": 17 + }, + "null_fields": { + "limits.context": 17, + "limits.input": 17, + "limits.output": 17, + "pricing": 11, + "reasoning.supported": 17, + "info.release_date": 11, + "info.knowledge_cutoff": 17, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 6, + "cache_read": 6, + "cache_write": 6 + }, + "features_empty": 17, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 17, + "limits.input": 17, + "limits.output": 17, + "pricing": 11, + "reasoning.supported": 17, + "info.release_date": 11, + "info.knowledge_cutoff": 17, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "deepseek": { + "models": 4, + "statuses": { + "active": 2, + "retired": 2 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 4, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 1, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 4 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 2, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "elevenlabs": { + "models": 18, + "statuses": { + "active": 18 + }, + "null_fields": { + "limits.context": 18, + "limits.input": 18, + "limits.output": 18, + "pricing": 2, + "reasoning.supported": 18, + "info.release_date": 4, + "info.knowledge_cutoff": 18, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 3, + "output": 13, + "cache_read": 16, + "cache_write": 16 + }, + "features_empty": 15, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 18, + "limits.input": 18, + "limits.output": 18, + "pricing": 2, + "reasoning.supported": 18, + "info.release_date": 4, + "info.knowledge_cutoff": 18, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "google": { + "models": 94, + "statuses": { + "preview": 11, + "active": 20, + "deprecated": 16, + "retired": 47 + }, + "null_fields": { + "limits.context": 62, + "limits.input": 30, + "limits.output": 46, + "pricing": 33, + "reasoning.supported": 29, + "info.release_date": 5, + "info.knowledge_cutoff": 65, + "info.description": 43, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 15, + "output": 2, + "cache_read": 43, + "cache_write": 61 + }, + "features_empty": 48, + "reasoning_true_efforts_empty": 25, + "callable_null_fields": { + "limits.context": 27, + "limits.input": 7, + "limits.output": 15, + "pricing": 13, + "reasoning.supported": 7, + "info.release_date": 1, + "info.knowledge_cutoff": 29, + "info.description": 2, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "huawei": { + "models": 2, + "statuses": { + "active": 2 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 0, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 2 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 2, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 0, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "ibm": { + "models": 11, + "statuses": { + "active": 2, + "retired": 9 + }, + "null_fields": { + "limits.context": 9, + "limits.input": 10, + "limits.output": 11, + "pricing": 4, + "reasoning.supported": 11, + "info.release_date": 2, + "info.knowledge_cutoff": 11, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 1, + "cache_read": 7, + "cache_write": 7 + }, + "features_empty": 10, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 1, + "limits.output": 2, + "pricing": 0, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "ideogram": { + "models": 4, + "statuses": { + "active": 4 + }, + "null_fields": { + "limits.context": 4, + "limits.input": 4, + "limits.output": 4, + "pricing": 0, + "reasoning.supported": 4, + "info.release_date": 2, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 4, + "output": 0, + "cache_read": 4, + "cache_write": 4 + }, + "features_empty": 4, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 4, + "limits.input": 4, + "limits.output": 4, + "pricing": 0, + "reasoning.supported": 4, + "info.release_date": 2, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "iflytek": { + "models": 9, + "statuses": { + "active": 9 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 4, + "limits.output": 5, + "pricing": 5, + "reasoning.supported": 7, + "info.release_date": 6, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 4, + "cache_write": 4 + }, + "features_empty": 4, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 5, + "limits.input": 4, + "limits.output": 5, + "pricing": 5, + "reasoning.supported": 7, + "info.release_date": 6, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "inception": { + "models": 3, + "statuses": { + "active": 3 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 3, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 1, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 3 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 3, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 1, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "jina": { + "models": 16, + "statuses": { + "active": 14, + "deprecated": 2 + }, + "null_fields": { + "limits.context": 1, + "limits.input": 6, + "limits.output": 15, + "pricing": 0, + "reasoning.supported": 16, + "info.release_date": 0, + "info.knowledge_cutoff": 16, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 15, + "cache_read": 16, + "cache_write": 16 + }, + "features_empty": 13, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 1, + "limits.input": 6, + "limits.output": 15, + "pricing": 0, + "reasoning.supported": 16, + "info.release_date": 0, + "info.knowledge_cutoff": 16, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "kuaishou": { + "models": 19, + "statuses": { + "active": 9, + "retired": 10 + }, + "null_fields": { + "limits.context": 19, + "limits.input": 19, + "limits.output": 19, + "pricing": 12, + "reasoning.supported": 18, + "info.release_date": 5, + "info.knowledge_cutoff": 19, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 6, + "output": 0, + "cache_read": 6, + "cache_write": 7 + }, + "features_empty": 18, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 9, + "limits.input": 9, + "limits.output": 9, + "pricing": 2, + "reasoning.supported": 8, + "info.release_date": 0, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "leonardo": { + "models": 2, + "statuses": { + "active": 2 + }, + "null_fields": { + "limits.context": 2, + "limits.input": 2, + "limits.output": 2, + "pricing": 2, + "reasoning.supported": 2, + "info.release_date": 1, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 2, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 2, + "limits.input": 2, + "limits.output": 2, + "pricing": 2, + "reasoning.supported": 2, + "info.release_date": 1, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "lightricks": { + "models": 6, + "statuses": { + "active": 4, + "retired": 2 + }, + "null_fields": { + "limits.context": 6, + "limits.input": 6, + "limits.output": 6, + "pricing": 2, + "reasoning.supported": 6, + "info.release_date": 2, + "info.knowledge_cutoff": 6, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 4, + "output": 0, + "cache_read": 4, + "cache_write": 4 + }, + "features_empty": 6, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 4, + "limits.input": 4, + "limits.output": 4, + "pricing": 0, + "reasoning.supported": 4, + "info.release_date": 0, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "luma": { + "models": 3, + "statuses": { + "active": 3 + }, + "null_fields": { + "limits.context": 3, + "limits.input": 3, + "limits.output": 3, + "pricing": 0, + "reasoning.supported": 3, + "info.release_date": 2, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 3, + "output": 0, + "cache_read": 3, + "cache_write": 3 + }, + "features_empty": 3, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 3, + "limits.input": 3, + "limits.output": 3, + "pricing": 0, + "reasoning.supported": 3, + "info.release_date": 2, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "meituan": { + "models": 7, + "statuses": { + "preview": 1, + "active": 1, + "retired": 5 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 7, + "limits.output": 5, + "pricing": 6, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 1 + }, + "features_empty": 5, + "reasoning_true_efforts_empty": 4, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 2, + "limits.output": 0, + "pricing": 1, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "meta": { + "models": 8, + "statuses": { + "active": 8 + }, + "null_fields": { + "limits.context": 3, + "limits.input": 8, + "limits.output": 8, + "pricing": 1, + "reasoning.supported": 3, + "info.release_date": 2, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 1, + "output": 1, + "cache_read": 2, + "cache_write": 7 + }, + "features_empty": 1, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 3, + "limits.input": 8, + "limits.output": 8, + "pricing": 1, + "reasoning.supported": 3, + "info.release_date": 2, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "microsoft": { + "models": 9, + "statuses": { + "preview": 9 + }, + "null_fields": { + "limits.context": 4, + "limits.input": 9, + "limits.output": 9, + "pricing": 3, + "reasoning.supported": 9, + "info.release_date": 0, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 3, + "cache_read": 6, + "cache_write": 6 + }, + "features_empty": 9, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 4, + "limits.input": 9, + "limits.output": 9, + "pricing": 3, + "reasoning.supported": 9, + "info.release_date": 0, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "minimax": { + "models": 22, + "statuses": { + "active": 19, + "retired": 3 + }, + "null_fields": { + "limits.context": 14, + "limits.input": 22, + "limits.output": 14, + "pricing": 3, + "reasoning.supported": 3, + "info.release_date": 5, + "info.knowledge_cutoff": 22, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 5, + "output": 6, + "cache_read": 11, + "cache_write": 12 + }, + "features_empty": 10, + "reasoning_true_efforts_empty": 8, + "callable_null_fields": { + "limits.context": 11, + "limits.input": 19, + "limits.output": 11, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 2, + "info.knowledge_cutoff": 19, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "mistral": { + "models": 59, + "statuses": { + "preview": 1, + "active": 16, + "retired": 42 + }, + "null_fields": { + "limits.context": 8, + "limits.input": 59, + "limits.output": 58, + "pricing": 14, + "reasoning.supported": 50, + "info.release_date": 0, + "info.knowledge_cutoff": 59, + "info.description": 5, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 10, + "cache_read": 37, + "cache_write": 45 + }, + "features_empty": 14, + "reasoning_true_efforts_empty": 6, + "callable_null_fields": { + "limits.context": 5, + "limits.input": 17, + "limits.output": 17, + "pricing": 1, + "reasoning.supported": 14, + "info.release_date": 0, + "info.knowledge_cutoff": 17, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "mixedbread": { + "models": 2, + "statuses": { + "active": 2 + }, + "null_fields": { + "limits.context": 2, + "limits.input": 2, + "limits.output": 2, + "pricing": 2, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 2, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 2, + "limits.input": 2, + "limits.output": 2, + "pricing": 2, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "moonshot": { + "models": 19, + "statuses": { + "active": 4, + "retired": 15 + }, + "null_fields": { + "limits.context": 2, + "limits.input": 19, + "limits.output": 18, + "pricing": 15, + "reasoning.supported": 11, + "info.release_date": 2, + "info.knowledge_cutoff": 19, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 3 + }, + "features_empty": 7, + "reasoning_true_efforts_empty": 7, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 4, + "limits.output": 3, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 1, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "naver": { + "models": 3, + "statuses": { + "active": 3 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 0, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 3, + "cache_write": 3 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 0, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "nomic": { + "models": 2, + "statuses": { + "active": 2 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 2, + "limits.output": 2, + "pricing": 2, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 2, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 2, + "limits.output": 2, + "pricing": 2, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "nvidia": { + "models": 22, + "statuses": { + "preview": 1, + "active": 20, + "deprecated": 1 + }, + "null_fields": { + "limits.context": 11, + "limits.input": 20, + "limits.output": 16, + "pricing": 22, + "reasoning.supported": 16, + "info.release_date": 7, + "info.knowledge_cutoff": 22, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 18, + "reasoning_true_efforts_empty": 5, + "callable_null_fields": { + "limits.context": 11, + "limits.input": 20, + "limits.output": 16, + "pricing": 22, + "reasoning.supported": 16, + "info.release_date": 7, + "info.knowledge_cutoff": 22, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "openai": { + "models": 118, + "statuses": { + "active": 44, + "deprecated": 25, + "retired": 49 + }, + "null_fields": { + "limits.context": 41, + "limits.input": 97, + "limits.output": 38, + "pricing": 15, + "reasoning.supported": 72, + "info.release_date": 17, + "info.knowledge_cutoff": 35, + "info.description": 17, + "info.docs": 16, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 4, + "output": 12, + "cache_read": 53, + "cache_write": 96 + }, + "features_empty": 33, + "reasoning_true_efforts_empty": 22, + "callable_null_fields": { + "limits.context": 18, + "limits.input": 50, + "limits.output": 18, + "pricing": 9, + "reasoning.supported": 34, + "info.release_date": 2, + "info.knowledge_cutoff": 15, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "perplexity": { + "models": 19, + "statuses": { + "active": 4, + "deprecated": 4, + "retired": 11 + }, + "null_fields": { + "limits.context": 8, + "limits.input": 19, + "limits.output": 19, + "pricing": 10, + "reasoning.supported": 18, + "info.release_date": 13, + "info.knowledge_cutoff": 19, + "info.description": 11, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 4, + "cache_read": 9, + "cache_write": 9 + }, + "features_empty": 15, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 4, + "limits.input": 8, + "limits.output": 8, + "pricing": 0, + "reasoning.supported": 8, + "info.release_date": 2, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "pfn": { + "models": 1, + "statuses": { + "active": 1 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 1, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 1, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 1, + "cache_write": 1 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 1, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 1, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "pixverse": { + "models": 5, + "statuses": { + "active": 5 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 5, + "limits.output": 5, + "pricing": 5, + "reasoning.supported": 5, + "info.release_date": 0, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 5, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 5, + "limits.input": 5, + "limits.output": 5, + "pricing": 5, + "reasoning.supported": 5, + "info.release_date": 0, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "recraft": { + "models": 21, + "statuses": { + "active": 21 + }, + "null_fields": { + "limits.context": 21, + "limits.input": 21, + "limits.output": 21, + "pricing": 0, + "reasoning.supported": 21, + "info.release_date": 11, + "info.knowledge_cutoff": 21, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 21, + "output": 0, + "cache_read": 21, + "cache_write": 21 + }, + "features_empty": 21, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 21, + "limits.input": 21, + "limits.output": 21, + "pricing": 0, + "reasoning.supported": 21, + "info.release_date": 11, + "info.knowledge_cutoff": 21, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "reka": { + "models": 2, + "statuses": { + "active": 2 + }, + "null_fields": { + "limits.context": 1, + "limits.input": 2, + "limits.output": 1, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 2, + "cache_write": 2 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 1, + "limits.input": 2, + "limits.output": 1, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 2, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "runway": { + "models": 9, + "statuses": { + "active": 7, + "retired": 2 + }, + "null_fields": { + "limits.context": 9, + "limits.input": 9, + "limits.output": 9, + "pricing": 1, + "reasoning.supported": 9, + "info.release_date": 3, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 8, + "output": 0, + "cache_read": 8, + "cache_write": 8 + }, + "features_empty": 9, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 7, + "limits.input": 7, + "limits.output": 7, + "pricing": 1, + "reasoning.supported": 7, + "info.release_date": 2, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "sakana": { + "models": 1, + "statuses": { + "active": 1 + }, + "null_fields": { + "limits.context": 1, + "limits.input": 1, + "limits.output": 1, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 1, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 1 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 1, + "limits.input": 1, + "limits.output": 1, + "pricing": 0, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 1, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "sarvam": { + "models": 10, + "statuses": { + "active": 9, + "retired": 1 + }, + "null_fields": { + "limits.context": 7, + "limits.input": 10, + "limits.output": 10, + "pricing": 3, + "reasoning.supported": 8, + "info.release_date": 6, + "info.knowledge_cutoff": 10, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 5, + "cache_read": 5, + "cache_write": 7 + }, + "features_empty": 8, + "reasoning_true_efforts_empty": 2, + "callable_null_fields": { + "limits.context": 7, + "limits.input": 9, + "limits.output": 9, + "pricing": 2, + "reasoning.supported": 8, + "info.release_date": 5, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "sensetime": { + "models": 21, + "statuses": { + "preview": 1, + "active": 20 + }, + "null_fields": { + "limits.context": 21, + "limits.input": 21, + "limits.output": 21, + "pricing": 1, + "reasoning.supported": 20, + "info.release_date": 20, + "info.knowledge_cutoff": 21, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 5, + "output": 11, + "cache_read": 20, + "cache_write": 20 + }, + "features_empty": 12, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 21, + "limits.input": 21, + "limits.output": 21, + "pricing": 1, + "reasoning.supported": 20, + "info.release_date": 20, + "info.knowledge_cutoff": 21, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "shengshu": { + "models": 12, + "statuses": { + "active": 12 + }, + "null_fields": { + "limits.context": 12, + "limits.input": 12, + "limits.output": 12, + "pricing": 12, + "reasoning.supported": 12, + "info.release_date": 6, + "info.knowledge_cutoff": 12, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 12, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 12, + "limits.input": 12, + "limits.output": 12, + "pricing": 12, + "reasoning.supported": 12, + "info.release_date": 6, + "info.knowledge_cutoff": 12, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "shlab": { + "models": 7, + "statuses": { + "active": 6, + "deprecated": 1 + }, + "null_fields": { + "limits.context": 3, + "limits.input": 7, + "limits.output": 7, + "pricing": 7, + "reasoning.supported": 1, + "info.release_date": 0, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 6, + "callable_null_fields": { + "limits.context": 3, + "limits.input": 7, + "limits.output": 7, + "pricing": 7, + "reasoning.supported": 1, + "info.release_date": 0, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "soniox": { + "models": 3, + "statuses": { + "active": 3 + }, + "null_fields": { + "limits.context": 3, + "limits.input": 3, + "limits.output": 3, + "pricing": 0, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 3, + "cache_write": 3 + }, + "features_empty": 3, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 3, + "limits.input": 3, + "limits.output": 3, + "pricing": 0, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "speechmatics": { + "models": 5, + "statuses": { + "active": 5 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 5, + "limits.output": 5, + "pricing": 0, + "reasoning.supported": 5, + "info.release_date": 3, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 5, + "cache_read": 5, + "cache_write": 5 + }, + "features_empty": 5, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 5, + "limits.input": 5, + "limits.output": 5, + "pricing": 0, + "reasoning.supported": 5, + "info.release_date": 3, + "info.knowledge_cutoff": 5, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "stability": { + "models": 8, + "statuses": { + "active": 8 + }, + "null_fields": { + "limits.context": 8, + "limits.input": 8, + "limits.output": 8, + "pricing": 0, + "reasoning.supported": 8, + "info.release_date": 1, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 8, + "output": 0, + "cache_read": 8, + "cache_write": 8 + }, + "features_empty": 8, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 8, + "limits.input": 8, + "limits.output": 8, + "pricing": 0, + "reasoning.supported": 8, + "info.release_date": 1, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "stepfun": { + "models": 37, + "statuses": { + "preview": 5, + "active": 20, + "retired": 12 + }, + "null_fields": { + "limits.context": 26, + "limits.input": 36, + "limits.output": 36, + "pricing": 6, + "reasoning.supported": 31, + "info.release_date": 31, + "info.knowledge_cutoff": 37, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 2, + "output": 11, + "cache_read": 13, + "cache_write": 31 + }, + "features_empty": 29, + "reasoning_true_efforts_empty": 2, + "callable_null_fields": { + "limits.context": 20, + "limits.input": 24, + "limits.output": 24, + "pricing": 4, + "reasoning.supported": 20, + "info.release_date": 20, + "info.knowledge_cutoff": 25, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "tencent": { + "models": 34, + "statuses": { + "preview": 3, + "active": 16, + "retired": 15 + }, + "null_fields": { + "limits.context": 24, + "limits.input": 20, + "limits.output": 20, + "pricing": 3, + "reasoning.supported": 24, + "info.release_date": 11, + "info.knowledge_cutoff": 34, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 3, + "output": 2, + "cache_read": 29, + "cache_write": 31 + }, + "features_empty": 28, + "reasoning_true_efforts_empty": 6, + "callable_null_fields": { + "limits.context": 9, + "limits.input": 5, + "limits.output": 5, + "pricing": 0, + "reasoning.supported": 11, + "info.release_date": 9, + "info.knowledge_cutoff": 19, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "twelvelabs": { + "models": 7, + "statuses": { + "active": 4, + "retired": 3 + }, + "null_fields": { + "limits.context": 5, + "limits.input": 7, + "limits.output": 6, + "pricing": 7, + "reasoning.supported": 7, + "info.release_date": 0, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 5, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 2, + "limits.input": 4, + "limits.output": 3, + "pricing": 4, + "reasoning.supported": 4, + "info.release_date": 0, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "typhoon": { + "models": 4, + "statuses": { + "active": 4 + }, + "null_fields": { + "limits.context": 4, + "limits.input": 4, + "limits.output": 4, + "pricing": 4, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 0, + "cache_write": 0 + }, + "features_empty": 2, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 4, + "limits.input": 4, + "limits.output": 4, + "pricing": 4, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 4, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "upstage": { + "models": 13, + "statuses": { + "active": 9, + "deprecated": 3, + "retired": 1 + }, + "null_fields": { + "limits.context": 9, + "limits.input": 13, + "limits.output": 13, + "pricing": 2, + "reasoning.supported": 7, + "info.release_date": 0, + "info.knowledge_cutoff": 8, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 6, + "cache_read": 7, + "cache_write": 11 + }, + "features_empty": 7, + "reasoning_true_efforts_empty": 2, + "callable_null_fields": { + "limits.context": 8, + "limits.input": 12, + "limits.output": 12, + "pricing": 1, + "reasoning.supported": 7, + "info.release_date": 0, + "info.knowledge_cutoff": 7, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "voyage": { + "models": 18, + "statuses": { + "active": 18 + }, + "null_fields": { + "limits.context": 0, + "limits.input": 18, + "limits.output": 18, + "pricing": 2, + "reasoning.supported": 18, + "info.release_date": 0, + "info.knowledge_cutoff": 18, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 16, + "cache_read": 16, + "cache_write": 16 + }, + "features_empty": 18, + "reasoning_true_efforts_empty": 0, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 18, + "limits.output": 18, + "pricing": 2, + "reasoning.supported": 18, + "info.release_date": 0, + "info.knowledge_cutoff": 18, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "writer": { + "models": 3, + "statuses": { + "active": 1, + "deprecated": 2 + }, + "null_fields": { + "limits.context": 1, + "limits.input": 3, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 0, + "cache_read": 3, + "cache_write": 3 + }, + "features_empty": 0, + "reasoning_true_efforts_empty": 1, + "callable_null_fields": { + "limits.context": 1, + "limits.input": 3, + "limits.output": 0, + "pricing": 0, + "reasoning.supported": 2, + "info.release_date": 0, + "info.knowledge_cutoff": 3, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "xai": { + "models": 23, + "statuses": { + "active": 15, + "deprecated": 1, + "retired": 7 + }, + "null_fields": { + "limits.context": 9, + "limits.input": 23, + "limits.output": 23, + "pricing": 2, + "reasoning.supported": 9, + "info.release_date": 6, + "info.knowledge_cutoff": 22, + "info.description": 7, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 6, + "output": 1, + "cache_read": 7, + "cache_write": 21 + }, + "features_empty": 2, + "reasoning_true_efforts_empty": 6, + "callable_null_fields": { + "limits.context": 8, + "limits.input": 16, + "limits.output": 16, + "pricing": 1, + "reasoning.supported": 8, + "info.release_date": 5, + "info.knowledge_cutoff": 15, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "xiaomi": { + "models": 12, + "statuses": { + "active": 7, + "deprecated": 2, + "retired": 3 + }, + "null_fields": { + "limits.context": 3, + "limits.input": 12, + "limits.output": 3, + "pricing": 4, + "reasoning.supported": 3, + "info.release_date": 0, + "info.knowledge_cutoff": 12, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 0, + "output": 1, + "cache_read": 2, + "cache_write": 8 + }, + "features_empty": 3, + "reasoning_true_efforts_empty": 5, + "callable_null_fields": { + "limits.context": 0, + "limits.input": 9, + "limits.output": 0, + "pricing": 3, + "reasoning.supported": 0, + "info.release_date": 0, + "info.knowledge_cutoff": 9, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + }, + "zhipu": { + "models": 48, + "statuses": { + "active": 40, + "deprecated": 2, + "retired": 6 + }, + "null_fields": { + "limits.context": 14, + "limits.input": 48, + "limits.output": 18, + "pricing": 3, + "reasoning.supported": 22, + "info.release_date": 22, + "info.knowledge_cutoff": 48, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + }, + "pricing_components_null_when_priced": { + "input": 6, + "output": 5, + "cache_read": 23, + "cache_write": 45 + }, + "features_empty": 22, + "reasoning_true_efforts_empty": 25, + "callable_null_fields": { + "limits.context": 13, + "limits.input": 42, + "limits.output": 17, + "pricing": 2, + "reasoning.supported": 21, + "info.release_date": 19, + "info.knowledge_cutoff": 42, + "info.description": 0, + "info.docs": 0, + "info.verified_at": 0 + } + } + } +} diff --git a/docs/audits/pr8-review-2026-10-15.json b/docs/audits/pr8-review-2026-10-15.json new file mode 100644 index 00000000..db0bb30c --- /dev/null +++ b/docs/audits/pr8-review-2026-10-15.json @@ -0,0 +1,32 @@ +{ + "verified_at": "2026-10-15", + "scope": "Review corrections for PR #8; model records remain the source of truth.", + "findings": [ + { + "model": "grok-voice-3.0", + "field": "info.release_date", + "value": "2026-10-14", + "source": "https://x.ai/news/grok-voice-3", + "note": "Dated launch announcement explicitly says API available today. Mixed minute/message pricing remains null." + }, + { + "model": "ultramarine-1-flash", + "field": "providers[].modalities", + "note": "Responses explicitly rejects images; Chat Completions and Messages support images. Separate provider records preserve the protocol-specific restriction.", + "source": "https://docs.paperinstruments.com/docs/ultramarine/responses" + }, + { + "model": "step-5-preview", + "field": "limits.output", + "value": null, + "note": "The model card says 64k. An unlimited default max_tokens parameter does not negate the model limit. The repository requires exact figures for StepFun and no explicit 64000/65536 value was confirmed, so retain null without claiming contradictory limits.", + "source": "https://platform.stepfun.com/docs/zh/guides/models/step-5-preview" + }, + { + "model": "step-5-preview", + "field": "pricing", + "note": "Chinese standard price is CNY 7 input, 0.70 cache read and 20 output per million tokens; provider uses api.stepfun.com. Grandfathered discounts and international USD prices are not substituted.", + "source": "https://platform.stepfun.com/docs/zh/guides/pricing/details" + } + ] +} diff --git a/docs/development.md b/docs/development.md index eef044a1..0c0eb03d 100644 --- a/docs/development.md +++ b/docs/development.md @@ -15,6 +15,8 @@ | `pnpm preview` | 构建后用 wrangler 按 Cloudflare 规则本地预览(`_headers`、`_redirects` 生效),http://localhost:8787 | | `pnpm deploy` | 构建并发布到 Cloudflare,见 [deployment.md](deployment.md) | | `node scripts/validate-data.mjs [文件...]` | 只校验数据文件,适合批量编辑数据时快速自检 | +| `pnpm test` | 运行 `scripts/*.test.mjs`,含 `check-official.test.mjs` | +| `node scripts/check-official.mjs [文件...]` | 检查官方域名来源、日期时效、价格与上下文范围。`--cross` 与第三方对照,只打印差异 | ## 目录 @@ -32,7 +34,7 @@ src/components/ 顶栏、页脚、字墙、搜索、分区、列表行 src/scripts/ 客户端脚本:主题、快捷键、复制、比较选择(compare-store.ts,localStorage) src/styles/ tokens.css(设计 token)、base、utilities、motion public/ _headers(CORS、缓存)、_redirects(/v1/models 重写) -scripts/ check-design.mjs(设计约束)、validate-data.mjs(数据校验) +scripts/ check-design.mjs(设计约束)、validate-data.mjs(数据校验)、check-official.mjs(官方来源与范围) ``` ## 代码边界 diff --git a/docs/maintenance.md b/docs/maintenance.md index e716ffbc..f47517a5 100644 --- a/docs/maintenance.md +++ b/docs/maintenance.md @@ -37,6 +37,7 @@ | 1K = 1000 | OpenAI、Anthropic、xAI、Amazon、Cohere(对话与向量;重排模型文档写明 4096) | | 按模型给出精确数字 | 阿里、MiniMax、阶跃、Meta | +- **思考支持**:`reasoning.supported` 只有官方明确说明支持或不支持时才写 `true` / `false`;模型页未出现 reasoning、未列推理参数,不能据此把未知值改为 `false`。 - **思考等级**:`reasoning.efforts` 只写 API 可传的确切取值;只有开关或 Token 预算时为空数组。 - **能力**:`features` 只列文档明确支持的能力;未写明的不列。 - **协议差异**:只有官方明确列出的模型才标注 Responses 支持,不能从同系列其他模型外推。Google Interactions 使用 `interactions`,不标成 `responses`。同一 provider 的思考参数按协议不同时可用 `reasoning_params` 分别登记。 @@ -49,6 +50,17 @@ - 译文只翻译原文,不增删信息、不加评价;专有名词、模型名、产品名、单位保持原样。原文是哪种语言,就不为该语言写译文。 - 原文更新时同步更新或删除译文;`info.description` 为 `null` 时不写译文。 +## 官方来源检查 + +`node scripts/check-official.mjs [文件...]` 在 `validate-data.mjs` 之外再检查四件事,不改数据: + +1. **官方域名**:除标题含 `api.sdk only` 的 SDK 来源,以及 `models.dev`、`ai-sdk.dev` 外,至少一条 `sources` 的主机名属于该厂商。允许的主机来自 `data/vendors/.json` 的官网,以及脚本里的文档站补充表(如 `ai.google.dev`、`docs.mistral.ai`)。官网主机升到注册域时,`com.cn`、`co.jp`、`github.io` 这类公共后缀会再向前取一段,不会把整个后缀放行。`web.archive.org` 只在被存档的原地址属于这些主机时算数。 +2. **日期**:`sources[].retrieved_at` 必须是真实的 `YYYY-MM-DD`;`info.verified_at` 同样,或为 `null`。比 UTC 当天晚超过 1 天则失败;晚 1 天仍通过,避免 UTC+8 早晨把本地今天判成未来。早于 `--max-age` 天(默认 180)只警告;加上 `--strict` 时警告也失败。`--max-age` 不是非负整数时直接退出。 +3. **数值范围**:价格不为负,币种为三个大写字母,单位属于接口规范中的计价单位,`limits.input` 与 `limits.output` 不超过 `limits.context`。 +4. **必填字段**:公开字段和维护字段 `aliases`、`sources`、`providers` 必须存在。字段顺序和枚举仍由 `validate-data.mjs` 把关。 + +`node scripts/check-official.mjs --cross [--report 路径]` 会下载 models.dev、OpenRouter 和 LiteLLM,按厂商前缀加模型 ID 或别名匹配后写出差异。同名键保留先写入的记录。价格只比较相同币种和单位:这三个目录读取的是 USD / `1M_tokens`,本地人民币、字符、分钟、页等报价跳过价格比较,但仍核对 Token 上下限;不做汇率或跨单位换算。LiteLLM 的 `max_tokens` 对照 `limits.context`,`max_input_tokens` 只对照 `limits.input`。它只提示 1000/1024、折扣价和图像/文本计价口径可能不同,不自动改 JSON。网络失败时退出码为 2。`pnpm test` 会执行 `scripts/*.test.mjs`,其中包括 `scripts/check-official.test.mjs`。 + ## 批量采集 大批量补录时按模型厂商拆分并行处理,每组只写自己模型厂商的文件,用 `scripts/validate-data.mjs` 自检,最后统一运行 `pnpm check && pnpm build`,并人工抽查各组标注的推断值与空缺项。 @@ -57,7 +69,7 @@ 部分模型的发布日期、知识截止、思考等级与价格官方未公布,当前为 `null`。可在各模型详情页查看具体字段,官方更新后按上述流程补录。 -运行 `node scripts/audit-data.mjs` 输出全库及各厂商的字段空缺、状态统计和待核验 ID 清单(JSON)。这是本地完整性清单,空值可能不适用或官方未公布,不能当作错误率,也不能当作已完成官方全量核验的证明。`deprecated` 仍可调用,统计时与 `retired` 分开。 +运行 `node scripts/audit-data.mjs` 输出全库及各厂商的字段空缺、状态统计和待核验 ID 清单(JSON)。`node scripts/completeness.mjs` 在此基础上按厂商列出 limits、pricing 各分项、reasoning、features、info 与 sources 的空缺;`--vendor`、`--ids`、`--markdown` 可缩小范围或改成表格。这是本地完整性清单,空值可能不适用或官方未公布,不能当作错误率,也不能当作已完成官方全量核验的证明。`deprecated` 仍可调用,统计时与 `retired` 分开。 本轮价格与发布日期补录见 [2026-10-11 逐型号核验记录](audits/pricing-release-2026-10-11.json):记录补录前后数值、剩余缺项、原因与官方资料入口。该记录是当日快照;后续维护以 `data/models/` 为准。历史存档价格仅代表对应快照,不表示已下线模型仍可购买。已检索未找到、资料获取失败与官方明确未公布须区分,不能将空值统一描述为“官方未公布”。 diff --git a/package.json b/package.json index b9aec0ea..76f87314 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build": "astro build", "preview": "astro build && wrangler dev", "check": "astro check && node scripts/check-design.mjs", + "check:official": "node scripts/check-official.mjs", "deploy": "astro build && wrangler deploy" }, "packageManager": "pnpm@11.19.0", diff --git a/scripts/check-official.mjs b/scripts/check-official.mjs new file mode 100644 index 00000000..73c4760f --- /dev/null +++ b/scripts/check-official.mjs @@ -0,0 +1,484 @@ +#!/usr/bin/env node +/** + * 检查模型来源是否落在厂商官方域名上,以及日期、价格和上下限是否合法。 + * 不修改 data/models。schema 与字段顺序仍以 scripts/validate-data.mjs 和构建时的 zod 为准。 + * + * 用法: + * node scripts/check-official.mjs [--strict] [--max-age 180] [文件...] + * node scripts/check-official.mjs --cross [--report 路径] + * + * 退出码 1:缺官方域名来源、日期非法或比 UTC 今天晚超过 1 天、价格为负、币种或单位非法、 + * 上下文小于输入或输出上限,或 --max-age 不是非负整数。 + * 警告默认不失败:verified_at 或 retrieved_at 早于 --max-age 天(默认 180)。 + * --strict 把警告也当作失败。日期比 UTC 今天晚 1 天仍通过,避免 UTC+8 早晨把本地今天判成未来。 + * + * --cross 下载 models.dev、OpenRouter、LiteLLM,按厂商前缀加模型 ID 或别名匹配后打印差异。 + * 同名键不覆盖。LiteLLM 的 max_input_tokens 只和 limits.input 比较,不当作上下文。 + * 差异只作提示,不改数据,也不因此失败。网络失败时退出码为 2。 + */ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '..'); +const MODEL_DIR = path.join(ROOT, 'data', 'models'); +const VENDOR_DIR = path.join(ROOT, 'data', 'vendors'); +const DATE = /^\d{4}-\d{2}-\d{2}$/; +const UNITS = new Set(['1M_tokens', '1M_characters', 'image', 'second', 'minute', 'hour', 'request', 'page']); +const REQUIRED = ['id', 'object', 'created', 'owned_by', 'name', 'api', 'limits', 'modalities', 'reasoning', 'pricing', 'features', 'info', 'aliases', 'sources', 'providers']; + +/** + * 厂商官网主机之外、文档实际所在的域名。 + * 只收录该厂商自己的文档站,不把聚合站算进来。 + */ +export const EXTRA_HOSTS = { + aisingapore: ['sea-lion.ai'], + alibaba: ['alibabacloud.com', 'aliyun.com', 'aliyuncs.com', 'qwenlm.github.io'], + amazon: ['amazonaws.com', 'amazon.com'], + anthropic: ['anthropic.com', 'claude.com'], + baidu: ['baidu.com'], + bytedance: ['volcengine.com', 'byteplus.com', 'doubao.com'], + cohere: ['cohere.com', 'cohere.ai'], + deepseek: ['deepseek.com'], + google: ['google.dev', 'google.com', 'deepmind.google', 'deepmind.com'], + iflytek: ['xfyun.cn', 'iflytek.com'], + inception: ['inceptionlabs.ai'], + kuaishou: ['kling.ai', 'streamlake.com'], + lightricks: ['ltx.io'], + meta: ['meta.com', 'meta.ai'], + minimax: ['minimax.io', 'minimaxi.com'], + mistral: ['mistral.ai'], + moonshot: ['moonshot.ai', 'moonshot.cn', 'kimi.ai', 'kimi.com'], + naver: ['ncloud.com', 'ncloud-docs.com'], + openai: ['openai.com'], + perplexity: ['perplexity.ai'], + sakana: ['sakana.ai'], + sensetime: ['sensetime.com', 'senseaudio.cn', 'sensenova.cn'], + stepfun: ['stepfun.com', 'stepfun.ai'], + tencent: ['tencent.com', 'tencentcloud.com', 'qq.com'], + upstage: ['upstage.ai'], + xai: ['x.ai'], + xiaomi: ['mi.com', 'xiaomi.com'], + zhipu: ['z.ai', 'bigmodel.cn'], +}; + +/** 多段公共后缀。不能把后缀本身当成可继承的厂商域名。 */ +const PUBLIC_SUFFIXES = [ + 'com.cn', 'net.cn', 'org.cn', 'gov.cn', 'ac.cn', + 'co.jp', 'ne.jp', 'or.jp', 'ac.jp', + 'co.uk', 'org.uk', 'ac.uk', 'gov.uk', + 'com.au', 'net.au', 'org.au', + 'co.kr', 'ne.kr', 'or.kr', + 'com.tw', 'com.hk', 'com.sg', 'co.za', 'com.br', + 'github.io', +]; + +export function todayUtc(now = new Date()) { + return now.toISOString().slice(0, 10); +} + +/** UTC 日历日加减天数。YYYY-MM-DD 字符串比较与时间顺序一致。 */ +export function shiftDate(iso, days) { + const date = parseDay(iso); + if (!date) return ''; + date.setUTCDate(date.getUTCDate() + days); + return date.toISOString().slice(0, 10); +} + +export function hostOf(url) { + try { + return new URL(url).hostname.replace(/^www\./, '').toLowerCase(); + } catch { + return ''; + } +} + +/** archive.org 快照还原成被存档的地址;其他 URL 原样返回。 */ +export function unwrapArchive(url) { + const host = hostOf(url); + if (host !== 'web.archive.org') return url; + const match = String(url).match(/\/web\/\d+(?:id_)?\/(https?:\/\/\S+)$/i); + return match ? match[1] : url; +} + +export function isPublicSuffix(host) { + return PUBLIC_SUFFIXES.includes(host); +} + +/** 注册域:普通域名取最后两段;公共后缀再向前取一段。后缀本身不返回。 */ +export function registrableDomain(host) { + if (!host || isPublicSuffix(host)) return ''; + for (const suffix of PUBLIC_SUFFIXES) { + if (host.endsWith(`.${suffix}`)) { + const name = host.slice(0, -(suffix.length + 1)).split('.').pop(); + return name ? `${name}.${suffix}` : ''; + } + } + const labels = host.split('.'); + return labels.length >= 2 ? labels.slice(-2).join('.') : host; +} + +export function vendorHosts(vendorUrl, ownedBy) { + const hosts = new Set(EXTRA_HOSTS[ownedBy] ?? []); + const host = hostOf(vendorUrl); + if (host && !isPublicSuffix(host)) hosts.add(host); + const domain = registrableDomain(host); + if (domain) hosts.add(domain); + return hosts; +} + +export function hostMatches(url, hosts) { + const host = hostOf(unwrapArchive(url)); + if (!host) return false; + for (const allowed of hosts) { + if (host === allowed || host.endsWith(`.${allowed}`)) return true; + } + return false; +} + +export function isSdkOnlySource(source) { + const title = source?.title ?? ''; + const url = source?.url ?? ''; + if (/api\.sdk only/i.test(title)) return true; + const host = hostOf(url); + return host === 'models.dev' || host === 'ai-sdk.dev'; +} + +function parseDay(value) { + if (typeof value !== 'string' || !DATE.test(value)) return null; + const [year, month, day] = value.split('-').map(Number); + const date = new Date(Date.UTC(year, month - 1, day)); + if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month - 1 || date.getUTCDate() !== day) return null; + return date; +} + +function ageDays(value, today) { + const then = parseDay(value); + const now = parseDay(today); + if (!then || !now) return null; + return Math.round((now.getTime() - then.getTime()) / 86400000); +} + +function priceOk(value) { + return value === null || (typeof value === 'number' && Number.isFinite(value) && value >= 0); +} + +/** + * @returns {{ errors: string[], warnings: string[] }} + */ +export function checkModel(model, vendorUrl, options = {}) { + const today = options.today ?? todayUtc(); + const maxAge = options.maxAgeDays ?? 180; + const errors = []; + const warnings = []; + const error = (message) => errors.push(message); + const warn = (message) => warnings.push(message); + + for (const key of REQUIRED) { + if (!(key in (model ?? {}))) error(`缺少必填字段 ${key}`); + } + if (!model || typeof model !== 'object') return { errors, warnings }; + + const limits = model.limits ?? {}; + for (const key of ['context', 'input', 'output']) { + const value = limits[key]; + if (!(value === null || (Number.isInteger(value) && value > 0))) error(`limits.${key} 须为正整数或 null`); + } + if (limits.context != null) { + for (const key of ['input', 'output']) { + if (limits[key] != null && limits[key] > limits.context) error(`limits.${key} 不能大于 limits.context`); + } + } + + const pricing = model.pricing; + if (pricing !== null && pricing !== undefined) { + if (!/^[A-Z]{3}$/.test(pricing.currency ?? '')) error('pricing.currency 须为 ISO 4217 三字母代码'); + if (!UNITS.has(pricing.unit)) error(`pricing.unit 须为 ${[...UNITS].join('|')}`); + for (const key of ['input', 'output', 'cache_read', 'cache_write']) { + if (!priceOk(pricing[key])) error(`pricing.${key} 须为非负数或 null`); + } + } + + const verified = model.info?.verified_at; + if (!(verified === null || verified === undefined || parseDay(verified))) error('info.verified_at 须为合法的 YYYY-MM-DD 或 null'); + if (parseDay(verified)) { + const age = ageDays(verified, today); + const horizon = shiftDate(today, 1); + if (horizon && verified > horizon) error(`info.verified_at ${verified} 晚于 ${today}`); + else if (age > maxAge) warn(`info.verified_at ${verified} 已超过 ${maxAge} 天`); + } + + const sources = Array.isArray(model.sources) ? model.sources : []; + if (!sources.length) error('sources 至少一条'); + const hosts = vendorHosts(vendorUrl, model.owned_by); + let official = 0; + for (const [index, source] of sources.entries()) { + if (!source?.url?.startsWith('https://')) error(`sources[${index}].url 须为 https`); + if (!parseDay(source?.retrieved_at)) error(`sources[${index}].retrieved_at 须为合法的 YYYY-MM-DD`); + else { + const age = ageDays(source.retrieved_at, today); + const horizon = shiftDate(today, 1); + if (horizon && source.retrieved_at > horizon) error(`sources[${index}].retrieved_at ${source.retrieved_at} 晚于 ${today}`); + else if (age > maxAge) warn(`sources[${index}].retrieved_at ${source.retrieved_at} 已超过 ${maxAge} 天`); + } + if (!isSdkOnlySource(source) && hostMatches(source?.url, hosts)) official += 1; + } + if (sources.length && official === 0) { + error(`sources 中没有 ${model.owned_by} 的官方域名链接(SDK、models.dev 与 ai-sdk.dev 来源不算)`); + } + return { errors, warnings }; +} + +/** 第三方数值与本地值的差异提示。不判断谁对。 */ +export function diffHints(current, candidate) { + if (current == null || candidate == null || current === candidate) return []; + const notes = []; + const ratio = Number(current) / Number(candidate); + const near = (target) => Number.isFinite(ratio) && Math.abs(ratio - target) / target < 0.02; + if (near(1.024) || near(1 / 1.024)) notes.push('可能是 1000 与 1024 的写法差异'); + if (near(2) || near(0.5) || near(0.75) || near(1 / 0.75) || near(0.8) || near(1.25)) notes.push('可能是折扣、批量价或渠道价'); + if (near(10) || near(0.1)) notes.push('可能是图像输出价与文本输出价的口径不同'); + return notes; +} + +function asNumber(value) { + if (value == null || value === '') return null; + const number = Number(value); + return Number.isFinite(number) ? number : null; +} + +function perMillion(perToken) { + const number = asNumber(perToken); + return number == null ? null : Math.round(number * 1e6 * 1e6) / 1e6; +} + +/** 第三方目录里的厂商前缀。只用于和 owned_by 对齐,不把别家的同名 ID 配进来。 */ +const PROVIDER_ALIASES = { + google: ['google', 'gemini'], + alibaba: ['alibaba', 'qwen', 'dashscope'], + amazon: ['amazon', 'amazon-nova', 'bedrock'], + anthropic: ['anthropic'], + bytedance: ['bytedance', 'volcengine', 'doubao'], + cohere: ['cohere'], + deepseek: ['deepseek'], + meta: ['meta', 'meta-llama', 'meta_llama', 'llama'], + microsoft: ['microsoft', 'azure', 'azure_ai'], + minimax: ['minimax'], + mistral: ['mistral', 'mistralai'], + moonshot: ['moonshot', 'moonshotai'], + openai: ['openai'], + perplexity: ['perplexity'], + sakana: ['sakana'], + tencent: ['tencent', 'tencent-tokenhub', 'hunyuan'], + upstage: ['upstage'], + xai: ['xai', 'x-ai'], + xiaomi: ['xiaomi', 'mimo'], + zhipu: ['zhipu', 'zai', 'z-ai'], + nvidia: ['nvidia'], + inception: ['inception'], + ai21: ['ai21'], + baidu: ['baidu', 'qianfan'], +}; + +export function providerAliases(ownedBy) { + const id = String(ownedBy ?? '').toLowerCase(); + return new Set([id, ...(PROVIDER_ALIASES[id] ?? [])]); +} + +export function indexThirdParty(kind, payload) { + const rows = new Map(); + const put = (id, fields) => { + if (!id || typeof id !== 'string') return; + const key = id.toLowerCase(); + if (rows.has(key)) return; + // 这里只读取三个目录的美元 Token 报价,不转换币种或字符/媒体计价。 + rows.set(key, { id, currency: 'USD', unit: '1M_tokens', ...fields }); + }; + if (kind === 'models.dev' && payload && typeof payload === 'object') { + for (const [providerId, provider] of Object.entries(payload)) { + const models = provider?.models ?? {}; + for (const [id, model] of Object.entries(models)) { + const modelId = model?.id || id; + put(`${providerId}/${modelId}`, { + input: asNumber(model?.cost?.input), + output: asNumber(model?.cost?.output), + context: asNumber(model?.limit?.context), + maxOutput: asNumber(model?.limit?.output), + }); + } + } + } + if (kind === 'openrouter') { + for (const model of payload?.data ?? []) { + put(model.id, { + input: perMillion(model.pricing?.prompt), + output: perMillion(model.pricing?.completion), + context: asNumber(model.context_length), + maxOutput: asNumber(model.top_provider?.max_completion_tokens ?? model.max_completion_tokens), + }); + } + } + if (kind === 'litellm' && payload && typeof payload === 'object') { + for (const [id, model] of Object.entries(payload)) { + if (!model || typeof model !== 'object' || id.startsWith('sample_spec')) continue; + const provider = typeof model.litellm_provider === 'string' ? model.litellm_provider : ''; + const key = provider && !id.toLowerCase().startsWith(`${provider.toLowerCase()}/`) ? `${provider}/${id}` : id; + put(key, { + input: perMillion(model.input_cost_per_token), + output: perMillion(model.output_cost_per_token), + context: asNumber(model.max_tokens), + maxInput: asNumber(model.max_input_tokens), + maxOutput: asNumber(model.max_output_tokens), + }); + } + } + return rows; +} + +export function matchThirdParty(model, rows) { + const keys = [model.id, ...(model.aliases ?? [])].map((id) => String(id).toLowerCase()); + const aliases = providerAliases(model.owned_by); + for (const key of keys) { + if (rows.has(key)) return rows.get(key); + for (const prefix of aliases) { + const hit = rows.get(`${prefix}/${key}`); + if (hit) return hit; + } + } + return null; +} + +export function crossRows(model, labeledRows) { + const fields = [ + ['pricing.input', model.pricing?.input, 'input'], + ['pricing.output', model.pricing?.output, 'output'], + ['limits.context', model.limits?.context, 'context'], + ['limits.input', model.limits?.input, 'maxInput'], + ['limits.output', model.limits?.output, 'maxOutput'], + ]; + const diffs = []; + for (const [source, rows] of labeledRows) { + const remote = matchThirdParty(model, rows); + if (!remote) continue; + for (const [field, current, remoteKey] of fields) { + if (field.startsWith('pricing.') && + (model.pricing?.currency !== remote.currency || model.pricing?.unit !== remote.unit)) continue; + const candidate = remote[remoteKey]; + if (current == null || candidate == null || current === candidate) continue; + diffs.push({ + id: model.id, + source, + remoteId: remote.id, + field, + current, + candidate, + notes: diffHints(current, candidate), + }); + } + } + return diffs; +} + +function loadVendors() { + const vendors = new Map(); + for (const file of fs.readdirSync(VENDOR_DIR).filter((name) => name.endsWith('.json'))) { + const vendor = JSON.parse(fs.readFileSync(path.join(VENDOR_DIR, file), 'utf8')); + vendors.set(vendor.id, vendor); + } + return vendors; +} + +function modelFiles(args) { + if (args.length) return args; + return fs.readdirSync(MODEL_DIR).filter((name) => name.endsWith('.json')).map((name) => path.join(MODEL_DIR, name)); +} + +export function parseArgs(argv) { + const options = { strict: false, maxAgeDays: 180, cross: false, report: '', files: [], error: '' }; + for (let i = 0; i < argv.length; i += 1) { + const arg = argv[i]; + if (arg === '--strict') options.strict = true; + else if (arg === '--cross') options.cross = true; + else if (arg === '--max-age') { + const raw = argv[++i]; + if (!/^\d+$/.test(raw ?? '')) options.error = '--max-age 须为非负整数'; + else options.maxAgeDays = Number(raw); + } else if (arg === '--report') options.report = argv[++i]; + else options.files.push(arg); + } + return options; +} + +async function runCross(files) { + const endpoints = [ + ['models.dev', 'https://models.dev/api.json'], + ['openrouter', 'https://openrouter.ai/api/v1/models'], + ['litellm', 'https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json'], + ]; + const labeled = []; + for (const [name, url] of endpoints) { + const response = await fetch(url); + if (!response.ok) throw new Error(`${name} HTTP ${response.status}`); + labeled.push([name, indexThirdParty(name, await response.json())]); + } + const diffs = []; + for (const file of files) { + const model = JSON.parse(fs.readFileSync(file, 'utf8')); + diffs.push(...crossRows(model, labeled)); + } + return diffs; +} + +async function main() { + const options = parseArgs(process.argv.slice(2)); + if (options.error) { + console.error(options.error); + process.exit(1); + } + const vendors = loadVendors(); + const files = modelFiles(options.files); + const today = todayUtc(); + let errors = 0; + let warnings = 0; + for (const file of files) { + let model; + try { + model = JSON.parse(fs.readFileSync(file, 'utf8')); + } catch (err) { + errors += 1; + console.error(`✗ ${file}: JSON 解析失败 ${err.message}`); + continue; + } + const vendor = vendors.get(model.owned_by); + const result = checkModel(model, vendor?.url ?? '', { today, maxAgeDays: options.maxAgeDays }); + if (result.errors.length || result.warnings.length) { + const name = path.basename(file); + if (result.errors.length) { + errors += 1; + console.error(`✗ ${name}\n - ${result.errors.join('\n - ')}`); + } + if (result.warnings.length) { + warnings += result.warnings.length; + console.error(`! ${name}\n - ${result.warnings.join('\n - ')}`); + } + } + } + console.log(`${files.length - errors}/${files.length} 通过官方来源与范围检查${warnings ? `,${warnings} 条时效警告` : ''}`); + + if (options.cross) { + try { + const diffs = await runCross(files); + const text = JSON.stringify({ generated_at: today, diffs }, null, 2); + if (options.report) fs.writeFileSync(options.report, text); + console.log(`交叉比对 ${diffs.length} 条差异(仅提示,未改数据)`); + if (!options.report) console.log(text); + } catch (err) { + console.error(`交叉比对失败:${err.message}`); + process.exit(2); + } + } + if (errors || (options.strict && warnings)) process.exit(1); +} + +const executed = process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url); +if (executed) main(); diff --git a/scripts/check-official.test.mjs b/scripts/check-official.test.mjs new file mode 100644 index 00000000..460d478a --- /dev/null +++ b/scripts/check-official.test.mjs @@ -0,0 +1,174 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { + checkModel, + crossRows, + diffHints, + hostMatches, + indexThirdParty, + isSdkOnlySource, + parseArgs, + unwrapArchive, + vendorHosts, +} from './check-official.mjs'; + +const vendorUrl = 'https://ai.google.dev'; + +function model(overrides = {}) { + return { + id: 'gemini-example', + object: 'model', + created: null, + owned_by: 'google', + name: 'Example', + api: { types: ['generate'], sdk: [] }, + limits: { context: 1024, input: null, output: 512 }, + modalities: { input: ['text'], output: ['text'] }, + reasoning: { supported: null, efforts: [] }, + pricing: { currency: 'USD', unit: '1M_tokens', input: 1, output: 2, cache_read: null, cache_write: null }, + features: [], + info: { status: 'active', release_date: null, knowledge_cutoff: null, description: null, docs: null, verified_at: '2026-10-13' }, + aliases: [], + sources: [{ title: 'Models | Gemini API', url: 'https://ai.google.dev/gemini-api/docs/models', retrieved_at: '2026-10-13' }], + providers: [], + ...overrides, + }; +} + +test('archive snapshots of an official host count, SDK pages do not', () => { + const hosts = vendorHosts(vendorUrl, 'google'); + assert.equal(hostMatches('https://web.archive.org/web/20260521030432/https://ai.google.dev/gemini-api/docs/pricing', hosts), true); + assert.equal(hostMatches('https://models.dev/api.json', hosts), false); + assert.equal(isSdkOnlySource({ title: 'models.dev — SDK npm mapping (api.sdk only)', url: 'https://models.dev/api.json' }), true); + assert.equal(unwrapArchive('https://web.archive.org/web/20260101/https://ai.google.dev/gemini-api/docs/models'), 'https://ai.google.dev/gemini-api/docs/models'); +}); + +test('rejects a model whose only links are aggregators', () => { + const result = checkModel(model({ + sources: [{ title: 'models.dev', url: 'https://models.dev/api.json', retrieved_at: '2026-10-13' }], + }), vendorUrl, { today: '2026-10-13' }); + assert.match(result.errors.join('\n'), /官方域名/); +}); + +test('rejects a date more than one day ahead, a negative price, and an output above the context', () => { + const tomorrow = checkModel(model({ + info: { verified_at: '2026-10-14' }, + }), vendorUrl, { today: '2026-10-13' }); + assert.equal(tomorrow.errors.some((message) => message.includes('晚于')), false); + const result = checkModel(model({ + info: { verified_at: '2026-10-15' }, + limits: { context: 100, input: null, output: 200 }, + pricing: { currency: 'USD', unit: '1M_tokens', input: -1, output: 2, cache_read: null, cache_write: null }, + }), vendorUrl, { today: '2026-10-13' }); + assert.match(result.errors.join('\n'), /晚于/); + assert.match(result.errors.join('\n'), /pricing.input/); + assert.match(result.errors.join('\n'), /limits.output/); +}); + +test('public suffixes do not authorize every host under that suffix', () => { + const cn = vendorHosts('https://docs.vendor.com.cn/models', 'unknown-vendor'); + assert.equal(hostMatches('https://evil.com.cn/pricing', cn), false); + assert.equal(hostMatches('https://api.vendor.com.cn/v1', cn), true); + const io = vendorHosts('https://qwenlm.github.io/blog', 'unknown-vendor'); + assert.equal(hostMatches('https://other.github.io/x', io), false); + assert.equal(hostMatches('https://qwenlm.github.io/blog/post', io), true); + const jp = vendorHosts('https://docs.example.co.jp/models', 'unknown-vendor'); + assert.equal(hostMatches('https://other.co.jp/pricing', jp), false); + assert.equal(hostMatches('https://api.example.co.jp/v1', jp), true); +}); + +test('rejects a non-integer max age', () => { + assert.match(parseArgs(['--max-age', 'abc']).error, /非负整数/); + assert.match(parseArgs(['--max-age', '-1']).error, /非负整数/); + assert.match(parseArgs(['--max-age', '1.5']).error, /非负整数/); + assert.match(parseArgs(['--max-age']).error, /非负整数/); + assert.equal(parseArgs(['--max-age', '0']).maxAgeDays, 0); + assert.equal(parseArgs(['--max-age', '90']).error, ''); +}); + +test('stale dates warn and do not become errors', () => { + const result = checkModel(model({ + info: { verified_at: '2025-01-01' }, + sources: [{ title: 'Models | Gemini API', url: 'https://ai.google.dev/gemini-api/docs/models', retrieved_at: '2025-01-01' }], + }), vendorUrl, { today: '2026-10-13', maxAgeDays: 180 }); + assert.equal(result.errors.length, 0); + assert.match(result.warnings.join('\n'), /已超过 180 天/); +}); + +test('cross comparison notes notation and discount gaps without editing values', () => { + assert.deepEqual(diffHints(131072, 128000).some((note) => note.includes('1024')), true); + assert.deepEqual(diffHints(0.68, 1.36).some((note) => note.includes('折扣')), true); + assert.deepEqual(diffHints(30, 2.5).some((note) => note.includes('图像')), false); + const local = model({ id: 'gemini-example', pricing: { currency: 'USD', unit: '1M_tokens', input: 2, output: 12, cache_read: null, cache_write: null } }); + const rows = indexThirdParty('openrouter', { + data: [{ id: 'google/gemini-example', pricing: { prompt: '0.000001', completion: '0.000006' }, context_length: 1024, top_provider: { max_completion_tokens: 256 } }], + }); + const diffs = crossRows(local, [['openrouter', rows]]); + assert.equal(diffs.some((diff) => diff.field === 'pricing.input' && diff.candidate === 1), true); + assert.equal(diffs.some((diff) => diff.field === 'limits.output'), true); + assert.equal(local.pricing.input, 2); +}); + +test('cross match does not take another provider or treat max input as context', () => { + const mixed = indexThirdParty('litellm', { + 'gpt-4': { + litellm_provider: 'azure', + input_cost_per_token: 0.000001, + output_cost_per_token: 0.000002, + max_input_tokens: 4000, + max_tokens: 4000, + max_output_tokens: 1000, + }, + 'openai/gpt-4': { + litellm_provider: 'openai', + input_cost_per_token: 0.00003, + output_cost_per_token: 0.00006, + max_input_tokens: 4000, + max_tokens: 8192, + max_output_tokens: 4096, + }, + }); + const local = model({ + id: 'gpt-4', + owned_by: 'openai', + limits: { context: 8192, input: 8192, output: 4096 }, + pricing: { currency: 'USD', unit: '1M_tokens', input: 30, output: 60, cache_read: null, cache_write: null }, + }); + const diffs = crossRows(local, [['litellm', mixed]]); + assert.equal(diffs.some((diff) => diff.remoteId.startsWith('azure/')), false); + assert.equal(diffs.some((diff) => diff.field === 'limits.context'), false); + assert.equal(diffs.some((diff) => diff.field === 'limits.input' && diff.candidate === 4000), true); + const dev = indexThirdParty('models.dev', { + azure: { models: { 'gpt-4': { id: 'gpt-4', cost: { input: 1, output: 2 }, limit: { context: 4000, output: 1000 } } } }, + openai: { models: { 'gpt-4': { id: 'gpt-4', cost: { input: 30, output: 60 }, limit: { context: 8192, output: 4096 } } } }, + }); + const devDiffs = crossRows(local, [['models.dev', dev]]); + assert.equal(devDiffs.length, 0); +}); + +test('cross comparison skips incompatible prices but still reports token limits', () => { + const catalogs = [ + ['models.dev', { google: { models: { 'gemini-example': { + cost: { input: 1, output: 2 }, limit: { context: 2048, output: 256 }, + } } } }], + ['openrouter', { data: [{ id: 'google/gemini-example', + pricing: { prompt: '0.000001', completion: '0.000002' }, context_length: 2048, + }] }], + ['litellm', { 'gemini-example': { litellm_provider: 'google', + input_cost_per_token: 0.000001, output_cost_per_token: 0.000002, max_tokens: 2048, + } }], + ]; + for (const [source, payload] of catalogs) { + const rows = indexThirdParty(source, payload); + for (const [currency, unit] of [['CNY', '1M_tokens'], ['USD', '1M_characters'], ['USD', 'minute'], ['USD', 'page']]) { + const local = model({ pricing: { currency, unit, input: 7, output: 20, cache_read: null, cache_write: null } }); + const before = JSON.stringify(local); + const diffs = crossRows(local, [[source, rows]]); + assert.equal(diffs.some((diff) => diff.field.startsWith('pricing.')), false, `${source}: ${currency}/${unit}`); + assert.equal(diffs.some((diff) => diff.field === 'limits.context'), true); + assert.equal(JSON.stringify(local), before); + } + const usd = model({ pricing: { currency: 'USD', unit: '1M_tokens', input: 7, output: 20, cache_read: null, cache_write: null } }); + assert.equal(crossRows(usd, [[source, rows]]).some((diff) => diff.field === 'pricing.input'), true); + } +}); diff --git a/scripts/completeness.mjs b/scripts/completeness.mjs new file mode 100644 index 00000000..d3fadb10 --- /dev/null +++ b/scripts/completeness.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +/** + * 按厂商、按字段统计 data/models 的空缺。 + * 用法: + * node scripts/completeness.mjs # JSON 摘要 + * node scripts/completeness.mjs --ids # 附带缺字段的模型 ID + * node scripts/completeness.mjs --vendor openai + * node scripts/completeness.mjs --markdown + * + * 空缺不是错误。模态在 schema 里必须是非空数组,本脚本不把「已填写的模态」当成空缺。 + * features 为空、以及 reasoning.supported 为 true 但 efforts 为空,单独计数: + * 前者可能是未确认或不支持,后者可能是只有开关或 Token 预算。 + */ +import fs from 'node:fs'; + +const dir = new URL('../data/models/', import.meta.url); +const args = process.argv.slice(2); +const wantIds = args.includes('--ids'); +const markdown = args.includes('--markdown'); +const vendorArg = args.includes('--vendor') ? args[args.indexOf('--vendor') + 1] : null; + +const models = fs.readdirSync(dir).filter((f) => f.endsWith('.json')).sort() + .map((f) => JSON.parse(fs.readFileSync(new URL(f, dir), 'utf8'))); + +const scalarFields = [ + 'limits.context', 'limits.input', 'limits.output', + 'pricing', + 'reasoning.supported', + 'info.release_date', 'info.knowledge_cutoff', 'info.description', 'info.docs', 'info.verified_at', +]; +const priceParts = ['input', 'output', 'cache_read', 'cache_write']; +const get = (m, field) => field.split('.').reduce((v, key) => v?.[key], m); +const callable = (m) => m.info.status !== 'retired'; + +function summary(list) { + const null_fields = Object.fromEntries(scalarFields.map((field) => [ + field, + list.filter((m) => get(m, field) === null).length, + ])); + const pricing_components = Object.fromEntries(priceParts.map((part) => [ + part, + list.filter((m) => m.pricing && m.pricing[part] === null).length, + ])); + return { + models: list.length, + statuses: Object.fromEntries(['preview', 'active', 'deprecated', 'retired'] + .map((status) => [status, list.filter((m) => m.info.status === status).length]) + .filter(([, n]) => n)), + null_fields, + pricing_components_null_when_priced: pricing_components, + features_empty: list.filter((m) => m.features.length === 0).length, + reasoning_true_efforts_empty: list.filter((m) => m.reasoning.supported === true && m.reasoning.efforts.length === 0).length, + sources_empty: list.filter((m) => !m.sources?.length).length, + providers_empty: list.filter((m) => !m.providers?.length).length, + }; +} + +function missingFields(m) { + const missing = scalarFields.filter((field) => get(m, field) === null); + if (m.pricing) { + for (const part of priceParts) if (m.pricing[part] === null) missing.push(`pricing.${part}`); + } + if (!m.features.length) missing.push('features'); + if (m.reasoning.supported === true && !m.reasoning.efforts.length) missing.push('reasoning.efforts'); + if (!m.sources?.length) missing.push('sources'); + return missing; +} + +const selected = vendorArg ? models.filter((m) => m.owned_by === vendorArg) : models; +const owners = [...new Set(selected.map((m) => m.owned_by))].sort(); +const report = { + generated_at: new Date().toISOString(), + source_directory: 'data/models', + scope: 'Local model records only. Null is not an error: values may be unpublished, inapplicable, mixed-price, historical, or conflicting.', + modalities: 'modalities.input and modalities.output are required non-empty arrays, so they are not listed as null gaps.', + all: summary(selected), + callable: summary(selected.filter(callable)), + vendors: Object.fromEntries(owners.map((owner) => { + const list = selected.filter((m) => m.owned_by === owner); + return [owner, { ...summary(list), callable: summary(list.filter(callable)) }]; + })), +}; +if (wantIds) { + report.models = selected.flatMap((m) => { + const fields = missingFields(m); + return fields.length ? [{ id: m.id, owned_by: m.owned_by, status: m.info.status, fields, docs: m.info.docs }] : []; + }); +} + +if (!markdown) { + console.log(JSON.stringify(report, null, 2)); +} else { + const lines = ['# 模型字段空缺', '', `生成时间:${report.generated_at}`, '', report.scope, '', report.modalities, '']; + const header = ['厂商', '模型', '可调用', ...scalarFields.map((f) => f.replace('limits.', 'l.').replace('info.', 'i.').replace('reasoning.', 'r.'))]; + lines.push(`| ${header.join(' | ')} |`); + lines.push(`| ${header.map(() => '---').join(' | ')} |`); + const row = (name, block) => `| ${name} | ${block.models} | ${block.callable?.models ?? ''} | ${scalarFields.map((f) => block.null_fields[f]).join(' | ')} |`; + lines.push(row('全部', { ...report.all, callable: report.callable })); + for (const owner of owners) lines.push(row(owner, report.vendors[owner])); + lines.push(''); + console.log(lines.join('\n')); +} + +if (vendorArg && !owners.length) { + console.error(`未知厂商 ${vendorArg}`); + process.exitCode = 1; +} diff --git a/scripts/completeness.test.mjs b/scripts/completeness.test.mjs new file mode 100644 index 00000000..0daae712 --- /dev/null +++ b/scripts/completeness.test.mjs @@ -0,0 +1,38 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; + +const script = new URL('./completeness.mjs', import.meta.url); + +function run(args = []) { + return spawnSync(process.execPath, [script.pathname, ...args], { encoding: 'utf8' }); +} + +test('prints a vendor-by-field null report', () => { + const result = run(); + assert.equal(result.status, 0, result.stderr); + const report = JSON.parse(result.stdout); + assert.ok(report.all.models > 1000); + for (const field of ['limits.context', 'limits.input', 'limits.output', 'pricing', 'reasoning.supported', 'info.release_date', 'info.knowledge_cutoff', 'info.description', 'info.docs']) { + assert.equal(typeof report.all.null_fields[field], 'number'); + } + for (const part of ['input', 'output', 'cache_read', 'cache_write']) { + assert.equal(typeof report.all.pricing_components_null_when_priced[part], 'number'); + } + assert.ok(report.vendors.openai); + assert.equal(report.callable.models < report.all.models, true); + assert.equal(report.all.sources_empty, 0); +}); + +test('filters one vendor and can list model ids', () => { + const result = run(['--vendor', 'deepseek', '--ids']); + assert.equal(result.status, 0, result.stderr); + const report = JSON.parse(result.stdout); + assert.deepEqual(Object.keys(report.vendors), ['deepseek']); + assert.ok(report.models.every((m) => m.owned_by === 'deepseek' && m.fields.length)); +}); + +test('rejects an unknown vendor', () => { + const result = run(['--vendor', 'not-a-vendor']); + assert.equal(result.status, 1); +});