Judgment Labs Logo
Agent Frameworks

Vercel AI SDK Tracing

Automatically trace Vercel AI SDK agent executions, tool calls, and multi-step workflows.

Vercel AI SDK integration captures traces from your Vercel AI SDK applications, including agent execution flow, tool invocations, and multi-step reasoning processes. This integration is designed for TypeScript applications.

Give the AI SDK Judgment's OpenTelemetry tracer. For AI SDK 7, pass tracer: Tracer.getOTELTracer() when you register OpenTelemetry. For AI SDK 6 and older, include it in experimental_telemetry. Enabling telemetry without the tracer can drop its spans without an error.

Refer to the Judgeval Tracer documentation for more information on how to instrument your application.

Quickstart

AI SDK 7 registers telemetry once at startup with @ai-sdk/otel. After that, AI SDK calls emit OpenTelemetry spans through the registered integration.

Install Dependencies

npm install ai@^7 @ai-sdk/openai@^4 @ai-sdk/otel judgeval zod
yarn add ai@^7 @ai-sdk/openai@^4 @ai-sdk/otel judgeval zod
pnpm add ai@^7 @ai-sdk/openai@^4 @ai-sdk/otel judgeval zod
bun add ai@^7 @ai-sdk/openai@^4 @ai-sdk/otel judgeval zod

Initialize Tracer

Create an instrumentation file that initializes the Judgment tracer and registers AI SDK OpenTelemetry globally:

instrumentation.ts
import { OpenTelemetry } from "@ai-sdk/otel";
import { registerTelemetry } from "ai";
import { Tracer } from "judgeval";

await Tracer.init({
  projectName: "AI SDK Weather Agent",
});

registerTelemetry(
  new OpenTelemetry({
    tracer: Tracer.getOTELTracer(),
  }),
);

Run Your Agent

Import the instrumentation file before your AI SDK calls.

weatherAgent.ts
import "./instrumentation"; 
import { openai } from "@ai-sdk/openai";
import { generateText, tool } from "ai";
import * as z from "zod/v4";
import { Tracer } from "judgeval"; 

async function main() {
  const result = await generateText({
    model: openai("gpt-5.2"),
    tools: {
      weather: tool({
        description: "Get the weather in a location",
        inputSchema: z.object({
          location: z.string().describe("The location to get the weather for"),
        }),
        execute: async ({ location }) => ({
          location,
          temperature: 72 + Math.floor(Math.random() * 21) - 10,
        }),
      }),
    },
    prompt: "What is the weather in San Francisco?",
  });

  return result;
}

await main().catch(console.error);
await Tracer.shutdown(); 

If you are using Open Router as your model provider, make sure to enable OpenRouter Usage Accounting to enable cost tracking.

Vercel AI SDK Trace

Example: Math Agent with Multi-Step Reasoning

Install mathjs for this example:

npm install mathjs
yarn add mathjs
pnpm add mathjs
bun add mathjs
instrumentation.ts
import { OpenTelemetry } from "@ai-sdk/otel";
import { registerTelemetry } from "ai";
import { Tracer } from "judgeval";

await Tracer.init({
  projectName: "AI SDK Math Agent",
});

registerTelemetry(
  new OpenTelemetry({
    tracer: Tracer.getOTELTracer(),
  }),
);
mathAgent.ts
import "./instrumentation";
import { openai } from "@ai-sdk/openai";
import { generateText, stepCountIs, tool } from "ai";
import * as mathjs from "mathjs";
import * as z from "zod/v4";
import { Tracer } from "judgeval";

async function main() {
  return await generateText({
    model: openai("gpt-5.2"),
    tools: {
      calculate: tool({
        description:
          "A tool for evaluating mathematical expressions. Example expressions: " +
          "'1.2 * (2 + 4.5)', '12.7 cm to inch', 'sin(45 deg) ^ 2'.",
        inputSchema: z.object({ expression: z.string() }),
        execute: async ({ expression }) => mathjs.evaluate(expression),
      }),
    },
    stopWhen: stepCountIs(10),
    system:
      "You are solving math problems. " +
      "Reason step by step. " +
      "Use the calculator when necessary. " +
      "The calculator can only do simple additions, subtractions, multiplications, and divisions. " +
      "When you give the final answer, provide an explanation for how you got it.",
    prompt:
      "A taxi driver earns $9461 per 1-hour work. " +
      "If he works 12 hours a day and in 1 hour he uses 14-liters petrol with price $134 for 1-liter. " +
      "How much money does he earn in one day?",
  });
}

await Tracer.observe(main)().catch(console.error);
await Tracer.shutdown();

Quickstart

AI SDK 6 and older enables telemetry on each AI SDK call with experimental_telemetry.

Install Dependencies

npm install ai @ai-sdk/openai judgeval zod
yarn add ai @ai-sdk/openai judgeval zod
pnpm add ai @ai-sdk/openai judgeval zod
bun add ai @ai-sdk/openai judgeval zod

Initialize Tracer

instrumentation.ts
import { Tracer } from "judgeval";

await Tracer.init({
  projectName: "AI SDK Weather Agent",
});

Enable Telemetry

Enable experimental_telemetry and pass the Judgment OpenTelemetry tracer.

weatherAgent.ts
import "./instrumentation"; 
import { openai } from "@ai-sdk/openai";
import { generateText, tool } from "ai";
import { z } from "zod";
import { Tracer } from "judgeval"; 

async function main() {
  const result = await generateText({
    model: openai("gpt-5.2"),
    tools: {
      weather: tool({
        description: "Get the weather in a location",
        inputSchema: z.object({
          location: z.string().describe("The location to get the weather for"),
        }),
        execute: async ({ location }) => ({
          location,
          temperature: 72 + Math.floor(Math.random() * 21) - 10,
        }),
      }),
    },
    experimental_telemetry: { 
      isEnabled: true, 
      tracer: Tracer.getOTELTracer(), 
    }, 
    prompt: "What is the weather in San Francisco?",
  });

  return result;
}

await main().catch(console.error);
await Tracer.shutdown(); 

For Quick Scripts: The Tracer.shutdown() call is essential for short-lived scripts to ensure all traces are exported before the process exits. For long-running servers (e.g., Express, Next.js), this is not necessary as the tracer will export spans continuously throughout the application lifecycle.

If you need additional time for async operations to complete before shutdown:

Node.js / Express:

await main().catch(console.error);
await new Promise((resolve) => setTimeout(resolve, 10000)); // Give time for traces to export
await Tracer.shutdown();

Bun:

await main().catch(console.error);
await Bun.sleep(10000); // Give time for traces to export
await Tracer.shutdown();

Next Steps