- Seção: Vibe Coding
- Link da aula: https://www.skool.com/aiworkshop-lite/classroom/5b3aa9e5?md=3913e73a3e6f4700a208ac5f44638d5c
- Vídeo (NÃO baixado): https://www.youtube.com/watch?v=xZxXtN55sqM
- Duração do vídeo: 20min56s
Descrição
_(sem descrição)_
Recursos baixados
60-build-any-app-with-googles-antigravity-n8n.json— AI UGC Ad App - Antigravity (2).json (ok (24086 bytes))
Texto de 60-build-any-app-with-googles-antigravity-n8n.json
{
"name": "AI UGC Ad App - Antigravity",
"nodes": [
{
"parameters": {
"inputDataFieldName": "file",
"name": "file",
"driveId": {
"__rl": true,
"value": "My Drive",
"mode": "list",
"cachedResultName": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive"
},
"folderId": {
"__rl": true,
"value": "1MxaX7NrmmTHQtHLLEw3JqXqjMbNKU2lx",
"mode": "list",
"cachedResultName": "image urls",
"cachedResultUrl": "https://drive.google.com/drive/folders/1MxaX7NrmmTHQtHLLEw3JqXqjMbNKU2lx"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
-656,
-96
],
"id": "17e3d0a5-efcf-4af7-948a-3af1d6da80db",
"name": "Upload file",
"credentials": {
"googleDriveOAuth2Api": {
"id": "tTKNlY1ktx7UntI0",
"name": "Google Drive account"
}
}
},
{
"parameters": {
"resource": "image",
"operation": "analyze",
"modelId": {
"__rl": true,
"value": "chatgpt-4o-latest",
"mode": "list",
"cachedResultName": "CHATGPT-4O-LATEST"
},
"text": "=Analyze the given image and determine if it primarily depicts a product or a character, or BOTH.\n\n- If the image is of a product, return the analysis in YAML format with the following fields:\n\nbrand_name: (Name of the brand shown in the image, if visible or inferable)\ncolor_scheme:\n - hex: (Hex code of each prominent color used)\n name: (Descriptive name of the color)\nfont_style: (Describe the font family or style used: serif/sans-serif, bold/thin, etc.)\nvisual_description: (A full sentence or two summarizing what is seen in the image, ignoring the background)\n\n- If the image is of a character, return the analysis in YAML format with the following fields:\n\ncharacter_name: (Name of the character if visible or inferable)\ncolor_scheme:\n - hex: (Hex code of each prominent color used on the character)\n name: (Descriptive name of the color)\noutfit_style: (Description of clothing style, accessories, or notable features)\nvisual_description: (A full sentence or two summarizing what the character looks like, ignoring the background)\n\nOnly return the YAML. Do not explain or add any other comments.\n\n\n- if it is BOTH, return both descriptions as guided above in YAML format\n",
"imageUrls": "={{ $json.webContentLink }}",
"simplify": false,
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
-448,
-96
],
"id": "23fd7400-6ba3-4603-9bdf-4999e34aada9",
"name": "Describe Img",
"credentials": {
"openAiApi": {
"id": "zE5O89L0JjnRwfPU",
"name": "OpenAi account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://queue.fal.run/fal-ai/nano-banana/edit",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"prompt\": \"{{ $json.output.image_prompt.replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\",\n \"image_urls\": [\n \"{{ $('Upload file').item.json.webContentLink }}\"\n ]\n }",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-592,
192
],
"id": "7fd64bdf-c7df-4963-be81-1ef3e6afd9a4",
"name": "Create Image",
"credentials": {
"httpHeaderAuth": {
"id": "RTd7n9jC66iTTXnS",
"name": "Fal"
},
"httpCustomAuth": {
"id": "GCBAsv94tlQyuuNq",
"name": "Custom Auth account"
}
}
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
-992,
416
],
"id": "e7800304-b507-4ce3-82b6-a4f795f476d8",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"id": "zE5O89L0JjnRwfPU",
"name": "OpenAi account"
}
}
},
{
"parameters": {
"amount": 25
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
-448,
192
],
"id": "9b53b13d-4d84-4986-a362-67d649c064cd",
"name": "Wait 3",
"webhookId": "915ddd3b-ba56-4b26-a915-db4d1e7d7935"
},
{
"parameters": {
"url": "={{ $('Create Image').item.json.response_url }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-304,
192
],
"id": "911ef95b-48e7-41e2-88f5-19e01951a366",
"name": "Get Image",
"credentials": {
"httpHeaderAuth": {
"id": "RTd7n9jC66iTTXnS",
"name": "Fal"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"promptType": "define",
"text": "=Your task: Create an image prompt as guided by your system guidelines.\n\nMake sure that the reference image is depicted as ACCURATELY as possible in the resulting images, especially all text.\n\n\nThese are the user's description:\n{{ $('Webhook').item.json.body.description }}\n\n\nDescription of the reference image:\n{{ $('Describe Img').first().json.choices[0].message.content }}\n\n",
"hasOutputParser": true,
"options": {
"systemMessage": "=ROLE: UGC Image Prompt Builder\n\n Purpose: Given an image URL (often a product or reference image), write a short, natural description that can drive an image/video generator.\n\n Defaults:\n - If instructions are vague, place the product with the character in an everyday setting that makes sense for the item.\n - If style or setting isn’t specified, assume casual UGC realism.\n\n UGC Realism Principles:\n - Look unstaged and lifelike.\n - Phone-photo vibe: off-center framing, light motion blur, mixed indoor light, slight grain.\n - Embrace imperfections: wrinkles, stray hairs, skin texture, cluttered backgrounds.\n - Keep any visible packaging text exactly as shown. Never invent claims, numbers, or badges.\n\n Camera Cues (use at least 2–3 each time):\n - \"phone snapshot\", \"handheld framing\", \"off-center composition\",\n \"natural indoor light\", \"soft shadows\", \"slight motion blur\",\n \"auto exposure\", \"unpolished look\", \"mild grain\"\n\n Safety / Scope:\n - Do not name copyrighted characters.\n - You do not write dialogue or scripts; you only output an image prompt.\n\n Output Contract:\n - Return only one JSON object:\n - image_prompt: one string (≤120 words) in plain prose that covers\n subject, action, mood, setting, style/camera, color notes, and text-accuracy notes.\n\n Diversity Defaults:\n - When people aren’t specified, vary gender and ethnicity naturally.\n - Default age range: 21–38.\n - Prefer real-world spaces (home, street, store, gym, office) unless told otherwise.\n\n --- Examples ---\n\n Good example 1:\n { \"image_prompt\": \"a young adult casually holding a skincare tube near a bathroom mirror; action: dabs a small amount on the back of the hand; mood: easy morning; setting: small apartment bathroom with towel on rack and toothbrush cup; style/camera: phone snapshot, handheld framing, off-center composition, natural window light, slight motion blur, mild grain; colors: soft whites and mint label; text accuracy: keep every word on the tube exactly as visible, no added claims\"}\n\n Good example 2:\n { \"image_prompt\": \"commuter wearing wireless earbuds while opening the charging case; action: steps out of subway exit; mood: in-the-moment; setting: busy sidewalk with passersby and glass reflections; style/camera: unpolished phone photo, auto exposure, mixed daylight and neon glow, gentle lens smudge; colors: charcoal and silver product stands out; text accuracy: preserve logo and model name precisely\"}\n\n Bad example (avoid):\n - Fabricating certifications or numbers on packaging.\n - Studio-perfect lighting or ad-speak like “cinematic masterpiece”.\n - Returning anything other than the two required keys.\n\n Pre-send checklist:\n - Natural, handheld tone? ✔\n - At least two camera cues included? ✔\n - Product text preserved exactly? ✔\n - Only image_prompt returned? ✔\n\n\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2,
"position": [
-928,
192
],
"id": "eeb5ea74-23d4-47e6-85eb-5a1e518551d4",
"name": "Image Prompt Generator"
},
{
"parameters": {
"model": {
"__rl": true,
"value": "gpt-4.1",
"mode": "list",
"cachedResultName": "gpt-4.1"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
-1328,
896
],
"id": "8a2cc48a-5bc2-4371-8b7c-e6436eb52b86",
"name": "GPT",
"credentials": {
"openAiApi": {
"id": "zE5O89L0JjnRwfPU",
"name": "OpenAi account"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n \"video_prompt\": \"string\"\n}\n",
"autoFix": true
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
-1152,
864
],
"id": "783226dc-87f5-4615-bc4e-4ee3a9bc7365",
"name": "Structured Output 1"
},
{
"parameters": {
"url": "=https://queue.fal.run/fal-ai/veo3.1/requests/{{ $json.request_id }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-240,
656
],
"id": "38f9f8cd-4b57-4393-8b38-db74a9ddb218",
"name": "Get Video1",
"credentials": {
"httpHeaderAuth": {
"id": "RTd7n9jC66iTTXnS",
"name": "Fal"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n\t\"image_prompt\": \"string\"\n}",
"autoFix": true
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
-816,
384
],
"id": "d78520b2-0239-46de-9c34-e2ba7e882bcf",
"name": "Structured Output Parser"
},
{
"parameters": {
"promptType": "define",
"text": "=Create a UGC-style video prompt from the reference image and the user description.\n\nUser description (may be empty):\n{{ $('Webhook').item.json.body.description }}\n\nReference image analysis (use to stay faithful to what’s visible):\n{{ $('Describe Img').first().json.choices[0].message.content }}\n\nRules\n- Keep the look casual and realistic; avoid studio language.\n- Default model: veo3_fast unless stated otherwise.\n- Return only a single JSON object: video_prompt.\n",
"hasOutputParser": true,
"options": {
"systemMessage": "=ROLE: UGC Video Prompt Builder\n\nGoal\n- From a reference image and short user notes, write a natural UGC-style video prompt suited for Veo3/Veo3_fast.\n\nPrinciples (UGC look)\n- Phone-video vibe: handheld, slight motion, off-center framing, mixed indoor light, mild grain.\n- Real life over polish: small flaws, lived-in spaces, ambient feel.\n- Keep any visible packaging text accurate. Never invent claims, badges, or numbers.\n- Don’t name copyrighted characters.\n- Sound conversational, not ad-speak.\n\nOutput Contract\n- Return ONLY a single JSON object:\n - \"video_prompt\": one plain sentence/short paragraph (≤ 130 words) describing subject, action, mood, setting, 2–3 camera cues, and color notes. Keep it faithful to the image and the user notes.\n\n- No code fences, no extra keys, no arrays, no headings.\n- Do not fabricate product text; mention accuracy only if relevant.\n- Keep it one scene implied by the single object.\n\nFraming guardrails:\n- Keep the subject fully inside frame at all times (no forehead or chin cutoffs).\n- Maintain centered composition; avoid extreme close-ups.\n- If the prompt implies movement, keep framing locked on the face and product.\n\n---\n\nGood Examples\n1)\n{\n \"video_prompt\": \"young adult casually unboxes a small gadget on a kitchen island; smiles, lifts it to camera, then points at the label visible on the box; setting: cozy apartment kitchen with mugs and dish rack; mood: friendly and unscripted; camera: handheld framing, off-center composition, auto exposure, mild grain; color notes: warm wood, soft whites, product label remains clear and accurate\",\n \"model\": \"veo3_fast\"\n}\n\n2)\n{\n \"video_prompt\": \"commuter steps out of a station, adjusts wireless earbuds, glances at phone, then pockets it and walks toward light; setting: busy sidewalk with glass reflections; mood: in-the-moment; camera: handheld framing, slight motion blur, natural outdoor light; color notes: charcoal earbuds and silver accents stand out; keep logo text exactly as seen on the case\",\n \"model\": \"veo3_fast\"\n}\n\n---\n\nBad Examples\nA)\n{\n \"scenes\": [{ \"video_prompt\": \"...\"}],\n \"duration\": 8\n}\n→ Wrong: uses an array and extra keys; violates single-object contract.\n\nB)\n{\n \"video_prompt\": \"cinematic studio lighting with perfect backdrop; the bottle claims ‘clinically proven 300% improvement’\",\n \"aspect_ratio_video\": \"9:16\",\n \"model\": \"veo3\"\n}\n→ Wrong: studio tone and fabricated claim.\n\nC)\nMake a casual phone video of...\n→ Wrong: not a JSON object.\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2,
"position": [
-1280,
672
],
"id": "45753f20-b423-4305-81bc-a34949ea1cc9",
"name": "Video Prompt Generator"
},
{
"parameters": {
"content": "# Uploaded Image & description From Gemini",
"height": 288,
"width": 848,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1024,
-192
],
"id": "b67ac190-e5b6-4e9e-a03a-65db32860015",
"name": "Sticky Note"
},
{
"parameters": {
"content": "# Create New Image with NanoBanana",
"height": 448,
"width": 1072,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1136,
112
],
"id": "b91c0248-c209-4cb4-86f7-46283e12e2b0",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "# Create AI UGC Ad with Veo3.1 & Send via Email",
"height": 448,
"width": 1520,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1376,
576
],
"id": "72dc2ba6-ffb0-42a0-8ed9-844ce5ebd241",
"name": "Sticky Note2"
},
{
"parameters": {
"httpMethod": "POST",
"path": "test",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-864,
-96
],
"id": "51686bba-0dca-48eb-bbde-e58085836ef7",
"name": "Webhook",
"webhookId": "0aadcecb-86ef-4f32-9e7b-bb4d7559443b"
},
{
"parameters": {
"method": "POST",
"url": "https://queue.fal.run/fal-ai/veo3.1/fast/image-to-video",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"contentType": "raw",
"rawContentType": "application/json",
"body": "={\n \"prompt\": \"{{ $json.output.video_prompt.replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\",\n \"image_url\": \"{{ $('Get Image').first().json.images[0].url }}\"\n}\n",
"options": {
"batching": {
"batch": {
"batchSize": 1,
"batchInterval": 3000
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-944,
672
],
"id": "32402171-49a8-4908-ae53-a7c6b4e80599",
"name": "Create Video1",
"credentials": {
"httpHeaderAuth": {
"id": "RTd7n9jC66iTTXnS",
"name": "Fal"
}
}
},
{
"parameters": {
"sendTo": "={{ $('Webhook').item.json.body.email }}",
"subject": "Here's your UGC ad video. ",
"emailType": "text",
"message": "=Hello, \n\nThanks for using the AI UGC Ads app. Here's the link to your AI ad video\"\n\nVideo Url: {{ $json.video.url }}\n\nYou can easily download the video or upload it directly to your social media. Thanks for using the AI UGC App. \n\nSincerely, \nAI UGC Team",
"options": {
"appendAttribution": false
}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
-80,
656
],
"id": "c1374e5b-a7ef-4b86-afcf-d56a9e953251",
"name": "Send a message",
"webhookId": "b4205a9a-edc2-41a1-a24f-d2962265e8eb",
"credentials": {
"gmailOAuth2": {
"id": "dT5GKLlotB9MKfFf",
"name": "Gmail account 2"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "242843af-2af4-4602-864d-cf14b7e8919e",
"leftValue": "={{ $json.status }}",
"rightValue": "COMPLETED",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-416,
672
],
"id": "7f512976-6480-42e2-88f7-0bf8fefe2b08",
"name": "If"
},
{
"parameters": {
"url": "=https://queue.fal.run/fal-ai/veo3.1/requests/{{ $json.request_id }}/status",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-576,
672
],
"id": "7553c3c9-f941-41ce-aa81-ef05eb08af5d",
"name": "Get Video Status",
"credentials": {
"httpHeaderAuth": {
"id": "RTd7n9jC66iTTXnS",
"name": "Fal"
}
}
},
{
"parameters": {
"amount": 20
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
-736,
672
],
"id": "589ba6ef-6a87-4657-98f6-f486cf47b6c5",
"name": "Wait1",
"webhookId": "3867eb64-0376-44d9-9714-0b4ceaab4927"
}
],
"pinData": {},
"connections": {
"Upload file": {
"main": [
[
{
"node": "Describe Img",
"type": "main",
"index": 0
}
]
]
},
"Describe Img": {
"main": [
[
{
"node": "Image Prompt Generator",
"type": "main",
"index": 0
}
]
]
},
"Create Image": {
"main": [
[
{
"node": "Wait 3",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Image Prompt Generator",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Structured Output Parser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Wait 3": {
"main": [
[
{
"node": "Get Image",
"type": "main",
"index": 0
}
]
]
},
"Get Image": {
"main": [
[
{
"node": "Video Prompt Generator",
"type": "main",
"index": 0
}
]
]
},
"Image Prompt Generator": {
"main": [
[
{
"node": "Create Image",
"type": "main",
"index": 0
}
]
]
},
"GPT": {
"ai_languageModel": [
[
{
"node": "Video Prompt Generator",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Structured Output 1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output 1": {
"ai_outputParser": [
[
{
"node": "Video Prompt Generator",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Image Prompt Generator",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Video Prompt Generator": {
"main": [
[
{
"node": "Create Video1",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Create Video1": {
"main": [
[
{
"node": "Wait1",
"type": "main",
"index": 0
}
]
]
},
"Get Video1": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"If": {
"main": [
[
{
"node": "Get Video1",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait1",
"type": "main",
"index": 0
}
]
]
},
"Get Video Status": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Wait1": {
"main": [
[
{
"node": "Get Video Status",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"availableInMCP": false
},
"versionId": "f054c57b-30d8-499c-9d63-ef71c45fb27d",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "5f99b345c3a4501a22438ba5962ff6685e5e97ee4bd0a17cc04a19ed072b5c2a"
},
"id": "CxMLRraUWRJPP0i9",
"tags": []
}