Fix JSON parsing for chunked responses in subprocess transport#25
Closed
couloirextreme wants to merge 1 commit into
Closed
Fix JSON parsing for chunked responses in subprocess transport#25couloirextreme wants to merge 1 commit into
couloirextreme wants to merge 1 commit into
Conversation
Fixes #6 - Handle JSON responses that are split across multiple lines in subprocess stdout. Implements stateful JSON parser that reconstructs complete objects from fragments. - Maintains buffer to accumulate partial JSON across lines - Tracks brace/bracket nesting to identify complete JSON objects - Handles string escaping and quotes properly to avoid false boundaries - Tested with large responses that previously caused TaskGroup errors - Backward compatible with existing functionality The original implementation attempted to parse each line as complete JSON with json.loads(), but large responses get chunked across multiple lines, causing JSONDecodeError on incomplete fragments. This fix accumulates lines in a buffer and uses stateful parsing to extract complete JSON objects as they become available. Resolves 'unhandled errors in a TaskGroup' issues reported by multiple users when processing large prompts or responses with tool usage.
There was a problem hiding this comment.
Pull Request Overview
This PR refactors the JSON parsing logic in the CLI transport to robustly handle JSON fragments spread across multiple lines.
- Introduces a stateful JSON parser that accumulates buffer data and parses complete JSON objects
- Replaces the per-line JSON parsing with a buffer-based approach in receive_messages
| try: | ||
| data = json.loads(line_str) | ||
| # Add line to buffer | ||
| json_buffer += line_str |
There was a problem hiding this comment.
Modifying the outer 'json_buffer' inside the nested function may lead to an UnboundLocalError; consider declaring 'nonlocal json_buffer' at the start of the nested function 'read_stderr'.
Collaborator
|
thanks @couloirextreme . This issue was already fixed in PR #5. The current implementation correctly handles multiple JSON objects. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Fixes #6 - The Claude Code SDK fails with
JSONDecodeErrorwhen Claude CLI returns large responses that get split across multiple lines in the subprocess stdout stream.This manifests as:
Root Cause
The current implementation in
SubprocessCLITransport.receive_messages()attempts to parse each line as complete JSON withjson.loads(line_str), but chunked responses contain incomplete JSON fragments.Solution
Implements a stateful JSON parser that:
Testing
✅ Tested with real-world Linear issue analysis tool that previously caused TaskGroup errors
✅ Successfully processes large responses (4000+ chars) that were failing
✅ Maintains compatibility with simple single-line JSON responses
Before/After
Before:
unhandled errors in a TaskGroup (1 sub-exception)After:
✅ Cost: $0.4161, Duration: 97010ms, Response: [full analysis]