From efdb8c711a2107f4c0edf6925634904d2c1a6658 Mon Sep 17 00:00:00 2001 From: Test User Date: Sun, 18 Jan 2026 19:35:40 +0100 Subject: [PATCH] fix: correct ultrathink token budget from 64000 to 63999 The Claude API requires max_tokens >= budget + 1, so setting the budget to 63999 allows max_tokens to be set to 64000 (the API limit). This fixes potential API rejections when using ultrathink mode. Co-Authored-By: Claude Opus 4.5 --- apps/backend/phase_config.py | 2 +- apps/frontend/src/shared/constants/models.ts | 2 +- tests/test_thinking_level_validation.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/backend/phase_config.py b/apps/backend/phase_config.py index 0691ce75..e196613e 100644 --- a/apps/backend/phase_config.py +++ b/apps/backend/phase_config.py @@ -25,7 +25,7 @@ THINKING_BUDGET_MAP: dict[str, int | None] = { "low": 1024, "medium": 4096, # Moderate analysis "high": 16384, # Deep thinking for QA review - "ultrathink": 64000, # Maximum reasoning depth (within Claude API's 64000 token limit) + "ultrathink": 63999, # Maximum reasoning depth (API requires max_tokens >= budget + 1, so 63999 + 1 = 64000 limit) } # Spec runner phase-specific thinking levels diff --git a/apps/frontend/src/shared/constants/models.ts b/apps/frontend/src/shared/constants/models.ts index bcfcf8ce..72e76a0c 100644 --- a/apps/frontend/src/shared/constants/models.ts +++ b/apps/frontend/src/shared/constants/models.ts @@ -28,7 +28,7 @@ export const THINKING_BUDGET_MAP: Record = { low: 1024, medium: 4096, high: 16384, - ultrathink: 64000 // Maximum reasoning depth (Claude API hard limit) + ultrathink: 63999 // Maximum reasoning depth (API requires max_tokens >= budget + 1, so 63999 + 1 = 64000 limit) } as const; // ============================================ diff --git a/tests/test_thinking_level_validation.py b/tests/test_thinking_level_validation.py index 3f00d795..34da1a51 100644 --- a/tests/test_thinking_level_validation.py +++ b/tests/test_thinking_level_validation.py @@ -32,8 +32,8 @@ class TestThinkingLevelValidation: assert get_thinking_budget("none") is None def test_ultrathink_max_budget(self): - """Test that 'ultrathink' returns maximum budget (Claude API's 64000 token limit).""" - assert get_thinking_budget("ultrathink") == 64000 + """Test that 'ultrathink' returns maximum budget (63999 so max_tokens = 63999 + 1 = 64000 limit).""" + assert get_thinking_budget("ultrathink") == 63999 def test_invalid_level_logs_warning(self, caplog): """Test that invalid thinking level logs a warning.""" @@ -89,4 +89,4 @@ class TestThinkingLevelValidation: assert get_thinking_budget("low") == 1024 assert get_thinking_budget("medium") == 4096 assert get_thinking_budget("high") == 16384 - assert get_thinking_budget("ultrathink") == 64000 + assert get_thinking_budget("ultrathink") == 63999