From c75ad2fd11b039a0dc133801df6e650a41f94fb2 Mon Sep 17 00:00:00 2001 From: Umesh Yadav <23421535+imumesh18@users.noreply.github.com> Date: Mon, 9 Jun 2025 14:40:55 +0530 Subject: [PATCH] language_models: Add thinking support to DeepSeek provider (#32338) For DeepSeek provider thinking is returned as reasoning_content and we don't have to send the reasoning_content back in the request. Release Notes: - Add thinking support to DeepSeek provider --- .../language_models/src/provider/deepseek.rs | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/crates/language_models/src/provider/deepseek.rs b/crates/language_models/src/provider/deepseek.rs index d52a233f78..6a16ec019f 100644 --- a/crates/language_models/src/provider/deepseek.rs +++ b/crates/language_models/src/provider/deepseek.rs @@ -372,15 +372,15 @@ pub fn into_deepseek( for message in request.messages { for content in message.content { match content { - MessageContent::Text(text) | MessageContent::Thinking { text, .. } => messages - .push(match message.role { - Role::User => deepseek::RequestMessage::User { content: text }, - Role::Assistant => deepseek::RequestMessage::Assistant { - content: Some(text), - tool_calls: Vec::new(), - }, - Role::System => deepseek::RequestMessage::System { content: text }, - }), + MessageContent::Text(text) => messages.push(match message.role { + Role::User => deepseek::RequestMessage::User { content: text }, + Role::Assistant => deepseek::RequestMessage::Assistant { + content: Some(text), + tool_calls: Vec::new(), + }, + Role::System => deepseek::RequestMessage::System { content: text }, + }), + MessageContent::Thinking { .. } => {} MessageContent::RedactedThinking(_) => {} MessageContent::Image(_) => {} MessageContent::ToolUse(tool_use) => { @@ -485,6 +485,13 @@ impl DeepSeekEventMapper { events.push(Ok(LanguageModelCompletionEvent::Text(content))); } + if let Some(reasoning_content) = choice.delta.reasoning_content.clone() { + events.push(Ok(LanguageModelCompletionEvent::Thinking { + text: reasoning_content, + signature: None, + })); + } + if let Some(tool_calls) = choice.delta.tool_calls.as_ref() { for tool_call in tool_calls { let entry = self.tool_calls_by_index.entry(tool_call.index).or_default();