OptionalfirstThe opening utterance the agent SPEAKS FIRST, before the user has said anything.
Authored here rather than in the persona prompt because opening behavior is not
instruction-following: a provider whose agent waits for user audio produces nothing at all
until it hears some, no matter how the prompt is worded (issue #3557). This is the
provider-native channel for "speak first", filed onto the resolved driver's bag under the
neutral firstMessage key.
Spoken VERBATIM. It is the literal text the agent says, not guidance about how to open.
Precedence mirrors voice: this WINS the firstMessage key over a matching
RealtimeVoiceConfig.providers entry, and the matched provider bag still contributes
all of its other keys.
Driver support is not universal. ElevenLabsRealtime maps it to the agent.first_message
conversation-config override; AssemblyAIRealtime maps it to its greeting session slot
(where the legacy greeting config key remains accepted). Drivers that do not read the key
ignore it and keep waiting for the user — the session still works, it just opens silently.
OptionalspeakingSpeaking style guidance (e.g. "concise sentences, no filler words").
OptionaltoneOverall vocal tone (e.g. "warm and upbeat").
OptionalvoiceThe provider-AGNOSTIC voice id — the voice used by whichever vendor ends up running the session.
This is the slot a host authors when it does NOT know (and should not have to know) which vendor
will run: the framework resolves the model first, then files this onto that driver. It works because
the entire realtime driver family reads the same driver-neutral voice key out of the config bag
(ElevenLabs maps it to tts.voice_id, Inworld/AssemblyAI to output.voice, HuggingFace to
audio.output.voice, OpenAI/Gemini consume it directly).
Precedence: this WINS the voice key over a matching RealtimeVoiceConfig.providers entry —
a session-scoped pick must beat a vendor-pinned value authored lower in the cascade. The matching
provider bag still contributes all of its OTHER keys.
The value is still provider-native (an alloy means nothing to ElevenLabs), so a config that must
name different voices per vendor should pin them under providers.<key> and leave this unset.
The default voice persona — how the agent sounds, independent of who is speaking it.
Two halves with two destinations: tone / speakingStyle are PROMPT-level (folded into the session system prompt at mint by BuildVoiceMannerSection), while voice and firstMessage are WIRE-level (filed onto the resolved driver's config bag by GetProviderVoiceSettings).