From 2b8ccb4d2233181cc85b0a76596dff30325885ff Mon Sep 17 00:00:00 2001 From: Br1an67 <932039080@qq.com> Date: Mon, 2 Mar 2026 01:12:18 +0800 Subject: [PATCH] feat: use reasoning field in StreamingChunk for Bedrock Populate StreamingChunk.reasoning with ReasoningContent instead of storing reasoning content deltas in meta["reasoning_contents"]. Update _process_reasoning_contents to read from chunk.reasoning.extra instead of chunk.meta. --- .../generators/amazon_bedrock/chat/utils.py | 15 ++++++++++----- .../tests/test_chat_generator_utils.py | 6 ++++++ 2 files changed, 16 insertions(+), 5 deletions(-) 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_ = (