diff --git a/src/anthropic/lib/streaming/_beta_messages.py b/src/anthropic/lib/streaming/_beta_messages.py index 0348875b..eacd63a5 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 5c0da999..9bc6d6c8 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 ae47459f..762c78d6 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 e0f9b5b1..f9e21395 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 b86a3906..0c22856e 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: