{
  "id": "5JAOuTvww6BSDWi0",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Style Analysis and Consistent Image Generation with Gemini",
  "tags": [],
  "nodes": [
    {
      "id": "6b6e8fcf-bb93-42c5-be89-7260d0caff0f",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -64,
        368
      ],
      "parameters": {
        "path": "d14dbf90-e292-4c61-ac70-5b7414894abe",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "0c99665c-5c2f-4119-baba-3a1fbcbc8bba",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        144,
        368
      ],
      "parameters": {
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Access-Control-Allow-Origin",
                "value": "*"
              },
              {
                "name": "Access-Control-Allow-Methods",
                "value": "POST, GET, OPTIONS"
              },
              {
                "name": "Access-Control-Allow-Headers",
                "value": "Content-Type, Authorization"
              }
            ]
          }
        },
        "respondWith": "json",
        "responseBody": "{\n    \"status\": \"success\",\n    \"message\": \"Workflow ba\u015flat\u0131ld\u0131\",\n    \"timestamp\": \"{{ $now.toISO() }}\"\n  }"
      },
      "typeVersion": 1.5
    },
    {
      "id": "507824ec-e131-4477-8d3a-47e2ea4c59b1",
      "name": "Wait #1",
      "type": "n8n-nodes-base.wait",
      "position": [
        928,
        384
      ],
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "3501bc89-a138-415a-ba96-d337934e56c5",
      "name": "Wait #2",
      "type": "n8n-nodes-base.wait",
      "position": [
        2208,
        240
      ],
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "c1c7db36-d2d6-43b9-a4f1-e1911c964f76",
      "name": "Wait #3",
      "type": "n8n-nodes-base.wait",
      "position": [
        2416,
        656
      ],
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "acaa45b5-33c4-45ae-81c0-3c47fe56d7e6",
      "name": "Wait #4",
      "type": "n8n-nodes-base.wait",
      "position": [
        2032,
        656
      ],
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "12a906ec-db30-44e9-993a-cf91d8955b5c",
      "name": "ntfy - Start Alert",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        352,
        176
      ],
      "parameters": {
        "url": "https://ntfy.sh/YOUR-PREFER-NAME",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"topic\": \"YOUR-PREFER-NAME\",\n  \"message\": \"YOUR-PREFER-MESSAGE\",\n  \"title\": \"start\"\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.3
    },
    {
      "id": "be1dd045-4748-43d7-ab3d-1aeecee7fd05",
      "name": "ntfy - Task Error Alert",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2064,
        496
      ],
      "parameters": {
        "url": "https://ntfy.sh/YOUR-PREFER-NAME",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"topic\": \"YOUR-PREFER-NAME\",\n  \"message\": \"YOUR-PREFER-MESSAGE\",\n  \"title\": \"error\"\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.3
    },
    {
      "id": "8d571483-8930-4044-b908-2464d0cfe1aa",
      "name": "ntfy - Workflow Completion Alert",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        816,
        192
      ],
      "parameters": {
        "url": "https://ntfy.sh/YOUR-PREFER-NAME",
        "method": "POST",
        "options": {},
        "jsonBody": "{\n  \"topic\": \"YOUR-PREFER-NAME\",\n  \"message\": \"YOUR-PREFER-MESSAGE\",\n  \"title\": \"finish\"\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.3
    },
    {
      "id": "675e11c3-e8ff-4eec-a0e7-737790dc5c35",
      "name": "ntfy - Task Success Alert",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2432,
        32
      ],
      "parameters": {
        "url": "https://ntfy.sh/YOUR-PREFER-NAME",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"topic\": \"YOUR-PREFER-NAME\",\n  \"message\": \"YOUR-PREFER-MESSAGE\",\n  \"title\": \"task_completed\"\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.3
    },
    {
      "id": "dce5c96f-121c-469c-8826-8ab89fddd7ab",
      "name": "If  - Check Analysis Result",
      "type": "n8n-nodes-base.if",
      "position": [
        1280,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8a61989e-0f37-48ec-bf15-42a6a108713b",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.candidates[0].content.parts[0].text }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "f122cc75-368b-46f8-850a-1edae3a90069",
      "name": "If - Check Image Generation",
      "type": "n8n-nodes-base.if",
      "position": [
        1648,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "a0ab186b-99c5-407b-9cb9-5fef85686131",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $binary.data !== undefined }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "19351547-5932-4704-992d-b66c1c43c6ed",
      "name": "Read \u2013 Google Sheets \u2013 Pending Prompts",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        352,
        368
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "",
          "cachedResultName": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "="
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c57fa259-aa2f-4164-9865-e11a9886a995",
      "name": "Split \u2013 Process Items Individually",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        576,
        368
      ],
      "parameters": {
        "options": {}
      },
      "executeOnce": false,
      "typeVersion": 3,
      "alwaysOutputData": false
    },
    {
      "id": "fe69679a-fe26-4ac7-a1b1-712692bedc24",
      "name": "Download \u2013  Reference Image",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        768,
        384
      ],
      "parameters": {
        "url": "={{ $json.referans_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "executeOnce": false,
      "retryOnFail": false,
      "typeVersion": 4.2
    },
    {
      "id": "cd3e66bd-1c88-4b42-b58b-37510a8cfd00",
      "name": "Analyze \u2013 Gemini \u2013 Visual Style",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "onError": "continueRegularOutput",
      "position": [
        1088,
        384
      ],
      "parameters": {
        "text": "=YOUR PROMPT",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "image",
        "simplify": false,
        "inputType": "binary",
        "operation": "analyze",
        "binaryPropertyName": "=data"
      },
      "retryOnFail": false,
      "typeVersion": 1.1
    },
    {
      "id": "8640d9a5-67ba-463d-b857-6e4fd536c9ae",
      "name": "Create \u2013 Gemini \u2013 New Image From Style",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "onError": "continueRegularOutput",
      "position": [
        1456,
        272
      ],
      "parameters": {
        "prompt": "=YOUR PROMPT",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash-image",
          "cachedResultName": "models/gemini-2.5-flash-image (Nano Banana)"
        },
        "options": {
          "sampleCount": 1
        },
        "resource": "image"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "ba08e170-3cdc-4b1f-9f7e-9c2f57e245d4",
      "name": "ransform \u2013 Code \u2013 Prepare Image Binary",
      "type": "n8n-nodes-base.code",
      "position": [
        1840,
        240
      ],
      "parameters": {
        "jsCode": "// DALL-E binary'yi al ve metadata ekle\nconst items = $input.all();\n\n// Binary data kontrol\nif (!items[0].binary || !items[0].binary.data) {\n  throw new Error('DALL-E binary data bulunamad\u0131!');\n}\n\n// Reference node'dan bilgileri al\nconst referenceNode = $('Download \u2013  Reference Image').item.json;\nconst gorselId = referenceNode.gorsel_id || 'generated';\nconst fileName = `${gorselId}_output.png`;\n\n// n8n binary'yi direkt kullan, sadece filename'i de\u011fi\u015ftir\nconst binaryData = items[0].binary.data;\n\nreturn {\n  json: {\n    gorsel_id: gorselId,\n    fileName: fileName,\n    ana_prompt: referenceNode.ana_prompt,\n    stil_prompt: referenceNode.stil_prompt\n  },\n  binary: {\n    data: {\n      ...binaryData,  // Mevcut binary data'y\u0131 koru\n      fileName: fileName  // Sadece filename'i g\u00fcncelle\n    }\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "933f1eca-9c61-41da-9a5f-d85210cbccb5",
      "name": "Upload \u2013 Google Drive \u2013 Store Generated Image",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2032,
        240
      ],
      "parameters": {
        "name": "=",
        "driveId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        },
        "options": {
          "simplifyOutput": false,
          "appPropertiesUi": {
            "appPropertyValues": [
              {
                "key": "fields",
                "value": "=webViewLink,webContentLink,id,name"
              }
            ]
          }
        },
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "typeVersion": 3
    },
    {
      "id": "91d2a44c-3be0-44fe-aac9-c10f0473f074",
      "name": "Update \u2013 Google Sheets \u2013 Success Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2432,
        240
      ],
      "parameters": {
        "columns": {
          "value": {
            "tarih": "=",
            "row_number": 0
          },
          "schema": [
            {
              "id": "gorsel_id",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "gorsel_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ana_prompt",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "ana_prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "stil_prompt",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "stil_prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "referans_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "referans_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "durum",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "durum",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "gorsel_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "gorsel_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "hata_mesaji",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "hata_mesaji",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tarih",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "tarih",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "tarih"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 54612697,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WqalnqFoFdJngObmgW7HF4JIU7XcK9QnDoiExazAXLU/edit#gid=54612697",
          "cachedResultName": "Prompts 2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1WqalnqFoFdJngObmgW7HF4JIU7XcK9QnDoiExazAXLU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WqalnqFoFdJngObmgW7HF4JIU7XcK9QnDoiExazAXLU/edit?usp=drivesdk",
          "cachedResultName": "Prompt Okuma"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "641ea6c1-b3b9-4c84-a3ae-4d0fc8bbebd8",
      "name": "Update \u2013 Google Sheets \u2013 Error Status",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        1808,
        528
      ],
      "parameters": {
        "columns": {
          "value": {
            "gorsel_id": "=",
            "row_number": 0
          },
          "schema": [
            {
              "id": "gorsel_id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "gorsel_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ana_prompt",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "ana_prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "stil_prompt",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "stil_prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "referans_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "referans_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "durum",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "durum",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "gorsel_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "gorsel_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "hata_mesaji",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "hata_mesaji",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tarih",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "tarih",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "gorsel_id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "id",
          "value": "="
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "="
        }
      },
      "executeOnce": false,
      "retryOnFail": false,
      "typeVersion": 4.7,
      "alwaysOutputData": false
    },
    {
      "id": "41d55e89-ffb1-4fc4-9f09-e9d638a5cd2c",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 1568,
        "height": 592,
        "content": "## Setup Instructions\n\n- Google Sheets: Create a sheet with columns: gorsel_id, ana_prompt, stil_prompt, referans_url, durum.\n\n- Credentials: Set up and connect Google Sheets, Google Drive, and Google Gemini API credentials.\n\n- Resource IDs: Update the Google Sheets \"Document ID\" and Google Drive \"Folder ID\" in the respective nodes to match your own files.\n\n- Webhooks: Use the Webhook URL in your dashboard or external app to trigger the process."
      },
      "typeVersion": 1
    },
    {
      "id": "04d003e2-24a9-4bf8-92eb-105ef60aa9da",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 1168,
        "height": 672,
        "content": "## Monitoring & Notifications\n\n\nThis workflow uses ntfy.sh for real-time progress updates.\n\n- Topic: Replace the topic name ai-gorsel-uretimi100 in all HTTP Request nodes with your own unique topic.\n\n- Live Feed: Connect your dashboard or mobile app to the same ntfy topic to see live logs and status changes."
      },
      "typeVersion": 1
    },
    {
      "id": "c8658fab-e8b1-4022-90bc-241db5d5290f",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        496
      ],
      "parameters": {
        "color": 7,
        "width": 1584,
        "height": 432,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Logic & Error Handling\n\n- Rate Limiting: 'Wait' nodes are strategically placed to prevent hitting API rate limits during bulk processing.\n\n- Looping: The workflow processes images one by one to ensure stability.\n\n- Error Management: If an analysis or generation fails, the \"Update \u2013 Google Sheets \u2013 Error Status\" node automatically records the failure reason in your spreadsheet."
      },
      "typeVersion": 1
    },
    {
      "id": "eea26e51-711e-4def-96fc-96f88e446a9b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        128
      ],
      "parameters": {
        "width": 432,
        "height": 896,
        "content": "##Main Overview\n\n### How it works\nThis workflow automates a sophisticated image generation pipeline designed to maintain visual consistency by replicating styles from reference images. Triggered via a Webhook, the system first retrieves pending tasks from a Google Sheet. For each entry, it downloads a reference image and utilizes Google Gemini 2.5 Flash to perform a deep visual analysis. This analysis identifies the specific art style, color palette, and composition of the reference. \n\nGemini then uses these insights as a stylistic framework to generate a new image based on the user's prompt. Once created, the workflow transforms the binary data, uploads the final image to a designated Google Drive folder, and updates the original Google Sheet with the new image link and completion status. Throughout the process, real-time status updates are broadcasted to an ntfy.sh topic, allowing for live monitoring via a dashboard or mobile device.\n\n### Setup steps\n1. **Spreadsheet Preparation:** Create a Google Sheet with columns for `gorsel_id`, `ana_prompt`, `stil_prompt`, `referans_url`, and `durum`. Ensure the status column uses English keywords (e.g., \"Pending\").\n2. **Credentials:** Set up and link your credentials for Google Sheets, Google Drive, and the Google Gemini API.\n3. **Configure Resource IDs:** Replace the placeholder Document ID in the Google Sheets nodes and the Folder ID in the Google Drive node with your specific resource IDs.\n4. **Notification Topic:** In all HTTP Request nodes (ntfy), replace the topic `ai-gorsel-uretimi100` with a unique name of your choice.\n5. **Deployment:** Activate the workflow and trigger it using the Webhook URL provided in the trigger node.\n\n### Customization tips\nYou can modify the \"Wait\" node durations if you are using a Gemini API tier with strict rate limits. To change the level of detail in style replication, you can adjust the instructions inside the \"Analyze \u2013 Gemini \u2013 Visual Style\" node."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "timezone": "Europe/Istanbul",
    "callerPolicy": "workflowsFromSameOwner",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "a1396781-cc31-472c-8699-50b962f2cefa",
  "connections": {
    "Wait #1": {
      "main": [
        [
          {
            "node": "Analyze \u2013 Gemini \u2013 Visual Style",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait #2": {
      "main": [
        [
          {
            "node": "Update \u2013 Google Sheets \u2013 Success Status",
            "type": "main",
            "index": 0
          },
          {
            "node": "ntfy - Task Success Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait #3": {
      "main": [
        [
          {
            "node": "Split \u2013 Process Items Individually",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait #4": {
      "main": [
        [
          {
            "node": "Split \u2013 Process Items Individually",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Respond to Webhook": {
      "main": [
        [
          {
            "node": "Read \u2013 Google Sheets \u2013 Pending Prompts",
            "type": "main",
            "index": 0
          },
          {
            "node": "ntfy - Start Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If  - Check Analysis Result": {
      "main": [
        [
          {
            "node": "Create \u2013 Gemini \u2013 New Image From Style",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update \u2013 Google Sheets \u2013 Error Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If - Check Image Generation": {
      "main": [
        [
          {
            "node": "ransform \u2013 Code \u2013 Prepare Image Binary",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update \u2013 Google Sheets \u2013 Error Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download \u2013  Reference Image": {
      "main": [
        [
          {
            "node": "Wait #1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze \u2013 Gemini \u2013 Visual Style": {
      "main": [
        [
          {
            "node": "If  - Check Analysis Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split \u2013 Process Items Individually": {
      "main": [
        [
          {
            "node": "ntfy - Workflow Completion Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Download \u2013  Reference Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update \u2013 Google Sheets \u2013 Error Status": {
      "main": [
        [
          {
            "node": "Wait #4",
            "type": "main",
            "index": 0
          },
          {
            "node": "ntfy - Task Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create \u2013 Gemini \u2013 New Image From Style": {
      "main": [
        [
          {
            "node": "If - Check Image Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read \u2013 Google Sheets \u2013 Pending Prompts": {
      "main": [
        [
          {
            "node": "Split \u2013 Process Items Individually",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ransform \u2013 Code \u2013 Prepare Image Binary": {
      "main": [
        [
          {
            "node": "Upload \u2013 Google Drive \u2013 Store Generated Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update \u2013 Google Sheets \u2013 Success Status": {
      "main": [
        [
          {
            "node": "Wait #3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload \u2013 Google Drive \u2013 Store Generated Image": {
      "main": [
        [
          {
            "node": "Wait #2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}