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

  1. Set Model to a Veo id, e.g. 'models/veo-3.0-generate-preview' (the id must contain the literal 'veo').
  2. If model is expression-driven, confirm the resolved value includes 'veo' at runtime.
  3. 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

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


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/cff72c8d5aa3ff75. Report an issue: GitHub.