diff --git a/src/claude_agent_sdk/_internal/message_parser.py b/src/claude_agent_sdk/_internal/message_parser.py index f91081c3..f659d32e 100644 --- a/src/claude_agent_sdk/_internal/message_parser.py +++ b/src/claude_agent_sdk/_internal/message_parser.py @@ -8,6 +8,7 @@ AssistantMessage, ContentBlock, Message, + RateLimitEvent, ResultMessage, StreamEvent, SystemMessage, @@ -176,5 +177,20 @@ def parse_message(data: dict[str, Any]) -> Message: f"Missing required field in stream_event message: {e}", data ) from e + case "rate_limit_event": + try: + return RateLimitEvent( + type=data["type"], + session_id=data["session_id"], + limit_type=data.get("limit_type"), + limit=data.get("limit"), + remaining=data.get("remaining"), + reset_at=data.get("reset_at"), + ) + except KeyError as e: + raise MessageParseError( + f"Missing required field in rate_limit_event message: {e}", data + ) from e + case _: raise MessageParseError(f"Unknown message type: {message_type}", data) diff --git a/src/claude_agent_sdk/_internal/query.py b/src/claude_agent_sdk/_internal/query.py index 8f278428..e76e246f 100644 --- a/src/claude_agent_sdk/_internal/query.py +++ b/src/claude_agent_sdk/_internal/query.py @@ -495,6 +495,10 @@ async def _handle_sdk_mcp_request( "mimeType": item.mimeType, } ) + elif hasattr(item, "model_dump"): + # Pass through other block types (e.g., search_result) + # so they reach the Anthropic API intact + content.append(item.model_dump()) response_data = {"content": content} if hasattr(result.root, "is_error") and result.root.is_error: diff --git a/src/claude_agent_sdk/types.py b/src/claude_agent_sdk/types.py index 3ea89d5a..474217f5 100644 --- a/src/claude_agent_sdk/types.py +++ b/src/claude_agent_sdk/types.py @@ -693,7 +693,19 @@ class StreamEvent: parent_tool_use_id: str | None = None -Message = UserMessage | AssistantMessage | SystemMessage | ResultMessage | StreamEvent +@dataclass +class RateLimitEvent: + """Rate limit event from Claude Code CLI.""" + + type: str + session_id: str + limit_type: str | None = None + limit: int | None = None + remaining: int | None = None + reset_at: str | None = None + + +Message = UserMessage | AssistantMessage | SystemMessage | ResultMessage | StreamEvent | RateLimitEvent class ThinkingConfigAdaptive(TypedDict):