From 0127caea7b215e0a64044a334d7b5097347dd854 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 28 May 2026 23:56:59 +0200 Subject: [PATCH] Fix OpenRouter DeepSeek V4 xhigh reasoning closes #4801 --- packages/ai/CHANGELOG.md | 1 + packages/ai/scripts/generate-models.ts | 9 ++++++--- packages/ai/src/models.generated.ts | 12 ++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index d5f1525f..f36c7543 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -9,6 +9,7 @@ ### Fixed +- Fixed OpenRouter DeepSeek V4 `xhigh` reasoning metadata to preserve OpenRouter's native effort instead of sending DeepSeek's `max` effort ([#4801](https://github.com/earendil-works/pi/issues/4801)). - Fixed OpenAI Codex Responses replay after switching from Anthropic extended-thinking sessions by generating unique fallback message item IDs for converted thinking/text blocks ([#5148](https://github.com/earendil-works/pi/issues/5148)). - Fixed Anthropic-compatible replay for providers that return empty thinking signatures by adding an opt-in `allowEmptySignature` compatibility flag ([#4464](https://github.com/earendil-works/pi/issues/4464)). - Fixed OpenAI and OpenRouter GPT-5.5 Pro thinking level metadata to expose only supported medium, high, and xhigh efforts. diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index fc4e2c3f..a8853ac5 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -245,7 +245,12 @@ function applyThinkingLevelMetadata(model: Model): void { mergeAnthropicMessagesCompat(model, { forceAdaptiveThinking: true }); } if (model.api === "openai-completions" && model.id.includes("deepseek-v4")) { - mergeThinkingLevelMap(model, DEEPSEEK_V4_THINKING_LEVEL_MAP); + mergeThinkingLevelMap( + model, + model.provider === "openrouter" + ? { ...DEEPSEEK_V4_THINKING_LEVEL_MAP, xhigh: "xhigh" } + : DEEPSEEK_V4_THINKING_LEVEL_MAP, + ); } if (isGoogleThinkingApi(model) && isGemini3ProModel(model.id)) { mergeThinkingLevelMap(model, { off: null, minimal: null, low: "LOW", medium: null, high: "HIGH" }); @@ -1520,11 +1525,9 @@ async function generateModels() { ? { requiresReasoningContentOnAssistantMessages: deepseekCompat.requiresReasoningContentOnAssistantMessages, - thinkingFormat: deepseekCompat.thinkingFormat, } : deepseekCompat), }; - mergeThinkingLevelMap(candidate, DEEPSEEK_V4_THINKING_LEVEL_MAP); } } diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index 8d95054a..79b97309 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -8813,9 +8813,9 @@ export const MODELS = { api: "openai-completions", provider: "openrouter", baseUrl: "https://openrouter.ai/api/v1", - compat: {"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"deepseek"}, + compat: {"requiresReasoningContentOnAssistantMessages":true}, reasoning: true, - thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"max"}, + thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh"}, input: ["text"], cost: { input: 0.09999999999999999, @@ -8832,9 +8832,9 @@ export const MODELS = { api: "openai-completions", provider: "openrouter", baseUrl: "https://openrouter.ai/api/v1", - compat: {"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"deepseek"}, + compat: {"requiresReasoningContentOnAssistantMessages":true}, reasoning: true, - thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"max"}, + thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh"}, input: ["text"], cost: { input: 0, @@ -8851,9 +8851,9 @@ export const MODELS = { api: "openai-completions", provider: "openrouter", baseUrl: "https://openrouter.ai/api/v1", - compat: {"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"deepseek"}, + compat: {"requiresReasoningContentOnAssistantMessages":true}, reasoning: true, - thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"max"}, + thinkingLevelMap: {"minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh"}, input: ["text"], cost: { input: 0.435,