# Streaming with token accounting

```python
from langchain.agents import create_agent
from langchain_core.callbacks import UsageMetadataCallbackHandler

agent = create_agent(model="gpt-5-nano", tools=[get_weather])

callback = UsageMetadataCallbackHandler()

stream = agent.stream_events(
    {"messages": [{"role": "user", "content": "What is the weather in SF?"}]},
    version="v3",
    config={"callbacks": [callback]},
)

for message in stream.messages:
    for delta in message.text:
        print(delta, end="", flush=True)

print(callback.usage_metadata)
```

## Rules

- `stream.messages` is the text projection; `stream.output` is the final state. Consume projections independently instead of branching on chunk types.
- Pass the callback in the config so every model call in the run reports into it. `get_usage_metadata_callback` gives you the same as a context manager.
- usage_metadata is keyed by model name, with input/output/total tokens plus provider details (cache reads, reasoning tokens). Log it per run; it is your cost ledger.
- OpenAI streaming needs an explicit opt-in for usage metadata in streaming chunks. If usage is empty on OpenAI streams, that is the missing step.