Skip to main content
PraisonAI TypeScript records every LLM call, tool execution, and Agent decision as traces. Langfuse delivers those traces to a real backend (install langfuse). The other 13 external adapters are wired in but record to memory only — they do not send traces to their vendor backends today. The built-in console and memory adapters record locally.
Only Langfuse (with the langfuse npm package installed) ships traces to an external vendor. console and memory record locally. The other 13 external adapters accept traces and hold them in memory only — no network call is made, and setting the vendor’s env var does not enable delivery. See the Delivery Matrix below.

Observability Delivery Matrix

One table decides where your traces actually go today. This mirrors the delivers field in the SDK (src/observability/types.ts).
console and memory are genuine local recorders: they do exactly what they claim (write to stdout / hold spans in memory), but they do not deliver to an external vendor. The 13 external adapters above record to memory and discard on exit.

Supported Observability Tools

The Env Variable column shows what the SDK reads. Setting the variable does not enable delivery for any adapter marked — those traces stay in memory. The CLI marks these with [no delivery - in-memory only].

Quick Start

1

Simple Usage

2

With Configuration

Agent with Tracing

Multi-Agent Tracing

Track interactions between multiple Agents:

Agent Performance Monitoring

Track latency, tokens, and costs:

Agent Debugging

Debug Agent decisions and tool calls:

Langfuse Integration (the delivery recipe)

Langfuse is the one external adapter that ships traces to a real backend. langfuse is an optional peer dependency of praisonai \u2014 install it separately:
isEnabled becomes true only after the adapter successfully creates a Langfuse client from that package. If the package is missing, the adapter falls back to memory and flush() warns that nothing was delivered.

How to know if my traces are actually going anywhere

Check isEnabled. The 13 external adapters have no transport, so it is always false \u2014 this is not a config bug.
Constructing any of the 13 non-delivering adapters prints a console.warn, and calling flush() on them warns that nothing was delivered:

Why an in-memory adapter for a vendor I’ve never used?

The 13 non-delivering adapters still record spans to an in-memory buffer you can drain via getAllTraces() or route through a custom flush(). They share the UndeliveredObservabilityAdapter base class (src/observability/adapters/external/undelivered.ts) and act as placeholders for future real delivery. Until then, use langfuse for vendor delivery or console/memory for local development.

Custom Observability for Agents

Build custom monitoring:

Agent Audit Logging

Track Agent actions for compliance:

Switching Observability Tools

Switching adapters is not equivalent. Only langfuse, console, and memory produce user-visible artifacts today (noop records nothing). The other 13 adapters accept traces and discard them on exit \u2014 switching to weave or arize records to memory only, no matter what env var you set.

Multi-Agent Attribution

Track agent_id, run_id, and trace_id across multi-agent workflows:

Environment Variables

Langfuse is the only env-configured adapter that delivers. The rest are read by the SDK for future compatibility \u2014 setting them today does not enable delivery; traces still stay in memory.

Tool Features Matrix

Recording ≠ delivery. Every adapter records Traces/Spans/Events/Errors to memory, but only Langfuse can Export (deliver). The Delivers column is the one that decides whether traces leave the process. Values match OBSERVABILITY_TOOLS in src/observability/types.ts.
Recording is not delivery. A ✅ in Traces/Spans/Events/Errors means the adapter records it to memory. Only a ✅ in the Delivers column means traces reach the vendor \u2014 see the Delivery Matrix.

Observability CLI

CLI commands

Evaluation

Test Agent quality