# Vercel AI SDK cost tracking

One middleware for AI SDK 5 and 6 prices every `generateText`, `streamText`, `generateObject` and `streamObject` call, on every provider the AI SDK supports. Streaming calls are priced when the stream finishes, with cached input kept apart.

## Install

```bash
npm install @veqen/sdk
```

## Wrap the model

```ts
import { openai } from "@ai-sdk/openai";
import { generateText, wrapLanguageModel } from "ai";
import { withTags } from "@veqen/sdk";
import { veqen } from "@veqen/sdk/ai-sdk";

const model = wrapLanguageModel({ model: openai("gpt-5-mini"), middleware: veqen({ feature: "chat" }) });

await withTags({ customer: org.id }, () => generateText({ model, prompt }));
```

Set `VEQEN_API_KEY` to an ingest key on the server. The provider comes from the AI SDK model: `@ai-sdk/azure` calls are Azure's bill, `@ai-sdk/amazon-bedrock` calls Bedrock's.

## Already exporting telemetry?

If you turn on `experimental_telemetry`, you can send those spans to Veqen's OpenTelemetry endpoint instead of adding the middleware. `functionId` becomes the feature and `metadata.customer` the customer. See [OpenTelemetry](/docs/opentelemetry). Use one path, not both.

Through the Vercel AI Gateway, the gateway's own reported cost is kept: see the [AI Gateway guide](/guides/vercel-ai-gateway-costs).

## Next

- [Budgets](/docs/budgets): the middleware checks caps before each call.
- [JavaScript SDK](/docs/javascript): `wrap()`, `record()` and tags.
