ZeroEval is an evals, A/B testing and monitoring platform for AI products.
For full documentation visit https://docs.zeroeval.com.
• Span decorator & tracer API – instrument any function with a single line and capture sessions, traces and spans easily.
• Integrations – OpenAI client, Vercel AI SDK, Claude Agent SDK, and LangChain/LangGraph are traced automatically (optional peer deps).
• Works everywhere – Node 18+, Bun, browser (Vite / Next.js).
| Feature | TypeScript SDK | Python SDK |
|---|---|---|
| Observability | ✅ Supported | ✅ Supported |
| Datasets | ✅ Supported | |
| Experiments | ✅ Supported |
npm install zeroevalOptional dependencies for integrations:
npm install openai
npm install ai @ai-sdk/openai
npm install langchain
npm install @anthropic-ai/claude-agent-sdk- Environment variable (recommended)
export ZEROEVAL_API_KEY=YOUR_KEY - In code
import * as ze from "zeroeval"; ze.init({ apiKey: "YOUR_KEY" });
The SDK auto-initialises on first span if ZEROEVAL_API_KEY is set.
import * as ze from "zeroeval";
import { OpenAI } from "openai";
ze.init();
const openai = ze.wrap(new OpenAI());
// Traced automatically
const completion = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(completion.choices[0].message.content);import * as ze from "zeroeval";
import { OpenAI } from "openai";
ze.init();
const openai = ze.wrap(new OpenAI());import {
ZeroEvalCallbackHandler,
setGlobalCallbackHandler,
} from "zeroeval/langchain";
setGlobalCallbackHandler(new ZeroEvalCallbackHandler());import * as ze from "zeroeval";
import { openai } from "@ai-sdk/openai";
const wrappedAI = ze.wrap(ai);
const result = await wrappedAI.generateText({
model: openai("gpt-4o-mini"),
prompt: "Hello, world!",
});import * as ze from "zeroeval";
import * as claudeAgentSdk from "@anthropic-ai/claude-agent-sdk";
ze.init();
const sdk = ze.wrapClaudeAgentSdk(claudeAgentSdk);
// or: const sdk = ze.wrap(claudeAgentSdk);
for await (const message of sdk.query({
prompt: "What files are in this directory?",
options: { allowedTools: ["Bash", "Glob"] },
})) {
if ("result" in message) console.log(message.result);
}You can also wrap just the query function directly:
import { query } from "@anthropic-ai/claude-agent-sdk";
import * as ze from "zeroeval";
const tracedQuery = ze.wrapClaudeAgentQuery(query);