@@ -38,14 +38,15 @@ export type DeepSeekAssistantMessage = AssistantMessage & {
3838 */
3939export function convertToR1Format (
4040 messages : AnthropicMessage [ ] ,
41- options ?: { mergeToolResultText ?: boolean } ,
41+ options ?: { mergeToolResultText ?: boolean ; requireReasoningContentForToolCalls ?: boolean } ,
4242) : Message [ ] {
4343 const result : Message [ ] = [ ]
4444
4545 for ( const message of messages ) {
4646 // Check if the message has reasoning_content (for DeepSeek interleaved thinking)
4747 const messageWithReasoning = message as AnthropicMessage & { reasoning_content ?: string }
4848 const reasoningContent = messageWithReasoning . reasoning_content
49+ const hasReasoningContent = typeof reasoningContent === "string"
4950
5051 if ( message . role === "user" ) {
5152 // Handle user messages - may contain tool_result blocks
@@ -187,15 +188,21 @@ export function convertToR1Format(
187188 }
188189 }
189190
190- // Use reasoning from content blocks if not provided at top level
191- const finalReasoning = reasoningContent || extractedReasoning
191+ // Use reasoning from content blocks if not provided at top level.
192+ // Empty reasoning_content is meaningful for DeepSeek thinking-mode tool call continuations.
193+ const finalReasoning = hasReasoningContent ? reasoningContent : extractedReasoning
194+ const needsEmptyToolCallReasoning =
195+ options ?. requireReasoningContentForToolCalls === true &&
196+ toolCalls . length > 0 &&
197+ typeof finalReasoning !== "string"
198+ const shouldAttachReasoning = typeof finalReasoning === "string" || needsEmptyToolCallReasoning
192199
193200 const assistantMessage : DeepSeekAssistantMessage = {
194201 role : "assistant" ,
195202 content : textParts . length > 0 ? textParts . join ( "\n" ) : null ,
196203 ...( toolCalls . length > 0 && { tool_calls : toolCalls } ) ,
197204 // Preserve reasoning_content for DeepSeek interleaved thinking
198- ...( finalReasoning && { reasoning_content : finalReasoning } ) ,
205+ ...( shouldAttachReasoning && { reasoning_content : finalReasoning ?? "" } ) ,
199206 }
200207
201208 // Check if we can merge with the last message (only if no tool calls)
@@ -209,8 +216,8 @@ export function convertToR1Format(
209216 lastMessage . content = `${ lastContent } \n${ assistantMessage . content } `
210217 }
211218 // Preserve reasoning_content from the new message if present
212- if ( finalReasoning ) {
213- ; ( lastMessage as DeepSeekAssistantMessage ) . reasoning_content = finalReasoning
219+ if ( shouldAttachReasoning ) {
220+ ; ( lastMessage as DeepSeekAssistantMessage ) . reasoning_content = finalReasoning ?? ""
214221 }
215222 } else {
216223 result . push ( assistantMessage )
@@ -225,14 +232,14 @@ export function convertToR1Format(
225232 lastMessage . content = message . content
226233 }
227234 // Preserve reasoning_content from the new message if present
228- if ( reasoningContent ) {
235+ if ( hasReasoningContent ) {
229236 ; ( lastMessage as DeepSeekAssistantMessage ) . reasoning_content = reasoningContent
230237 }
231238 } else {
232239 const assistantMessage : DeepSeekAssistantMessage = {
233240 role : "assistant" ,
234241 content : message . content ,
235- ...( reasoningContent && { reasoning_content : reasoningContent } ) ,
242+ ...( hasReasoningContent && { reasoning_content : reasoningContent } ) ,
236243 }
237244 result . push ( assistantMessage )
238245 }
0 commit comments