Skip to main content

Observability

@agentskit/observability provides pluggable Observer implementations for @agentskit/core AgentEvent streams. Observers are lazy-friendly: import only the backends you wire into createRuntime or useChat via observers in config.

When to use

  • You need structured logs during agent steps (consoleLogger).
  • You export traces to LangSmith or OpenTelemetry-compatible collectors.

Installation

npm install @agentskit/observability @agentskit/core

Built-in observers

Console logger

import { consoleLogger } from '@agentskit/observability'

const observer = consoleLogger({ format: 'human' }) // or 'json'

Human: colored, indented stderr. JSON: newline-delimited events for ingestion pipelines.

LangSmith

import { langsmith } from '@agentskit/observability'

const observer = langsmith({
apiKey: process.env.LANGSMITH_API_KEY,
project: 'my-agent',
})

OpenTelemetry (OTLP)

import { opentelemetry } from '@agentskit/observability'

const observer = opentelemetry({
endpoint: 'http://localhost:4318/v1/traces',
serviceName: 'my-agent-service',
})

Spans follow GenAI semantic conventions where applicable.

Attach to runtime

import { createRuntime } from '@agentskit/runtime'
import { anthropic } from '@agentskit/adapters'
import { consoleLogger } from '@agentskit/observability'

const runtime = createRuntime({
adapter: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, model: 'claude-sonnet-4-6' }),
observers: [consoleLogger({ format: 'json' })],
})

await runtime.run('Hello')

Pass the same observers array to useChat for browser sessions.

createTraceTracker

Low-level helper that turns AgentEvent into start/end span callbacks — use when you need a custom exporter but still want consistent parent/child timing.

import { createTraceTracker } from '@agentskit/observability'
import type { AgentEvent } from '@agentskit/core'

const tracker = createTraceTracker({
onSpanStart(span) {
/* send span open to your backend */
},
onSpanEnd(span) {
/* close span */
},
})

const bridge = {
name: 'trace-bridge',
on(event: AgentEvent) {
tracker.handle(event)
},
}

AgentEvent reference (core)

Events are defined in @agentskit/core (not exhaustive here — see TypeDoc):

Event typeMeaning
llm:start / llm:first-token / llm:endModel call lifecycle
tool:start / tool:endTool execution
memory:load / memory:saveChat memory persistence
agent:stepReAct step marker
agent:delegate:start / agent:delegate:endSub-agent delegation
errorRecoverable or fatal error surface

Custom observer

Implement Observer from @agentskit/core:

import type { AgentEvent, Observer } from '@agentskit/core'

const myObserver: Observer = {
name: 'my-backend',
on(event: AgentEvent) {
if (event.type === 'error') {
console.error(event.error)
}
},
}

Troubleshooting

IssueMitigation
No spans in LangSmithVerify LANGSMITH_API_KEY and project name; check network egress from CI.
OTLP drops dataConfirm collector URL and HTTP/protobuf mode match your stack.
Double loggingDeduplicate observers — each on receives every event.

See also

Start here · Packages · TypeDoc (@agentskit/observability) · Eval · Runtime · @agentskit/core