diff --git a/crates/agent_ui/src/agent_panel.rs b/crates/agent_ui/src/agent_panel.rs index 4fb5acc10b32f7bd9aa324deb8a981aedeff6dcb..91b8f29638f12aaef4f7da22646b8d84dd84657a 100644 --- a/crates/agent_ui/src/agent_panel.rs +++ b/crates/agent_ui/src/agent_panel.rs @@ -1496,6 +1496,10 @@ impl AgentPanel { { update_settings_file(self.fs.clone(), cx, move |settings, _| { let provider = model.provider_id().0.to_string(); + let enable_thinking = model.supports_thinking(); + let effort = model + .default_effort_level() + .map(|effort| effort.value.to_string()); let model = model.id().0.to_string(); settings .agent @@ -1503,8 +1507,8 @@ impl AgentPanel { .set_model(LanguageModelSelection { provider: LanguageModelProviderSetting(provider), model, - enable_thinking: false, - effort: None, + enable_thinking, + effort, }) }); } diff --git a/crates/language_models/src/provider/anthropic.rs b/crates/language_models/src/provider/anthropic.rs index 61060a093aff9f69b19c9696d85debb82bc068ca..a4694beb78744bdca8ee05fb6abd3344163e830f 100644 --- a/crates/language_models/src/provider/anthropic.rs +++ b/crates/language_models/src/provider/anthropic.rs @@ -515,6 +515,10 @@ impl LanguageModel for AnthropicModel { } } + fn supports_thinking(&self) -> bool { + matches!(self.model.mode(), AnthropicModelMode::Thinking { .. }) + } + fn telemetry_id(&self) -> String { format!("anthropic/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/bedrock.rs b/crates/language_models/src/provider/bedrock.rs index 1e6596fa318115d40bab2d6151f1ae51d8be537b..0f6a3cc152ae229eb2770057b5249e9bac80614d 100644 --- a/crates/language_models/src/provider/bedrock.rs +++ b/crates/language_models/src/provider/bedrock.rs @@ -640,6 +640,13 @@ impl LanguageModel for BedrockModel { self.model.supports_images() } + fn supports_thinking(&self) -> bool { + matches!( + self.model.mode(), + BedrockModelMode::Thinking { .. } | BedrockModelMode::AdaptiveThinking { .. } + ) + } + fn supports_tool_choice(&self, choice: LanguageModelToolChoice) -> bool { match choice { LanguageModelToolChoice::Auto | LanguageModelToolChoice::Any => { diff --git a/crates/language_models/src/provider/google.rs b/crates/language_models/src/provider/google.rs index af91c9613ef2a9fbbf720480a0b526ef650f61d4..334a5cbe64e6cdefbaa7c15c309ca4632109e323 100644 --- a/crates/language_models/src/provider/google.rs +++ b/crates/language_models/src/provider/google.rs @@ -283,6 +283,10 @@ impl LanguageModel for GoogleLanguageModel { self.model.supports_images() } + fn supports_thinking(&self) -> bool { + matches!(self.model.mode(), GoogleModelMode::Thinking { .. }) + } + fn supports_tool_choice(&self, choice: LanguageModelToolChoice) -> bool { match choice { LanguageModelToolChoice::Auto diff --git a/crates/language_models/src/provider/ollama.rs b/crates/language_models/src/provider/ollama.rs index 27aa00c3f003cd002263875042ab50cf53417d43..b087d4886f2aad0c003a3da68f9a02bbbb6e9865 100644 --- a/crates/language_models/src/provider/ollama.rs +++ b/crates/language_models/src/provider/ollama.rs @@ -443,6 +443,10 @@ impl LanguageModel for OllamaLanguageModel { self.model.supports_vision.unwrap_or(false) } + fn supports_thinking(&self) -> bool { + self.model.supports_thinking.unwrap_or(false) + } + fn supports_tool_choice(&self, choice: LanguageModelToolChoice) -> bool { match choice { LanguageModelToolChoice::Auto => false, diff --git a/crates/language_models/src/provider/open_ai.rs b/crates/language_models/src/provider/open_ai.rs index a98dda194752dc74d896e3b76118453aa96e08a9..1de907004b897337ef3a99102ca34ea3f388ee87 100644 --- a/crates/language_models/src/provider/open_ai.rs +++ b/crates/language_models/src/provider/open_ai.rs @@ -327,6 +327,10 @@ impl LanguageModel for OpenAiLanguageModel { } } + fn supports_thinking(&self) -> bool { + self.model.reasoning_effort().is_some() + } + fn supports_split_token_display(&self) -> bool { true } diff --git a/crates/language_models/src/provider/open_router.rs b/crates/language_models/src/provider/open_router.rs index 1311471c534e8fef7f1739567b5a01133e02b1d0..a044c7c25d7858f69dc8c4ac9fa0c8bda73f6e91 100644 --- a/crates/language_models/src/provider/open_router.rs +++ b/crates/language_models/src/provider/open_router.rs @@ -314,6 +314,10 @@ impl LanguageModel for OpenRouterLanguageModel { self.model.supports_tool_calls() } + fn supports_thinking(&self) -> bool { + matches!(self.model.mode, OpenRouterModelMode::Thinking { .. }) + } + fn tool_input_format(&self) -> LanguageModelToolSchemaFormat { let model_id = self.model.id().trim().to_lowercase(); if model_id.contains("gemini") || model_id.contains("grok") {