From b73ff583b509a0d608e3b97165d843192c92896c Mon Sep 17 00:00:00 2001 From: camposvinicius Date: Wed, 24 Jun 2026 08:20:49 +0200 Subject: [PATCH] Propagate output_tokens_details onto the accumulated streaming Message --- src/anthropic/lib/streaming/_beta_messages.py | 2 ++ src/anthropic/lib/streaming/_messages.py | 2 ++ tests/lib/streaming/fixtures/refusal_response.txt | 2 +- tests/lib/streaming/test_beta_messages.py | 3 +++ tests/lib/streaming/test_messages.py | 3 +++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/anthropic/lib/streaming/_beta_messages.py b/src/anthropic/lib/streaming/_beta_messages.py index 0348875b7..eacd63a53 100644 --- a/src/anthropic/lib/streaming/_beta_messages.py +++ b/src/anthropic/lib/streaming/_beta_messages.py @@ -559,5 +559,7 @@ def accumulate_event( current_snapshot.usage.server_tool_use = event.usage.server_tool_use if event.usage.iterations is not None: current_snapshot.usage.iterations = event.usage.iterations + if event.usage.output_tokens_details is not None: + current_snapshot.usage.output_tokens_details = event.usage.output_tokens_details return current_snapshot diff --git a/src/anthropic/lib/streaming/_messages.py b/src/anthropic/lib/streaming/_messages.py index 5c0da9992..9bc6d6c84 100644 --- a/src/anthropic/lib/streaming/_messages.py +++ b/src/anthropic/lib/streaming/_messages.py @@ -516,5 +516,7 @@ def accumulate_event( current_snapshot.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens if event.usage.server_tool_use is not None: current_snapshot.usage.server_tool_use = event.usage.server_tool_use + if event.usage.output_tokens_details is not None: + current_snapshot.usage.output_tokens_details = event.usage.output_tokens_details return current_snapshot diff --git a/tests/lib/streaming/fixtures/refusal_response.txt b/tests/lib/streaming/fixtures/refusal_response.txt index ae47459f6..762c78d60 100644 --- a/tests/lib/streaming/fixtures/refusal_response.txt +++ b/tests/lib/streaming/fixtures/refusal_response.txt @@ -8,7 +8,7 @@ event: content_block_stop data: {"type":"content_block_stop","index":0} event: message_delta -data: {"type":"message_delta","delta":{"stop_reason":"refusal","stop_sequence":null,"stop_details":{"type":"refusal","category":"cyber","explanation":"This request was refused due to policy."}},"usage":{"output_tokens":0}} +data: {"type":"message_delta","delta":{"stop_reason":"refusal","stop_sequence":null,"stop_details":{"type":"refusal","category":"cyber","explanation":"This request was refused due to policy."}},"usage":{"output_tokens":120,"output_tokens_details":{"thinking_tokens":67}}} event: message_stop data: {"type":"message_stop"} diff --git a/tests/lib/streaming/test_beta_messages.py b/tests/lib/streaming/test_beta_messages.py index e0f9b5b1f..f9e21395c 100644 --- a/tests/lib/streaming/test_beta_messages.py +++ b/tests/lib/streaming/test_beta_messages.py @@ -232,6 +232,9 @@ def assert_refusal_response(message: BetaMessage) -> None: assert message.stop_details.type == "refusal" assert message.stop_details.category == "cyber" assert message.stop_details.explanation == "This request was refused due to policy." + assert message.usage.output_tokens == 120 + assert message.usage.output_tokens_details is not None + assert message.usage.output_tokens_details.thinking_tokens == 67 EXPECTED_FALLBACK_EVENT_TYPES = [ diff --git a/tests/lib/streaming/test_messages.py b/tests/lib/streaming/test_messages.py index b86a39063..0c22856e0 100644 --- a/tests/lib/streaming/test_messages.py +++ b/tests/lib/streaming/test_messages.py @@ -111,6 +111,9 @@ def assert_refusal_response(message: Message) -> None: assert message.stop_details.type == "refusal" assert message.stop_details.category == "cyber" assert message.stop_details.explanation == "This request was refused due to policy." + assert message.usage.output_tokens == 120 + assert message.usage.output_tokens_details is not None + assert message.usage.output_tokens_details.thinking_tokens == 67 class TestSyncMessages: