fix(catalog): omit reasoningEffortMap on no-dial xAI rows

The clamp map is only used when reasoning.effort is sent. Drop it from
catalog rows that set omitReasoningEffort so the exported snapshot does
not advertise a dead mapping.
This commit is contained in:
Yang Yang
2026-08-09 22:44:06 -07:00
parent 09830d2bd6
commit 76faddf886
6 changed files with 35 additions and 151 deletions
+1
View File
@@ -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
@@ -354,7 +354,7 @@ export function applyOllamaCloudOutputCap(models: ModelSpec<Api>[]): void {
}
function applyGeneratedModelPolicy(model: ModelSpec<Api>): 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;
}
+9 -133
View File
@@ -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,
@@ -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,
@@ -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.
@@ -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", () => {