Vercel AI SDK
Trace Vercel AI SDK calls in Rius, with prompts, responses, models, tool definitions, and token usage.
This integration is TypeScript only. The Python SDK has no Vercel AI SDK integration, because the library itself is JavaScript only.
Setup on ai 7
npm install @ai-sdk/otelSince ai 7 the AI SDK no longer emits OpenTelemetry spans itself: they come
from the official @ai-sdk/otel telemetry integration, and something has to
register it. With @glassflow-ai/rius 0.6.0 or newer, init() does that for
you. Install the package, initialize Rius, and every AI SDK call is traced,
with no telemetry code in your application:
import { init } from '@glassflow-ai/rius'
import { openai } from '@ai-sdk/openai'
import { generateText } from 'ai'
init({ apiKey: 'ri_...', serviceName: 'my-agent' })
const { text } = await generateText({
model: openai('gpt-4o-mini'),
prompt: 'Summarize this ticket',
})@ai-sdk/otel requires Node 22 or newer, the same floor as ai 7 itself.
Each call arrives with its input and output messages, the request’s tool
definitions, the resolved model, and token usage including cache reads and,
since @glassflow-ai/rius 1.2.0, reasoning tokens. Since 1.1.0, streamed
calls carry time to first token. An agent span (invoke_agent) wraps the
steps of a tool-calling loop, with a span for each step, a chat span for
each model call, and an execute_tool span for each tool execution. Cost is
computed server-side from the model and tokens.
Setup on ai 5 and 6
These versions have OpenTelemetry built in but emit nothing unless a call opts in. Enable telemetry per call:
const { text } = await generateText({
model: openai('gpt-4o-mini'),
prompt: 'Summarize this ticket',
experimental_telemetry: { isEnabled: true },
})There is nothing else to install, and it works on any Node version the SDK
supports (18 or newer). Since @glassflow-ai/rius 1.2.0 a call stores the
same data whichever ai version made it: an agent span for each
generateText, streamText, generateObject, or streamObject call, a
chat span for each model call with its messages, model, finish reason, and
token usage including cache reads and reasoning tokens, execute_tool spans
with the tool’s arguments and result, and embedding spans. A streamed call
also carries time to first token.
Earlier releases needed @arizeai/openinference-vercel to translate these
spans. Version 1.2.0 no longer uses it, so you can uninstall it.
The AI SDK’s image, speech, and transcription calls are not traced on ai 5
and 6: they take no telemetry settings. On ai 7 they are traced with two
gaps: speech, transcription, and decide spans do not show up under a
span-kind filter, and the tokens and cost of speech and transcription calls
are not counted. A rerank call shows as an LLM span in the console on ai 6
and 7.
Token usage
Each model call is counted once in tokens and cost, and the wrapper span
around the calls, such as an agent span or an embed or embedMany span, still
shows the run’s total where the AI SDK reports one (@glassflow-ai/rius
1.2.0, or 1.1.0 on ai 7). The
dedup runs in the SDK, so @ai-sdk/otel spans sent to Rius without it are
still counted twice.
Ordering and privacy
Everything the integration produces is covered by your
privacy controls: captureContent: false and a mask apply to prompts, responses, tool definitions, the system
prompt (gen_ai.system_instructions), and each tool call’s arguments and
result (gen_ai.tool.call.arguments, gen_ai.tool.call.result) exactly as
they apply to manual spans, on both the spans of ai 7 and the mapped spans
of ai 5 and 6. Requires @glassflow-ai/rius 0.6.0 or later; earlier
versions did not list the ai 7 system-prompt and tool-call keys as content.
Verify
Run one generateText call, then open the trace in the console. The model
call span shows the resolved model, input and output token counts, and a
cost, nested under an agent span for the call. Wrap the call in
observe to see it inside
your agent’s run instead of as a standalone trace.
If no spans appear on ai 7, check the process log: Rius warns at init()
when it finds ai 7 without @ai-sdk/otel, because that combination
produces no spans at all. When the integration attached, await client.ready
lists vercel-ai.
On ai 5 and 6, the usual cause is a call without
experimental_telemetry: { isEnabled: true }. There is nothing to register
on these versions, so client.ready does not list vercel-ai even when
tracing works.