diff --git a/src/claude_agent_sdk/_internal/message_parser.py b/src/claude_agent_sdk/_internal/message_parser.py index 2363bb31..9f99b99f 100644 --- a/src/claude_agent_sdk/_internal/message_parser.py +++ b/src/claude_agent_sdk/_internal/message_parser.py @@ -107,7 +107,7 @@ def parse_message(data: dict[str, Any]) -> Message | None: content_blocks.append( ThinkingBlock( thinking=block["thinking"], - signature=block["signature"], + signature=block.get("signature", ""), ) ) case "tool_use": diff --git a/tests/test_message_parser.py b/tests/test_message_parser.py index be5846bc..5540265b 100644 --- a/tests/test_message_parser.py +++ b/tests/test_message_parser.py @@ -274,6 +274,29 @@ def test_parse_assistant_message_with_thinking(self): assert isinstance(message.content[1], TextBlock) assert message.content[1].text == "Here's my response" + def test_parse_assistant_message_with_thinking_missing_signature(self): + """Test parsing an assistant message with thinking block missing signature.""" + data = { + "type": "assistant", + "message": { + "content": [ + { + "type": "thinking", + "thinking": "Redacted thinking content", + }, + {"type": "text", "text": "Here's my response"}, + ], + "model": "claude-opus-4-1-20250805", + }, + } + message = parse_message(data) + assert isinstance(message, AssistantMessage) + assert len(message.content) == 2 + assert isinstance(message.content[0], ThinkingBlock) + assert message.content[0].thinking == "Redacted thinking content" + assert message.content[0].signature == "" + assert isinstance(message.content[1], TextBlock) + def test_parse_assistant_message_with_usage(self): """Per-turn usage is preserved on AssistantMessage.