vercel/ai · error · InvalidArgumentError

Model '${this.modelId}' does not support streaming transcrip

Error message

Model '${this.modelId}' does not support streaming transcription. Use a live model such as 'gemini-3.5-transcribe-live'.

What it means

The mirror of error 368: doStream only works for live transcription model ids (isLiveTranscriptionModelId). If the configured modelId is a unary transcription model (e.g. 'gemini-3.5-transcribe'), streaming transcription is unsupported and it throws an InvalidArgumentError directing you to a live model. Unary models process a complete audio input in one request and have no streaming session.

Source

Thrown at packages/google/src/transcription/google-transcription-model.ts:242

        body: rawResponse,
      },
      ...(response.usage != null
        ? {
            providerMetadata: {
              google: { usage: response.usage as JSONObject },
            },
          }
        : {}),
    };
  }

  async doStream(
    options: TranscriptionModelV4StreamOptions,
  ): Promise<
    Awaited<ReturnType<NonNullable<TranscriptionModelV4['doStream']>>>
  > {
    if (!isLiveTranscriptionModelId(this.modelId)) {
      throw new InvalidArgumentError({
        argument: 'modelId',
        message:
          `Model '${this.modelId}' does not support streaming transcription. ` +
          `Use a live model such as 'gemini-3.5-transcribe-live'.`,
      });
    }

    const currentDate = this.config._internal?.currentDate?.() ?? new Date();
    const warnings: SharedV4Warning[] = [];
    const googleOptions = await this.parseOptions(options.providerOptions);

    validateLiveInputAudioFormat(options.inputAudioFormat);

    const headers = combineHeaders(
      this.config.headers ? await resolve(this.config.headers) : undefined,
      options.headers,
    );
    // last case-variant wins: combineHeaders keeps case-distinct keys and

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Switch to a live model id such as 'gemini-3.5-transcribe-live' for streaming.
  2. If incremental results are not required, use transcribe (doGenerate) with the unary model instead.
  3. Gate the call path on isLiveTranscriptionModelId(model.modelId) before streaming.

Example fix

// before
const model = google.transcription('gemini-3.5-transcribe');
await experimental_streamTranscribe({ model, audio });
// after
const model = google.transcription('gemini-3.5-transcribe-live');
await experimental_streamTranscribe({ model, audio });
Defensive patterns

Strategy: validation

Validate before calling

if (!isLiveTranscriptionModelId(modelId)) {
  throw new Error(`${modelId} is unary; use transcribe() or switch to gemini-3.5-transcribe-live for streaming`);
}

Prevention

When it happens

Trigger: Calling experimental_streamTranscribe (doStream) on a non-live model id such as 'gemini-3.5-transcribe' or any id not ending in '-live'.

Common situations: Wanting incremental transcripts while configured with a batch transcription model; dynamic model selection defaulting to a non-live id; docs examples mixing the two model families.

Related errors


AI-assisted analysis of vercel/ai@69428b1f8b (2026-08-30). Data as JSON: /api/errors/1448820cd747a21a. Report an issue: GitHub.