diff --git a/tests/test_providers.py b/tests/test_providers.py index c658ebbd..2cef427f 100644 --- a/tests/test_providers.py +++ b/tests/test_providers.py @@ -1265,6 +1265,33 @@ class TestAnthropicHelpers: assert caps.token_param == "max_tokens" assert caps.thinking_mode == "adaptive" + def test_capabilities_opus_4_8(self) -> None: + from turnstone.core.providers._anthropic import AnthropicProvider + + provider = AnthropicProvider() + caps = provider.get_capabilities("claude-opus-4-8") + assert caps.context_window == 1000000 + assert caps.max_output_tokens == 128000 + assert caps.thinking_mode == "adaptive" + assert caps.supports_effort is True + assert "xhigh" in caps.effort_levels + assert "max" in caps.effort_levels + assert caps.supports_temperature is False + assert caps.thinking_display == "summarized" + assert caps.supports_web_search is True + assert caps.supports_tool_search is True + assert caps.supports_vision is True + assert caps.supports_reasoning_replay is True + + def test_capabilities_opus_4_8_dated(self) -> None: + from turnstone.core.providers._anthropic import AnthropicProvider + + provider = AnthropicProvider() + caps = provider.get_capabilities("claude-opus-4-8-20260601") + assert caps.context_window == 1000000 + assert caps.supports_temperature is False + assert caps.thinking_display == "summarized" + def test_capabilities_opus_4_7(self) -> None: from turnstone.core.providers._anthropic import AnthropicProvider diff --git a/turnstone.example.toml b/turnstone.example.toml index 3b3d9aa1..5c5b976f 100644 --- a/turnstone.example.toml +++ b/turnstone.example.toml @@ -54,7 +54,7 @@ # supports_web_search = false # # [models.claude] -# name = "claude-opus-4-7" +# name = "claude-opus-4-8" # provider = "anthropic" # --- Database (turnstone, node, console) --- diff --git a/turnstone/core/providers/_anthropic.py b/turnstone/core/providers/_anthropic.py index 063a46c8..c78daf76 100644 --- a/turnstone/core/providers/_anthropic.py +++ b/turnstone/core/providers/_anthropic.py @@ -85,6 +85,20 @@ _ANTHROPIC_DEFAULT = ModelCapabilities( ) _ANTHROPIC_CAPABILITIES: dict[str, ModelCapabilities] = { + "claude-opus-4-8": ModelCapabilities( + context_window=1000000, + max_output_tokens=128000, + token_param="max_tokens", + thinking_mode="adaptive", + supports_effort=True, + effort_levels=("low", "medium", "high", "xhigh", "max"), + supports_web_search=True, + supports_tool_search=True, + supports_vision=True, + supports_temperature=False, + thinking_display="summarized", + supports_reasoning_replay=True, + ), "claude-opus-4-7": ModelCapabilities( context_window=1000000, max_output_tokens=128000, @@ -311,7 +325,7 @@ class AnthropicProvider: kwargs["tools"] = anthropic_tools kwargs.update(thinking_params) - # Effort param for models that support it (Opus 4.7, Opus 4.6, Sonnet 4.6, Opus 4.5) + # Effort param for models that support it (Opus 4.8, Opus 4.7, Opus 4.6, Sonnet 4.6, Opus 4.5) if caps.supports_effort and reasoning_effort: effort = _map_reasoning_to_effort(reasoning_effort, caps.effort_levels) if effort: