n8n-io/n8n · error · NodeOperationError
Model ${model} is not supported for video generation. Please
Error message
Model ${model} is not supported for video generation. Please use a Veo model What it means
Model gate in 'video / generate': after the prompt check and credential lookup, if the resolved model id does not contain the substring 'veo', the node refuses to call predictLongRunning. Video generation is only supported by Veo models, so any Gemini/Imagen/text id is blocked here with a hint to use Veo.
Source
Thrown at packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/video/generate.operation.ts:148
export async function execute(this: IExecuteFunctions, i: number): Promise<INodeExecutionData[]> {
const model = this.getNodeParameter('modelId', i, '', { extractValue: true }) as string;
const prompt = this.getNodeParameter('prompt', i, '') as string;
if (!prompt.trim()) {
throw new NodeOperationError(this.getNode(), 'A non-empty prompt is required.', {
itemIndex: i,
});
}
const returnAs = this.getNodeParameter('returnAs', i, 'video');
const options = this.getNodeParameter('options', i, {});
const binaryPropertyOutput = this.getNodeParameter(
'options.binaryPropertyOutput',
i,
'data',
) as string;
const credentials = await this.getCredentials('googlePalmApi');
if (!model.includes('veo')) {
throw new NodeOperationError(
this.getNode(),
`Model ${model} is not supported for video generation. Please use a Veo model`,
{
description: 'Video generation is only supported by Veo models',
},
);
}
const body = {
instances: [
{
prompt,
},
],
parameters: {
aspectRatio: options.aspectRatio,
personGeneration: options.personGeneration,
sampleCount: options.sampleCount ?? 1,View on GitHub (pinned to 5ac6606e81)
Solutions
- Set Model to a Veo id, e.g. 'models/veo-3.0-generate-preview' (the id must contain the literal 'veo').
- If model is expression-driven, confirm the resolved value includes 'veo' at runtime.
- When switching Resource to Video, re-pick the model from the list so it's scoped to Veo.
Example fix
// before const model = 'models/gemini-2.0-flash'; // after const model = 'models/veo-3.0-generate-preview';
Defensive patterns
Strategy: validation
Validate before calling
const model = String(this.getNodeParameter('modelId', i, '', { extractValue: true }));
if (!model.toLowerCase().includes('veo')) {
throw new Error(`Video generation requires a Veo model, got: ${model}`);
} Type guard
function isVeoModel(model: string): boolean {
return model.toLowerCase().includes('veo');
} Prevention
- Scope the Model RLC to Veo ids when the Resource is Video.
- When switching Resource to Video, always re-pick the model.
- Validate expression-driven model ids at runtime before this node runs.
When it happens
Trigger: Model is set to a non-Veo id: a Gemini text/vision model, an Imagen id, or a typo'd Veo id like 'models/veo‑lite' that doesn't actually contain 'veo' (note the dash variant). The check is a naive substring match on 'veo'.
Common situations: Default model not switched to Veo when changing Resource to Video; copy-pasted model id from the Gemini docs; expression returns a model meant for another resource.
Related errors
- A non-empty prompt is required.
- Model ${model} is not supported for image generation
- ${response.error.message}
- The operation "${operation}" is not supported!
- A non-empty prompt is required.
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/cff72c8d5aa3ff75.
Report an issue: GitHub.