Member Junction
    Preparing search index...

    Interface RealtimeVoicePersona

    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).

    interface RealtimeVoicePersona {
        firstMessage?: string;
        speakingStyle?: string;
        tone?: string;
        voice?: string;
    }
    Index

    Properties

    firstMessage?: string

    The 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.

    speakingStyle?: string

    Speaking style guidance (e.g. "concise sentences, no filler words").

    tone?: string

    Overall vocal tone (e.g. "warm and upbeat").

    voice?: string

    The 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.