Skip to main content
The caller phones the salon, and Robin says hello.

What you add

The prompt and the greeting go in the shared package. Both frameworks read them.
salon/agent.py
Greeting(text=...) is a fixed line. Code says it at once, so the caller does not wait for a model request. Now build the pipeline around it. This is the base you will grow.
The agent hears the caller through SLNG’s Soniox speech to text and speaks with SLNG’s Fish Audio text to speech. VOICE is a Fish Audio voice id. On LiveKit, stt.attach_to_session(session) lets speech to text close each caller turn as soon as the caller stops. AgentSpec describes the agent, the same way on both frameworks. For now it holds only the prompt, as plain text. UnmuteAgent runs it as a LiveKit Agent. UnmuteFlows runs it in a normal Pipecat pipeline. The None is the call state, which you add on the next page.

Try it

Set your keys, then start the agent. SLNG_WORLD_PART is your SLNG project’s region.
You should hear the greeting at once. Say “I’d like a haircut on Friday.” Robin answers in one or two short sentences and asks what it needs. It cannot check a diary yet.

Why it works this way

A plain agent usually asks the model to word the first line, and the caller waits for that request. The greeting here is code, so it plays at once. You still own the session, the pipeline and every plugin. UnmuteAgent and UnmuteFlows add the call behaviour on top. The next pages use them for state, tools, tasks and handoffs.

What you have now

Next: Remember the caller

Keep the caller’s number, and refuse a number that cannot be right.
Go deeper: Call lifecycle, LiveKit and Pipecat.