A full response (turn) completed — carries the usage payload for THIS response
(input_tokens / output_tokens), i.e. per-response DELTAS, exactly the OnUsage
contract shape.
The payload's LOCATION is provider-specific, which is why both slots are declared:
OpenAI (gpt-realtime) populates response.usage and sends no top-level usage.
xAI (Grok Voice) populates a TOP-LEVEL usage and sends response.usage as an EMPTY
object — captured live off wss://api.x.ai/v1/realtime.
A full response (turn) completed — carries the usage payload for THIS response (
input_tokens/output_tokens), i.e. per-response DELTAS, exactly theOnUsagecontract shape.The payload's LOCATION is provider-specific, which is why both slots are declared:
gpt-realtime) populatesresponse.usageand sends no top-levelusage.usageand sendsresponse.usageas an EMPTY object — captured live offwss://api.x.ai/v1/realtime.ResolveResponseDoneUsage picks whichever slot actually carries token counts.