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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
Reference in New Issue
Block a user