Skip to main content
You can use each part of unmute-core on its own. Your agent stays a plain LiveKit Agent or a plain Pipecat pipeline. You add only what you need. On this page:

Quickstart

agent.py
The agent keeps its own LLM plugin, its own speech to text and text to speech, and its own pipeline. Here speech runs on SLNG: Soniox hears the caller and Fish Audio speaks. See SLNG. The library adds the tool, with its announce line. Working files for every piece are in examples/minimal/livekit/ and examples/minimal/pipecat/:

What works where

Each row links to the page that holds the recipe. On Pipecat, pass transport= to attach_call or open_call, so the transport’s hang-up makes the call’s end read caller_hung_up. Pass call= to max_duration, idle_nudges, IdleNudgeObserver, SipLine, end_call_tool, voicemail_tool and dial_out so the end reads the right reason. See Why the call ended. max_duration and the call info builders (sip_call_info, telephony_call_info) also work on a plain agent. See LiveKit and Pipecat.

A handoff on a plain agent

On Pipecat, UnmuteFlows works without tasks. Give each agent a spec with only its prompt. The next agent runs on the same CallState:
On LiveKit, a plain Agent hands off the LiveKit way, by returning a new agent from a tool. Build it with Agent(chat_ctx=shape_chat_ctx(self.chat_ctx, HandoffContext(...))) to keep the library’s history rules. See Handoffs.

What still needs UnmuteAgent or UnmuteFlows

  • Tasks and groups on LiveKit need UnmuteAgent. It runs each step as its own agent.
  • Tasks and groups on Pipecat need UnmuteFlows, with the plan in the spec’s tasks.
  • A full handoff on LiveKit (announce line, model and voice switch, summary) needs UnmuteAgent.hand_off. The history rules work on a plain agent through shape_chat_ctx.
  • Model hooks run only where the library sends the model request. A plain agent keeps them by calling filled_llm or traced_llm in its llm_node on LiveKit, or by passing llm= to attach_call on Pipecat. Without that, the adapter logs one warning. See Hooks.
  • A held save at the end of a call is settled by call.end, or by UnmuteAgent on LiveKit and flows.settle() on Pipecat.
Everything else works on a plain agent.

Where to go next

LiveKit

The full agent on LiveKit.

Pipecat

The full flow on Pipecat.

Tools

The tool registry that both frameworks share.

Turn taking

Turn pace, interruption and idle nudges.