# `ReqLLM.Step.Usage`
[🔗](https://github.com/agentjido/req_llm/blob/main/lib/req_llm/step/usage.ex#L1)

Centralized Req step that extracts token usage from provider responses,
normalizes usage values across providers, computes costs, and emits telemetry.

This step:
* Extracts token usage numbers from provider responses
* Normalizes usage data across different provider formats
* Calculates costs using ReqLLM.Model cost metadata
* Stores usage data in `response.private[:req_llm][:usage]`
* Emits telemetry events for monitoring

## Usage

    request
    |> ReqLLM.Step.Usage.attach(model)

## Telemetry Events

Emits `[:req_llm, :token_usage]` events with:
* Measurements: `%{tokens: %{input: 123, output: 456, reasoning: 64}, cost: 0.0123}`
* Metadata: `%{model: %LLMDB.Model{}}`

# `attach`

```elixir
@spec attach(Req.Request.t(), LLMDB.Model.t() | nil, keyword()) :: Req.Request.t()
```

Attaches the Usage step to a Req request.

## Parameters

- `req` - The Req.Request struct
- `model` - Optional ReqLLM.Model struct for cost calculation
- `opts` - Optional placement settings. `:before` inserts the step before a
  named response step and appends it when that name is absent.

## Examples

    request
    |> ReqLLM.Step.Usage.attach(model)

    request
    |> ReqLLM.Step.Usage.attach(model, before: :llm_telemetry_stop)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
