agentskit.js
Infrastructure

Observability

@agentskit/observability provides pluggable Observer implementations for @agentskit/core AgentEvent streams. Observers are lazy-friendly: import only the backends you wire into

@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

✎ Edit this page on GitHub·Found a problem? Open an issue →·How to contribute →

On this page