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 andView on GitHub (pinned to 69428b1f8b)
Solutions
- Switch to a live model id such as 'gemini-3.5-transcribe-live' for streaming.
- If incremental results are not required, use transcribe (doGenerate) with the unary model instead.
- 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
- Use live ('-live') model ids whenever you call experimental_streamTranscribe.
- If streaming is not required, use transcribe() with a unary model instead.
- Centralize model selection so streaming and unary calls cannot receive the wrong family.
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
- Model '${this.modelId}' only supports streaming transcriptio
- Video model ${model.modelId} does not implement doGenerate o
- AssemblyAI does not provide language models
- Transcription request was aborted
- Transcription failed: ${transcript.error ?? 'Unknown error'}
AI-assisted analysis of vercel/ai@69428b1f8b (2026-08-30).
Data as JSON: /api/errors/1448820cd747a21a.
Report an issue: GitHub.