diff --git a/src/claude_code_sdk/_internal/client.py b/src/claude_code_sdk/_internal/client.py index 9e8ceace..b10a1b8f 100644 --- a/src/claude_code_sdk/_internal/client.py +++ b/src/claude_code_sdk/_internal/client.py @@ -86,13 +86,13 @@ def _parse_message(self, data: dict[str, Any]) -> Message | None: # Map total_cost to total_cost_usd for consistency return ResultMessage( subtype=data["subtype"], - cost_usd=data["cost_usd"], + cost_usd=data.get("cost_usd", data.get("total_cost", 0.0)), duration_ms=data["duration_ms"], duration_api_ms=data["duration_api_ms"], is_error=data["is_error"], num_turns=data["num_turns"], session_id=data["session_id"], - total_cost_usd=data["total_cost"], + total_cost_usd=data.get("total_cost", 0.0), usage=data.get("usage"), result=data.get("result"), ) diff --git a/src/claude_code_sdk/_internal/transport/subprocess_cli.py b/src/claude_code_sdk/_internal/transport/subprocess_cli.py index 564bc94d..a95e8692 100644 --- a/src/claude_code_sdk/_internal/transport/subprocess_cli.py +++ b/src/claude_code_sdk/_internal/transport/subprocess_cli.py @@ -196,10 +196,13 @@ async def read_stderr() -> None: raise SDKJSONDecodeError(line_str, e) from e continue - except anyio.ClosedResourceError: + except (anyio.ClosedResourceError, GeneratorExit): pass finally: - tg.cancel_scope.cancel() + try: + tg.cancel_scope.cancel() + except RuntimeError: + pass await self._process.wait() if self._process.returncode is not None and self._process.returncode != 0: