diff --git a/packages/ai/test/issue-5983-repro.test.ts b/packages/ai/test/issue-5983-repro.test.ts new file mode 100644 index 000000000..3aaf888f7 --- /dev/null +++ b/packages/ai/test/issue-5983-repro.test.ts @@ -0,0 +1,76 @@ +import { describe, expect, it } from "bun:test"; +import { streamOpenAICompletions } from "@oh-my-pi/pi-ai/providers/openai-completions"; +import type { Context, FetchImpl } from "@oh-my-pi/pi-ai/types"; +import { buildModel } from "@oh-my-pi/pi-catalog/build"; +import { Effort } from "@oh-my-pi/pi-catalog/effort"; +import { getSupportedEfforts } from "@oh-my-pi/pi-catalog/model-thinking"; + +const model = buildModel({ + id: "kimi-k3", + name: "Kimi K3", + api: "openai-completions", + provider: "litellm", + baseUrl: "http://127.0.0.1:4000/v1", + reasoning: true, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 262_144, + maxTokens: 32_768, +}); + +const context: Context = { + messages: [{ role: "user", content: "hello", timestamp: 0 }], +}; + +async function capturePayload(reasoning: Effort): Promise { + let payload: unknown; + const fetchMock: FetchImpl = Object.assign( + async (_input: string | URL | Request, init?: RequestInit): Promise => { + payload = JSON.parse(typeof init?.body === "string" ? init.body : "{}"); + return new Response( + 'data: {"id":"x","object":"chat.completion.chunk","created":0,"model":"kimi-k3","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\ndata: [DONE]\n\n', + { headers: { "content-type": "text/event-stream" } }, + ); + }, + { preconnect: fetch.preconnect }, + ); + + await streamOpenAICompletions(model, context, { + apiKey: "test-key", + fetch: fetchMock, + reasoning, + }).result(); + return payload; +} + +describe("issue #5983 — Kimi K3 OpenAI-compatible effort contract", () => { + it("derives K3's mandatory low/high/max ladder for a LiteLLM route", () => { + expect(getSupportedEfforts(model)).toEqual([Effort.Low, Effort.High, Effort.Max]); + expect(model.thinking).toMatchObject({ + mode: "effort", + defaultLevel: Effort.Max, + requiresEffort: true, + }); + expect(model.compat.reasoningEffortMap).toEqual({ + minimal: "low", + medium: "high", + xhigh: "max", + max: "max", + }); + }); + + it("folds every generic requested tier into K3's accepted wire values", async () => { + const cases: readonly (readonly [Effort, string])[] = [ + [Effort.Minimal, "low"], + [Effort.Low, "low"], + [Effort.Medium, "high"], + [Effort.High, "high"], + [Effort.XHigh, "max"], + [Effort.Max, "max"], + ]; + const payloads = await Promise.all(cases.map(([requested]) => capturePayload(requested))); + for (let index = 0; index < cases.length; index++) { + expect(payloads[index]).toMatchObject({ reasoning_effort: cases[index]?.[1] }); + } + }); +}); diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index bbff6a8be..d76d147b1 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed Kimi K3 models served through generic OpenAI-compatible routes exposing unsupported reasoning efforts instead of the mandatory `low`/`high`/`max` scale ([#5983](https://github.com/can1357/oh-my-pi/issues/5983)). + ## [17.0.4] - 2026-07-18 ### Changed diff --git a/packages/catalog/src/compat/openai.ts b/packages/catalog/src/compat/openai.ts index ab84bd379..b7a6346df 100644 --- a/packages/catalog/src/compat/openai.ts +++ b/packages/catalog/src/compat/openai.ts @@ -154,14 +154,32 @@ const OPENCODE_WHEN_THINKING: NonNullable = { reasoningContentField: "reasoning_content", }; +const KIMI_K3_REASONING_EFFORT_MAP: NonNullable = { + minimal: "low", + medium: "high", + xhigh: "max", + max: "max", +}; + const MIMO_REASONING_EFFORT_MAP: NonNullable = { minimal: "low", xhigh: "high", }; -function mergeMimoReasoningEffortMap(compat: ResolvedOpenAISharedCompat, enabled: boolean): void { - if (!enabled) return; - compat.reasoningEffortMap = { ...MIMO_REASONING_EFFORT_MAP, ...compat.reasoningEffortMap }; +function mergeModelReasoningEffortMap( + compat: ResolvedOpenAISharedCompat, + modelId: string, + isMimoReasoningEffortModel: boolean, +): void { + let detected: NonNullable; + if (isKimiK3ModelId(modelId)) { + detected = KIMI_K3_REASONING_EFFORT_MAP; + } else if (isMimoReasoningEffortModel) { + detected = MIMO_REASONING_EFFORT_MAP; + } else { + return; + } + compat.reasoningEffortMap = { ...detected, ...compat.reasoningEffortMap }; } function detectStrictModeSupport(provider: string, baseUrl: string): boolean { @@ -249,11 +267,10 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv const isKimiModel = isKimiModelId(spec.id); const isMoonshotNative = modelMatchesHost(hostModel, "moonshotNative"); const isMoonshotKimi = isKimiModel && isMoonshotNative; - // Kimi K3 (native) always reasons via OpenAI-style `reasoning_effort: "max"` - // and does NOT accept the K2.x binary `thinking: { type }` block, so it must - // stay on the "openai" thinking dialect even though it is a Moonshot-native - // Kimi model (#5756). - const isMoonshotKimiK3 = isMoonshotKimi && isKimiK3ModelId(spec.id); + // Native Kimi K3 uses OpenAI-style `reasoning_effort` with mandatory + // low/high/max thinking, not the K2.x binary `thinking: { type }` block. + const isKimiK3 = isKimiK3ModelId(spec.id); + const isMoonshotKimiK3 = isMoonshotKimi && isKimiK3; const requiresEnabledThinking = isMoonshotKimi && matchesKimiK27CodeFamily(spec); const usesMoonshotKimiPreservedThinking = isMoonshotKimi && isKimiK26ModelId(spec.id); const isAnthropicModel = @@ -423,7 +440,7 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv // OpenAI proprietary reasoning models (o-series, gpt-5+) reject explicit // temperature/top_p/… with a 400 on every serving host (#5606). supportsSamplingParams: !isOpenAISamplingRestrictedModelId(spec.id), - reasoningEffortMap: isMimoReasoningEffortModel ? MIMO_REASONING_EFFORT_MAP : {}, + reasoningEffortMap: {}, supportsUsageInStreaming: !isCerebras, // pi-ai's thinking-loop guard is gemini-only; default the flag from the // family classifier so OpenAI-compat proxies serving Gemini are covered. @@ -436,11 +453,9 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv // every call since the family can otherwise emit very long reasoning traces // before the final answer. alwaysSendMaxTokens: isKimiModel, - // Native Kimi K3 always reasons via `reasoning_effort: "max"` (never the + // Native Kimi K3 always reasons through `reasoning_effort` (never the // K2.x binary `thinking` block that #827's forced-tool-choice conflict is - // about), so suppressing its effort would strip the mandatory `max` from - // normal forced-tool turns (e.g. plan-mode `toolChoice: "required"`) and - // leave K3 in an unsupported mode (#5758 review). + // about), so suppressing its effort would leave K3 in an unsupported mode. disableReasoningOnForcedToolChoice: (isKimiModel && !isMoonshotKimiK3) || isAnthropicModel, disableReasoningOnToolChoice: isDeepseekFamily && Boolean(spec.reasoning) && !isOpenRouter, supportsToolChoice: !isDirectDeepseekReasoning, @@ -451,11 +466,10 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv requiresAssistantAfterToolResult: isMistral, requiresThinkingAsText: isMistral, requiresMistralToolIds: isMistral, - // Only Kimi's native hosts (Moonshot / Kimi-code, matched by `isMoonshotKimi`) - // speak the z.ai binary `thinking: { type }` field. Kimi reached through - // OpenAI-compatible proxies — Fireworks' Fire Pass router, OpenCode's gateway, - // etc. — drives reasoning via OpenAI-style `reasoning_effort` - // (low|medium|high|xhigh|max|none), so those stay on the "openai" path. + // Only Kimi's native K2.x hosts (Moonshot / Kimi-code, matched by + // `isMoonshotKimi`) speak the z.ai binary `thinking: { type }` field. + // K3 and Kimi reached through OpenAI-compatible proxies drive reasoning + // via OpenAI-style `reasoning_effort`. // NVIDIA NIM hosts Qwen with the vLLM convention // (`chat_template_kwargs.enable_thinking`); top-level `enable_thinking` // is rejected by NIM's `additionalProperties: false` request schema @@ -557,7 +571,7 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv if (spec.compat?.omitReasoningEffort === undefined && !compat.supportsReasoningEffort) { compat.omitReasoningEffort = true; } - mergeMimoReasoningEffortMap(compat, isMimoReasoningEffortModel); + mergeModelReasoningEffortMap(compat, spec.id, isMimoReasoningEffortModel); const whenThinkingPolicy = spec.compat?.whenThinking ?? (isOpenCodeProvider && spec.reasoning ? OPENCODE_WHEN_THINKING : undefined); @@ -570,7 +584,7 @@ export function buildOpenAICompat(spec: ModelSpec<"openai-completions">): Resolv if (whenThinkingPolicy.omitReasoningEffort === undefined && !variant.supportsReasoningEffort) { variant.omitReasoningEffort = true; } - mergeMimoReasoningEffortMap(variant, isMimoReasoningEffortModel); + mergeModelReasoningEffortMap(variant, spec.id, isMimoReasoningEffortModel); compat.whenThinking = variant; } diff --git a/packages/catalog/src/model-thinking.ts b/packages/catalog/src/model-thinking.ts index 4916dc0ce..1783d1508 100644 --- a/packages/catalog/src/model-thinking.ts +++ b/packages/catalog/src/model-thinking.ts @@ -25,6 +25,7 @@ import { findThinkingVariantToken, isDeepseekModelIdOrName, isGlm52ReasoningEffortModelId, + isKimiK3ModelId, isMimoModelIdOrName, isMinimaxM2FamilyModelId, isMinimaxM3FamilyModelId, @@ -61,6 +62,8 @@ const GEMINI_3_FLASH_EFFORTS: readonly Effort[] = [Effort.Minimal, Effort.Low, E const GPT_5_2_PLUS_EFFORTS: readonly Effort[] = [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh]; const GPT_5_1_CODEX_MINI_EFFORTS: readonly Effort[] = [Effort.Medium, Effort.High]; const LOW_MEDIUM_HIGH_REASONING_EFFORTS: readonly Effort[] = [Effort.Low, Effort.Medium, Effort.High]; +/** Kimi K3's wire-exact mandatory reasoning scale. */ +const KIMI_K3_REASONING_EFFORTS: readonly Effort[] = [Effort.Low, Effort.High, Effort.Max]; /** Wire-exact two-tier scale (`high`/`max`): GLM-5.2 on Z.ai/Umans/Ollama Cloud/Baseten, Sakana Fugu, DeepSeek. */ const HIGH_MAX_REASONING_EFFORTS: readonly Effort[] = [Effort.High, Effort.Max]; /** OpenRouter's DeepSeek route accepts only `high`. */ @@ -174,7 +177,8 @@ function fillThinkingWireDefaults( (spec.api === "anthropic-messages" || spec.api === "bedrock-converse-stream") && supportsAdaptiveThinkingDisplay(spec.id); const needsRequiresEffort = thinking.requiresEffort === undefined && impliesMandatoryReasoning(parsed, spec.id); - if (!effortsChanged && !shouldReplaceEffortMap && !needsDisplay && !needsRequiresEffort) { + const needsDefaultLevel = thinking.defaultLevel === undefined && isKimiK3ModelId(spec.id); + if (!effortsChanged && !shouldReplaceEffortMap && !needsDisplay && !needsRequiresEffort && !needsDefaultLevel) { return thinking; } const filled: ThinkingConfig = { ...thinking }; @@ -191,6 +195,9 @@ function fillThinkingWireDefaults( if (needsDisplay) { filled.supportsDisplay = true; } + if (needsDefaultLevel) { + filled.defaultLevel = Effort.Max; + } if (needsRequiresEffort) { filled.requiresEffort = true; } @@ -208,6 +215,9 @@ export function deriveThinking(spec: ModelSpec, compat: mode: inferThinkingControlMode(spec, parsed), efforts, }; + if (isKimiK3ModelId(spec.id)) { + config.defaultLevel = Effort.Max; + } const effortMap = inferEffortMap(spec, compat, config.mode, config.efforts); if (effortMap !== undefined) { config.effortMap = effortMap; @@ -328,6 +338,9 @@ function getModelDefinedEfforts( return DEFAULT_REASONING_EFFORTS_WITH_MAX; } } + if (isKimiK3ModelId(spec.id)) { + return KIMI_K3_REASONING_EFFORTS; + } if (isSakanaFuguReasoningModel(spec)) { return HIGH_MAX_REASONING_EFFORTS; } @@ -544,6 +557,7 @@ function impliesMandatoryReasoning(parsed: ParsedModel, modelId: string): boolea if (semverGte(parsed.version, "3.0")) return true; if (parsed.kind === "pro" && semverGte(parsed.version, "2.5")) return true; } + if (isKimiK3ModelId(modelId)) return true; if (isMinimaxM2FamilyModelId(modelId)) return true; if (OPENAI_O_SERIES_RE.test(bareModelId(modelId))) return true; return findThinkingVariantToken(modelId) !== undefined; diff --git a/packages/catalog/src/models.json b/packages/catalog/src/models.json index 21253668c..a07aacf55 100644 --- a/packages/catalog/src/models.json +++ b/packages/catalog/src/models.json @@ -11832,7 +11832,7 @@ "cacheRead": 0.13, "cacheWrite": 0 }, - "contextWindow": 272000, + "contextWindow": 400000, "maxTokens": 128000, "thinking": { "mode": "effort", @@ -11890,7 +11890,7 @@ "cacheRead": 0.03, "cacheWrite": 0 }, - "contextWindow": 272000, + "contextWindow": 400000, "maxTokens": 128000, "thinking": { "mode": "effort", @@ -11919,7 +11919,7 @@ "cacheRead": 0.01, "cacheWrite": 0 }, - "contextWindow": 272000, + "contextWindow": 400000, "maxTokens": 128000, "thinking": { "mode": "effort", @@ -11977,7 +11977,7 @@ "cacheRead": 0.125, "cacheWrite": 0 }, - "contextWindow": 272000, + "contextWindow": 400000, "maxTokens": 128000, "thinking": { "mode": "effort", @@ -13682,6 +13682,36 @@ ] } }, + "moonshotai/kimi-k3": { + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "api": "anthropic-messages", + "provider": "cloudflare-ai-gateway", + "baseUrl": "https://gateway.ai.cloudflare.com/v1///anthropic", + "reasoning": true, + "input": [ + "text", + "image" + ], + "cost": { + "input": 3, + "output": 15, + "cacheRead": 0.3, + "cacheWrite": 0 + }, + "contextWindow": 1048576, + "maxTokens": 131072, + "thinking": { + "mode": "budget", + "efforts": [ + "low", + "high", + "max" + ], + "defaultLevel": "max", + "requiresEffort": true + } + }, "openai/gpt-4": { "id": "openai/gpt-4", "name": "GPT-4", @@ -18260,7 +18290,7 @@ "cacheWrite": 0 }, "contextWindow": 262144, - "maxTokens": 65536, + "maxTokens": 262144, "thinking": { "mode": "effort", "efforts": [ @@ -19561,7 +19591,7 @@ "input": 1, "output": 6, "cacheRead": 0.1, - "cacheWrite": 0 + "cacheWrite": 1.25 }, "contextWindow": 1050000, "maxTokens": 128000, @@ -19595,7 +19625,7 @@ "input": 5, "output": 30, "cacheRead": 0.5, - "cacheWrite": 0 + "cacheWrite": 6.25 }, "contextWindow": 1050000, "maxTokens": 128000, @@ -19629,7 +19659,7 @@ "input": 2.5, "output": 15, "cacheRead": 0.25, - "cacheWrite": 0 + "cacheWrite": 3.125 }, "contextWindow": 1050000, "maxTokens": 128000, @@ -29741,9 +29771,10 @@ "api": "openai-completions", "provider": "kilo", "baseUrl": "https://api.kilo.ai/api/gateway", - "reasoning": false, + "reasoning": true, "input": [ - "text" + "text", + "image" ], "cost": { "input": 0, @@ -29752,7 +29783,20 @@ "cacheWrite": 0 }, "contextWindow": 1048576, - "maxTokens": 131072 + "maxTokens": 131072, + "thinking": { + "mode": "effort", + "efforts": [ + "low", + "high", + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true + } }, "morph-warp-grep-v2": { "id": "morph-warp-grep-v2", @@ -32092,6 +32136,25 @@ ] } }, + "openrouter/auto-beta": { + "id": "openrouter/auto-beta", + "name": "Auto Router (Beta)", + "api": "openai-completions", + "provider": "kilo", + "baseUrl": "https://api.kilo.ai/api/gateway", + "reasoning": false, + "input": [ + "text" + ], + "cost": { + "input": 0, + "output": 0, + "cacheRead": 0, + "cacheWrite": 0 + }, + "contextWindow": 2000000, + "maxTokens": null + }, "openrouter/bodybuilder": { "id": "openrouter/bodybuilder", "name": "Body Builder (beta)", @@ -34624,6 +34687,25 @@ "contextWindow": 32768, "maxTokens": 32768 }, + "thinkingmachines/inkling": { + "id": "thinkingmachines/inkling", + "name": "Inkling", + "api": "openai-completions", + "provider": "kilo", + "baseUrl": "https://api.kilo.ai/api/gateway", + "reasoning": false, + "input": [ + "text" + ], + "cost": { + "input": 0, + "output": 0, + "cacheRead": 0, + "cacheWrite": 0 + }, + "contextWindow": 1000000, + "maxTokens": 65536 + }, "tngtech/deepseek-r1t2-chimera": { "id": "tngtech/deepseek-r1t2-chimera", "name": "DeepSeek R1T2 Chimera", @@ -37893,12 +37975,15 @@ "thinking": { "mode": "effort", "efforts": [ - "minimal", "low", - "medium", "high", - "xhigh" - ] + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true } }, "moonshot-v1-128k": { @@ -47183,13 +47268,14 @@ }, "moonshotai/kimi-k3": { "id": "moonshotai/kimi-k3", - "name": "moonshotai/kimi-k3", + "name": "Kimi K3", "api": "openai-completions", "provider": "nanogpt", "baseUrl": "https://nano-gpt.com/api/v1", - "reasoning": false, + "reasoning": true, "input": [ - "text" + "text", + "image" ], "cost": { "input": 0, @@ -47198,7 +47284,20 @@ "cacheWrite": 0 }, "contextWindow": 1048576, - "maxTokens": 131072 + "maxTokens": 131072, + "thinking": { + "mode": "effort", + "efforts": [ + "low", + "high", + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true + } }, "moonshotai/kimi-latest": { "id": "moonshotai/kimi-latest", @@ -56351,6 +56450,40 @@ ] } }, + "moonshotai/kimi-k3": { + "id": "moonshotai/kimi-k3", + "name": "Kimi K3", + "api": "openai-completions", + "provider": "novita", + "baseUrl": "https://api.novita.ai/openai/v1", + "reasoning": true, + "input": [ + "text", + "image" + ], + "cost": { + "input": 3, + "output": 15, + "cacheRead": 0.3, + "cacheWrite": 0 + }, + "contextWindow": 1048576, + "maxTokens": 1048576, + "supportsTools": true, + "thinking": { + "mode": "effort", + "efforts": [ + "low", + "high", + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true + } + }, "nousresearch/hermes-2-pro-llama-3-8b": { "id": "nousresearch/hermes-2-pro-llama-3-8b", "name": "Hermes 2 Pro Llama 3 8B", @@ -64573,9 +64706,9 @@ "text" ], "cost": { - "input": 1.74, - "output": 3.48, - "cacheRead": 0.0145, + "input": 0.435, + "output": 0.87, + "cacheRead": 0.003625, "cacheWrite": 0 }, "contextWindow": 1000000, @@ -64806,7 +64939,7 @@ }, "kimi-k3": { "id": "kimi-k3", - "name": "Kimi K3", + "name": "Kimi K3 (2x usage)", "api": "openai-completions", "provider": "opencode-go", "baseUrl": "https://opencode.ai/zen/go/v1", @@ -64826,12 +64959,15 @@ "thinking": { "mode": "effort", "efforts": [ - "minimal", "low", - "medium", "high", - "xhigh" - ] + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true } }, "mimo-v2-omni": { @@ -64937,9 +65073,9 @@ "text" ], "cost": { - "input": 1.74, - "output": 3.48, - "cacheRead": 0.0145, + "input": 0.435, + "output": 0.87, + "cacheRead": 0.003625, "cacheWrite": 0 }, "contextWindow": 1048576, @@ -69732,13 +69868,13 @@ "image" ], "cost": { - "input": 0.22, - "output": 0.55, + "input": 0.12, + "output": 0.37, "cacheRead": 0.12, "cacheWrite": 0 }, "contextWindow": 262144, - "maxTokens": 262144, + "maxTokens": 16384, "thinking": { "mode": "effort", "efforts": [ @@ -71100,7 +71236,7 @@ "cacheWrite": 0 }, "contextWindow": 262144, - "maxTokens": 262144, + "maxTokens": 100352, "thinking": { "mode": "effort", "efforts": [ @@ -71211,9 +71347,9 @@ "image" ], "cost": { - "input": 0.75, - "output": 3.5, - "cacheRead": 0.16, + "input": 1, + "output": 4.4, + "cacheRead": 0.19999999999999998, "cacheWrite": 0 }, "contextWindow": 262144, @@ -71250,11 +71386,15 @@ "thinking": { "mode": "effort", "efforts": [ - "minimal", "low", - "medium", - "high" - ] + "high", + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true } }, "nex-agi/deepseek-v3.1-nex-n1": { @@ -73514,6 +73654,35 @@ ] } }, + "openrouter/auto-beta": { + "id": "openrouter/auto-beta", + "name": "Auto Router (Beta)", + "api": "openrouter", + "provider": "openrouter", + "baseUrl": "https://openrouter.ai/api/v1", + "reasoning": true, + "input": [ + "text", + "image" + ], + "cost": { + "input": -1000000, + "output": -1000000, + "cacheRead": 0, + "cacheWrite": 0 + }, + "contextWindow": 2000000, + "maxTokens": null, + "thinking": { + "mode": "effort", + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, "openrouter/elephant-alpha": { "id": "openrouter/elephant-alpha", "name": "Elephant", @@ -74019,13 +74188,13 @@ "text" ], "cost": { - "input": 0.09999999999999999, - "output": 0.24, + "input": 0.22749999999999998, + "output": 0.9099999999999999, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 131702, - "maxTokens": 40960, + "maxTokens": 8192, "thinking": { "mode": "effort", "efforts": [ @@ -74123,13 +74292,13 @@ "text" ], "cost": { - "input": 0.12, - "output": 0.5, + "input": 0.13, + "output": 0.52, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 131072, - "maxTokens": 16384, + "maxTokens": 8192, "thinking": { "mode": "effort", "efforts": [ @@ -74759,13 +74928,13 @@ "image" ], "cost": { - "input": 0.195, - "output": 1.56, + "input": 0.26, + "output": 2.6, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 262144, - "maxTokens": 65536, + "maxTokens": 81920, "thinking": { "mode": "effort", "efforts": [ @@ -75606,6 +75775,35 @@ "contextWindow": 32768, "maxTokens": 32768 }, + "thinkingmachines/inkling": { + "id": "thinkingmachines/inkling", + "name": "Inkling", + "api": "openrouter", + "provider": "openrouter", + "baseUrl": "https://openrouter.ai/api/v1", + "reasoning": true, + "input": [ + "text", + "image" + ], + "cost": { + "input": 1, + "output": 4.05, + "cacheRead": 0.16999999999999998, + "cacheWrite": 0 + }, + "contextWindow": 1048576, + "maxTokens": 65536, + "thinking": { + "mode": "effort", + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] + } + }, "tngtech/deepseek-r1t2-chimera": { "id": "tngtech/deepseek-r1t2-chimera", "name": "DeepSeek R1T2 Chimera", @@ -76462,13 +76660,13 @@ "text" ], "cost": { - "input": 0.06, + "input": 0.060500000000000005, "output": 0.39999999999999997, "cacheRead": 0.01, "cacheWrite": 0 }, - "contextWindow": 202752, - "maxTokens": 16384, + "contextWindow": 200000, + "maxTokens": 131072, "thinking": { "mode": "effort", "efforts": [ @@ -76565,9 +76763,9 @@ "text" ], "cost": { - "input": 1.2166, - "output": 3.8236000000000003, - "cacheRead": 0.22594, + "input": 0.3024, + "output": 0.9504, + "cacheRead": 0.05616, "cacheWrite": 0 }, "contextWindow": 1048576, @@ -76768,7 +76966,7 @@ "synthetic": { "hf:MiniMaxAI/MiniMax-M3": { "id": "hf:MiniMaxAI/MiniMax-M3", - "name": "MiniMaxAI/MiniMax-M3", + "name": "MiniMax-M3", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -76783,7 +76981,7 @@ "cacheRead": 0.6, "cacheWrite": 0 }, - "contextWindow": 262144, + "contextWindow": 524288, "maxTokens": 65536, "thinking": { "mode": "effort", @@ -76798,7 +76996,7 @@ }, "hf:moonshotai/Kimi-K2.7-Code": { "id": "hf:moonshotai/Kimi-K2.7-Code", - "name": "moonshotai/Kimi-K2.7-Code", + "name": "Kimi K2.7 Code", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -76828,7 +77026,7 @@ }, "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4": { "id": "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", - "name": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", + "name": "Nemotron 3 Super 120B A12B", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -76857,7 +77055,7 @@ }, "hf:openai/gpt-oss-120b": { "id": "hf:openai/gpt-oss-120b", - "name": "openai/gpt-oss-120b", + "name": "GPT OSS 120B", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -76884,7 +77082,7 @@ }, "hf:Qwen/Qwen3.6-27B": { "id": "hf:Qwen/Qwen3.6-27B", - "name": "Qwen/Qwen3.6-27B", + "name": "Qwen3.6 27B", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -76913,7 +77111,7 @@ }, "hf:zai-org/GLM-4.7-Flash": { "id": "hf:zai-org/GLM-4.7-Flash", - "name": "zai-org/GLM-4.7-Flash", + "name": "GLM-4.7-Flash", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -76942,7 +77140,7 @@ }, "hf:zai-org/GLM-5.2": { "id": "hf:zai-org/GLM-5.2", - "name": "zai-org/GLM-5.2", + "name": "GLM-5.2", "api": "openai-completions", "provider": "synthetic", "baseUrl": "https://api.synthetic.new/openai/v1", @@ -77729,6 +77927,36 @@ "contextWindow": 1000000, "maxTokens": 500000 }, + "thinkingmachines/Inkling": { + "id": "thinkingmachines/Inkling", + "name": "Inkling", + "api": "openai-completions", + "provider": "together", + "baseUrl": "https://api.together.xyz/v1", + "reasoning": true, + "input": [ + "text", + "image" + ], + "cost": { + "input": 1, + "output": 4.05, + "cacheRead": 0.17, + "cacheWrite": 0 + }, + "contextWindow": 524288, + "maxTokens": 131072, + "thinking": { + "mode": "effort", + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + } + }, "zai-org/GLM-4.7": { "id": "zai-org/GLM-4.7", "name": "GLM-4.7", @@ -79576,24 +79804,32 @@ }, "inkling": { "id": "inkling", - "name": "inkling", + "name": "Inkling", "api": "openai-completions", "provider": "venice", "baseUrl": "https://api.venice.ai/api/v1", - "reasoning": false, + "reasoning": true, "input": [ - "text" + "text", + "image" ], "cost": { - "input": 0, - "output": 0, - "cacheRead": 0, + "input": 1.25, + "output": 5.0625, + "cacheRead": 0.2125, "cacheWrite": 0 }, - "contextWindow": null, - "maxTokens": null, - "compat": { - "supportsUsageInStreaming": false + "contextWindow": 1000000, + "maxTokens": 65536, + "thinking": { + "mode": "effort", + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2-5": { @@ -79731,25 +79967,25 @@ "image" ], "cost": { - "input": 0, - "output": 0, - "cacheRead": 0, + "input": 3.75, + "output": 18.75, + "cacheRead": 0.375, "cacheWrite": 0 }, - "contextWindow": 1048576, + "contextWindow": 1000000, "maxTokens": 131072, "thinking": { "mode": "effort", "efforts": [ - "minimal", "low", - "medium", "high", - "xhigh" - ] - }, - "compat": { - "supportsUsageInStreaming": false + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true } }, "llama-3.2-3b": { @@ -84684,12 +84920,12 @@ "thinking": { "mode": "budget", "efforts": [ - "minimal", "low", - "medium", "high", - "xhigh" - ] + "max" + ], + "defaultLevel": "max", + "requiresEffort": true } }, "nvidia/nemotron-3-nano-30b-a3b": { @@ -88432,9 +88668,9 @@ }, "includeEncryptedReasoning": false, "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, "omitReasoningEffort": true, - "supportsReasoningEffort": false, - "supportsImageDetailOriginal": false + "supportsReasoningEffort": false } }, "grok-4.20-0309-reasoning": { @@ -88462,9 +88698,9 @@ }, "includeEncryptedReasoning": false, "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, "omitReasoningEffort": true, - "supportsReasoningEffort": false, - "supportsImageDetailOriginal": false + "supportsReasoningEffort": false } }, "grok-4.20-multi-agent-0309": { @@ -88485,6 +88721,16 @@ }, "contextWindow": 2000000, "maxTokens": 2000000, + "compat": { + "reasoningEffortMap": { + "minimal": "low" + }, + "includeEncryptedReasoning": false, + "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, + "omitReasoningEffort": false, + "supportsReasoningEffort": true + }, "thinking": { "mode": "effort", "efforts": [ @@ -88497,16 +88743,6 @@ "effortMap": { "minimal": "low" } - }, - "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, - "includeEncryptedReasoning": false, - "filterReasoningHistory": true, - "omitReasoningEffort": false, - "supportsReasoningEffort": true, - "supportsImageDetailOriginal": false } }, "grok-4.3": { @@ -88528,6 +88764,16 @@ }, "contextWindow": 1000000, "maxTokens": 1000000, + "compat": { + "reasoningEffortMap": { + "minimal": "low" + }, + "includeEncryptedReasoning": false, + "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, + "omitReasoningEffort": false, + "supportsReasoningEffort": true + }, "thinking": { "mode": "effort", "efforts": [ @@ -88540,16 +88786,6 @@ "effortMap": { "minimal": "low" } - }, - "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, - "includeEncryptedReasoning": false, - "filterReasoningHistory": true, - "omitReasoningEffort": false, - "supportsReasoningEffort": true, - "supportsImageDetailOriginal": false } }, "grok-4.5": { @@ -88571,6 +88807,16 @@ }, "contextWindow": 500000, "maxTokens": 500000, + "compat": { + "reasoningEffortMap": { + "minimal": "low" + }, + "includeEncryptedReasoning": false, + "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, + "omitReasoningEffort": false, + "supportsReasoningEffort": true + }, "thinking": { "mode": "effort", "efforts": [ @@ -88583,16 +88829,6 @@ "effortMap": { "minimal": "low" } - }, - "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, - "includeEncryptedReasoning": false, - "filterReasoningHistory": true, - "omitReasoningEffort": false, - "supportsReasoningEffort": true, - "supportsImageDetailOriginal": false } }, "grok-build": { @@ -88620,9 +88856,9 @@ }, "includeEncryptedReasoning": false, "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, "omitReasoningEffort": true, - "supportsReasoningEffort": false, - "supportsImageDetailOriginal": false + "supportsReasoningEffort": false } }, "grok-build-0.1": { @@ -88650,9 +88886,9 @@ }, "includeEncryptedReasoning": false, "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, "omitReasoningEffort": true, - "supportsReasoningEffort": false, - "supportsImageDetailOriginal": false + "supportsReasoningEffort": false } }, "grok-composer-2.5-fast": { @@ -88679,9 +88915,9 @@ }, "includeEncryptedReasoning": false, "filterReasoningHistory": true, + "supportsImageDetailOriginal": false, "omitReasoningEffort": true, - "supportsReasoningEffort": false, - "supportsImageDetailOriginal": false + "supportsReasoningEffort": false } } }, @@ -92103,12 +92339,15 @@ "thinking": { "mode": "effort", "efforts": [ - "minimal", "low", - "medium", "high", - "xhigh" - ] + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true } }, "moonshotai/kimi-k3-free": { @@ -92133,12 +92372,15 @@ "thinking": { "mode": "effort", "efforts": [ - "minimal", "low", - "medium", "high", - "xhigh" - ] + "max" + ], + "defaultLevel": "max", + "effortMap": { + "max": "max" + }, + "requiresEffort": true } }, "openai/chat-latest": {