Skip to main content
The library traces each call the same way on LiveKit and Pipecat. A call is one trace. Each caller turn is a span, with the speech, the model requests and the tool calls under it. You pick where the spans go. In the salon tutorial, See every call builds this step by step.

Turn it on

Build one Telemetry for every call, and give it to the agent.
On LiveKit, the trace ends and is sent when the session closes. On Pipecat, close does it. Leave Pipecat’s own enable_tracing off, or the call is traced twice.

Pick where the spans go

Change the sink. The rest of your code stays the same.

Langfuse

Logfire

Coval

A call that Coval placed joins its simulation. Any other call is filed as a Coval conversation when it ends.

Datadog

Send the spans to an OpenTelemetry Collector. The Collector sends them to Datadog.
collector.yaml

Any OpenTelemetry endpoint

Send to several at once

Pass more than one sink. Each one gets every span.

Keep transcripts out

Add filter=MetadataOnly() to a sink. It then gets timings and names, and no transcript or prompt. The other sinks still get everything.

What you see

  1. The call span holds the transcript and why the call ended.
  2. Each turn holds what the caller said, what the agent said and how long the reply took.
  3. Each model span holds the prompt the model really read, the tools and the tokens.
  4. A missing time is left out, never sent as 0.

Where to go next

Telemetry reference

Every helper, sink argument, span and attribute.

Dev records

What one call did, for the local dev page.

Settings

Every Langfuse, Logfire and Coval variable.

Tracing on Unmute

The tracing key of agent.yaml, on the Unmute tab.