8
n8n 中文网amn8n.com

Multi_Ad_Image

高级

这是一个Content Creation, Multimodal AI领域的自动化工作流,包含 22 个节点。主要使用 If, Set, Wait, SplitOut, GoogleDrive 等节点。 使用Fal.ai和OpenAI从Google表格生成AI产品广告图像

前置要求
  • Google Drive API 凭证
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
  • OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "pyErkv743Qswub8C",
  "meta": {
    "instanceId": "2c12b0b552404dc07af67cd5f092afd21d18c808d4fdabdb04cb4b064195b6fb",
    "templateCredsSetupCompleted": true
  },
  "name": "Multi_Ad_Image",
  "tags": [],
  "nodes": [
    {
      "id": "1c6ff80d-c6dc-485d-9708-38b9f7af4961",
      "name": "当点击\"执行工作流\"时",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        304,
        176
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "0ebd375b-d9c4-4ae0-90ac-5295b788a253",
      "name": "获取表格中的行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        480,
        176
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "Create",
              "lookupColumn": "status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit#gid=0",
          "cachedResultName": "product"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit?usp=drivesdk",
          "cachedResultName": "n8n_Multi_Ad_Image"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "0RVWjnYzlWor2bMu",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e982d7e4-dced-4897-85cf-708e09d5bc4e",
      "name": "分析图像",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        816,
        176
      ],
      "parameters": {
        "text": "=You are an AI system specialized in **image analysis for advertising**. \nYour task is to carefully analyze the given product image and generate \nstructured insights that will later be used to create high-quality \nadvertising prompts.\n\n### Instructions:\n1. **Identify Product**  \n   - Type of product (e.g., sneakers, skincare, electronics).  \n   - Key visible features (color, shape, size, packaging).  \n   - Materials or textures that can be inferred.  \n\n2. **Branding & Style**  \n   - Any visible logos, brand elements, or design patterns.  \n   - Style impression (luxury, casual, eco-friendly, tech-oriented).  \n\n3. **Target Audience Guess**  \n   - Suggest who the product might appeal to (young adults, parents, professionals, etc.).  \n\n4. **Ad Creative Angles (3–5 ideas)**  \n   - Marketing hooks inspired by the image.  \n   - Focus on visual storytelling (e.g., “minimalist lifestyle shot”, “dynamic sports action scene”).  \n\n5. **Output Format (JSON)**  \n   ```json\n   {\n     \"product_type\": \"...\",\n     \"features\": [\"...\", \"...\"],\n     \"style\": \"...\",\n     \"target_audience\": \"...\",\n     \"ad_angles\": [\n       \"Ad idea 1\",\n       \"Ad idea 2\",\n       \"Ad idea 3\",\n       \"Ad idea 4\",\n       \"Ad idea 5\"\n     ]\n   }\n",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "resource": "image",
        "inputType": "base64",
        "operation": "analyze"
      },
      "credentials": {
        "openAiApi": {
          "id": "28LXl50ZdQjnkMJs",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "dcb3134c-a3aa-4384-9f37-e59ea93472f7",
      "name": "下载文件",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        640,
        176
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $json.product_image_url }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "QVrgALkld7whKIgB",
          "name": "Google Drive account - Peakwave"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "c87947e9-97eb-4758-b18c-bf14cc232573",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1024,
        176
      ],
      "parameters": {
        "text": "=You will receive a real product image and its short description. \nAnalyze them and generate exactly {{ $('Get row(s) in sheet').item.json.num_variations }} distinct, production-ready advertising image prompts.\nIf a campaign is provided, weave its seasonal or promotional context into the prompts naturally. \nIf campaign is empty or \"none\", ignore it.\n\n=== INPUTS ===\n- Product Image URL: {{ $('Get row(s) in sheet').item.json.product_image_url }}\n- Product Name: {{ $('Get row(s) in sheet').item.json.product_name }}\n- Product Description: \"{{ $('Get row(s) in sheet').item.json.product_description }}\"\n- Campaign (optional): {{ $('Get row(s) in sheet').item.json.campaign }}                      // e.g., \"8.8\", \"10.10\", \"Songkran\", \"Halloween\", \"none\"\n- Target Model: {{ $('Get row(s) in sheet').item.json.model_target }}                    // e.g., \"SDXL\", \"Midjourney\", \"Flux\", \"Veo\"\n- Aspect Ratio:  {{ $('Get row(s) in sheet').item.json.aspect_ratio }}                     // e.g., \"1:1\", \"4:5\", \"16:9\"\n- Number of Variations (N): {{ $('Get row(s) in sheet').item.json.num_variations }}\n- Brand Guidelines (optional): {{ $('Get row(s) in sheet').item.json.brand_notes }}           // e.g., brand palette hex codes, keep logo visible, avoid surreal\n- Creative Constraints (optional): {{ $('Get row(s) in sheet').item.json.constraints }}       // e.g., \"no people\", \"no surreal\", \"text-safe negative space\"\n\n=== TASK ===\n1) Treat the product image as ground truth; keep product identity accurate (color, form, logo).\n2) Generate {{ $('Get row(s) in sheet').item.json.num_variations }} visually distinct prompts that are advertising-ready and usable by {{ $('Get row(s) in sheet').item.json.model_target }}.\n3) Vary at least one of: scene/environment, style, lighting, camera, background, composition, color mood, post-process.\n4) If \"campaign\" is provided (not empty/none), incorporate tasteful thematic elements: \n   - Halloween → spooky mood, pumpkins, warm/orange accents, moody lighting\n   - Songkran → water splashes, summer vibe, bright daylight, outdoor festivity\n   - 8.8 / 10.10 / 11.11 → energetic sale vibe, dynamic composition, bold accents\n   - Christmas → warm lights, pine elements, cozy red/green palette\n   Keep it subtle and brand-safe; do not add new logos or misleading claims.\n5) Follow strictly the JSON schema in the **system prompt** (no extra text).\n6) If any subfield cannot be inferred safely, leave it as an empty string \"\".\n7) Ensure each \"prompt\" is **one line** and does not break JSON.\n\n=== REMINDERS ===\n- Avoid vague adjectives. Be concrete and visual.\n- Composition tips: centered hero, rule-of-thirds lifestyle, top-down flat-lay, negative space for copy.\n- Lighting tips: softbox/rim for packshots, natural daylight for lifestyle, golden hour for warmth.\n- Camera tips: 35mm/50mm for natural look, 85mm for product portrait with shallow DoF, macro for texture.\n- Color mood: align gently with any campaign; otherwise, use clean brand-safe palettes.\n\n=== RETURN FORMAT ===\n- Return a **single JSON object** only, matching the schema in the system prompt.\n",
        "options": {
          "systemMessage": "=You are an **Advertising Image Prompt Designer**.\n\nInputs you may receive:\n- product_image_url (image of the real product; treat as ground truth)\n- product_name\n- product_description\n- campaign (optional; e.g., \"8.8\", \"10.10\", \"Songkran\", \"Halloween\", \"Black Friday\", \"Christmas\")\n- model_target (e.g., \"SDXL\", \"Midjourney\", \"Flux\", \"Veo\")\n- aspect_ratio (e.g., \"1:1\", \"4:5\", \"16:9\")\n- N (number of distinct variations to generate)\n\nGoal:\n- Analyze the given product image, short description, and optional campaign context.\n- Produce **N distinct, production-ready image prompts** for ad creation.\n- **Preserve the product’s true identity** (color, form, logo, key features). Do not invent or alter the product.\n\nOutput:\n- Return **JSON only** following the schema below. **No extra text** outside the JSON.\n\nQuality rules:\n- Each prompt must be visually distinct (vary at least one major axis: scene, mood, style, lighting, camera, background, composition).\n- Use concise, concrete descriptors; avoid vague words (e.g., “nice”, “beautiful”).\n- Keep prompts brand-safe and realistic unless the user explicitly allows surreal concepts.\n- Prefer modern ad aesthetics: clean hero shots, lifestyle, editorial, macro texture, flat-lay, outdoor ambient, etc.\n- If any requested field is missing in the user input, **infer from the image**; if you cannot infer safely, set that subfield to an empty string.\n- If a **campaign** is provided, incorporate its seasonal or promotional theme **naturally and tastefully** (e.g.,  \n  • Halloween → moody/spooky, pumpkins, warm/orange accents, fog  \n  • Songkran → water splash, festive Thai summer vibe, bright daylight  \n  • 8.8 / 10.10 / 11.11 → bold sale energy, dynamic composition, price-tag visual cues without adding logos  \n  • Christmas → cozy, pine, warm lights, red/green palette  \n  • Black Friday → high contrast, dark sleek backdrops).  \n  If no campaign is provided (empty or “none”), **ignore** campaign styling.\n\nTarget models:\n- Prompts should be usable by **Midjourney, SDXL, Flux, or Veo**. Avoid model-specific tokens unless provided in the user input (e.g., “--ar 16:9”, “--style raw”).\n\nPrompt composition guidance (recommended ingredients):\n- **Subject/Product**: exact product + salient features visible in the image (material, finish, color, unique parts).\n- **Scene/Environment**: studio / lifestyle / outdoor / occasion-linked (if campaign present).\n- **Style/Art direction**: minimalist / cinematic / editorial / lifestyle / high-fashion / tech-forward / cozy, etc.\n- **Lighting**: softbox / rim light / natural daylight / golden hour / neon / HDRI; mention shadows/reflections if relevant.\n- **Camera**: 35mm / 85mm / wide / macro / top-down / tilt-shift, F-stop or DoF if helpful.\n- **Composition**: centered / rule of thirds / flat-lay / hero shot / negative space for text.\n- **Background**: seamless white/black, textured concrete, wooden desk, gradient, seasonal set pieces (only if campaign present).\n- **Color mood**: pastel / vibrant / monochrome / brand palette; align gently with any campaign palette.\n- **Post-process**: subtle film grain / glossy reflections / HDR / product retouch / shadow catching.\n- **Marketing angle**: premium luxury / eco-friendly / active lifestyle / tech-forward / festive sale energy.\n\nBrand-safety & integrity:\n- Do **not** add or modify logos, certifications, or claims not present in the description.\n- Do **not** imply medical/health claims unless explicitly provided.\n- Avoid depicting real people/celebrities. If humans are implied, keep them generic and non-identifiable.\n\nRequired JSON schema (return this object only):\n{\n  \"product_name\": string,\n  \"product_description\": string,\n  \"image_url\": string,\n  \"campaign\": string,                   // optional; leave \"\" if none\n  \"model_target\": string,               // e.g., \"SDXL\", \"Midjourney\", \"Flux\", \"Veo\"\n  \"aspect_ratio\": string,               // e.g., \"1:1\", \"4:5\", \"16:9\"\n  \"variations\": [\n    {\n      \"variation_id\": number,\n      \"prompt\": string,                 // full generation prompt (one line)\n      \"style\": string,                  // e.g., minimalist / cinematic / editorial / lifestyle / surreal\n      \"scene\": string,                  // e.g., studio / outdoor / cafe / gym / beach\n      \"lighting\": string,               // e.g., softbox / natural daylight / neon / golden hour / rim light\n      \"camera\": string,                 // e.g., 35mm / 85mm / macro / top-down / tilt-shift, include DoF if useful\n      \"composition\": string,            // e.g., centered / rule of thirds / flat-lay / hero shot / negative space\n      \"background\": string,             // e.g., white seamless / textured concrete / gradient / city night\n      \"color_mood\": string,             // e.g., pastel / vibrant / monochrome / brand palette\n      \"post_process\": string,           // e.g., subtle film grain / glossy reflections / HDR / product retouch\n      \"marketing_angle\": string         // e.g., premium luxury / eco-friendly / active lifestyle / tech-forward\n    }\n  ]\n}\n\nValidation:\n- Produce **exactly N** variations.\n- Ensure each \"prompt\" is a **single line** without JSON-breaking characters.\n- Escape any internal quotes if needed. Do not include commentary outside the JSON block.\n\nFailure handling:\n- If the image cannot be analyzed (unreachable URL or ambiguous), still return a valid JSON with minimal safe prompts derived from the description; leave unknown subfields as \"\" and add a short note in \"notes\".\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "f4b60076-6dd2-4da1-90db-117eabe4715c",
      "name": "OpenAI 聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1008,
        288
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "28LXl50ZdQjnkMJs",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "12f40103-c60f-4a7b-82d1-960bd6b32755",
      "name": "拆分输出",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1312,
        176
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.scenes"
      },
      "typeVersion": 1
    },
    {
      "id": "e695e646-9759-46c4-a33c-36cda24da934",
      "name": "在表格中追加行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1456,
        176
      ],
      "parameters": {
        "columns": {
          "value": {
            "prompt": "={{ $json.prompt }}",
            "status": "Ready",
            "scene_ref": "={{ $('Get row(s) in sheet').item.json.product_name }}_{{ $json.scene_id }}",
            "product_name": "={{ $('Get row(s) in sheet').item.json.product_name }}"
          },
          "schema": [
            {
              "id": "scene_ref",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "scene_ref",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "product_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "output_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "output_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1544343606,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit#gid=1544343606",
          "cachedResultName": "ad_image"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit?usp=drivesdk",
          "cachedResultName": "n8n_Multi_Ad_Image"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "0RVWjnYzlWor2bMu",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e1bb5b31-1f2b-4d9e-80ff-d91bbeac3793",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "disabled": true,
      "position": [
        -64,
        384
      ],
      "parameters": {
        "width": 1840,
        "height": 192,
        "content": "### 🟨 区域 2:创建图像"
      },
      "typeVersion": 1
    },
    {
      "id": "d53e1592-7956-4154-9df9-bf8b7943e7fc",
      "name": "等待",
      "type": "n8n-nodes-base.wait",
      "position": [
        976,
        464
      ],
      "webhookId": "98549686-33c2-4bef-a176-92ead56ad0d1",
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "c75b4d0b-3309-4f03-8402-d13accc7edbc",
      "name": "如果",
      "type": "n8n-nodes-base.if",
      "position": [
        816,
        416
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "38f5427f-4fc7-4c07-87d5-fa7f5964deb2",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "=COMPLETED"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b313b28e-10e0-4815-b8e5-a5e8c1ad4542",
      "name": "获取图像状态",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        656,
        416
      ],
      "parameters": {
        "url": "={{ $json.status_url }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "8aXZ3G10Qvvsc8FY",
          "name": "Fal AI"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "16e46dfb-8cf7-45fd-9d72-c71b1b3eefad",
      "name": "调用 Fal.ai API(nannoBanana)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        480,
        416
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/{{ $('Get row(s) in sheet').item.json.model_target }}/edit",
        "method": "=POST",
        "options": {},
        "jsonBody": "={\n     \"prompt\": \"{{ $json.prompt }} {{ $json.notes }}\",\n     \"image_urls\": [\n       \"{{ $json.product }}\"\n     ],\n     \"num_images\": 1,\n     \"output_format\": \"jpeg\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "8aXZ3G10Qvvsc8FY",
          "name": "Fal AI"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "56a8079f-6e4d-46db-b975-433463b9fa68",
      "name": "在表格中更新行",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1584,
        400
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "Complete",
            "scene_ref": "={{ $('Append row in sheet').item.json.scene_ref }}",
            "output_url": "={{ $json.webViewLink }}"
          },
          "schema": [
            {
              "id": "scene_ref",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "scene_ref",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "product_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "prompt",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "notes",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "output_url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "output_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "scene_ref"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1544343606,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit#gid=1544343606",
          "cachedResultName": "ad_image"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit?usp=drivesdk",
          "cachedResultName": "n8n_Multi_Ad_Image"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "0RVWjnYzlWor2bMu",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "8ae70d5b-3dd5-42e6-9c32-f6d36d299b21",
      "name": "上传文件",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1440,
        400
      ],
      "parameters": {
        "name": "={{ $('Get row(s) in sheet').item.json.product_name }}_{{ $('Append row in sheet').item.json.scene_ref }}.jpeg",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1GyJp-XK4NIwjvUp13CHBUMiGNum1Yzl8",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1GyJp-XK4NIwjvUp13CHBUMiGNum1Yzl8",
          "cachedResultName": "outputImage"
        },
        "inputDataFieldName": "=data"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "QVrgALkld7whKIgB",
          "name": "Google Drive account - Peakwave"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "69afdf78-491a-4952-936e-03208adc6787",
      "name": "编辑字段",
      "type": "n8n-nodes-base.set",
      "position": [
        320,
        416
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "62a409c6-c607-452b-9bbb-f3d29c86dddf",
              "name": "product",
              "type": "string",
              "value": "={{ \n  (() => {     \n    const u = $('Get row(s) in sheet').item.json.product_image_url || '';     \n    const q = u.match(/[?&]id=([-\\w]{25,})/);     \n    const d = u.match(/\\/d\\/([-\\w]{25,})/);     \n    const any = u.match(/[-\\w]{25,}/);     \n    const id = q?.[1] || d?.[1] || (any ? any[0] : '');     \n    return id ? 'https://drive.google.com/uc?export=view&id=' + id : '';   \n  })() \n}}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "bc750bdb-45ad-4380-ad1d-6688cb242850",
      "name": "结构化输出解析器",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1168,
        288
      ],
      "parameters": {
        "jsonSchemaExample": "\n{\n  \"product_name\": \"Smart Water Bottle\",\n  \"product_description\": \"A sleek stainless steel smart water bottle with LED temperature display.\",\n  \"image_url\": \"https://drive.google.com/uc?export=view&id=123abcXYZ\",\n  \"scenes\": [\n    {\n      \"scene_id\": 1,\n      \"prompt\": \"smart stainless steel water bottle on a minimalist white marble counter, cinematic studio lighting, soft shadows, product hero shot, centered composition\"\n    },\n    {\n      \"scene_id\": 2,\n      \"prompt\": \"smart water bottle on a wooden gym bench, fitness lifestyle, natural sunlight from window, sweat towel nearby, cinematic depth of field\"\n    },\n    {\n      \"scene_id\": 3,\n      \"prompt\": \"product placed in a futuristic cyberpunk neon city background, glowing reflections, dramatic rim lighting, 35mm lens, bold composition\"\n    }\n  ]\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "ee86e519-9ea5-41f0-b887-559558b1b206",
      "name": "HTTP 请求",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1296,
        400
      ],
      "parameters": {
        "url": "={{ $json.images[0].url }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "8aXZ3G10Qvvsc8FY",
          "name": "Fal AI"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e8505d4b-2bf8-4a36-be98-4e0fc0597fbf",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "disabled": true,
      "position": [
        -64,
        160
      ],
      "parameters": {
        "color": 4,
        "width": 1840,
        "height": 208,
        "content": "### 🟩 区域 1:创建图像"
      },
      "typeVersion": 1
    },
    {
      "id": "3c27ccb4-b7f0-4ddd-ad17-bb3563920552",
      "name": "获取图像1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1136,
        400
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/nano-banana/requests/{{ $json.request_id }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "8aXZ3G10Qvvsc8FY",
          "name": "Fal AI"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "alwaysOutputData": false
    },
    {
      "id": "c0798b64-0f44-44eb-b3f9-16c58f19f762",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "disabled": true,
      "position": [
        -48,
        608
      ],
      "parameters": {
        "color": 4,
        "width": 336,
        "height": 464,
        "content": "## 产品图像"
      },
      "typeVersion": 1
    },
    {
      "id": "9ab9daa1-fce9-47ab-86de-c577327cf1b0",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "disabled": true,
      "position": [
        304,
        608
      ],
      "parameters": {
        "color": 4,
        "width": 1472,
        "height": 464,
        "content": "## 产品图像 - nano Banana"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d4b9b60e-31d7-4a7e-b78b-8dd85b374edc",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Get the image1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Get image status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Call Fal.ai API (nannoBanana)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze image": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Analyze image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get the image1": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get image status": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Append row in sheet": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Call Fal.ai API (nannoBanana)": {
      "main": [
        [
          {
            "node": "Get image status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 内容创作, 多模态 AI

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量22
分类2
节点类型13
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Jaruphat J.

Jaruphat J.

@jaruphatj

Project Manager who passionate about Automation & AI and continuously explore innovative ways to improve business processes through intelligent workflow automation. Let’s connect and automate the future!

外部链接
在 n8n.io 查看

分享此工作流