n8n-io/n8n · error · NodeOperationError

${response.error.message}

Error message

${response.error.message}

What it means

After Veo's predictLongRunning operation finishes polling (response.done === true), if the operation payload carries an 'error' object the node throws its message with description 'Error generating video'. This is the API-side failure surfaced after a successful LRO completion — the upload/submit succeeded but generation itself failed.

Source

Thrown at packages/@n8n/nodes-langchain/nodes/vendors/GoogleGemini/actions/video/generate.operation.ts:180

		],
		parameters: {
			aspectRatio: options.aspectRatio,
			personGeneration: options.personGeneration,
			sampleCount: options.sampleCount ?? 1,
			durationSeconds: options.durationSeconds,
		},
	};
	let response = (await apiRequest.call(this, 'POST', `/v1beta/${model}:predictLongRunning`, {
		body,
	})) as VeoResponse;

	while (!response.done) {
		await new Promise((resolve) => setTimeout(resolve, 5000));
		response = (await apiRequest.call(this, 'GET', `/v1beta/${response.name}`)) as VeoResponse;
	}

	if (response.error) {
		throw new NodeOperationError(this.getNode(), response.error.message, {
			description: 'Error generating video',
		});
	}

	if (returnAs === 'video') {
		const promises = response.response.generateVideoResponse.generatedSamples.map(
			async (sample) => {
				const { fileContent, mimeType } = await downloadFile.call(
					this,
					sample.video.uri,
					'video/mp4',
					{
						key: credentials.apiKey as string,
					},
				);
				const fileName = getFilenameFromMimeType(mimeType, 'video', 'mp4');
				const binaryData = await this.helpers.prepareBinaryData(fileContent, fileName, mimeType);
				return {

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Read response.error.message in the execution UI — it is the verbatim Veo error and usually names the exact problem (policy, quota, unsupported param).
  2. If it's a person-generation policy error, switch personGeneration to 'Allow All' or 'Allow Adult' and/or reword the prompt.
  3. If quota/billing, wait and retry, or enable Veo for the Google Cloud / AI Studio project.
  4. Reduce sampleCount / durationSeconds to the documented Veo limits and retry.
Defensive patterns

Strategy: try-catch

Type guard

interface VeoLroDone { done: true; error?: { message: string }; response?: unknown }
function isVeoFailure(r: unknown): r is VeoLroDone {
  return !!r && typeof r === 'object' && (r as { done?: boolean }).done === true && !!(r as { error?: unknown }).error;
}

Try / catch

try {
  await videoGenerate.execute();
} catch (e) {
  if (e instanceof NodeOperationError && /policy|quota|unsupported/i.test(e.message)) {
    // adjust personGeneration / sampleCount / duration, then retry
  }
  throw e;
}

Prevention

When it happens

Trigger: Veo rejects the prompt (policy/character personGeneration mismatch, e.g. 'dont_allow' but prompt asks for identifiable people), the model id is wrong for the project, quota/billing exhausted, content filtered, or sample/duration parameters are out of range.

Common situations: personGeneration='Don't Allow' combined with a prompt about real people; project not enabled for Veo / not in the allowed region; aspect ratio or durationSeconds unsupported by the chosen Veo version; daily quota hit.

Related errors


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