From 30df222bfced847a112536682292cb7a3c8e3bff Mon Sep 17 00:00:00 2001 From: Michael Gendy <50384638+Mng-dev-ai@users.noreply.github.com> Date: Tue, 19 Aug 2025 23:36:12 +0300 Subject: [PATCH] Move thinking block parsing from user to assistant messages (#119) Related to https://github.com/anthropics/claude-code-sdk-python/pull/28 cc @dicksontsai --- .../_internal/message_parser.py | 14 +++++----- tests/test_message_parser.py | 26 +++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/claude_code_sdk/_internal/message_parser.py b/src/claude_code_sdk/_internal/message_parser.py index 7173650..6b39a02 100644 --- a/src/claude_code_sdk/_internal/message_parser.py +++ b/src/claude_code_sdk/_internal/message_parser.py @@ -54,13 +54,6 @@ def parse_message(data: dict[str, Any]) -> Message: user_content_blocks.append( TextBlock(text=block["text"]) ) - case "thinking": - user_content_blocks.append( - ThinkingBlock( - thinking=block["thinking"], - signature=block["signature"], - ) - ) case "tool_use": user_content_blocks.append( ToolUseBlock( @@ -91,6 +84,13 @@ def parse_message(data: dict[str, Any]) -> Message: match block["type"]: case "text": content_blocks.append(TextBlock(text=block["text"])) + case "thinking": + content_blocks.append( + ThinkingBlock( + thinking=block["thinking"], + signature=block["signature"], + ) + ) case "tool_use": content_blocks.append( ToolUseBlock( diff --git a/tests/test_message_parser.py b/tests/test_message_parser.py index 4e0892e..60dea98 100644 --- a/tests/test_message_parser.py +++ b/tests/test_message_parser.py @@ -9,6 +9,7 @@ from claude_code_sdk.types import ( ResultMessage, SystemMessage, TextBlock, + ThinkingBlock, ToolResultBlock, ToolUseBlock, UserMessage, @@ -152,6 +153,31 @@ class TestMessageParser: assert isinstance(message.content[0], TextBlock) assert isinstance(message.content[1], ToolUseBlock) + def test_parse_assistant_message_with_thinking(self): + """Test parsing an assistant message with thinking block.""" + data = { + "type": "assistant", + "message": { + "content": [ + { + "type": "thinking", + "thinking": "I'm thinking about the answer...", + "signature": "sig-123", + }, + {"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 == "I'm thinking about the answer..." + assert message.content[0].signature == "sig-123" + assert isinstance(message.content[1], TextBlock) + assert message.content[1].text == "Here's my response" + def test_parse_valid_system_message(self): """Test parsing a valid system message.""" data = {"type": "system", "subtype": "start"}