From d77e92be488884ef0d72bf92283b6f9c225116db Mon Sep 17 00:00:00 2001 From: Devansh Jain <31609257+devanshrj@users.noreply.github.com> Date: Sun, 14 Dec 2025 14:25:35 -0800 Subject: [PATCH] chore: Update Anthropic token configs (#204) --- src/agent/modify.ts | 52 ++++++++++++++++++++++++--------------------- src/models.json | 26 ++++++++++++++++++----- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/agent/modify.ts b/src/agent/modify.ts index 7c29157..1653999 100644 --- a/src/agent/modify.ts +++ b/src/agent/modify.ts @@ -30,6 +30,8 @@ function buildModelSettings( const isGoogleVertex = modelHandle.startsWith("google_vertex/"); const isOpenRouter = modelHandle.startsWith("openrouter/"); + let settings: ModelSettings; + if (isOpenAI || isOpenRouter) { const openaiSettings: OpenAIModelSettings = { provider_type: "openai", @@ -45,30 +47,26 @@ function buildModelSettings( | "high", }; } - // If a max_output_tokens override is provided in the model's updateArgs, - // propagate it into the OpenAI model settings so the backend can raise - // the generation cap (prevents premature ResponseIncompleteEvent with - // reason='max_output_tokens'). - if (typeof updateArgs?.max_output_tokens === "number") { - openaiSettings.max_output_tokens = updateArgs.max_output_tokens as number; - } - return openaiSettings; - } - - if (isAnthropic) { + settings = openaiSettings; + } else if (isAnthropic) { const anthropicSettings: AnthropicModelSettings = { provider_type: "anthropic", parallel_tool_calls: true, }; - if (updateArgs?.enable_reasoner !== undefined) { + // Build thinking config if either enable_reasoner or max_reasoning_tokens is specified + if ( + updateArgs?.enable_reasoner !== undefined || + typeof updateArgs?.max_reasoning_tokens === "number" + ) { anthropicSettings.thinking = { - type: updateArgs.enable_reasoner ? "enabled" : "disabled", + type: updateArgs?.enable_reasoner === false ? "disabled" : "enabled", + ...(typeof updateArgs?.max_reasoning_tokens === "number" && { + budget_tokens: updateArgs.max_reasoning_tokens, + }), }; } - return anthropicSettings; - } - - if (isGoogleAI) { + settings = anthropicSettings; + } else if (isGoogleAI) { const googleSettings: GoogleAIModelSettings & { temperature?: number } = { provider_type: "google_ai", parallel_tool_calls: true, @@ -81,10 +79,8 @@ function buildModelSettings( if (typeof updateArgs?.temperature === "number") { googleSettings.temperature = updateArgs.temperature as number; } - return googleSettings; - } - - if (isGoogleVertex) { + settings = googleSettings; + } else if (isGoogleVertex) { // Vertex AI uses the same Google provider on the backend; only the handle differs. const googleVertexSettings: Record = { provider_type: "google_vertex", @@ -99,11 +95,19 @@ function buildModelSettings( (googleVertexSettings as Record).temperature = updateArgs.temperature as number; } - return googleVertexSettings; + settings = googleVertexSettings; + } else { + // For unknown providers, return generic settings with parallel_tool_calls + settings = { parallel_tool_calls: true }; } - // For unknown providers, return generic settings with parallel_tool_calls - return { parallel_tool_calls: true }; + // Apply max_output_tokens for all providers if specified + if (typeof updateArgs?.max_output_tokens === "number") { + (settings as Record).max_output_tokens = + updateArgs.max_output_tokens; + } + + return settings; } /** diff --git a/src/models.json b/src/models.json index 883774c..5a44bfe 100644 --- a/src/models.json +++ b/src/models.json @@ -6,7 +6,11 @@ "description": "The recommended default model (currently Sonnet 4.5)", "isDefault": true, "isFeatured": true, - "updateArgs": { "context_window": 180000 } + "updateArgs": { + "context_window": 180000, + "max_output_tokens": 64000, + "max_reasoning_tokens": 31999 + } }, { "id": "sonnet-4.5-no-reasoning", @@ -15,7 +19,8 @@ "description": "Sonnet 4.5 with extended thinking/reasoning explicitly disabled", "updateArgs": { "enable_reasoner": false, - "context_window": 180000 + "context_window": 180000, + "max_output_tokens": 64000 } }, { @@ -24,14 +29,22 @@ "label": "Claude Opus 4.5", "description": "Anthropic's newest flagship Opus 4.5 model", "isFeatured": true, - "updateArgs": { "context_window": 180000 } + "updateArgs": { + "context_window": 180000, + "max_output_tokens": 64000, + "max_reasoning_tokens": 31999 + } }, { "id": "opus-4.1", "handle": "anthropic/claude-opus-4-1-20250805", "label": "Claude Opus 4.1", "description": "Anthropic's previous version of Opus", - "updateArgs": { "context_window": 180000 } + "updateArgs": { + "context_window": 180000, + "max_output_tokens": 64000, + "max_reasoning_tokens": 31999 + } }, { "id": "haiku", @@ -39,7 +52,10 @@ "label": "Claude Haiku 4.5", "description": "Anthropic's fastest model", "isFeatured": true, - "updateArgs": { "context_window": 180000 } + "updateArgs": { + "context_window": 180000, + "max_output_tokens": 64000 + } }, { "id": "gpt-5-codex",