diff --git a/packages/agent/src/compaction/compaction.ts b/packages/agent/src/compaction/compaction.ts index 0fb97be23..881e34760 100644 --- a/packages/agent/src/compaction/compaction.ts +++ b/packages/agent/src/compaction/compaction.ts @@ -539,10 +539,11 @@ function effortFromThinkingLevel(level: ThinkingLevel): Effort { * - Explicit effort → respect user choice → clamped per model. * * The clamp routes through `clampThinkingLevelForModel`, which returns - * `undefined` for models with `compat.supportsReasoningEffort: false` - * (e.g. `xai-oauth/grok-build`). That `undefined` then flows through to the - * openai-responses mapper where `modelOmitsReasoningEffort` short-circuits - * the wire param — no `requireSupportedEffort` throw. + * `undefined` for reasoning models without a thinking config — the build-time + * encoding of `compat.supportsReasoningEffort: false` (e.g. + * `xai-oauth/grok-build`). That `undefined` then flows through to the + * openai-responses mapper, which omits the wire param — no + * `requireSupportedEffort` throw. */ function resolveCompactionEffort(model: Model, level: ThinkingLevel | undefined): Effort | undefined { if (level === ThinkingLevel.Off) return undefined; diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 01bd8840d..e02c5cc5b 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -15,6 +15,7 @@ - Auth storage no longer issues per-boot no-op writes: the schema-version row is only rewritten when the recorded version actually changes, and the credential identity-key backfill skips rows whose derived identity is null — reopening a current-schema database now performs zero write transactions - Plain provider env-var names moved to the catalog table: registry defs dropped their 48 `envKeys` literals (including the pure `$pickenv` pickers for `huggingface`/`qwen-portal`/`xai-oauth`), `getEnvApiKey` now derives those fallbacks from `CATALOG_PROVIDERS[].envVars`, and `envKeys` remains only for computed resolvers (Anthropic Foundry, Vertex ADC, Bedrock credential chains) and non-catalog providers (`kagi`, `tavily`, `parallel`, `perplexity`) - Protocol handlers are now pure `model.compat` readers — the per-request `resolve*Compat`/`detect*Compat` calls (anthropic ×11, responses ×3, completions wrappers), inline `strictResponsesPairing` host detection, the OpenCode `reasoning_content` mutation block, and all `resolvedBaseUrl` threading are gone. Compat is materialized once at model build time (`@oh-my-pi/pi-catalog` `buildModel`); the OpenCode thinking-mode quirk is a precomputed `compat.whenThinking` pointer swap, and request-time base-URL overrides only feed the HTTP client. Behavior is unchanged (the Anthropic `supportsLongCacheRetention` official-endpoint gate is folded into detection). +- Providers now read baked thinking/wire metadata instead of re-parsing model ids per request: the Anthropic handler gates sampling params on `model.compat.supportsSamplingParams` and adaptive `display` on `model.thinking.supportsDisplay` (Bedrock too), adaptive effort tiers come from the baked `thinking.effortMap`, the Google `thinkingLevel` map is static, and effort-dial-less reasoners (`thinking: undefined`, e.g. `xai-oauth/grok-build`) short-circuit `resolveOpenAiReasoningEffort` without the removed `modelOmitsReasoningEffort` predicate. ### Fixed @@ -26,6 +27,7 @@ - Fixed in-stream Anthropic SSE `error` events being thrown as raw JSON envelopes; the structured `error.type`/`message` is parsed out, keeping retry classification on the typed token instead of accidental regex hits. - Fixed transparent-reconnect tolerance duplicating content behind replaying proxies: after a duplicate `message_start`, replayed `content_block_start` events for already-closed indexes are now consumed silently instead of appending duplicate text/tool calls. - Fixed the Anthropic gateway accepting malformed known-type content blocks (e.g. `{type:"text", text:123}`) through the unknown-block catch-all, corrupting history and surfacing later as an opaque TypeError — they now fail validation with a clean 400. The gateway's encode stream also emits `ping` keepalives every 15s and a complete `message_start`/`message_delta`/`message_stop` envelope when the inner stream ends without a terminal event, so strict clients no longer classify slow or empty streams as protocol errors. +- Fixed dotted-version Claude ids (`claude-opus-4.7`/`4.8` on GitHub Copilot, Vercel AI Gateway, Zenmux) missing adaptive thinking `display` support — streamed reasoning stayed hidden on those entries because the display predicate only matched dash-form ids (same failure class as #1373). - Fixed the Mistral `requiresThinkingAsText` replay path calling `.unshift()` on string assistant content — an unconditional TypeError that failed any same-model history turn carrying both thinking and text. - Fixed the Responses gateway stripping `encrypted_content` from inbound reasoning items (strip-mode schema), which broke codex-style stateless replay; the schema is now loose, restoring the symmetry the outbound encoder already preserved. Composite internal `callId|itemId` ids are also split before hitting the wire so third-party clients that validate `call_id` charsets no longer reject them. - Ported the shared unfinished-tool-call sweep to the codex `response.completed` handler, so a lost `output_item.done` can no longer persist a tool call with stale `{}` arguments and transient parser fields into session history. diff --git a/packages/ai/src/providers/amazon-bedrock.ts b/packages/ai/src/providers/amazon-bedrock.ts index 6bd5a2b1b..9db064531 100644 --- a/packages/ai/src/providers/amazon-bedrock.ts +++ b/packages/ai/src/providers/amazon-bedrock.ts @@ -8,7 +8,6 @@ */ import type { Effort } from "@oh-my-pi/pi-catalog/effort"; -import { supportsAdaptiveThinkingDisplay } from "@oh-my-pi/pi-catalog/identity"; import { mapEffortToAnthropicAdaptiveEffort, requireSupportedEffort } from "@oh-my-pi/pi-catalog/model-thinking"; import { calculateCost } from "@oh-my-pi/pi-catalog/models"; import { $env, $flag, extractHttpStatusFromError, fetchWithRetry } from "@oh-my-pi/pi-utils"; @@ -819,7 +818,7 @@ function buildAdditionalModelRequestFields( // runs (issue #1373). Opt back into "summarized" by default on models that // accept the field. const adaptive: { type: "adaptive"; display?: BedrockThinkingDisplay } = { type: "adaptive" }; - if (supportsAdaptiveThinkingDisplay(model.id)) { + if (model.thinking?.supportsDisplay) { adaptive.display = options.thinkingDisplay ?? "summarized"; } return { diff --git a/packages/ai/src/providers/anthropic.ts b/packages/ai/src/providers/anthropic.ts index 27aa2d719..2e868d8b2 100644 --- a/packages/ai/src/providers/anthropic.ts +++ b/packages/ai/src/providers/anthropic.ts @@ -3,8 +3,7 @@ import * as fs from "node:fs"; import { scheduler } from "node:timers/promises"; import * as tls from "node:tls"; import { isOfficialAnthropicApiUrl } from "@oh-my-pi/pi-catalog/compat/anthropic"; -import { supportsAdaptiveThinkingDisplay } from "@oh-my-pi/pi-catalog/identity"; -import { hasOpus47ApiRestrictions, mapEffortToAnthropicAdaptiveEffort } from "@oh-my-pi/pi-catalog/model-thinking"; +import { mapEffortToAnthropicAdaptiveEffort } from "@oh-my-pi/pi-catalog/model-thinking"; import { calculateCost } from "@oh-my-pi/pi-catalog/models"; import { isAnthropicOAuthToken } from "@oh-my-pi/pi-catalog/utils"; import { parseGitHubCopilotApiKey } from "@oh-my-pi/pi-catalog/wire/github-copilot"; @@ -2279,7 +2278,7 @@ export function buildAnthropicClientOptions(args: AnthropicClientOptionsArgs): A claudeCodeSessionId, } = args; const compat = model.compat; - const needsInterleavedBeta = interleavedThinking && !supportsAdaptiveThinkingDisplay(model.id); + const needsInterleavedBeta = interleavedThinking && !model.thinking?.supportsDisplay; const needsFineGrainedToolStreamingBeta = hasTools && !compat.supportsEagerToolInputStreaming; const oauthToken = isOAuth ?? isAnthropicOAuthToken(apiKey); const baseUrl = resolveAnthropicBaseUrl(model, apiKey); @@ -2754,7 +2753,7 @@ function buildParams( // callers that rely on it. The `display` field is gated strictly on model // support: Opus 4.6 / Sonnet 4.6+ reject it with a 400, so an explicit // `thinkingDisplay` MUST NOT force it onto a model that can't accept it. - if (supportsAdaptiveThinkingDisplay(model.id)) { + if (model.thinking?.supportsDisplay) { adaptive.display = options.thinkingDisplay ?? "summarized"; } thinking = adaptive; @@ -2817,7 +2816,7 @@ function buildParams( // Opus 4.7+ and Fable/Mythos 5 reject non-default sampling parameters with 400 error. const thinkingType = params.thinking?.type; const allowSamplingParams = - !hasOpus47ApiRestrictions(model.id) && (thinkingType === undefined || thinkingType === "disabled"); + model.compat.supportsSamplingParams && (thinkingType === undefined || thinkingType === "disabled"); if (allowSamplingParams && options?.temperature !== undefined) { params.temperature = options.temperature; } diff --git a/packages/ai/src/stream.ts b/packages/ai/src/stream.ts index 9845c9943..c8d8dbe67 100644 --- a/packages/ai/src/stream.ts +++ b/packages/ai/src/stream.ts @@ -3,7 +3,6 @@ import { isVertexExpressOpenAIUrl, isVertexRawPredictUrl } from "@oh-my-pi/pi-ca import { mapEffortToAnthropicAdaptiveEffort, mapEffortToGoogleThinkingLevel, - modelOmitsReasoningEffort, requireSupportedEffort, } from "@oh-my-pi/pi-catalog/model-thinking"; import { CATALOG_PROVIDERS, type ProviderCatalogEntry } from "@oh-my-pi/pi-catalog/provider-models"; @@ -654,14 +653,15 @@ function resolveOpenAiReasoningEffort( ): Effort | undefined { const reasoning = options?.reasoning; if (!reasoning || !model.reasoning) return undefined; - // Models with compat.supportsReasoningEffort: false reason natively but - // reject the wire effort param. The wire-side omitReasoningEffort gate - // (providers/xai-responses.ts:78) is the actual strip; returning - // undefined here avoids a redundant requireSupportedEffort throw that - // would defeat the gate and surface a confusing - // "Compaction failed: Thinking effort high is not supported by..." to - // the user. - if (modelOmitsReasoningEffort(model)) return undefined; + // Models that reason natively but expose no effort dial carry + // `thinking: undefined` (baked at build time from + // `compat.supportsReasoningEffort: false` on openai-responses*). The + // wire-side omitReasoningEffort gate (providers/xai-responses.ts:78) is the + // actual strip; returning undefined here avoids a redundant + // requireSupportedEffort throw that would defeat the gate and surface a + // confusing "Compaction failed: Thinking effort high is not supported + // by..." to the user. + if (!model.thinking) return undefined; return requireSupportedEffort(model, reasoning); } @@ -869,7 +869,7 @@ function mapOptionsForApi( ...base, thinking: { enabled: true, - level: mapEffortToGoogleThinkingLevel(googleModel, effort), + level: mapEffortToGoogleThinkingLevel(effort), }, toolChoice: mapGoogleToolChoice(options?.toolChoice), }); @@ -903,7 +903,7 @@ function mapOptionsForApi( ...base, thinking: { enabled: true, - level: mapEffortToGoogleThinkingLevel(model, effort), + level: mapEffortToGoogleThinkingLevel(effort), }, toolChoice: mapGoogleToolChoice(options?.toolChoice), }); @@ -956,7 +956,7 @@ function mapOptionsForApi( ...base, thinking: { enabled: true, - level: mapEffortToGoogleThinkingLevel(geminiModel, effort), + level: mapEffortToGoogleThinkingLevel(effort), }, toolChoice: mapGoogleToolChoice(options?.toolChoice), }); diff --git a/packages/ai/test/anthropic-alignment.test.ts b/packages/ai/test/anthropic-alignment.test.ts index d23b6a8bf..60d50d668 100644 --- a/packages/ai/test/anthropic-alignment.test.ts +++ b/packages/ai/test/anthropic-alignment.test.ts @@ -376,7 +376,10 @@ describe("Anthropic request fingerprint alignment", () => { ...ANTHROPIC_MODEL_SPEC, id: "claude-opus-4-8-20260528", name: "Claude Opus 4.8", - thinking: { mode: "anthropic-adaptive", minLevel: Effort.Minimal, maxLevel: Effort.XHigh }, + thinking: { + mode: "anthropic-adaptive", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + }, }); await streamAnthropic( @@ -1677,8 +1680,7 @@ describe("Anthropic request fingerprint alignment", () => { name: "Claude Opus 4.7", thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, }), { @@ -1717,8 +1719,7 @@ describe("Anthropic request fingerprint alignment", () => { name: "Claude Opus 4.7", thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, }), { @@ -1745,8 +1746,7 @@ describe("Anthropic request fingerprint alignment", () => { name: "Claude Opus 4.7", thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, }), { @@ -1777,8 +1777,7 @@ describe("Anthropic request fingerprint alignment", () => { name: "Claude Opus 4.7", thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, }), { @@ -1811,8 +1810,7 @@ describe("Anthropic request fingerprint alignment", () => { name: "Claude Opus 4.7", thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, }), { @@ -1857,8 +1855,7 @@ describe("Anthropic request fingerprint alignment", () => { maxTokens: 128_000, thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, }), { diff --git a/packages/ai/test/anthropic-fable-request-shaping.test.ts b/packages/ai/test/anthropic-fable-request-shaping.test.ts index fa53096d9..3a84afe64 100644 --- a/packages/ai/test/anthropic-fable-request-shaping.test.ts +++ b/packages/ai/test/anthropic-fable-request-shaping.test.ts @@ -24,7 +24,10 @@ function adaptiveModel(id: string): Model<"anthropic-messages"> { const base = makeAnthropicModel(id); return buildModel({ ...base, - thinking: { mode: "anthropic-adaptive", minLevel: Effort.Minimal, maxLevel: Effort.XHigh }, + thinking: { + mode: "anthropic-adaptive", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + }, compat: base.compatConfig, } as ModelSpec<"anthropic-messages">); } diff --git a/packages/ai/test/issue-1373-repro.test.ts b/packages/ai/test/issue-1373-repro.test.ts index 9a9d2d2c6..3ad9d760b 100644 --- a/packages/ai/test/issue-1373-repro.test.ts +++ b/packages/ai/test/issue-1373-repro.test.ts @@ -27,7 +27,10 @@ function adaptiveModel(id: string): Model<"bedrock-converse-stream"> { cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 1_000_000, maxTokens: 128_000, - thinking: { mode: "anthropic-adaptive", minLevel: Effort.Minimal, maxLevel: Effort.XHigh }, + thinking: { + mode: "anthropic-adaptive", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + }, }); } @@ -43,7 +46,7 @@ function budgetModel(id: string): Model<"bedrock-converse-stream"> { cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 200_000, maxTokens: 64_000, - thinking: { mode: "budget", minLevel: Effort.Minimal, maxLevel: Effort.High }, + thinking: { mode: "budget", efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High] }, }); } diff --git a/packages/ai/test/issue-2123-repro.test.ts b/packages/ai/test/issue-2123-repro.test.ts index 129488b2a..7f1a21361 100644 --- a/packages/ai/test/issue-2123-repro.test.ts +++ b/packages/ai/test/issue-2123-repro.test.ts @@ -36,7 +36,10 @@ const OPUS_46_OAUTH: Model<"anthropic-messages"> = buildModel({ cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }, contextWindow: 1_000_000, maxTokens: 128_000, - thinking: { mode: "anthropic-adaptive", minLevel: Effort.Minimal, maxLevel: Effort.XHigh }, + thinking: { + mode: "anthropic-adaptive", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + }, }); const todoTool: Tool = { diff --git a/packages/ai/test/issue-826-repro.test.ts b/packages/ai/test/issue-826-repro.test.ts index ff73562e1..8c0151436 100644 --- a/packages/ai/test/issue-826-repro.test.ts +++ b/packages/ai/test/issue-826-repro.test.ts @@ -83,8 +83,7 @@ describe("issue #826: Anthropic strict-tools opt-out for Vertex-style proxies", reasoning: true, thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, compat: baseModel.compatConfig, } as ModelSpec<"anthropic-messages">); @@ -110,8 +109,7 @@ describe("issue #826: Anthropic strict-tools opt-out for Vertex-style proxies", reasoning: true, thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, compat: { ...baseModel.compatConfig, disableAdaptiveThinking: true }, } as ModelSpec<"anthropic-messages">); diff --git a/packages/ai/test/issue-969-repro.test.ts b/packages/ai/test/issue-969-repro.test.ts index be68361d8..282185d99 100644 --- a/packages/ai/test/issue-969-repro.test.ts +++ b/packages/ai/test/issue-969-repro.test.ts @@ -27,8 +27,7 @@ function customOpenAICompatModel(): Model<"openai-completions"> { reasoning: true, thinking: { mode: "effort", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, diff --git a/packages/ai/test/openai-completions-disable-reasoning.test.ts b/packages/ai/test/openai-completions-disable-reasoning.test.ts index 70682a81f..fabf771e8 100644 --- a/packages/ai/test/openai-completions-disable-reasoning.test.ts +++ b/packages/ai/test/openai-completions-disable-reasoning.test.ts @@ -26,8 +26,7 @@ function createReasoningEffortModel(): Model<"openai-completions"> { reasoning: true, thinking: { mode: "effort", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, diff --git a/packages/ai/test/xai-oauth-effort-strip.test.ts b/packages/ai/test/xai-oauth-effort-strip.test.ts index f63125883..5272b2f18 100644 --- a/packages/ai/test/xai-oauth-effort-strip.test.ts +++ b/packages/ai/test/xai-oauth-effort-strip.test.ts @@ -1,46 +1,43 @@ import { describe, expect, test } from "bun:test"; -import { modelOmitsReasoningEffort } from "@oh-my-pi/pi-catalog/model-thinking"; +import { getSupportedEfforts } from "@oh-my-pi/pi-catalog/model-thinking"; import { getBundledModel } from "@oh-my-pi/pi-catalog/models"; -// Pins fix #2 of the compaction effort-override bug. Before this fix, -// `resolveOpenAiReasoningEffort` called `requireSupportedEffort` which threw -// for any model with `compat.supportsReasoningEffort: false` (e.g. -// `xai-oauth/grok-build`) — producing the user-visible "Compaction failed: -// Thinking effort high is not supported by xai-oauth/grok-build. Supported -// efforts:" (empty list). The fix routes through the explicit -// `modelOmitsReasoningEffort` predicate, which lets the wire-side -// `omitReasoningEffort` gate (providers/xai-responses.ts:78) remain the -// single source of truth for the actual strip. -describe("modelOmitsReasoningEffort (regression)", () => { - test("returns true for xai-oauth/grok-build (supportsReasoningEffort: false)", () => { +// Pins fix #2 of the compaction effort-override bug. Models that reason +// natively but reject the wire `reasoning.effort` param (e.g. +// `xai-oauth/grok-build`, `compat.supportsReasoningEffort: false` on +// openai-responses*) are encoded at build time as `thinking: undefined` — +// "thinks, but exposes no control surface". `resolveOpenAiReasoningEffort` +// returns undefined for them instead of tripping `requireSupportedEffort` +// (the old user-visible "Compaction failed: Thinking effort high is not +// supported by xai-oauth/grok-build. Supported efforts:" with an empty list), +// and the wire-side `omitReasoningEffort` gate (providers/xai-responses.ts) +// remains the single source of truth for the actual strip. +describe("effort-dial-less reasoner encoding (regression)", () => { + test("xai-oauth/grok-build reasons but carries no thinking config", () => { const grokBuild = getBundledModel("xai-oauth", "grok-build"); if (!grokBuild) throw new Error("xai-oauth/grok-build must be in bundled models.json"); - expect(modelOmitsReasoningEffort(grokBuild)).toBe(true); + expect(grokBuild.reasoning).toBe(true); + expect(grokBuild.thinking).toBeUndefined(); + expect(getSupportedEfforts(grokBuild)).toEqual([]); }); - test("returns false for xai-oauth/grok-4.3 (effort-capable)", () => { + test("xai-oauth/grok-4.3 keeps its effort dial", () => { const grok43 = getBundledModel("xai-oauth", "grok-4.3"); if (!grok43) throw new Error("xai-oauth/grok-4.3 must be in bundled models.json"); - expect(modelOmitsReasoningEffort(grok43)).toBe(false); + expect(grok43.thinking).toBeDefined(); + expect(getSupportedEfforts(grok43).length).toBeGreaterThan(0); }); - test("returns true for xai-oauth/grok-4.20-0309-reasoning (supportsReasoningEffort: false)", () => { + test("xai-oauth/grok-4.20-0309-reasoning reasons but carries no thinking config", () => { const grokR = getBundledModel("xai-oauth", "grok-4.20-0309-reasoning"); if (!grokR) throw new Error("xai-oauth/grok-4.20-0309-reasoning must be in bundled models.json"); - expect(modelOmitsReasoningEffort(grokR)).toBe(true); + expect(grokR.reasoning).toBe(true); + expect(grokR.thinking).toBeUndefined(); }); - test("returns false for an Anthropic model (different api surface)", () => { + test("the no-dial encoding stays scoped to openai-responses*", () => { const claude = getBundledModel("anthropic", "claude-sonnet-4-6"); if (!claude) throw new Error("anthropic/claude-sonnet-4-6 must be in bundled models.json"); - expect(modelOmitsReasoningEffort(claude)).toBe(false); - }); - - test("returns false for an openai-completions model (out of scope)", () => { - const openai = getBundledModel("openai", "gpt-4o-mini"); - if (!openai) throw new Error("openai/gpt-4o-mini must be in bundled models.json"); - // gpt-4o-mini is openai-completions, not openai-responses* — predicate - // must return false even if compat had supportsReasoningEffort: false. - expect(modelOmitsReasoningEffort(openai)).toBe(false); + expect(claude.thinking).toBeDefined(); }); }); diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index bca5ffa9d..52d48a4ff 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -5,7 +5,8 @@ ### Added - Added `hostMatchesUrl`, `modelMatchesHost`, and endpoint-shape helpers in the new `hosts` module for consistent provider/baseUrl matching -- `buildModel(spec)` (`build.ts`) is now the single Model constructor: it runs thinking enrichment and materializes the fully-resolved compat record exactly once, so `Model.compat` is a required, complete `CompatOf` (`ResolvedOpenAICompat`/`ResolvedOpenAIResponsesCompat`/`ResolvedAnthropicCompat`) and request-path code reads fields with zero URL parsing and zero per-request allocation. Sparse user/config overrides live on the new `ModelSpec` input shape and survive on `Model.compatConfig` for introspection. +- `buildModel(spec)` (`build.ts`) is now the single Model constructor: it materializes the fully-resolved compat record and canonical thinking metadata exactly once (compat first, thinking derived from identity + resolved compat), so `Model.compat` is a required, complete `CompatOf` (`ResolvedOpenAICompat`/`ResolvedOpenAIResponsesCompat`/`ResolvedAnthropicCompat`) and request-path code reads fields with zero URL parsing and zero per-request allocation. Sparse user/config overrides live on the new `ModelSpec` input shape and survive on `Model.compatConfig` for introspection. +- Added `ResolvedAnthropicCompat.supportsSamplingParams` (Opus 4.7+/Fable/Mythos reject `temperature`/`top_p`/`top_k` with a 400), baked at build time from model identity so the request path stops re-parsing model ids. - Compat detection gained model-time flags so handlers stop sniffing baseUrl: completions `supportsReasoningParams`, `alwaysSendMaxTokens`, `isOpenRouterHost`, `isVercelGatewayHost`, `streamIdleTimeoutMs`, and a precomputed `whenThinking` alternate view (OpenCode `reasoning_content` gating, #1071/#1484); responses `strictResponsesPairing`, `supportsLongPromptCacheRetention`, `supportsReasoningEffort`; anthropic `officialEndpoint`, `requiresToolResultId`, `replayUnsignedThinking`. - New `@oh-my-pi/pi-catalog` package: the model catalog extracted from `@oh-my-pi/pi-ai`. Owns the bundled `models.json` and its generation pipeline (`scripts/generate-models.ts`), the core model data types (`Model`, `Api`, `ThinkingConfig`, `Effort`, `Usage`, compat interfaces), thinking metadata enrichment and generated policies (`model-thinking.ts`), the SQLite model cache and model manager, per-provider discovery factories (`provider-models/`), the discovery protocol clients (`discovery/`), and the new `CATALOG_PROVIDERS` table — the single source of truth for provider ids, default models, and discovery wiring (`KnownProvider`, `PROVIDER_DESCRIPTORS`, and `DEFAULT_MODEL_PER_PROVIDER` are derived from it). - New `identity/` module centralizing model-identity concerns that were previously duplicated across packages: family classification and version parsing (`identity/classify.ts`, extracted from pi-ai's `model-thinking` internals), canonical model equivalence with injected reference data (`identity/equivalence.ts`, from coding-agent's `model-equivalence`), proxy/reseller reference lookup (`identity/reference.ts`, from coding-agent's `model-registry`), bracket-affix and id-segment helpers (`identity/id.ts`), a single trailing-marker vocabulary with canonical vs reference flavors (`identity/markers.ts` — `search` stays reference-only so Perplexity's `sonar-pro-search` remains canonical-distinct), and provider priority ordering (`identity/priority.ts`). @@ -18,9 +19,18 @@ - Changed `hostMatchesUrl`/`modelMatchesHost` usage in compatibility detection to reduce mismatches across case variants and provider alias hosts - Provider catalog entries now carry the runtime API-key env fallback as an ordered `envVars` list; `catalogDiscovery.envVars` became an optional generation-time override (only `cursor` and `vercel-ai-gateway` differ) and `PROVIDER_DESCRIPTORS` materializes the resolved list for `generate-models.ts`. - `Model`'s api parameter now defaults to `Api` instead of `any` (`Model`), so bare `Model` no longer behaves as `Model` at call sites. +- `ThinkingConfig` is now explicit and total: an ordered `efforts` array replaces the `minLevel`/`maxLevel`/`levels` range encoding, and the wire facts are baked alongside it — `effortMap` (anthropic-adaptive 4-tier vs 5-tier scale, shared with the OpenRouter completions remap) and `supportsDisplay` (adaptive `display` field support). Explicit spec thinking owns the capability surface (`mode`/`efforts`/`defaultLevel`) and wins over inference; missing wire facts are backfilled from identity so configs never need to know Anthropic's tier tables. Reasoning models that reject the wire effort param (`compat.supportsReasoningEffort: false` on openai-responses*) are encoded as `thinking: undefined` ("thinks, no control surface") instead of the removed `modelOmitsReasoningEffort` special case. `models.json` was re-baked in the new vocabulary behind a 3196-model behavioral parity gate, and the model cache schema bumped to v4 to invalidate old-shape rows. +- `mapEffortToGoogleThinkingLevel(effort)` is now a static map (model parameter dropped — validation stays at the `requireSupportedEffort` call sites), and `mapEffortToAnthropicAdaptiveEffort` reads the baked `thinking.effortMap` instead of re-classifying the model id per request. +- Generator-only policy code moved out of the runtime bundle into `scripts/generated-policies.ts`: `applyGeneratedModelPolicies` (now policy fixups + thinking re-bake via the shared deriver), `linkOpenAIPromotionTargets`, the Copilot context-window table, minimax/opencode-go compat fixups, and `CLOUDFLARE_FALLBACK_MODEL`. The anthropic id predicates (`hasOpus47ApiRestrictions`, `supportsMidConversationSystemMessages`, `isAnthropicFableOrMythosModel`) moved to `identity/family` for build-time use by the compat/thinking derivers only. ### Fixed - Fixed Anthropic official-endpoint detection to require strict HTTPS hostname matching so non-official or lookalike URLs are no longer treated as official Anthropic hosts - Fixed Ollama Cloud dynamic discovery so same-id matches from other providers no longer supply context-window or max-output-token limits for discovered models. - Wired `@oh-my-pi/pi-catalog` into the release publish package list, tarball install smoke test, and root `bun generate-models` script. +- Fixed `supportsAdaptiveThinkingDisplay` only matching dash-form version ids: dotted ids (`claude-opus-4.7`) now classify through `identity/classify` like every other anthropic predicate, so six bundled dotted Opus 4.7/4.8 entries (github-copilot, vercel-ai-gateway, zenmux) regain adaptive `display` support; bare dated ids (`claude-opus-4-20250514` = Opus 4.0) stay excluded. +- Fixed the OpenRouter anthropic adaptive-effort map misclassifying bare dated Opus ids (`claude-opus-4-20250514` parsed as version 4.20 → wrongly adaptive); the map now derives from the shared classifier and the shared 4-/5-tier tables. + +### Removed + +- Removed the runtime enrichment layer: `enrichModelThinking` (and its non-enumerable memo-slot cache), `refreshModelThinking`, `modelOmitsReasoningEffort`, and the `model-thinking` re-exports of generator-only policies. Thinking metadata is resolved exactly once inside `buildModel`; runtime helpers (`getSupportedEfforts`, `clampThinkingLevelForModel`, `requireSupportedEffort`, the effort mappers) are pure field reads. diff --git a/packages/catalog/scripts/generate-models.ts b/packages/catalog/scripts/generate-models.ts index f4bb37dff..9f0d92362 100644 --- a/packages/catalog/scripts/generate-models.ts +++ b/packages/catalog/scripts/generate-models.ts @@ -17,11 +17,6 @@ import { $env } from "@oh-my-pi/pi-utils"; import { fetchAntigravityDiscoveryModels } from "../src/discovery/antigravity"; import { fetchCodexModels } from "../src/discovery/codex"; import { createModelManager } from "../src/model-manager"; -import { - applyGeneratedModelPolicies, - CLOUDFLARE_FALLBACK_MODEL, - linkOpenAIPromotionTargets, -} from "../src/model-thinking"; import prevModelsJson from "../src/models.json" with { type: "json" }; import { toModelSpec } from "../src/provider-models/bundled-references"; import { @@ -44,6 +39,11 @@ import { } from "../src/provider-models/openai-compat"; import type { ModelSpec } from "../src/types"; import { JWT_CLAIM_PATH } from "../src/wire/codex"; +import { + applyGeneratedModelPolicies, + CLOUDFLARE_FALLBACK_MODEL, + linkOpenAIPromotionTargets, +} from "./generated-policies"; const packageRoot = path.join(import.meta.dir, ".."); @@ -429,7 +429,10 @@ async function generateModels() { // Discovery-only providers (local inference servers) — never bundle static models. const fetchedKeys = new Set(allModels.map(model => `${model.provider}/${model.id}`)); - for (const models of Object.values(prevModelsJson as Record>)) { + // Previous-snapshot entries may carry an older ThinkingConfig vocabulary; + // applyGeneratedModelPolicies re-bakes `thinking` for every model, so the + // inbound shape is irrelevant beyond identity/pricing/compat fields. + for (const models of Object.values(prevModelsJson as unknown as Record>)) { for (const model of Object.values(models)) { if ( !fetchedKeys.has(`${model.provider}/${model.id}`) && diff --git a/packages/catalog/scripts/generated-policies.ts b/packages/catalog/scripts/generated-policies.ts new file mode 100644 index 000000000..9cf58ad60 --- /dev/null +++ b/packages/catalog/scripts/generated-policies.ts @@ -0,0 +1,223 @@ +/** + * Generation-time catalog policies: upstream metadata corrections, derived + * field baking, and promotion-target linking. Runs only from + * `generate-models.ts` — none of this ships in the runtime bundle. + */ +import { buildCompat } from "../src/build"; +import { + type AnthropicModel, + isFableOrMythos, + type OpenAIModel, + type OpenAIVariant, + type ParsedModel, + parseKnownModel, + semverEqual, +} from "../src/identity/classify"; +import { resolveModelThinking } from "../src/model-thinking"; +import type { Api, ModelSpec } from "../src/types"; + +const CLOUDFLARE_AI_GATEWAY_BASE_URL = "https://gateway.ai.cloudflare.com/v1///anthropic"; + +/** + * Static fallback model injected when Cloudflare AI Gateway discovery + * returns no results. Ensures the provider always has at least one usable + * model entry in the catalog. + */ +export const CLOUDFLARE_FALLBACK_MODEL: ModelSpec<"anthropic-messages"> = { + id: "claude-sonnet-4-5", + name: "Claude Sonnet 4.5", + api: "anthropic-messages", + provider: "cloudflare-ai-gateway", + baseUrl: CLOUDFLARE_AI_GATEWAY_BASE_URL, + reasoning: true, + input: ["text", "image"], + cost: { + input: 3, + output: 15, + cacheRead: 0.3, + cacheWrite: 3.75, + }, + contextWindow: 200000, + maxTokens: 64000, +}; + +const CODEX_GPT_5_4_PRIORITY_BY_VARIANT: Partial> = { + base: 0, + mini: 1, + nano: 2, +}; + +const COPILOT_GENERATED_LIMITS: Record = { + "claude-opus-4.6": { contextWindow: 168000, maxTokens: 32000 }, + "gpt-5.2": { contextWindow: 272000, maxTokens: 128000 }, + "gpt-5.4": { contextWindow: 272000, maxTokens: 128000 }, + "gpt-5.4-mini": { contextWindow: 272000, maxTokens: 128000 }, + "grok-code-fast-1": { contextWindow: 192000, maxTokens: 64000 }, +}; + +/** + * Apply upstream metadata corrections to a mutable array of models, then + * re-bake canonical thinking metadata so generated catalogs always carry the + * deriver's output for the post-policy spec. + */ +export function applyGeneratedModelPolicies(models: ModelSpec[]): void { + for (const model of models) { + applyGeneratedModelPolicy(model); + rebakeModelThinking(model); + } +} + +/** + * Recompute `thinking` from the canonical deriver, replacing any baked value. + * Mirrors `buildModel`'s trust-or-derive resolution with trust disabled: the + * generator is the authority that produces the trusted values. + */ +export function rebakeModelThinking(model: ModelSpec): void { + const thinking = resolveModelThinking({ ...model, thinking: undefined }, buildCompat(model)); + if (thinking) { + model.thinking = thinking; + } else { + delete model.thinking; + } +} + +/** + * Link OpenAI model variants to their context promotion targets. + * + * When a model's context is exhausted, the agent can promote to a sibling + * model with a larger context window on the same provider: + * - `codex-spark` variants promote to `gpt-5.5`. + * - `gpt-5.5` (270K input) promotes to `gpt-5.4` (1M input). + */ +export function linkOpenAIPromotionTargets(models: ModelSpec[]): void { + for (const candidate of models) { + const parsedCandidate = parseKnownModel(candidate.id); + if (parsedCandidate.family !== "openai") continue; + let targetId: string | undefined; + if (parsedCandidate.variant === "codex-spark") { + targetId = "gpt-5.5"; + } else if (parsedCandidate.variant === "base" && semverEqual(parsedCandidate.version, "5.5")) { + targetId = "gpt-5.4"; + } else { + continue; + } + const fallback = models.find( + model => model.provider === candidate.provider && model.api === candidate.api && model.id === targetId, + ); + if (!fallback) continue; + candidate.contextPromotionTarget = `${fallback.provider}/${fallback.id}`; + } +} + +function applyGeneratedModelPolicy(model: ModelSpec): void { + const copilotLimits = model.provider === "github-copilot" ? COPILOT_GENERATED_LIMITS[model.id] : undefined; + if (copilotLimits) { + model.contextWindow = copilotLimits.contextWindow; + model.maxTokens = copilotLimits.maxTokens; + } + + if ( + model.api === "openai-completions" && + (model.provider === "minimax-code" || model.provider === "minimax-code-cn") + ) { + model.compat = { + ...(model.compat ?? {}), + supportsStore: false, + supportsDeveloperRole: false, + supportsReasoningEffort: false, + reasoningContentField: "reasoning_content", + }; + delete model.compat.thinkingFormat; + } + if ( + model.api === "openai-completions" && + model.provider === "opencode-go" && + (model.id === "deepseek-v4-flash" || model.id === "deepseek-v4-pro") + ) { + model.compat = { + ...(model.compat ?? {}), + supportsToolChoice: false, + reasoningContentField: "reasoning_content", + requiresReasoningContentForToolCalls: true, + }; + } + const parsedModel = parseKnownModel(model.id); + const applyPatchToolType = inferGeneratedApplyPatchToolType(model, parsedModel); + if (applyPatchToolType) { + model.applyPatchToolType = applyPatchToolType; + } else { + delete model.applyPatchToolType; + } + if (parsedModel.family === "anthropic") { + applyAnthropicCatalogPolicy(model, parsedModel); + } + if (parsedModel.family === "openai") { + applyOpenAICatalogPolicy(model, parsedModel); + } +} + +function applyAnthropicCatalogPolicy(model: ModelSpec, parsedModel: AnthropicModel): void { + // Claude Opus 4.5: models.dev reports 3x the correct cache pricing. + if (model.provider === "anthropic" && parsedModel.kind === "opus" && semverEqual(parsedModel.version, "4.5")) { + model.cost.cacheRead = 0.5; + model.cost.cacheWrite = 6.25; + } + + // Bedrock Opus 4.6: upstream metadata is stale for cache pricing and context. + if (model.provider === "amazon-bedrock" && parsedModel.kind === "opus" && semverEqual(parsedModel.version, "4.6")) { + model.cost.cacheRead = 0.5; + model.cost.cacheWrite = 6.25; + model.contextWindow = 1000000; + model.maxTokens = 128000; + } + + // Claude Fable/Mythos 5: Anthropic's /v1/models omits token limits and + // pricing, and models.dev lags new releases. Pin authoritative values from + // the model card (1M context / 128k output) and pricing docs ($10 in / $50 + // out per MTok). + if (model.provider === "anthropic" && isFableOrMythos(parsedModel.kind)) { + model.contextWindow = 1_000_000; + model.maxTokens = 128_000; + model.cost.input = 10; + model.cost.output = 50; + model.cost.cacheRead = 1; + model.cost.cacheWrite = 12.5; + } +} + +function inferGeneratedApplyPatchToolType( + model: ModelSpec, + parsedModel: ParsedModel, +): ModelSpec["applyPatchToolType"] { + if (parsedModel.family !== "openai" || parsedModel.version.major !== 5) { + return undefined; + } + if (model.provider === "openai" && model.api === "openai-responses") { + return "freeform"; + } + if (model.provider === "openai-codex" && model.api === "openai-codex-responses") { + return "freeform"; + } + return undefined; +} + +function applyOpenAICatalogPolicy(model: ModelSpec, parsedModel: OpenAIModel): void { + // Codex models: 400K figure includes output budget; input window is 272K. + if (parsedModel.variant.startsWith("codex") && parsedModel.variant !== "codex-spark") { + model.contextWindow = 272000; + return; + } + // GPT-5.4 mini/nano use plain OpenAI IDs on the Codex transport, but Codex still + // enforces the lower prompt budget for these variants. Codex discovery can also + // report inconsistent priorities for the GPT-5.4 family, so normalize by parsed + // variant instead of special-casing raw model ids. + if (model.api === "openai-codex-responses" && semverEqual(parsedModel.version, "5.4")) { + const normalizedPriority = CODEX_GPT_5_4_PRIORITY_BY_VARIANT[parsedModel.variant]; + if (normalizedPriority !== undefined) { + model.priority = normalizedPriority; + } + if (parsedModel.variant === "mini" || parsedModel.variant === "nano") { + model.contextWindow = 272000; + } + } +} diff --git a/packages/catalog/src/build.ts b/packages/catalog/src/build.ts index 185240994..a3fba98d7 100644 --- a/packages/catalog/src/build.ts +++ b/packages/catalog/src/build.ts @@ -1,24 +1,30 @@ /** - * The single Model constructor. Thinking metadata and the resolved compat - * record are materialized here, exactly once per spec — request handlers read - * `model.compat` fields and perform zero URL parsing and zero compat - * allocation per request. + * The single Model constructor. Resolution order is a dependency chain, each + * step materialized exactly once per spec: + * + * 1. compat — URL/provider/id detection resolved into a complete record; + * 2. thinking — derived from identity + resolved compat (or trusted verbatim + * when the spec carries explicit metadata); + * + * Request handlers read fields — they never detect, parse ids, or allocate + * compat per request. */ import { buildAnthropicCompat } from "./compat/anthropic"; import { buildOpenAICompat, buildOpenAIResponsesCompat } from "./compat/openai"; -import { enrichModelThinking } from "./model-thinking"; +import { resolveModelThinking } from "./model-thinking"; import type { Api, CompatOf, Model, ModelSpec } from "./types"; export function buildModel(spec: ModelSpec): Model { - const enriched = enrichModelThinking(spec); + const compat = buildCompat(spec) as CompatOf; return { - ...enriched, - compat: buildCompat(enriched) as CompatOf, - compatConfig: enriched.compat, + ...spec, + thinking: resolveModelThinking(spec, compat), + compat, + compatConfig: spec.compat, } as Model; } -function buildCompat(spec: ModelSpec): CompatOf { +export function buildCompat(spec: ModelSpec): CompatOf { switch (spec.api) { case "openai-completions": return buildOpenAICompat(spec as ModelSpec<"openai-completions">); diff --git a/packages/catalog/src/compat/anthropic.ts b/packages/catalog/src/compat/anthropic.ts index 5c46545dc..0b72b39c0 100644 --- a/packages/catalog/src/compat/anthropic.ts +++ b/packages/catalog/src/compat/anthropic.ts @@ -5,7 +5,11 @@ * classification, with explicit spec overrides assigned on top. */ import { modelMatchesHost } from "../hosts"; -import { isAnthropicFableOrMythosModel, supportsMidConversationSystemMessages } from "../model-thinking"; +import { + hasOpus47ApiRestrictions, + isAnthropicFableOrMythosModel, + supportsMidConversationSystemMessages, +} from "../identity/family"; import type { ModelSpec, ResolvedAnthropicCompat } from "../types"; import { applyCompatOverrides } from "./apply"; @@ -44,6 +48,8 @@ export function buildAnthropicCompat(spec: ModelSpec<"anthropic-messages">): Res // supported model id. supportsMidConversationSystem: official && supportsMidConversationSystemMessages(spec.id), supportsForcedToolChoice: !isAnthropicFableOrMythosModel(spec.id), + // Opus 4.7+ and Fable/Mythos reject temperature/top_p/top_k with a 400. + supportsSamplingParams: !hasOpus47ApiRestrictions(spec.id), // Z.AI workaround (issue #814): its proxy deserializes tool_result blocks // into a class that reads `.id`. requiresToolResultId: isZai, diff --git a/packages/catalog/src/compat/openai.ts b/packages/catalog/src/compat/openai.ts index 9541c52e8..b190cbcf7 100644 --- a/packages/catalog/src/compat/openai.ts +++ b/packages/catalog/src/compat/openai.ts @@ -8,6 +8,7 @@ * never detect, resolve, or allocate. */ import { hostMatchesUrl, modelMatchesHost } from "../hosts"; +import { bareModelId, isFableOrMythos, parseAnthropicModel, semverGte } from "../identity/classify"; import { isAnthropicNamespacedModelId, isClaudeModelId, @@ -17,6 +18,7 @@ import { isMimoModelIdOrName, isQwenModelId, } from "../identity/family"; +import { ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER, ANTHROPIC_ADAPTIVE_EFFORT_MAP_5_TIER } from "../model-thinking"; import type { ModelSpec, OpenAICompat, ResolvedOpenAICompat, ResolvedOpenAIResponsesCompat } from "../types"; import { applyCompatOverrides } from "./apply"; @@ -73,30 +75,17 @@ function detectStrictModeSupport(provider: string, baseUrl: string): boolean { function getOpenRouterAnthropicReasoningEffortMap( modelId: string, ): Partial> | undefined { - const match = /(?:^|\/)claude-(opus|fable|mythos)-(\d{1,2})(?:[.-](\d{1,2}))?/.exec(modelId); - if (!match) return undefined; + const parsed = parseAnthropicModel(bareModelId(modelId)); + if (!parsed) return undefined; + // Adaptive efforts on OpenRouter's completions front: Fable/Mythos and + // Opus 4.6+ only — Sonnet stays on the plain effort vocabulary there. + const isOpusAdaptive = parsed.kind === "opus" && semverGte(parsed.version, "4.6"); + if (!isFableOrMythos(parsed.kind) && !isOpusAdaptive) return undefined; - const kind = match[1]; - const major = Number(match[2]); - const minor = Number(match[3] ?? 0); - const isFableOrMythos = kind === "fable" || kind === "mythos"; - const isOpusAdaptive = kind === "opus" && (major > 4 || (major === 4 && minor >= 6)); - if (!isFableOrMythos && !isOpusAdaptive) return undefined; - - const hasRealXHigh = isFableOrMythos || major > 4 || (major === 4 && minor >= 7); - if (hasRealXHigh) { - return { - minimal: "low", - low: "medium", - medium: "high", - high: "xhigh", - xhigh: "max", - }; - } - return { - minimal: "low", - xhigh: "max", - }; + const hasRealXHigh = isFableOrMythos(parsed.kind) || semverGte(parsed.version, "4.7"); + return (hasRealXHigh ? ANTHROPIC_ADAPTIVE_EFFORT_MAP_5_TIER : ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER) as Partial< + Record + >; } /** diff --git a/packages/catalog/src/identity/family.ts b/packages/catalog/src/identity/family.ts index c812ffe4d..22fc85468 100644 --- a/packages/catalog/src/identity/family.ts +++ b/packages/catalog/src/identity/family.ts @@ -7,6 +7,8 @@ * here. */ +import { bareModelId, isFableOrMythos, parseAnthropicModel, semverGte } from "./classify"; + /** Kimi family ids in any namespace form (`moonshotai/kimi-*`, `kimi-k2.6`, `vendor/kimi.x`). */ export function isKimiModelId(modelId: string): boolean { return modelId.includes("moonshotai/kimi") || /(^|\/)kimi[-.]/i.test(modelId); @@ -44,16 +46,43 @@ export function isMimoModelIdOrName(value: string): boolean { /** * Adaptive thinking `display` is supported starting with Claude Opus 4.7 and - * Claude Fable/Mythos 5. Older adaptive-thinking models (Opus 4.6, Sonnet - * 4.6+) reject the field. + * the Claude Fable/Mythos 5 generation. Older adaptive-thinking models + * (Opus 4.6, Sonnet 4.6+) reject the field. Classifier-based, so dotted and + * dashed version forms both match while bare dated ids + * (`claude-opus-4-20250514` = Opus 4.0) stay excluded. */ export function supportsAdaptiveThinkingDisplay(modelId: string): boolean { - if (/claude-(?:fable|mythos)-5\b/.test(modelId)) return true; - // Bound the minor to non-date digits: bare dated ids like - // `claude-opus-4-20250514` (Opus 4.0) must not parse as minor=20250514. - const match = /claude-opus-(\d+)-(\d{1,2})(?!\d)/.exec(modelId); - if (!match) return false; - const major = Number(match[1]); - const minor = Number(match[2]); - return major > 4 || (major === 4 && minor >= 7); + const parsed = parseAnthropicModel(bareModelId(modelId)); + if (!parsed) return false; + if (isFableOrMythos(parsed.kind)) return semverGte(parsed.version, "5"); + return parsed.kind === "opus" && semverGte(parsed.version, "4.7"); +} + +/** + * Returns true for Anthropic models with Opus 4.7+/Fable/Mythos API restrictions: + * - Sampling parameters (temperature/top_p/top_k) return 400 error + * - Thinking content is omitted by default (needs display: "summarized") + */ +export function hasOpus47ApiRestrictions(modelId: string): boolean { + const parsed = parseAnthropicModel(bareModelId(modelId)); + if (!parsed) return false; + return (parsed.kind === "opus" && semverGte(parsed.version, "4.7")) || isFableOrMythos(parsed.kind); +} + +/** + * Mid-conversation `role: "system"` messages (system instructions appended at + * non-first positions in the `messages` array) are supported starting with + * Claude Opus 4.8 and the Claude Fable/Mythos 5 generation. Earlier Claude + * models reject the role. + * @see https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages + */ +export function supportsMidConversationSystemMessages(modelId: string): boolean { + const parsed = parseAnthropicModel(bareModelId(modelId)); + if (!parsed) return false; + return (parsed.kind === "opus" && semverGte(parsed.version, "4.8")) || isFableOrMythos(parsed.kind); +} + +export function isAnthropicFableOrMythosModel(modelId: string): boolean { + const parsed = parseAnthropicModel(bareModelId(modelId)); + return parsed !== null && isFableOrMythos(parsed.kind); } diff --git a/packages/catalog/src/model-cache.ts b/packages/catalog/src/model-cache.ts index b6aa5597b..e6056e0c7 100644 --- a/packages/catalog/src/model-cache.ts +++ b/packages/catalog/src/model-cache.ts @@ -7,9 +7,9 @@ import { getModelDbPath } from "@oh-my-pi/pi-utils"; import type { Api, Model, ModelSpec } from "./types"; // Rows persist ModelSpec JSON (sparse `compat`, never the resolved record); -// the model manager rebuilds via `buildModel` on load. v3 rows predating the -// resolved-compat redesign already carried sparse compat, so they stay valid. -const CACHE_SCHEMA_VERSION = 3; +// the model manager rebuilds via `buildModel` on load. v4 invalidates rows +// carrying the pre-efforts ThinkingConfig shape (minLevel/maxLevel/levels). +const CACHE_SCHEMA_VERSION = 4; interface CacheRow { provider_id: string; diff --git a/packages/catalog/src/model-thinking.ts b/packages/catalog/src/model-thinking.ts index 690570d5a..723c6271d 100644 --- a/packages/catalog/src/model-thinking.ts +++ b/packages/catalog/src/model-thinking.ts @@ -1,24 +1,37 @@ -import { buildOpenAICompat } from "./compat/openai"; +/** + * Thinking metadata: build-time derivation and runtime field-read helpers. + * + * Derivation (`resolveModelThinking`) runs exactly once per model — from + * `buildModel` for dynamic specs and from the catalog generator for bundled + * entries. Everything below the "runtime helpers" divider reads baked fields + * only: no id parsing, no host matching, no compat detection per request. + */ import { Effort, THINKING_EFFORTS } from "./effort"; import { modelMatchesHost } from "./hosts"; import { type AnthropicModel, - bareModelId, type GeminiModel, isFableOrMythos, type OpenAIModel, - type OpenAIVariant, type ParsedModel, - parseAnthropicModel, parseKnownModel, semverEqual, semverGte, } from "./identity/classify"; -import type { Api, Model, ModelSpec, ThinkingConfig } from "./types"; +import { supportsAdaptiveThinkingDisplay } from "./identity/family"; +import type { + Api, + CompatOf, + Model, + ModelSpec, + ResolvedOpenAICompat, + ResolvedOpenAIResponsesCompat, + ThinkingConfig, +} from "./types"; /** - * Thinking inference reads identity fields plus sparse compat intent, so it - * accepts both pre-build specs and built models. + * Runtime helpers read baked metadata only, so they accept both pre-build + * specs and built models. */ type ApiModel = ModelSpec | Model; @@ -34,190 +47,286 @@ const GEMINI_3_PRO_EFFORTS: readonly Effort[] = [Effort.Low, Effort.High]; const GEMINI_3_FLASH_EFFORTS: readonly Effort[] = [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High]; 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 CLOUDFLARE_AI_GATEWAY_BASE_URL = "https://gateway.ai.cloudflare.com/v1///anthropic"; -const CODEX_GPT_5_4_PRIORITY_BY_VARIANT: Partial> = { - base: 0, - mini: 1, - nano: 2, -}; - -const COPILOT_GENERATED_LIMITS: Record = { - "claude-opus-4.6": { contextWindow: 168000, maxTokens: 32000 }, - "gpt-5.2": { contextWindow: 272000, maxTokens: 128000 }, - "gpt-5.4": { contextWindow: 272000, maxTokens: 128000 }, - "gpt-5.4-mini": { contextWindow: 272000, maxTokens: 128000 }, - "grok-code-fast-1": { contextWindow: 192000, maxTokens: 64000 }, +/** + * Effort → wire-value map for the 5-tier adaptive scale (Opus 4.7+ and + * Fable/Mythos 5 on the Messages API). User-facing efforts shift up one notch + * so the top tier reaches the genuine "max" and "high" lands on Anthropic's + * recommended "xhigh" coding/agentic default. + */ +export const ANTHROPIC_ADAPTIVE_EFFORT_MAP_5_TIER: Readonly>> = { + [Effort.Minimal]: "low", + [Effort.Low]: "medium", + [Effort.Medium]: "high", + [Effort.High]: "xhigh", + [Effort.XHigh]: "max", }; /** - * Static fallback model injected when Cloudflare AI Gateway discovery - * returns no results. Ensures the provider always has at least one usable - * model entry in the catalog. + * Effort → wire-value map for the legacy 4-tier adaptive scale (Opus 4.6, + * Sonnet 4.6+, and every adaptive model on Bedrock Converse). `low..high` pass + * through verbatim; there is no real "xhigh", so it aliases the top "max" tier. */ -export const CLOUDFLARE_FALLBACK_MODEL: ApiModel<"anthropic-messages"> = { - id: "claude-sonnet-4-5", - name: "Claude Sonnet 4.5", - api: "anthropic-messages", - provider: "cloudflare-ai-gateway", - baseUrl: CLOUDFLARE_AI_GATEWAY_BASE_URL, - reasoning: true, - input: ["text", "image"], - cost: { - input: 3, - output: 15, - cacheRead: 0.3, - cacheWrite: 3.75, - }, - contextWindow: 200000, - maxTokens: 64000, +export const ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER: Readonly>> = { + [Effort.Minimal]: "low", + [Effort.XHigh]: "max", }; -const kEnrichedModel = Symbol("model-thinking.enrichedModel"); -type ModelWithEnriched = ApiModel & { [kEnrichedModel]?: ApiModel }; +// --------------------------------------------------------------------------- +// Build-time derivation (buildModel + catalog generator only) +// --------------------------------------------------------------------------- /** - * Returns a copy of the model with canonical thinking metadata attached. + * Resolve the canonical thinking metadata for a spec. Called exactly once per + * model by `buildModel`, after compat resolution. * - * This helper belongs to catalog enrichment only. Runtime consumers should - * trust `model.thinking` and avoid inferring capabilities on demand. + * - Non-reasoning models never carry thinking. + * - Models that reason natively but reject the wire effort param + * (`compat.supportsReasoningEffort: false` on openai-responses*) carry no + * thinking either: `reasoning: true, thinking: undefined` IS the encoding + * for "thinks, but exposes no control surface". + * - Explicit spec thinking (generator-baked or user-authored) owns the + * capability surface (`mode`, `efforts`, `defaultLevel`); the wire facts + * (`effortMap`, `supportsDisplay`) are backfilled from identity when not + * explicitly set, so configs never need to know Anthropic's tier tables. + * - Sparse specs go through full inference. */ -export function enrichModelThinking(model: ModelSpec): ModelSpec; -export function enrichModelThinking(model: Model): Model; -export function enrichModelThinking(model: ApiModel): ApiModel { - const tagged = model as ModelWithEnriched; - const cached = tagged[kEnrichedModel]; - if (cached !== undefined) { - return cached as ApiModel; +export function resolveModelThinking( + spec: ModelSpec, + compat: CompatOf, +): ThinkingConfig | undefined { + if (!spec.reasoning) return undefined; + if (omitsWireReasoningEffort(spec.api, compat)) return undefined; + if (spec.thinking && spec.thinking.efforts.length > 0) { + return fillThinkingWireDefaults(spec, spec.thinking); } - const normalizedThinking = normalizeThinkingConfig(model.thinking); - let result: ApiModel; - if (!model.reasoning) { - result = - normalizedThinking === undefined && model.thinking === undefined ? model : { ...model, thinking: undefined }; - } else { - const thinking = normalizedThinking ?? inferModelThinking(model); - result = thinkingsEqual(normalizedThinking, thinking) ? model : { ...model, thinking }; - } - // Stash the enriched copy on a non-enumerable slot so callers that hand us - // the same reference twice skip the work. `enumerable: false` is critical: - // many call sites build derived models via `{ ...model, ...overrides }`, - // which would otherwise copy this cache slot and trick us into returning - // the *original* enriched model — silently discarding the overrides. - Object.defineProperty(tagged, kEnrichedModel, { - value: result, - enumerable: false, - configurable: true, - writable: true, - }); - return result; + // Empty/malformed explicit metadata is treated as absent — infer instead. + return deriveThinking(spec, compat); } /** - * Returns a copy of the model with thinking metadata recomputed from the - * canonical rules, replacing any existing `thinking`. + * Backfill identity-derived wire facts onto explicit thinking metadata. + * Explicit `effortMap` / `supportsDisplay` (including `false`) always win; + * untouched configs are returned as-is with zero allocation. */ -export function refreshModelThinking(model: ApiModel): ApiModel { - if (!model.reasoning) { - const normalizedThinking = normalizeThinkingConfig(model.thinking); - return normalizedThinking === undefined && model.thinking === undefined - ? model - : { ...model, thinking: undefined }; +function fillThinkingWireDefaults(spec: ModelSpec, thinking: ThinkingConfig): ThinkingConfig { + const needsEffortMap = thinking.mode === "anthropic-adaptive" && thinking.effortMap === undefined; + const needsDisplay = + thinking.supportsDisplay === undefined && + (spec.api === "anthropic-messages" || spec.api === "bedrock-converse-stream") && + supportsAdaptiveThinkingDisplay(spec.id); + if (!needsEffortMap && !needsDisplay) { + return thinking; } - return { ...model, thinking: inferModelThinking(model) }; + const filled: ThinkingConfig = { ...thinking }; + if (needsEffortMap) { + filled.effortMap = anthropicModelHasRealXHighEffort(spec, parseKnownModel(spec.id)) + ? ANTHROPIC_ADAPTIVE_EFFORT_MAP_5_TIER + : ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER; + } + if (needsDisplay) { + filled.supportsDisplay = true; + } + return filled; } -/** - * Apply upstream metadata corrections to a mutable array of models. - * - * Each model is first normalized through `refreshModelThinking()` so generated - * catalogs keep canonical thinking metadata and policy fixes in one pass. - */ -export function applyGeneratedModelPolicies(models: ApiModel[]): void { - for (let index = 0; index < models.length; index++) { - const model = refreshModelThinking(models[index]!); - applyGeneratedModelPolicy(model); - models[index] = model; +/** Derive thinking from identity + resolved compat, ignoring any baked value. Generator-side entry. */ +export function deriveThinking(spec: ModelSpec, compat: CompatOf): ThinkingConfig { + const parsed = parseKnownModel(spec.id); + const efforts = inferSupportedEfforts(parsed, spec, compat); + if (efforts.length === 0) { + throw new Error(`Model ${spec.provider}/${spec.id} resolved to an empty thinking range`); } -} - -/** - * Link OpenAI model variants to their context promotion targets. - * - * When a model's context is exhausted, the agent can promote to a sibling - * model with a larger context window on the same provider: - * - `codex-spark` variants promote to `gpt-5.5`. - * - `gpt-5.5` (270K input) promotes to `gpt-5.4` (1M input). - */ -export function linkOpenAIPromotionTargets(models: ApiModel[]): void { - for (const candidate of models) { - const parsedCandidate = parseKnownModel(candidate.id); - if (parsedCandidate.family !== "openai") continue; - let targetId: string | undefined; - if (parsedCandidate.variant === "codex-spark") { - targetId = "gpt-5.5"; - } else if (parsedCandidate.variant === "base" && semverEqual(parsedCandidate.version, "5.5")) { - targetId = "gpt-5.4"; - } else { - continue; - } - const fallback = models.find( - model => model.provider === candidate.provider && model.api === candidate.api && model.id === targetId, - ); - if (!fallback) continue; - candidate.contextPromotionTarget = `${fallback.provider}/${fallback.id}`; + const config: ThinkingConfig = { + mode: inferThinkingControlMode(spec, parsed), + efforts, + }; + if (config.mode === "anthropic-adaptive") { + config.effortMap = anthropicModelHasRealXHighEffort(spec, parsed) + ? ANTHROPIC_ADAPTIVE_EFFORT_MAP_5_TIER + : ANTHROPIC_ADAPTIVE_EFFORT_MAP_4_TIER; } + if ( + (spec.api === "anthropic-messages" || spec.api === "bedrock-converse-stream") && + supportsAdaptiveThinkingDisplay(spec.id) + ) { + config.supportsDisplay = true; + } + return config; } /** * True when the model reasons natively but rejects the wire `reasoning.effort` - * param (compat.supportsReasoningEffort: false on openai-responses*). Callers - * are expected to omit the effort field; the wire-side omitReasoningEffort - * gate (providers/xai-responses.ts:78) is the actual strip, and this - * predicate is the upstream check that prevents a redundant - * requireSupportedEffort throw from defeating that gate. - * - * Scoped to openai-responses* because that's the only API surface where - * `compat.supportsReasoningEffort: false` is meaningful today. The - * `in`-narrowed access is necessary because Model.compat is - * `AnthropicCompat | OpenAICompat` and the api gate doesn't narrow the - * union for TS. + * param. Scoped to openai-responses* because that's the only API surface where + * `compat.supportsReasoningEffort: false` means "omit the field entirely" + * (xAI Grok off the GROK_EFFORT_CAPABLE_PREFIXES allowlist: grok-build, + * grok-4.20-0309-reasoning). openai-completions keeps its thinking config even + * without effort support — binary thinking formats (zai/qwen) drive reasoning + * through other request fields. */ -export function modelOmitsReasoningEffort(model: ApiModel): boolean { - if (model.api !== "openai-responses" && model.api !== "openai-codex-responses") { +function omitsWireReasoningEffort(api: Api, compat: CompatOf): boolean { + if (api !== "openai-responses" && api !== "openai-codex-responses") { return false; } - const compat = model.compat; - return Boolean(compat && "supportsReasoningEffort" in compat && compat.supportsReasoningEffort === false); + return (compat as ResolvedOpenAIResponsesCompat | undefined)?.supportsReasoningEffort === false; +} + +function inferSupportedEfforts( + parsedModel: ParsedModel, + spec: ModelSpec, + compat: CompatOf, +): readonly Effort[] { + switch (parsedModel.family) { + case "openai": + return inferOpenAISupportedEfforts(parsedModel); + case "gemini": + return inferGeminiSupportedEfforts(parsedModel); + case "anthropic": + return inferAnthropicSupportedEfforts(parsedModel, spec, compat); + case "unknown": + return inferFallbackEfforts(spec, compat); + } +} + +function inferOpenAISupportedEfforts(model: OpenAIModel): readonly Effort[] { + if (model.variant === "codex-mini" && semverEqual(model.version, "5.1")) { + return GPT_5_1_CODEX_MINI_EFFORTS; + } + if (semverGte(model.version, "5.2")) { + return GPT_5_2_PLUS_EFFORTS; + } + return DEFAULT_REASONING_EFFORTS; +} + +function inferGeminiSupportedEfforts(model: GeminiModel): readonly Effort[] { + if (!semverGte(model.version, "3.0")) { + return DEFAULT_REASONING_EFFORTS; + } + return model.kind === "pro" ? GEMINI_3_PRO_EFFORTS : GEMINI_3_FLASH_EFFORTS; +} + +function inferAnthropicSupportedEfforts( + parsedModel: AnthropicModel, + spec: ModelSpec, + compat: CompatOf, +): readonly Effort[] { + if ( + (spec.api === "anthropic-messages" || spec.api === "bedrock-converse-stream") && + semverGte(parsedModel.version, "4.6") + ) { + return parsedModel.kind === "opus" || isFableOrMythos(parsedModel.kind) + ? DEFAULT_REASONING_EFFORTS_WITH_XHIGH + : DEFAULT_REASONING_EFFORTS; + } + if (isOpenRouterAnthropicAdaptiveReasoningModel(parsedModel, spec)) { + return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; + } + return inferFallbackEfforts(spec, compat); +} + +function inferFallbackEfforts(spec: ModelSpec, compat: CompatOf): readonly Effort[] { + if (spec.api === "anthropic-messages") { + return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; + } + if (spec.name.includes("deepseek-v4")) { + return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; + } + if (spec.api === "bedrock-converse-stream") { + return DEFAULT_REASONING_EFFORTS; + } + if (spec.api === "openai-completions") { + const resolved = compat as ResolvedOpenAICompat; + if (resolved.thinkingFormat === "openai" && resolved.supportsReasoningEffort) { + return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; + } + return DEFAULT_REASONING_EFFORTS; + } + // OpenAI Responses APIs encode discrete effort levels, including xhigh. + if (spec.api === "openai-responses" || spec.api === "openai-codex-responses") { + return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; + } + return DEFAULT_REASONING_EFFORTS; +} + +function inferThinkingControlMode( + spec: ModelSpec, + parsedModel: ParsedModel, +): ThinkingConfig["mode"] { + switch (spec.api) { + case "google-generative-ai": + case "google-gemini-cli": + case "google-vertex": + return parsedModel.family === "gemini" && + semverGte(parsedModel.version, "3.0") && + parsedModel.version.major === 3 + ? "google-level" + : "budget"; + + case "anthropic-messages": + if (parsedModel.family === "anthropic") { + if (semverGte(parsedModel.version, "4.6")) { + return "anthropic-adaptive"; + } + if (semverGte(parsedModel.version, "4.5")) { + return "anthropic-budget-effort"; + } + } + return "budget"; + + case "bedrock-converse-stream": + if (parsedModel.family === "anthropic") { + if ( + semverGte(parsedModel.version, "4.6") && + (parsedModel.kind === "opus" || isFableOrMythos(parsedModel.kind)) + ) { + return "anthropic-adaptive"; + } + if (semverGte(parsedModel.version, "4.5")) { + return "anthropic-budget-effort"; + } + } + return "budget"; + + default: + return "effort"; + } +} + +function isOpenRouterAnthropicAdaptiveReasoningModel( + parsedModel: AnthropicModel, + spec: ModelSpec, +): boolean { + if (spec.api !== "openai-completions") return false; + if (!modelMatchesHost(spec, "openrouter")) return false; + return isFableOrMythos(parsedModel.kind) || (parsedModel.kind === "opus" && semverGte(parsedModel.version, "4.6")); } +/** + * Opus 4.7+ and Fable/Mythos on the Messages API expose the full five-tier + * adaptive scale (low/medium/high/xhigh/max). Bedrock Converse stays on the + * four-tier scale regardless of model version. + */ +function anthropicModelHasRealXHighEffort(spec: ModelSpec, parsedModel: ParsedModel): boolean { + if (spec.api !== "anthropic-messages") return false; + if (parsedModel.family !== "anthropic") return false; + if (isFableOrMythos(parsedModel.kind)) return true; + return parsedModel.kind === "opus" && semverGte(parsedModel.version, "4.7"); +} + +// --------------------------------------------------------------------------- +// Runtime helpers (field reads only — safe per request) +// --------------------------------------------------------------------------- + /** * Returns the supported thinking efforts declared on the model metadata. - * - * Catalog enrichment is responsible for normalizing bundled model metadata up front. - * Runtime callers must treat explicit `model.thinking` on custom models as authoritative - * so proxy-specific overrides from `models.yml` survive request construction. - * - * @throws Error when a reasoning-capable model is missing thinking metadata + * Empty for non-reasoning models and for reasoning models without a + * controllable effort surface (`thinking: undefined`). */ export function getSupportedEfforts(model: ApiModel): readonly Effort[] { if (!model.reasoning) { return []; } - // Models that reason natively but reject the `reasoning.effort` wire param - // (xAI Grok off the GROK_EFFORT_CAPABLE_PREFIXES allowlist in - // providers/xai-responses.ts: grok-build, grok-4.20-0309-reasoning) hide the - // picker's effort dial. Scoped to openai-responses* by - // `modelOmitsReasoningEffort` — openai-completions has its own - // supportsReasoningEffort consultation at inferFallbackEfforts L536 and - // changing that path's semantics is out-of-scope. - if (modelOmitsReasoningEffort(model)) { - return []; - } - if (!model.thinking) { - throw new Error(`Model ${model.provider}/${model.id} is missing thinking metadata`); - } - return expandEffortRange(model.thinking); + return model.thinking?.efforts ?? []; } /** @@ -271,11 +380,8 @@ export function requireSupportedEffort(model: ApiModel, } /** Maps a normalized thinking effort to Google's `thinkingLevel` enum values. */ -export function mapEffortToGoogleThinkingLevel( - model: ApiModel, - effort: Effort, -): "MINIMAL" | "LOW" | "MEDIUM" | "HIGH" { - switch (requireSupportedEffort(model, effort)) { +export function mapEffortToGoogleThinkingLevel(effort: Effort): "MINIMAL" | "LOW" | "MEDIUM" | "HIGH" { + switch (effort) { case Effort.Minimal: return "MINIMAL"; case Effort.Low: @@ -288,371 +394,14 @@ export function mapEffortToGoogleThinkingLevel( } } -/** Maps a normalized thinking effort to Anthropic adaptive effort values. */ +/** + * Maps a normalized thinking effort to Anthropic adaptive effort values via + * the model's baked `thinking.effortMap` (identity for unmapped efforts). + */ export function mapEffortToAnthropicAdaptiveEffort( model: ApiModel, effort: Effort, ): "low" | "medium" | "high" | "xhigh" | "max" { const supported = requireSupportedEffort(model, effort); - if (anthropicModelHasRealXHighEffort(model)) { - // Opus 4.7+ and Fable/Mythos 5 on the Messages API expose the full - // five-tier adaptive scale - // (low/medium/high/xhigh/max). Shift our user-facing efforts up one notch so - // the top tier reaches the genuine "max" and "high" lands on Anthropic's - // recommended "xhigh" coding/agentic default. - switch (supported) { - case Effort.Minimal: - return "low"; - case Effort.Low: - return "medium"; - case Effort.Medium: - return "high"; - case Effort.High: - return "xhigh"; - case Effort.XHigh: - return "max"; - } - } - // Older adaptive models (Opus 4.6) and Bedrock Converse expose only four tiers - // with no real "xhigh"; XHigh is a legacy alias for the top "max" tier there. - switch (supported) { - case Effort.Minimal: - case Effort.Low: - return "low"; - case Effort.Medium: - return "medium"; - case Effort.High: - return "high"; - case Effort.XHigh: - return "max"; - } -} - -/** - * Returns true for Anthropic models with Opus 4.7+/Fable/Mythos API restrictions: - * - Sampling parameters (temperature/top_p/top_k) return 400 error - * - Thinking content is omitted by default (needs display: "summarized") - */ -export function hasOpus47ApiRestrictions(modelId: string): boolean { - const parsed = parseAnthropicModel(bareModelId(modelId)); - if (!parsed) return false; - return (parsed.kind === "opus" && semverGte(parsed.version, "4.7")) || isFableOrMythos(parsed.kind); -} - -/** - * Mid-conversation `role: "system"` messages (system instructions appended at - * non-first positions in the `messages` array) are supported starting with - * Claude Opus 4.8 and the Claude Fable/Mythos 5 generation. Earlier Claude - * models reject the role. - * @see https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages - */ -export function supportsMidConversationSystemMessages(modelId: string): boolean { - const parsed = parseAnthropicModel(bareModelId(modelId)); - if (!parsed) return false; - return (parsed.kind === "opus" && semverGte(parsed.version, "4.8")) || isFableOrMythos(parsed.kind); -} - -export function isAnthropicFableOrMythosModel(modelId: string): boolean { - const parsed = parseAnthropicModel(bareModelId(modelId)); - return parsed !== null && isFableOrMythos(parsed.kind); -} - -function isOpenRouterAnthropicAdaptiveReasoningModel( - parsedModel: AnthropicModel, - model: ApiModel, -): boolean { - if (model.api !== "openai-completions") return false; - if (!modelMatchesHost(model, "openrouter")) return false; - return isFableOrMythos(parsedModel.kind) || (parsedModel.kind === "opus" && semverGte(parsedModel.version, "4.6")); -} - -function anthropicModelHasRealXHighEffort(model: ApiModel): boolean { - if (model.api !== "anthropic-messages") return false; - const parsedModel = parseKnownModel(model.id); - if (parsedModel.family !== "anthropic") return false; - if (isFableOrMythos(parsedModel.kind)) return true; - return parsedModel.kind === "opus" && semverGte(parsedModel.version, "4.7"); -} - -function applyGeneratedModelPolicy(model: ApiModel): void { - const copilotLimits = model.provider === "github-copilot" ? COPILOT_GENERATED_LIMITS[model.id] : undefined; - if (copilotLimits) { - model.contextWindow = copilotLimits.contextWindow; - model.maxTokens = copilotLimits.maxTokens; - } - - if ( - model.api === "openai-completions" && - (model.provider === "minimax-code" || model.provider === "minimax-code-cn") - ) { - model.compat = { - ...(model.compat ?? {}), - supportsStore: false, - supportsDeveloperRole: false, - supportsReasoningEffort: false, - reasoningContentField: "reasoning_content", - }; - delete model.compat.thinkingFormat; - } - if ( - model.api === "openai-completions" && - model.provider === "opencode-go" && - (model.id === "deepseek-v4-flash" || model.id === "deepseek-v4-pro") - ) { - model.compat = { - ...(model.compat ?? {}), - supportsToolChoice: false, - reasoningContentField: "reasoning_content", - requiresReasoningContentForToolCalls: true, - }; - } - const parsedModel = parseKnownModel(model.id); - const applyPatchToolType = inferGeneratedApplyPatchToolType(model, parsedModel); - if (applyPatchToolType) { - model.applyPatchToolType = applyPatchToolType; - } else { - delete model.applyPatchToolType; - } - if (parsedModel.family === "anthropic") { - applyAnthropicCatalogPolicy(model, parsedModel); - } - if (parsedModel.family === "openai") { - applyOpenAICatalogPolicy(model, parsedModel); - } -} - -function applyAnthropicCatalogPolicy(model: ApiModel, parsedModel: AnthropicModel): void { - // Claude Opus 4.5: models.dev reports 3x the correct cache pricing. - if (model.provider === "anthropic" && parsedModel.kind === "opus" && semverEqual(parsedModel.version, "4.5")) { - model.cost.cacheRead = 0.5; - model.cost.cacheWrite = 6.25; - } - - // Bedrock Opus 4.6: upstream metadata is stale for cache pricing and context. - if (model.provider === "amazon-bedrock" && parsedModel.kind === "opus" && semverEqual(parsedModel.version, "4.6")) { - model.cost.cacheRead = 0.5; - model.cost.cacheWrite = 6.25; - model.contextWindow = 1000000; - model.maxTokens = 128000; - } - - // Claude Fable/Mythos 5: Anthropic's /v1/models omits token limits and - // pricing, and models.dev lags new releases. Pin authoritative values from - // the model card (1M context / 128k output) and pricing docs ($10 in / $50 - // out per MTok). - if (model.provider === "anthropic" && isFableOrMythos(parsedModel.kind)) { - model.contextWindow = 1_000_000; - model.maxTokens = 128_000; - model.cost.input = 10; - model.cost.output = 50; - model.cost.cacheRead = 1; - model.cost.cacheWrite = 12.5; - } -} - -function inferGeneratedApplyPatchToolType( - model: ApiModel, - parsedModel: ParsedModel, -): ApiModel["applyPatchToolType"] { - if (parsedModel.family !== "openai" || parsedModel.version.major !== 5) { - return undefined; - } - if (model.provider === "openai" && model.api === "openai-responses") { - return "freeform"; - } - if (model.provider === "openai-codex" && model.api === "openai-codex-responses") { - return "freeform"; - } - return undefined; -} - -function applyOpenAICatalogPolicy(model: ApiModel, parsedModel: OpenAIModel): void { - // Codex models: 400K figure includes output budget; input window is 272K. - if (parsedModel.variant.startsWith("codex") && parsedModel.variant !== "codex-spark") { - model.contextWindow = 272000; - return; - } - // GPT-5.4 mini/nano use plain OpenAI IDs on the Codex transport, but Codex still - // enforces the lower prompt budget for these variants. Codex discovery can also - // report inconsistent priorities for the GPT-5.4 family, so normalize by parsed - // variant instead of special-casing raw model ids. - if (model.api === "openai-codex-responses" && semverEqual(parsedModel.version, "5.4")) { - const normalizedPriority = CODEX_GPT_5_4_PRIORITY_BY_VARIANT[parsedModel.variant]; - if (normalizedPriority !== undefined) { - model.priority = normalizedPriority; - } - if (parsedModel.variant === "mini" || parsedModel.variant === "nano") { - model.contextWindow = 272000; - } - } -} - -function inferModelThinking(model: ApiModel): ThinkingConfig { - const parsedModel = parseKnownModel(model.id); - const efforts = inferSupportedEfforts(parsedModel, model); - const minLevel = efforts[0]; - const maxLevel = efforts.at(-1); - if (!minLevel || !maxLevel) { - throw new Error(`Model ${model.provider}/${model.id} resolved to an empty thinking range`); - } - const config: ThinkingConfig = { - mode: inferThinkingControlMode(model, parsedModel), - minLevel, - maxLevel, - }; - // Encode explicit levels only when the inferred set has gaps the min..max range cannot represent. - const minIndex = THINKING_EFFORTS.indexOf(minLevel); - const maxIndex = THINKING_EFFORTS.indexOf(maxLevel); - const expandedRange = THINKING_EFFORTS.slice(minIndex, maxIndex + 1); - if (expandedRange.length !== efforts.length) { - config.levels = efforts; - } - return config; -} - -function normalizeThinkingConfig(thinking: ThinkingConfig | undefined): ThinkingConfig | undefined { - if (!thinking || expandEffortRange(thinking).length === 0) { - return undefined; - } - return thinking; -} - -function thinkingsEqual(left: ThinkingConfig | undefined, right: ThinkingConfig | undefined): boolean { - if (left === right) return true; - if (!left || !right) return false; - if (left.mode !== right.mode || left.minLevel !== right.minLevel || left.maxLevel !== right.maxLevel) return false; - const leftLevels = left.levels; - const rightLevels = right.levels; - if (leftLevels === rightLevels) return true; - if (!leftLevels || !rightLevels) return false; - if (leftLevels.length !== rightLevels.length) return false; - return leftLevels.every((level, index) => level === rightLevels[index]); -} - -function expandEffortRange(thinking: ThinkingConfig): readonly Effort[] { - if (thinking.levels && thinking.levels.length > 0) { - return thinking.levels; - } - const minIndex = THINKING_EFFORTS.indexOf(thinking.minLevel); - const maxIndex = THINKING_EFFORTS.indexOf(thinking.maxLevel); - if (minIndex === -1 || maxIndex === -1 || minIndex > maxIndex) { - return []; - } - return THINKING_EFFORTS.slice(minIndex, maxIndex + 1); -} - -function inferSupportedEfforts(parsedModel: ParsedModel, model: ApiModel): readonly Effort[] { - switch (parsedModel.family) { - case "openai": - return inferOpenAISupportedEfforts(parsedModel); - case "gemini": - return inferGeminiSupportedEfforts(parsedModel); - case "anthropic": - return inferAnthropicSupportedEfforts(parsedModel, model); - case "unknown": - return inferFallbackEfforts(model); - } -} - -function inferOpenAISupportedEfforts(model: OpenAIModel): readonly Effort[] { - if (model.variant === "codex-mini" && semverEqual(model.version, "5.1")) { - return GPT_5_1_CODEX_MINI_EFFORTS; - } - if (semverGte(model.version, "5.2")) { - return GPT_5_2_PLUS_EFFORTS; - } - return DEFAULT_REASONING_EFFORTS; -} - -function inferGeminiSupportedEfforts(model: GeminiModel): readonly Effort[] { - if (!semverGte(model.version, "3.0")) { - return DEFAULT_REASONING_EFFORTS; - } - return model.kind === "pro" ? GEMINI_3_PRO_EFFORTS : GEMINI_3_FLASH_EFFORTS; -} - -function inferAnthropicSupportedEfforts( - parsedModel: AnthropicModel, - model: ApiModel, -): readonly Effort[] { - if ( - (model.api === "anthropic-messages" || model.api === "bedrock-converse-stream") && - semverGte(parsedModel.version, "4.6") - ) { - return parsedModel.kind === "opus" || isFableOrMythos(parsedModel.kind) - ? DEFAULT_REASONING_EFFORTS_WITH_XHIGH - : DEFAULT_REASONING_EFFORTS; - } - if (isOpenRouterAnthropicAdaptiveReasoningModel(parsedModel, model)) { - return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; - } - return inferFallbackEfforts(model); -} - -function inferFallbackEfforts(model: ApiModel): readonly Effort[] { - if (model.api === "anthropic-messages") { - return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; - } - if (model.name.includes("deepseek-v4")) { - return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; - } - if (model.api === "bedrock-converse-stream") { - return DEFAULT_REASONING_EFFORTS; - } - if (model.api === "openai-completions") { - const compat = buildOpenAICompat(model as ModelSpec<"openai-completions">); - if (compat.thinkingFormat === "openai" && compat.supportsReasoningEffort) { - return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; - } - return DEFAULT_REASONING_EFFORTS; - } - // OpenAI Responses APIs encode discrete effort levels, including xhigh. - if (model.api === "openai-responses" || model.api === "openai-codex-responses") { - return DEFAULT_REASONING_EFFORTS_WITH_XHIGH; - } - return DEFAULT_REASONING_EFFORTS; -} - -function inferThinkingControlMode( - model: ApiModel, - parsedModel: ParsedModel, -): ThinkingConfig["mode"] { - switch (model.api) { - case "google-generative-ai": - case "google-gemini-cli": - case "google-vertex": - return parsedModel.family === "gemini" && - semverGte(parsedModel.version, "3.0") && - parsedModel.version.major === 3 - ? "google-level" - : "budget"; - - case "anthropic-messages": - if (parsedModel.family === "anthropic") { - if (semverGte(parsedModel.version, "4.6")) { - return "anthropic-adaptive"; - } - if (semverGte(parsedModel.version, "4.5")) { - return "anthropic-budget-effort"; - } - } - return "budget"; - - case "bedrock-converse-stream": - if (parsedModel.family === "anthropic") { - if ( - semverGte(parsedModel.version, "4.6") && - (parsedModel.kind === "opus" || isFableOrMythos(parsedModel.kind)) - ) { - return "anthropic-adaptive"; - } - if (semverGte(parsedModel.version, "4.5")) { - return "anthropic-budget-effort"; - } - } - return "budget"; - - default: - return "effort"; - } + return (model.thinking?.effortMap?.[supported] ?? supported) as "low" | "medium" | "high" | "xhigh" | "max"; } diff --git a/packages/catalog/src/models.json b/packages/catalog/src/models.json index 9822054af..8174e135c 100644 --- a/packages/catalog/src/models.json +++ b/packages/catalog/src/models.json @@ -2016,8 +2016,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-1-20250805": { @@ -2041,8 +2046,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-20250514": { @@ -2066,8 +2076,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5-20251101": { @@ -2091,8 +2106,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-6": { @@ -2116,8 +2136,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-7": { @@ -2141,8 +2166,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-8": { @@ -2166,8 +2196,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-20250514": { @@ -2191,8 +2226,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5-20250929": { @@ -2216,8 +2256,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-6": { @@ -2241,8 +2286,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "command-a": { @@ -2379,8 +2429,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v4-pro": { @@ -2403,8 +2458,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-chat-v3-0324": { @@ -2580,8 +2640,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite": { @@ -2605,8 +2669,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite-preview-09-2025": { @@ -2649,8 +2717,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-flash-preview": { @@ -2674,8 +2746,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-flash-lite": { @@ -2699,8 +2775,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-flash-lite-preview": { @@ -2724,8 +2804,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-pro-preview": { @@ -2749,9 +2833,7 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -2778,8 +2860,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemma-3-12b-it": { @@ -2879,8 +2965,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gen3a_turbo": { @@ -2979,8 +3070,13 @@ "maxTokens": 98304, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.6": { @@ -3022,8 +3118,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5": { @@ -3046,8 +3147,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5.1": { @@ -3070,8 +3176,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-ocr": { @@ -3655,8 +3766,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-2025-08-07": { @@ -3737,8 +3852,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-mini-2025-08-07": { @@ -3781,8 +3900,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-nano-2025-08-07": { @@ -3825,8 +3948,12 @@ "maxTokens": 272000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-2025-11-13": { @@ -3869,8 +3996,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex": { @@ -3894,8 +4025,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-mini": { @@ -3919,8 +4054,10 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "gpt-5.2-2025-12-11": { @@ -3963,8 +4100,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.2-codex": { @@ -3988,8 +4129,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.2-pro-2025-12-11": { @@ -4032,8 +4177,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-2026-03-05": { @@ -4132,8 +4281,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-oss-20b": { @@ -4784,8 +4938,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/MiniMax-Text-01": { @@ -5417,8 +5576,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o1-2024-12-17": { @@ -5479,8 +5643,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o3-mini-2025-01-31": { @@ -5542,8 +5711,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o4-mini": { @@ -5567,8 +5741,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o4-mini-2025-04-16": { @@ -6067,8 +6246,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.6-27b": { @@ -6130,8 +6313,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.6-max-preview": { @@ -6174,8 +6361,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.7-max": { @@ -6198,8 +6389,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.7-plus": { @@ -6223,8 +6418,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "ray-2": { @@ -6457,8 +6656,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "triposr": { @@ -6861,8 +7065,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-build-0-1": { @@ -6904,8 +7113,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5": { @@ -6929,8 +7143,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5-pro": { @@ -6953,8 +7172,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -6982,8 +7206,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "glm-5": { @@ -7009,8 +7237,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "kimi-k2.5": { @@ -7037,8 +7269,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5": { @@ -7064,8 +7300,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3-coder-next": { @@ -7158,8 +7398,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.6-flash": { @@ -7186,8 +7430,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.6-plus": { @@ -7214,8 +7462,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.7-max": { @@ -7241,8 +7493,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -7388,8 +7644,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "anthropic.claude-opus-4-7": { @@ -7413,8 +7678,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic.claude-opus-4-8": { @@ -7438,8 +7713,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "au.anthropic.claude-haiku-4-5-20251001-v1:0": { @@ -7463,8 +7748,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "au.anthropic.claude-opus-4-6-v1": { @@ -7488,8 +7777,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "au.anthropic.claude-opus-4-8": { @@ -7513,8 +7811,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "au.anthropic.claude-sonnet-4-5-20250929-v1:0": { @@ -7538,8 +7846,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "au.anthropic.claude-sonnet-4-6": { @@ -7563,8 +7875,12 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "cohere.command-r-plus-v1:0": { @@ -7625,8 +7941,12 @@ "maxTokens": 81920, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek.v3.2": { @@ -7649,8 +7969,12 @@ "maxTokens": 81920, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek.v3.2-v1:0": { @@ -7673,8 +7997,12 @@ "maxTokens": 81920, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-3-5-haiku-20241022-v1:0": { @@ -7838,8 +8166,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "eu.anthropic.claude-haiku-4-5-20251001-v1:0": { @@ -7863,8 +8201,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-opus-4-1-20250805-v1:0": { @@ -7888,8 +8230,12 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-opus-4-20250514-v1:0": { @@ -7913,8 +8259,12 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-opus-4-5-20251101-v1:0": { @@ -7938,8 +8288,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-opus-4-6-v1": { @@ -7963,8 +8317,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "eu.anthropic.claude-opus-4-7": { @@ -7988,8 +8351,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "eu.anthropic.claude-opus-4-8": { @@ -8013,8 +8386,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "eu.anthropic.claude-sonnet-4-20250514-v1:0": { @@ -8038,8 +8421,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-sonnet-4-5-20250929-v1:0": { @@ -8063,8 +8450,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "eu.anthropic.claude-sonnet-4-6": { @@ -8088,8 +8479,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "global.amazon.nova-2-lite-v1:0": { @@ -8113,8 +8508,12 @@ "maxTokens": 4096, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "global.anthropic.claude-fable-5": { @@ -8138,8 +8537,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "global.anthropic.claude-haiku-4-5-20251001-v1:0": { @@ -8163,8 +8572,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "global.anthropic.claude-opus-4-5-20251101-v1:0": { @@ -8188,8 +8601,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "global.anthropic.claude-opus-4-6-v1": { @@ -8213,8 +8630,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "global.anthropic.claude-opus-4-7": { @@ -8238,8 +8664,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "global.anthropic.claude-opus-4-8": { @@ -8263,8 +8699,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "global.anthropic.claude-sonnet-4-20250514-v1:0": { @@ -8288,8 +8734,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "global.anthropic.claude-sonnet-4-5-20250929-v1:0": { @@ -8313,8 +8763,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "global.anthropic.claude-sonnet-4-6": { @@ -8338,8 +8792,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google.gemma-3-27b-it": { @@ -8403,8 +8861,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "jp.anthropic.claude-opus-4-8": { @@ -8428,8 +8896,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "jp.anthropic.claude-sonnet-4-5-20250929-v1:0": { @@ -8453,8 +8931,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "jp.anthropic.claude-sonnet-4-6": { @@ -8478,8 +8960,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "meta.llama3-1-405b-instruct-v1:0": { @@ -8559,8 +9045,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax.minimax-m2.1": { @@ -8583,8 +9073,12 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax.minimax-m2.5": { @@ -8607,8 +9101,12 @@ "maxTokens": 98304, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mistral.devstral-2-123b": { @@ -8651,8 +9149,12 @@ "maxTokens": 40000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mistral.ministral-3-14b-instruct": { @@ -8830,8 +9332,12 @@ "maxTokens": 16000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "moonshotai.kimi-k2.5": { @@ -8855,8 +9361,12 @@ "maxTokens": 16000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia.nemotron-nano-12b-v2": { @@ -8899,8 +9409,12 @@ "maxTokens": 4096, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia.nemotron-nano-9b-v2": { @@ -8942,8 +9456,12 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai.gpt-5.4": { @@ -8967,8 +9485,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai.gpt-5.5": { @@ -8992,8 +9514,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai.gpt-oss-120b": { @@ -9016,8 +9542,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai.gpt-oss-120b-1:0": { @@ -9040,8 +9570,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai.gpt-oss-20b": { @@ -9064,8 +9598,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai.gpt-oss-20b-1:0": { @@ -9088,8 +9626,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai.gpt-oss-safeguard-120b": { @@ -9169,8 +9711,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen.qwen3-coder-30b-a3b-v1:0": { @@ -9231,8 +9777,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen.qwen3-next-80b-a3b": { @@ -9334,8 +9884,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.amazon.nova-pro-v1:0": { @@ -9399,8 +9953,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "us.anthropic.claude-haiku-4-5-20251001-v1:0": { @@ -9424,8 +9988,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.anthropic.claude-opus-4-1-20250805-v1:0": { @@ -9449,8 +10017,12 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.anthropic.claude-opus-4-20250514-v1:0": { @@ -9474,8 +10046,12 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.anthropic.claude-opus-4-5-20251101-v1:0": { @@ -9499,8 +10075,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.anthropic.claude-opus-4-6-v1": { @@ -9524,8 +10104,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "us.anthropic.claude-opus-4-7": { @@ -9549,8 +10138,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "us.anthropic.claude-opus-4-8": { @@ -9574,8 +10173,18 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + }, + "supportsDisplay": true } }, "us.anthropic.claude-sonnet-4-20250514-v1:0": { @@ -9599,8 +10208,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.anthropic.claude-sonnet-4-5-20250929-v1:0": { @@ -9624,8 +10237,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.anthropic.claude-sonnet-4-6": { @@ -9649,8 +10266,12 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.deepseek.r1-v1:0": { @@ -9673,8 +10294,12 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "us.meta.llama3-2-11b-instruct-v1:0": { @@ -9834,8 +10459,12 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "writer.palmyra-x5-v1:0": { @@ -9858,8 +10487,12 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "zai.glm-4.7": { @@ -9882,8 +10515,12 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "zai.glm-4.7-flash": { @@ -9906,8 +10543,12 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "zai.glm-5": { @@ -9930,8 +10571,12 @@ "maxTokens": 101376, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -10017,8 +10662,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-haiku-4-5": { @@ -10042,8 +10700,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-haiku-4-5-20251001": { @@ -10067,8 +10730,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-mythos-5": { @@ -10092,8 +10760,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-opus-4-0": { @@ -10117,8 +10798,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-1": { @@ -10142,8 +10828,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-1-20250805": { @@ -10167,8 +10858,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-20250514": { @@ -10192,8 +10888,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5": { @@ -10217,8 +10918,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5-20251101": { @@ -10242,8 +10948,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-6": { @@ -10267,8 +10978,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "claude-opus-4-7": { @@ -10292,8 +11012,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-opus-4-8": { @@ -10317,8 +11050,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-sonnet-4-0": { @@ -10342,8 +11088,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-20250514": { @@ -10367,8 +11118,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5": { @@ -10392,8 +11148,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5-20250929": { @@ -10417,8 +11178,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-6": { @@ -10442,8 +11208,16 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } } }, @@ -10468,8 +11242,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "llama3.1-8b": { @@ -10710,8 +11489,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-haiku-4-5": { @@ -10735,8 +11527,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4": { @@ -10760,8 +11557,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4-1": { @@ -10785,8 +11587,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4-5": { @@ -10810,8 +11617,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4-6": { @@ -10835,8 +11647,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "anthropic/claude-opus-4-7": { @@ -10860,8 +11681,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-opus-4-8": { @@ -10885,8 +11719,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-sonnet-4": { @@ -10910,8 +11757,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4-5": { @@ -10935,8 +11787,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4-6": { @@ -10960,8 +11817,16 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "claude-sonnet-4-5": { @@ -10985,8 +11850,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-4": { @@ -11089,8 +11959,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex": { @@ -11114,8 +11988,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.2": { @@ -11139,8 +12017,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-codex": { @@ -11164,8 +12046,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.3-codex": { @@ -11189,8 +12075,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4": { @@ -11214,8 +12104,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5": { @@ -11239,8 +12133,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o1": { @@ -11264,8 +12162,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3": { @@ -11289,8 +12192,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-mini": { @@ -11313,8 +12221,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-pro": { @@ -11338,8 +12251,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o4-mini": { @@ -11363,8 +12281,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "workers-ai/@cf/moonshotai/kimi-k2.5": { @@ -11388,8 +12311,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "workers-ai/@cf/moonshotai/kimi-k2.6": { @@ -11413,8 +12341,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "workers-ai/@cf/nvidia/nemotron-3-120b-a12b": { @@ -11437,8 +12370,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "workers-ai/@cf/zai-org/glm-4.7-flash": { @@ -11461,8 +12399,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -11508,8 +12451,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-4.5-sonnet": { @@ -11553,8 +12500,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-4.6-opus-high": { @@ -11712,8 +12663,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro": { @@ -11737,9 +12692,7 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -11766,9 +12719,7 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -11795,8 +12746,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-max-high": { @@ -11820,8 +12775,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-mini": { @@ -11845,8 +12804,10 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "gpt-5.1-high": { @@ -11889,8 +12850,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.2-codex": { @@ -11914,8 +12879,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.2-codex-fast": { @@ -12072,8 +13041,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.3-codex": { @@ -12097,8 +13070,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.3-codex-fast": { @@ -12406,8 +13383,12 @@ "maxTokens": 10000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "kimi-k2.5": { @@ -12431,8 +13412,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -12478,8 +13463,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v4-pro": { @@ -12523,8 +13513,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -12550,8 +13545,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -12592,8 +13592,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5": { @@ -12616,8 +13621,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5.1": { @@ -12640,8 +13650,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-oss-120b": { @@ -12664,8 +13679,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.5": { @@ -12689,8 +13709,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.6": { @@ -12714,8 +13739,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.7": { @@ -12738,8 +13768,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -12769,8 +13804,13 @@ "premiumMultiplier": 0.33, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4.5": { @@ -12797,8 +13837,13 @@ }, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4.6": { @@ -12826,8 +13871,17 @@ "premiumMultiplier": 3, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "claude-opus-4.7": { @@ -12854,8 +13908,21 @@ }, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-opus-4.8": { @@ -12882,8 +13949,21 @@ }, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-sonnet-4": { @@ -12910,8 +13990,13 @@ }, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4.5": { @@ -12938,8 +14023,13 @@ }, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4.6": { @@ -12966,8 +14056,16 @@ }, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "gemini-2.5-pro": { @@ -12999,8 +14097,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-flash-preview": { @@ -13032,8 +14134,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro-preview": { @@ -13065,9 +14171,7 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -13102,9 +14206,7 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -13139,8 +14241,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-4.1": { @@ -13224,8 +14330,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-mini": { @@ -13252,8 +14362,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1": { @@ -13280,8 +14394,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex": { @@ -13308,8 +14426,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-max": { @@ -13336,8 +14458,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-mini": { @@ -13364,8 +14490,10 @@ }, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "gpt-5.2": { @@ -13392,8 +14520,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.2-codex": { @@ -13420,8 +14552,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.3-codex": { @@ -13448,8 +14584,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4": { @@ -13476,8 +14616,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-mini": { @@ -13505,8 +14649,12 @@ "premiumMultiplier": 0.33, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-nano": { @@ -13533,8 +14681,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.5": { @@ -13561,8 +14713,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "contextPromotionTarget": "github-copilot/gpt-5.4" }, @@ -13595,8 +14751,12 @@ "premiumMultiplier": 0.25, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "raptor-mini": { @@ -13628,8 +14788,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -13655,8 +14819,13 @@ "provider": "gitlab-duo", "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5-20251101": { @@ -13680,8 +14849,13 @@ "provider": "gitlab-duo", "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5-20250929": { @@ -13705,8 +14879,13 @@ "provider": "gitlab-duo", "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "duo-chat-gpt-5-1": { @@ -13730,8 +14909,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "duo-chat-gpt-5-2": { @@ -13755,8 +14938,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "duo-chat-gpt-5-2-codex": { @@ -13780,8 +14967,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "duo-chat-gpt-5-codex": { @@ -13805,8 +14996,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "duo-chat-gpt-5-mini": { @@ -13830,8 +15025,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "duo-chat-haiku-4-5": { @@ -13855,8 +15054,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "duo-chat-opus-4-5": { @@ -13880,8 +15084,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "duo-chat-opus-4-6": { @@ -13905,8 +15114,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "duo-chat-sonnet-4-5": { @@ -13930,8 +15144,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "duo-chat-sonnet-4-6": { @@ -13955,8 +15174,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5-codex": { @@ -13980,8 +15204,12 @@ "provider": "gitlab-duo", "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-mini-2025-08-07": { @@ -14005,8 +15233,12 @@ "provider": "gitlab-duo", "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-2025-11-13": { @@ -14030,8 +15262,12 @@ "provider": "gitlab-duo", "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -14157,8 +15393,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite": { @@ -14182,8 +15422,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite-preview-06-17": { @@ -14207,8 +15451,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite-preview-09-2025": { @@ -14232,8 +15480,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-preview-04-17": { @@ -14257,8 +15509,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-preview-05-20": { @@ -14282,8 +15538,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-preview-09-2025": { @@ -14307,8 +15567,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro": { @@ -14332,8 +15596,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro-preview-05-06": { @@ -14357,8 +15625,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro-preview-06-05": { @@ -14382,8 +15654,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-flash-preview": { @@ -14407,8 +15683,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro-preview": { @@ -14432,9 +15712,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -14461,8 +15739,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-flash-lite-preview": { @@ -14486,8 +15768,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-pro-preview": { @@ -14511,9 +15797,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -14540,9 +15824,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -14569,8 +15851,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-flash-latest": { @@ -14594,8 +15880,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-flash-lite-latest": { @@ -14619,8 +15909,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-live-2.5-flash": { @@ -14644,8 +15938,12 @@ "maxTokens": 8000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-live-2.5-flash-preview-native-audio": { @@ -14668,8 +15966,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemma-3-27b-it": { @@ -14713,8 +16015,12 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemma-4-26b-a4b-it": { @@ -14738,8 +16044,12 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemma-4-26b-it": { @@ -14763,8 +16073,12 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemma-4-31b": { @@ -14788,8 +16102,12 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemma-4-31b-it": { @@ -14813,8 +16131,12 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -14840,8 +16162,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-opus-4-6-thinking": { @@ -14865,8 +16191,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-sonnet-4-5": { @@ -14890,8 +16220,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-sonnet-4-5-thinking": { @@ -14915,8 +16249,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-sonnet-4-6": { @@ -14940,8 +16278,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "claude-sonnet-4-6-thinking": { @@ -14965,8 +16307,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash": { @@ -14990,8 +16336,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-thinking": { @@ -15015,8 +16365,12 @@ "maxTokens": 65535, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro": { @@ -15040,8 +16394,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-flash": { @@ -15065,8 +16423,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro-high": { @@ -15090,9 +16452,7 @@ "maxTokens": 65535, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15119,9 +16479,7 @@ "maxTokens": 65535, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15148,9 +16506,7 @@ "maxTokens": 65535, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15177,9 +16533,7 @@ "maxTokens": 65535, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15205,8 +16559,12 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -15252,8 +16610,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro": { @@ -15277,8 +16639,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-flash-preview": { @@ -15302,8 +16668,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro-preview": { @@ -15327,9 +16697,7 @@ "maxTokens": 64000, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15356,8 +16724,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-pro-preview": { @@ -15381,9 +16753,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15412,8 +16782,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5@20251101": { @@ -15437,8 +16812,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-6@default": { @@ -15462,8 +16842,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "claude-opus-4-7@default": { @@ -15487,8 +16876,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-opus-4-8@default": { @@ -15512,8 +16914,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-sonnet-4-5@20250929": { @@ -15537,8 +16952,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-6@default": { @@ -15562,8 +16982,16 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "deepseek-ai/deepseek-v3.1-maas": { @@ -15586,8 +17014,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v3.2-maas": { @@ -15610,8 +17043,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gemini-2.5-flash": { @@ -15635,8 +17073,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite": { @@ -15660,8 +17102,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro": { @@ -15685,8 +17131,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-flash-preview": { @@ -15710,8 +17160,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-flash-lite": { @@ -15735,8 +17189,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-flash-lite-preview": { @@ -15760,8 +17218,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3.1-pro-preview": { @@ -15785,9 +17247,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15814,9 +17274,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -15843,8 +17301,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-flash-latest": { @@ -15868,8 +17330,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-flash-lite-latest": { @@ -15893,8 +17359,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "meta/llama-3.3-70b-instruct-maas": { @@ -15956,8 +17426,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-120b-maas": { @@ -15980,8 +17455,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-20b-maas": { @@ -16004,8 +17484,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen/qwen3-235b-a22b-instruct-2507-maas": { @@ -16028,8 +17513,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "zai-org/glm-4.7-maas": { @@ -16052,8 +17541,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-5-maas": { @@ -16076,8 +17570,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -16102,8 +17601,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gemma2-9b-it": { @@ -16145,8 +17649,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "groq/compound-mini": { @@ -16169,8 +17678,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "llama-3.1-8b-instant": { @@ -16366,8 +17880,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-20b": { @@ -16390,8 +17909,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-safeguard-20b": { @@ -16414,8 +17938,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen-qwq-32b": { @@ -16438,8 +17967,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-32b": { @@ -16462,8 +17995,12 @@ "maxTokens": 40960, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -16488,8 +18025,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/DeepSeek-V3.1": { @@ -16550,8 +18092,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -17207,8 +18754,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-3.7-sonnet:thinking": { @@ -17251,8 +18803,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-haiku-4.5": { @@ -17296,8 +18853,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.1": { @@ -17321,8 +18883,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.5": { @@ -17346,8 +18913,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.6": { @@ -17371,8 +18943,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.6-fast": { @@ -17415,8 +18992,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.7-fast": { @@ -17459,8 +19041,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.8-fast": { @@ -17503,8 +19090,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4.5": { @@ -17528,8 +19120,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4.6": { @@ -17553,8 +19150,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "arcee-ai/coder-large": { @@ -18299,8 +19901,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2-exp": { @@ -18323,8 +19930,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2-speciale": { @@ -18366,8 +19978,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-flash:discounted": { @@ -18428,8 +20045,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-pro:discounted": { @@ -18586,8 +20208,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-flash-image": { @@ -18669,8 +20295,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-pro-preview": { @@ -18732,8 +20362,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-pro-image-preview": { @@ -18757,9 +20391,7 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -18786,9 +20418,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -18834,8 +20464,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.1-flash-lite-preview": { @@ -18879,9 +20513,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -18927,8 +20559,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-2-27b-it": { @@ -19009,8 +20645,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/gemma-3-4b-it": { @@ -19092,8 +20733,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/lyria-3-clip-preview": { @@ -19344,8 +20990,13 @@ "maxTokens": 65000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "inclusionai/ring-2.6-1t:free": { @@ -20015,8 +21666,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "microsoft/wizardlm-2-8x22b": { @@ -20096,8 +21752,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2-her": { @@ -20139,8 +21800,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5": { @@ -20163,8 +21829,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5:free": { @@ -20206,8 +21877,13 @@ "maxTokens": 131070, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m3": { @@ -20231,8 +21907,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m3:discounted": { @@ -20863,8 +22544,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.5": { @@ -20888,8 +22574,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.5:free": { @@ -20932,8 +22623,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.6:free": { @@ -21222,8 +22918,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/llama-3.3-nemotron-super-49b-v1.5": { @@ -21265,8 +22966,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { @@ -21308,8 +23014,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-super-120b-a12b:free": { @@ -21351,8 +23062,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-ultra-550b-a55b:free": { @@ -21873,8 +23589,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-chat": { @@ -21917,8 +23637,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-image": { @@ -22037,8 +23761,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-chat": { @@ -22082,8 +23810,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-max": { @@ -22126,8 +23858,10 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "openai/gpt-5.2": { @@ -22151,8 +23885,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-chat": { @@ -22195,8 +23933,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-pro": { @@ -22220,8 +23962,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.3-chat": { @@ -22264,8 +24010,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4": { @@ -22289,8 +24039,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4-image-2": { @@ -22371,8 +24125,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5": { @@ -22396,8 +24154,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5-pro": { @@ -22421,8 +24183,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-audio": { @@ -22502,8 +24268,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-120b:exacto": { @@ -22545,8 +24316,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-safeguard-20b": { @@ -22569,8 +24345,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o1": { @@ -22594,8 +24375,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o1-pro": { @@ -22638,8 +24424,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-deep-research": { @@ -22681,8 +24472,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-mini-high": { @@ -22725,8 +24521,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o4-mini": { @@ -22750,8 +24551,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o4-mini-deep-research": { @@ -23458,8 +25264,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-235b-a22b-2507": { @@ -23577,8 +25387,12 @@ "maxTokens": 40960, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-8b": { @@ -23734,8 +25548,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-max-thinking": { @@ -23796,8 +25614,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-vl-235b-a22b-instruct": { @@ -23954,8 +25776,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-27b": { @@ -24017,8 +25843,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-9b": { @@ -24193,8 +26023,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-plus-preview:free": { @@ -24255,8 +26089,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.7-plus": { @@ -24280,8 +26118,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.7-plus:free": { @@ -24685,8 +26527,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun/step-3.7-flash:free": { @@ -24766,8 +26613,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "tencent/hy3-preview:free": { @@ -25038,8 +26890,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4-fast": { @@ -25063,8 +26920,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.1-fast": { @@ -25088,8 +26950,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.20": { @@ -25189,8 +27056,13 @@ "maxTokens": 1000000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-build-0.1": { @@ -25214,8 +27086,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-code-fast-1": { @@ -25238,8 +27115,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-code-fast-1:optimized:free": { @@ -25281,8 +27163,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-omni": { @@ -25306,8 +27193,13 @@ "maxTokens": 265000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-omni:free": { @@ -25349,8 +27241,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-pro:free": { @@ -25393,8 +27290,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5-pro": { @@ -25417,8 +27319,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4-32b": { @@ -25460,8 +27367,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.5-air": { @@ -25484,8 +27396,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.5v": { @@ -25527,8 +27444,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.6:exacto": { @@ -25571,8 +27493,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.7": { @@ -25595,8 +27522,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.7-flash": { @@ -25638,8 +27570,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5-turbo": { @@ -25662,8 +27599,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5.1": { @@ -25686,8 +27628,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5v-turbo": { @@ -25711,8 +27658,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -25747,8 +27699,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "kimi-k2": { @@ -25808,8 +27764,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "kimi-k2.5": { @@ -25842,8 +27802,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -25868,8 +27832,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.1": { @@ -25892,8 +27861,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.5": { @@ -25916,8 +27890,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.5-highspeed": { @@ -25940,8 +27919,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.5-lightning": { @@ -25964,8 +27948,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.7": { @@ -25988,8 +27977,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.7-highspeed": { @@ -26012,8 +28006,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M3": { @@ -26037,8 +28036,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -26063,8 +28067,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.1": { @@ -26087,8 +28096,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.5": { @@ -26111,8 +28125,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.5-highspeed": { @@ -26135,8 +28154,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.5-lightning": { @@ -26159,8 +28183,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.7": { @@ -26183,8 +28212,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M2.7-highspeed": { @@ -26207,8 +28241,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMax-M3": { @@ -26232,8 +28271,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -26264,8 +28308,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.1": { @@ -26294,8 +28342,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.1-lightning": { @@ -26324,8 +28376,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5": { @@ -26354,8 +28410,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5-highspeed": { @@ -26384,8 +28444,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5-lightning": { @@ -26414,8 +28478,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.7": { @@ -26444,8 +28512,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.7-highspeed": { @@ -26474,8 +28546,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M3": { @@ -26505,8 +28581,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -26537,8 +28617,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.1": { @@ -26567,8 +28651,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.1-lightning": { @@ -26597,8 +28685,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5": { @@ -26627,8 +28719,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5-highspeed": { @@ -26657,8 +28753,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.5-lightning": { @@ -26687,8 +28787,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.7": { @@ -26717,8 +28821,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M2.7-highspeed": { @@ -26747,8 +28855,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "MiniMax-M3": { @@ -26778,8 +28890,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -26957,8 +29073,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "magistral-small": { @@ -26981,8 +29102,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "ministral-3b-latest": { @@ -27143,8 +29269,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral-medium-latest": { @@ -27227,8 +29358,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral-small-latest": { @@ -27252,8 +29388,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "open-mistral-7b": { @@ -27395,8 +29536,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -27554,8 +29699,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "alibaba/qwen3.6-flash": { @@ -27674,8 +29823,13 @@ "maxTokens": 65535, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "amazon/nova-lite-v1": { @@ -27805,8 +29959,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-fable-latest": { @@ -27868,8 +30027,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.7": { @@ -27893,8 +30057,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.8": { @@ -27918,8 +30087,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-latest": { @@ -27962,8 +30136,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-latest": { @@ -28043,8 +30222,13 @@ "maxTokens": 80000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "arcee-ai/trinity-mini": { @@ -28067,8 +30251,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "asi1-mini": { @@ -28358,8 +30547,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "baseten/Kimi-K2-Instruct-FP4": { @@ -28459,8 +30653,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "chutesai/Mistral-Small-3.2-24B-Instruct-2506": { @@ -28695,8 +30894,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-haiku-4-5-20251001-thinking": { @@ -28739,8 +30943,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-1-thinking": { @@ -28859,8 +31068,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5-20251101": { @@ -28884,8 +31098,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-thinking": { @@ -29004,8 +31223,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5-20250929": { @@ -29029,8 +31253,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5-20250929-thinking": { @@ -29414,8 +31643,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { @@ -29438,8 +31672,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v3.2-exp": { @@ -29690,8 +31929,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2-speciale": { @@ -29733,8 +31977,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-pro": { @@ -29757,8 +32006,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-pro-cheaper": { @@ -29781,8 +32035,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "dmind/dmind-1": { @@ -30223,8 +32482,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "ernie-x1-32k": { @@ -30667,8 +32931,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite": { @@ -30692,8 +32960,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite-preview-06-17": { @@ -30717,8 +32989,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite-preview-09-2025": { @@ -30742,8 +33018,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-lite-preview-09-2025-thinking": { @@ -30805,8 +33085,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-preview-05-20": { @@ -30830,8 +33114,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-preview-09-2025": { @@ -30855,8 +33143,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-flash-preview-09-2025-thinking": { @@ -30907,8 +33199,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro-exp-03-25": { @@ -30970,8 +33266,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-2.5-pro-preview-06-05": { @@ -30995,8 +33295,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro-preview": { @@ -31023,9 +33327,7 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -31888,8 +34190,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-flash-preview-thinking": { @@ -31932,8 +34238,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.1-flash-lite-preview": { @@ -31977,9 +34287,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -32006,9 +34314,7 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -32073,8 +34379,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.5-flash-thinking": { @@ -32193,8 +34503,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/gemma-4-31b-it": { @@ -32218,8 +34533,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "grok-3-beta": { @@ -32394,8 +34714,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated": { @@ -32608,8 +34933,13 @@ "maxTokens": 65000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "Infermatic/MN-12B-Inferor-v0.0": { @@ -34235,8 +36565,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-01": { @@ -34316,8 +36650,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5": { @@ -34340,8 +36679,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.7": { @@ -34364,8 +36708,13 @@ "maxTokens": 131070, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.7-turbo": { @@ -34408,8 +36757,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "MiniMaxAI/MiniMax-M1-80k": { @@ -34584,8 +36938,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral/mistral-vibe-cli-latest": { @@ -34646,8 +37005,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistralai/Devstral-Small-2505": { @@ -35095,8 +37459,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2-thinking-original": { @@ -35158,8 +37527,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.6": { @@ -35183,8 +37557,13 @@ "maxTokens": 262140, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-latest": { @@ -35454,8 +37833,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nousresearch/hermes-4-70b": { @@ -35478,8 +37862,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/Llama-3_3-Nemotron-Super-49B-v1_5": { @@ -35578,8 +37967,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": { @@ -35603,8 +37997,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-super-120b-a12b": { @@ -35627,8 +38026,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-ultra-550b-a55b": { @@ -35651,8 +38055,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nvidia-nemotron-nano-9b-v2": { @@ -35675,8 +38084,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/chatgpt-4o-latest": { @@ -35955,8 +38369,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-chat-latest": { @@ -35999,8 +38417,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-mini": { @@ -36024,8 +38446,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-nano": { @@ -36049,8 +38475,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-pro": { @@ -36074,8 +38504,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1": { @@ -36099,8 +38533,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-2025-11-13": { @@ -36182,8 +38620,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-max": { @@ -36207,8 +38649,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-mini": { @@ -36232,8 +38678,10 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "openai/gpt-5.2": { @@ -36257,8 +38705,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-chat": { @@ -36302,8 +38754,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-pro": { @@ -36327,8 +38783,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.3-chat": { @@ -36371,8 +38831,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4": { @@ -36396,8 +38860,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4-mini": { @@ -36459,8 +38927,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5": { @@ -36484,8 +38956,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-chat-latest": { @@ -36546,8 +39022,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-20b": { @@ -36570,8 +39051,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-safeguard-20b": { @@ -36594,8 +39080,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o1": { @@ -36619,8 +39110,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o1-preview": { @@ -36682,8 +39178,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-deep-research": { @@ -36707,8 +39208,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-mini": { @@ -36731,8 +39237,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-mini-high": { @@ -36813,8 +39324,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o4-mini-deep-research": { @@ -36838,8 +39354,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o4-mini-high": { @@ -36863,8 +39384,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "owl": { @@ -37210,8 +39736,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-235b-a22b": { @@ -37234,8 +39764,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen/Qwen3-235B-A22B": { @@ -37334,8 +39868,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-32b": { @@ -37358,8 +39896,12 @@ "maxTokens": 40960, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen/Qwen3-8B": { @@ -37477,8 +40019,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { @@ -37520,8 +40066,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen/Qwen3-VL-235B-A22B-Instruct": { @@ -37564,8 +40114,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-397b-a17b-thinking": { @@ -37608,8 +40162,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-plus": { @@ -37633,8 +40191,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-plus-thinking": { @@ -37676,8 +40238,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwq-32b-preview": { @@ -37852,8 +40418,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.5-27b": { @@ -37876,8 +40446,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen3.5-27B-Anko": { @@ -38470,8 +41044,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.5-flash": { @@ -38494,8 +41072,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.5-omni-flash": { @@ -38575,8 +41157,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.7-plus": { @@ -38600,8 +41186,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwq-32b": { @@ -39232,8 +41822,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun-ai/step-3.5-flash-2603": { @@ -39389,8 +41984,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "TEE/gemma-3-27b-it": { @@ -39470,8 +42070,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "TEE/glm-4.6": { @@ -40045,8 +42650,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "TheDrummer/Anubis-70B-v1": { @@ -40392,8 +43002,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "Tongyi-Zhiwen/QwenLong-L1-32B": { @@ -40724,8 +43339,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.1-fast": { @@ -40749,8 +43369,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.1-fast-reasoning": { @@ -40793,8 +43418,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.20-beta-non-reasoning": { @@ -40894,8 +43524,13 @@ "maxTokens": 1000000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-build-0.1": { @@ -40919,8 +43554,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-code-fast-1": { @@ -40943,8 +43583,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-latest": { @@ -40986,8 +43631,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-flash-original": { @@ -41068,8 +43718,13 @@ "maxTokens": 265000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-pro": { @@ -41092,8 +43747,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5": { @@ -41117,8 +43777,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5-pro": { @@ -41141,8 +43806,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "yi-large": { @@ -41223,8 +43893,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.6": { @@ -41247,8 +43922,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5-turbo": { @@ -41271,8 +43951,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5v-turbo": { @@ -41296,8 +43981,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-4.5": { @@ -41339,8 +44029,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-4.6-original": { @@ -41382,8 +44077,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-4.6v": { @@ -41463,8 +44163,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-4.7-flash": { @@ -41487,8 +44192,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-4.7-flash-original": { @@ -41511,8 +44221,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-4.7-original": { @@ -41535,8 +44250,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-5": { @@ -41559,8 +44279,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-5-original": { @@ -41583,8 +44308,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-5.1": { @@ -41607,8 +44337,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/glm-latest": { @@ -41861,8 +44596,13 @@ "maxTokens": 4096, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v3.1": { @@ -41885,8 +44625,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v3.1-terminus": { @@ -41909,8 +44654,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v3.2": { @@ -41933,8 +44683,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v4-flash": { @@ -41957,8 +44712,13 @@ "maxTokens": 393216, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/deepseek-v4-pro": { @@ -41981,8 +44741,13 @@ "maxTokens": 393216, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/codegemma-1.1-7b": { @@ -42159,8 +44924,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/gemma-3-4b-it": { @@ -42243,8 +45013,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/recurrentgemma-2b": { @@ -42810,8 +45585,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "microsoft/phi-4-multimodal-instruct": { @@ -42853,8 +45633,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimaxai/minimax-m2.1": { @@ -42877,8 +45662,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimaxai/minimax-m2.5": { @@ -42901,8 +45691,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimaxai/minimax-m2.7": { @@ -42925,8 +45720,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistralai/codestral-22b-instruct-v0.1": { @@ -42968,8 +45768,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistralai/ministral-14b-instruct-2512": { @@ -43109,8 +45914,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistralai/mistral-nemotron": { @@ -43266,8 +46076,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2-instruct-0905": { @@ -43309,8 +46124,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.5": { @@ -43334,8 +46154,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.6": { @@ -43359,8 +46184,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nv-mistralai/mistral-nemo-12b-instruct": { @@ -43497,8 +46327,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/llama-3_3-nemotron-super-49b-v1_5": { @@ -43521,8 +46356,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/llama-3.1-nemoguard-8b-content-safety": { @@ -43678,8 +46518,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/llama-3.2-nemoretriever-1b-vlm-embed-v1": { @@ -43892,8 +46737,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": { @@ -43917,8 +46767,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-super-120b-a12b": { @@ -43941,8 +46796,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-ultra-550b-a55b": { @@ -43965,8 +46825,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3.5-content-safety": { @@ -44274,8 +47139,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/riva-translate-4b-instruct": { @@ -44355,8 +47225,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-20b": { @@ -44379,8 +47254,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen/qwen2.5-coder-32b-instruct": { @@ -44441,8 +47321,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-coder-480b-a35b-instruct": { @@ -44503,8 +47387,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-122b-a10b": { @@ -44528,8 +47416,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-397b-a17b": { @@ -44553,8 +47445,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "sarvamai/sarvam-m": { @@ -44615,8 +47511,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun-ai/step-3.7-flash": { @@ -44640,8 +47541,13 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stockmark/stockmark-2-100b-instruct": { @@ -44797,8 +47703,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm4.7": { @@ -44821,8 +47732,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm5": { @@ -44845,8 +47761,13 @@ "maxTokens": 131000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zyphra/zamba2-7b-instruct": { @@ -44891,8 +47812,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-oss:120b": { @@ -44916,8 +47841,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-oss:20b": { @@ -44940,8 +47869,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3-next:80b": { @@ -44964,8 +47897,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -44990,8 +47927,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-4": { @@ -45214,8 +48156,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45261,8 +48207,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45287,8 +48237,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45313,8 +48267,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45339,8 +48297,12 @@ "maxTokens": 272000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45365,8 +48327,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45391,8 +48357,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45417,8 +48387,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45443,8 +48417,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45469,8 +48447,10 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -45495,8 +48475,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45521,8 +48505,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45547,8 +48535,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45573,8 +48565,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45620,8 +48616,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45646,8 +48646,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform", "contextPromotionTarget": "openai/gpt-5.5" @@ -45673,8 +48677,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45699,8 +48707,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45725,8 +48737,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45751,8 +48767,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -45777,8 +48797,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform", "contextPromotionTarget": "openai/gpt-5.4" @@ -45804,8 +48828,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform", "contextPromotionTarget": "openai/gpt-5.4" @@ -45831,8 +48859,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o1-pro": { @@ -45856,8 +48889,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o3": { @@ -45881,8 +48919,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o3-deep-research": { @@ -45906,8 +48949,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o3-mini": { @@ -45930,8 +48978,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o3-pro": { @@ -45955,8 +49008,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o4-mini": { @@ -45980,8 +49038,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "o4-mini-deep-research": { @@ -46005,8 +49068,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -46034,8 +49102,13 @@ "priority": 43, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5": { @@ -46061,8 +49134,12 @@ "priority": 16, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46089,8 +49166,12 @@ "priority": 15, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46117,8 +49198,12 @@ "priority": 20, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46145,8 +49230,12 @@ "priority": 12, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46173,8 +49262,12 @@ "priority": 11, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46201,8 +49294,12 @@ "priority": 10, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46229,8 +49326,10 @@ "priority": 19, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] }, "applyPatchToolType": "freeform" }, @@ -46257,8 +49356,12 @@ "priority": 29, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46285,8 +49388,12 @@ "priority": 8, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46313,8 +49420,12 @@ "priority": 25, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46340,8 +49451,12 @@ "contextPromotionTarget": "openai-codex/gpt-5.5", "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46368,8 +49483,12 @@ "priority": 0, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46396,8 +49515,12 @@ "priority": 1, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46424,8 +49547,12 @@ "priority": 2, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform" }, @@ -46452,8 +49579,12 @@ "priority": 9, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "applyPatchToolType": "freeform", "contextPromotionTarget": "openai-codex/gpt-5.4" @@ -46480,8 +49611,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.3-codex-spark": { @@ -46504,8 +49640,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4": { @@ -46529,8 +49669,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-pro": { @@ -46554,8 +49698,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.5-free": { @@ -46579,8 +49727,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -46605,8 +49758,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] }, "compat": { "supportsToolChoice": false, @@ -46634,8 +49792,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] }, "compat": { "supportsToolChoice": false, @@ -46663,8 +49826,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5.1": { @@ -46687,8 +49855,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.5": { @@ -46712,8 +49885,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.6": { @@ -46737,8 +49915,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2-omni": { @@ -46762,8 +49945,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2-pro": { @@ -46786,8 +49974,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2.5": { @@ -46811,8 +50004,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2.5-pro": { @@ -46835,8 +50033,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.5": { @@ -46859,8 +50062,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.7": { @@ -46883,8 +50091,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m3": { @@ -46908,8 +50121,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen3.5-plus": { @@ -46933,8 +50151,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.6-plus": { @@ -46958,8 +50180,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3.7-max": { @@ -46982,8 +50208,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen3.7-plus": { @@ -47007,8 +50238,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -47033,8 +50269,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-3-5-haiku": { @@ -47078,8 +50319,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-haiku-4-5": { @@ -47103,8 +50357,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-1": { @@ -47128,8 +50387,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5": { @@ -47153,8 +50417,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-6": { @@ -47178,8 +50447,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "claude-opus-4-7": { @@ -47203,8 +50481,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-opus-4-8": { @@ -47228,8 +50519,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "claude-sonnet-4": { @@ -47253,8 +50557,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5": { @@ -47278,8 +50587,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-6": { @@ -47303,8 +50617,16 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "deepseek-v4-flash": { @@ -47327,8 +50649,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v4-flash-free": { @@ -47351,8 +50678,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gemini-3-flash": { @@ -47376,8 +50708,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro": { @@ -47401,9 +50737,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -47430,9 +50764,7 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -47459,8 +50791,12 @@ "maxTokens": 65536, "thinking": { "mode": "google-level", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "glm-4.6": { @@ -47483,8 +50819,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.7": { @@ -47507,8 +50848,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5": { @@ -47531,8 +50877,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5.1": { @@ -47555,8 +50906,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5": { @@ -47580,8 +50936,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-codex": { @@ -47605,8 +50965,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5-nano": { @@ -47630,8 +50994,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1": { @@ -47655,8 +51023,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex": { @@ -47680,8 +51052,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-max": { @@ -47705,8 +51081,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gpt-5.1-codex-mini": { @@ -47730,8 +51110,10 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "gpt-5.2": { @@ -47755,8 +51137,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.2-codex": { @@ -47780,8 +51166,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.3-codex": { @@ -47805,8 +51195,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.3-codex-spark": { @@ -47829,8 +51223,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "contextPromotionTarget": "opencode-zen/gpt-5.5" }, @@ -47855,8 +51253,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-mini": { @@ -47880,8 +51282,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-nano": { @@ -47905,8 +51311,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.4-pro": { @@ -47930,8 +51340,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "gpt-5.5": { @@ -47955,8 +51369,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "contextPromotionTarget": "opencode-zen/gpt-5.4" }, @@ -47981,8 +51399,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] }, "contextPromotionTarget": "opencode-zen/gpt-5.4" }, @@ -48007,8 +51429,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "hy3-preview-free": { @@ -48031,8 +51458,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2": { @@ -48074,8 +51506,13 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.5": { @@ -48099,8 +51536,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2.6": { @@ -48124,8 +51566,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "ling-2.6-flash-free": { @@ -48167,8 +51614,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2-omni-free": { @@ -48192,8 +51644,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2-pro-free": { @@ -48216,8 +51673,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mimo-v2.5-free": { @@ -48241,8 +51703,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.1": { @@ -48265,8 +51732,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.5": { @@ -48289,8 +51761,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.5-free": { @@ -48313,8 +51790,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m2.7": { @@ -48337,8 +51819,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m3-free": { @@ -48362,8 +51849,13 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nemotron-3-super-free": { @@ -48386,8 +51878,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nemotron-3-ultra-free": { @@ -48410,8 +51907,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "north-mini-code-free": { @@ -48434,8 +51936,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen3.5-plus": { @@ -48459,8 +51966,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen3.6-plus": { @@ -48484,8 +51996,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "qwen3.6-plus-free": { @@ -48508,8 +52025,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "ring-2.6-1t-free": { @@ -48532,8 +52053,13 @@ "maxTokens": 66000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "trinity-large-preview-free": { @@ -48578,8 +52104,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~anthropic/claude-haiku-latest": { @@ -48603,8 +52133,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~anthropic/claude-opus-latest": { @@ -48628,8 +52162,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~anthropic/claude-sonnet-latest": { @@ -48653,8 +52191,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~google/gemini-flash-latest": { @@ -48678,8 +52220,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~google/gemini-pro-latest": { @@ -48703,8 +52249,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~moonshotai/kimi-latest": { @@ -48728,8 +52278,12 @@ "maxTokens": 262142, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~openai/gpt-latest": { @@ -48753,8 +52307,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "~openai/gpt-mini-latest": { @@ -48778,8 +52336,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "ai21/jamba-large-1.7": { @@ -48821,8 +52383,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "allenai/olmo-3.1-32b-instruct": { @@ -48865,8 +52431,12 @@ "maxTokens": 65535, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "amazon/nova-lite-v1": { @@ -49041,8 +52611,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-3.7-sonnet:thinking": { @@ -49066,8 +52640,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-fable-5": { @@ -49091,8 +52669,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-haiku-4.5": { @@ -49136,8 +52719,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-opus-4.1": { @@ -49161,8 +52748,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-opus-4.5": { @@ -49186,8 +52777,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-opus-4.6": { @@ -49211,8 +52806,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.6-fast": { @@ -49236,8 +52836,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.7": { @@ -49261,8 +52866,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.7-fast": { @@ -49286,8 +52896,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.8": { @@ -49311,8 +52926,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.8-fast": { @@ -49336,8 +52956,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4": { @@ -49361,8 +52986,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-sonnet-4.5": { @@ -49386,8 +53015,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "anthropic/claude-sonnet-4.6": { @@ -49411,8 +53044,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "arcee-ai/trinity-large-preview": { @@ -49479,8 +53116,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "arcee-ai/trinity-large-thinking:free": { @@ -49503,8 +53144,12 @@ "maxTokens": 80000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "arcee-ai/trinity-mini": { @@ -49527,8 +53172,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "arcee-ai/trinity-mini:free": { @@ -49551,8 +53200,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "arcee-ai/virtuoso-large": { @@ -49595,8 +53248,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "baidu/cobuddy:free": { @@ -49622,8 +53279,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "baidu/ernie-4.5-21b-a3b": { @@ -49666,8 +53327,12 @@ "maxTokens": 8000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "bytedance-seed/seed-1.6": { @@ -49691,8 +53356,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "bytedance-seed/seed-1.6-flash": { @@ -49716,8 +53385,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "bytedance-seed/seed-2.0-lite": { @@ -49741,8 +53414,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "bytedance-seed/seed-2.0-mini": { @@ -49766,8 +53443,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "cohere/command-r-08-2024": { @@ -49847,8 +53528,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-chat-v3.1": { @@ -49871,8 +53556,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-r1": { @@ -49895,8 +53584,12 @@ "maxTokens": 16000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-r1-0528": { @@ -49919,8 +53612,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v3.1-terminus": { @@ -49943,8 +53640,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v3.1-terminus:exacto": { @@ -49967,8 +53668,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v3.2": { @@ -49991,8 +53696,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v3.2-exp": { @@ -50015,8 +53724,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v4-flash": { @@ -50039,8 +53752,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v4-flash:free": { @@ -50063,8 +53780,12 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "deepseek/deepseek-v4-pro": { @@ -50087,8 +53808,12 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "essentialai/rnj-1-instruct": { @@ -50171,8 +53896,12 @@ "maxTokens": 65535, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-flash-lite": { @@ -50216,8 +53945,12 @@ "maxTokens": 65535, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-flash-preview-09-2025": { @@ -50241,8 +53974,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-pro": { @@ -50266,8 +54003,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-pro-preview": { @@ -50291,8 +54032,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-pro-preview-05-06": { @@ -50316,8 +54061,12 @@ "maxTokens": 65535, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-flash-preview": { @@ -50341,8 +54090,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-pro-preview": { @@ -50366,9 +54119,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -50395,8 +54146,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.1-flash-lite-preview": { @@ -50440,9 +54195,7 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -50469,9 +54222,7 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -50498,8 +54249,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-3-12b-it": { @@ -50543,8 +54298,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-3-27b-it:free": { @@ -50588,8 +54347,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-4-26b-a4b-it:free": { @@ -50613,8 +54376,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-4-31b-it": { @@ -50638,8 +54405,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-4-31b-it:free": { @@ -50663,8 +54434,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "ibm-granite/granite-4.1-8b": { @@ -50725,8 +54500,12 @@ "maxTokens": 50000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "inception/mercury-coder": { @@ -50844,8 +54623,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "inclusionai/ring-2.6-1t:free": { @@ -50868,8 +54651,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "kwaipilot/kat-coder-pro": { @@ -51103,8 +54890,12 @@ "maxTokens": 40000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-m2": { @@ -51127,8 +54918,12 @@ "maxTokens": 196608, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-m2.1": { @@ -51151,8 +54946,12 @@ "maxTokens": 196608, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-m2.5": { @@ -51175,8 +54974,12 @@ "maxTokens": 196608, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-m2.5:free": { @@ -51202,8 +55005,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-m2.7": { @@ -51226,8 +55033,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "minimax/minimax-m3": { @@ -51251,8 +55062,12 @@ "maxTokens": 512000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mistralai/codestral-2508": { @@ -51509,8 +55324,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mistralai/mistral-medium-3.1": { @@ -51611,8 +55430,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mistralai/mistral-small-3.1-24b-instruct": { @@ -51848,8 +55671,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "moonshotai/kimi-k2.5": { @@ -51873,8 +55700,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "moonshotai/kimi-k2.6": { @@ -51898,8 +55729,12 @@ "maxTokens": 262142, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "moonshotai/kimi-k2.6:free": { @@ -51923,8 +55758,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nex-agi/deepseek-v3.1-nex-n1": { @@ -51967,8 +55806,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nousresearch/deephermes-3-mistral-24b-preview": { @@ -51991,8 +55834,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nousresearch/hermes-4-70b": { @@ -52015,8 +55862,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/llama-3.1-nemotron-70b-instruct": { @@ -52058,8 +55909,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-nano-30b-a3b": { @@ -52082,8 +55937,12 @@ "maxTokens": 228000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-nano-30b-a3b:free": { @@ -52106,8 +55965,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { @@ -52131,8 +55994,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-super-120b-a12b": { @@ -52155,8 +56022,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-super-120b-a12b:free": { @@ -52179,8 +56050,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-ultra-550b-a55b": { @@ -52203,8 +56078,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-3-ultra-550b-a55b:free": { @@ -52227,8 +56106,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-nano-12b-v2-vl:free": { @@ -52252,8 +56135,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-nano-9b-v2": { @@ -52276,8 +56163,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "nvidia/nemotron-nano-9b-v2:free": { @@ -52300,8 +56191,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-3.5-turbo": { @@ -52697,8 +56592,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-codex": { @@ -52722,8 +56621,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-image": { @@ -52747,8 +56650,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-image-mini": { @@ -52772,8 +56679,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-mini": { @@ -52797,8 +56708,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-nano": { @@ -52822,8 +56737,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-pro": { @@ -52847,8 +56766,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1": { @@ -52872,8 +56795,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-chat": { @@ -52917,8 +56844,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-max": { @@ -52942,8 +56873,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-mini": { @@ -52967,8 +56902,10 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "openai/gpt-5.2": { @@ -52992,8 +56929,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-chat": { @@ -53037,8 +56978,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-pro": { @@ -53062,8 +57007,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.3-chat": { @@ -53106,8 +57055,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4": { @@ -53131,8 +57084,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4-mini": { @@ -53194,8 +57151,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5": { @@ -53219,8 +57180,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5-pro": { @@ -53244,8 +57209,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-audio": { @@ -53326,8 +57295,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-oss-120b:exacto": { @@ -53350,8 +57323,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-oss-120b:free": { @@ -53374,8 +57351,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-oss-20b": { @@ -53398,8 +57379,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-oss-20b:free": { @@ -53422,8 +57407,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-oss-safeguard-20b": { @@ -53446,8 +57435,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o1": { @@ -53471,8 +57464,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o3": { @@ -53496,8 +57493,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o3-deep-research": { @@ -53521,8 +57522,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o3-mini": { @@ -53545,8 +57550,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o3-mini-high": { @@ -53569,8 +57578,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o3-pro": { @@ -53594,8 +57607,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o4-mini": { @@ -53619,8 +57636,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o4-mini-deep-research": { @@ -53644,8 +57665,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/o4-mini-high": { @@ -53669,8 +57694,12 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openrouter/aurora-alpha": { @@ -53693,8 +57722,12 @@ "maxTokens": 50000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openrouter/auto": { @@ -53718,8 +57751,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openrouter/elephant-alpha": { @@ -53762,8 +57799,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openrouter/healer-alpha": { @@ -53787,8 +57828,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openrouter/hunter-alpha": { @@ -53811,8 +57856,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openrouter/owl-alpha": { @@ -53857,8 +57906,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "poolside/laguna-xs.2:free": { @@ -53881,8 +57934,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "prime-intellect/intellect-3": { @@ -53905,8 +57962,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen-2.5-72b-instruct": { @@ -54024,8 +58085,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen-turbo": { @@ -54087,8 +58152,12 @@ "maxTokens": 40960, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-235b-a22b": { @@ -54111,8 +58180,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-235b-a22b-2507": { @@ -54135,8 +58208,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-235b-a22b-thinking-2507": { @@ -54159,8 +58236,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-30b-a3b": { @@ -54183,8 +58264,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-30b-a3b-instruct-2507": { @@ -54226,8 +58311,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-32b": { @@ -54250,8 +58339,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-4b": { @@ -54274,8 +58367,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-4b:free": { @@ -54298,8 +58395,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-8b": { @@ -54322,8 +58423,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-coder": { @@ -54479,8 +58584,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-max-thinking": { @@ -54503,8 +58612,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-next-80b-a3b-instruct": { @@ -54565,8 +58678,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-vl-235b-a22b-instruct": { @@ -54610,8 +58727,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-vl-30b-a3b-instruct": { @@ -54655,8 +58776,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-vl-32b-instruct": { @@ -54720,8 +58845,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-122b-a10b": { @@ -54745,8 +58874,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-27b": { @@ -54770,8 +58903,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-35b-a3b": { @@ -54795,8 +58932,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-397b-a17b": { @@ -54820,8 +58961,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-9b": { @@ -54845,8 +58990,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-flash-02-23": { @@ -54870,8 +59019,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-plus-02-15": { @@ -54895,8 +59048,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-plus-20260420": { @@ -54920,8 +59077,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-27b": { @@ -54945,8 +59106,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-35b-a3b": { @@ -54970,8 +59135,12 @@ "maxTokens": 262140, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-flash": { @@ -54995,8 +59164,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-max-preview": { @@ -55019,8 +59192,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-plus": { @@ -55043,8 +59220,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-plus-preview:free": { @@ -55067,8 +59248,12 @@ "maxTokens": 32000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-plus:free": { @@ -55092,8 +59277,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.7-max": { @@ -55116,8 +59305,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.7-plus": { @@ -55141,8 +59334,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwq-32b": { @@ -55165,8 +59362,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "reka/reka-edge": { @@ -55311,8 +59512,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "stepfun/step-3.7-flash": { @@ -55339,8 +59544,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "tencent/hy3-preview": { @@ -55363,8 +59572,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "tencent/hy3-preview:free": { @@ -55387,8 +59600,12 @@ "maxTokens": 262144, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "thedrummer/rocinante-12b": { @@ -55449,8 +59666,12 @@ "maxTokens": 163840, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "tngtech/tng-r1t-chimera": { @@ -55473,8 +59694,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "upstage/solar-pro-3": { @@ -55497,8 +59722,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "upstage/solar-pro-3:free": { @@ -55521,8 +59750,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-3": { @@ -55583,8 +59816,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-3-mini-beta": { @@ -55607,8 +59844,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-4": { @@ -55632,8 +59873,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-4-fast": { @@ -55657,8 +59902,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-4.1-fast": { @@ -55682,8 +59931,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-4.20": { @@ -55707,8 +59960,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-4.20-beta": { @@ -55732,8 +59989,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-4.3": { @@ -55757,8 +60018,12 @@ "maxTokens": 1000000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-build-0.1": { @@ -55782,8 +60047,12 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "x-ai/grok-code-fast-1": { @@ -55806,8 +60075,12 @@ "maxTokens": 10000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "xiaomi/mimo-v2-flash": { @@ -55830,8 +60103,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "xiaomi/mimo-v2-omni": { @@ -55855,8 +60132,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "xiaomi/mimo-v2-pro": { @@ -55879,8 +60160,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "xiaomi/mimo-v2.5": { @@ -55904,8 +60189,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "xiaomi/mimo-v2.5-pro": { @@ -55928,8 +60217,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4-32b": { @@ -55971,8 +60264,12 @@ "maxTokens": 98304, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.5-air": { @@ -55995,8 +60292,12 @@ "maxTokens": 131070, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.5-air:free": { @@ -56019,8 +60320,12 @@ "maxTokens": 96000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.5v": { @@ -56044,8 +60349,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.6": { @@ -56068,8 +60377,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.6:exacto": { @@ -56092,8 +60405,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.6v": { @@ -56117,8 +60434,12 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.7": { @@ -56141,8 +60462,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-4.7-flash": { @@ -56165,8 +60490,12 @@ "maxTokens": 16384, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-5": { @@ -56189,8 +60518,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-5-turbo": { @@ -56213,8 +60546,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-5.1": { @@ -56237,8 +60574,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "z-ai/glm-5v-turbo": { @@ -56262,8 +60603,12 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -56846,8 +61191,13 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-ai/DeepSeek-V3.1": { @@ -56968,8 +61318,13 @@ "maxTokens": 32768, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org/GLM-4.7": { @@ -57083,8 +61438,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-5": { @@ -57111,8 +61471,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-6": { @@ -57139,8 +61504,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-6-fast": { @@ -57189,8 +61559,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-7-fast": { @@ -57239,8 +61614,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-opus-4-8-fast": { @@ -57289,8 +61669,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-5": { @@ -57317,8 +61702,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-4-6": { @@ -57345,8 +61735,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "claude-sonnet-45": { @@ -57373,8 +61768,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v3.2": { @@ -57400,8 +61800,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v4-flash": { @@ -57427,8 +61832,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v4-pro": { @@ -57454,8 +61864,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "e2ee-gemma-3-27b-p": { @@ -57878,8 +62293,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "gemini-3-pro-preview": { @@ -57906,9 +62325,7 @@ }, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -58181,8 +62598,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "grok-build-0-1": { @@ -58230,8 +62652,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "hermes-3-llama-3.1-405b": { @@ -58280,8 +62707,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kimi-k2-6": { @@ -58329,8 +62761,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "llama-3.2-3b": { @@ -58422,8 +62859,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m25": { @@ -58449,8 +62891,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax-m27": { @@ -58499,8 +62946,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral-31-24b": { @@ -58550,8 +63002,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral-small-3-2-24b-instruct": { @@ -58665,8 +63122,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai-gpt-4o-2024-11-20": { @@ -58736,8 +63198,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai-gpt-52-codex": { @@ -58764,8 +63231,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai-gpt-53-codex": { @@ -59033,8 +63505,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3-4b": { @@ -59060,8 +63536,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen3-5-35b-a3b": { @@ -59418,8 +63898,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org-glm-4.7-flash": { @@ -59445,8 +63930,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org-glm-5": { @@ -59472,8 +63962,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai-org-glm-5-1": { @@ -59520,8 +64015,13 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen-3-235b": { @@ -59544,8 +64044,13 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen-3-30b": { @@ -59568,8 +64073,13 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen-3-32b": { @@ -59592,8 +64102,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen-3.6-max-preview": { @@ -59617,8 +64132,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-235b-a22b-thinking": { @@ -59642,8 +64162,13 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-coder": { @@ -59666,8 +64191,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-coder-30b-a3b": { @@ -59690,8 +64220,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-coder-next": { @@ -59714,8 +64249,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-coder-plus": { @@ -59795,8 +64335,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-next-80b-a3b-instruct": { @@ -59838,8 +64383,13 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3-vl-thinking": { @@ -59863,8 +64413,13 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3.5-flash": { @@ -59888,8 +64443,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3.5-plus": { @@ -59913,8 +64473,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3.6-27b": { @@ -59938,8 +64503,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3.6-plus": { @@ -59963,8 +64533,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3.7-max": { @@ -59988,8 +64563,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "alibaba/qwen3.7-plus": { @@ -60013,8 +64593,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-3-haiku": { @@ -60118,8 +64703,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-fable-5": { @@ -60143,8 +64733,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-haiku-4.5": { @@ -60188,8 +64791,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.1": { @@ -60213,8 +64821,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.5": { @@ -60238,8 +64851,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.6": { @@ -60263,8 +64881,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "anthropic/claude-opus-4.7": { @@ -60288,8 +64915,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-opus-4.8": { @@ -60313,8 +64953,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-sonnet-4": { @@ -60338,8 +64991,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4.5": { @@ -60363,8 +65021,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4.6": { @@ -60388,8 +65051,16 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "arcee-ai/trinity-large-preview": { @@ -60431,8 +65102,13 @@ "maxTokens": 80000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/seed-1.6": { @@ -60455,8 +65131,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "cohere/command-a": { @@ -60498,8 +65179,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3": { @@ -60541,8 +65227,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.1-terminus": { @@ -60565,8 +65256,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2": { @@ -60589,8 +65285,13 @@ "maxTokens": 8000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2-thinking": { @@ -60614,8 +65315,13 @@ "maxTokens": 8000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-flash": { @@ -60638,8 +65344,13 @@ "maxTokens": 384000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-pro": { @@ -60662,8 +65373,13 @@ "maxTokens": 384000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/gemini-2.0-flash": { @@ -60727,8 +65443,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-flash-lite": { @@ -60772,8 +65492,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-flash-preview-09-2025": { @@ -60797,8 +65521,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-pro": { @@ -60822,8 +65550,12 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-flash": { @@ -60847,8 +65579,12 @@ "maxTokens": 65000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-pro-preview": { @@ -60872,9 +65608,7 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -60901,8 +65635,12 @@ "maxTokens": 65000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.1-flash-lite-preview": { @@ -60946,9 +65684,7 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -60975,8 +65711,12 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-4-26b-a4b-it": { @@ -61000,8 +65740,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/gemma-4-31b-it": { @@ -61025,8 +65770,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "inception/mercury-2": { @@ -61049,8 +65799,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "inception/mercury-coder-small": { @@ -61092,8 +65847,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "meituan/longcat-flash-chat": { @@ -61135,8 +65895,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "meta/llama-3.1-70b": { @@ -61296,8 +66061,13 @@ "maxTokens": 205000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.1": { @@ -61320,8 +66090,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.1-lightning": { @@ -61344,8 +66119,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5": { @@ -61368,8 +66148,13 @@ "maxTokens": 131000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5-highspeed": { @@ -61393,8 +66178,13 @@ "maxTokens": 131000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.7": { @@ -61417,8 +66207,13 @@ "maxTokens": 131000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.7-highspeed": { @@ -61441,8 +66236,13 @@ "maxTokens": 131100, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m3": { @@ -61466,8 +66266,13 @@ "maxTokens": 1000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral/codestral": { @@ -61624,8 +66429,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistral/mistral-nemo": { @@ -61765,8 +66575,13 @@ "maxTokens": 262114, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2-thinking-turbo": { @@ -61789,8 +66604,13 @@ "maxTokens": 262114, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2-turbo": { @@ -61833,8 +66653,13 @@ "maxTokens": 262114, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.6": { @@ -61858,8 +66683,13 @@ "maxTokens": 262000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-super-120b-a12b": { @@ -61882,8 +66712,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-3-ultra-550b-a55b": { @@ -61906,8 +66741,13 @@ "maxTokens": 65000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-nano-12b-v2-vl": { @@ -61931,8 +66771,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "nvidia/nemotron-nano-9b-v2": { @@ -61955,8 +66800,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/codex-mini": { @@ -61980,8 +66830,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-4-turbo": { @@ -62125,8 +66980,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-chat": { @@ -62150,8 +67009,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-codex": { @@ -62175,8 +67038,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-mini": { @@ -62200,8 +67067,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-nano": { @@ -62225,8 +67096,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-pro": { @@ -62250,8 +67125,12 @@ "maxTokens": 272000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex": { @@ -62275,8 +67154,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-max": { @@ -62300,8 +67183,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-mini": { @@ -62325,8 +67212,10 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "openai/gpt-5.1-instant": { @@ -62350,8 +67239,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-thinking": { @@ -62375,8 +67268,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.2": { @@ -62400,8 +67297,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-chat": { @@ -62425,8 +67326,12 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-codex": { @@ -62450,8 +67355,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-pro": { @@ -62475,8 +67384,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.3-chat": { @@ -62519,8 +67432,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4": { @@ -62544,8 +67461,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4-mini": { @@ -62607,8 +67528,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5": { @@ -62632,8 +67557,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5-pro": { @@ -62657,8 +67586,12 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-120b": { @@ -62681,8 +67614,13 @@ "maxTokens": 131000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-20b": { @@ -62705,8 +67643,13 @@ "maxTokens": 8192, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-oss-safeguard-20b": { @@ -62729,8 +67672,13 @@ "maxTokens": 65536, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o1": { @@ -62754,8 +67702,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3": { @@ -62779,8 +67732,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-deep-research": { @@ -62804,8 +67762,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-mini": { @@ -62828,8 +67791,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o3-pro": { @@ -62853,8 +67821,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/o4-mini": { @@ -62878,8 +67851,13 @@ "maxTokens": 100000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "perplexity/sonar": { @@ -62942,8 +67920,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun/step-3.5-flash": { @@ -62986,8 +67969,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "vercel/v0-1.0-md": { @@ -63147,8 +68135,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4-fast-non-reasoning": { @@ -63192,8 +68185,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4.1-fast-non-reasoning": { @@ -63237,8 +68235,13 @@ "maxTokens": 1000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4.20-multi-agent": { @@ -63262,8 +68265,13 @@ "maxTokens": 2000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4.20-multi-agent-beta": { @@ -63287,8 +68295,13 @@ "maxTokens": 2000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4.20-non-reasoning": { @@ -63352,8 +68365,13 @@ "maxTokens": 2000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4.20-reasoning-beta": { @@ -63377,8 +68395,13 @@ "maxTokens": 2000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-4.3": { @@ -63402,8 +68425,13 @@ "maxTokens": 1000000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-build-0.1": { @@ -63427,8 +68455,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xai/grok-code-fast-1": { @@ -63451,8 +68484,13 @@ "maxTokens": 256000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-flash": { @@ -63475,8 +68513,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-pro": { @@ -63499,8 +68542,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5": { @@ -63524,8 +68572,13 @@ "maxTokens": 131100, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5-pro": { @@ -63548,8 +68601,13 @@ "maxTokens": 131000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.5": { @@ -63572,8 +68630,13 @@ "maxTokens": 96000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.5-air": { @@ -63596,8 +68659,13 @@ "maxTokens": 96000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.5v": { @@ -63621,8 +68689,13 @@ "maxTokens": 16000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.6": { @@ -63645,8 +68718,13 @@ "maxTokens": 96000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.6v": { @@ -63670,8 +68748,13 @@ "maxTokens": 24000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.6v-flash": { @@ -63695,8 +68778,13 @@ "maxTokens": 24000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.7": { @@ -63719,8 +68807,13 @@ "maxTokens": 40000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.7-flash": { @@ -63743,8 +68836,13 @@ "maxTokens": 131000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-4.7-flashx": { @@ -63767,8 +68865,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-5": { @@ -63791,8 +68894,13 @@ "maxTokens": 131100, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-5-turbo": { @@ -63815,8 +68923,13 @@ "maxTokens": 131100, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-5.1": { @@ -63840,8 +68953,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "zai/glm-5v-turbo": { @@ -63865,8 +68983,13 @@ "maxTokens": 128000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -63896,8 +69019,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen3.5-397B-A17B": { @@ -63949,8 +69076,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek-v4-pro": { @@ -63977,8 +69109,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "GLM-5.1": { @@ -64006,8 +69143,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Kimi-K2.6": { @@ -64036,8 +69177,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "Qwen3.5-397B-A17B": { @@ -64110,8 +69255,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -64329,8 +69478,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-3-mini-fast": { @@ -64353,8 +69506,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-3-mini-fast-latest": { @@ -64377,8 +69534,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-3-mini-latest": { @@ -64401,8 +69562,12 @@ "maxTokens": 8192, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4": { @@ -64425,8 +69590,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4-1-fast": { @@ -64450,8 +69619,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4-1-fast-non-reasoning": { @@ -64495,8 +69668,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4-fast-non-reasoning": { @@ -64560,8 +69737,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4.20-beta-latest-non-reasoning": { @@ -64605,8 +69786,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4.20-multi-agent-beta-latest": { @@ -64630,8 +69815,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-4.3": { @@ -64655,8 +69844,12 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-beta": { @@ -64699,8 +69892,12 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-code-fast-1": { @@ -64723,8 +69920,12 @@ "maxTokens": 10000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "grok-vision-beta": { @@ -64798,11 +69999,6 @@ "minimal": "low" }, "supportsReasoningEffort": false - }, - "thinking": { - "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" } }, "grok-4.20-multi-agent-0309": { @@ -64830,8 +70026,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "grok-4.3": { @@ -64860,8 +70061,13 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "grok-build": { @@ -64887,11 +70093,6 @@ "minimal": "low" }, "supportsReasoningEffort": false - }, - "thinking": { - "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" } } }, @@ -64923,8 +70124,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mimo-v2-omni": { @@ -64955,8 +70160,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mimo-v2-pro": { @@ -64986,8 +70195,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mimo-v2.5": { @@ -65018,8 +70231,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mimo-v2.5-pro": { @@ -65049,8 +70266,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "mimo-v2.5-pro-ultraspeed": { @@ -65080,8 +70301,12 @@ }, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } } }, @@ -65106,8 +70331,13 @@ "maxTokens": 98304, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.5-air": { @@ -65130,8 +70360,13 @@ "maxTokens": 98304, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.5-flash": { @@ -65154,8 +70389,13 @@ "maxTokens": 98304, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.5v": { @@ -65179,8 +70419,13 @@ "maxTokens": 16384, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.6": { @@ -65203,8 +70448,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.6v": { @@ -65228,8 +70478,13 @@ "maxTokens": 32768, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.7": { @@ -65252,8 +70507,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.7-flash": { @@ -65276,8 +70536,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-4.7-flashx": { @@ -65300,8 +70565,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5": { @@ -65324,8 +70594,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5-turbo": { @@ -65348,8 +70623,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5.1": { @@ -65372,8 +70652,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "glm-5v-turbo": { @@ -65397,8 +70682,13 @@ "maxTokens": 131072, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } }, @@ -65464,8 +70754,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-fable-5": { @@ -65489,8 +70784,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-haiku-4.5": { @@ -65534,8 +70842,13 @@ "maxTokens": 32000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.1": { @@ -65559,8 +70872,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.5": { @@ -65584,8 +70902,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-opus-4.6": { @@ -65609,8 +70932,17 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "anthropic/claude-opus-4.7": { @@ -65634,8 +70966,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-opus-4.8": { @@ -65659,8 +71004,21 @@ "maxTokens": 128000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "effortMap": { + "minimal": "low", + "low": "medium", + "medium": "high", + "high": "xhigh", + "xhigh": "max" + }, + "supportsDisplay": true } }, "anthropic/claude-sonnet-4": { @@ -65684,8 +71042,13 @@ "maxTokens": 64000, "thinking": { "mode": "budget", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4.5": { @@ -65709,8 +71072,13 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-budget-effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "anthropic/claude-sonnet-4.6": { @@ -65734,8 +71102,16 @@ "maxTokens": 64000, "thinking": { "mode": "anthropic-adaptive", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ], + "effortMap": { + "minimal": "low", + "xhigh": "max" + } } }, "baidu/ernie-5.0-thinking-preview": { @@ -65759,8 +71135,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "baidu/ernie-5.1": { @@ -65783,8 +71164,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "baidu/ernie-x1.1-preview": { @@ -65807,8 +71193,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/doubao-seed-1.8": { @@ -65832,8 +71223,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/doubao-seed-2.0-code": { @@ -65857,8 +71253,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/doubao-seed-2.0-lite": { @@ -65882,8 +71283,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/doubao-seed-2.0-mini": { @@ -65907,8 +71313,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/doubao-seed-2.0-pro": { @@ -65932,8 +71343,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "bytedance/doubao-seed-code": { @@ -65957,8 +71373,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-chat": { @@ -66019,8 +71440,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-reasoner": { @@ -66043,8 +71469,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2": { @@ -66067,8 +71498,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v3.2-exp": { @@ -66091,8 +71527,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-flash": { @@ -66115,8 +71556,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-flash-free": { @@ -66139,8 +71585,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-pro": { @@ -66163,8 +71614,13 @@ "maxTokens": 384000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "deepseek/deepseek-v4-pro-free": { @@ -66187,8 +71643,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "google/gemini-2.0-flash": { @@ -66252,8 +71713,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-2.5-flash-lite": { @@ -66297,8 +71762,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-flash-preview": { @@ -66322,8 +71791,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3-pro-image-preview": { @@ -66347,9 +71820,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -66376,9 +71847,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -66405,8 +71874,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.1-flash-lite-preview": { @@ -66450,9 +71923,7 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "high", - "levels": [ + "efforts": [ "low", "high" ] @@ -66479,8 +71950,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemini-3.5-flash-free": { @@ -66504,8 +71979,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "google/gemma-3-12b-it": { @@ -66701,8 +72180,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "inclusionai/ring-2.6-1t": { @@ -66725,8 +72209,13 @@ "maxTokens": 65000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "inclusionai/ring-flash-2.0": { @@ -66749,8 +72238,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "inclusionai/ring-mini-2.0": { @@ -66773,8 +72267,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "kuaishou/kat-coder-pro-v1": { @@ -66893,8 +72392,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2-her": { @@ -66936,8 +72440,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5": { @@ -66960,8 +72469,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.5-lightning": { @@ -66984,8 +72498,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.7": { @@ -67008,8 +72527,13 @@ "maxTokens": 131070, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m2.7-highspeed": { @@ -67032,8 +72556,13 @@ "maxTokens": 131070, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "minimax/minimax-m3": { @@ -67057,8 +72586,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "mistralai/mistral-large-2512": { @@ -67139,8 +72673,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2-thinking-turbo": { @@ -67163,8 +72702,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.5": { @@ -67188,8 +72732,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "moonshotai/kimi-k2.6": { @@ -67213,8 +72762,13 @@ "maxTokens": 262140, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/chat-latest": { @@ -67358,8 +72912,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-chat": { @@ -67403,8 +72961,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-mini": { @@ -67428,8 +72990,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-nano": { @@ -67453,8 +73019,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5-pro": { @@ -67478,8 +73048,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1": { @@ -67503,8 +73077,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-chat": { @@ -67548,8 +73126,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "openai/gpt-5.1-codex-mini": { @@ -67573,8 +73155,10 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "medium", - "maxLevel": "high" + "efforts": [ + "medium", + "high" + ] } }, "openai/gpt-5.2": { @@ -67598,8 +73182,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-chat": { @@ -67623,8 +73211,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-codex": { @@ -67648,8 +73240,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.2-pro": { @@ -67673,8 +73269,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.3-chat": { @@ -67716,8 +73316,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4": { @@ -67741,8 +73345,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.4-mini": { @@ -67804,8 +73412,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5": { @@ -67829,8 +73441,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5-instant": { @@ -67854,8 +73470,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-5.5-pro": { @@ -67879,8 +73499,12 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "low", - "maxLevel": "xhigh" + "efforts": [ + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/gpt-image-1.5": { @@ -67944,8 +73568,13 @@ "maxTokens": 100000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "openai/text-embedding-3-large": { @@ -68006,8 +73635,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-235b-a22b-2507": { @@ -68049,8 +73682,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-coder": { @@ -68111,8 +73748,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-max-preview": { @@ -68135,8 +73776,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3-vl-plus": { @@ -68160,8 +73805,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.5-flash": { @@ -68205,8 +73854,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-flash": { @@ -68230,8 +73883,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-max-preview": { @@ -68254,8 +73911,12 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.6-plus": { @@ -68278,8 +73939,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.7-max": { @@ -68302,8 +73967,12 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "qwen/qwen3.7-plus": { @@ -68327,8 +73996,12 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "high" + "efforts": [ + "minimal", + "low", + "medium", + "high" + ] } }, "sapiens-ai/agnes-1.5-flash": { @@ -68352,8 +74025,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "sapiens-ai/agnes-1.5-lite": { @@ -68396,8 +74074,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "sapiens-ai/agnes-2.0-flash": { @@ -68421,8 +74104,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun/step-3": { @@ -68446,8 +74134,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun/step-3.5-flash": { @@ -68489,8 +74182,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "stepfun/step-3.7-flash": { @@ -68514,8 +74212,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "tencent/hunyuan-2.0-thinking": { @@ -68538,8 +74241,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "tencent/hy3-preview": { @@ -68562,8 +74270,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "volcengine/doubao-seed-1-6-vision": { @@ -68587,8 +74300,13 @@ "maxTokens": 8888, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "volcengine/doubao-seed-1.8": { @@ -68612,8 +74330,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "volcengine/doubao-seed-2.0-code": { @@ -68656,8 +74379,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "volcengine/doubao-seed-2.0-mini": { @@ -68681,8 +74409,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "volcengine/doubao-seed-2.0-pro": { @@ -68706,8 +74439,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "volcengine/doubao-seed-code": { @@ -68731,8 +74469,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4": { @@ -68756,8 +74499,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4-fast": { @@ -68781,8 +74529,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4-fast-non-reasoning": { @@ -68826,8 +74579,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.1-fast-non-reasoning": { @@ -68871,8 +74629,13 @@ "maxTokens": 30000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-4.2-fast-non-reasoning": { @@ -68916,8 +74679,13 @@ "maxTokens": 1000000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-build-0.1": { @@ -68941,8 +74709,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "x-ai/grok-code-fast-1": { @@ -68965,8 +74738,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-flash": { @@ -68989,8 +74767,13 @@ "maxTokens": 65536, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-flash-free": { @@ -69013,8 +74796,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-omni": { @@ -69038,8 +74826,13 @@ "maxTokens": 265000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2-pro": { @@ -69062,8 +74855,13 @@ "maxTokens": 256000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5": { @@ -69087,8 +74885,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "xiaomi/mimo-v2.5-pro": { @@ -69111,8 +74914,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.5": { @@ -69135,8 +74943,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.5-air": { @@ -69159,8 +74972,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.6": { @@ -69183,8 +75001,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.6v": { @@ -69208,8 +75031,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.6v-flash": { @@ -69233,8 +75061,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.6v-flash-free": { @@ -69258,8 +75091,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.7": { @@ -69282,8 +75120,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.7-flash-free": { @@ -69306,8 +75149,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-4.7-flashx": { @@ -69330,8 +75178,13 @@ "maxTokens": 64000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5": { @@ -69354,8 +75207,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5-turbo": { @@ -69378,8 +75236,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5.1": { @@ -69402,8 +75265,13 @@ "maxTokens": 131072, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } }, "z-ai/glm-5v-turbo": { @@ -69427,8 +75295,13 @@ "maxTokens": 128000, "thinking": { "mode": "effort", - "minLevel": "minimal", - "maxLevel": "xhigh" + "efforts": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] } } } diff --git a/packages/catalog/src/provider-models/ollama.ts b/packages/catalog/src/provider-models/ollama.ts index bbdb5fa0f..624810deb 100644 --- a/packages/catalog/src/provider-models/ollama.ts +++ b/packages/catalog/src/provider-models/ollama.ts @@ -60,11 +60,7 @@ function getThinkingConfig(capabilities: string[] | undefined): ThinkingConfig | if (!capabilities?.includes("thinking")) { return undefined; } - return { - mode: "effort", - minLevel: Effort.Minimal, - maxLevel: Effort.High, - }; + return { mode: "effort", efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High] }; } async function fetchShowMetadata( baseUrl: string, diff --git a/packages/catalog/src/provider-models/openai-compat.ts b/packages/catalog/src/provider-models/openai-compat.ts index aba4119bd..1c7016d54 100644 --- a/packages/catalog/src/provider-models/openai-compat.ts +++ b/packages/catalog/src/provider-models/openai-compat.ts @@ -151,9 +151,8 @@ function buildAnthropicReferenceMap( * Seeded into model generation so the bundled catalog is never gated on * models.dev's update cadence; deduped behind upstream catalog / models.dev * entries once those appear. Token limits and pricing are pinned - * authoritatively in - * `applyAnthropicCatalogPolicy`, and `thinking` is derived by - * `refreshModelThinking` during generation. + * authoritatively in `applyAnthropicCatalogPolicy`, and `thinking` is re-baked + * by the generator's policy pass (scripts/generated-policies.ts). */ export const ANTHROPIC_CURATED_FALLBACK_MODELS: readonly ModelSpec<"anthropic-messages">[] = [ { @@ -343,11 +342,7 @@ function getOllamaThinkingConfig(capabilities: string[] | undefined): ThinkingCo if (!capabilities?.includes("thinking")) { return undefined; } - return { - mode: "effort", - minLevel: Effort.Minimal, - maxLevel: Effort.High, - }; + return { mode: "effort", efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High] }; } /** @@ -2076,7 +2071,7 @@ export function moonshotModelManagerOptions( thinking: model.thinking ?? (isKimiK2Reasoning - ? { mode: "effort", minLevel: Effort.Minimal, maxLevel: Effort.High } + ? { mode: "effort", efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High] } : undefined), }; }, diff --git a/packages/catalog/src/types.ts b/packages/catalog/src/types.ts index f841b943e..332fdbb6e 100644 --- a/packages/catalog/src/types.ts +++ b/packages/catalog/src/types.ts @@ -26,20 +26,27 @@ export type ThinkingControlMode = /** Per-model thinking capabilities used to clamp and map user-facing effort levels. */ export interface ThinkingConfig { - /** Least intensive supported user-facing effort level. */ - minLevel: Effort; - /** Most intensive supported user-facing effort level. */ - maxLevel: Effort; - /** - * Optional explicit list of supported levels. When present, takes precedence over - * the `minLevel`..`maxLevel` range — used to encode discrete sets with gaps - * (e.g. Gemini 3 Pro supports `low` and `high` but not `medium`). - */ - levels?: readonly Effort[]; - /** Optional default effort applied when this model is selected. Falls back to global default if absent. */ - defaultLevel?: Effort; /** Provider-specific transport used to encode the selected effort. */ mode: ThinkingControlMode; + /** + * Supported user-facing efforts, ordered least → most intensive. Never + * empty: a reasoning model without a controllable effort surface carries + * `thinking: undefined` instead of an empty list. + */ + efforts: readonly Effort[]; + /** Optional default effort applied when this model is selected. Falls back to global default if absent. */ + defaultLevel?: Effort; + /** + * Effort → wire-value remap for `anthropic-adaptive` transports, baked at + * build time (4-tier legacy scale vs the 5-tier Opus 4.7+/Fable/Mythos + * scale). Identity for efforts the map omits. + */ + effortMap?: Partial>; + /** + * Adaptive thinking accepts the `display` field (Opus 4.7+, Fable/Mythos + * 5). Also implies native interleaved thinking — no beta header needed. + */ + supportsDisplay?: boolean; } // `Provider` is any provider-id string; `KnownProvider` (re-exported above) enumerates @@ -246,6 +253,12 @@ export interface AnthropicCompat { * When unset, auto-detected from the model id. Default: true. */ supportsForcedToolChoice?: boolean; + /** + * Whether the model accepts sampling parameters (`temperature`, `top_p`, + * `top_k`). Opus 4.7+ and Fable/Mythos reject them with a 400. When unset, + * auto-detected from the model id. Default: true. + */ + supportsSamplingParams?: boolean; /** * Include a non-standard `id` field (aliasing `tool_use_id`) on * `tool_result` blocks. Z.AI's Anthropic-compatible proxy deserializes diff --git a/packages/catalog/test/generated-policies.test.ts b/packages/catalog/test/generated-policies.test.ts new file mode 100644 index 000000000..80ae1dd0f --- /dev/null +++ b/packages/catalog/test/generated-policies.test.ts @@ -0,0 +1,185 @@ +import { describe, expect, it } from "bun:test"; +import { Effort } from "@oh-my-pi/pi-catalog/effort"; +import type { Api, ModelSpec, Provider } from "@oh-my-pi/pi-catalog/types"; +import { applyGeneratedModelPolicies, linkOpenAIPromotionTargets } from "../scripts/generated-policies"; + +function createSpec(overrides: { + id: string; + api: TApi; + provider: Provider; + reasoning?: boolean; + contextWindow?: number; + maxTokens?: number; + priority?: number; + applyPatchToolType?: "freeform" | "function"; + cost?: ModelSpec["cost"]; + thinking?: ModelSpec["thinking"]; +}): ModelSpec { + return { + id: overrides.id, + name: overrides.id, + api: overrides.api, + provider: overrides.provider, + baseUrl: "https://example.com", + reasoning: overrides.reasoning ?? true, + thinking: overrides.thinking, + input: ["text"], + cost: overrides.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: overrides.contextWindow ?? 200000, + maxTokens: overrides.maxTokens ?? 32000, + priority: overrides.priority, + applyPatchToolType: overrides.applyPatchToolType, + }; +} + +describe("generated model policies", () => { + it("re-bakes thinking metadata and applies parsed catalog corrections", () => { + const models: ModelSpec[] = [ + createSpec({ + id: "claude-opus-4-5", + api: "anthropic-messages", + provider: "anthropic", + // Stale baked metadata must be replaced by the deriver's output. + thinking: { mode: "budget", efforts: [Effort.High] }, + cost: { input: 0, output: 0, cacheRead: 1.5, cacheWrite: 18.75 }, + contextWindow: 1000000, + }), + createSpec({ + id: "anthropic.claude-opus-4-6-v1:0", + api: "bedrock-converse-stream", + provider: "amazon-bedrock", + cost: { input: 0, output: 0, cacheRead: 1.5, cacheWrite: 18.75 }, + contextWindow: 1000000, + }), + createSpec({ + id: "gpt-5.2-codex", + api: "openai-codex-responses", + provider: "openai-codex", + contextWindow: 400000, + }), + createSpec({ + id: "gpt-5.4-mini", + api: "openai-codex-responses", + provider: "openai-codex", + contextWindow: 400000, + priority: 2, + }), + ]; + + applyGeneratedModelPolicies(models); + + expect(models[0]?.thinking).toEqual({ + mode: "anthropic-budget-effort", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + }); + expect(models[0]?.cost.cacheRead).toBe(0.5); + expect(models[0]?.cost.cacheWrite).toBe(6.25); + expect(models[1]?.thinking).toEqual({ + mode: "anthropic-adaptive", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + effortMap: { minimal: "low", xhigh: "max" }, + }); + expect(models[1]?.cost.cacheRead).toBe(0.5); + expect(models[1]?.cost.cacheWrite).toBe(6.25); + expect(models[1]?.contextWindow).toBe(1000000); + expect(models[2]?.contextWindow).toBe(272000); + expect(models[3]?.contextWindow).toBe(272000); + expect(models[3]?.priority).toBe(1); + }); + + it("pins Claude Mythos 5 first-party Anthropic catalog metadata", () => { + const models: ModelSpec[] = [ + createSpec({ + id: "claude-mythos-5", + api: "anthropic-messages", + provider: "anthropic", + }), + ]; + + applyGeneratedModelPolicies(models); + + expect(models[0]?.contextWindow).toBe(1_000_000); + expect(models[0]?.maxTokens).toBe(128_000); + expect(models[0]?.cost).toEqual({ input: 10, output: 50, cacheRead: 1, cacheWrite: 12.5 }); + expect(models[0]?.thinking).toEqual({ + mode: "anthropic-adaptive", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + effortMap: { minimal: "low", low: "medium", medium: "high", high: "xhigh", xhigh: "max" }, + supportsDisplay: true, + }); + }); + + it("normalizes Copilot generated fallback limits", () => { + const models: ModelSpec[] = [ + createSpec({ + id: "claude-opus-4.6", + api: "anthropic-messages", + provider: "github-copilot", + contextWindow: 144000, + maxTokens: 64000, + }), + createSpec({ + id: "gpt-5.4-mini", + api: "openai-responses", + provider: "github-copilot", + contextWindow: 400000, + maxTokens: 128000, + }), + createSpec({ + id: "grok-code-fast-1", + api: "openai-completions", + provider: "github-copilot", + contextWindow: 128000, + maxTokens: 64000, + }), + ]; + + applyGeneratedModelPolicies(models); + + expect(models[0]?.contextWindow).toBe(168000); + expect(models[0]?.maxTokens).toBe(32000); + expect(models[1]?.contextWindow).toBe(272000); + expect(models[1]?.maxTokens).toBe(128000); + expect(models[2]?.contextWindow).toBe(192000); + expect(models[2]?.maxTokens).toBe(64000); + }); + + it("links spark variants and gpt-5.5 to their context promotion targets", () => { + const models = [ + createSpec({ id: "gpt-5.3-codex-spark", api: "openai-codex-responses", provider: "openai-codex" }), + createSpec({ id: "gpt-5.5", api: "openai-codex-responses", provider: "openai-codex" }), + createSpec({ id: "gpt-5.4", api: "openai-codex-responses", provider: "openai-codex" }), + ]; + + linkOpenAIPromotionTargets(models); + + expect(models[0]?.contextPromotionTarget).toBe("openai-codex/gpt-5.5"); + expect(models[1]?.contextPromotionTarget).toBe("openai-codex/gpt-5.4"); + }); + + it("sets freeform apply_patch metadata for first-party GPT-5 Responses models", () => { + const models: ModelSpec[] = [ + createSpec({ id: "gpt-5.4", api: "openai-responses", provider: "openai" }), + createSpec({ id: "gpt-5.3-codex-spark", api: "openai-codex-responses", provider: "openai-codex" }), + createSpec({ + id: "gpt-5.3-codex-spark", + api: "openai-responses", + provider: "opencode", + applyPatchToolType: "freeform", + }), + createSpec({ + id: "gpt-5.4", + api: "openai-completions", + provider: "litellm", + applyPatchToolType: "freeform", + }), + ]; + + applyGeneratedModelPolicies(models); + + expect(models[0]?.applyPatchToolType).toBe("freeform"); + expect(models[1]?.applyPatchToolType).toBe("freeform"); + expect(models[2]?.applyPatchToolType).toBeUndefined(); + expect(models[3]?.applyPatchToolType).toBeUndefined(); + }); +}); diff --git a/packages/catalog/test/github-copilot-model-limits.test.ts b/packages/catalog/test/github-copilot-model-limits.test.ts index e0df015e8..a226e70ef 100644 --- a/packages/catalog/test/github-copilot-model-limits.test.ts +++ b/packages/catalog/test/github-copilot-model-limits.test.ts @@ -198,8 +198,7 @@ describe("github copilot model limits mapping", () => { expect(model?.premiumMultiplier).toBe(0.33); expect(model?.thinking).toEqual({ mode: "effort", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }); }); diff --git a/packages/catalog/test/identity-family.test.ts b/packages/catalog/test/identity-family.test.ts index 9bfc7af6c..c65efa80b 100644 --- a/packages/catalog/test/identity-family.test.ts +++ b/packages/catalog/test/identity-family.test.ts @@ -37,7 +37,11 @@ describe("supportsAdaptiveThinkingDisplay", () => { expect(supportsAdaptiveThinkingDisplay("claude-fable-5")).toBe(true); expect(supportsAdaptiveThinkingDisplay("claude-opus-4-7")).toBe(true); expect(supportsAdaptiveThinkingDisplay("claude-opus-5-0")).toBe(true); + // Dotted and dashed version separators are equivalent. + expect(supportsAdaptiveThinkingDisplay("claude-opus-4.7")).toBe(true); + expect(supportsAdaptiveThinkingDisplay("anthropic/claude-opus-4.8")).toBe(true); expect(supportsAdaptiveThinkingDisplay("claude-opus-4-6")).toBe(false); + expect(supportsAdaptiveThinkingDisplay("claude-opus-4.6")).toBe(false); expect(supportsAdaptiveThinkingDisplay("claude-opus-4-20250514")).toBe(false); expect(supportsAdaptiveThinkingDisplay("claude-sonnet-4-6")).toBe(false); }); diff --git a/packages/catalog/test/issue-2113-repro.test.ts b/packages/catalog/test/issue-2113-repro.test.ts index 0f083d55f..38386e347 100644 --- a/packages/catalog/test/issue-2113-repro.test.ts +++ b/packages/catalog/test/issue-2113-repro.test.ts @@ -131,7 +131,10 @@ describe("issue #2113 — moonshot kimi-k2.6 discovery and wire format", () => { const k26 = byId.get("kimi-k2.6"); expect(k26?.reasoning).toBe(true); expect(k26?.input).toEqual(["text", "image"]); - expect(k26?.thinking).toEqual({ mode: "effort", minLevel: Effort.Minimal, maxLevel: Effort.High }); + expect(k26?.thinking).toEqual({ + mode: "effort", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], + }); const thinkingOnly = byId.get("kimi-k2-thinking"); expect(thinkingOnly?.reasoning).toBe(true); diff --git a/packages/catalog/test/model-thinking.test.ts b/packages/catalog/test/model-thinking.test.ts index 4122fee1c..1fc90bc5d 100644 --- a/packages/catalog/test/model-thinking.test.ts +++ b/packages/catalog/test/model-thinking.test.ts @@ -1,29 +1,33 @@ import { describe, expect, it } from "bun:test"; +import { buildModel } from "@oh-my-pi/pi-catalog/build"; import { Effort } from "@oh-my-pi/pi-catalog/effort"; import { - applyGeneratedModelPolicies, clampThinkingLevelForModel, - enrichModelThinking, - linkOpenAIPromotionTargets, + getSupportedEfforts, mapEffortToAnthropicAdaptiveEffort, mapEffortToGoogleThinkingLevel, requireSupportedEffort, } from "@oh-my-pi/pi-catalog/model-thinking"; -import type { Api, ModelSpec, Provider } from "@oh-my-pi/pi-catalog/types"; +import type { Api, Model, ModelSpec, Provider } from "@oh-my-pi/pi-catalog/types"; function createModel(overrides: { id: string; api: TApi; provider: Provider; reasoning?: boolean; -}): ModelSpec { - return enrichModelThinking({ + baseUrl?: string; + compat?: ModelSpec["compat"]; + thinking?: ModelSpec["thinking"]; +}): Model { + return buildModel({ id: overrides.id, name: overrides.id, api: overrides.api, provider: overrides.provider, - baseUrl: "", + baseUrl: overrides.baseUrl ?? "", reasoning: overrides.reasoning ?? true, + compat: overrides.compat, + thinking: overrides.thinking, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 200000, @@ -31,7 +35,7 @@ function createModel(overrides: { }); } -describe("model thinking metadata", () => { +describe("model thinking derivation", () => { it("stores supported efforts for Codex mini in model metadata", () => { const model = createModel({ id: "gpt-5.1-codex-mini", @@ -41,8 +45,7 @@ describe("model thinking metadata", () => { expect(model.thinking).toEqual({ mode: "effort", - minLevel: Effort.Medium, - maxLevel: Effort.High, + efforts: [Effort.Medium, Effort.High], }); expect(() => requireSupportedEffort(model, Effort.Low)).toThrow(/Supported efforts: medium, high/); expect(() => requireSupportedEffort(model, Effort.XHigh)).toThrow(/Supported efforts: medium, high/); @@ -57,13 +60,12 @@ describe("model thinking metadata", () => { expect(model.thinking).toEqual({ mode: "effort", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }); expect(requireSupportedEffort(model, Effort.XHigh)).toBe(Effort.XHigh); }); - it("maps Gemini 3 Pro only for supported levels", () => { + it("encodes the Gemini 3 Pro effort gap directly in efforts", () => { const model = createModel({ id: "gemini-3-pro-preview", api: "google-generative-ai", @@ -72,46 +74,25 @@ describe("model thinking metadata", () => { expect(model.thinking).toEqual({ mode: "google-level", - minLevel: Effort.Low, - maxLevel: Effort.High, - levels: [Effort.Low, Effort.High], + efforts: [Effort.Low, Effort.High], }); - expect(mapEffortToGoogleThinkingLevel(model, Effort.Low)).toBe("LOW"); - expect(mapEffortToGoogleThinkingLevel(model, Effort.High)).toBe("HIGH"); - expect(() => mapEffortToGoogleThinkingLevel(model, Effort.Medium)).toThrow(/not supported/); + expect(mapEffortToGoogleThinkingLevel(Effort.Low)).toBe("LOW"); + expect(mapEffortToGoogleThinkingLevel(Effort.High)).toBe("HIGH"); + expect(mapEffortToGoogleThinkingLevel(Effort.XHigh)).toBe("HIGH"); + expect(() => requireSupportedEffort(model, Effort.Medium)).toThrow(/not supported/); }); - it("encodes anthropic transport mode in metadata", () => { - const opus45 = createModel({ - id: "claude-opus-4-5", - api: "anthropic-messages", - provider: "anthropic", - }); - const opus46 = createModel({ - id: "claude-opus-4.6", - api: "anthropic-messages", - provider: "anthropic", - }); - const opus47 = createModel({ - id: "claude-opus-4.7", - api: "anthropic-messages", - provider: "anthropic", - }); + it("encodes anthropic transport mode and adaptive wire maps in metadata", () => { + const opus45 = createModel({ id: "claude-opus-4-5", api: "anthropic-messages", provider: "anthropic" }); + const opus46 = createModel({ id: "claude-opus-4.6", api: "anthropic-messages", provider: "anthropic" }); + const opus47 = createModel({ id: "claude-opus-4.7", api: "anthropic-messages", provider: "anthropic" }); const opus47Bedrock = createModel({ id: "us.anthropic.claude-opus-4-7", api: "bedrock-converse-stream", provider: "amazon-bedrock", }); - const sonnet46 = createModel({ - id: "claude-sonnet-4.6", - api: "anthropic-messages", - provider: "anthropic", - }); - const mythos = createModel({ - id: "claude-mythos-5", - api: "anthropic-messages", - provider: "anthropic", - }); + const sonnet46 = createModel({ id: "claude-sonnet-4.6", api: "anthropic-messages", provider: "anthropic" }); + const mythos = createModel({ id: "claude-mythos-5", api: "anthropic-messages", provider: "anthropic" }); const mythosBedrock = createModel({ id: "global.anthropic.claude-mythos-5", api: "bedrock-converse-stream", @@ -121,275 +102,124 @@ describe("model thinking metadata", () => { expect(opus45.thinking?.mode).toBe("anthropic-budget-effort"); expect(opus46.thinking?.mode).toBe("anthropic-adaptive"); expect(sonnet46.thinking?.mode).toBe("anthropic-adaptive"); - expect(opus46.thinking).toEqual({ - mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, - }); - expect(sonnet46.thinking).toEqual({ - mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.High, - }); - expect(mythos.thinking).toEqual({ - mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, - }); expect(mythosBedrock.thinking?.mode).toBe("anthropic-adaptive"); - // Opus 4.6 has no real xhigh level — pi-ai aliases XHigh to Anthropic's "max". + + // Opus 4.6 has no real xhigh level — the baked 4-tier map aliases XHigh to "max". + expect(opus46.thinking?.effortMap).toEqual({ minimal: "low", xhigh: "max" }); expect(mapEffortToAnthropicAdaptiveEffort(opus46, Effort.XHigh)).toBe("max"); - // Opus 4.7+ on the Messages API exposes the full five-tier scale, so pi-ai - // shifts each user-facing effort up one notch and the top tier reaches "max". + // Opus 4.7+ on the Messages API exposes the full five-tier scale: the baked + // map shifts each user-facing effort up one notch so the top tier reaches "max". + expect(opus47.thinking?.effortMap).toEqual({ + minimal: "low", + low: "medium", + medium: "high", + high: "xhigh", + xhigh: "max", + }); expect(mapEffortToAnthropicAdaptiveEffort(opus47, Effort.Minimal)).toBe("low"); - expect(mapEffortToAnthropicAdaptiveEffort(opus47, Effort.Low)).toBe("medium"); - expect(mapEffortToAnthropicAdaptiveEffort(opus47, Effort.Medium)).toBe("high"); expect(mapEffortToAnthropicAdaptiveEffort(opus47, Effort.High)).toBe("xhigh"); expect(mapEffortToAnthropicAdaptiveEffort(opus47, Effort.XHigh)).toBe("max"); expect(mapEffortToAnthropicAdaptiveEffort(mythos, Effort.High)).toBe("xhigh"); - expect(mapEffortToAnthropicAdaptiveEffort(mythos, Effort.XHigh)).toBe("max"); expect(mapEffortToAnthropicAdaptiveEffort(mythosBedrock, Effort.XHigh)).toBe("max"); // Bedrock Converse keeps the four-tier legacy mapping; xhigh aliases to "max". + expect(opus47Bedrock.thinking?.effortMap).toEqual({ minimal: "low", xhigh: "max" }); expect(mapEffortToAnthropicAdaptiveEffort(opus47Bedrock, Effort.High)).toBe("high"); - expect(mapEffortToAnthropicAdaptiveEffort(opus47Bedrock, Effort.XHigh)).toBe("max"); expect(() => mapEffortToAnthropicAdaptiveEffort(sonnet46, Effort.XHigh)).toThrow(/not supported/); }); -}); -describe("generated model policies", () => { - it("refreshes thinking metadata and applies parsed catalog corrections", () => { - const models: ModelSpec[] = [ - { - id: "claude-opus-4-5", - name: "Claude Opus 4.5", - api: "anthropic-messages", - provider: "anthropic", - baseUrl: "https://example.com", - reasoning: true, - thinking: { - mode: "budget", - minLevel: Effort.High, - maxLevel: Effort.High, - }, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 1.5, cacheWrite: 18.75 }, - contextWindow: 1000000, - maxTokens: 32000, - }, - { - id: "anthropic.claude-opus-4-6-v1:0", - name: "Claude Opus 4.6", - api: "bedrock-converse-stream", - provider: "amazon-bedrock", - baseUrl: "https://example.com", - reasoning: true, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 1.5, cacheWrite: 18.75 }, - contextWindow: 1000000, - maxTokens: 32000, - }, - { - id: "gpt-5.2-codex", - name: "GPT-5.2 Codex", - api: "openai-codex-responses", - provider: "openai-codex", - baseUrl: "https://example.com", - reasoning: true, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 400000, - maxTokens: 32000, - }, - { - id: "gpt-5.4-mini", - name: "GPT-5.4 mini", - api: "openai-codex-responses", - provider: "openai-codex", - baseUrl: "https://example.com", - reasoning: true, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 400000, - maxTokens: 32000, - priority: 2, - }, - ]; - - applyGeneratedModelPolicies(models); - - expect(models[0]?.thinking).toEqual({ - mode: "anthropic-budget-effort", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + it("bakes adaptive display support for Opus 4.7+ and Fable/Mythos 5", () => { + const opus46 = createModel({ id: "claude-opus-4.6", api: "anthropic-messages", provider: "anthropic" }); + const opus47 = createModel({ id: "claude-opus-4-7", api: "anthropic-messages", provider: "anthropic" }); + // Dotted and dashed version forms are equivalent; bare dated ids stay Opus 4.0. + const opus47Dotted = createModel({ id: "claude-opus-4.7", api: "anthropic-messages", provider: "anthropic" }); + const opus4Dated = createModel({ + id: "claude-opus-4-20250514", + api: "anthropic-messages", + provider: "anthropic", }); - expect(models[0]?.cost.cacheRead).toBe(0.5); - expect(models[0]?.cost.cacheWrite).toBe(6.25); - expect(models[1]?.thinking).toEqual({ + const fable = createModel({ id: "claude-fable-5", api: "anthropic-messages", provider: "anthropic" }); + const fableBedrock = createModel({ + id: "global.anthropic.claude-fable-5", + api: "bedrock-converse-stream", + provider: "amazon-bedrock", + }); + + expect(opus46.thinking?.supportsDisplay).toBeUndefined(); + expect(opus47.thinking?.supportsDisplay).toBe(true); + expect(opus47Dotted.thinking?.supportsDisplay).toBe(true); + expect(opus4Dated.thinking?.supportsDisplay).toBeUndefined(); + expect(fable.thinking?.supportsDisplay).toBe(true); + expect(fableBedrock.thinking?.supportsDisplay).toBe(true); + }); + + it("backfills wire facts onto explicit thinking, explicit values winning", () => { + // Authored capability surface (mode/efforts) keeps identity-derived wire + // facts: configs never need to know Anthropic's tier tables. + const filled = createModel({ + id: "claude-opus-4-8", + api: "anthropic-messages", + provider: "anthropic", + thinking: { mode: "anthropic-adaptive", efforts: [Effort.Low, Effort.High] }, + }); + expect(filled.thinking).toEqual({ mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.High], + effortMap: { minimal: "low", low: "medium", medium: "high", high: "xhigh", xhigh: "max" }, + supportsDisplay: true, }); - expect(models[1]?.cost.cacheRead).toBe(0.5); - expect(models[1]?.cost.cacheWrite).toBe(6.25); - expect(models[1]?.contextWindow).toBe(1000000); - expect(models[2]?.contextWindow).toBe(272000); - expect(models[3]?.contextWindow).toBe(272000); - expect(models[3]?.priority).toBe(1); - }); - it("pins Claude Mythos 5 first-party Anthropic catalog metadata", () => { - const models: ModelSpec[] = [ - { - id: "claude-mythos-5", - name: "Claude Mythos 5", - api: "anthropic-messages", - provider: "anthropic", - baseUrl: "https://example.com", - reasoning: true, - input: ["text", "image"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 200000, - maxTokens: 32000, + // Explicit wire facts are authoritative — including `false`. + const pinned = createModel({ + id: "claude-opus-4-8", + api: "anthropic-messages", + provider: "anthropic", + thinking: { + mode: "anthropic-adaptive", + efforts: [Effort.Low, Effort.High], + effortMap: { xhigh: "max" }, + supportsDisplay: false, }, - ]; - - applyGeneratedModelPolicies(models); - - expect(models[0]?.contextWindow).toBe(1_000_000); - expect(models[0]?.maxTokens).toBe(128_000); - expect(models[0]?.cost).toEqual({ input: 10, output: 50, cacheRead: 1, cacheWrite: 12.5 }); - expect(models[0]?.thinking).toEqual({ - mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, }); + expect(pinned.thinking?.effortMap).toEqual({ xhigh: "max" }); + expect(pinned.thinking?.supportsDisplay).toBe(false); }); - it("normalizes Copilot generated fallback limits", () => { - const models: ModelSpec[] = [ - { - ...createModel({ - id: "claude-opus-4.6", - api: "anthropic-messages", - provider: "github-copilot", - }), - contextWindow: 144000, - maxTokens: 64000, - }, - { - ...createModel({ - id: "gpt-5.4-mini", - api: "openai-responses", - provider: "github-copilot", - }), - contextWindow: 400000, - maxTokens: 128000, - }, - { - ...createModel({ - id: "grok-code-fast-1", - api: "openai-completions", - provider: "github-copilot", - }), - contextWindow: 128000, - maxTokens: 64000, - }, - ]; + it("bakes sampling-param rejection into anthropic compat", () => { + const sonnet45 = createModel({ id: "claude-sonnet-4-5", api: "anthropic-messages", provider: "anthropic" }); + const opus47 = createModel({ id: "claude-opus-4.7", api: "anthropic-messages", provider: "anthropic" }); + const fable = createModel({ id: "claude-fable-5", api: "anthropic-messages", provider: "anthropic" }); - applyGeneratedModelPolicies(models); - - expect(models[0]?.contextWindow).toBe(168000); - expect(models[0]?.maxTokens).toBe(32000); - expect(models[1]?.contextWindow).toBe(272000); - expect(models[1]?.maxTokens).toBe(128000); - expect(models[2]?.contextWindow).toBe(192000); - expect(models[2]?.maxTokens).toBe(64000); + expect(sonnet45.compat.supportsSamplingParams).toBe(true); + expect(opus47.compat.supportsSamplingParams).toBe(false); + expect(fable.compat.supportsSamplingParams).toBe(false); }); - it("links spark variants and gpt-5.5 to their context promotion targets", () => { - const models = [ - createModel({ - id: "gpt-5.3-codex-spark", - api: "openai-codex-responses", - provider: "openai-codex", - }), - createModel({ - id: "gpt-5.5", - api: "openai-codex-responses", - provider: "openai-codex", - }), - createModel({ - id: "gpt-5.4", - api: "openai-codex-responses", - provider: "openai-codex", - }), - ]; + it("encodes effort-dial-less reasoners as thinking: undefined", () => { + const model = createModel({ + id: "grok-build", + api: "openai-responses", + provider: "xai-oauth", + compat: { supportsReasoningEffort: false }, + }); - linkOpenAIPromotionTargets(models); - - expect(models[0]?.contextPromotionTarget).toBe("openai-codex/gpt-5.5"); - expect(models[1]?.contextPromotionTarget).toBe("openai-codex/gpt-5.4"); - }); - - it("sets freeform apply_patch metadata for first-party GPT-5 Responses models", () => { - const models: ModelSpec[] = [ - createModel({ - id: "gpt-5.4", - api: "openai-responses", - provider: "openai", - }), - createModel({ - id: "gpt-5.3-codex-spark", - api: "openai-codex-responses", - provider: "openai-codex", - }), - { - ...createModel({ - id: "gpt-5.3-codex-spark", - api: "openai-responses", - provider: "opencode", - }), - applyPatchToolType: "freeform", - }, - { - ...createModel({ - id: "gpt-5.4", - api: "openai-completions", - provider: "litellm", - }), - applyPatchToolType: "freeform", - }, - ]; - - applyGeneratedModelPolicies(models); - - expect(models[0]?.applyPatchToolType).toBe("freeform"); - expect(models[1]?.applyPatchToolType).toBe("freeform"); - expect(models[2]?.applyPatchToolType).toBeUndefined(); - expect(models[3]?.applyPatchToolType).toBeUndefined(); + expect(model.reasoning).toBe(true); + expect(model.thinking).toBeUndefined(); + expect(getSupportedEfforts(model)).toEqual([]); + expect(clampThinkingLevelForModel(model, Effort.High)).toBeUndefined(); }); }); describe("model thinking runtime helpers", () => { it("clamps from explicit metadata instead of inferring from model id", () => { - const model: ModelSpec<"openai-codex-responses"> = { + const model = createModel({ id: "custom-reasoner", - name: "Custom Reasoner", api: "openai-codex-responses", provider: "custom", baseUrl: "https://example.com", - reasoning: true, - thinking: { - mode: "effort", - minLevel: Effort.Medium, - maxLevel: Effort.High, - }, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 200000, - maxTokens: 32000, - }; + thinking: { mode: "effort", efforts: [Effort.Medium, Effort.High] }, + }); + expect(model.thinking).toEqual({ mode: "effort", efforts: [Effort.Medium, Effort.High] }); expect(clampThinkingLevelForModel(model, Effort.Minimal)).toBe(Effort.Medium); expect(clampThinkingLevelForModel(model, Effort.XHigh)).toBe(Effort.High); expect(clampThinkingLevelForModel(model, Effort.High)).toBe(Effort.High); @@ -413,32 +243,22 @@ describe("model thinking runtime helpers", () => { provider: "custom", }); - // openai-completions should support xhigh by default - expect(model.thinking?.maxLevel).toBe(Effort.XHigh); + expect(model.thinking?.efforts.at(-1)).toBe(Effort.XHigh); expect(requireSupportedEffort(model, Effort.XHigh)).toBe(Effort.XHigh); }); it("does not expose xhigh for binary-thinking openai-compat transports", () => { - const model = enrichModelThinking({ + const model = createModel({ id: "glm-4.7", - name: "GLM-4.7", api: "openai-completions", provider: "zai", baseUrl: "https://api.z.ai/v1", - reasoning: true, - compat: { - thinkingFormat: "zai", - }, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 128000, - maxTokens: 32000, - } satisfies ModelSpec<"openai-completions">); + compat: { thinkingFormat: "zai" }, + }); expect(model.thinking).toEqual({ mode: "effort", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }); expect(requireSupportedEffort(model, Effort.High)).toBe(Effort.High); expect(() => requireSupportedEffort(model, Effort.XHigh)).toThrow( @@ -447,26 +267,17 @@ describe("model thinking runtime helpers", () => { }); it("derives binary-thinking fallback from resolved compat when catalog compat is partial", () => { - const model = enrichModelThinking({ + const model = createModel({ id: "qwen/qwen3-32b", - name: "Qwen 3 32B", api: "openai-completions", provider: "openrouter", baseUrl: "https://openrouter.ai/api/v1", - reasoning: true, - compat: { - supportsToolChoice: true, - }, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 128000, - maxTokens: 32000, - } satisfies ModelSpec<"openai-completions">); + compat: { supportsToolChoice: true }, + }); expect(model.thinking).toEqual({ mode: "effort", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }); expect(requireSupportedEffort(model, Effort.High)).toBe(Effort.High); expect(() => requireSupportedEffort(model, Effort.XHigh)).toThrow( @@ -491,34 +302,24 @@ describe("model thinking runtime helpers", () => { provider: "openrouter", }); - expect(fable.thinking?.maxLevel).toBe(Effort.XHigh); - expect(opus46.thinking?.maxLevel).toBe(Effort.XHigh); - expect(sonnet46.thinking?.maxLevel).toBe(Effort.High); + expect(fable.thinking?.efforts.at(-1)).toBe(Effort.XHigh); + expect(opus46.thinking?.efforts.at(-1)).toBe(Effort.XHigh); + expect(sonnet46.thinking?.efforts.at(-1)).toBe(Effort.High); expect(requireSupportedEffort(fable, Effort.XHigh)).toBe(Effort.XHigh); }); it("enables xhigh for openai-responses and openai-codex-responses APIs", () => { - const responsesModel = createModel({ - id: "custom-responses", - api: "openai-responses", - provider: "custom", - }); + const responsesModel = createModel({ id: "custom-responses", api: "openai-responses", provider: "custom" }); + const codexModel = createModel({ id: "custom-codex", api: "openai-codex-responses", provider: "custom" }); - const codexModel = createModel({ - id: "custom-codex", - api: "openai-codex-responses", - provider: "custom", - }); - - // Both should support xhigh - expect(responsesModel.thinking?.maxLevel).toBe(Effort.XHigh); - expect(codexModel.thinking?.maxLevel).toBe(Effort.XHigh); + expect(responsesModel.thinking?.efforts.at(-1)).toBe(Effort.XHigh); + expect(codexModel.thinking?.efforts.at(-1)).toBe(Effort.XHigh); expect(requireSupportedEffort(responsesModel, Effort.XHigh)).toBe(Effort.XHigh); expect(requireSupportedEffort(codexModel, Effort.XHigh)).toBe(Effort.XHigh); }); - it("rejects reasoning models that are missing thinking metadata at runtime", () => { - const model = { + it("rejects effort requests against un-built reasoning specs", () => { + const spec = { id: "broken-reasoner", name: "Broken Reasoner", api: "openai-responses", @@ -531,28 +332,30 @@ describe("model thinking runtime helpers", () => { maxTokens: 32000, } as ModelSpec<"openai-responses">; - expect(() => requireSupportedEffort(model, Effort.High)).toThrow(/missing thinking metadata/); + expect(() => requireSupportedEffort(spec, Effort.High)).toThrow(/not supported/); }); - it("drops empty thinking metadata so presence checks stay meaningful", () => { - const model = enrichModelThinking({ + it("drops authored thinking on non-reasoning models and re-derives empty efforts", () => { + const nonReasoning = createModel({ id: "plain-model", - name: "Plain Model", api: "openai-responses", provider: "custom", baseUrl: "https://example.com", reasoning: false, - thinking: { - mode: "effort", - minLevel: Effort.High, - maxLevel: Effort.Low, - }, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 200000, - maxTokens: 32000, - } satisfies ModelSpec<"openai-responses">); + thinking: { mode: "effort", efforts: [Effort.High] }, + }); + expect(nonReasoning.thinking).toBeUndefined(); - expect(model.thinking).toBeUndefined(); + // Empty explicit efforts are treated as absent metadata: infer instead. + const emptyEfforts = createModel({ + id: "gpt-5.2-codex", + api: "openai-codex-responses", + provider: "openai-codex", + thinking: { mode: "effort", efforts: [] }, + }); + expect(emptyEfforts.thinking).toEqual({ + mode: "effort", + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], + }); }); }); diff --git a/packages/catalog/test/nanogpt-model-limits.test.ts b/packages/catalog/test/nanogpt-model-limits.test.ts index 68e6a60a4..2f4e71115 100644 --- a/packages/catalog/test/nanogpt-model-limits.test.ts +++ b/packages/catalog/test/nanogpt-model-limits.test.ts @@ -50,8 +50,7 @@ describe("nanogpt model limits mapping", () => { expect(model?.premiumMultiplier).toBeUndefined(); expect(model?.thinking).toEqual({ mode: "effort", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }); expect(fetchMock).toHaveBeenCalledTimes(1); }); diff --git a/packages/catalog/test/ollama-cloud-output-caps.test.ts b/packages/catalog/test/ollama-cloud-output-caps.test.ts index 5cfadde4e..1716be904 100644 --- a/packages/catalog/test/ollama-cloud-output-caps.test.ts +++ b/packages/catalog/test/ollama-cloud-output-caps.test.ts @@ -14,6 +14,7 @@ const cloudModel: Model<"ollama-chat"> = { cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 128_000, maxTokens: 8_192, + compat: undefined, }; function createNdjsonResponse(lines: unknown[]): Response { diff --git a/packages/catalog/test/ollama-provider.test.ts b/packages/catalog/test/ollama-provider.test.ts index 804c07b82..3b49afec6 100644 --- a/packages/catalog/test/ollama-provider.test.ts +++ b/packages/catalog/test/ollama-provider.test.ts @@ -45,7 +45,10 @@ describe("ollama local provider discovery", () => { expect(model?.api).toBe("openai-responses"); expect(model?.contextWindow).toBe(1048576); expect(model?.reasoning).toBe(true); - expect(model?.thinking).toEqual({ mode: "effort", minLevel: Effort.Minimal, maxLevel: Effort.High }); + expect(model?.thinking).toEqual({ + mode: "effort", + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], + }); expect(model?.input).toEqual(["text", "image"]); }); diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index a5a03faaa..d6f37acfc 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added - Added `supportsReasoningParams`, `alwaysSendMaxTokens`, `strictResponsesPairing`, and a recursive `whenThinking` overlay (alongside `streamIdleTimeoutMs`/`supportsLongPromptCacheRetention`/`requiresToolResultId`/`replayUnsignedThinking`) to the OpenAI/Anthropic `compat` schema so custom model entries can configure those provider-specific capabilities +- Custom model `thinking` config now uses the catalog's explicit vocabulary: `efforts` (ordered list) plus optional `defaultLevel`, `effortMap`, and `supportsDisplay` overrides; the legacy `minLevel`/`maxLevel`/`levels` range shape is still accepted and normalized at parse time. Wire facts (`effortMap`/`supportsDisplay`) are backfilled from model identity when not set, so existing claude-proxy configs keep the 5-tier adaptive scale and summarized display without changes. - New `omp usage` command: a detailed per-account breakdown of provider usage limits (bars, windows, reset times, plan metadata) covering every stored credential — accounts with no usage endpoint are listed as "no usage data" rows. Each provider section ends with per-window capacity stats ("capacity: 5h → 2.40/5 accounts used (2.60× quota left)"). Flags: `--provider` to filter, `--json` for the broker-shaped report payload, and `--redact` to mask account emails/ids down to a two-char anchor plus a minimal middle-out differentiator (`ca*9*`) for screenshot-safe sharing. - Startup hangs are now self-diagnosing (speculative fix for the "zero output, hangs even on `omp -h`" report class): a watchdog prints a stderr line every 10s naming the deepest in-flight startup phase (via `logger.openSpanPath()`) until a mode runner takes over, pausing around legitimate interactive waits (fork/move prompts, the `--resume` session picker); `PI_DEBUG_STARTUP` is restored as streaming synchronous `[startup]` phase markers covering command-module imports and the native addon load, which the post-startup `PI_TIMING` tree structurally cannot show for a hang; and waiting on piped-stdin EOF announces itself after 1s instead of blocking silently. - npm installs now execute a prebundled single-file entry: the published `bin.omp` points at `dist/cli.js` (built by `scripts/bundle-dist.ts` during `prepack`, ~18MB minified, natives/transformers/mupdf external), cutting npm-install cold start by roughly 3x versus transpiling the raw TypeScript graph per launch; `src/**` stays published for SDK consumers and worker fallbacks. The on-repo manifest keeps `bin.omp` at `src/cli.ts` — release rewrites it via the `publishBin` override in `scripts/ci-release-publish.ts` — so source installs (`bun link`, `install.sh --source`) keep working without a build step diff --git a/packages/coding-agent/src/config/models-config-schema.ts b/packages/coding-agent/src/config/models-config-schema.ts index fdf9e6516..7a50e6bb0 100644 --- a/packages/coding-agent/src/config/models-config-schema.ts +++ b/packages/coding-agent/src/config/models-config-schema.ts @@ -68,13 +68,50 @@ const ThinkingControlModeSchema = z.enum([ "anthropic-budget-effort", ]); -const ModelThinkingSchema = z.object({ - minLevel: EffortSchema, - maxLevel: EffortSchema, - mode: ThinkingControlModeSchema, - defaultLevel: EffortSchema.optional(), - levels: z.array(EffortSchema).optional(), -}); +const EFFORT_ORDER = ["minimal", "low", "medium", "high", "xhigh"] as const; + +/** + * Accepts the canonical `efforts` vocabulary plus the legacy + * `minLevel`/`maxLevel`/`levels` range shape, normalizing both to + * `ThinkingConfig` (ordered `efforts`, never empty). Precedence mirrors the + * old runtime: explicit `levels` beat the min..max range; `efforts` beats both. + */ +const ModelThinkingSchema = z + .object({ + mode: ThinkingControlModeSchema, + efforts: z.array(EffortSchema).min(1).optional(), + defaultLevel: EffortSchema.optional(), + effortMap: ReasoningEffortMapSchema.optional(), + supportsDisplay: z.boolean().optional(), + // Legacy range vocabulary (pre-efforts configs). + minLevel: EffortSchema.optional(), + maxLevel: EffortSchema.optional(), + levels: z.array(EffortSchema).min(1).optional(), + }) + .refine( + value => + value.efforts !== undefined || + value.levels !== undefined || + (value.minLevel !== undefined && value.maxLevel !== undefined), + { + message: "thinking requires `efforts` (or legacy `levels`/`minLevel`+`maxLevel`)", + }, + ) + .transform(({ efforts, levels, minLevel, maxLevel, mode, defaultLevel, effortMap, supportsDisplay }) => { + let resolved = efforts ?? levels; + if (!resolved) { + const minIndex = EFFORT_ORDER.indexOf(minLevel!); + const maxIndex = EFFORT_ORDER.indexOf(maxLevel!); + resolved = EFFORT_ORDER.slice(minIndex, Math.max(minIndex, maxIndex) + 1); + } + return { + mode, + efforts: resolved, + ...(defaultLevel !== undefined && { defaultLevel }), + ...(effortMap !== undefined && { effortMap }), + ...(supportsDisplay !== undefined && { supportsDisplay }), + }; + }); const ModelDefinitionSchema = z.object({ id: z.string().min(1), diff --git a/packages/coding-agent/src/eval/__tests__/completion-bridge.test.ts b/packages/coding-agent/src/eval/__tests__/completion-bridge.test.ts index 89b5ff7d2..0b4422021 100644 --- a/packages/coding-agent/src/eval/__tests__/completion-bridge.test.ts +++ b/packages/coding-agent/src/eval/__tests__/completion-bridge.test.ts @@ -38,7 +38,7 @@ const SLOW = makeModel("p", "slow"); const REASONING_SLOW = makeModel("p", "slow", { api: "anthropic-messages", reasoning: true, - thinking: { minLevel: Effort.Low, maxLevel: Effort.High, mode: "anthropic-adaptive" }, + thinking: { efforts: [Effort.Low, Effort.Medium, Effort.High], mode: "anthropic-adaptive" }, }); interface SessionOptions { diff --git a/packages/coding-agent/src/extensibility/extensions/types.ts b/packages/coding-agent/src/extensibility/extensions/types.ts index 48a5d9acf..58ac643d5 100644 --- a/packages/coding-agent/src/extensibility/extensions/types.ts +++ b/packages/coding-agent/src/extensibility/extensions/types.ts @@ -1082,7 +1082,7 @@ export interface ExtensionAPI { * id: "claude-sonnet-4@20250514", * name: "Claude Sonnet 4 (Vertex)", * reasoning: true, - * thinking: { mode: "anthropic-adaptive", minLevel: "minimal", maxLevel: "high" }, + * thinking: { mode: "anthropic-adaptive", efforts: ["minimal", "low", "medium", "high"] }, * input: ["text", "image"], * cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, * contextWindow: 200000, diff --git a/packages/coding-agent/test/agent-session-mcp-discovery.test.ts b/packages/coding-agent/test/agent-session-mcp-discovery.test.ts index f8a56d49e..61b8bdb8b 100644 --- a/packages/coding-agent/test/agent-session-mcp-discovery.test.ts +++ b/packages/coding-agent/test/agent-session-mcp-discovery.test.ts @@ -699,7 +699,7 @@ describe("AgentSession MCP discovery", () => { const reasoningModel: Model<"openai-responses"> = { ...createModel(), reasoning: true, - thinking: { mode: "effort", minLevel: Effort.Medium, maxLevel: Effort.Medium }, + thinking: { mode: "effort", efforts: [Effort.Medium] }, }; const agent = new Agent({ diff --git a/packages/coding-agent/test/issue-775-repro.test.ts b/packages/coding-agent/test/issue-775-repro.test.ts index 766220959..ec12f97ad 100644 --- a/packages/coding-agent/test/issue-775-repro.test.ts +++ b/packages/coding-agent/test/issue-775-repro.test.ts @@ -71,8 +71,7 @@ describe("issue #775: per-model defaultLevel", () => { ...opus, thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], defaultLevel: Effort.XHigh, }, }; diff --git a/packages/coding-agent/test/memories-runtime.test.ts b/packages/coding-agent/test/memories-runtime.test.ts index ba2429d73..c53f7e279 100644 --- a/packages/coding-agent/test/memories-runtime.test.ts +++ b/packages/coding-agent/test/memories-runtime.test.ts @@ -238,7 +238,7 @@ describe("memories runtime", () => { const constrainedModel: Model = { ...fx.model, reasoning: true, - thinking: { mode: "effort", minLevel: Effort.High, maxLevel: Effort.XHigh }, + thinking: { mode: "effort", efforts: [Effort.High, Effort.XHigh] }, }; fx.session.model = constrainedModel; fx.modelRegistry.find = vi.fn(() => constrainedModel); diff --git a/packages/coding-agent/test/model-discovery.test.ts b/packages/coding-agent/test/model-discovery.test.ts index 7023fc5bb..adf0fbe9a 100644 --- a/packages/coding-agent/test/model-discovery.test.ts +++ b/packages/coding-agent/test/model-discovery.test.ts @@ -351,8 +351,7 @@ describe("ModelRegistry runtime discovery", () => { expect(qwen?.reasoning).toBe(true); expect(qwen?.thinking).toEqual({ mode: "effort", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }); const llama = registry.find("ollama", "llama3.2:3b"); diff --git a/packages/coding-agent/test/model-registry-runtime-provider.test.ts b/packages/coding-agent/test/model-registry-runtime-provider.test.ts index 6c404e112..b613c5990 100644 --- a/packages/coding-agent/test/model-registry-runtime-provider.test.ts +++ b/packages/coding-agent/test/model-registry-runtime-provider.test.ts @@ -141,7 +141,7 @@ describe("ModelRegistry runtime provider registration", () => { expectProviderHeader(registry, providerName, "Authorization", undefined); }); - test("registerProvider preserves explicit thinking on runtime models", () => { + test("registerProvider preserves explicit thinking and backfills wire facts", () => { const registry = new ModelRegistry(authStorage, modelsJsonPath); const config: ProviderConfigInput = { baseUrl: "https://runtime.example.com/v1", @@ -154,8 +154,7 @@ describe("ModelRegistry runtime provider registration", () => { reasoning: true, thinking: { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, }, ], @@ -166,8 +165,10 @@ describe("ModelRegistry runtime provider registration", () => { expect(model?.thinking).toEqual({ mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], + // Wire facts are backfilled from identity; non-claude ids get the + // 4-tier adaptive map. + effortMap: { minimal: "low", xhigh: "max" }, }); }); diff --git a/packages/coding-agent/test/model-registry.test.ts b/packages/coding-agent/test/model-registry.test.ts index 358cd3f01..0a0372a89 100644 --- a/packages/coding-agent/test/model-registry.test.ts +++ b/packages/coding-agent/test/model-registry.test.ts @@ -284,7 +284,7 @@ describe("ModelRegistry", () => { const variants = registry.getCanonicalVariants("deepseek-v4-pro"); expect(model?.cost.cacheRead).toBeGreaterThan(0); - expect(model?.thinking?.maxLevel).toBe(Effort.XHigh); + expect(model?.thinking?.efforts.at(-1)).toBe(Effort.XHigh); expect(variants.some(variant => variant.selector === "ollama/deepseek-v4-pro:cloud")).toBe(true); }); @@ -1132,12 +1132,10 @@ describe("ModelRegistry", () => { }); describe("thinking metadata normalization", () => { - test("custom models preserve explicit thinking", () => { + test("custom models preserve explicit thinking and gain backfilled wire facts", () => { const thinking: ThinkingConfig = { mode: "anthropic-adaptive", - minLevel: Effort.Minimal, - maxLevel: Effort.High, - levels: [Effort.Minimal, Effort.High], + efforts: [Effort.Minimal, Effort.High], }; writeModelsJson({ @@ -1149,7 +1147,11 @@ describe("ModelRegistry", () => { const registry = new ModelRegistry(authStorage, modelsJsonPath); const model = getModelsForProvider(registry, "anthropic").find(m => m.id === "claude-custom"); - expect(model?.thinking).toEqual(thinking); + expect(model?.thinking).toEqual({ + ...thinking, + // Versionless claude ids resolve to the 4-tier adaptive wire map. + effortMap: { minimal: "low", xhigh: "max" }, + }); }); test("model overrides can replace canonical thinking metadata", () => { @@ -1157,7 +1159,7 @@ describe("ModelRegistry", () => { openrouter: { modelOverrides: { "anthropic/claude-sonnet-4": { - thinking: { mode: "budget", minLevel: Effort.Low, maxLevel: Effort.Medium }, + thinking: { mode: "budget", efforts: [Effort.Low, Effort.Medium] }, }, }, }, @@ -1168,8 +1170,7 @@ describe("ModelRegistry", () => { expect(model?.thinking).toEqual({ mode: "budget", - minLevel: Effort.Low, - maxLevel: Effort.Medium, + efforts: [Effort.Low, Effort.Medium], }); }); }); diff --git a/packages/coding-agent/test/model-resolver.test.ts b/packages/coding-agent/test/model-resolver.test.ts index c7aa3616a..b0b3053de 100644 --- a/packages/coding-agent/test/model-resolver.test.ts +++ b/packages/coding-agent/test/model-resolver.test.ts @@ -25,8 +25,7 @@ const mockModels: Model<"anthropic-messages">[] = [ reasoning: true, thinking: { mode: "budget", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, input: ["text", "image"], cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, @@ -58,8 +57,7 @@ const mockOpenRouterModels: Model[] = [ reasoning: true, thinking: { mode: "budget", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, input: ["text"], cost: { input: 1, output: 2, cacheRead: 0.1, cacheWrite: 1 }, @@ -87,8 +85,7 @@ const mockOpenRouterModels: Model[] = [ reasoning: true, thinking: { mode: "budget", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, input: ["text"], cost: { input: 1, output: 2, cacheRead: 0.1, cacheWrite: 1 }, @@ -134,8 +131,7 @@ const mockCodexOverlapModels: Model<"anthropic-messages">[] = [ reasoning: true, thinking: { mode: "effort", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, input: ["text"], cost: { input: 1.5, output: 6, cacheRead: 0.15, cacheWrite: 1.5 }, @@ -151,8 +147,7 @@ const mockCodexOverlapModels: Model<"anthropic-messages">[] = [ reasoning: true, thinking: { mode: "effort", - minLevel: Effort.Low, - maxLevel: Effort.XHigh, + efforts: [Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, input: ["text"], cost: { input: 1, output: 4, cacheRead: 0.1, cacheWrite: 1 }, @@ -171,8 +166,7 @@ function createOpusModel(provider: string, id: string, name: string): Model<"ant reasoning: true, thinking: { mode: "budget", - minLevel: Effort.Minimal, - maxLevel: Effort.XHigh, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High, Effort.XHigh], }, input: ["text", "image"], cost: { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 }, @@ -191,8 +185,7 @@ const canonicalVariantModels: Model<"anthropic-messages">[] = [ reasoning: true, thinking: { mode: "budget", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, input: ["text", "image"], cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, @@ -208,8 +201,7 @@ const canonicalVariantModels: Model<"anthropic-messages">[] = [ reasoning: true, thinking: { mode: "budget", - minLevel: Effort.Minimal, - maxLevel: Effort.High, + efforts: [Effort.Minimal, Effort.Low, Effort.Medium, Effort.High], }, input: ["text", "image"], cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 }, diff --git a/packages/coding-agent/test/sdk-mcp-discovery.test.ts b/packages/coding-agent/test/sdk-mcp-discovery.test.ts index 97ecbf975..208a5502e 100644 --- a/packages/coding-agent/test/sdk-mcp-discovery.test.ts +++ b/packages/coding-agent/test/sdk-mcp-discovery.test.ts @@ -37,7 +37,7 @@ function createReasoningModel(): Model<"openai-responses"> { provider: "openai", baseUrl: "https://example.invalid", reasoning: true, - thinking: { mode: "effort", minLevel: Effort.Medium, maxLevel: Effort.High }, + thinking: { mode: "effort", efforts: [Effort.Medium, Effort.High] }, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 8192,