From 756f88b98529644ce9ed0e0db28a7ce2963fb99e Mon Sep 17 00:00:00 2001 From: Sandipsinh Dilipsinh Rathod <62684960+ssddOnTop@users.noreply.github.com> Date: Tue, 9 Jun 2026 17:40:19 +0000 Subject: [PATCH] feat(anthropic): add support for claude mythos and fable models --- crates/forge_app/src/dto/anthropic/response.rs | 7 +++++++ .../src/transformers/model_specific_reasoning.rs | 2 ++ crates/forge_repo/src/provider/anthropic.rs | 4 +++- crates/forge_repo/src/provider/provider.json | 10 ++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/forge_app/src/dto/anthropic/response.rs b/crates/forge_app/src/dto/anthropic/response.rs index ba32540fe7..d964b05953 100644 --- a/crates/forge_app/src/dto/anthropic/response.rs +++ b/crates/forge_app/src/dto/anthropic/response.rs @@ -34,6 +34,8 @@ impl From for forge_domain::Model { || value.id.contains("claude-sonnet") || value.id.contains("claude-opus") || value.id.contains("claude-haiku") + || value.id.contains("claude-mythos") + || value.id.contains("claude-fable") { vec![ forge_domain::InputModality::Text, @@ -77,6 +79,11 @@ impl From for forge_domain::Model { /// header /// - Legacy models may have different context lengths fn get_context_length(model_id: &str) -> Option { + // Claude Mythos / Fable models (1M context) + if model_id.starts_with("claude-mythos") || model_id.starts_with("claude-fable") { + return Some(1_000_000); + } + // Current models (200K context) if model_id.starts_with("claude-sonnet-4-5-") || model_id.starts_with("claude-haiku-4-5-") diff --git a/crates/forge_app/src/transformers/model_specific_reasoning.rs b/crates/forge_app/src/transformers/model_specific_reasoning.rs index 8a98030adb..d003eb1719 100644 --- a/crates/forge_app/src/transformers/model_specific_reasoning.rs +++ b/crates/forge_app/src/transformers/model_specific_reasoning.rs @@ -31,6 +31,8 @@ impl ModelSpecificReasoning { || id.contains("48-opus") || id.contains("opus-4-7") || id.contains("47-opus") + || id.contains("mythos") + || id.contains("fable") { // Opus 4.8 shares Opus 4.7's API contract: adaptive thinking only // (legacy `budget_tokens` returns 400) and non-default sampling diff --git a/crates/forge_repo/src/provider/anthropic.rs b/crates/forge_repo/src/provider/anthropic.rs index d8c004b5b2..009568bcdb 100644 --- a/crates/forge_repo/src/provider/anthropic.rs +++ b/crates/forge_repo/src/provider/anthropic.rs @@ -101,7 +101,9 @@ fn interleaved_thinking_required(model: Option<&ModelId>) -> bool { !(id.contains("opus-4-8") || id.contains("opus-4-7") || id.contains("opus-4-6") - || id.contains("sonnet-4-6")) + || id.contains("sonnet-4-6") + || id.contains("mythos") + || id.contains("fable")) } impl Anthropic { diff --git a/crates/forge_repo/src/provider/provider.json b/crates/forge_repo/src/provider/provider.json index d4db7d3439..e01ef63a47 100644 --- a/crates/forge_repo/src/provider/provider.json +++ b/crates/forge_repo/src/provider/provider.json @@ -634,6 +634,16 @@ "response_type": "Anthropic", "url": "https://api.anthropic.com/v1/messages", "models": [ + { + "id": "claude-fable-5", + "name": "Claude Fable 5", + "description": "Most capable widely released model for demanding reasoning and agentic work", + "context_length": 1000000, + "tools_supported": true, + "supports_parallel_tool_calls": true, + "supports_reasoning": true, + "input_modalities": ["text", "image"] + }, { "id": "claude-opus-4-8", "name": "Claude Opus 4.8",