Integration guide

Anthropic Claude SDK Integration

Add Nexus observability to your Claude API calls. Works with claude-3-5-sonnet, claude-opus-4, and all models accessible via the Anthropic SDK — including streaming and multi-turn conversations.

Quickstart

Install both SDKs, then wrap your Anthropic calls inside a Nexus trace. Record input/output tokens in metadata for cost tracking.

TypeScript
npm install @anthropic-ai/sdk @keylightdigital/nexus
Python
pip install anthropic keylightdigital-nexus

TypeScript example

import Anthropic from '@anthropic-ai/sdk'
import { NexusClient } from '@keylightdigital/nexus'

const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY })
const nexus = new NexusClient({
  apiKey: process.env.NEXUS_API_KEY!,
  agentId: 'my-claude-agent',
})

async function runAgent(prompt: string) {
  const trace = await nexus.startTrace({ name: 'claude-completion' })

  try {
    const span = await trace.startSpan({ name: 'anthropic.messages.create' })

    const message = await anthropic.messages.create({
      model: 'claude-sonnet-4-6',
      max_tokens: 1024,
      messages: [{ role: 'user', content: prompt }],
    })

    await span.end({
      status: 'success',
      metadata: {
        model: message.model,
        input_tokens: message.usage.input_tokens,
        output_tokens: message.usage.output_tokens,
        stop_reason: message.stop_reason,
      },
    })

    await trace.end({ status: 'success' })
    return message.content[0].type === 'text' ? message.content[0].text : ''
  } catch (err) {
    await trace.end({ status: 'error', metadata: { error: String(err) } })
    throw err
  }
}

Python example

import os
import anthropic
from keylightdigital_nexus import NexusClient

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
nexus = NexusClient(
    api_key=os.environ["NEXUS_API_KEY"],
    agent_id="my-claude-agent",
)

def run_agent(prompt: str) -> str:
    trace = nexus.start_trace(name="claude-completion")
    try:
        span = trace.start_span(name="anthropic.messages.create")

        message = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=[{"role": "user", "content": prompt}],
        )

        span.end(
            status="success",
            metadata={
                "model": message.model,
                "input_tokens": message.usage.input_tokens,
                "output_tokens": message.usage.output_tokens,
                "stop_reason": message.stop_reason,
            },
        )

        trace.end(status="success")
        return message.content[0].text if message.content else ""
    except Exception as err:
        trace.end(status="error", metadata={"error": str(err)})
        raise

Multi-turn conversation tracing

For multi-turn conversations, create one parent trace per session and one child span per API call. This gives you a waterfall view of the entire conversation in the Nexus dashboard.

// One trace = one conversation session
const trace = await nexus.startTrace({ name: 'conversation-session' })

for (const userMessage of conversationHistory) {
  const span = await trace.startSpan({ name: `turn-${turn++}` })
  const response = await anthropic.messages.create({ ... })
  await span.end({ status: 'success', metadata: { tokens: response.usage } })
}

await trace.end({ status: 'success' })

Each span appears as a row in the waterfall timeline on the trace detail page, making it easy to see which turns took longest.

Ready to trace your Claude agents?

Start free → View demo