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
- Read response.error.message in the execution UI — it is the verbatim Veo error and usually names the exact problem (policy, quota, unsupported param).
- If it's a person-generation policy error, switch personGeneration to 'Allow All' or 'Allow Adult' and/or reword the prompt.
- If quota/billing, wait and retry, or enable Veo for the Google Cloud / AI Studio project.
- 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
- Match personGeneration to prompt content (don't pair 'dont_allow' with prompts naming real people).
- Stay within documented Veo limits for sampleCount and durationSeconds.
- Confirm the project is enabled for Veo before wiring the node.
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
- A non-empty prompt is required.
- Model ${model} is not supported for video generation. Please
- ${operation.error.message ?? 'Unknown error'}
- ${uploadResponse.file.error?.message ?? 'Unknown error'}
- Failed to get upload URL
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/36a3eaa0dc4221ff.
Report an issue: GitHub.