How can I export Agent Insights to my own cloud provider?

How can I export the transcripts, traces, agent logs, and audio recordings from Agent Insights to my own cloud provider?

LiveKit Agent Insights displays the following information about your Voice AI session:

  • Transcript: what was said, who said it, when it was said, and any associated metadata.
  • Traces: the flow of the session broken down by each stage of the voice pipeline (STT, EOU, LLM, tool calling, TTS) along with the metrics associated with that stage.
  • Agent logs for the duration of the session.
  • An audio recording of both the agent and the participant.

If you want access to this data but are unable to use Agent Insights, for example, because Agent Observability is disabled, or you are self-hosting LiveKit you can collect the same data yourself as follows:

Session report

First, generate a session report after the session has completed, as detailed in Session reports. Call ctx.make_session_report() inside the on_session_end callback (Python) or ctx.makeSessionReport() (Node.js), serialize it to JSON, and upload the resulting file to a location of your choice.

The report is a single JSON object.

Transcripts

Transcripts live under chat_history.items and are stored as an array of turn items. Each message item includes its role (user or assistant), the spoken content, a created_at timestamp, an interrupted flag, transcript_confidence, and a per-turn metrics object.

Two things to be aware of:

  • created_at is a Unix epoch timestamp in seconds (e.g. 1782813027.95855), not a formatted datetime string.
  • chat_history.items also contains non-message items such as agent_handoff and agent_config_update (the latter holds the full system prompt). To produce a clean transcript, filter to items where type == "message".

Be aware that if you want transcripts in realtime, you should subscribe to the conversation_item_added event.

Traces

Traces are available under the events key. You’ll see event types such as agent_state_changed (initializinglisteningthinkingspeaking), user_state_changed, user_input_transcribed (with interim and final transcripts), speech_created, session_usage_updated, and conversation_item_added. Converting these into the span/timeline view shown in Agent Insights will require some interpretation, but all the required data is present.

The richest per-turn metrics are attached to each message’s metrics object (present both in events and in chat_history.items). For assistant turns this includes llm_node_ttft, tts_node_ttfb, playback_latency, and e2e_latency; for user turns, transcription_delay, end_of_turn_delay, and started_speaking_at / stopped_speaking_at. Note that llm_node_ttft and tts_node_ttfb are only populated by the STT-LLM-TTS pipeline and are empty when using a realtime model.

In Python, traces can also be exported directly to any OpenTelemetry-compatible backend. See Export traces.

Agent logs

Agent logs are not part of the session report. You can access agent logs as described in:

  • Log drains: forward runtime logs to external services such as Datadog, CloudWatch, Sentry, New Relic, Splunk, or syslog-compatible endpoints.
  • Agent logs blog post

Audio recordings

The session report contains an audio_recording_path key (alongside audio_recording_started_at).

Rather than reading from that path, it is recommended that you use LiveKit Egress to obtain recordings and write them directly to your own storage provider (e.g. an S3 bucket).

Note that the audio captured for Insights is recorded after agent noise cancellation is applied, so it reflects what the STT or realtime model heard; Egress recordings are captured prior to agent noise cancellation.

Other

The report also contains information beyond the four categories above, useful for correlating a session with your own systems and for cost/billing analysis. This includes job and room identifiers, session configuration, per-model token usage or duration and other top-level metadata.

Finally, note that all Agent Observability data in LiveKit Cloud is subject to a 30-day retention window, so you should export to your own provider if you need longer-term storage.