@@ -744,6 +744,7 @@ def cleanup(self) -> None:
744744 """End all open LLM spans, TASK spans, and TOOL spans; clear thread-local."""
745745 for ctx in self ._contexts .values ():
746746 if ctx .llm_span :
747+ self ._mark_output_usage_unknown (ctx )
747748 ctx .llm_span .end ()
748749 ctx .llm_span = None
749750 if ctx .task_span :
@@ -884,6 +885,8 @@ def _handle_stream_event(self, message: Any) -> None:
884885
885886 def _handle_result (self , message : Any ) -> None :
886887 self ._active_key = None
888+ for ctx in self ._contexts .values ():
889+ self ._mark_output_usage_unknown (ctx )
887890 result_value = getattr (message , "result" , None )
888891 if result_value is not None :
889892 self ._result_output = result_value
@@ -1014,6 +1017,7 @@ def _start_or_merge_llm_span(
10141017 first_token_time = time .time ()
10151018
10161019 if ctx .llm_span :
1020+ self ._mark_output_usage_unknown (ctx )
10171021 ctx .llm_span .end (end_time = resolved_start )
10181022
10191023 final_content , span = _create_llm_span_for_messages (
@@ -1051,10 +1055,14 @@ def _log_assistant_usage(
10511055 has_final_output = message_id in self ._final_output_usage_message_ids if message_id else False
10521056 metrics , _ = extract_anthropic_usage (usage , include_output = has_final_output )
10531057 _ , metadata = extract_anthropic_usage (raw_message_usage , include_output = False )
1054- if not has_final_output and "prompt_tokens" in metrics :
1055- metadata ["usage_output_tokens_unknown" ] = True
10561058 ctx .llm_span .log (metrics = metrics or None , metadata = metadata or None )
10571059
1060+ def _mark_output_usage_unknown (self , ctx : _AgentContext ) -> None :
1061+ """Mark missing output only once an LLM span is finalized."""
1062+ if ctx .llm_span is None or ctx .llm_message_id in self ._final_output_usage_message_ids :
1063+ return
1064+ ctx .llm_span .log (metadata = {"usage_output_tokens_unknown" : True })
1065+
10581066 def _process_task_event (self , message : Any , agent_span_export : str | None ) -> None :
10591067 """Handle TaskStarted / TaskProgress / TaskNotification system messages."""
10601068 task_id = _msg_field (message , "task_id" )
0 commit comments