@@ -278,13 +278,20 @@ def _format_bedrock_messages(self, messages: Messages) -> Messages:
278278 cleaned_content : list [ContentBlock ] = []
279279
280280 for content_block in message ["content" ]:
281+ # DeepSeek models have issues with reasoningContent
282+ # TODO: Replace with systematic model configuration registry (https://github.com/strands-agents/sdk-python/issues/780)
283+ if "deepseek" in self .config ["model_id" ].lower () and "reasoningContent" in content_block :
284+ continue
285+
281286 if "toolResult" in content_block :
282287 # Create a new content block with only the cleaned toolResult
283288 tool_result : ToolResult = content_block ["toolResult" ]
284289
285290 # Keep only the required fields for Bedrock
286291 cleaned_tool_result = ToolResult (
287- content = tool_result ["content" ], toolUseId = tool_result ["toolUseId" ], status = tool_result ["status" ]
292+ content = tool_result ["content" ],
293+ toolUseId = tool_result ["toolUseId" ],
294+ status = tool_result ["status" ],
288295 )
289296
290297 cleaned_block : ContentBlock = {"toolResult" : cleaned_tool_result }
@@ -293,9 +300,10 @@ def _format_bedrock_messages(self, messages: Messages) -> Messages:
293300 # Keep other content blocks as-is
294301 cleaned_content .append (content_block )
295302
296- # Create new message with cleaned content
297- cleaned_message : Message = Message (content = cleaned_content , role = message ["role" ])
298- cleaned_messages .append (cleaned_message )
303+ # Create new message with cleaned content (skip if empty for DeepSeek)
304+ if cleaned_content :
305+ cleaned_message : Message = Message (content = cleaned_content , role = message ["role" ])
306+ cleaned_messages .append (cleaned_message )
299307
300308 return cleaned_messages
301309
@@ -347,7 +355,8 @@ def _generate_redaction_events(self) -> list[StreamEvent]:
347355 {
348356 "redactContent" : {
349357 "redactAssistantContentMessage" : self .config .get (
350- "guardrail_redact_output_message" , "[Assistant output redacted.]"
358+ "guardrail_redact_output_message" ,
359+ "[Assistant output redacted.]" ,
351360 )
352361 }
353362 }
@@ -427,6 +436,7 @@ def _stream(
427436 try :
428437 logger .debug ("formatting request" )
429438 request = self .format_request (messages , tool_specs , system_prompt )
439+
430440 logger .debug ("request=<%s>" , request )
431441
432442 logger .debug ("invoking model" )
@@ -660,7 +670,11 @@ def _find_detected_and_blocked_policy(self, input: Any) -> bool:
660670
661671 @override
662672 async def structured_output (
663- self , output_model : Type [T ], prompt : Messages , system_prompt : Optional [str ] = None , ** kwargs : Any
673+ self ,
674+ output_model : Type [T ],
675+ prompt : Messages ,
676+ system_prompt : Optional [str ] = None ,
677+ ** kwargs : Any ,
664678 ) -> AsyncGenerator [dict [str , Union [T , Any ]], None ]:
665679 """Get structured output from the model.
666680
@@ -675,7 +689,12 @@ async def structured_output(
675689 """
676690 tool_spec = convert_pydantic_to_tool_spec (output_model )
677691
678- response = self .stream (messages = prompt , tool_specs = [tool_spec ], system_prompt = system_prompt , ** kwargs )
692+ response = self .stream (
693+ messages = prompt ,
694+ tool_specs = [tool_spec ],
695+ system_prompt = system_prompt ,
696+ ** kwargs ,
697+ )
679698 async for event in streaming .process_stream (response ):
680699 yield event
681700
0 commit comments