Skip to content

Vercel AI SDK

XeroML integrates with the Vercel AI SDK through OpenTelemetry. Enable experimental_telemetry on your AI SDK calls and XeroML captures all model interactions automatically.

Installation

Terminal window
npm install ai @ai-sdk/openai @xeroml/tracing @xeroml/otel @opentelemetry/sdk-node

Setup

  1. Initialize OpenTelemetry:

    import { NodeSDK } from "@opentelemetry/sdk-node";
    import { XeroMLSpanProcessor } from "@xeroml/otel";
    const sdk = new NodeSDK({
    spanProcessors: [new XeroMLSpanProcessor()],
    });
    sdk.start();
  2. Enable telemetry on AI SDK calls:

    import { generateText } from "ai";
    import { openai } from "@ai-sdk/openai";
    const { text } = await generateText({
    model: openai("gpt-4o"),
    prompt: "Explain XeroML in one sentence.",
    experimental_telemetry: { isEnabled: true },
    });

With streamText

import { streamText } from "ai";
import { openai } from "@ai-sdk/openai";
const result = await streamText({
model: openai("gpt-4o"),
prompt: "Write a poem about observability.",
experimental_telemetry: { isEnabled: true },
});
for await (const chunk of result.textStream) {
process.stdout.write(chunk);
}

Adding Context

Wrap the AI SDK call in propagateAttributes() to attach user and session context:

import { propagateAttributes } from "@xeroml/tracing";
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
async function handleRequest(prompt: string, userId: string, sessionId: string) {
return await propagateAttributes({ userId, sessionId }, async () => {
return await generateText({
model: openai("gpt-4o"),
prompt,
experimental_telemetry: { isEnabled: true },
});
});
}

Next.js Integration

For Next.js App Router, set up XeroML in instrumentation.ts:

instrumentation.ts
export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
const { NodeSDK } = await import("@opentelemetry/sdk-node");
const { XeroMLSpanProcessor } = await import("@xeroml/otel");
const sdk = new NodeSDK({
spanProcessors: [new XeroMLSpanProcessor()],
});
sdk.start();
}
}

Then add experimental_telemetry: { isEnabled: true } to your AI SDK calls in route handlers or server actions.