From caafac04526d9c2c4ad89f0974da626ec764a927 Mon Sep 17 00:00:00 2001 From: Agustin Torres Date: Mon, 26 Oct 2026 23:38:03 -0300 Subject: [PATCH] fix(wizard): replace retired Claude Sonnet 4 default with claude-sonnet-5-5 (#7585) * fix(wizard): replace retired Claude Sonnet 4 default with claude-sonnet-5-5 The setup wizard's Anthropic default model is now `claude-sonnet-5-5` instead of the retired `claude-sonnet-4-20250514`. A new per-model `model_omitted_config` field makes the wizard leave out the extended-thinking (`budget_tokens`) and thinking-disabled templates for that model only, since Sonnet 5.5 rejects them; the other Claude models are unchanged. The Anthropic examples in `config.example.yaml` and `configuration.mdx` (which used `claude-3-5-sonnet-20241022`) now use `claude-sonnet-5-5` without those settings, and the change also adds a regression test and a CHANGELOG entry. Notice anthropic-retired-models-2026-10-27 about api.anthropic.com's API describes the change. It was read from a file and is not signed by the provider. * Update CHANGELOG with PR reference #7585 Added a reference to pull request #7585 in the CHANGELOG. --------- Co-authored-by: Willem Jiang --- CHANGELOG.md | 8 ++++++ backend/tests/test_setup_wizard.py | 14 +++++++++++ config.example.yaml | 25 ++++++------------- .../content/en/application/configuration.mdx | 11 ++------ scripts/wizard/providers.py | 13 +++++++--- 5 files changed, 42 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3187695341..7650a8c602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1428,6 +1428,13 @@ As of 2026-10-21, the milestone includes **829 merged pull requests**. stalling other runs, requests and streams meanwhile. They now read the config once per call in a worker, as image search already did. ([#7580]) +- **wizard:** The setup wizard's Anthropic default model is now + `claude-sonnet-5-5` instead of the retired `claude-sonnet-4-20250514`, which + the Claude API no longer accepts. For that model the wizard leaves out the + extended-thinking (`budget_tokens`) and thinking-disabled templates it + rejects. The Anthropic examples in `config.example.yaml` and the + configuration docs follow the same model.([#7585]) + - **auth:** The public auth routes (`/register`, `/setup-status`, `/providers`, `/oauth/{provider}` and `/callback/{provider}`) no longer read `config.yaml` and `extensions_config.json` on the event loop. Each request @@ -13177,5 +13184,6 @@ with **180 merged pull requests** since the first 2.0 milestone tag. [#7560]: https://github.com/bytedance/deer-flow/pull/7560 [#7576]: https://github.com/bytedance/deer-flow/pull/7576 [#7580]: https://github.com/bytedance/deer-flow/pull/7580 +[#7585]: https://github.com/bytedance/deer-flow/pull/7585 [#7588]: https://github.com/bytedance/deer-flow/pull/7588 [#7591]: https://github.com/bytedance/deer-flow/pull/7591 diff --git a/backend/tests/test_setup_wizard.py b/backend/tests/test_setup_wizard.py index 84f6b8a473..4078b9faff 100644 --- a/backend/tests/test_setup_wizard.py +++ b/backend/tests/test_setup_wizard.py @@ -147,6 +147,20 @@ class TestProviders: # Override must not mutate the shared provider-level config. assert provider.extra_config["supports_vision"] is True + def test_anthropic_sonnet_5_5_omits_rejected_thinking_templates(self): + """Sonnet 5.5 rejects budget_tokens and thinking disabled; other Claude models keep them.""" + providers = {provider.name: provider for provider in LLM_PROVIDERS} + anthropic = providers["anthropic"] + assert anthropic.default_model == "claude-sonnet-5-5" + + config = anthropic.extra_config_for("claude-sonnet-5-5") + assert "when_thinking_enabled" not in config + assert "when_thinking_disabled" not in config + + assert anthropic.extra_config_for("claude-sonnet-4-5")["when_thinking_enabled"]["thinking"]["budget_tokens"] == 4096 + # Omission must not mutate the shared provider-level config. + assert "when_thinking_enabled" in anthropic.extra_config + def test_extra_config_for_returns_provider_config_without_override(self): """Providers without per-model overrides return their config unchanged.""" providers = {provider.name: provider for provider in LLM_PROVIDERS} diff --git a/config.example.yaml b/config.example.yaml index 84adfa82e0..b4d17baa84 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -396,29 +396,20 @@ models: # for example on Docker Desktop: # base_url: http://host.docker.internal:8080/v1 - # Example: Anthropic Claude model (with extended thinking) - # supports_thinking: true is required — without it, DeerFlow silently falls - # back to non-thinking mode even when the UI thinking toggle is on. - # budget_tokens is required by the Anthropic API when thinking.type=enabled - # (no server default; min 1024; must be less than max_tokens). - # - name: claude-sonnet-4 - # display_name: Claude Sonnet 4 + # Example: Anthropic Claude model (thinks by default) + # Claude Sonnet 5.5 rejects extended thinking (budget_tokens), thinking + # type disabled, temperature, top_p and top_k, so leave them out. + # max_tokens covers both thinking and the answer. + # - name: claude-sonnet-5-5 + # display_name: Claude Sonnet 5.5 # use: langchain_anthropic:ChatAnthropic - # model: claude-sonnet-4-20250514 + # model: claude-sonnet-5-5 # api_key: $ANTHROPIC_API_KEY # default_request_timeout: 600.0 # max_retries: 2 - # max_tokens: 16000 # Per-call output cap + # max_tokens: 16000 # Per-call output cap (thinking + answer) # context_window: 200000 # Total prompt + completion capacity # supports_vision: true - # supports_thinking: true - # when_thinking_enabled: - # thinking: - # type: enabled - # budget_tokens: 4096 # required; min 1024; must be < max_tokens - # when_thinking_disabled: - # thinking: - # type: disabled # Example: Google Gemini model (native SDK, no thinking support) # - name: gemini-2.5-pro diff --git a/frontend/src/content/en/application/configuration.mdx b/frontend/src/content/en/application/configuration.mdx index bf21424e55..43bf3ffd71 100644 --- a/frontend/src/content/en/application/configuration.mdx +++ b/frontend/src/content/en/application/configuration.mdx @@ -48,21 +48,14 @@ models: ```yaml models: - - name: claude-3-5-sonnet + - name: claude-sonnet-5-5 use: langchain_anthropic:ChatAnthropic - model: claude-3-5-sonnet-20241022 + model: claude-sonnet-5-5 api_key: $ANTHROPIC_API_KEY default_request_timeout: 600.0 max_retries: 2 max_tokens: 8192 supports_vision: true - supports_thinking: true - when_thinking_enabled: - thinking: - type: enabled - when_thinking_disabled: - thinking: - type: disabled ``` diff --git a/scripts/wizard/providers.py b/scripts/wizard/providers.py index 968e072854..21d9f41d8e 100644 --- a/scripts/wizard/providers.py +++ b/scripts/wizard/providers.py @@ -23,6 +23,9 @@ class LLMProvider: # capability (e.g. MiniMax M3 supports vision but M2.7 is text-only). The # provider-level extra_config holds the default (default_model) capability. model_vision_overrides: dict[str, bool] = field(default_factory=dict) + # Per-model extra_config keys to leave out for models whose API rejects + # them (e.g. Claude Sonnet 5.5 rejects budget_tokens and thinking disabled). + model_omitted_config: dict[str, tuple[str, ...]] = field(default_factory=dict) auth_hint: str | None = None base_url_prompt: str | None = None model_prompt: str | None = None @@ -38,6 +41,8 @@ class LLMProvider: config = dict(self.extra_config) if model_name in self.model_vision_overrides: config["supports_vision"] = self.model_vision_overrides[model_name] + for key in self.model_omitted_config.get(model_name, ()): + config.pop(key, None) return config @@ -256,10 +261,10 @@ LLM_PROVIDERS: list[LLMProvider] = [ LLMProvider( name="anthropic", display_name="Anthropic", - description="Claude Sonnet 4 with extended thinking", + description="Claude Sonnet 5.5 with thinking", use="langchain_anthropic:ChatAnthropic", - models=["claude-sonnet-4-20250514", "claude-opus-4-5", "claude-sonnet-4-5"], - default_model="claude-sonnet-4-20250514", + models=["claude-sonnet-5-5", "claude-opus-4-5", "claude-sonnet-4-5"], + default_model="claude-sonnet-5-5", env_var="ANTHROPIC_API_KEY", package="langchain-anthropic", extra_config={ @@ -269,6 +274,8 @@ LLM_PROVIDERS: list[LLMProvider] = [ "supports_vision": True, **ANTHROPIC_THINKING_CONFIG, }, + # Sonnet 5.5 thinks by default and rejects budget_tokens and thinking disabled. + model_omitted_config={"claude-sonnet-5-5": ("when_thinking_enabled", "when_thinking_disabled")}, ), LLMProvider( name="deepseek",