Fundamentals
These are starting points, not model guarantees. Keep what improves your own evaluation set.- Disfluency by design. If natural fillers suit the application, list a small approved vocabulary and evaluate how often the LLM uses it.
- Short sentences. Prefer concise turns for spoken conversations.
- End action-oriented turns clearly. Ask one question or state the next action when a response is needed.
- Persona and scope. State the agent’s role and allowed tasks explicitly. Treat prompt instructions as behavior guidance, not a security boundary.
- No
!unless you want shouting. The model treats!, ALL-CAPS, and?!as prosody cues. Same for emoji. - Choose your voice deliberately. Test candidate voices with representative text; see voices.
- Include examples. Cover at least the happy path, an edge case, and recovery behavior.
- Pin the language. Set
language="de"(or the appropriate code) and tell the LLM which language to use. - Markdown headers for the model, never in the output. Use
#to structure the prompt, but**asterisks**and- bulletsget read aloud literally. - Keep a regression set. Replay representative turns after prompt changes because LLM behavior is probabilistic.
Drop-in snippets
Personality presets
Disfluency
Give the LLM a short approved filler list and verify the result in evaluation:
Drop this block into your prompt as-is and swap the filler list for your persona:
Tool descriptions
- Atomic, capability-named:
get_available_slots, notappointments_v2_endpoint. - Format hint in every parameter: the model uses them as few-shot.
- Refer to tools by capability in prose, never by resource ID. IDs leak into spoken output.
- Speak before slow tool calls. Have the agent say a short line when a noticeable tool wait starts (for example “Let me check that for you”), so the caller gets immediate acknowledgement. Voice platforms such as Vapi call this a request-start message.
- Incremental capture: send the whole CRM record on every field update (empty string for unknowns) so a mid-call drop doesn’t lose state.
Workflow scaffold
Examples block (few-shot)
Include at least one happy path, one edge case, and one recovery example:What NOT to do
- Prefer positive instructions. State the desired behavior directly and test refusal cases separately.
- No multiple questions per turn. “Name and phone number?” → split into two turns.
- No markdown in output. The agent reads
**bold**aloud as “asterisk asterisk bold asterisk asterisk”. - No long monologues. Five options spoken in a row is unusable. Offer 2 max.
- No vague tool names.
do_thing→ the model picks the wrong tool. - No emotional spam. Laughter / “oh wow” / “that’s great” → at most one turn in four, never two in a row.
Full template
Drop in your personality preset, filler list, tool descriptions, workflow, and examples from the snippets above:Related
- Turn lifecycle: one session per turn, flush at end
- Latency: pre-warm at startup, set
language, measure TTFA correctly - Speech markup:
<spell>and<break>tags for shaping speech output - Streaming overview: wire your own LLM loop to streaming TTS
- LiveKit, Pipecat, Vapi, Cognigy: use a voice-agent framework instead