vercel/ai · error · InvalidArgumentError

Model '${this.modelId}' only supports streaming transcriptio

Error message

Model '${this.modelId}' only supports streaming transcription. Use experimental_streamTranscribe, or a unary model such as 'gemini-3.5-transcribe'.

What it means

Google transcription models come in two flavors: unary models (e.g. 'gemini-3.5-transcribe') that support generateTranscription, and live streaming models (ids matching isLiveTranscriptionModelId, e.g. '*-live') that only support experimental_streamTranscribe. doGenerate detects a live model id and refuses to run it through the unary path, throwing this InvalidArgumentError. The two model families are not interchangeable.

Source

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

    readonly modelId: GoogleTranscriptionModelId,
    private readonly config: GoogleTranscriptionModelConfig,
  ) {}

  private async parseOptions(
    providerOptions: Record<string, unknown> | undefined,
  ): Promise<GoogleTranscriptionModelOptions | undefined> {
    return parseProviderOptions({
      provider: 'google',
      providerOptions,
      schema: googleTranscriptionModelOptions,
    });
  }

  async doGenerate(
    options: Parameters<TranscriptionModelV4['doGenerate']>[0],
  ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {
    if (isLiveTranscriptionModelId(this.modelId)) {
      throw new InvalidArgumentError({
        argument: 'modelId',
        message:
          `Model '${this.modelId}' only supports streaming transcription. ` +
          `Use experimental_streamTranscribe, or a unary model such as 'gemini-3.5-transcribe'.`,
      });
    }

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

    // Unary transcription is served by the Interactions API
    // (https://ai.google.dev/gemini-api/docs/transcribe).
    const requestBody = {
      model: this.modelId,
      input: [
        {

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Switch to a unary model id such as 'gemini-3.5-transcribe' for generateTranscription.
  2. Keep the live model but call experimental_streamTranscribe instead.
  3. Add a check with isLiveTranscriptionModelId (or a modelId suffix check) before choosing the call path.

Example fix

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

Strategy: validation

Validate before calling

import { isLiveTranscriptionModelId } from './is-live-transcription-model-id';
if (isLiveTranscriptionModelId(modelId)) {
  throw new Error(`${modelId} requires experimental_streamTranscribe, not transcribe`);
}

Prevention

When it happens

Trigger: Calling transcribe/generateTranscription (doGenerate) with a live model id such as 'gemini-3.5-transcribe-live' instead of a unary transcription model id.

Common situations: Copy-pasting a model id from streaming docs into a unary call; upgrading model ids and picking the '-live' variant unknowingly; generic model-selection code that does not distinguish the two families.

Related errors


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