Skip to main content

Installation

npm install @fallom/trace @anthropic-ai/sdk

Quick Start

import fallom from "@fallom/trace";
import Anthropic from "@anthropic-ai/sdk";

// Initialize Fallom once at app startup
await fallom.init({ apiKey: process.env.FALLOM_API_KEY });

// Create a session for this conversation/request
const session = fallom.session({
  configKey: "my-app",
  sessionId: "session-123",
  customerId: "user-456",
});

// Wrap your Anthropic client
const anthropic = session.wrapAnthropic(new Anthropic());

// Use as normal - automatically traced!
const response = await anthropic.messages.create({
  model: "claude-sonnet-4-20250514",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Hello!" }],
});

console.log(response.content[0].text);

With System Prompt

const response = await anthropic.messages.create({
  model: "claude-sonnet-4-20250514",
  max_tokens: 1024,
  system: "You are a helpful assistant who speaks like a pirate.",
  messages: [{ role: "user", content: "Tell me about the weather." }],
});

Streaming

const stream = await anthropic.messages.stream({
  model: "claude-sonnet-4-20250514",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Write a poem about coding." }],
});

for await (const event of stream) {
  if (event.type === "content_block_delta") {
    process.stdout.write(event.delta.text || "");
  }
}

With Extended Thinking

const response = await anthropic.messages.create({
  model: "claude-sonnet-4-20250514",
  max_tokens: 16000,
  thinking: {
    type: "enabled",
    budget_tokens: 10000,
  },
  messages: [{ role: "user", content: "Solve this complex problem..." }],
});

// Access thinking and response
const thinking = response.content.find((c) => c.type === "thinking");
const text = response.content.find((c) => c.type === "text");

Model A/B Testing

import fallom from "@fallom/trace";
import Anthropic from "@anthropic-ai/sdk";

await fallom.init({ apiKey: "your-fallom-api-key" });

const session = fallom.session({
  configKey: "my-experiment",
  sessionId: "session-123",
});

const anthropic = session.wrapAnthropic(new Anthropic());

// Get assigned model for this session
const modelId = await session.getModel({ fallback: "claude-sonnet-4-20250514" });

const response = await anthropic.messages.create({
  model: modelId,
  max_tokens: 1024,
  messages: [{ role: "user", content: "Hello!" }],
});

What Gets Traced

FieldDescription
Modelclaude-sonnet-4-20250514, etc.
DurationTotal request time (ms)
TokensInput, output tokens
CostCalculated from token usage
PromptsSystem + user messages
CompletionsModel response
SessionYour config key + session ID

Next Steps