The agents participating in the scenario.
A description of what the scenario tests.
OptionalidOptional unique identifier for the scenario. If not provided, a UUID will be generated.
OptionalmaxThe maximum number of turns to execute.
If no value is provided, this defaults to DEFAULT_MAX_TURNS.
OptionalmetadataOptional metadata to attach to the scenario run.
Accepts arbitrary key-value pairs (e.g. prompt IDs, environments, versions).
The langwatch key is reserved for platform-internal use.
The name of the scenario.
OptionalonOptional callback invoked for every audio chunk that flows through a voice adapter (both user-side and agent-side).
Mirrors Python scenario.run(on_audio_chunk=...). Best-effort — if
the hook throws, the scenario continues uninterrupted.
OptionalonOptional callback invoked for every VoiceEvent appended to
the timeline (user_start_speaking, agent_stop_speaking, etc.).
Mirrors Python scenario.run(on_voice_event=...). Best-effort — if
the hook throws, the scenario continues uninterrupted.
OptionalscriptThe script of steps to execute for the scenario.
OptionalsetOptional identifier to group this scenario into a set ("Simulation Set"). This is useful for organizing related scenarios in the UI and for reporting. If not provided, the scenario will not be grouped into a set.
OptionalthreadOptional thread ID to use for the conversation. If not provided, a new thread will be created.
OptionalverboseWhether to output verbose logging.
If no value is provided, this defaults to DEFAULT_VERBOSE.
OptionalvoicePer-run voice configuration (ADR-002). This is the carrier that reaches
every call() via AgentInput.scenarioConfig — the STT/TTS
providers the judge's transcription pass and the user-simulator's TTS
pass read live here, NOT in a module global. An optional
RunOptions.voice override seeds this at the run() boundary
(options?.voice ?? cfg.voice ?? default); the resolved provider is
always read off cfg.voice. See voice/config.ts#resolveVoiceConfig.
Configuration for a scenario.