File tree Expand file tree Collapse file tree
backend/app/services/streaming Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -93,11 +93,22 @@ def emit_events_for_message(
9393 if isinstance (message , ResultMessage ):
9494 if message .total_cost_usd is not None :
9595 self .total_cost_usd = message .total_cost_usd
96- # Only use ResultMessage usage if we have no per-turn usage from
97- # AssistantMessage. ResultMessage.usage contains cumulative totals
98- # across all API calls, not the current context window size.
99- if message .usage is not None and self .usage is None :
100- self .usage = message .usage
96+ # Use ResultMessage usage when we have no per-turn usage from
97+ # AssistantMessage, or when AssistantMessage reported zero input
98+ # tokens (bridge providers like OpenAI/OpenRouter only include
99+ # real usage at stream end, not in per-turn messages).
100+ if message .usage is not None :
101+ existing_input = (
102+ (
103+ self .usage .get ("input_tokens" , 0 )
104+ + self .usage .get ("cache_creation_input_tokens" , 0 )
105+ + self .usage .get ("cache_read_input_tokens" , 0 )
106+ )
107+ if self .usage
108+ else 0
109+ )
110+ if existing_input == 0 :
111+ self .usage = message .usage
101112
102113 @staticmethod
103114 def _extract_command_stdout (content : str | list [Any ]) -> str | None :
You can’t perform that action at this time.
0 commit comments