cost:llm:request— emitted when an LLM call finishes (generateText/streamText), with an LLM usage attribute.cost:http:request— emitted when you attach a dollar cost to an HTTP response withaddRequestCostfrom@outputai/http, with an HTTP request cost attribute.
Setup
Cost events use the same hooks system as error hooks:- Create a hook file and import
onfrom@outputai/core/hooks. - Register a handler for
cost:llm:request,cost:http:request, or both. - Add the file path to
outputai.hookFilesinpackage.json.
src/llm_cost_hooks.ts
src/http_cost_hooks.ts
LLM request cost
When events fire
Ancost:llm:request event is emitted after every generateText and streamText call completes. For streaming, the event fires when the stream finishes, not when it starts.
Payload
The handler receives an event envelope. The LLM usage attribute is available underpayload:
Usage entries
Cost is computed from the model’s per-million-token pricing, fetched from a built-in pricing source and cached for 24 hours. For each priced dimension, the dollar amount is(tokens / 1_000_000) * pricePerMillion. Non-cached input tokens use inputTokens - (cachedInputTokens ?? 0).
payload.usage[].type values:
Only available, finite usage dimensions are included. For example,
reasoning is omitted when the model does not define separate reasoning pricing, and input_cached is omitted when there are no cached input tokens.
HTTP request cost
Events fire only when your code callsaddRequestCost( response, total ) with a response object created by @outputai/http (or its exported fetch). The SDK attaches the cost to the existing HTTP trace event and emits cost:http:request. If the response did not originate from this package, addRequestCost no-ops (with a console warning) and no hook event is emitted.
Payload
The handler receives an event envelope. The HTTP request cost attribute is available underpayload: