diff --git a/integrations/amazon_bedrock/src/haystack_integrations/components/generators/amazon_bedrock/chat/utils.py b/integrations/amazon_bedrock/src/haystack_integrations/components/generators/amazon_bedrock/chat/utils.py index e4e50fe6fe..251daf7b8b 100644 --- a/integrations/amazon_bedrock/src/haystack_integrations/components/generators/amazon_bedrock/chat/utils.py +++ b/integrations/amazon_bedrock/src/haystack_integrations/components/generators/amazon_bedrock/chat/utils.py @@ -480,13 +480,15 @@ def _convert_event_to_streaming_chunk( reasoning_content = delta["reasoningContent"] if "redactedContent" in reasoning_content: reasoning_content["redacted_content"] = reasoning_content.pop("redactedContent") + reasoning_text = reasoning_content.get("text", "") streaming_chunk = StreamingChunk( content="", index=block_idx, - meta={ - **base_meta, - "reasoning_contents": [{"index": block_idx, "reasoning_content": reasoning_content}], - }, + reasoning=ReasoningContent( + reasoning_text=reasoning_text, + extra={"reasoning_contents": [{"index": block_idx, "reasoning_content": reasoning_content}]}, + ), + meta=base_meta, ) elif "messageStop" in event: @@ -537,7 +539,10 @@ def _process_reasoning_contents(chunks: list[StreamingChunk]) -> ReasoningConten reasoning_signature = None redacted_content = None for chunk in chunks: - reasoning_contents = chunk.meta.get("reasoning_contents", []) + if chunk.reasoning and chunk.reasoning.extra: + reasoning_contents = chunk.reasoning.extra.get("reasoning_contents", []) + else: + reasoning_contents = [] for reasoning_content in reasoning_contents: content_block_index = reasoning_content["index"] diff --git a/integrations/amazon_bedrock/tests/test_chat_generator_utils.py b/integrations/amazon_bedrock/tests/test_chat_generator_utils.py index 1eefa81a78..18e120ccdf 100644 --- a/integrations/amazon_bedrock/tests/test_chat_generator_utils.py +++ b/integrations/amazon_bedrock/tests/test_chat_generator_utils.py @@ -1102,6 +1102,12 @@ def test_callback(chunk: StreamingChunk): ] assert replies == expected_messages + # Verify streaming chunks carry reasoning in the reasoning field, not in meta + reasoning_chunks = [c for c in streaming_chunks if c.reasoning is not None] + assert len(reasoning_chunks) > 0 + for chunk in reasoning_chunks: + assert "reasoning_contents" not in chunk.meta + def test_process_streaming_response_with_one_tool_call_with_redacted_thinking(self, mock_boto3_session): model = "arn:aws:bedrock:us-east-1::inference-profile/us.anthropic.claude-sonnet-3-7-20250219-v1:0" type_ = (