From e2b69a0bb1cf6ae7a641f478bfa4cfc9979dd37f Mon Sep 17 00:00:00 2001 From: Apoorv Saxena Date: Wed, 13 May 2026 19:16:26 +0530 Subject: [PATCH] fix(ai): mark inception/mercury-2 thinkingLevelMap.off as null Mercury 2 in instant mode (reasoning_effort: "none") disables tool calling. The openai-completions provider hardcodes {reasoning:{effort:"none"}} when no explicit reasoning level is passed and thinkingLevelMap.off isn't null (openai-completions.ts:575), so every caller that doesn't opt in to a level silently breaks Mercury 2's agentic use cases. Setting thinkingLevelMap.off = null on the Mercury 2 catalog entry causes the provider to omit the reasoning param entirely, letting Mercury 2's own default take over. Low/medium/high pass through verbatim; OpenRouter normalizes them to Mercury's vocabulary. Prefix-matched on "inception/mercury-2" so future Mercury 2 variants on OpenRouter inherit the fix. --- packages/ai/CHANGELOG.md | 1 + packages/ai/scripts/generate-models.ts | 7 +++++++ packages/ai/src/models.generated.ts | 1 + 3 files changed, 9 insertions(+) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 2be28e9b8..7063ce82a 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -10,6 +10,7 @@ - Fixed GitHub Copilot Claude test coverage to use the current Claude Sonnet 4.6 model ID. - Fixed OpenAI Responses requests for models that support disabling reasoning to send `reasoning.effort: "none"` when thinking is off. +- Fixed Inception Mercury 2 tool calling on OpenRouter by marking `off` as unsupported in `thinkingLevelMap`, so the openai-completions provider omits the reasoning param instead of defaulting to `{reasoning:{effort:"none"}}` (which puts Mercury 2 in instant mode, disabling tool calls). ## [0.74.0] - 2026-05-07 diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index 798d059c3..72858c4e8 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -240,6 +240,13 @@ function applyThinkingLevelMetadata(model: Model): void { if (model.provider === "openai-codex" && model.id === "gpt-5.1-codex-mini") { mergeThinkingLevelMap(model, { minimal: "medium", low: "medium", medium: "medium", high: "high" }); } + if (model.provider === "openrouter" && model.id.startsWith("inception/mercury-2")) { + // Mercury 2 in instant mode (reasoning_effort: "none") disables tool calling. + // Mark "off" unsupported so the openai-completions provider omits the reasoning param + // instead of defaulting to {reasoning:{effort:"none"}} (see openai-completions.ts:575). + // Pi's low/medium/high pass through verbatim; OpenRouter normalizes to Mercury's vocabulary. + mergeThinkingLevelMap(model, { off: null }); + } } function getAnthropicMessagesCompat(provider: string, modelId: string): AnthropicMessagesCompat | undefined { diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index 69559c781..5c3b60714 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -9731,6 +9731,7 @@ export const MODELS = { provider: "openrouter", baseUrl: "https://openrouter.ai/api/v1", reasoning: true, + thinkingLevelMap: {"off":null}, input: ["text"], cost: { input: 0.25,