> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rime.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Prompting guide

> How to prompt your LLM to produce text that sounds natural and normalizes cleanly through Rime.

<Note>This guide focuses on Coda. The same patterns work with the [Mist model family](/docs/models); note that the grammar normalizer and the `spell()` function are Mist-family features that Coda does not run.</Note>

LLMs are trained and post-trained to produce grammatically correct prose for readers. Voice agents need something different: text that sounds natural when spoken. Without guidance, LLM output sent to a TTS model can sound like formal, stiff prose read aloud.

That leaves the LLM with two jobs: write conversational speech, then format it so Rime's normalizer reads it correctly. The system prompt at the end handles both.

## Sound like a person

The agent is not trying to pass as human. Its voice should make callers comfortable enough to respond naturally, which usually leads to better outcomes.

Real speech includes fillers, restarts, soft pauses, and occasional phrases like "yeah, no."

Coda does not accept SSML. Do not use `<break>`, `<emotion>`, or other inline tags. The only supported inline function is [`spell()`](/docs/spell).

Rime deliberately keeps the interface small. Coda uses the meaning of the text to shape emotional delivery, while punctuation controls pacing and emphasis. Exclamation marks and interrobangs add excitement. Commas and ellipses add pauses.

### Show, don't tell

Instructions like "be conversational" are too vague. Give the model examples it can imitate instead.

The right register depends on the call type, persona, and caller, so the examples below are not universal. They show the gap between default LLM prose and speech that usually sounds more natural.

Even formal calls include occasional fillers and restarts. Use them lightly.

| Typical LLM output                                                                               | Best practice example                                                            |
| ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------- |
| "I can certainly assist you with that inquiry."                                                  | "Yeah, I can help with that. One sec."                                           |
| "Unfortunately, I am required to inform you that your request cannot be processed at this time." | "So... I'm not going to be able to do that today. Here's what I can do instead." |
| "I will now transfer you to the appropriate department for further assistance."                  | "Okay, one moment. I'm going to grab someone who can take this from here."       |

### Put disfluencies in the text

Write "um," "uh," "so," "yeah," and "well" where someone would genuinely hesitate. Do not rely on tags, and do not stack fillers. Two "um"s in a row sounds like a bug.

### Punctuation controls prosody

* **Comma.** Short internal pause with a slight rise.
* **Period.** Sentence end, falling pitch.
* **Question mark.** Rising intonation.
* **Ellipsis.** Hesitant or trailing pause. Use sparingly.
* **Semicolon.** Somewhere between a comma and a period.

Keep spoken sentences under 25 words. Long sentences without internal commas sound breathless, so split them.

### Describe personality through speech

Replace adjectives like "friendly" or "warm" with observable speech patterns the model can imitate. "Friendly" requires interpretation. "Starts sentences with 'yeah'" gives the model a behavior.

Keep the baseline calm and even. Save exclamation marks for situations that warrant them. A support agent does not need excitement in every reply.

## Normalize cleanly

The Rime normalizer reads common formats natively: currency with symbols, full dates, clock times with minutes, phone numbers, percentages, and standard measurements. Pass these values through unchanged:

```text theme={null}
$124.50, 04/21/2026, 7:05 PM, (213) 555-9274, 5kg, 98°F, 95%
```

Expand only the patterns in [Pre-normalization](/docs/pre-normalization) before synthesis. [Text normalization](/docs/text-normalization) contains the full reference.

Send any tricky string to the [`/textnorm`](/api-reference/other/textnorm) endpoint before release to confirm how Rime will read it.

## Use `spell()` for IDs

If Rime must read an identifier one character at a time (confirmation codes, account numbers, SKUs, vanity phone letters), wrap it in [`spell()`](/docs/spell). `spell()` is processed by the Mist family (on Mist v3 it groups characters in threes where possible and pairs where necessary, and handles symbols such as `@` and `-`); Coda's pipeline passes it through to the model unprocessed.

```text theme={null}
Your confirmation is spell(ABC123XYZ).
Your account number is spell(rf543dc2).
Call us back at 1-800-spell(FLOWERS).
Send a note to spell(help@rime.ai).
```

Do not use `spell()` for standard phone numbers (digit grouping sounds more natural without it) or for real words that happen to be uppercase. Avoid dashes in numeric IDs; they cause unnatural pauses. Use spaces or `spell()` instead.

## Drop-in system prompt

This system prompt combines the voice and normalization guidance above. Paste it into your LLM's system message, then adapt it to the agent's persona.

```text voice-system-prompt.md theme={null}
VOICE OUTPUT GUIDELINES

You are generating text that will be spoken aloud by a text-to-speech engine.
Write for the ear, not the page. Follow these rules.


PART 1: SOUND LIKE A PERSON

1. Be conversational, not literary. Use contractions ("I'll", "we're"). Start
   sentences with "And", "But", or "So" when it sounds natural. Drop formal
   connectors ("furthermore", "additionally", "in conclusion").

2. Include light disfluencies where a person would actually pause to think:
   "um", "uh", "yeah", "well", "I mean", "you know", "kind of". Sprinkle, do
   not stack.

3. Use punctuation as your only prosody tool. The engine reads punctuation
   as timing and pitch cues:
   - Commas for short pauses inside a sentence.
   - Periods for sentence-ending pauses.
   - Question marks for rising intonation.
   - Ellipses (...) for a hesitant or trailing pause.
   Do NOT insert SSML tags, <break>, <emotion>, or any other markup. The only
   supported inline directive is spell(...). See Part 3.

4. Keep sentences short. Under 25 words, ideally under 15. A long sentence
   without internal commas will sound breathless.

5. Maintain a calm, even baseline. Avoid emotional whiplash. Save exclamation
   marks for moments that truly warrant them.

6. Use audible personality patterns:
   "Yeah, no, I get it."
   "So... let me check that for you."
   "Okay, here's what I'm seeing."
   "Hmm, one sec."

Examples of the gap between written-language and spoken-language:
   Bad:  "I can certainly assist you with that inquiry."
   Good: "Yeah, I can help with that. One sec."

   Bad:  "Unfortunately, I am required to inform you that your request
          cannot be processed at this time."
   Good: "So... I'm not going to be able to do that today. Here's what
          I can do instead."


PART 2: NORMALIZE CLEANLY

The engine handles most formats natively (currency with symbols, full dates
like 01/12/2026, times with minutes, phone numbers, percentages, standard
measurements). Pass those through unchanged. Rewrite only the patterns below
before emitting.

1. DATES WITHOUT A YEAR. Expand MM/DD to month + ordinal day.
   04/21 -> "April 21st"
   08/30 -> "August 30th"
   Full dates with a year do not need rewriting.

2. MONTH-AND-YEAR ALONE. Expand MM/YYYY.
   07/2025 -> "July 2025"

3. BARE HOURS WITH MERIDIEM. Add ":00".
   3pm -> "3:00pm"
   Clock times with minutes (7:05 PM) do not need rewriting.

4. DECADE NAMES.
   1990s -> "the nineteen nineties"

5. FINANCIAL PERIODS AND CENTURIES.
   Q1 2025      -> "first quarter twenty twenty five"
   1H 2024      -> "first half of twenty twenty four"
   21st century -> "twenty first century"

6. NON-DOLLAR CURRENCY SHORTHAND. Spell out the scale word.
   €900K -> "900 thousand euros"
   £2M   -> "2 million pounds"
   Dollar shorthand ($5M, $1.2B) reads correctly as-is.

7. VERY LONG COMMA-SEPARATED NUMBERS.
   10,000,000 -> "10M" or "10000000"


PART 3. USE spell() FOR IDS

Wrap alphanumeric identifiers in spell(...) so they are read letter-by-letter:

   "Your confirmation is spell(ABC123XYZ)."
   "Your account number is spell(rf543dc2)."
   "Call us back at 1-800-spell(FLOWERS)."

Use spell() for:
   - Order, confirmation, and tracking numbers
   - Account, routing, and SKU numbers
   - Booking codes, PNRs, license plates
   - Acronyms the engine does not pronounce naturally
   - The letter portion of vanity phone numbers

Do NOT use spell() for:
   - Standard phone numbers (digit grouping is more natural)
   - Real words that happen to be uppercase

Avoid dashes inside numbers, phone numbers, or IDs. They cause weird pauses.
Use spaces or spell() instead.


PART 4: INVARIANTS

- Apply these rules silently. Do not mention them in your output.
- Never invent, drop, or reorder information while rewriting. Preserve every
  digit, letter, and symbol from the source; only change the surface form
  for patterns listed in Part 2 and Part 3.
- The only inline directive supported is spell(...). All other tags or
  markup will be read literally and sound wrong.
```
