@langwatch/scenario
    Preparing search index...

    Interface TranscribeAudioMessagesArgs

    Arguments for the shared transcribeAudioMessages STT pre-pass.

    interface TranscribeAudioMessagesArgs {
        includeAudio: boolean;
        logWarn?: (message: string) => void;
        messages: readonly ModelMessage[];
        stt: STTProvider;
        transcriptCache?: Map<string, string>;
    }
    Index
    includeAudio: boolean

    Keep the raw audio file part alongside the transcribed text when true; drop it (text-only) when false. Judge passes its multimodal knob here; the user-simulator passes true so stripAudioContent's echo-safety reframing (which keys on a message having BOTH audio and text) still triggers.

    logWarn?: (message: string) => void

    Warning sink — defaults to console.warn.

    messages: readonly ModelMessage[]

    Conversation history to transcribe over.

    Per-run STT provider (from the resolved cfg.voice.stt).

    transcriptCache?: Map<string, string>

    Optional cross-call transcript cache keyed by a STABLE audio key (the raw audio payload). Prevents re-transcribing the SAME audio on every call.

    The judge builds a transcript once per verdict and passes no cache. The user-simulator's STT fallback, by contrast, re-runs over the WHOLE history on EVERY proceed() turn: without a cache, an audio-only agent turn that stays in history is transcribed on turn N, again on N+1, N+2, … turning a single dropped agent_response into O(turns^2) STT calls (#735 P2). The simulator passes a per-instance Map so each distinct audio chunk hits the provider at most once for the life of the simulator instance.