diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 556fd7fed..eab557183 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -18,6 +18,7 @@ - Stopped emitting stale `thinking.efforts` dials on paid xAI Responses catalog rows that reject `reasoning.effort` (`grok-code-fast-1`, `grok-build-0.1`, `grok-4.20-0309-reasoning`, and other off-allowlist reasoners). - Marked first-party xAI Responses hosts (`xai` and `xai-oauth`) as not supporting `reasoning.summary`, so paid `xai/grok-4.5` effort requests omit the unsupported field instead of sending `summary: "auto"`. - Removed unsupported `xhigh` (and `max`) thinking tiers from first-party Grok Responses catalog rows; leftover `xhigh`/`max` requests clamp to `high`. +- Stopped baking `reasoningEffortMap` on first-party xAI catalog rows that omit `reasoning.effort` (`omitReasoningEffort: true`). ## [17.3.4] - 2026-08-14 diff --git a/packages/catalog/scripts/generated-policies.ts b/packages/catalog/scripts/generated-policies.ts index 0002dab3e..1d1737155 100644 --- a/packages/catalog/scripts/generated-policies.ts +++ b/packages/catalog/scripts/generated-policies.ts @@ -354,7 +354,7 @@ export function applyOllamaCloudOutputCap(models: ModelSpec[]): void { } function applyGeneratedModelPolicy(model: ModelSpec): void { - if (model.provider === "xai" && model.api === "openai-responses") { + if ((model.provider === "xai" || model.provider === "xai-oauth") && model.api === "openai-responses") { const updated = applyXaiResponsesThinkingPolicy(model as ModelSpec<"openai-responses">); model.compat = updated.compat; } diff --git a/packages/catalog/src/models.json b/packages/catalog/src/models.json index ec12711b7..dcb91951b 100644 --- a/packages/catalog/src/models.json +++ b/packages/catalog/src/models.json @@ -103732,11 +103732,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103760,11 +103755,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103788,11 +103778,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103817,11 +103802,6 @@ "contextWindow": 8192, "maxTokens": 4096, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103846,11 +103826,6 @@ "contextWindow": 8192, "maxTokens": 4096, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103875,11 +103850,6 @@ "contextWindow": 8192, "maxTokens": 4096, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103903,11 +103873,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103931,11 +103896,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103959,11 +103919,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -103987,11 +103942,6 @@ "contextWindow": 131072, "maxTokens": 8192, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104175,11 +104125,6 @@ "contextWindow": 256000, "maxTokens": 64000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104204,11 +104149,6 @@ "contextWindow": 2000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104233,11 +104173,6 @@ "contextWindow": 2000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104262,11 +104197,6 @@ "contextWindow": 2000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104291,11 +104221,6 @@ "contextWindow": 2000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104320,11 +104245,6 @@ "contextWindow": 1000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104349,11 +104269,6 @@ "contextWindow": 1000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104378,11 +104293,6 @@ "contextWindow": 2000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104407,11 +104317,6 @@ "contextWindow": 2000000, "maxTokens": 30000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104587,11 +104492,6 @@ "contextWindow": 131072, "maxTokens": 4096, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104616,11 +104516,6 @@ "contextWindow": 256000, "maxTokens": 256000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104644,11 +104539,6 @@ "contextWindow": 256000, "maxTokens": 10000, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104673,11 +104563,6 @@ "contextWindow": 8192, "maxTokens": 4096, "compat": { - "reasoningEffortMap": { - "minimal": "low", - "xhigh": "high", - "max": "high" - }, "supportsReasoningEffort": false, "omitReasoningEffort": true } @@ -104706,9 +104591,6 @@ "supportsComputerUse": false, "supportsComputerUseConfig": false, "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, "supportsImageDetailOriginal": false, @@ -104738,9 +104620,6 @@ "supportsComputerUse": false, "supportsComputerUseConfig": false, "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, "supportsImageDetailOriginal": false, @@ -104782,7 +104661,9 @@ "supportsComputerUseConfig": false, "compat": { "reasoningEffortMap": { - "minimal": "low" + "minimal": "low", + "xhigh": "high", + "max": "high" }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, @@ -104826,7 +104707,9 @@ "supportsComputerUseConfig": false, "compat": { "reasoningEffortMap": { - "minimal": "low" + "minimal": "low", + "xhigh": "high", + "max": "high" }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, @@ -104870,7 +104753,9 @@ "supportsComputerUseConfig": false, "compat": { "reasoningEffortMap": { - "minimal": "low" + "minimal": "low", + "xhigh": "high", + "max": "high" }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, @@ -104929,9 +104814,6 @@ "supportsComputerUse": false, "supportsComputerUseConfig": false, "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, "supportsImageDetailOriginal": false, @@ -104961,9 +104843,6 @@ "supportsComputerUse": false, "supportsComputerUseConfig": false, "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, "supportsImageDetailOriginal": false, @@ -104992,9 +104871,6 @@ "supportsComputerUse": false, "supportsComputerUseConfig": false, "compat": { - "reasoningEffortMap": { - "minimal": "low" - }, "includeEncryptedReasoning": true, "filterReasoningHistory": false, "supportsImageDetailOriginal": false, diff --git a/packages/catalog/src/provider-models/openai-compat.ts b/packages/catalog/src/provider-models/openai-compat.ts index ae5c60ec0..0a2e12022 100644 --- a/packages/catalog/src/provider-models/openai-compat.ts +++ b/packages/catalog/src/provider-models/openai-compat.ts @@ -1396,18 +1396,20 @@ const XAI_REASONING_EFFORT_MAP = { minimal: "low", xhigh: "high", max: "high" } */ export function applyXaiResponsesThinkingPolicy(model: ModelSpec<"openai-responses">): ModelSpec<"openai-responses"> { const effortCapable = model.compat?.supportsReasoningEffort ?? isGrokReasoningEffortCapable(model.id); - return { - ...model, - compat: { - ...(model.compat ?? {}), - reasoningEffortMap: { - ...XAI_REASONING_EFFORT_MAP, - ...(model.compat?.reasoningEffortMap ?? {}), - }, - supportsReasoningEffort: effortCapable, - omitReasoningEffort: model.compat?.omitReasoningEffort ?? !effortCapable, - }, + const compat = { + ...(model.compat ?? {}), + supportsReasoningEffort: effortCapable, + omitReasoningEffort: model.compat?.omitReasoningEffort ?? !effortCapable, }; + if (effortCapable) { + compat.reasoningEffortMap = { + ...XAI_REASONING_EFFORT_MAP, + ...(model.compat?.reasoningEffortMap ?? {}), + }; + } else { + delete compat.reasoningEffortMap; + } + return { ...model, compat }; } // xai-oauth's /v1/models exposes no per-request output limit on the OAuth @@ -1423,9 +1425,9 @@ export function applyXaiResponsesThinkingPolicy(model: ModelSpec<"openai-respons // reasoning metadata and fetchOpenAICompatibleModels defaults reasoning to // false). Caller supplies a `base` Model (either a freshly synthesised seed // or a dynamic-fetched entry); the helper layers curated fields on top. -// The `minimal -> low` effort clamp (XAI_REASONING_EFFORT_MAP) is always -// merged in so dynamic-fetched models — which arrive without curated -// compat keys — still get the clamp applyResponsesReasoningParams expects. +// The `minimal -> low` effort clamp (XAI_REASONING_EFFORT_MAP) is merged +// only onto effort-capable rows. Off-allowlist reasoners omit the wire +// param, so a map on those specs is dead weight. // The effort-dial pair (`supportsReasoningEffort`/`omitReasoningEffort`) is // authoritative: a stale flag on `base` (previous snapshot or dynamic fetch) // must not outlive an allowlist change in identity/family.ts. @@ -1436,13 +1438,17 @@ function mergeCuratedIntoModel( const effortCapable = curated.supportsReasoningEffort ?? isGrokReasoningEffortCapable(curated.id); const compat = { ...(base.compat ?? {}), - reasoningEffortMap: { ...XAI_REASONING_EFFORT_MAP, ...(base.compat?.reasoningEffortMap ?? {}) }, includeEncryptedReasoning: base.compat?.includeEncryptedReasoning ?? true, filterReasoningHistory: false, supportsImageDetailOriginal: base.compat?.supportsImageDetailOriginal ?? false, omitReasoningEffort: !effortCapable, supportsReasoningEffort: effortCapable, }; + if (effortCapable) { + compat.reasoningEffortMap = { ...XAI_REASONING_EFFORT_MAP, ...(base.compat?.reasoningEffortMap ?? {}) }; + } else { + delete compat.reasoningEffortMap; + } return { ...base, contextWindow: curated.contextWindow, diff --git a/packages/catalog/test/generated-policies.test.ts b/packages/catalog/test/generated-policies.test.ts index e26115a41..fcb33cdcf 100644 --- a/packages/catalog/test/generated-policies.test.ts +++ b/packages/catalog/test/generated-policies.test.ts @@ -496,8 +496,8 @@ describe("generated model policies", () => { expect(models[0]?.compat).toMatchObject({ supportsReasoningEffort: false, omitReasoningEffort: true, - reasoningEffortMap: { minimal: "low" }, }); + expect(models[0]?.compat).not.toHaveProperty("reasoningEffortMap"); expect(models[1]?.thinking?.efforts).toEqual([Effort.Minimal, Effort.Low, Effort.Medium, Effort.High]); expect(models[1]?.compat?.supportsReasoningEffort).toBe(true); // Non-xAI hosts are outside this policy — no baked no-dial compat. diff --git a/packages/catalog/test/xai-responses-thinking-policy.test.ts b/packages/catalog/test/xai-responses-thinking-policy.test.ts index 26b8824f4..0217a5271 100644 --- a/packages/catalog/test/xai-responses-thinking-policy.test.ts +++ b/packages/catalog/test/xai-responses-thinking-policy.test.ts @@ -73,13 +73,14 @@ describe("paid xAI Responses thinking policy", () => { expect(byId[id]?.compat, id).toMatchObject({ supportsReasoningEffort: false, omitReasoningEffort: true, - reasoningEffortMap: { minimal: "low" }, }); + expect(byId[id]?.compat, id).not.toHaveProperty("reasoningEffortMap"); } expect(byId["grok-2"]?.compat).toMatchObject({ supportsReasoningEffort: false, omitReasoningEffort: true, }); + expect(byId["grok-2"]?.compat).not.toHaveProperty("reasoningEffortMap"); }); it("strips stale thinking dials from off-allowlist paid xAI reasoners during generation", () => {