The call
A caller phones the salon. The agent, Robin, answers.- The caller asks for a haircut on Friday. Robin checks the diary and offers times.
- The caller gives their phone number. Robin saves it, reads it back and waits for a yes.
- The caller picks a time. Robin asks “Shall I book it?” and books only after the caller agrees.
- The caller says a colour went wrong. Robin hands the call to a complaint specialist, who takes it down.
- The caller says goodbye. Robin says goodbye and hangs up.
The finished agent
The agent lives in one framework-neutral package,salon/. It imports only unmute-core. The LiveKit file and the Pipecat file build the pipeline around it.
What you need
- Python 3.12 and uv.
- An SLNG API key and its region, for speech. The pages use SLNG’s Soniox speech to text and Fish Audio text to speech.
- An OpenAI API key for the model. Any LLM plugin works.
- For LiveKit, the
lkCLI. Console mode needs no LiveKit server. - For Pipecat, nothing more. The Pipecat runner serves a test page on your machine.
- Optional, for the last step: Langfuse keys.
The files you will grow
salon/ folder like the example does, and add it to each framework project as a path dependency. Copy the three pyproject.toml files from examples/salon-concierge-unmute/ and keep only what you use. store.py is plain Python with no framework in it, so copy it too.
Code in salon/ has no framework in it, so it has no tabs. Where LiveKit and Pipecat differ, a page shows one tab for each.
The nine steps
Start with step 1: Answer the phone
The smallest agent that picks up and says hello.