From 6236124338d2c11d36b62cb373016b17a8f2834c Mon Sep 17 00:00:00 2001 From: "dayuan.jiang" Date: Sun, 4 Oct 2026 14:02:54 +0900 Subject: [PATCH] feat(settings): fetch the model list from any provider and flag models that cannot draw The "Fetch models" button asks the provider for its models (OpenAI-style /models, Anthropic, Google, Ollama, OpenRouter, Vercel Gateway, AIHubMix) and shows them in a searchable picker. This replaces the route that only worked for AIHubMix. A snapshot of models.dev (MIT) says which models support tool calls. Models without them get a "no tool calls" badge in the picker and a hint in the model list, since drawing needs tool calls. Refresh the snapshot with scripts/update-model-catalog.mjs. --- app/api/aihubmix-models/route.ts | 61 - app/api/provider-models/route.ts | 62 + biome.json | 7 +- components/model-config-dialog.tsx | 322 ++++-- lib/aihubmix-models.ts | 79 -- lib/i18n/dictionaries/en.json | 3 + lib/i18n/dictionaries/ja.json | 3 + lib/i18n/dictionaries/zh-Hant.json | 3 + lib/i18n/dictionaries/zh.json | 3 + lib/model-catalog.json | 1682 ++++++++++++++++++++++++++++ lib/model-catalog.ts | 45 + lib/provider-models.ts | 184 +++ lib/types/model-config.ts | 37 +- scripts/update-model-catalog.mjs | 78 ++ tests/e2e/provider-models.spec.ts | 85 ++ tests/unit/ai-providers.test.ts | 25 - tests/unit/model-catalog.test.ts | 32 + tests/unit/provider-models.test.ts | 158 +++ 18 files changed, 2595 insertions(+), 274 deletions(-) delete mode 100644 app/api/aihubmix-models/route.ts create mode 100644 app/api/provider-models/route.ts delete mode 100644 lib/aihubmix-models.ts create mode 100644 lib/model-catalog.json create mode 100644 lib/model-catalog.ts create mode 100644 lib/provider-models.ts create mode 100644 scripts/update-model-catalog.mjs create mode 100644 tests/e2e/provider-models.spec.ts create mode 100644 tests/unit/model-catalog.test.ts create mode 100644 tests/unit/provider-models.test.ts diff --git a/app/api/aihubmix-models/route.ts b/app/api/aihubmix-models/route.ts deleted file mode 100644 index 9e4d0e8c..00000000 --- a/app/api/aihubmix-models/route.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { NextResponse } from "next/server" -import { - AIHUBMIX_MODELS_ENDPOINT, - extractAihubmixModelIds, -} from "@/lib/aihubmix-models" -import { SUGGESTED_MODELS } from "@/lib/types/model-config" - -const SUCCESS_CACHE_CONTROL = - "public, max-age=300, s-maxage=3600, stale-while-revalidate=86400" - -function fallbackResponse() { - return NextResponse.json( - { - models: SUGGESTED_MODELS.aihubmix || [], - source: "fallback", - }, - { - headers: { - "Cache-Control": "no-store", - }, - }, - ) -} - -export async function GET() { - try { - const response = await fetch(AIHUBMIX_MODELS_ENDPOINT, { - next: { revalidate: 3600 }, - }) - - if (!response.ok) { - console.warn( - `[aihubmix-models] Failed to fetch models: ${response.status}`, - ) - return fallbackResponse() - } - - const payload = await response.json() - const models = extractAihubmixModelIds(payload) - - if (models.length === 0) { - console.warn("[aihubmix-models] Model list response was empty") - return fallbackResponse() - } - - return NextResponse.json( - { - models, - source: "aihubmix", - }, - { - headers: { - "Cache-Control": SUCCESS_CACHE_CONTROL, - }, - }, - ) - } catch (error) { - console.warn("[aihubmix-models] Failed to load models:", error) - return fallbackResponse() - } -} diff --git a/app/api/provider-models/route.ts b/app/api/provider-models/route.ts new file mode 100644 index 00000000..de85421b --- /dev/null +++ b/app/api/provider-models/route.ts @@ -0,0 +1,62 @@ +import { NextResponse } from "next/server" +import { checkAccessCode } from "@/lib/access-code" +import { classifyLLMError } from "@/lib/llm-errors" +import { canListModels, listProviderModels } from "@/lib/provider-models" +import { + allowPrivateUrls, + isPrivateUrl, + redirectGuardedFetch, +} from "@/lib/ssrf-protection" +import type { ProviderName } from "@/lib/types/model-config" + +export const runtime = "nodejs" + +// Public lists need no key +const NO_KEY_NEEDED = new Set([ + "ollama", + "openrouter", + "aihubmix", +]) + +/** + * The models a provider offers, for the "Fetch models" button in model + * settings. Answers { models: null } for providers that cannot list them, + * so the dialog keeps its suggested models. + */ +export async function POST(req: Request) { + // Sends requests to a URL the client chose, so require the access code + const accessError = checkAccessCode(req) + if (accessError) return accessError + + const { provider, apiKey, baseUrl } = (await req.json()) as { + provider: ProviderName + apiKey?: string + baseUrl?: string + } + if (!canListModels(provider)) { + return NextResponse.json({ models: null }) + } + // SECURITY: Block SSRF attacks via custom baseUrl + if (baseUrl && !allowPrivateUrls() && (await isPrivateUrl(baseUrl))) { + return NextResponse.json({ error: "Invalid base URL" }, { status: 400 }) + } + if (!apiKey && !NO_KEY_NEEDED.has(provider)) { + return NextResponse.json( + { error: "API key is required" }, + { status: 400 }, + ) + } + + try { + const models = await listProviderModels( + provider, + { apiKey, baseUrl }, + (baseUrl && redirectGuardedFetch()) || fetch, + ) + return NextResponse.json({ models }) + } catch (error) { + console.warn("[provider-models] Listing failed:", error) + const { code, message } = classifyLLMError(error) + return NextResponse.json({ code, error: message }) + } +} diff --git a/biome.json b/biome.json index 199ceabc..bf56b8b0 100644 --- a/biome.json +++ b/biome.json @@ -7,7 +7,12 @@ }, "files": { "ignoreUnknown": false, - "includes": ["**", "!public", "!packages/mcp-server/src/preview"] + "includes": [ + "**", + "!public", + "!packages/mcp-server/src/preview", + "!lib/model-catalog.json" + ] }, "formatter": { "enabled": true, diff --git a/components/model-config-dialog.tsx b/components/model-config-dialog.tsx index ce8f83d2..818b7f93 100644 --- a/components/model-config-dialog.tsx +++ b/components/model-config-dialog.tsx @@ -9,6 +9,7 @@ import { Key, Loader2, Plus, + RefreshCw, Server, Settings2, Sparkles, @@ -33,6 +34,13 @@ import { AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Button } from "@/components/ui/button" +import { + Command, + CommandEmpty, + CommandInput, + CommandItem, + CommandList, +} from "@/components/ui/command" import { Dialog, DialogContent, @@ -42,6 +50,11 @@ import { } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" import { ScrollArea } from "@/components/ui/scroll-area" import { Select, @@ -55,6 +68,7 @@ import { useDictionary } from "@/hooks/use-dictionary" import type { UseModelConfigReturn } from "@/hooks/use-model-config" import { getApiEndpoint } from "@/lib/base-path" import { formatMessage } from "@/lib/i18n/utils" +import type { ListedModel } from "@/lib/provider-models" import { STORAGE_KEYS } from "@/lib/storage" import type { ModelConfig, @@ -146,14 +160,17 @@ export function ModelConfigDialog({ // Bumped on every credential edit so a running test can tell that its // results belong to the old credentials const credentialsVersionRef = useRef(0) - const [dynamicSuggestedModels, setDynamicSuggestedModels] = useState< - Partial> + // Models fetched from the provider, per provider config + const [fetchedModels, setFetchedModels] = useState< + Record >({}) - const [loadedSuggestedProviders, setLoadedSuggestedProviders] = useState< - Partial> - >({}) - const [loadingSuggestedProvider, setLoadingSuggestedProvider] = - useState(null) + const [fetchingModels, setFetchingModels] = useState(false) + const [fetchModelsError, setFetchModelsError] = useState("") + const [modelPickerOpen, setModelPickerOpen] = useState(false) + // models.dev data for hints, loaded with the dialog (it is ~180 KB) + const [getModelInfo, setGetModelInfo] = useState< + typeof import("@/lib/model-catalog").getModelInfo | null + >(null) const { config, @@ -185,73 +202,74 @@ export function ModelConfigDialog({ }, []) useEffect(() => { - if ( - !open || - selectedProvider?.provider !== "aihubmix" || - loadedSuggestedProviders.aihubmix - ) { - return - } + if (!open || getModelInfo) return + import("@/lib/model-catalog").then((catalog) => + setGetModelInfo(() => catalog.getModelInfo), + ) + }, [open, getModelInfo]) - let cancelled = false - setLoadingSuggestedProvider("aihubmix") - - fetch(getApiEndpoint("/api/aihubmix-models")) - .then((response) => { - if (!response.ok) { - throw new Error(`Failed to load models: ${response.status}`) - } - return response.json() - }) - .then((data: { models?: unknown }) => { - if (cancelled || !Array.isArray(data.models)) { - return - } - - const models = data.models.filter( - (model): model is string => typeof model === "string", - ) - if (models.length > 0) { - setDynamicSuggestedModels((current) => ({ - ...current, - aihubmix: models, - })) - } - }) - .catch((error) => { - console.warn("Failed to load AIHubMix models:", error) - }) - .finally(() => { - if (cancelled) { - return - } - - setLoadedSuggestedProviders((current) => ({ + const handleFetchModels = async () => { + if (!selectedProvider) return + const providerId = selectedProvider.id + setFetchingModels(true) + setFetchModelsError("") + try { + const response = await fetch( + getApiEndpoint("/api/provider-models"), + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-access-code": + localStorage.getItem(STORAGE_KEYS.accessCode) || "", + }, + body: JSON.stringify({ + provider: selectedProvider.provider, + apiKey: selectedProvider.apiKey, + baseUrl: selectedProvider.baseUrl, + }), + }, + ) + const data = await response.json().catch(() => ({})) + if (Array.isArray(data.models)) { + setFetchedModels((current) => ({ ...current, - aihubmix: true, + [providerId]: data.models, })) - setLoadingSuggestedProvider(null) - }) - - return () => { - cancelled = true + setModelPickerOpen(true) + } else { + const hints = dict.errors.llm as Record + setFetchModelsError( + [hints[data.code], data.error].filter(Boolean).join(" ") || + `Request failed (${response.status})`, + ) + } + } catch { + setFetchModelsError(dict.errors.networkError) + } finally { + setFetchingModels(false) } - }, [open, selectedProvider?.provider, loadedSuggestedProviders.aihubmix]) + } - // Get suggested models for current provider - const suggestedModels = selectedProvider - ? dynamicSuggestedModels[selectedProvider.provider] || - SUGGESTED_MODELS[selectedProvider.provider] || - [] + // The provider's own list once fetched, else the suggested models + const suggestedModels: ListedModel[] = selectedProvider + ? fetchedModels[selectedProvider.id] || + (SUGGESTED_MODELS[selectedProvider.provider] || []).map((id) => ({ + id, + })) : [] - const isLoadingSuggestedModels = - selectedProvider?.provider === loadingSuggestedProvider + // Tool calls are what drawing needs: false when known to be missing + const supportsTools = (model: ListedModel) => + selectedProvider + ? (model.tools ?? + getModelInfo?.(selectedProvider.provider, model.id)?.tools) + : undefined // Filter out already-added models from suggestions const existingModelIds = selectedProvider?.models.map((m) => m.modelId) || [] const availableSuggestions = suggestedModels.filter( - (modelId) => !existingModelIds.includes(modelId), + (model) => !existingModelIds.includes(model.id), ) const emptyStateSuggestions = selectedProvider ? (SUGGESTED_MODELS[selectedProvider.provider] || []) @@ -286,6 +304,8 @@ export function ModelConfigDialog({ credentialsVersionRef.current++ setValidationStatus("idle") setValidatingModelIds(new Set()) + setFetchedModels(({ [selectedProviderId]: _, ...rest }) => rest) + setFetchModelsError("") updates.validated = false updates.models = selectedProvider.models.map((m) => ({ ...m, @@ -908,58 +928,132 @@ export function ModelConfigDialog({ > - + + {availableSuggestions.map( + (model) => ( + { + handleAddModel( + model.id, + ) + setModelPickerOpen( + false, + ) + }} + className="font-mono text-xs" + > + + { + model.id + } + + {supportsTools( + model, + ) === + false && ( + + { + dict + .modelConfig + .noTools + } + + )} + + ), + )} + + + + } > + {fetchModelsError && ( +

+ {fetchModelsError} +

+ )} {/* Model List */}
{selectedProvider.models.length === @@ -1246,6 +1340,20 @@ export function ModelConfigDialog({ }

)} + {!model.validationWarning && + getModelInfo?.( + selectedProvider.provider, + model.modelId, + )?.tools === + false && ( +

+ { + dict + .modelConfig + .mayNotDraw + } +

+ )} {model.validated && model.validationWarning && (

diff --git a/lib/aihubmix-models.ts b/lib/aihubmix-models.ts deleted file mode 100644 index f52bae5c..00000000 --- a/lib/aihubmix-models.ts +++ /dev/null @@ -1,79 +0,0 @@ -export const AIHUBMIX_MODELS_ENDPOINT = "https://aihubmix.com/api/v1/models" - -const NON_CHAT_MODEL_TYPES = new Set([ - "embedding", - "image_generation", - "rerank", - "transcription", - "tts", - "video", -]) - -type AihubmixModelListPayload = { - data?: unknown -} - -type AihubmixModelRecord = { - model_id?: unknown - types?: unknown -} - -function getModelTypes(types: unknown): Set { - if (typeof types !== "string") { - return new Set() - } - - return new Set( - types - .split(",") - .map((type) => type.trim()) - .filter(Boolean), - ) -} - -function isChatModel(record: AihubmixModelRecord): record is { - model_id: string - types: string -} { - if (typeof record.model_id !== "string" || !record.model_id.trim()) { - return false - } - - const types = getModelTypes(record.types) - if (!types.has("llm")) { - return false - } - - return !Array.from(NON_CHAT_MODEL_TYPES).some((type) => types.has(type)) -} - -export function extractAihubmixModelIds(payload: unknown): string[] { - const data = (payload as AihubmixModelListPayload)?.data - if (!Array.isArray(data)) { - return [] - } - - const seen = new Set() - const modelIds: string[] = [] - - for (const item of data) { - if (!item || typeof item !== "object") { - continue - } - - const record = item as AihubmixModelRecord - if (!isChatModel(record)) { - continue - } - - const modelId = record.model_id.trim() - if (seen.has(modelId)) { - continue - } - - seen.add(modelId) - modelIds.push(modelId) - } - - return modelIds -} diff --git a/lib/i18n/dictionaries/en.json b/lib/i18n/dictionaries/en.json index 62fdb080..27277be8 100644 --- a/lib/i18n/dictionaries/en.json +++ b/lib/i18n/dictionaries/en.json @@ -385,6 +385,9 @@ "baseUrl": "Base URL", "optional": "(optional)", "getApiKey": "Get API key", + "fetchModels": "Fetch models from the provider", + "noTools": "no tool calls", + "mayNotDraw": "models.dev lists no tool call support for this model, so it may not be able to draw.", "requestUrl": "Requests go to {url}", "baseUrlWithExample": "Base URL (optional, e.g. {example})", "customEndpoint": "Custom endpoint URL", diff --git a/lib/i18n/dictionaries/ja.json b/lib/i18n/dictionaries/ja.json index feced64c..fcb1bcc1 100644 --- a/lib/i18n/dictionaries/ja.json +++ b/lib/i18n/dictionaries/ja.json @@ -339,6 +339,9 @@ "baseUrl": "ベース URL", "optional": "(オプション)", "getApiKey": "API キーを取得", + "fetchModels": "プロバイダーからモデル一覧を取得", + "noTools": "ツール呼び出し非対応", + "mayNotDraw": "models.dev によると、このモデルはツール呼び出しに対応していないため、作図できない可能性があります。", "requestUrl": "リクエスト先: {url}", "baseUrlWithExample": "ベース URL(オプション、例: {example})", "customEndpoint": "カスタムエンドポイント URL", diff --git a/lib/i18n/dictionaries/zh-Hant.json b/lib/i18n/dictionaries/zh-Hant.json index 7227ef5f..40ecc53f 100644 --- a/lib/i18n/dictionaries/zh-Hant.json +++ b/lib/i18n/dictionaries/zh-Hant.json @@ -385,6 +385,9 @@ "baseUrl": "基礎 URL", "optional": "(可選)", "getApiKey": "取得 API Key", + "fetchModels": "從服務商取得模型清單", + "noTools": "不支援工具呼叫", + "mayNotDraw": "models.dev 顯示這個模型不支援工具呼叫,可能無法繪圖。", "requestUrl": "請求將傳送至 {url}", "baseUrlWithExample": "基礎 URL(可選,例如 {example})", "customEndpoint": "自訂端點 URL", diff --git a/lib/i18n/dictionaries/zh.json b/lib/i18n/dictionaries/zh.json index 93c905be..3a2d5039 100644 --- a/lib/i18n/dictionaries/zh.json +++ b/lib/i18n/dictionaries/zh.json @@ -385,6 +385,9 @@ "baseUrl": "基础 URL", "optional": "(可选)", "getApiKey": "获取 API Key", + "fetchModels": "从服务商获取模型列表", + "noTools": "不支持工具调用", + "mayNotDraw": "models.dev 显示这个模型不支持工具调用,可能无法画图。", "requestUrl": "请求将发往 {url}", "baseUrlWithExample": "基础 URL(可选,例如 {example})", "customEndpoint": "自定义端点 URL", diff --git a/lib/model-catalog.json b/lib/model-catalog.json new file mode 100644 index 00000000..b505c31e --- /dev/null +++ b/lib/model-catalog.json @@ -0,0 +1,1682 @@ +{ + "openai": { + "chatgpt-image-latest": {"tools":false,"images":true,"reasoning":false}, + "gpt-4.1": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "gpt-4.1-mini": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "gpt-4o": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "gpt-4o-2024-08-06": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "gpt-4o-2024-11-20": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "gpt-4o-mini": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "gpt-5": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":272000}, + "gpt-5.1": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.2": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.2-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.3-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.3-codex-spark": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":32000}, + "gpt-5.4": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.4-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.5": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-daybreak-blue-latest": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-daybreak-red-latest": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-image-1-mini": {"tools":false,"images":true,"reasoning":false}, + "gpt-image-1.5": {"tools":false,"images":true,"reasoning":false}, + "gpt-realtime-2.1": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":32000}, + "o3": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "o3-pro": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "text-embedding-3-large": {"tools":false,"images":false,"reasoning":false,"context":8191,"output":3072}, + "text-embedding-3-small": {"tools":false,"images":false,"reasoning":false,"context":8191,"output":1536}, + "text-embedding-ada-002": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536} + }, + "anthropic": { + "claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-fable-5-1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-haiku-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-haiku-4-5-20251001": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-5-20251101": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-4-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "claude-sonnet-4-5-20250929": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000} + }, + "google": { + "deep-research-max-preview-04-2026": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":65536}, + "deep-research-preview-04-2026": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":65536}, + "gemini-2.5-computer-use-preview-10-2025": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":64000}, + "gemini-2.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-2.5-flash-image": {"tools":false,"images":true,"reasoning":true,"context":32768,"output":32768}, + "gemini-2.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3-flash-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3-pro-image": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":32768}, + "gemini-3-pro-image-preview": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "gemini-3.1-flash-image": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "gemini-3.1-flash-image-preview": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":65536}, + "gemini-3.1-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.1-flash-lite-image": {"tools":true,"images":true,"reasoning":true,"context":65536,"output":4096}, + "gemini-3.1-flash-live-preview": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":65536}, + "gemini-3.1-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.1-pro-preview-customtools": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.5-live-translate-preview": {"tools":false,"images":false,"reasoning":false,"context":16384,"output":32768}, + "gemini-3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-embedding-001": {"tools":false,"images":false,"reasoning":false,"context":2048,"output":1}, + "gemini-embedding-2": {"tools":false,"images":true,"reasoning":false,"context":8192,"output":1}, + "gemini-flash-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-flash-lite-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemma-4-26b-a4b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "gemma-4-31b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "lyria-3-clip-preview": {"tools":false,"images":true,"reasoning":false,"context":1048576,"output":65536}, + "lyria-3-pro-preview": {"tools":false,"images":true,"reasoning":false,"context":1048576,"output":65536} + }, + "vertexai": { + "claude-fable-5-1@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-fable-5@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-haiku-4-5@20251001": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-5@20251101": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-6@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-7@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-8@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5-5@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-4-5@20250929": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-sonnet-4-6@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-5-5@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-5@default": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "gemini-2.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-2.5-flash-image": {"tools":false,"images":true,"reasoning":false,"context":32768,"output":32768}, + "gemini-2.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65535}, + "gemini-2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3-flash-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3-pro-image": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":32768}, + "gemini-3.1-flash-image": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "gemini-3.1-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.1-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.1-pro-preview-customtools": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-embedding-001": {"tools":false,"images":false,"reasoning":false,"context":2048,"output":1}, + "gemini-flash-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-flash-lite-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "meta/llama-4-maverick-17b-128e-instruct-maas": {"tools":true,"images":true,"reasoning":false,"context":524288,"output":8192}, + "openai/gpt-oss-120b-maas": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":131072}, + "xai/grok-4.20-non-reasoning": {"tools":true,"images":true,"reasoning":false,"context":2000000,"output":30000}, + "xai/grok-4.20-reasoning": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":30000}, + "xai/grok-4.3": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":30000}, + "xai/grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":524288,"output":500000}, + "zai-org/glm-5.2-maas": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":64000} + }, + "azure": { + "claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-fable-5-1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-haiku-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-mythos-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-1": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "claude-opus-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "codestral-2501": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":256000}, + "cohere-command-a": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "cohere-embed-v-4-0": {"tools":false,"images":true,"reasoning":false,"context":128000,"output":1536}, + "cohere-embed-v3-english": {"tools":false,"images":false,"reasoning":false,"context":512,"output":1024}, + "cohere-embed-v3-multilingual": {"tools":false,"images":false,"reasoning":false,"context":512,"output":1024}, + "deepseek-v3.2": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":128000}, + "deepseek-v3.2-speciale": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":128000}, + "deepseek-v4-flash": {"tools":false,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-pro": {"tools":false,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "gpt-5": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1-codex-max": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1-codex-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.2": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.2-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.3-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.4-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.5": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-chat-latest": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-image-1.5": {"tools":false,"images":true,"reasoning":false}, + "grok-4-1-fast-non-reasoning": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "grok-4-1-fast-reasoning": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":8192}, + "grok-4-20-non-reasoning": {"tools":true,"images":false,"reasoning":false,"context":262000,"output":8192}, + "grok-4-20-reasoning": {"tools":true,"images":false,"reasoning":true,"context":262000,"output":8192}, + "grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":128000}, + "kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "llama-3.3-70b-instruct": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":32768}, + "llama-4-maverick-17b-128e-instruct-fp8": {"tools":true,"images":true,"reasoning":false,"context":1000000,"output":16384}, + "llama-4-scout-17b-16e-instruct": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "ministral-3b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":8192}, + "mistral-medium-2505": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":128000}, + "mistral-small-2503": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":32768}, + "model-router": {"tools":true,"images":true,"reasoning":false,"context":200000,"output":16384}, + "o3": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "phi-4": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":4096}, + "phi-4-mini": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "phi-4-mini-reasoning": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":4096}, + "phi-4-multimodal": {"tools":false,"images":true,"reasoning":false,"context":128000,"output":4096}, + "phi-4-reasoning": {"tools":false,"images":false,"reasoning":true,"context":32000,"output":4096}, + "phi-4-reasoning-plus": {"tools":false,"images":false,"reasoning":true,"context":32000,"output":4096}, + "text-embedding-3-large": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":3072}, + "text-embedding-3-small": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "text-embedding-ada-002": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536} + }, + "bedrock": { + "amazon.nova-2-lite-v1:0": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "amazon.nova-lite-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "amazon.nova-micro-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":10000}, + "amazon.nova-pro-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "anthropic.claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-fable-5-1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic.claude-opus-4-5-20251101-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic.claude-opus-4-6-v1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-sonnet-4-5-20250929-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic.claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic.claude-sonnet-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "apac.amazon.nova-lite-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "apac.amazon.nova-micro-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":10000}, + "apac.amazon.nova-pro-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "au.anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "au.anthropic.claude-opus-4-6-v1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "au.anthropic.claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "au.anthropic.claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "au.anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "au.anthropic.claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "au.anthropic.claude-sonnet-4-5-20250929-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "au.anthropic.claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "au.anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "ca.amazon.nova-lite-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "deepseek.r1-v1:0": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32768}, + "deepseek.v3-v1:0": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":81920}, + "deepseek.v3.2": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":81920}, + "eu.amazon.nova-2-lite-v1:0": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "eu.amazon.nova-lite-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "eu.amazon.nova-micro-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":10000}, + "eu.amazon.nova-pro-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "eu.anthropic.claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "eu.anthropic.claude-opus-4-5-20251101-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "eu.anthropic.claude-opus-4-6-v1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-sonnet-4-5-20250929-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "eu.anthropic.claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.anthropic.claude-sonnet-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "eu.mistral.pixtral-large-2502-v1:0": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "global.amazon.nova-2-lite-v1:0": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "global.anthropic.claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-fable-5-1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "global.anthropic.claude-opus-4-5-20251101-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "global.anthropic.claude-opus-4-6-v1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-sonnet-4-5-20250929-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "global.anthropic.claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.anthropic.claude-sonnet-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "global.moonshotai.kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":128000}, + "global.openai.gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.openai.gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.openai.gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.openai.gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.openai.gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.openai.gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.openai.gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "global.xai.grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "global.xai.grok-4.7": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "google.gemma-3-12b-it": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":8192}, + "google.gemma-3-27b-it": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":8192}, + "google.gemma-3-4b-it": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":4096}, + "google.gemma-4-26b-a4b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "google.gemma-4-31b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "google.gemma-4-e2b": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":8192}, + "in.anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "in.anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "in.anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "in.openai.gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "in.openai.gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "jp.amazon.nova-2-lite-v1:0": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "jp.anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "jp.anthropic.claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "jp.anthropic.claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "jp.anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "jp.anthropic.claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "jp.anthropic.claude-sonnet-4-5-20250929-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "jp.anthropic.claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "jp.anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "meta.llama3-1-70b-instruct-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "meta.llama3-1-8b-instruct-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "meta.llama3-3-70b-instruct-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "meta.llama4-maverick-17b-instruct-v1:0": {"tools":true,"images":true,"reasoning":false,"context":1000000,"output":8192}, + "meta.llama4-scout-17b-instruct-v1:0": {"tools":true,"images":true,"reasoning":false,"context":10000000,"output":8192}, + "minimax.minimax-m2": {"tools":true,"images":false,"reasoning":true,"context":204608,"output":128000}, + "minimax.minimax-m2.1": {"tools":true,"images":false,"reasoning":true,"context":196608,"output":131072}, + "minimax.minimax-m2.5": {"tools":true,"images":false,"reasoning":true,"context":196608,"output":98304}, + "mistral.devstral-2-123b": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":8192}, + "mistral.magistral-small-2509": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":40000}, + "mistral.ministral-3-14b-instruct": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "mistral.ministral-3-3b-instruct": {"tools":true,"images":true,"reasoning":false,"context":256000,"output":8192}, + "mistral.ministral-3-8b-instruct": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "mistral.mistral-large-3-675b-instruct": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":8192}, + "mistral.pixtral-large-2502-v1:0": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "mistral.voxtral-mini-3b-2507": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":4096}, + "mistral.voxtral-small-24b-2507": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":8192}, + "moonshot.kimi-k2-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":16000}, + "moonshotai.kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":16384}, + "nvidia.nemotron-nano-12b-v2": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":8192}, + "nvidia.nemotron-nano-3-30b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":8192}, + "nvidia.nemotron-nano-9b-v2": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "nvidia.nemotron-super-3-120b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":131072}, + "openai.gpt-5.4": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "openai.gpt-5.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "openai.gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai.gpt-oss-120b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":131072}, + "openai.gpt-oss-120b-1:0": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":128000}, + "openai.gpt-oss-20b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":131072}, + "openai.gpt-oss-20b-1:0": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":128000}, + "openai.gpt-oss-safeguard-120b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16384}, + "openai.gpt-oss-safeguard-20b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16384}, + "qwen.qwen3-235b-a22b-2507-v1:0": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":131072}, + "qwen.qwen3-32b-v1:0": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "qwen.qwen3-coder-30b-a3b-v1:0": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":131072}, + "qwen.qwen3-coder-480b-a35b-v1:0": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":65536}, + "qwen.qwen3-coder-next": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen.qwen3-next-80b-a3b": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":262000}, + "qwen.qwen3-vl-235b-a22b": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":262000}, + "us-gov.openai.gpt-oss-120b-1:0": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16384}, + "us-gov.openai.gpt-oss-20b-1:0": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16384}, + "us.amazon.nova-2-lite-v1:0": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "us.amazon.nova-lite-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "us.amazon.nova-micro-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":10000}, + "us.amazon.nova-pro-v1:0": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "us.anthropic.claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-fable-5-1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-haiku-4-5-20251001-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "us.anthropic.claude-opus-4-5-20251101-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "us.anthropic.claude-opus-4-6-v1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-sonnet-4-5-20250929-v1:0": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "us.anthropic.claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.anthropic.claude-sonnet-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "us.deepseek.r1-v1:0": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32768}, + "us.meta.llama3-1-70b-instruct-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "us.meta.llama3-1-8b-instruct-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "us.meta.llama3-3-70b-instruct-v1:0": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "us.meta.llama4-maverick-17b-instruct-v1:0": {"tools":true,"images":true,"reasoning":false,"context":1000000,"output":8192}, + "us.meta.llama4-scout-17b-instruct-v1:0": {"tools":true,"images":true,"reasoning":false,"context":10000000,"output":8192}, + "us.mistral.pixtral-large-2502-v1:0": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "us.moonshotai.kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":128000}, + "us.openai.gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.openai.gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.openai.gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.openai.gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.openai.gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.openai.gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.openai.gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "us.writer.palmyra-x4-v1:0": {"tools":true,"images":false,"reasoning":true,"context":122880,"output":8192}, + "us.writer.palmyra-x5-v1:0": {"tools":true,"images":false,"reasoning":true,"context":1040000,"output":8192}, + "us.xai.grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "us.xai.grok-4.7": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "writer.palmyra-x4-v1:0": {"tools":true,"images":false,"reasoning":true,"context":122880,"output":8192}, + "writer.palmyra-x5-v1:0": {"tools":true,"images":false,"reasoning":true,"context":1040000,"output":8192}, + "xai.grok-4.3": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "xai.grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "zai.glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":131072}, + "zai.glm-4.7-flash": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":131072}, + "zai.glm-5": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":131072} + }, + "ollama": { + "deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":1048576}, + "deepseek-v4-flash:0731": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":1048576}, + "deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":1048576}, + "deepseek-v4-pro:0813": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":1048576}, + "deepseek-v4.1-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":384000}, + "gemma4:31b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":131072}, + "glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":976000,"output":131072}, + "glm-5.3": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "glm-5.3-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "gpt-oss:120b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "gpt-oss:20b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "minimax-m2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax-m2.7": {"tools":true,"images":false,"reasoning":true,"context":196608,"output":196608}, + "minimax-m3": {"tools":true,"images":true,"reasoning":true,"context":512000,"output":131072}, + "mistral-large-3:675b": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":262144}, + "nemotron-3-nano:30b": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "nemotron-3-super": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "nemotron-3-ultra": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":128000}, + "qwen3.5:397b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536} + }, + "openrouter": { + "~anthropic/claude-fable-latest": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "~anthropic/claude-haiku-latest": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "~anthropic/claude-opus-latest": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "~anthropic/claude-sonnet-latest": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "~deepseek/deepseek-flash-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "~deepseek/deepseek-pro-latest": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":393216}, + "~deepseek/deepseek-v4-flash-latest": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":943718}, + "~google/gemini-flash-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "~google/gemini-pro-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "~moonshotai/kimi-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "~openai/gpt-astra-latest": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "~openai/gpt-luna-latest": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "~openai/gpt-mini-latest": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "~openai/gpt-sol-latest": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "~openai/gpt-terra-latest": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "~x-ai/grok-latest": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":450000}, + "~z-ai/glm-flash-latest": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "~z-ai/glm-latest": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":943718}, + "aion-labs/aion-2.0": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "aion-labs/aion-3.0": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "aion-labs/aion-3.0-mini": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "aion-labs/aion-3.5": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "aion-labs/aion-3.5-mini": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "aion-labs/aion-rp-llama-3.1-8b": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":29491}, + "amazon/nova-2-lite-v1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "amazon/nova-lite-v1": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":5120}, + "amazon/nova-micro-v1": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":5120}, + "amazon/nova-premier-v1": {"tools":true,"images":true,"reasoning":false,"context":1000000,"output":32000}, + "amazon/nova-pro-v1": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":5120}, + "anthracite-org/magnum-v4-72b": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":4096}, + "anthropic/claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-fable-5.1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-haiku-4.5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic/claude-opus-4.1": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "anthropic/claude-opus-4.5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic/claude-opus-4.6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-4.7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-4.8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-5.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-sonnet-4": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic/claude-sonnet-4.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "anthropic/claude-sonnet-4.6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-sonnet-5.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "apodex/apodex-1.1-mini:free": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":235929}, + "arcee-ai/trinity-large-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":80000}, + "baidu/ernie-4.5-vl-424b-a47b": {"tools":false,"images":true,"reasoning":true,"context":123000,"output":16000}, + "bytedance-seed/seed-1.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "bytedance-seed/seed-1.6-flash": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "bytedance-seed/seed-2-1-turbo": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "bytedance-seed/seed-2.0-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "bytedance-seed/seed-2.0-lite": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "bytedance-seed/seed-2.0-mini": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "bytedance/ui-tars-1.5-7b": {"tools":false,"images":true,"reasoning":false,"context":128000,"output":2048}, + "cognitivecomputations/dolphin-mistral-24b-venice-edition": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":8192}, + "cohere/command-a": {"tools":false,"images":false,"reasoning":false,"context":256000,"output":8192}, + "cohere/command-a-plus": {"tools":true,"images":true,"reasoning":true,"context":192000,"output":64000}, + "cohere/command-r-08-2024": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4000}, + "cohere/command-r-plus-08-2024": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4000}, + "cohere/command-r7b-12-2024": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":4000}, + "cohere/north-mini-code:free": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":64000}, + "deepseek/deepseek-chat": {"tools":true,"images":false,"reasoning":false,"context":163840,"output":16000}, + "deepseek/deepseek-chat-v3-0324": {"tools":true,"images":false,"reasoning":false,"context":163840,"output":147456}, + "deepseek/deepseek-chat-v3.1": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":32768}, + "deepseek/deepseek-r1": {"tools":true,"images":false,"reasoning":true,"context":64000,"output":16000}, + "deepseek/deepseek-r1-0528": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":32768}, + "deepseek/deepseek-v3.1-terminus": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":147456}, + "deepseek/deepseek-v3.2": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":65536}, + "deepseek/deepseek-v3.2-exp": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":147456}, + "deepseek/deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":943718}, + "deepseek/deepseek-v4-flash-0731": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":943718}, + "deepseek/deepseek-v4-flash-vision-exp": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":262144}, + "deepseek/deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":384000}, + "deepseek/deepseek-v4-pro-0813": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":943718}, + "deepseek/deepseek-v4.1-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "dots-studio/dots-3-note-preview:free": {"tools":true,"images":true,"reasoning":true,"context":512000,"output":460800}, + "fireworks/ember-1": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "google/gemini-2.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65535}, + "google/gemini-2.5-flash-image": {"tools":false,"images":true,"reasoning":false,"context":32768,"output":8192}, + "google/gemini-2.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65535}, + "google/gemini-2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-2.5-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3-flash-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3-pro-image": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "google/gemini-3-pro-image-preview": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":32768}, + "google/gemini-3.1-flash-image": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "google/gemini-3.1-flash-image-preview": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":58982}, + "google/gemini-3.1-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.1-flash-lite-image": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":58982}, + "google/gemini-3.1-flash-lite-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.1-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.1-pro-preview-customtools": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemma-2-27b-it": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":2048}, + "google/gemma-3-12b-it": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":16384}, + "google/gemma-3-27b-it": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":117964}, + "google/gemma-3-4b-it": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":16384}, + "google/gemma-4-26b-a4b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "google/gemma-4-26b-a4b-it:free": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "google/gemma-4-31b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":16384}, + "google/gemma-4-31b-it:free": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "google/lyria-3-clip-preview": {"tools":false,"images":true,"reasoning":false,"context":1048576,"output":65536}, + "google/lyria-3-pro-preview": {"tools":false,"images":true,"reasoning":false,"context":1048576,"output":65536}, + "gryphe/mythomax-l2-13b": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":3686}, + "ibm-granite/granite-4.0-h-micro": {"tools":false,"images":false,"reasoning":false,"context":131000,"output":117900}, + "ibm-granite/granite-4.2-8b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":117964}, + "inception/mercury-2": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":50000}, + "inception/mercury-2.5": {"tools":true,"images":false,"reasoning":true,"context":260000,"output":65536}, + "inclusionai/ling-3.0-flash": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "inclusionai/ling-3.0-flash-fin": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "inclusionai/ling-3.0-flash-sante:free": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "inclusionai/ling-3.0-flash-vl": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "inclusionai/ling-3.1-flash": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "inference-net/schematron-v2-small": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":4096}, + "inference-net/schematron-v2-turbo": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":8192}, + "kwaipilot/kat-coder-pro-v2.5": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":235929}, + "liquid/lfm-2.5-2.6b:free": {"tools":true,"images":false,"reasoning":true,"context":65536,"output":8192}, + "mancer/weaver": {"tools":false,"images":false,"reasoning":false,"context":8000,"output":6000}, + "meituan/longcat-2.0": {"tools":true,"images":false,"reasoning":true,"context":1048756,"output":262144}, + "meta-llama/llama-3.1-70b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":16384}, + "meta-llama/llama-3.1-8b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":117964}, + "meta-llama/llama-3.2-1b-instruct": {"tools":false,"images":false,"reasoning":false,"context":60000,"output":54000}, + "meta-llama/llama-3.2-3b-instruct": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":117964}, + "meta-llama/llama-3.3-70b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":16384}, + "meta-llama/llama-4-maverick": {"tools":true,"images":true,"reasoning":false,"context":1048576,"output":16384}, + "meta-llama/llama-4-scout": {"tools":true,"images":true,"reasoning":false,"context":1310720,"output":16384}, + "meta-llama/llama-guard-4-12b": {"tools":false,"images":true,"reasoning":false,"context":163840,"output":16384}, + "meta/muse-glimmer-30b": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":117964}, + "meta/muse-spark-1.1": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "meta/muse-spark-1.2": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "meta/muse-spark-1.2-contributor": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "meta/muse-spark-1.3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "meta/muse-spark-1.3-contributor": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "microsoft/phi-4": {"tools":false,"images":false,"reasoning":false,"context":16384,"output":14745}, + "microsoft/wizardlm-2-8x22b": {"tools":false,"images":false,"reasoning":false,"context":65535,"output":8000}, + "minimax/minimax-01": {"tools":false,"images":true,"reasoning":false,"context":1000192,"output":40000}, + "minimax/minimax-m1": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":40000}, + "minimax/minimax-m2": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":176947}, + "minimax/minimax-m2-her": {"tools":false,"images":false,"reasoning":false,"context":65536,"output":2048}, + "minimax/minimax-m2.1": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128000}, + "minimax/minimax-m2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":176947}, + "minimax/minimax-m3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":512000}, + "mistralai/codestral-2508": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":204800}, + "mistralai/devstral-2512": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":209715}, + "mistralai/ministral-14b-2512": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":209715}, + "mistralai/ministral-3b-2512": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":104857}, + "mistralai/ministral-8b-2512": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":209715}, + "mistralai/mistral-large": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":102400}, + "mistralai/mistral-large-2407": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":104857}, + "mistralai/mistral-large-2512": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":209715}, + "mistralai/mistral-medium-3": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":104857}, + "mistralai/mistral-medium-3-5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":209715}, + "mistralai/mistral-medium-3.1": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":104857}, + "mistralai/mistral-nemo": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":16384}, + "mistralai/mistral-saba": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":26214}, + "mistralai/mistral-small-24b-instruct-2501": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":16384}, + "mistralai/mistral-small-2603": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":209715}, + "mistralai/mistral-small-3.1-24b-instruct": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":102400}, + "mistralai/mistral-small-3.2-24b-instruct": {"tools":true,"images":true,"reasoning":false,"context":256000,"output":16384}, + "mistralai/mixtral-8x22b-instruct": {"tools":true,"images":false,"reasoning":false,"context":65536,"output":52428}, + "mistralai/voxtral-small-24b-2507": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":26214}, + "moonshotai/kimi-k2": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":98304}, + "moonshotai/kimi-k2-0905": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":98304}, + "moonshotai/kimi-k2-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":235929}, + "moonshotai/kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "moonshotai/kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "moonshotai/kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "moonshotai/kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943718}, + "morph/morph-v3-fast": {"tools":false,"images":false,"reasoning":false,"context":81920,"output":38000}, + "morph/morph-v3-large": {"tools":false,"images":false,"reasoning":false,"context":262144,"output":131072}, + "nex-agi/nex-n2.5-mini": {"tools":false,"images":true,"reasoning":true,"context":262144,"output":235929}, + "nex-agi/nex-n2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "nousresearch/hermes-3-llama-3.1-405b": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":16384}, + "nousresearch/hermes-3-llama-3.1-70b": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":16384}, + "nousresearch/hermes-4-405b": {"tools":false,"images":false,"reasoning":true,"context":131072,"output":117964}, + "nvidia/nemotron-3-nano-30b-a3b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":235929}, + "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":65536}, + "nvidia/nemotron-3-super-120b-a12b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":235929}, + "nvidia/nemotron-3-super-120b-a12b:free": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":235929}, + "nvidia/nemotron-3-ultra-550b-a55b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":16384}, + "nvidia/nemotron-3-ultra-550b-a55b:free": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":65536}, + "nvidia/nemotron-3.5-content-safety": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":117964}, + "nvidia/nemotron-3.5-content-safety:free": {"tools":false,"images":true,"reasoning":true,"context":128000,"output":8192}, + "nvidia/nemotron-3.5-lightning": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":131072}, + "nvidia/nemotron-3.5-lightning:free": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":65536}, + "openai/gpt-3.5-turbo": {"tools":true,"images":false,"reasoning":false,"context":16385,"output":4096}, + "openai/gpt-3.5-turbo-0613": {"tools":true,"images":false,"reasoning":false,"context":4095,"output":3685}, + "openai/gpt-3.5-turbo-16k": {"tools":true,"images":false,"reasoning":false,"context":16385,"output":4096}, + "openai/gpt-3.5-turbo-instruct": {"tools":false,"images":false,"reasoning":false,"context":4095,"output":3685}, + "openai/gpt-4": {"tools":true,"images":false,"reasoning":false,"context":8191,"output":4096}, + "openai/gpt-4-turbo": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "openai/gpt-4.1": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4.1-mini": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4.1-nano": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4o": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-2024-05-13": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "openai/gpt-4o-2024-08-06": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-2024-11-20": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-mini": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-mini-2024-07-18": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-5": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-image": {"tools":false,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-image-mini": {"tools":false,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-codex-max": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-codex-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2-chat": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":32000}, + "openai/gpt-5.2-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.3-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.4-image-2": {"tools":false,"images":true,"reasoning":true,"context":272000,"output":128000}, + "openai/gpt-5.4-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.5": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-luna-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-sol-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-terra-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-astra-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-luna-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-sol-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6.1-sol-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-audio": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-audio-mini": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-chat-latest": {"tools":true,"images":true,"reasoning":false,"context":400000,"output":128000}, + "openai/gpt-oss-120b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":117964}, + "openai/gpt-oss-20b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "openai/gpt-oss-safeguard-20b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":65536}, + "openai/o1": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o1-pro": {"tools":false,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o3": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o3-mini": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":100000}, + "openai/o3-mini-high": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":100000}, + "openai/o3-pro": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o4-mini": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o4-mini-high": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openrouter/auto": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "openrouter/bodybuilder": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":128000}, + "openrouter/free": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":8000}, + "openrouter/fusion": {"tools":false,"images":false,"reasoning":false,"context":1000000,"output":128000}, + "openrouter/pareto-code": {"tools":false,"images":false,"reasoning":false,"context":2000000,"output":200000}, + "perceptron/perceptron-mk1": {"tools":false,"images":true,"reasoning":true,"context":32768,"output":8192}, + "perceptron/perceptron-mk1.5": {"tools":true,"images":true,"reasoning":true,"context":36864,"output":8192}, + "perplexity/sonar": {"tools":false,"images":true,"reasoning":false,"context":127072,"output":114364}, + "perplexity/sonar-deep-research": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":115200}, + "perplexity/sonar-pro": {"tools":false,"images":true,"reasoning":false,"context":200000,"output":8000}, + "perplexity/sonar-pro-search": {"tools":false,"images":true,"reasoning":true,"context":200000,"output":8000}, + "perplexity/sonar-reasoning-pro": {"tools":false,"images":true,"reasoning":true,"context":128000,"output":115200}, + "poolside/laguna-s-2.1": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "poolside/laguna-s-2.1:free": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "poolside/laguna-xs-2.1": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "poolside/laguna-xs-2.1:free": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "prism-ml/ternary-bonsai-2-27b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "qwen/qwen-2.5-72b-instruct": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":16384}, + "qwen/qwen-2.5-7b-instruct": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":29491}, + "qwen/qwen-2.5-coder-32b-instruct": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":29491}, + "qwen/qwen-plus": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":32768}, + "qwen/qwen-plus-2025-07-28": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":32768}, + "qwen/qwen2.5-vl-72b-instruct": {"tools":false,"images":true,"reasoning":false,"context":128000,"output":115200}, + "qwen/qwen3-14b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "qwen/qwen3-235b-a22b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "qwen/qwen3-235b-a22b-2507": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":235929}, + "qwen/qwen3-235b-a22b-thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":117964}, + "qwen/qwen3-30b-a3b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "qwen/qwen3-30b-a3b-instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":32000}, + "qwen/qwen3-30b-a3b-thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":81920,"output":32768}, + "qwen/qwen3-32b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "qwen/qwen3-8b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "qwen/qwen3-coder": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen/qwen3-coder-30b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":235929}, + "qwen/qwen3-coder-flash": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":65536}, + "qwen/qwen3-coder-next": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":235929}, + "qwen/qwen3-coder-plus": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":65536}, + "qwen/qwen3-max": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen/qwen3-max-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3-next-80b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":235929}, + "qwen/qwen3-next-80b-a3b-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "qwen/qwen3-vl-235b-a22b-instruct": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":32768}, + "qwen/qwen3-vl-235b-a22b-thinking": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "qwen/qwen3-vl-30b-a3b-instruct": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":16384}, + "qwen/qwen3-vl-30b-a3b-thinking": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "qwen/qwen3-vl-32b-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":32768}, + "qwen/qwen3-vl-8b-instruct": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":32768}, + "qwen/qwen3-vl-8b-thinking": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "qwen/qwen3.5-122b-a10b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3.5-27b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3.5-35b-a3b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "qwen/qwen3.5-397b-a17b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "qwen/qwen3.5-9b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "qwen/qwen3.5-flash-02-23": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen/qwen3.5-plus-02-15": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen/qwen3.5-plus-20260420": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen/qwen3.6-27b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":81920}, + "qwen/qwen3.6-35b-a3b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "qwen/qwen3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen/qwen3.6-max-preview": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3.6-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen/qwen3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen/qwen3.7-max": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "qwen/qwen3.7-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen/qwen3.8-2.4t-a95b": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "qwen/qwen3.8-27b": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen/qwen3.8-27b:free": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":235929}, + "qwen/qwen3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen/qwen3.8-max-0902": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen/qwen3.8-max-prime": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen/qwen3.8-omni-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "rekaai/reka-edge": {"tools":true,"images":true,"reasoning":false,"context":16384,"output":14745}, + "rekaai/reka-flash-3": {"tools":false,"images":false,"reasoning":true,"context":65536,"output":58982}, + "relace/relace-apply-3": {"tools":false,"images":false,"reasoning":false,"context":256000,"output":128000}, + "relace/relace-search": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":128000}, + "sakana/fugu-max": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "sakana/fugu-ultra": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "sakana/fugu-ultra-v2": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "sakana/sakana-namazu": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "sao10k/l3-lunaris-8b": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":7372}, + "sao10k/l3.1-euryale-70b": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":16384}, + "sao10k/l3.3-euryale-70b": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":16384}, + "stealth/space-bunny-alpha": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":524288}, + "stepfun/step-3.5-flash": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "stepfun/step-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":230400}, + "tencent/hunyuan-a13b-instruct": {"tools":false,"images":false,"reasoning":true,"context":131072,"output":117964}, + "tencent/hy-mt2-1.8b": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":4096}, + "tencent/hy-mt2-30b-a3b": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":4096}, + "tencent/hy-mt2-7b": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":4096}, + "tencent/hy3": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":128000}, + "tencent/hy3-preview": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":235929}, + "tencent/hy4-preview": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":64000}, + "thedrummer/cydonia-24b-v4.1": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":117964}, + "thedrummer/skyfall-36b-v2": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":29491}, + "thedrummer/unslopnemo-12b": {"tools":false,"images":false,"reasoning":false,"context":1024000,"output":819200}, + "thinkingmachines/inkling": {"tools":true,"images":true,"reasoning":true,"context":524288,"output":262144}, + "thinkingmachines/inkling-small": {"tools":true,"images":true,"reasoning":true,"context":524288,"output":262144}, + "thinkingmachines/inkling-small:free": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":262144}, + "thinkingmachines/inkling:free": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":262144}, + "unbiased/pareto": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":131072}, + "unbiased/pareto-26.10-preview": {"tools":true,"images":true,"reasoning":false,"context":1048576,"output":131072}, + "undi95/remm-slerp-l2-13b": {"tools":false,"images":false,"reasoning":false,"context":6144,"output":5529}, + "upstage/solar-mini4": {"tools":true,"images":false,"reasoning":true,"context":524288,"output":131072}, + "upstage/solar-pro-3": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":117964}, + "upstage/solar-pro4": {"tools":true,"images":false,"reasoning":true,"context":524288,"output":131072}, + "writer/palmyra-x5": {"tools":false,"images":false,"reasoning":false,"context":1040000,"output":8192}, + "x-ai/grok-4.20": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":1800000}, + "x-ai/grok-4.20-multi-agent": {"tools":false,"images":true,"reasoning":true,"context":2000000,"output":1800000}, + "x-ai/grok-4.3": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":900000}, + "x-ai/grok-4.5": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":450000}, + "x-ai/grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":450000}, + "x-ai/grok-4.7": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":450000}, + "x-ai/grok-build-0.1": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":230400}, + "xiaomi/mimo-v2.5": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":131072}, + "xiaomi/mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1050000,"output":131072}, + "xiaomi/mimo-v2.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":131072}, + "xiaomi/mimo-v2.6-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":131072}, + "xiaomi/mimo-v2.6-pro-ultraspeed": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "z-ai/glm-4.5": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "z-ai/glm-4.5-air": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "z-ai/glm-4.5v": {"tools":true,"images":true,"reasoning":true,"context":65536,"output":16384}, + "z-ai/glm-4.6": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":16384}, + "z-ai/glm-4.6v": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "z-ai/glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "z-ai/glm-4.7-flash": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":117964}, + "z-ai/glm-5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128000}, + "z-ai/glm-5-turbo": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":131072}, + "z-ai/glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "z-ai/glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":943718}, + "z-ai/glm-5.3": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "z-ai/glm-5.3-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":943717}, + "z-ai/glm-5.3-flashx": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "z-ai/glm-5.3-prime": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "z-ai/glm-5v-turbo": {"tools":true,"images":true,"reasoning":true,"context":202752,"output":131072} + }, + "aihubmix": { + "alicloud-deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "alicloud-deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "alicloud-glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000}, + "claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-fable-5-1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-haiku-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-opus-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-6-think": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-7-think": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-4-8": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "claude-opus-4-8-think": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-opus-5-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "claude-sonnet-4-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "claude-sonnet-4-6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "claude-sonnet-4-6-think": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "coding-glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000}, + "coding-glm-5.1-free": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000}, + "coding-minimax-m2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128100}, + "coding-minimax-m2.7-free": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128100}, + "coding-minimax-m2.7-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128100}, + "coding-xiaomi-mimo-v2.5": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "coding-xiaomi-mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "deep-deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deep-deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-flash-0731": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-flash-0731-fast": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-flash-vision-exp": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-pro-0813": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4.1-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":384000}, + "doubao-seed-2-0-code-preview": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "doubao-seed-2-0-lite-260428": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "doubao-seed-2-0-mini-260428": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "doubao-seed-2-0-pro": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "gemini-2.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-2.5-flash-image": {"tools":false,"images":true,"reasoning":true,"context":32768,"output":32768}, + "gemini-2.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3-flash-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3-pro-image": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":32768}, + "gemini-3.1-flash-image": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "gemini-3.1-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.1-flash-lite-image": {"tools":true,"images":true,"reasoning":true,"context":65536,"output":4096}, + "gemini-3.1-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.1-pro-preview-customtools": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "gemini-3.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "glm-4.5v": {"tools":true,"images":true,"reasoning":true,"context":64000,"output":16384}, + "glm-4.6": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "glm-4.6v": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":32768}, + "glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":128000}, + "glm-5.3": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":128000}, + "glm-5.3-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "glm-5v-turbo": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":128000}, + "gpt-5": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.1-codex-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.2": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.2-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.3-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.4-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.4-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "gpt-5.5": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "gpt-image-1.5": {"tools":false,"images":true,"reasoning":false}, + "grok-4.3": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "grok-4.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "grok-4.7": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "grok-build-0.1": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "hy3": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":128000}, + "hy3-preview": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":128000}, + "hy4-preview": {"tools":true,"images":false,"reasoning":true,"context":1024000,"output":64000}, + "kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "kimi-k2.7-code-highspeed": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "longcat-2.0": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "mimo-v2.5": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.6-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.6-pro-ultraspeed": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "minimax-m2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128000}, + "minimax-m3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":512000}, + "muse-spark-1.1": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "muse-spark-1.2": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "muse-spark-1.3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "o3": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "o4-mini": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "ox-alpha": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen3-max": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen3-vl-plus": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "qwen3.5-122b-a10b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen3.5-27b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen3.5-35b-a3b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen3.5-397b-a17b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.5-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.6-35b-a3b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":991000,"output":64000}, + "qwen3.6-max-preview": {"tools":true,"images":false,"reasoning":true,"context":240000,"output":64000}, + "qwen3.6-plus": {"tools":true,"images":true,"reasoning":true,"context":991000,"output":64000}, + "qwen3.7-flash": {"tools":true,"images":false,"reasoning":true,"context":991000,"output":64000}, + "qwen3.7-max": {"tools":true,"images":false,"reasoning":true,"context":991000,"output":64000}, + "qwen3.7-plus": {"tools":true,"images":false,"reasoning":true,"context":991000,"output":64000}, + "qwen3.8-2.4t-a95b": {"tools":true,"images":true,"reasoning":true,"context":262000,"output":262000}, + "qwen3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen3.8-max": {"tools":true,"images":false,"reasoning":true,"context":991000,"output":128000}, + "qwen3.8-max-preview": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen3.8-omni-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "step-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "step-5-preview": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "xiaomi-mimo-v2.5": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "xiaomi-mimo-v2.5-free": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "xiaomi-mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "xiaomi-mimo-v2.5-pro-free": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "zai-glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000} + }, + "deepseek": { + "deepseek-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":393216}, + "deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":393216} + }, + "siliconflow": { + "ByteDance-Seed/Seed-OSS-36B-Instruct": {"tools":true,"images":false,"reasoning":false,"context":262000,"output":262000}, + "deepseek-ai/DeepSeek-OCR": {"tools":false,"images":true,"reasoning":false,"context":8192,"output":8192}, + "deepseek-ai/DeepSeek-R1": {"tools":true,"images":false,"reasoning":true,"context":164000,"output":164000}, + "deepseek-ai/DeepSeek-V3": {"tools":true,"images":false,"reasoning":false,"context":164000,"output":164000}, + "deepseek-ai/DeepSeek-V3.1-Terminus": {"tools":true,"images":false,"reasoning":true,"context":164000,"output":164000}, + "deepseek-ai/DeepSeek-V3.2": {"tools":true,"images":false,"reasoning":true,"context":164000,"output":164000}, + "deepseek-ai/DeepSeek-V4-Flash": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-ai/DeepSeek-V4-Pro": {"tools":true,"images":false,"reasoning":true,"context":1049000,"output":393000}, + "inclusionAI/Ling-flash-2.0": {"tools":true,"images":false,"reasoning":false,"context":131000,"output":131000}, + "PaddlePaddle/PaddleOCR-VL-1.5": {"tools":false,"images":true,"reasoning":false,"context":16384,"output":16384}, + "Pro/deepseek-ai/DeepSeek-R1": {"tools":true,"images":false,"reasoning":true,"context":164000,"output":164000}, + "Pro/deepseek-ai/DeepSeek-V3": {"tools":true,"images":false,"reasoning":false,"context":164000,"output":164000}, + "Pro/deepseek-ai/DeepSeek-V3.1-Terminus": {"tools":true,"images":false,"reasoning":true,"context":164000,"output":164000}, + "Pro/deepseek-ai/DeepSeek-V3.2": {"tools":true,"images":false,"reasoning":true,"context":164000,"output":164000}, + "Pro/MiniMaxAI/MiniMax-M2.5": {"tools":true,"images":false,"reasoning":false,"context":192000,"output":131000}, + "Pro/moonshotai/Kimi-K2.5": {"tools":true,"images":true,"reasoning":true,"context":262000,"output":262000}, + "Pro/moonshotai/Kimi-K2.6": {"tools":true,"images":true,"reasoning":true,"context":262000,"output":262000}, + "Pro/zai-org/GLM-5": {"tools":true,"images":false,"reasoning":true,"context":205000,"output":205000}, + "Pro/zai-org/GLM-5.1": {"tools":true,"images":false,"reasoning":true,"context":205000,"output":205000}, + "Qwen/Qwen2.5-72B-Instruct": {"tools":true,"images":false,"reasoning":false,"context":33000,"output":4000}, + "Qwen/Qwen2.5-7B-Instruct": {"tools":true,"images":false,"reasoning":false,"context":33000,"output":4000}, + "Qwen/Qwen3-14B": {"tools":true,"images":false,"reasoning":true,"context":131000,"output":131000}, + "Qwen/Qwen3-235B-A22B-Thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":262000,"output":262000}, + "Qwen/Qwen3-30B-A3B-Instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":262000,"output":262000}, + "Qwen/Qwen3-32B": {"tools":true,"images":false,"reasoning":true,"context":131000,"output":131000}, + "Qwen/Qwen3-8B": {"tools":true,"images":false,"reasoning":true,"context":131000,"output":131000}, + "Qwen/Qwen3-Coder-30B-A3B-Instruct": {"tools":true,"images":false,"reasoning":false,"context":262000,"output":262000}, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": {"tools":true,"images":false,"reasoning":false,"context":262000,"output":262000}, + "Qwen/Qwen3-VL-30B-A3B-Instruct": {"tools":true,"images":true,"reasoning":false,"context":262000,"output":262000}, + "Qwen/Qwen3-VL-30B-A3B-Thinking": {"tools":true,"images":true,"reasoning":true,"context":262000,"output":262000}, + "Qwen/Qwen3-VL-32B-Instruct": {"tools":true,"images":true,"reasoning":false,"context":262000,"output":262000}, + "Qwen/Qwen3-VL-32B-Thinking": {"tools":true,"images":true,"reasoning":true,"context":262000,"output":262000}, + "Qwen/Qwen3-VL-8B-Instruct": {"tools":true,"images":true,"reasoning":false,"context":262000,"output":262000}, + "Qwen/Qwen3.5-122B-A10B": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "Qwen/Qwen3.5-27B": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "Qwen/Qwen3.5-35B-A3B": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "Qwen/Qwen3.5-397B-A17B": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "Qwen/Qwen3.5-4B": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "Qwen/Qwen3.5-9B": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "Qwen/Qwen3.6-35B-A3B": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":65536}, + "stepfun-ai/Step-3.5-Flash": {"tools":true,"images":false,"reasoning":true,"context":262000,"output":262000}, + "tencent/Hunyuan-A13B-Instruct": {"tools":true,"images":false,"reasoning":true,"context":131000,"output":131000}, + "zai-org/GLM-4.5-Air": {"tools":true,"images":false,"reasoning":false,"context":131000,"output":131000}, + "zai-org/GLM-5.2": {"tools":true,"images":false,"reasoning":true,"context":1049000,"output":262000} + }, + "gateway": { + "alibaba/qwen-3-14b": {"tools":true,"images":false,"reasoning":true,"context":40960,"output":16384}, + "alibaba/qwen-3-235b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":16384}, + "alibaba/qwen-3-30b": {"tools":true,"images":false,"reasoning":true,"context":40960,"output":16384}, + "alibaba/qwen-3-32b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":8192}, + "alibaba/qwen-3.6-max-preview": {"tools":true,"images":false,"reasoning":true,"context":240000,"output":64000}, + "alibaba/qwen3-235b-a22b-thinking": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "alibaba/qwen3-coder": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "alibaba/qwen3-coder-30b-a3b": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":8192}, + "alibaba/qwen3-coder-next": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":256000}, + "alibaba/qwen3-coder-plus": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":65536}, + "alibaba/qwen3-embedding-0.6b": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":32768}, + "alibaba/qwen3-embedding-4b": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":32768}, + "alibaba/qwen3-embedding-8b": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":32768}, + "alibaba/qwen3-max": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":32768}, + "alibaba/qwen3-max-preview": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":32768}, + "alibaba/qwen3-max-thinking": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":65536}, + "alibaba/qwen3-next-80b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262114,"output":262114}, + "alibaba/qwen3-next-80b-a3b-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":262144}, + "alibaba/qwen3-vl-235b-a22b-instruct": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":129024}, + "alibaba/qwen3-vl-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":129024}, + "alibaba/qwen3-vl-thinking": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "alibaba/qwen3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "alibaba/qwen3.5-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "alibaba/qwen3.6-27b": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":65536}, + "alibaba/qwen3.6-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "alibaba/qwen3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":991000,"output":64000}, + "alibaba/qwen3.7-max": {"tools":true,"images":false,"reasoning":true,"context":991000,"output":64000}, + "alibaba/qwen3.7-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "alibaba/qwen3.8-2.4t-a95b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":128000}, + "alibaba/qwen3.8-27b": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "alibaba/qwen3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":991000,"output":128000}, + "alibaba/qwen3.8-max": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":128000}, + "alibaba/qwen3.8-max-0902": {"tools":true,"images":true,"reasoning":true,"context":991000,"output":128000}, + "alibaba/qwen3.8-max-prime": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "alibaba/qwen3.8-omni-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "amazon/nova-2-lite": {"tools":false,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "amazon/nova-lite": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "amazon/nova-micro": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":10000}, + "amazon/nova-pro": {"tools":true,"images":true,"reasoning":false,"context":300000,"output":10000}, + "amazon/titan-embed-text-v2": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "anthropic/claude-3-haiku": {"tools":true,"images":true,"reasoning":false,"context":200000,"output":4096}, + "anthropic/claude-fable-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-fable-5.1": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-haiku-4.5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic/claude-opus-4": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "anthropic/claude-opus-4.5": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "anthropic/claude-opus-4.6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-4.7": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-4.8": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-4.8-fast": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-5-fast": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-5.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-opus-5.5-fast": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-sonnet-4": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "anthropic/claude-sonnet-4.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "anthropic/claude-sonnet-4.6": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-sonnet-5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "anthropic/claude-sonnet-5.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "arcee-ai/trinity-large-thinking": {"tools":true,"images":false,"reasoning":true,"context":262100,"output":80000}, + "bytedance/seed-1.6": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "bytedance/seed-1.8": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32768}, + "bytedance/seed-2.1-turbo": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "cohere/command-a": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":8000}, + "cohere/embed-v4.0": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":1536}, + "cohere/rerank-v3.5": {"tools":false,"images":false,"reasoning":false,"context":4096,"output":4096}, + "cohere/rerank-v4-fast": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "cohere/rerank-v4-pro": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "deepseek/deepseek-r1": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32768}, + "deepseek/deepseek-v3.1": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":128000}, + "deepseek/deepseek-v3.1-terminus": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "deepseek/deepseek-v3.2": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":8000}, + "deepseek/deepseek-v3.2-thinking": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":8000}, + "deepseek/deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek/deepseek-v4-flash-0731": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek/deepseek-v4-flash-vision-exp": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "deepseek/deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek/deepseek-v4-pro-0813": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek/deepseek-v4.1-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":32768}, + "deepseek/deepseek-v4.1-flash-fast": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1000000}, + "fireworks/ember-1": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "fish-audio/transcribe-1": {"tools":false,"images":false,"reasoning":false}, + "google/gemini-2.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-2.5-flash-image": {"tools":false,"images":true,"reasoning":false,"context":32768,"output":65535}, + "google/gemini-2.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65535}, + "google/gemini-2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "google/gemini-3-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65000}, + "google/gemini-3-pro-image": {"tools":false,"images":true,"reasoning":false,"context":65536,"output":32768}, + "google/gemini-3.1-flash-image": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "google/gemini-3.1-flash-image-preview": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "google/gemini-3.1-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65000}, + "google/gemini-3.1-flash-lite-image": {"tools":false,"images":true,"reasoning":true,"context":65536,"output":4096}, + "google/gemini-3.1-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "google/gemini-3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "google/gemini-3.5-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65000}, + "google/gemini-3.5-transcribe": {"tools":false,"images":false,"reasoning":false}, + "google/gemini-3.5-transcribe-live": {"tools":false,"images":false,"reasoning":false}, + "google/gemini-3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "google/gemini-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "google/gemini-3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65535}, + "google/gemini-3.8-live": {"tools":false,"images":false,"reasoning":false}, + "google/gemini-3.8-live-extended-thinking": {"tools":false,"images":false,"reasoning":false}, + "google/gemini-embedding-001": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "google/gemini-embedding-2": {"tools":false,"images":false,"reasoning":false}, + "google/gemini-omni-flash-preview": {"tools":false,"images":true,"reasoning":true,"context":1000000,"output":57920}, + "google/gemma-4-26b-a4b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "google/gemma-4-31b-it": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":131072}, + "google/text-embedding-005": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "google/text-multilingual-embedding-002": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "inception/mercury-2": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":50000}, + "inception/mercury-2.5": {"tools":true,"images":false,"reasoning":true,"context":260000,"output":65536}, + "inception/mercury-coder-small": {"tools":true,"images":false,"reasoning":false,"context":32000,"output":16384}, + "inclusionai/ling-3.0-flash": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":32000}, + "inclusionai/ling-3.0-flash-fin": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":32000}, + "inclusionai/ling-3.0-flash-sante": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":32000}, + "inclusionai/ling-3.0-flash-sante-free": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":32000}, + "inclusionai/ling-3.0-flash-vl": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "inclusionai/ling-3.1-flash": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "inclusionai/ling-3.1-flash-free": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "inference-net/schematron-v2-small": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":4096}, + "inference-net/schematron-v2-turbo": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":8192}, + "interfaze/interfaze-beta": {"tools":false,"images":true,"reasoning":true,"context":1000000,"output":32000}, + "meituan/longcat-2.5-preview": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "meta/llama-3.1-70b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":8192}, + "meta/llama-3.1-8b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":8192}, + "meta/llama-3.3-70b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "meta/llama-4-maverick": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "meta/llama-4-scout": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "meta/muse-glimmer-30b": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":131072}, + "meta/muse-spark-1.1": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "meta/muse-spark-1.2": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "meta/muse-spark-1.2-contributor": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "meta/muse-spark-1.3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "meta/muse-spark-1.3-contributor": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "microsoft/mai-transcribe-1.5": {"tools":false,"images":false,"reasoning":false}, + "microsoft/mai-transcribe-2": {"tools":false,"images":false,"reasoning":false}, + "microsoft/mai-transcribe-2-streaming": {"tools":false,"images":false,"reasoning":false}, + "minimax/minimax-m2": {"tools":true,"images":false,"reasoning":true,"context":205000,"output":196608}, + "minimax/minimax-m2.1": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.1-lightning": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131000}, + "minimax/minimax-m2.5-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131000}, + "minimax/minimax-m2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131000}, + "minimax/minimax-m2.7-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131100}, + "minimax/minimax-m3": {"tools":true,"images":true,"reasoning":true,"context":512000,"output":512000}, + "mistral/codestral": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":4096}, + "mistral/codestral-embed": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "mistral/ministral-14b": {"tools":false,"images":true,"reasoning":false,"context":262144,"output":256000}, + "mistral/ministral-3b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":128000}, + "mistral/ministral-8b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":128000}, + "mistral/mistral-embed": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "mistral/mistral-large-3": {"tools":false,"images":true,"reasoning":false,"context":262144,"output":256000}, + "mistral/mistral-medium-3.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":256000}, + "mistral/mistral-nemo": {"tools":true,"images":false,"reasoning":false,"context":60288,"output":16000}, + "mistral/mistral-small": {"tools":true,"images":true,"reasoning":false,"context":262144,"output":4000}, + "mixedbread/toast-1": {"tools":true,"images":false,"reasoning":false,"context":131000,"output":4000}, + "moonshotai/kimi-k2": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":131072}, + "moonshotai/kimi-k2-thinking": {"tools":true,"images":false,"reasoning":true,"context":216144,"output":216144}, + "moonshotai/kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "moonshotai/kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262000,"output":262000}, + "moonshotai/kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32768}, + "moonshotai/kimi-k2.7-code-highspeed": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "moonshotai/kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "moonshotai/kimi-k3-fast": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "morph/morph-v3-fast": {"tools":false,"images":false,"reasoning":false,"context":16000,"output":16000}, + "morph/morph-v3-large": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "nvidia/nemotron-3-nano-30b-a3b": {"tools":false,"images":false,"reasoning":true,"context":262144,"output":262144}, + "nvidia/nemotron-3-super-120b-a12b": {"tools":false,"images":false,"reasoning":true,"context":256000,"output":32000}, + "nvidia/nemotron-3-ultra-550b-a55b": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":65000}, + "nvidia/nemotron-3.5-lightning": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":131072}, + "nvidia/nemotron-nano-12b-v2-vl": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":131072}, + "nvidia/nemotron-nano-9b-v2": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":131072}, + "openai/gpt-3.5-turbo": {"tools":false,"images":false,"reasoning":false,"context":16385,"output":4096}, + "openai/gpt-4.1": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4.1-fast": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4.1-mini": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4.1-mini-fast": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4.1-nano-fast": {"tools":true,"images":true,"reasoning":false,"context":1047576,"output":32768}, + "openai/gpt-4o": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-fast": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-mini": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-mini-fast": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":16384}, + "openai/gpt-4o-mini-transcribe": {"tools":false,"images":false,"reasoning":false}, + "openai/gpt-4o-transcribe": {"tools":false,"images":false,"reasoning":false}, + "openai/gpt-5": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-fast": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-mini-fast": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":272000}, + "openai/gpt-5.1-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-codex-max": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-codex-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-thinking": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.1-thinking-fast": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2-fast": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.2-pro": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.3-codex": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.3-codex-fast": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.4-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.4-mini": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4-mini-fast": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4-nano": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "openai/gpt-5.4-pro": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.5": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "openai/gpt-5.5-fast": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "openai/gpt-5.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":128000}, + "openai/gpt-5.6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-luna-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-sol-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-terra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-5.6-terra-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-astra": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-astra-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-luna": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-luna-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6-sol-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6.1-sol": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-6.1-sol-fast": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":128000}, + "openai/gpt-live-1": {"tools":false,"images":false,"reasoning":false}, + "openai/gpt-oss-120b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":131072}, + "openai/gpt-oss-20b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "openai/gpt-oss-safeguard-120b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16000}, + "openai/gpt-oss-safeguard-20b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16000}, + "openai/gpt-realtime-1.5": {"tools":false,"images":false,"reasoning":false}, + "openai/gpt-realtime-2": {"tools":false,"images":false,"reasoning":false}, + "openai/gpt-realtime-2.1": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32000}, + "openai/gpt-realtime-mini": {"tools":false,"images":false,"reasoning":false}, + "openai/gpt-realtime-whisper": {"tools":false,"images":false,"reasoning":false}, + "openai/o3": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o3-fast": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o3-pro": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/o4-mini-fast": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":100000}, + "openai/text-embedding-3-large": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "openai/text-embedding-3-small": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "openai/text-embedding-ada-002": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "openai/whisper-1": {"tools":false,"images":false,"reasoning":false}, + "perplexity/pplx-embed-v1-0.6b": {"tools":false,"images":false,"reasoning":false,"context":32000}, + "perplexity/pplx-embed-v1-4b": {"tools":false,"images":false,"reasoning":false,"context":32000}, + "perplexity/sonar": {"tools":true,"images":true,"reasoning":false,"context":127000,"output":8000}, + "poolside/laguna-s-2.1": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "poolside/laguna-s-2.1-free": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":32768}, + "quiverai/arrow-2": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":65536}, + "quiverai/arrow-2-telos": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":65536}, + "sakana/fugu-max": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "sakana/fugu-ultra": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "sakana/fugu-ultra-v2": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "sakana/namazu": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "spacexai/grok-4.1-fast-non-reasoning": {"tools":true,"images":true,"reasoning":false,"context":1000000,"output":1000000}, + "spacexai/grok-4.1-fast-reasoning": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "spacexai/grok-4.20-multi-agent": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "spacexai/grok-4.20-multi-agent-beta": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "spacexai/grok-4.20-non-reasoning": {"tools":true,"images":true,"reasoning":false,"context":2000000,"output":2000000}, + "spacexai/grok-4.20-non-reasoning-beta": {"tools":true,"images":true,"reasoning":false,"context":2000000,"output":2000000}, + "spacexai/grok-4.20-reasoning": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "spacexai/grok-4.20-reasoning-beta": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "spacexai/grok-4.3": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "spacexai/grok-4.5": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "spacexai/grok-4.6": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "spacexai/grok-4.7": {"tools":true,"images":true,"reasoning":true,"context":500000,"output":500000}, + "spacexai/grok-build-0.1": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "spacexai/grok-stt": {"tools":false,"images":false,"reasoning":false}, + "spacexai/grok-voice-think-fast-1.0": {"tools":false,"images":false,"reasoning":false}, + "spacexai/grok-voice-think-fast-2.0": {"tools":false,"images":false,"reasoning":false}, + "stepfun/step-3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":262114,"output":262114}, + "stepfun/step-3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "stepfun/step-5-preview": {"tools":false,"images":true,"reasoning":false,"context":1000000,"output":1000000}, + "tencent/hy-mt2-lite": {"tools":false,"images":false,"reasoning":false,"context":8000,"output":4000}, + "tencent/hy-mt2-plus": {"tools":false,"images":false,"reasoning":false,"context":8000,"output":4000}, + "tencent/hy-mt2-pro": {"tools":false,"images":false,"reasoning":false,"context":8000,"output":4000}, + "tencent/hy3": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":262144}, + "tencent/hy4-preview": {"tools":true,"images":false,"reasoning":true,"context":1024000,"output":64000}, + "thinkingmachines/inkling": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "thinkingmachines/inkling-small": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":1000000}, + "voyage/rerank-2.5": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "voyage/rerank-2.5-lite": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "voyage/rerank-3": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "voyage/rerank-3-lite": {"tools":false,"images":false,"reasoning":false,"context":32000,"output":32000}, + "voyage/voyage-3-large": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "voyage/voyage-3.5": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "voyage/voyage-3.5-lite": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "voyage/voyage-4": {"tools":false,"images":false,"reasoning":false,"context":32000}, + "voyage/voyage-4-large": {"tools":false,"images":false,"reasoning":false,"context":32000}, + "voyage/voyage-4-lite": {"tools":false,"images":false,"reasoning":false,"context":32000}, + "voyage/voyage-code-2": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "voyage/voyage-code-3": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "voyage/voyage-finance-2": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "voyage/voyage-law-2": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1536}, + "xiaomi/mimo-v2.5": {"tools":true,"images":true,"reasoning":true,"context":1050000,"output":131100}, + "xiaomi/mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1050000,"output":131000}, + "xiaomi/mimo-v2.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "xiaomi/mimo-v2.6-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "xiaomi/mimo-v2.6-pro-ultraspeed": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "zai/glm-4.5": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":96000}, + "zai/glm-4.5-air": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":96000}, + "zai/glm-4.5v": {"tools":true,"images":true,"reasoning":true,"context":66000,"output":16000}, + "zai/glm-4.6": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":96000}, + "zai/glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":120000}, + "zai/glm-4.7-flash": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":131000}, + "zai/glm-4.7-flashx": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000}, + "zai/glm-5": {"tools":true,"images":false,"reasoning":true,"context":202800,"output":131100}, + "zai/glm-5-turbo": {"tools":true,"images":false,"reasoning":true,"context":202800,"output":131072}, + "zai/glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":202800,"output":64000}, + "zai/glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":128000}, + "zai/glm-5.2-fast": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":128000}, + "zai/glm-5.3": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":1000000}, + "zai/glm-5.3-fast": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":262144}, + "zai/glm-5.3-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131000}, + "zai/glm-5.3-flashx": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "zai/glm-5v-turbo": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":128000} + }, + "doubao": { + "deepseek-v4-flash-ga-260731": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-pro-ga-260813": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "doubao-seed-1-6-251015": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":64000}, + "doubao-seed-1-6-flash-250828": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-1-6-vision-250815": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-1-8-251228": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":64000}, + "doubao-seed-2-0-code-preview-260215": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "doubao-seed-2-0-lite-260428": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":131072}, + "doubao-seed-2-0-mini-260428": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":131072}, + "doubao-seed-2-0-pro-260215": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "doubao-seed-2-1-pro-260628": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "doubao-seed-2-1-turbo-260628": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "doubao-seed-character-260628": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "doubao-seed-evolving": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":256000}, + "glm-5-2-260617": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "glm-5-3-flash-260828": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072} + }, + "modelscope": { + "Qwen/Qwen3-235B-A22B-Instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":131072}, + "Qwen/Qwen3-235B-A22B-Thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":131072}, + "Qwen/Qwen3-30B-A3B-Instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":16384}, + "Qwen/Qwen3-30B-A3B-Thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32768}, + "Qwen/Qwen3-Coder-30B-A3B-Instruct": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "ZhipuAI/GLM-4.5": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "ZhipuAI/GLM-4.6": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":98304} + }, + "glm": { + "glm-4.5": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "glm-4.5-air": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "glm-4.5-flash": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "glm-4.5v": {"tools":true,"images":true,"reasoning":true,"context":64000,"output":16384}, + "glm-4.6": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "glm-4.6v": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":32768}, + "glm-4.6v-flash": {"tools":true,"images":true,"reasoning":true,"context":128000,"output":32768}, + "glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "glm-4.7-flash": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":131072}, + "glm-4.7-flashx": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":131072}, + "glm-5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":131072}, + "glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "glm-5.3": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "glm-5.3-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "glm-5.3-flashx": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "glm-5v-turbo": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":131072} + }, + "qwen": { + "deepseek-r1": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "deepseek-r1-0528": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "deepseek-r1-distill-llama-70b": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "deepseek-r1-distill-llama-8b": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "deepseek-r1-distill-qwen-1-5b": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "deepseek-r1-distill-qwen-14b": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "deepseek-r1-distill-qwen-32b": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "deepseek-r1-distill-qwen-7b": {"tools":true,"images":false,"reasoning":true,"context":32768,"output":16384}, + "deepseek-v3": {"tools":true,"images":false,"reasoning":false,"context":65536,"output":8192}, + "deepseek-v3-1": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":65536}, + "deepseek-v3-2-exp": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":65536}, + "deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":384000}, + "deepseek-v4.1-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":384000}, + "glm-5": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":16384}, + "glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":202752,"output":128000}, + "glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":128000}, + "glm-5.3": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":131072}, + "kimi-k2-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":16384}, + "kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":16384}, + "kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "kimi/kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "MiniMax-M2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax/MiniMax-M2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "moonshot-kimi-k2-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qvq-max": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":8192}, + "qwen-deep-research": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":32768}, + "qwen-doc-turbo": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen-flash": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":32768}, + "qwen-long": {"tools":true,"images":false,"reasoning":false,"context":10000000,"output":8192}, + "qwen-math-plus": {"tools":true,"images":false,"reasoning":false,"context":4096,"output":3072}, + "qwen-math-turbo": {"tools":true,"images":false,"reasoning":false,"context":4096,"output":3072}, + "qwen-max": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen-mt-plus": {"tools":false,"images":false,"reasoning":false,"context":16384,"output":8192}, + "qwen-mt-turbo": {"tools":false,"images":false,"reasoning":false,"context":16384,"output":8192}, + "qwen-omni-turbo": {"tools":true,"images":true,"reasoning":false,"context":32768,"output":2048}, + "qwen-omni-turbo-realtime": {"tools":true,"images":true,"reasoning":false,"context":32768,"output":2048}, + "qwen-plus": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":32768}, + "qwen-plus-character": {"tools":true,"images":false,"reasoning":false,"context":32768,"output":4096}, + "qwen-turbo": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":16384}, + "qwen-vl-max": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":8192}, + "qwen-vl-ocr": {"tools":false,"images":true,"reasoning":false,"context":34096,"output":4096}, + "qwen-vl-plus": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-14b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-32b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-72b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-7b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-coder-32b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-coder-7b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-math-72b-instruct": {"tools":true,"images":false,"reasoning":false,"context":4096,"output":3072}, + "qwen2-5-math-7b-instruct": {"tools":true,"images":false,"reasoning":false,"context":4096,"output":3072}, + "qwen2-5-omni-7b": {"tools":true,"images":true,"reasoning":false,"context":32768,"output":2048}, + "qwen2-5-vl-72b-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":8192}, + "qwen2-5-vl-7b-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":8192}, + "qwen3-14b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "qwen3-235b-a22b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "qwen3-32b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":16384}, + "qwen3-8b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "qwen3-asr-flash": {"tools":false,"images":false,"reasoning":false,"context":53248,"output":4096}, + "qwen3-coder-30b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen3-coder-480b-a35b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen3-coder-flash": {"tools":true,"images":false,"reasoning":false,"context":1000000,"output":65536}, + "qwen3-coder-plus": {"tools":true,"images":false,"reasoning":false,"context":1048576,"output":65536}, + "qwen3-max": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "qwen3-next-80b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":32768}, + "qwen3-next-80b-a3b-thinking": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "qwen3-omni-flash": {"tools":true,"images":true,"reasoning":true,"context":65536,"output":16384}, + "qwen3-omni-flash-realtime": {"tools":true,"images":true,"reasoning":false,"context":65536,"output":16384}, + "qwen3-vl-235b-a22b": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "qwen3-vl-30b-a3b": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "qwen3-vl-plus": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":32768}, + "qwen3.5-397b-a17b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen3.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.5-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.6-max-preview": {"tools":true,"images":false,"reasoning":true,"context":245800,"output":65536}, + "qwen3.6-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.7-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen3.7-max": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":65536}, + "qwen3.7-plus": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "qwen3.8-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen3.8-max": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwen3.8-omni-flash": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":131072}, + "qwq-32b": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "qwq-plus": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":8192}, + "siliconflow/deepseek-r1-0528": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":32768}, + "siliconflow/deepseek-v3-0324": {"tools":true,"images":false,"reasoning":false,"context":163840,"output":163840}, + "siliconflow/deepseek-v3.1-terminus": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":65536}, + "siliconflow/deepseek-v3.2": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":65536}, + "tongyi-intent-detect-v3": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":1024} + }, + "qiniu": { + "claude-3.5-haiku": {"tools":true,"images":true,"reasoning":false,"context":200000,"output":8192}, + "claude-3.5-sonnet": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":8200}, + "claude-3.7-sonnet": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":128000}, + "claude-4.0-opus": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "claude-4.0-sonnet": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-4.1-opus": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":32000}, + "claude-4.5-haiku": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "claude-4.5-opus": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":200000}, + "claude-4.5-sonnet": {"tools":true,"images":true,"reasoning":true,"context":200000,"output":64000}, + "deepseek-r1": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":32000}, + "deepseek-r1-0528": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":32000}, + "deepseek-v3": {"tools":false,"images":false,"reasoning":false,"context":128000,"output":16000}, + "deepseek-v3-0324": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":16000}, + "deepseek-v3.1": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":32000}, + "deepseek/deepseek-math-v2": {"tools":false,"images":false,"reasoning":true,"context":160000,"output":160000}, + "deepseek/deepseek-v3.1-terminus": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":32000}, + "deepseek/deepseek-v3.1-terminus-thinking": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32000}, + "deepseek/deepseek-v3.2-251201": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":32000}, + "deepseek/deepseek-v3.2-exp": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":32000}, + "deepseek/deepseek-v3.2-exp-thinking": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32000}, + "doubao-1.5-pro-32k": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":12000}, + "doubao-1.5-thinking-pro": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":16000}, + "doubao-1.5-vision-pro": {"tools":false,"images":true,"reasoning":false,"context":128000,"output":16000}, + "doubao-seed-1.6": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-1.6-flash": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-1.6-thinking": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-2.0-code": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "doubao-seed-2.0-lite": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-2.0-mini": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":32000}, + "doubao-seed-2.0-pro": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":128000}, + "gemini-2.0-flash": {"tools":true,"images":true,"reasoning":false,"context":1048576,"output":8192}, + "gemini-2.0-flash-lite": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":8192}, + "gemini-2.5-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":64000}, + "gemini-2.5-flash-lite": {"tools":true,"images":true,"reasoning":false,"context":1048576,"output":64000}, + "gemini-2.5-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":65536}, + "gemini-3.0-flash-preview": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "gemini-3.0-pro-image-preview": {"tools":false,"images":true,"reasoning":false,"context":32768,"output":8192}, + "gemini-3.0-pro-preview": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":64000}, + "glm-4.5": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "glm-4.5-air": {"tools":true,"images":false,"reasoning":true,"context":131000,"output":4096}, + "gpt-oss-120b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":4096}, + "gpt-oss-20b": {"tools":true,"images":false,"reasoning":true,"context":128000,"output":4096}, + "kimi-k2": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":128000}, + "meituan/longcat-flash-chat": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":131072}, + "meituan/longcat-flash-lite": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":320000}, + "mimo-v2-flash": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":256000}, + "MiniMax-M1": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":80000}, + "minimax/minimax-m2": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000}, + "minimax/minimax-m2.1": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128000}, + "minimax/minimax-m2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128000}, + "minimax/minimax-m2.5-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":128000}, + "moonshotai/kimi-k2-0905": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":100000}, + "moonshotai/kimi-k2-thinking": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":100000}, + "moonshotai/kimi-k2.5": {"tools":true,"images":true,"reasoning":false,"context":256000,"output":256000}, + "openai/gpt-5": {"tools":true,"images":false,"reasoning":false,"context":400000,"output":128000}, + "openai/gpt-5.2": {"tools":true,"images":true,"reasoning":true,"context":400000,"output":128000}, + "qwen-max-2025-01-25": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":4096}, + "qwen-turbo": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":4096}, + "qwen-vl-max-2025-01-25": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":4096}, + "qwen2.5-vl-72b-instruct": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "qwen2.5-vl-7b-instruct": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":8192}, + "qwen3-235b-a22b": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":32000}, + "qwen3-235b-a22b-instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":64000}, + "qwen3-235b-a22b-thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":4096}, + "qwen3-30b-a3b": {"tools":true,"images":false,"reasoning":true,"context":40000,"output":4096}, + "qwen3-30b-a3b-instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":128000,"output":32000}, + "qwen3-30b-a3b-thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":126000,"output":32000}, + "qwen3-32b": {"tools":true,"images":false,"reasoning":true,"context":40000,"output":4096}, + "qwen3-coder-480b-a35b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262000,"output":4096}, + "qwen3-max": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen3-max-preview": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":64000}, + "qwen3-next-80b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":32768}, + "qwen3-next-80b-a3b-thinking": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "qwen3-vl-30b-a3b-thinking": {"tools":true,"images":true,"reasoning":false,"context":128000,"output":32000}, + "qwen3.5-397b-a17b": {"tools":true,"images":true,"reasoning":true,"context":256000,"output":64000}, + "stepfun-ai/gelab-zero-4b-preview": {"tools":true,"images":true,"reasoning":false,"context":8192,"output":4096}, + "stepfun/step-3.5-flash": {"tools":false,"images":true,"reasoning":false,"context":64000,"output":4096}, + "x-ai/grok-4-fast": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "x-ai/grok-4-fast-non-reasoning": {"tools":true,"images":true,"reasoning":false,"context":2000000,"output":2000000}, + "x-ai/grok-4-fast-reasoning": {"tools":true,"images":true,"reasoning":true,"context":2000000,"output":2000000}, + "x-ai/grok-4.1-fast": {"tools":true,"images":false,"reasoning":true,"context":2000000,"output":2000000}, + "x-ai/grok-4.1-fast-non-reasoning": {"tools":true,"images":true,"reasoning":false,"context":2000000,"output":2000000}, + "x-ai/grok-4.1-fast-reasoning": {"tools":true,"images":true,"reasoning":true,"context":20000000,"output":2000000}, + "x-ai/grok-code-fast-1": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":10000}, + "xiaomi/mimo-v2-flash": {"tools":true,"images":false,"reasoning":true,"context":256000,"output":256000}, + "z-ai/autoglm-phone-9b": {"tools":true,"images":true,"reasoning":false,"context":12800,"output":4096}, + "z-ai/glm-4.6": {"tools":true,"images":false,"reasoning":false,"context":200000,"output":200000}, + "z-ai/glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":200000}, + "z-ai/glm-5": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000} + }, + "kimi": { + "kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k2.7-code-highspeed": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576} + }, + "minimax": { + "MiniMax-M2": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax-M2.1": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax-M2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax-M2.5-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax-M2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax-M2.7-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "MiniMax-M3": {"tools":true,"images":true,"reasoning":true,"context":1000000,"output":512000} + }, + "novita": { + "baichuan/baichuan-m2-32b": {"tools":false,"images":false,"reasoning":false,"context":131072,"output":131072}, + "baidu/ernie-4.5-21B-a3b": {"tools":true,"images":false,"reasoning":false,"context":120000,"output":8000}, + "baidu/ernie-4.5-21B-a3b-thinking": {"tools":false,"images":false,"reasoning":true,"context":131072,"output":65536}, + "baidu/ernie-4.5-300b-a47b-paddle": {"tools":false,"images":false,"reasoning":false,"context":123000,"output":12000}, + "baidu/ernie-4.5-vl-28b-a3b": {"tools":true,"images":true,"reasoning":true,"context":30000,"output":8000}, + "baidu/ernie-4.5-vl-28b-a3b-thinking": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":65536}, + "baidu/ernie-4.5-vl-424b-a47b": {"tools":false,"images":true,"reasoning":true,"context":123000,"output":16000}, + "deepseek/deepseek-ocr": {"tools":false,"images":true,"reasoning":false,"context":8192,"output":8192}, + "deepseek/deepseek-ocr-2": {"tools":false,"images":true,"reasoning":false,"context":8192,"output":8192}, + "deepseek/deepseek-prover-v2-671b": {"tools":false,"images":false,"reasoning":false,"context":160000,"output":160000}, + "deepseek/deepseek-r1-0528": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":32768}, + "deepseek/deepseek-r1-0528-qwen3-8b": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":32000}, + "deepseek/deepseek-r1-distill-llama-70b": {"tools":false,"images":false,"reasoning":true,"context":8192,"output":8192}, + "deepseek/deepseek-r1-distill-qwen-14b": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":16384}, + "deepseek/deepseek-r1-distill-qwen-32b": {"tools":false,"images":false,"reasoning":false,"context":64000,"output":32000}, + "deepseek/deepseek-r1-turbo": {"tools":true,"images":false,"reasoning":true,"context":64000,"output":16000}, + "deepseek/deepseek-v3-0324": {"tools":true,"images":false,"reasoning":false,"context":163840,"output":163840}, + "deepseek/deepseek-v3-turbo": {"tools":true,"images":false,"reasoning":false,"context":64000,"output":16000}, + "deepseek/deepseek-v3.1": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "deepseek/deepseek-v3.1-terminus": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "deepseek/deepseek-v3.2": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":65536}, + "deepseek/deepseek-v3.2-exp": {"tools":true,"images":false,"reasoning":true,"context":163840,"output":65536}, + "deepseek/deepseek-v4-flash": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":393216}, + "deepseek/deepseek-v4-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":393216}, + "google/gemma-3-12b-it": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":8192}, + "google/gemma-3-27b-it": {"tools":false,"images":true,"reasoning":false,"context":98304,"output":16384}, + "google/gemma-4-26b-a4b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "google/gemma-4-31b-it": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":131072}, + "gryphe/mythomax-l2-13b": {"tools":false,"images":false,"reasoning":false,"context":4096,"output":3200}, + "inclusionai/ling-2.6-1t": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":32768}, + "inclusionai/ling-2.6-flash": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":32768}, + "inclusionai/ring-2.6-1t": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":65536}, + "kwaipilot/kat-coder-pro": {"tools":true,"images":false,"reasoning":false,"context":256000,"output":128000}, + "meta-llama/llama-3-70b-instruct": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":8000}, + "meta-llama/llama-3-8b-instruct": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":8192}, + "meta-llama/llama-3.1-8b-instruct": {"tools":false,"images":false,"reasoning":false,"context":16384,"output":16384}, + "meta-llama/llama-3.2-3b-instruct": {"tools":false,"images":false,"reasoning":false,"context":32768,"output":32000}, + "meta-llama/llama-3.3-70b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":120000}, + "meta-llama/llama-4-maverick-17b-128e-instruct-fp8": {"tools":false,"images":true,"reasoning":false,"context":1048576,"output":8192}, + "meta-llama/llama-4-scout-17b-16e-instruct": {"tools":false,"images":true,"reasoning":false,"context":131072,"output":131072}, + "microsoft/wizardlm-2-8x22b": {"tools":false,"images":false,"reasoning":false,"context":65535,"output":8000}, + "minimax/minimax-m2": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.1": {"tools":true,"images":false,"reasoning":false,"context":204800,"output":131072}, + "minimax/minimax-m2.5": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.5-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimax/minimax-m2.7-highspeed": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "minimaxai/minimax-m1-80k": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":40000}, + "mistralai/mistral-nemo": {"tools":false,"images":false,"reasoning":false,"context":60288,"output":16000}, + "moonshotai/kimi-k2-0905": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":98304}, + "moonshotai/kimi-k2-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":32768}, + "moonshotai/kimi-k2-thinking": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":98304}, + "moonshotai/kimi-k2.5": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "moonshotai/kimi-k2.6": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "moonshotai/kimi-k2.7-code": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":262144}, + "moonshotai/kimi-k3": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":1048576}, + "nousresearch/hermes-2-pro-llama-3-8b": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":8192}, + "openai/gpt-oss-120b": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "openai/gpt-oss-20b": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "paddlepaddle/paddleocr-vl": {"tools":false,"images":true,"reasoning":false,"context":16384,"output":16384}, + "qwen/qwen-2.5-72b-instruct": {"tools":true,"images":false,"reasoning":false,"context":32000,"output":8192}, + "qwen/qwen-mt-plus": {"tools":false,"images":false,"reasoning":false,"context":16384,"output":8192}, + "qwen/qwen2.5-7b-instruct": {"tools":true,"images":false,"reasoning":false,"context":32000,"output":32000}, + "qwen/qwen2.5-vl-72b-instruct": {"tools":false,"images":true,"reasoning":false,"context":32768,"output":32768}, + "qwen/qwen3-235b-a22b-fp8": {"tools":false,"images":false,"reasoning":true,"context":40960,"output":20000}, + "qwen/qwen3-235b-a22b-instruct-2507": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":16384}, + "qwen/qwen3-235b-a22b-thinking-2507": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "qwen/qwen3-30b-a3b-fp8": {"tools":false,"images":false,"reasoning":true,"context":40960,"output":20000}, + "qwen/qwen3-32b-fp8": {"tools":false,"images":false,"reasoning":true,"context":40960,"output":20000}, + "qwen/qwen3-4b-fp8": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":20000}, + "qwen/qwen3-8b-fp8": {"tools":false,"images":false,"reasoning":true,"context":128000,"output":20000}, + "qwen/qwen3-coder-30b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":160000,"output":32768}, + "qwen/qwen3-coder-480b-a35b-instruct": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen/qwen3-coder-next": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen/qwen3-max": {"tools":true,"images":false,"reasoning":false,"context":262144,"output":65536}, + "qwen/qwen3-next-80b-a3b-instruct": {"tools":true,"images":false,"reasoning":false,"context":131072,"output":32768}, + "qwen/qwen3-next-80b-a3b-thinking": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":32768}, + "qwen/qwen3-omni-30b-a3b-instruct": {"tools":true,"images":true,"reasoning":false,"context":65536,"output":16384}, + "qwen/qwen3-omni-30b-a3b-thinking": {"tools":true,"images":true,"reasoning":true,"context":65536,"output":16384}, + "qwen/qwen3-vl-235b-a22b-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":32768}, + "qwen/qwen3-vl-235b-a22b-thinking": {"tools":false,"images":true,"reasoning":true,"context":131072,"output":32768}, + "qwen/qwen3-vl-30b-a3b-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":32768}, + "qwen/qwen3-vl-30b-a3b-thinking": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":32768}, + "qwen/qwen3-vl-8b-instruct": {"tools":true,"images":true,"reasoning":false,"context":131072,"output":32768}, + "qwen/qwen3.5-122b-a10b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3.5-27b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3.5-35b-a3b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":65536}, + "qwen/qwen3.5-397b-a17b": {"tools":true,"images":true,"reasoning":true,"context":262144,"output":64000}, + "qwen/qwen3.7-max": {"tools":true,"images":false,"reasoning":true,"context":1000000,"output":65536}, + "sao10K/l3-70b-euryale-v2.1": {"tools":true,"images":false,"reasoning":false,"context":8192,"output":8192}, + "sao10K/l3-8b-lunaris": {"tools":false,"images":false,"reasoning":false,"context":8192,"output":8192}, + "sao10K/L3-8B-stheno-v3.2": {"tools":true,"images":false,"reasoning":false,"context":8192,"output":32000}, + "sao10K/l31-70b-euryale-v2.2": {"tools":true,"images":false,"reasoning":false,"context":8192,"output":8192}, + "xiaomimimo/mimo-v2-flash": {"tools":true,"images":false,"reasoning":true,"context":262144,"output":32000}, + "xiaomimimo/mimo-v2-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "xiaomimimo/mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "zai-org/autoglm-phone-9b-multilingual": {"tools":false,"images":true,"reasoning":false,"context":65536,"output":65536}, + "zai-org/glm-4.5": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "zai-org/glm-4.5-air": {"tools":true,"images":false,"reasoning":true,"context":131072,"output":98304}, + "zai-org/glm-4.5v": {"tools":true,"images":true,"reasoning":true,"context":65536,"output":16384}, + "zai-org/glm-4.6": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "zai-org/glm-4.6v": {"tools":true,"images":true,"reasoning":true,"context":131072,"output":32768}, + "zai-org/glm-4.7": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "zai-org/glm-4.7-flash": {"tools":true,"images":false,"reasoning":true,"context":200000,"output":128000}, + "zai-org/glm-5": {"tools":true,"images":false,"reasoning":true,"context":202800,"output":131072}, + "zai-org/glm-5.1": {"tools":true,"images":false,"reasoning":true,"context":204800,"output":131072}, + "zai-org/glm-5.2": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072} + }, + "mimo": { + "mimo-v2.5": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.5-pro": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.5-pro-ultraspeed": {"tools":true,"images":false,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.6-flash": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.6-pro": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072}, + "mimo-v2.6-pro-ultraspeed": {"tools":true,"images":true,"reasoning":true,"context":1048576,"output":131072} + } +} diff --git a/lib/model-catalog.ts b/lib/model-catalog.ts new file mode 100644 index 00000000..60f26cf5 --- /dev/null +++ b/lib/model-catalog.ts @@ -0,0 +1,45 @@ +import catalog from "@/lib/model-catalog.json" +import type { ProviderName } from "@/lib/types/model-config" + +/** + * What models.dev knows about a model (scripts/update-model-catalog.mjs). + * Only used for hints: requests are sent the same way either way, since + * the data can be wrong or out of date. + */ +export interface ModelInfo { + tools: boolean + images: boolean + reasoning: boolean + context?: number + output?: number +} + +const CATALOG = catalog as Record> + +/** + * The entry for a model: an exact match ignoring case, else the longest id + * the model id starts with, followed by "-", ":" or ".". So + * claude-sonnet-4-5-20250929 finds claude-sonnet-4-5, but gpt-4 does not + * find gpt-4o. + */ +export function getModelInfo( + provider: ProviderName, + modelId: string, +): ModelInfo | undefined { + const models = CATALOG[provider] + if (!models) return undefined + const wanted = modelId.trim().toLowerCase() + let best: string | undefined + for (const id of Object.keys(models)) { + const lower = id.toLowerCase() + if (lower === wanted) return models[id] + if ( + wanted.startsWith(lower) && + "-:.".includes(wanted[lower.length]) && + lower.length > (best?.length ?? 0) + ) { + best = id + } + } + return best ? models[best] : undefined +} diff --git a/lib/provider-models.ts b/lib/provider-models.ts new file mode 100644 index 00000000..4f53df4c --- /dev/null +++ b/lib/provider-models.ts @@ -0,0 +1,184 @@ +import { createGateway } from "ai" +import { getModelInfo } from "@/lib/model-catalog" +import { + normalizeBaseUrl, + PROVIDER_INFO, + type ProviderName, +} from "@/lib/types/model-config" + +/** A model a provider offers. tools is false when it cannot call tools. */ +export interface ListedModel { + id: string + tools?: boolean +} + +export const AIHUBMIX_MODELS_ENDPOINT = "https://aihubmix.com/api/v1/models" + +export function canListModels(provider: ProviderName): boolean { + return ( + Object.hasOwn(PROVIDER_INFO, provider) && + !!PROVIDER_INFO[provider].modelList + ) +} + +// Models in OpenAI-style lists that are not for chat +const NON_CHAT = + /(?:^|[-/_])(?:embed(?:ding)?s?|whisper|tts|transcribe|dall-e|moderation|rerank|realtime|sora)(?:$|[-/_])|gpt-image/i + +const NON_CHAT_AIHUBMIX_TYPES = new Set([ + "embedding", + "image_generation", + "rerank", + "transcription", + "tts", + "video", +]) + +/** Chat model ids from AIHubMix's public model list */ +export function extractAihubmixModelIds(payload: unknown): string[] { + const data = (payload as { data?: unknown })?.data + if (!Array.isArray(data)) return [] + const ids = new Set() + for (const item of data) { + const record = item as { model_id?: unknown; types?: unknown } + if (typeof record?.model_id !== "string" || !record.model_id.trim()) { + continue + } + const types = new Set( + typeof record.types === "string" + ? record.types.split(",").map((t) => t.trim()) + : [], + ) + if (!types.has("llm")) continue + if ([...NON_CHAT_AIHUBMIX_TYPES].some((t) => types.has(t))) continue + ids.add(record.model_id.trim()) + } + return [...ids] +} + +/** GET a JSON list; a failed request carries its status for the error hint */ +async function getJson( + url: string, + headers: Record, + fetchFn: typeof fetch, +): Promise { + const response = await fetchFn(url, { + headers, + signal: AbortSignal.timeout(15_000), + }) + if (!response.ok) { + throw Object.assign( + new Error(`The model list request failed (${response.status})`), + { statusCode: response.status }, + ) + } + return response.json() +} + +/** + * The provider's chat models, with tool support from the provider's own + * data or else models.dev. Only the client's key is used, so the server's + * keys never go to a URL the client chose. + */ +export async function listProviderModels( + provider: ProviderName, + { apiKey, baseUrl }: { apiKey?: string; baseUrl?: string }, + fetchFn: typeof fetch = fetch, +): Promise { + const base = normalizeBaseUrl( + baseUrl || PROVIDER_INFO[provider].defaultBaseUrl || "", + ) + const bearer: Record = apiKey + ? { Authorization: `Bearer ${apiKey}` } + : {} + let models: ListedModel[] + + // AIHubMix has a public list, unless the user points to another + // endpoint, which is OpenAI-compatible + const style = + provider === "aihubmix" && + baseUrl && + !/^https:\/\/aihubmix\.com(\/v1)?$/.test(base) + ? "openai" + : PROVIDER_INFO[provider].modelList + + switch (style) { + case "anthropic": { + const data = await getJson( + `${base}/models?limit=1000`, + { + "x-api-key": apiKey ?? "", + "anthropic-version": "2023-06-01", + }, + fetchFn, + ) + models = (data.data ?? []).map((m: { id: string }) => ({ + id: m.id, + })) + break + } + case "google": { + // The key goes in a header: in the URL it would end up in logs + const data = await getJson( + `${base}/models?pageSize=1000`, + { "x-goog-api-key": apiKey ?? "" }, + fetchFn, + ) + models = (data.models ?? []) + .filter((m: { supportedGenerationMethods?: string[] }) => + m.supportedGenerationMethods?.includes("generateContent"), + ) + .map((m: { name: string }) => ({ + id: m.name.replace(/^models\//, ""), + })) + break + } + case "ollama": { + const api = base.endsWith("/api") ? base : `${base}/api` + const data = await getJson(`${api}/tags`, bearer, fetchFn) + models = (data.models ?? []).map((m: { name: string }) => ({ + id: m.name, + })) + break + } + case "openrouter": { + const data = await getJson(`${base}/models`, bearer, fetchFn) + models = (data.data ?? []).map( + (m: { id: string; supported_parameters?: string[] }) => ({ + id: m.id, + ...(m.supported_parameters && { + tools: m.supported_parameters.includes("tools"), + }), + }), + ) + break + } + case "gateway": { + const { models: entries } = await createGateway({ + ...(apiKey && { apiKey }), + ...(baseUrl && { baseURL: base }), + fetch: fetchFn, + }).getAvailableModels() + models = entries + .filter((m) => !m.modelType || m.modelType === "language") + .map((m) => ({ id: m.id })) + break + } + case "aihubmix": { + const data = await getJson(AIHUBMIX_MODELS_ENDPOINT, {}, fetchFn) + models = extractAihubmixModelIds(data).map((id) => ({ id })) + break + } + default: { + const data = await getJson(`${base}/models`, bearer, fetchFn) + models = (data.data ?? []) + .map((m: { id: string }) => ({ id: m.id })) + .filter((m: ListedModel) => !NON_CHAT.test(m.id)) + } + } + + return models.map((m) => ({ + ...m, + tools: m.tools ?? getModelInfo(provider, m.id)?.tools, + })) +} diff --git a/lib/types/model-config.ts b/lib/types/model-config.ts index 4586b83a..200d189f 100644 --- a/lib/types/model-config.ts +++ b/lib/types/model-config.ts @@ -122,25 +122,45 @@ export const PROVIDER_LOGO_MAP: Record = { atlascloud: "openai", } +/** How a provider lists its models (see lib/provider-models.ts) */ +export type ModelListStyle = + | "openai" + | "anthropic" + | "google" + | "ollama" + | "openrouter" + | "aihubmix" + | "gateway" + // Provider metadata. apiKeyUrl is the page where users create a key. +// modelList is missing where a key alone cannot list the models (Bedrock, +// Vertex, Azure) or the list is not reliable (Doubao, MiniMax). export const PROVIDER_INFO: Record< ProviderName, - { label: string; defaultBaseUrl?: string; apiKeyUrl?: string } + { + label: string + defaultBaseUrl?: string + apiKeyUrl?: string + modelList?: ModelListStyle + } > = { openai: { label: "OpenAI", defaultBaseUrl: "https://api.openai.com/v1", apiKeyUrl: "https://platform.openai.com/api-keys", + modelList: "openai", }, anthropic: { label: "Anthropic", defaultBaseUrl: "https://api.anthropic.com/v1", apiKeyUrl: "https://platform.claude.com/settings/keys", + modelList: "anthropic", }, google: { label: "Google", defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta", apiKeyUrl: "https://aistudio.google.com/apikey", + modelList: "google", }, vertexai: { label: "Google Vertex AI" }, azure: { @@ -152,35 +172,42 @@ export const PROVIDER_INFO: Record< label: "Ollama", defaultBaseUrl: "https://ollama.com/api", apiKeyUrl: "https://ollama.com/settings/keys", + modelList: "ollama", }, openrouter: { label: "OpenRouter", defaultBaseUrl: "https://openrouter.ai/api/v1", apiKeyUrl: "https://openrouter.ai/keys", + modelList: "openrouter", }, aihubmix: { label: "AIHubMix", defaultBaseUrl: "https://aihubmix.com/v1", apiKeyUrl: "https://aihubmix.com/token", + modelList: "aihubmix", }, deepseek: { label: "DeepSeek", defaultBaseUrl: "https://api.deepseek.com/v1", apiKeyUrl: "https://platform.deepseek.com/api_keys", + modelList: "openai", }, siliconflow: { label: "SiliconFlow", defaultBaseUrl: "https://api.siliconflow.cn/v1", apiKeyUrl: "https://cloud.siliconflow.cn/account/ak", + modelList: "openai", }, sglang: { label: "SGLang", defaultBaseUrl: "http://127.0.0.1:8000/v1", + modelList: "openai", }, gateway: { label: "AI Gateway", defaultBaseUrl: "https://ai-gateway.vercel.sh/v1/ai", apiKeyUrl: "https://vercel.com/ai-gateway", + modelList: "gateway", }, edgeone: { label: "EdgeOne Pages" }, doubao: { @@ -193,26 +220,31 @@ export const PROVIDER_INFO: Record< label: "ModelScope", defaultBaseUrl: "https://api-inference.modelscope.cn/v1", apiKeyUrl: "https://modelscope.cn/my/myaccesstoken", + modelList: "openai", }, glm: { label: "GLM (Zhipu)", defaultBaseUrl: "https://open.bigmodel.cn/api/paas/v4", apiKeyUrl: "https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys", + modelList: "openai", }, qwen: { label: "Qwen (Alibaba)", defaultBaseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1", apiKeyUrl: "https://bailian.console.aliyun.com/?tab=model#/api-key", + modelList: "openai", }, qiniu: { label: "Qiniu", defaultBaseUrl: "https://api.qnaigc.com/v1", apiKeyUrl: "https://www.qiniu.com/ai/models", + modelList: "openai", }, kimi: { label: "Kimi (Moonshot)", defaultBaseUrl: "https://api.moonshot.cn/v1", apiKeyUrl: "https://platform.moonshot.cn/console/api-keys", + modelList: "openai", }, minimax: { label: "MiniMax", @@ -224,16 +256,19 @@ export const PROVIDER_INFO: Record< label: "Novita AI", defaultBaseUrl: "https://api.novita.ai/openai", apiKeyUrl: "https://novita.ai/dashboard/key", + modelList: "openai", }, mimo: { label: "MiMo (Xiaomi)", defaultBaseUrl: "https://api.xiaomimimo.com/v1", apiKeyUrl: "https://platform.xiaomimimo.com/#/console/api-keys", + modelList: "openai", }, atlascloud: { label: "Atlas Cloud", defaultBaseUrl: "https://api.atlascloud.ai/v1", apiKeyUrl: "https://www.atlascloud.ai/console/api-keys", + modelList: "openai", }, } diff --git a/scripts/update-model-catalog.mjs b/scripts/update-model-catalog.mjs new file mode 100644 index 00000000..e387b24a --- /dev/null +++ b/scripts/update-model-catalog.mjs @@ -0,0 +1,78 @@ +// Refresh lib/model-catalog.json from models.dev (MIT licensed model data): +// whether each model can call tools and read images, and its limits. The +// app only uses it for hints in model settings. Run before a release: +// node scripts/update-model-catalog.mjs +import { writeFileSync } from "node:fs" + +// Our provider id -> models.dev provider id +const PROVIDERS = { + openai: "openai", + anthropic: "anthropic", + google: "google", + vertexai: "google-vertex", + azure: "azure", + bedrock: "amazon-bedrock", + ollama: "ollama-cloud", + openrouter: "openrouter", + aihubmix: "aihubmix", + deepseek: "deepseek", + siliconflow: "siliconflow-cn", + gateway: "vercel", + doubao: "volcengine", + modelscope: "modelscope", + glm: "zhipuai", + qwen: "alibaba-cn", + qiniu: "qiniu-ai", + kimi: "moonshotai-cn", + minimax: "minimax-cn", + novita: "novita-ai", + mimo: "xiaomi", +} + +const response = await fetch("https://models.dev/api.json") +if (!response.ok) throw new Error(`models.dev answered ${response.status}`) +const data = await response.json() + +const catalog = {} +for (const [provider, source] of Object.entries(PROVIDERS)) { + const models = data[source]?.models + if (!models) { + console.warn(`models.dev has no provider ${source}`) + continue + } + catalog[provider] = {} + for (const [id, m] of Object.entries(models).sort(([a], [b]) => + a.localeCompare(b), + )) { + // Chat models only, and none that are on their way out + if (!m.modalities?.output?.includes("text")) continue + if (m.status === "deprecated") continue + catalog[provider][id] = { + tools: m.tool_call === true, + images: m.modalities?.input?.includes("image") === true, + reasoning: m.reasoning === true, + ...(m.limit?.context && { context: m.limit.context }), + ...(m.limit?.output && { output: m.limit.output }), + } + } +} + +// One model per line, so a refresh shows up as a readable diff +const lines = ["{"] +const providers = Object.entries(catalog) +providers.forEach(([provider, models], p) => { + lines.push(` ${JSON.stringify(provider)}: {`) + const entries = Object.entries(models) + entries.forEach(([id, info], i) => { + const comma = i < entries.length - 1 ? "," : "" + lines.push(` ${JSON.stringify(id)}: ${JSON.stringify(info)}${comma}`) + }) + lines.push(` }${p < providers.length - 1 ? "," : ""}`) +}) +lines.push("}") +writeFileSync( + new URL("../lib/model-catalog.json", import.meta.url), + `${lines.join("\n")}\n`, +) +const count = providers.reduce((n, [, m]) => n + Object.keys(m).length, 0) +console.log(`Wrote ${count} models for ${providers.length} providers`) diff --git a/tests/e2e/provider-models.spec.ts b/tests/e2e/provider-models.spec.ts new file mode 100644 index 00000000..7c53f125 --- /dev/null +++ b/tests/e2e/provider-models.spec.ts @@ -0,0 +1,85 @@ +import { expect, type Page, test } from "@playwright/test" +import { getIframe } from "./lib/fixtures" + +// qwen-mt-plus is a translation model; models.dev lists no tool calls for it +const CONFIG = { + version: 1, + providers: [ + { + id: "p1", + provider: "qwen", + apiKey: "test-key", + models: [{ id: "m1", modelId: "qwen-mt-plus" }], + }, + ], +} + +async function openQwenSettings(page: Page) { + await page.addInitScript((config) => { + localStorage.setItem( + "next-ai-draw-io-model-configs", + JSON.stringify(config), + ) + }, CONFIG) + await page.goto("/", { waitUntil: "networkidle" }) + await getIframe(page).waitFor({ state: "visible", timeout: 30000 }) + await page.locator("button:has(svg.lucide-bot)").first().click() + await page.getByText("Configure Models...").click() + const dialog = page.locator('[role="dialog"]') + await dialog.getByText("Qwen (Alibaba)").first().click() + return dialog +} + +test("fetches the provider's models and adds one from the picker", async ({ + page, +}) => { + let request: Record | undefined + await page.route("**/api/provider-models", async (route) => { + request = route.request().postDataJSON() + await route.fulfill({ + json: { + models: [ + { id: "qwen-new-max", tools: true }, + { id: "qwen-text-only", tools: false }, + ], + }, + }) + }) + const dialog = await openQwenSettings(page) + + await expect( + dialog.getByText("may not be able to draw").first(), + ).toBeVisible() + + await dialog + .getByRole("button", { name: "Fetch models from the provider" }) + .click() + const picker = page.locator('[role="listbox"]') + await expect(picker.getByText("qwen-new-max")).toBeVisible() + await expect( + picker.getByRole("option", { name: /qwen-text-only/ }), + ).toContainText("no tool calls") + expect(request).toMatchObject({ provider: "qwen", apiKey: "test-key" }) + + await page.getByPlaceholder("Search models...").fill("new-max") + await picker.getByText("qwen-new-max").click() + await expect(dialog.locator('input[title="qwen-new-max"]')).toBeVisible() +}) + +test("shows a hint when the provider rejects the key", async ({ page }) => { + await page.route("**/api/provider-models", (route) => + route.fulfill({ + status: 401, + json: { code: "invalid_api_key", error: "Incorrect API key" }, + }), + ) + const dialog = await openQwenSettings(page) + await dialog + .getByRole("button", { name: "Fetch models from the provider" }) + .click() + await expect( + dialog.getByText( + "The provider rejected the API key. Check it in model settings. Incorrect API key", + ), + ).toBeVisible() +}) diff --git a/tests/unit/ai-providers.test.ts b/tests/unit/ai-providers.test.ts index 769b57d9..bb666bf7 100644 --- a/tests/unit/ai-providers.test.ts +++ b/tests/unit/ai-providers.test.ts @@ -5,31 +5,6 @@ import { resolveBaseURL, supportsPromptCaching, } from "@/lib/ai-providers" -import { extractAihubmixModelIds } from "@/lib/aihubmix-models" - -describe("extractAihubmixModelIds", () => { - it("extracts unique chat model IDs from the AIHubMix model list payload", () => { - const models = extractAihubmixModelIds({ - data: [ - { model_id: "claude-sonnet-4-5-20250929", types: "llm" }, - { model_id: "gpt-5.1", types: "llm" }, - { model_id: "gpt-5.1", types: "llm" }, - { model_id: "gpt-image-2", types: "image_generation,llm" }, - { model_id: "cohere-rerank-v4.0", types: "rerank" }, - { model_id: "", types: "llm" }, - { types: "llm" }, - ], - }) - - expect(models).toEqual(["claude-sonnet-4-5-20250929", "gpt-5.1"]) - }) - - it("returns an empty list for malformed payloads", () => { - expect(extractAihubmixModelIds({ data: null })).toEqual([]) - expect(extractAihubmixModelIds({})).toEqual([]) - expect(extractAihubmixModelIds(null)).toEqual([]) - }) -}) describe("resolveBaseURL", () => { const SERVER_BASE_URL = "https://server-proxy.example.com" diff --git a/tests/unit/model-catalog.test.ts b/tests/unit/model-catalog.test.ts new file mode 100644 index 00000000..879760d5 --- /dev/null +++ b/tests/unit/model-catalog.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from "vitest" +import { getModelInfo } from "@/lib/model-catalog" +import catalog from "@/lib/model-catalog.json" + +describe("getModelInfo", () => { + it("finds a model by its exact id, ignoring case", () => { + const id = Object.keys(catalog.openai).find((m) => m === "gpt-4.1") + expect(id).toBe("gpt-4.1") + expect(getModelInfo("openai", "GPT-4.1")).toEqual( + catalog.openai["gpt-4.1"], + ) + }) + + it("finds a dated or tagged variant by the longest id it starts with", () => { + expect(getModelInfo("openai", "gpt-4.1-2025-04-14")).toEqual( + catalog.openai["gpt-4.1"], + ) + }) + + it("does not match a different model that shares a prefix", () => { + // gpt-4.1-mini is its own entry, not gpt-4.1 + expect(getModelInfo("openai", "gpt-4.1-mini")).toEqual( + catalog.openai["gpt-4.1-mini"], + ) + expect(getModelInfo("openai", "gpt-4.1x")).toBeUndefined() + }) + + it("knows nothing about providers models.dev does not list", () => { + expect(getModelInfo("sglang", "anything")).toBeUndefined() + expect(getModelInfo("openai", "not-a-model")).toBeUndefined() + }) +}) diff --git a/tests/unit/provider-models.test.ts b/tests/unit/provider-models.test.ts new file mode 100644 index 00000000..3cae9ed5 --- /dev/null +++ b/tests/unit/provider-models.test.ts @@ -0,0 +1,158 @@ +// @vitest-environment node +import { afterEach, describe, expect, it, vi } from "vitest" +import { POST as providerModels } from "@/app/api/provider-models/route" +import { + canListModels, + extractAihubmixModelIds, + listProviderModels, +} from "@/lib/provider-models" + +afterEach(() => { + vi.unstubAllGlobals() +}) + +/** A fetch that answers with this JSON and records the request */ +function answer(json: unknown, status = 200) { + const calls: Array<{ url: string; headers: Record }> = [] + const fn = vi.fn(async (url: string, init?: RequestInit) => { + calls.push({ url, headers: (init?.headers ?? {}) as any }) + return new Response(JSON.stringify(json), { status }) + }) as unknown as typeof fetch + return { fn, calls } +} + +describe("listProviderModels", () => { + it("reads an OpenAI-style list and drops models that are not for chat", async () => { + const { fn, calls } = answer({ + data: [ + { id: "gpt-4.1" }, + { id: "text-embedding-3-small" }, + { id: "whisper-1" }, + { id: "gpt-image-1" }, + ], + }) + const models = await listProviderModels("openai", { apiKey: "k" }, fn) + expect(models.map((m) => m.id)).toEqual(["gpt-4.1"]) + // Tool support comes from models.dev when the list has none + expect(models[0].tools).toBe(true) + expect(calls[0].url).toBe("https://api.openai.com/v1/models") + expect(calls[0].headers.Authorization).toBe("Bearer k") + }) + + it("uses the base URL the user gave, without a pasted path", async () => { + const { fn, calls } = answer({ data: [{ id: "m" }] }) + await listProviderModels( + "glm", + { + apiKey: "k", + baseUrl: "https://proxy.example.com/v4/chat/completions", + }, + fn, + ) + expect(calls[0].url).toBe("https://proxy.example.com/v4/models") + }) + + it("asks Anthropic with its own headers", async () => { + const { fn, calls } = answer({ data: [{ id: "claude-sonnet-4-5" }] }) + await listProviderModels("anthropic", { apiKey: "k" }, fn) + expect(calls[0].url).toBe( + "https://api.anthropic.com/v1/models?limit=1000", + ) + expect(calls[0].headers["x-api-key"]).toBe("k") + }) + + it("keeps Gemini models that generate content, without models/", async () => { + const { fn, calls } = answer({ + models: [ + { + name: "models/gemini-2.5-flash", + supportedGenerationMethods: ["generateContent"], + }, + { + name: "models/text-embedding-004", + supportedGenerationMethods: ["embedContent"], + }, + ], + }) + const models = await listProviderModels("google", { apiKey: "k" }, fn) + expect(models.map((m) => m.id)).toEqual(["gemini-2.5-flash"]) + // The key is a header, not part of the URL + expect(calls[0].url).not.toContain("k&") + expect(calls[0].headers["x-goog-api-key"]).toBe("k") + }) + + it("reads Ollama's tags and OpenRouter's tool support", async () => { + const ollama = answer({ models: [{ name: "llama3.2" }] }) + await listProviderModels( + "ollama", + { baseUrl: "http://localhost:11434" }, + ollama.fn, + ) + expect(ollama.calls[0].url).toBe("http://localhost:11434/api/tags") + + const openrouter = answer({ + data: [ + { id: "a/with-tools", supported_parameters: ["tools"] }, + { id: "b/no-tools", supported_parameters: ["temperature"] }, + ], + }) + const models = await listProviderModels("openrouter", {}, openrouter.fn) + expect(models).toEqual([ + { id: "a/with-tools", tools: true }, + { id: "b/no-tools", tools: false }, + ]) + }) + + it("turns a failed request into an error with its status", async () => { + const { fn } = answer({ error: "bad key" }, 401) + await expect( + listProviderModels("deepseek", { apiKey: "k" }, fn), + ).rejects.toMatchObject({ statusCode: 401 }) + }) +}) + +describe("extractAihubmixModelIds", () => { + it("keeps unique chat models", () => { + expect( + extractAihubmixModelIds({ + data: [ + { model_id: "claude-sonnet-4-5", types: "llm" }, + { model_id: "gpt-5.1", types: "llm" }, + { model_id: "gpt-5.1", types: "llm" }, + { model_id: "gpt-image-2", types: "image_generation,llm" }, + { model_id: "", types: "llm" }, + ], + }), + ).toEqual(["claude-sonnet-4-5", "gpt-5.1"]) + expect(extractAihubmixModelIds({ data: null })).toEqual([]) + }) +}) + +describe("POST /api/provider-models", () => { + const post = (body: unknown) => + providerModels( + new Request("http://localhost/api/provider-models", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }), + ) + + it("answers null for providers that cannot list models", async () => { + expect(canListModels("bedrock")).toBe(false) + expect(canListModels("toString" as never)).toBe(false) + const res = await post({ provider: "bedrock" }) + expect(await res.json()).toEqual({ models: null }) + }) + + it("needs the user's key where the list is not public", async () => { + const res = await post({ provider: "deepseek" }) + expect(res.status).toBe(400) + }) + + it("explains a failure with the error hints", async () => { + vi.stubGlobal("fetch", answer({}, 401).fn) + const res = await post({ provider: "deepseek", apiKey: "k" }) + expect(await res.json()).toMatchObject({ code: "invalid_api_key" }) + }) +})