From 15880bf41c2fdb312c8ac336b27007803dd89fe8 Mon Sep 17 00:00:00 2001 From: Ashen <310210685+ashen0x@users.noreply.github.com> Date: Fri, 2 Oct 2026 01:59:46 +0530 Subject: [PATCH] fix: skip deeply nested upstream events in the stats observer --- routstr/upstream/terminal_outcome_tracking.py | 5 +++-- tests/unit/test_streaming_billing_finalization.py | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/routstr/upstream/terminal_outcome_tracking.py b/routstr/upstream/terminal_outcome_tracking.py index 69daba20..dd3482cb 100644 --- a/routstr/upstream/terminal_outcome_tracking.py +++ b/routstr/upstream/terminal_outcome_tracking.py @@ -160,8 +160,9 @@ def observe_terminal_sse_bytes( continue try: parsed = json.loads(payload) - except ValueError: - # Bytes cut inside a character raise UnicodeDecodeError, not JSONDecodeError. + except (ValueError, RecursionError): + # Bytes cut inside a character raise UnicodeDecodeError, not + # JSONDecodeError; an upstream's deep nesting raises RecursionError. continue if isinstance(parsed, dict): state.observe(parsed) diff --git a/tests/unit/test_streaming_billing_finalization.py b/tests/unit/test_streaming_billing_finalization.py index 140183f2..194af2f5 100644 --- a/tests/unit/test_streaming_billing_finalization.py +++ b/tests/unit/test_streaming_billing_finalization.py @@ -1388,6 +1388,14 @@ def test_stream_cut_inside_a_character_does_not_raise() -> None: assert observe_terminal_sse_bytes(state, b"", tail, final=True) == b"" +def test_deeply_nested_event_does_not_raise() -> None: + state = TerminalOutcomeState() + event = b"data: " + b"[" * 200_000 + b"]" * 200_000 + b"\n\n" + + assert observe_terminal_sse_bytes(state, b"", event, final=True) == b"" + assert state.usage is None + + def test_routstr_upstream_cost_event_is_not_provider_usage() -> None: state = TerminalOutcomeState() stream = (