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
- Switch to a unary model id such as 'gemini-3.5-transcribe' for generateTranscription.
- Keep the live model but call experimental_streamTranscribe instead.
- 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
- Keep two explicit model constants: one for unary transcription, one for live streaming.
- Route call path selection off the model id (live suffix => doStream).
- Review model id changes in release notes for new '-live' variants.
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
- Model '${this.modelId}' does not support streaming transcrip
- 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/3c034add66c4c192.
Report an issue: GitHub.