Skip to main content
You will build one agent, step by step. It answers the phone for a hair salon called Sage and Stone. Each page adds one piece of unmute-core and ends with a call you can try. The last page maps your code to a real example in the repository. CI runs that example on every change.

The call

A caller phones the salon. The agent, Robin, answers.
  1. The caller asks for a haircut on Friday. Robin checks the diary and offers times.
  2. The caller gives their phone number. Robin saves it, reads it back and waits for a yes.
  3. The caller picks a time. Robin asks “Shall I book it?” and books only after the caller agrees.
  4. The caller says a colour went wrong. Robin hands the call to a complaint specialist, who takes it down.
  5. 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 lk CLI. 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.
Install the library with the extra for your framework.

The files you will grow

Package the 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.