diff --git a/crates/language_models/src/provider/cloud.rs b/crates/language_models/src/provider/cloud.rs index ae344bb245d47ddb378d9b0ec3f26dc6c40c2b67..b91ee734d364dd878872eec5eb41a3ba29e9881f 100644 --- a/crates/language_models/src/provider/cloud.rs +++ b/crates/language_models/src/provider/cloud.rs @@ -747,13 +747,14 @@ impl LanguageModel for CloudLanguageModel { } else { thinking_allowed && self.model.id.0.ends_with("-thinking") }; - let effort = request - .thinking_effort - .as_ref() - .and_then(|effort| anthropic::Effort::from_str(effort).ok()); let provider_name = provider_name(&self.model.provider); match self.model.provider { cloud_llm_client::LanguageModelProvider::Anthropic => { + let effort = request + .thinking_effort + .as_ref() + .and_then(|effort| anthropic::Effort::from_str(effort).ok()); + let mut request = into_anthropic( request, self.model.id.to_string(), @@ -811,8 +812,12 @@ impl LanguageModel for CloudLanguageModel { cloud_llm_client::LanguageModelProvider::OpenAi => { let client = self.client.clone(); let llm_api_token = self.llm_api_token.clone(); + let effort = request + .thinking_effort + .as_ref() + .and_then(|effort| open_ai::ReasoningEffort::from_str(effort).ok()); - let request = into_open_ai_response( + let mut request = into_open_ai_response( request, &self.model.id.0, self.model.supports_parallel_tool_calls, @@ -820,6 +825,11 @@ impl LanguageModel for CloudLanguageModel { None, None, ); + + if enable_thinking && let Some(effort) = effort { + request.reasoning = Some(open_ai::responses::ReasoningConfig { effort }); + } + let future = self.request_limiter.stream(async move { let PerformLlmCompletionResponse { response, diff --git a/crates/settings_content/src/language_model.rs b/crates/settings_content/src/language_model.rs index 020383ac98e8af34545eb46279d98a22d979fe86..88f5b1b985756f9c25074591b0146f2ccc715f3c 100644 --- a/crates/settings_content/src/language_model.rs +++ b/crates/settings_content/src/language_model.rs @@ -2,6 +2,7 @@ use collections::HashMap; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings_macros::{MergeFrom, with_fallible_options}; +use strum::EnumString; use std::sync::Arc; @@ -212,13 +213,15 @@ pub struct OpenAiAvailableModel { pub capabilities: OpenAiModelCapabilities, } -#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, JsonSchema, MergeFrom)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, EnumString, JsonSchema, MergeFrom)] #[serde(rename_all = "lowercase")] +#[strum(serialize_all = "lowercase")] pub enum OpenAiReasoningEffort { Minimal, Low, Medium, High, + XHigh, } #[with_fallible_options]