diff --git a/crates/anthropic/src/anthropic.rs b/crates/anthropic/src/anthropic.rs index ac94daba71..269edbea7e 100644 --- a/crates/anthropic/src/anthropic.rs +++ b/crates/anthropic/src/anthropic.rs @@ -764,8 +764,20 @@ pub enum ToolChoice { #[derive(Debug, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "lowercase")] pub enum Thinking { - Enabled { budget_tokens: Option }, - Adaptive, + Enabled { + budget_tokens: Option, + }, + Adaptive { + #[serde(default, skip_serializing_if = "Option::is_none")] + display: Option, + }, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "lowercase")] +pub enum AdaptiveThinkingDisplay { + Omitted, + Summarized, } #[derive(Debug, Clone, Copy, Serialize, Deserialize, EnumString)] diff --git a/crates/anthropic/src/completion.rs b/crates/anthropic/src/completion.rs index 16bb5012e5..7bb4821cc7 100644 --- a/crates/anthropic/src/completion.rs +++ b/crates/anthropic/src/completion.rs @@ -11,9 +11,9 @@ use std::pin::Pin; use std::str::FromStr; use crate::{ - AnthropicError, AnthropicModelMode, CacheControl, CacheControlType, ContentDelta, Event, - ImageSource, Message, RequestContent, ResponseContent, StringOrContents, Thinking, Tool, - ToolChoice, ToolResultContent, ToolResultPart, Usage, + AdaptiveThinkingDisplay, AnthropicError, AnthropicModelMode, CacheControl, CacheControlType, + ContentDelta, Event, ImageSource, Message, RequestContent, ResponseContent, StringOrContents, + Thinking, Tool, ToolChoice, ToolResultContent, ToolResultPart, Usage, }; fn to_anthropic_content(content: MessageContent) -> Option { @@ -180,7 +180,9 @@ pub fn into_anthropic( AnthropicModelMode::Thinking { budget_tokens } => { Some(Thinking::Enabled { budget_tokens }) } - AnthropicModelMode::AdaptiveThinking => Some(Thinking::Adaptive), + AnthropicModelMode::AdaptiveThinking => Some(Thinking::Adaptive { + display: Some(AdaptiveThinkingDisplay::Summarized), + }), AnthropicModelMode::Default => None, } } else { diff --git a/crates/bedrock/src/bedrock.rs b/crates/bedrock/src/bedrock.rs index 12db814d3a..a3f60fd7b5 100644 --- a/crates/bedrock/src/bedrock.rs +++ b/crates/bedrock/src/bedrock.rs @@ -58,8 +58,13 @@ pub async fn stream_completion( additional_fields.insert("thinking".to_string(), Document::from(thinking_config)); } Some(Thinking::Adaptive { effort: _ }) => { - let thinking_config = - HashMap::from([("type".to_string(), Document::String("adaptive".to_string()))]); + let thinking_config = HashMap::from([ + ("type".to_string(), Document::String("adaptive".to_string())), + ( + "display".to_string(), + Document::String("summarized".to_string()), + ), + ]); additional_fields.insert("thinking".to_string(), Document::from(thinking_config)); } _ => {} diff --git a/crates/language_models/src/provider/copilot_chat.rs b/crates/language_models/src/provider/copilot_chat.rs index ef9fbae113..db50f5161e 100644 --- a/crates/language_models/src/provider/copilot_chat.rs +++ b/crates/language_models/src/provider/copilot_chat.rs @@ -365,7 +365,9 @@ impl LanguageModel for CopilotChatLanguageModel { if model.supports_adaptive_thinking() { if anthropic_request.thinking.is_some() { - anthropic_request.thinking = Some(anthropic::Thinking::Adaptive); + anthropic_request.thinking = Some(anthropic::Thinking::Adaptive { + display: Some(anthropic::AdaptiveThinkingDisplay::Summarized), + }); anthropic_request.output_config = effort.map(|effort| anthropic::OutputConfig { effort: Some(effort), diff --git a/crates/language_models_cloud/src/language_models_cloud.rs b/crates/language_models_cloud/src/language_models_cloud.rs index adae72068c..da5659bf50 100644 --- a/crates/language_models_cloud/src/language_models_cloud.rs +++ b/crates/language_models_cloud/src/language_models_cloud.rs @@ -408,7 +408,9 @@ impl LanguageModel for CloudLanguageModel