Skip to main content

Installation

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

Quick Start

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

// Initialize Fallom
await trace.init({ apiKey: process.env.FALLOM_API_KEY });

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

// Set session context (configKey, sessionId, userId)
trace.setSession("my-app", "session-123", "user-456");

// 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 { trace, models } from "@fallom/trace";
import Anthropic from "@anthropic-ai/sdk";

// Initialize both trace and models
await trace.init({ apiKey: "your-fallom-api-key" });
models.init({ apiKey: "your-fallom-api-key" });

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

// Get assigned model
const modelId = await models.get("my-experiment", "session-123", {
  fallback: "claude-sonnet-4-20250514",
});

trace.setSession("my-experiment", "session-123");

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