Skip to main content
You have: Robin with turn pace, idle nudges and an end-call tool, from Quiet callers. After the call, you can open it in Langfuse and see what happened.

What you add

A Telemetry object records one trace for one call. A sink, here Langfuse, says where the trace goes. The sink reads its keys from the environment, so no key is in your code.
Build it for each call. The example builds it only when the keys are set, so the same file runs with or without Langfuse.
On LiveKit, the adapter starts and closes the trace with the session. On Pipecat, you start it and close it, because you own the runner. The complaint specialist is built without telemetry. It records into the concierge’s spans, so one call is one trace even after a handoff.

Try it

Run a call as before, with the three keys set. Book a haircut, then hang up.
  1. Open your project in Langfuse. A trace for your call should appear.
  2. Open it. You should see the turns, the transcript, the model requests and the tool calls.
  3. Run a call again with no keys. The agent works the same and sends nothing.

Why it works this way

Each framework gives its own events in its own shape. The adapters turn them into one trace shape, so a LiveKit call and a Pipecat call look the same in Langfuse. The call ends with one reason on both. Langfuse is one sink. Telemetry takes others too, and the page on telemetry lists them. Your agent code does not change when the sink does.

What you have now

Next: What you built

Compare your agent with the full example, and run it.
Go deeper: Telemetry.