From c6b9134df836b08f82d18788850b7efee5144125 Mon Sep 17 00:00:00 2001 From: Tlotli Mosalo Date: Sat, 16 May 2026 06:23:16 +0200 Subject: [PATCH] fix(deepseek): preserve reasoning_content in thinking mode for tool calls DeepSeek's thinking mode requires reasoning_content to be passed back in all subsequent requests when tool calls are involved. Without this, the API returns 400: 'The reasoning_content in the thinking mode must be passed back to the API.' Two fixes: - Text.php: Extract reasoning_content from raw response and include it in AssistantMessage.additionalContent for both tool call steps and the final response step. - MessageMap.php: Merge additionalContent into the API payload so reasoning_content is sent back to the API in multi-turn conversations. Fixes multi-turn conversations with tools in deepseek-v4-flash. --- src/Providers/DeepSeek/Handlers/Text.php | 9 +++++++-- src/Providers/DeepSeek/Maps/MessageMap.php | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Providers/DeepSeek/Handlers/Text.php b/src/Providers/DeepSeek/Handlers/Text.php index c8a15d253..d9cf14324 100644 --- a/src/Providers/DeepSeek/Handlers/Text.php +++ b/src/Providers/DeepSeek/Handlers/Text.php @@ -63,10 +63,13 @@ protected function handleToolCalls(array $data, Request $request): TextResponse $this->addStep($data, $request, $toolResults); + $reasoningContent = data_get($data, 'choices.0.message.reasoning_content'); + $additionalContent = $reasoningContent ? ['reasoning_content' => $reasoningContent] : []; + $request = $request->addMessage(new AssistantMessage( data_get($data, 'choices.0.message.content') ?? '', $toolCalls, - [] + $additionalContent )); $request = $request->addMessage(new ToolResultMessage($toolResults)); $request->resetToolChoice(); @@ -122,6 +125,8 @@ protected function sendRequest(Request $request): array */ protected function addStep(array $data, Request $request, array $toolResults = []): void { + $reasoningContent = data_get($data, 'choices.0.message.reasoning_content'); + $this->responseBuilder->addStep(new Step( text: data_get($data, 'choices.0.message.content') ?? '', finishReason: $this->mapFinishReason($data), @@ -138,7 +143,7 @@ protected function addStep(array $data, Request $request, array $toolResults = [ ), messages: $request->messages(), systemPrompts: $request->systemPrompts(), - additionalContent: [], + additionalContent: $reasoningContent ? ['reasoning_content' => $reasoningContent] : [], raw: $data, )); } diff --git a/src/Providers/DeepSeek/Maps/MessageMap.php b/src/Providers/DeepSeek/Maps/MessageMap.php index c75352761..f414e498a 100644 --- a/src/Providers/DeepSeek/Maps/MessageMap.php +++ b/src/Providers/DeepSeek/Maps/MessageMap.php @@ -99,10 +99,10 @@ protected function mapAssistantMessage(AssistantMessage $message): void ], ], $message->toolCalls); - $this->mappedMessages[] = array_filter([ + $this->mappedMessages[] = array_filter(array_merge([ 'role' => 'assistant', 'content' => $message->content, 'tool_calls' => $toolCalls, - ]); + ], $message->additionalContent)); } }