File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 55for use with the ChitChats multi-provider abstraction layer.
66"""
77
8+ # Monkey-patch the SDK's message parser to handle rate_limit_event gracefully.
9+ # The SDK raises MessageParseError for unknown message types like rate_limit_event,
10+ # which kills the entire response stream. This patch converts them to SystemMessage instead.
11+ import claude_agent_sdk ._internal .client as _cl # noqa: E402
12+ import claude_agent_sdk ._internal .message_parser as _mp # noqa: E402
13+ from claude_agent_sdk .types import SystemMessage as _SystemMessage # noqa: E402
14+
15+ _original_parse_message = _mp .parse_message
16+
17+
18+ def _patched_parse_message (data ):
19+ if isinstance (data , dict ) and data .get ("type" ) == "rate_limit_event" :
20+ return _SystemMessage (subtype = "rate_limit" , data = data )
21+ return _original_parse_message (data )
22+
23+
24+ _mp .parse_message = _patched_parse_message
25+ _cl .parse_message = _patched_parse_message # type: ignore[attr-defined] # Patch the already-imported reference
26+
827from .client import ClaudeClient
928from .parser import ClaudeStreamParser
1029from .provider import ClaudeClientPool , ClaudeProvider
Original file line number Diff line number Diff line change @@ -83,7 +83,9 @@ def parse_message(
8383
8484 # Extract session_id from SystemMessage
8585 if isinstance (message , SystemMessage ):
86- if isinstance (message .data , dict ) and "session_id" in message .data :
86+ if message .subtype == "rate_limit" :
87+ logger .warning (f"Rate limited by API (concurrent usage?): { message .data } " )
88+ elif isinstance (message .data , dict ) and "session_id" in message .data :
8789 new_session_id = message .data ["session_id" ]
8890 logger .debug (f"Extracted session_id: { new_session_id } " )
8991
You can’t perform that action at this time.
0 commit comments