diff --git a/crates/language_models/src/provider/deepseek.rs b/crates/language_models/src/provider/deepseek.rs index e27bd510dbb0b0f518e615e31fc194675a5c3cfe..bd2469d865fd8421d6ad31208e6a4be413c0fe14 100644 --- a/crates/language_models/src/provider/deepseek.rs +++ b/crates/language_models/src/provider/deepseek.rs @@ -331,15 +331,25 @@ pub fn into_deepseek( for message in request.messages { for content in message.content { match content { - 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(), - reasoning_content: current_reasoning.take(), - }, - Role::System => deepseek::RequestMessage::System { content: text }, - }), + MessageContent::Text(text) => { + let should_add = if message.role == Role::User { + !text.trim().is_empty() + } else { + !text.is_empty() + }; + + if should_add { + messages.push(match message.role { + Role::User => deepseek::RequestMessage::User { content: text }, + Role::Assistant => deepseek::RequestMessage::Assistant { + content: Some(text), + tool_calls: Vec::new(), + reasoning_content: current_reasoning.take(), + }, + Role::System => deepseek::RequestMessage::System { content: text }, + }); + } + } MessageContent::Thinking { text, .. } => { // Accumulate reasoning content for next assistant message current_reasoning.get_or_insert_default().push_str(&text); @@ -445,7 +455,9 @@ impl DeepSeekEventMapper { }; let mut events = Vec::new(); - if let Some(content) = choice.delta.content.clone() { + if let Some(content) = choice.delta.content.clone() + && !content.is_empty() + { events.push(Ok(LanguageModelCompletionEvent::Text(content))); }