OptionaloptionLevel: VoiceConfig
RunOptions.voice — the per-invocation override (seeds the carrier).
OptionalscenarioLevel: VoiceConfig
ScenarioConfig.voice — the carrier that reaches call().
Optionaldefaults: Partial<ResolvedVoiceConfig>
Optional default overrides (test hook).
Resolve the per-run voice config.
Two-tier merge with the
run()-boundary override in front of the scenario-level config:optionLevel(fromRunOptions.voice) wins field-by-field overscenarioLevel(fromScenarioConfig.voice), then pure defaults fill the rest. The resolvedsttis a concrete provider — the default OpenAI provider is constructed here per-run when unset.