{"workflow":{"id":13506,"name":"Build a WhatsApp AI shopping bot with virtual try-on using Gemini and GPT","views":141,"recentViews":1,"totalViews":141,"createdAt":"2026-02-19T05:48:15.430Z","description":"## Build a WhatsApp AI shopping bot with virtual try-on using Gemini\n\n---\n\n📌 Overview\n\nThis workflow fully automates your T-shirt store's WhatsApp shopping experience using GPT for intent detection, MongoDB Atlas for vector-based product search, Redis for session management, and Google Gemini for AI-powered virtual try-on.\n\nIt automatically handles customer messages, finds relevant products, processes orders, and generates realistic try-on images — all inside WhatsApp, with no app or website required.\n\nCustomers can search for T-shirts, place orders, and virtually try on items in a single conversation. Redis ensures fast product caching and session tracking. MongoDB Atlas stores the product catalog and orders. Google Sheets logs every order automatically. Gemini generates realistic try-on images from customer selfies.\n\nThis workflow eliminates manual order handling, improves customer experience, and gives store owners full visibility into orders and product searches.\n\n⚙️ How it works\n\nThis workflow runs automatically when a customer sends a WhatsApp message.\n\n🔍 Product search\n\n* 💬 Receives the customer message via WhatsApp Business API\n* 🧠 GPT classifies the intent as product search, recommendation, or general query\n* ⚡ Checks Redis cache for existing results (TTL: 1 hour)\n* 🔎 On a cache miss, runs MongoDB Atlas vector search using OpenAI embeddings\n* 🛍️ Sends matching products as interactive WhatsApp cards with Order Now and Virtual Try-On buttons\n\n🛒 Order flow\n\n* 👆 Triggered when the customer taps the Order Now button\n* 📦 AI agent fetches product details from MongoDB\n* 🗃️ Creates a new order document in MongoDB\n* 📊 Logs the order to Google Sheets automatically\n* ✅ Sends an order confirmation message to the customer via WhatsApp\n\n👗 Virtual try-on flow\n\n* 👆 Triggered when the customer taps the Virtual Try-On button\n* 💾 Stores the product ID in Redis (TTL: 10 minutes)\n* 📸 Prompts the customer to send a clear front-facing selfie\n* 🔍 Gemini validates that exactly one real person is in the photo\n* 🖼️ Merges the product image and selfie and generates a realistic try-on image\n* 📩 Sends the try-on result back to the customer via WhatsApp\n* 🗑️ Clears the Redis context after delivery\n\n🛠 Setup steps\n\n1. Import this workflow into n8n\n2. Connect your WhatsApp Business Cloud API credentials\n3. Connect your OpenAI API credentials (for embeddings and GPT model)\n4. Connect your Google Gemini API credentials\n5. Connect your MongoDB Atlas credentials and create a vector index named ShopingBot on the product collection\n6. Connect your Redis credentials\n7. Connect your Google Drive service account credentials\n8. Connect your Google Sheets service account credentials\n9. Import your product catalog with embeddings into the MongoDB product collection\n10. Activate the workflow\n\nThe workflow will run automatically when customers send WhatsApp messages.\n\n🚀 Features\n\n🧠 AI-powered shopping\n\n* 🤖 Automatically classifies customer intent using GPT\n* 🔎 Semantic product search using OpenAI embeddings and MongoDB Atlas vector search\n* ⚡ Redis caching for ultra-fast repeated search results (TTL: 1 hour)\n* 💬 Interactive WhatsApp product cards with Order Now and Virtual Try-On buttons\n* 🔄 Sliding window session memory (last 20 messages per user)\n\n🛒 Order management\n\n* 📦 Fully automated order creation saved to MongoDB\n* 📊 Automatic order logging to Google Sheets\n* 🤖 AI agent handles the complete order flow without manual input\n* ✅ Instant order confirmation sent to the customer via WhatsApp\n\n👗 Virtual try-on\n\n* ✨ AI-powered try-on image generation using Google Gemini\n* 📷 Selfie validation ensures exactly one real person is in the photo\n* 🖼️ Product and selfie images resized and merged before generation\n* 📩 Try-on result delivered directly in the WhatsApp conversation\n* 🗑️ Redis TTL automatically clears try-on context after delivery\n\n🔐 Security and reliability\n\n* 🛡️ Advanced message validation with spam and XSS protection\n* ❌ Unsupported message types rejected with friendly error messages\n* 🔁 Retry logic on critical HTTP request nodes\n* 📦 Modular workflow architecture for easy customisation and scaling\n\n📋 Requirements\n\nYou need the following accounts and credentials:\n\n* 🔧 n8n\n* 📱 WhatsApp Business Cloud API\n* 🤖 OpenAI API (embeddings and GPT model)\n* ✨ Google Gemini API\n* 🍃 MongoDB Atlas (with vector index named ShoppingBot on the product collection)\n* ⚡ Redis server\n* 📁 Google Drive (service account)\n* 📊 Google Sheets (service account)\n\n🎯 Benefits\n\n* 🚀 Fully automated WhatsApp shopping experience\n* 🙌 No manual order handling required\n* 👗 Customers can try on products before buying\n* ⚡ Fast product search with Redis caching\n* 📊 All orders automatically tracked in Google Sheets\n* 💼 Reduces support workload for store owners\n* 🕐 Works 24/7 without human intervention\n\n👨‍💻 Author\n\nBytezTech Pvt Ltd","workflow":{"meta":{"instanceId":"01d5a2fc10ab8549ddb03f83f7ba51316ff6e8d41eb184a858a745f93cf019f4","templateCredsSetupCompleted":true},"nodes":[{"id":"4f63a844-6f93-4880-a74f-aa40787aace6","name":"📌 Main overview","type":"n8n-nodes-base.stickyNote","position":[4608,736],"parameters":{"width":516,"height":620,"content":"## WhatsApp AI shopping bot for Bytez\n\n## How it works\n1. User sends a WhatsApp message (text, button tap, or image).\n2. GPT-5-nano classifies the intent and routes to the correct flow.\n3. Product search checks Redis cache first, then runs MongoDB Atlas vector search using OpenAI embeddings.\n4. Matched products are sent as interactive WhatsApp cards with Order Now and Virtual Try-On buttons.\n5. Order tap → AI agent fetches product, creates order in MongoDB, logs to Google Sheets, sends confirmation.\n6. Try-On tap → user sends selfie → Gemini validates one person → generates try-on image → sends result back.\n\n## Setup steps\n1. Add WhatsApp Business API credentials.\n2. Add OpenAI credentials (embeddings + GPT-5-nano).\n3. Add Google Gemini API credentials.\n4. Add MongoDB Atlas credentials and create a vector index named `ShopingBot` on the `product` collection.\n5. Add Redis credentials.\n6. Add Google Drive and Sheets credentials (service account).\n7. Import product catalog with embeddings into the MongoDB `product` collection."},"typeVersion":1},{"id":"271c0200-b2e1-4830-abd0-22a1994bb404","name":"📌 Group: Entry & Router","type":"n8n-nodes-base.stickyNote","position":[5184,736],"parameters":{"color":7,"width":580,"height":460,"content":"## 📥 Entry & Message Router\nReceives all incoming WhatsApp messages. Routes button taps and image uploads to the interactive handler. Routes plain text messages to the validation pipeline.\n"},"typeVersion":1},{"id":"2c5fe6ef-414d-4184-9593-d373815ac389","name":"📌 Group: Validation","type":"n8n-nodes-base.stickyNote","position":[5856,2160],"parameters":{"color":7,"width":760,"height":476,"content":"## ✅ Text Message Validation\nValidates incoming text for empty input, spam, XSS, and unsupported types. Invalid messages are rejected with a user-friendly error reply before entering the session pipeline."},"typeVersion":1},{"id":"d6513e3e-c805-4987-afce-dd7db7a5f739","name":"📌 Group: Session Management","type":"n8n-nodes-base.stickyNote","position":[6656,2064],"parameters":{"color":7,"width":492,"height":396,"content":"## 💾 Session Management (Redis)\nLoads or creates a per-user Redis session (TTL: 1 hr). Appends user and assistant messages. Keeps the last 20 messages using a sliding window."},"typeVersion":1},{"id":"44cad1fa-b280-4824-9f37-ced7823009c5","name":"📌 Group: AI Classification","type":"n8n-nodes-base.stickyNote","position":[7296,1856],"parameters":{"color":7,"width":1496,"height":828,"content":"## 🧠 AI Classification & Routing\nBytezBot classifies intent using GPT-5-nano. Returns JSON for product_search or recommend, or plain text for all other queries. Routes to the product pipeline or a direct WhatsApp reply."},"typeVersion":1},{"id":"590a85d0-ed0d-4afe-ac0a-e35761a58356","name":"📌 Group: Cache & Vector Search","type":"n8n-nodes-base.stickyNote","position":[8864,1600],"parameters":{"color":7,"width":2508,"height":732,"content":"## ⚡ Product Search (Cache + Vector)\nChecks Redis cache first (TTL: 1 hr). On a miss, runs MongoDB Atlas vector search using OpenAI embeddings. \nDownloads product images from Drive and stores results in cache."},"typeVersion":1},{"id":"ffbd2a6d-6185-4a9e-b665-be92ffa2731c","name":"📌 Group: Product Sender","type":"n8n-nodes-base.stickyNote","position":[11424,1664],"parameters":{"color":7,"width":1148,"height":460,"content":"## 📤 Product Message Sender\nLoops through each matched product. Uploads image to WhatsApp media API. \nSends an interactive message with Order Now and Virtual Try-On buttons."},"typeVersion":1},{"id":"8b304693-991b-49d1-899c-b9a53c5a48c0","name":"📌 Group: Order Flow","type":"n8n-nodes-base.stickyNote","position":[6960,-112],"parameters":{"color":7,"width":1148,"height":588,"content":"## 🛒 Order Flow\nTriggered when user taps Order Now. AI agent fetches product, creates an order document, saves to MongoDB and Google Sheets, then sends a confirmation message via WhatsApp."},"typeVersion":1},{"id":"5b487497-fb35-46f4-8b51-b7e3677608e0","name":"📌 Group: VTO Flow","type":"n8n-nodes-base.stickyNote","position":[6752,-560],"parameters":{"color":7,"width":872,"height":360,"content":"## 👗 Virtual Try-On (VTO) Flow\nStores product ID in Redis (TTL: 10 min) and prompts the user for a selfie. Gemini validates exactly one person, generates the try-on image, sends it via WhatsApp, then clears Redis context."},"typeVersion":1},{"id":"42252d26-19e1-4359-872b-94c2ce3a9ea2","name":"Check Redis cache","type":"n8n-nodes-base.redis","position":[9104,1872],"parameters":{"key":"={{ $json.cacheKey }}","options":{},"operation":"get","propertyName":"cachedProductsJson"},"typeVersion":1},{"id":"493b1ea1-356f-461a-b6fa-bdfc0c39be03","name":"Store products in cache","type":"n8n-nodes-base.redis","position":[11024,1984],"parameters":{"key":"={{ $json.cacheKey }}","ttl":3600,"value":"={{ $json.productsJson }}","expire":true,"operation":"set"},"typeVersion":1},{"id":"cc9a90f4-db40-4498-960a-e590a43376fc","name":"Save session to Redis","type":"n8n-nodes-base.redis","position":[8208,2176],"parameters":{"key":"={{ $json.redisKey }}","ttl":3600,"value":"={{ $json.updatedSessionString }}","expire":true,"operation":"set"},"typeVersion":1},{"id":"dcc659e3-24d9-40ab-b06e-ea7412a0642e","name":"Validate incoming message","type":"n8n-nodes-base.code","position":[5984,2304],"parameters":{"jsCode":"// Ultra-Advanced Validation for WhatsApp Messages\nconst items = $input.all();\n\nfunction isEmptyOrInvalid(str) {\n  if (!str || typeof str !== 'string') return true;\n  const trimmed = str.trim();\n  if (trimmed.length === 0) return true;\n  const invalidOnlyPattern = /^[\\s\\u00A0\\u1680\\u2000-\\u200B\\u202F\\u205F\\u3000\\uFEFF\"'`<>,.!?;:\\-_=+(){}\\[\\]\\/\\\\|~@#$%^&*]*$/;\n  if (invalidOnlyPattern.test(trimmed)) return true;\n  return false;\n}\n\nfunction isMeaningless(str) {\n  if (!str || typeof str !== 'string') return true;\n  const trimmed = str.trim();\n  if (trimmed.length === 1) {\n    const char = trimmed;\n    if (/[a-zA-Z0-9]/.test(char)) return false;\n    if (['✓', '✔', '✅', '❌', '👍', '👎', '✋', '🙏'].includes(char)) return false;\n    if (/[<>!?.,;:'\"=+\\-_*&^%$#@~`|\\\\\\/(){}\\[\\]]/.test(char)) return true;\n  }\n  if (trimmed.length <= 2) {\n    if (/^[^a-zA-Z0-9\\u{1F300}-\\u{1F9FF}]+$/u.test(trimmed)) return true;\n  }\n  if (/^(.)\\1{2,}$/.test(trimmed) && trimmed.length <= 10) {\n    if (!/^[a-zA-Z0-9]+$/.test(trimmed)) return false;\n    return true;\n  }\n  return false;\n}\n\nfunction sanitizeMessage(str) {\n  if (!str || typeof str !== 'string') return '';\n  let sanitized = str.trim();\n  sanitized = sanitized.replace(/\\s+/g, ' ');\n  sanitized = sanitized.replace(/[\\u200B-\\u200D\\uFEFF\\u00AD]/g, '');\n  sanitized = sanitized.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n  sanitized = sanitized.replace(/([!?.;,]){4,}/g, '$1$1$1');\n  sanitized = sanitized.replace(/^[<>{}()\\[\\]]+|[<>{}()\\[\\]]+$/g, '');\n  return sanitized.trim();\n}\n\nfunction containsSuspiciousPatterns(str) {\n  if (!str || typeof str !== 'string') return false;\n  const suspiciousPatterns = [\n    /<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi,\n    /javascript:/gi,\n    /on\\w+\\s*=/gi,\n    /<iframe/gi,\n    /eval\\s*\\(/gi,\n    /expression\\s*\\(/gi,\n    /<object/gi,\n    /<embed/gi,\n    /vbscript:/gi,\n    /data:text\\/html/gi,\n  ];\n  return suspiciousPatterns.some(pattern => pattern.test(str));\n}\n\nfunction isSpamPattern(str) {\n  if (!str || typeof str !== 'string') return false;\n  const capitals = (str.match(/[A-Z]/g) || []).length;\n  const letters = (str.match(/[a-zA-Z]/g) || []).length;\n  if (letters > 5 && (capitals / letters) > 0.7) return true;\n  const words = str.toLowerCase().split(/\\s+/);\n  const uniqueWords = new Set(words);\n  if (words.length > 10 && uniqueWords.size < words.length * 0.3) return true;\n  return false;\n}\n\nfor (const item of items) {\n  const message = item.json.messages?.[0];\n  let isValid = false;\n  let validationError = null;\n  let userFriendlyError = null;\n  let messageContent = null;\n  let messageType = null;\n\n  if (!message) {\n    validationError = \"Message data is missing in the incoming payload\";\n    userFriendlyError = \"Sorry, we couldn't process your message. Please try again.\";\n  } else if (message.type === 'text') {\n    const rawText = message.text?.body;\n    if (!rawText) {\n      validationError = \"Text message body is null or undefined\";\n      userFriendlyError = \"Please send a valid text message.\";\n    } else if (isEmptyOrInvalid(rawText)) {\n      validationError = `Text message is empty or contains only invalid characters: \"${rawText}\"`;\n      userFriendlyError = \"Your message appears to be empty or contains only special characters. Please send a valid text message.\";\n    } else {\n      const sanitized = sanitizeMessage(rawText);\n      if (sanitized.length === 0) {\n        validationError = `Text message contains no valid content after sanitization. Original: \"${rawText}\"`;\n        userFriendlyError = \"Your message doesn't contain any valid text. Please try sending your message again.\";\n      } else if (isMeaningless(sanitized)) {\n        validationError = `Message is too short or meaningless: \"${sanitized}\"`;\n        userFriendlyError = \"Your message is too short. Please send a complete message (at least 2-3 characters).\";\n      } else if (containsSuspiciousPatterns(sanitized)) {\n        validationError = `Text message contains potentially malicious content: \"${sanitized}\"`;\n        userFriendlyError = \"Your message contains invalid content. Please send a normal text message.\";\n      } else if (isSpamPattern(sanitized)) {\n        validationError = `Text message appears to be spam: \"${sanitized}\"`;\n        userFriendlyError = \"Your message looks unusual. Please send a normal message.\";\n      } else if (sanitized.length > 4096) {\n        validationError = `Text message exceeds maximum length: ${sanitized.length} characters`;\n        userFriendlyError = \"Your message is too long. Please keep it under 4000 characters.\";\n      } else {\n        isValid = true;\n        messageContent = sanitized;\n        messageType = 'text';\n      }\n    }\n  } else if (message.type === 'interactive') {\n    const interactive = message.interactive;\n    if (!interactive) {\n      validationError = \"Interactive message data is missing\";\n      userFriendlyError = \"Button/list selection failed. Please try clicking again.\";\n    } else if (interactive.type === 'button_reply' && interactive.button_reply) {\n      const buttonId = interactive.button_reply.id;\n      const buttonTitle = interactive.button_reply.title;\n      if (!buttonId || isEmptyOrInvalid(buttonId)) {\n        validationError = `Button reply ID is empty or invalid: \"${buttonId}\"`;\n        userFriendlyError = \"Button selection failed. Please try clicking the button again.\";\n      } else if (containsSuspiciousPatterns(buttonId)) {\n        validationError = `Button reply contains malicious content: \"${buttonId}\"`;\n        userFriendlyError = \"Invalid button selection. Please contact support.\";\n      } else {\n        const sanitizedId = sanitizeMessage(buttonId);\n        if (sanitizedId.length === 0) {\n          validationError = `Button ID empty after sanitization: \"${buttonId}\"`;\n          userFriendlyError = \"Button selection failed. Please try again.\";\n        } else {\n          isValid = true;\n          messageContent = sanitizedId;\n          messageType = 'button_reply';\n          item.json.buttonTitle = buttonTitle ? sanitizeMessage(buttonTitle) : null;\n        }\n      }\n    } else if (interactive.type === 'list_reply' && interactive.list_reply) {\n      const listId = interactive.list_reply.id;\n      const listTitle = interactive.list_reply.title;\n      const listDescription = interactive.list_reply.description;\n      if (!listId || isEmptyOrInvalid(listId)) {\n        validationError = `List reply ID is empty or invalid: \"${listId}\"`;\n        userFriendlyError = \"List selection failed. Please try selecting from the list again.\";\n      } else {\n        const sanitizedId = sanitizeMessage(listId);\n        if (sanitizedId.length === 0) {\n          validationError = `List ID empty after sanitization: \"${listId}\"`;\n          userFriendlyError = \"List selection failed. Please try again.\";\n        } else {\n          isValid = true;\n          messageContent = sanitizedId;\n          messageType = 'list_reply';\n          item.json.listTitle = listTitle ? sanitizeMessage(listTitle) : null;\n          item.json.listDescription = listDescription ? sanitizeMessage(listDescription) : null;\n        }\n      }\n    } else {\n      validationError = `Unsupported interactive type: '${interactive.type || 'unknown'}'`;\n      userFriendlyError = \"Unsupported selection type. Please use the provided buttons or lists.\";\n    }\n  } else if (message.type === 'image') {\n    validationError = \"Image message received\";\n    userFriendlyError = \"📸 Image messages are not supported here. Please send a text message instead.\";\n  } else if (message.type === 'video') {\n    validationError = \"Video message received\";\n    userFriendlyError = \"🎥 Video messages are not supported. Please send a text message instead.\";\n  } else if (message.type === 'audio' || message.type === 'voice') {\n    validationError = \"Audio/voice message received\";\n    userFriendlyError = \"🎤 Voice messages are not supported. Please send a text message instead.\";\n  } else if (message.type === 'document') {\n    validationError = \"Document message received\";\n    userFriendlyError = \"📄 Document messages are not supported. Please send a text message instead.\";\n  } else if (message.type === 'sticker') {\n    validationError = \"Sticker message received\";\n    userFriendlyError = \"😊 Stickers are not supported. Please send a text message instead.\";\n  } else {\n    validationError = `Unknown message type: '${message.type}'`;\n    userFriendlyError = \"❌ This message type is not supported. Please send a text message.\";\n  }\n\n  item.json.validation = {\n    isValid: isValid,\n    error: validationError,\n    userFriendlyError: userFriendlyError,\n    messageType: messageType,\n    timestamp: new Date().toISOString()\n  };\n\n  if (isValid) {\n    item.json.messageText = messageContent;\n    item.json.messageType = messageType;\n    item.json.senderId = item.json.contacts?.[0]?.wa_id || null;\n    item.json.userName = item.json.contacts?.[0]?.profile?.name\n      ? sanitizeMessage(item.json.contacts[0].profile.name)\n      : \"User\";\n    item.json.messageId = message.id || null;\n    item.json.timestamp = message.timestamp || null;\n    item.json.messageMetadata = {\n      originalLength: messageType === 'text' ? (message.text?.body?.length || 0) : messageContent.length,\n      sanitizedLength: messageContent.length,\n      wordCount: messageContent.split(/\\s+/).length,\n      containsEmojis: /[\\u{1F600}-\\u{1F64F}]|[\\u{1F300}-\\u{1F5FF}]|[\\u{1F680}-\\u{1F6FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]/u.test(messageContent),\n      containsNumbers: /\\d/.test(messageContent),\n      containsUrls: /(https?:\\/\\/[^\\s]+)/gi.test(messageContent),\n      isQuestion: /[?？]/.test(messageContent),\n      language: /[\\u0900-\\u097F]/.test(messageContent) ? 'hindi' :\n                /[a-zA-Z]/.test(messageContent) ? 'english' : 'unknown'\n    };\n  } else {\n    item.json.senderId = item.json.contacts?.[0]?.wa_id || null;\n    item.json.userName = item.json.contacts?.[0]?.profile?.name || \"User\";\n    item.json.messageId = message?.id || null;\n  }\n}\n\nreturn items;"},"typeVersion":2},{"id":"2ec6a4c2-06eb-4ab9-b0e5-09b779ecd7b8","name":"Send validation error to user","type":"n8n-nodes-base.whatsApp","disabled":true,"position":[6432,2400],"webhookId":"4fc322dc-9d98-42d1-843e-2a75030edd60","parameters":{"textBody":"=⚠️ Validation failed: {{ $json.validation.error }}","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('Check if message is button or image').item.json.statuses[0].recipient_id }}"},"typeVersion":1},{"id":"05cfe114-d777-4c15-9e33-495b376860db","name":"Get user session from Redis","type":"n8n-nodes-base.redis","position":[6704,2224],"parameters":{"key":"={{ $json.senderId }}","options":{},"operation":"get","propertyName":"sessionValue"},"typeVersion":1},{"id":"2497bfb1-6cc9-4243-996d-25f91f7e57de","name":"GPT-5-nano (intent classifier)","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[7312,2432],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-5-nano","cachedResultName":"gpt-5-nano"},"options":{}},"typeVersion":1.2},{"id":"1117d593-3437-4e96-9e31-448b090062c9","name":"Set VTO context in Redis","type":"n8n-nodes-base.redis","position":[6816,-432],"parameters":{"key":"=vto_context_{{ $json.waId }}","ttl":600,"value":"={{ $json.productId }}","expire":true,"operation":"set"},"typeVersion":1},{"id":"26f4dfd0-95c5-4af1-b0d1-213991fbf947","name":"GPT-4o (order agent)","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[7120,272],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"gpt-4o"},"options":{}},"typeVersion":1.2},{"id":"4c10f728-35e4-44e0-93b4-356c389cc63b","name":"Create order in MongoDB","type":"n8n-nodes-base.mongoDbTool","position":[7392,272],"parameters":{"fields":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Fields', 'A JSON string representing the complete order document to be inserted.', 'string') }}","options":{},"operation":"insert","collection":"orders"},"typeVersion":1.2},{"id":"3f3518a8-c956-43ba-9d06-f3c221b1ff23","name":"Get product info from MongoDB","type":"n8n-nodes-base.mongoDbTool","position":[7520,272],"parameters":{"query":"={ \"_id\": \"{{ $fromAI('productId', 'The Object ID of the product to find', 'string') }}\" }","options":{},"collection":"product"},"typeVersion":1.2},{"id":"0c5258dc-ab79-4e54-afa9-9ca3e104c42b","name":"Order orchestration AI agent","type":"@n8n/n8n-nodes-langchain.agent","position":[7296,48],"parameters":{"text":"=User with phone number {{ $json.waId }} (name: {{ $json.userName }}) has sent an order request for product ID {{ $json.productId }}. Please handle the entire order process.","options":{"systemMessage":"You are an automated order processing agent for Bytez, a T-shirt store.\n\nYour job is to handle the complete order workflow end-to-end without asking the user for any additional information.\n\nYou have access to the following tools:\n- Get product info from MongoDB: fetch product details using the product ID\n- Create order in MongoDB: insert the completed order document\n- Log order to Google Sheets: append the order row\n- Session memory: maintain conversation context\n\nFollow this sequence for every order:\n\nStep 1 - Fetch product\nUse \"Get product info from MongoDB\" with the provided product ID to retrieve the product name and price.\n\nStep 2 - Create the order document\nBuild the order with these fields:\n- orderId: \"ORD\" followed by 12 random alphanumeric characters\n- productId: the provided product ID\n- productName: from the product lookup\n- userPhone: the provided waId\n- userName: the provided name\n- orderDate: current date and time in ISO 8601 format\n- status: \"pending\"\n- totalAmount: from the product lookup\n\nStep 3 - Save to MongoDB\nUse \"Create order in MongoDB\" to insert the order document.\n\nStep 4 - Log to Google Sheets\nUse \"Log order to Google Sheets\" with the same order fields.\n\nStep 5 - Send confirmation\nReply with this message:\nHello [userName]! Your order has been placed successfully. Order ID: [orderId]. Product: [productName]. We will update you once it ships!\n\nImportant rules:\n- Do not ask the user for any extra information\n- Always follow the sequence: Fetch, Create, Log, Confirm\n- If any step fails, reply with a clear, friendly error message"},"promptType":"define"},"typeVersion":2.2},{"id":"6528994a-08f3-415c-8c83-4f134a3505e8","name":"Log order to Google Sheets","type":"n8n-nodes-base.googleSheetsTool","position":[7648,272],"parameters":{"columns":{"value":{"status":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('status', 'The current status of the order (e.g., pending).', 'string') }}","orderId":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('orderId', 'The unique ID for the order.', 'string') }}","userName":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('userName', 'The name of the user who placed the order.', 'string') }}","orderDate":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('orderDate', 'The ISO 8601 timestamp for when the order was placed.', 'string') }}","productId":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('productId', 'The ID of the product ordered.', 'string') }}","userPhone":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('userPhone', 'The phone number of the user.', 'string') }}","productName":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('productName', 'The name of the product ordered.', 'string') }}","totalAmount":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('totalAmount', 'The total cost of the order.', 'string') }}"},"schema":[{"id":"orderId","type":"string","display":true,"required":false,"displayName":"orderId","defaultMatch":false,"canBeUsedToMatch":true},{"id":"productId","type":"string","display":true,"required":false,"displayName":"productId","defaultMatch":false,"canBeUsedToMatch":true},{"id":"productName","type":"string","display":true,"required":false,"displayName":"productName","defaultMatch":false,"canBeUsedToMatch":true},{"id":"userName","type":"string","display":true,"required":false,"displayName":"userName","defaultMatch":false,"canBeUsedToMatch":true},{"id":"userPhone","type":"string","display":true,"required":false,"displayName":"userPhone","defaultMatch":false,"canBeUsedToMatch":true},{"id":"orderDate","type":"string","display":true,"required":false,"displayName":"orderDate","defaultMatch":false,"canBeUsedToMatch":true},{"id":"status","type":"string","display":true,"required":false,"displayName":"status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"totalAmount","type":"string","display":true,"required":false,"displayName":"totalAmount","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Ps5p6Z4uXwBhvwEktv9ZNAdpLvA7Si80VjTtXRE77uo/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1Ps5p6Z4uXwBhvwEktv9ZNAdpLvA7Si80VjTtXRE77uo","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Ps5p6Z4uXwBhvwEktv9ZNAdpLvA7Si80VjTtXRE77uo/edit?usp=drivesdk","cachedResultName":"Order details"},"authentication":"serviceAccount"},"typeVersion":4.7},{"id":"62b212a7-9298-4135-9ec1-caf2a9fe1685","name":"Send order confirmation","type":"n8n-nodes-base.whatsApp","position":[7920,144],"webhookId":"b4e0733c-f4f8-47bd-8976-078f8c15216e","parameters":{"textBody":"={{ $('Order orchestration AI agent').item.json.output }}","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('Parse button and user data').item.json.waId }}"},"typeVersion":1},{"id":"f10c9a50-4a13-4697-91c7-fe2e71f94671","name":"AI shopping agent (BytezBot)","type":"@n8n/n8n-nodes-langchain.agent","position":[7392,2176],"parameters":{"text":"={{ $('Validate incoming message').item.json.messages[0].text.body }}","options":{"systemMessage":"=You are BytezBot, the official AI assistant for Bytez, India's premium T-shirt store.\n\nYour only job is to help users find and buy T-shirts with high accuracy.\n\nOutput format:\n- For product_search or recommendation → pure JSON: {\"intent\":\"product_search\",\"details\":\"...\",\"confidence\":0.95,\"language\":\"english\"}\n- For everything else → plain conversational text\n\nIntents:\n1. product_search — user wants to browse or find T-shirts\n2. recommend — user wants T-shirt advice\n\nAll other queries → plain text responses (greetings, size guide, delivery, redirects, etc.)"},"promptType":"define"},"typeVersion":2},{"id":"c0a06cba-4eb1-4d0d-9972-c48467fa6fc4","name":"MongoDB Atlas vector search","type":"@n8n/n8n-nodes-langchain.vectorStoreMongoDBAtlas","position":[9552,1984],"parameters":{"mode":"load","topK":3,"prompt":"={{ $('Build Redis cache key from search query').item.json.intentData.details }}","options":{},"embedding":"text_embedding","mongoCollection":{"__rl":true,"mode":"list","value":"product","cachedResultName":"product"},"vectorIndexName":"ShopingBot"},"typeVersion":1.3},{"id":"5b799fdc-3a3f-4a55-a29b-7cfb1f6a40c6","name":"OpenAI embeddings","type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","position":[9616,2208],"parameters":{"options":{}},"typeVersion":1.2},{"id":"17c1b430-eb95-4059-b658-7d572dac8838","name":"Get product image from MongoDB","type":"n8n-nodes-base.mongoDb","position":[7968,720],"parameters":{"query":"={\n  \"_id\" : \"{{ $('Extract image ID, waId, and product ID').item.json.productId }}\"\n}","options":{},"collection":"product"},"typeVersion":1.2},{"id":"71738df2-3d3d-489c-95c0-417f4dec9cbf","name":"Resize product image to 1024px","type":"n8n-nodes-base.editImage","position":[8416,720],"parameters":{"width":1024,"height":1024,"options":{},"operation":"resize"},"typeVersion":1},{"id":"0c55a6ff-a1ca-4a97-b862-dd97acc9c974","name":"Extract product image as base64","type":"n8n-nodes-base.extractFromFile","position":[8640,720],"parameters":{"options":{},"operation":"binaryToPropery","destinationKey":"product_image"},"typeVersion":1},{"id":"9f838541-b2ab-4627-bec1-9c9054c887ba","name":"Resize user selfie to 1024px","type":"n8n-nodes-base.editImage","position":[8416,912],"parameters":{"width":1024,"height":1024,"options":{},"operation":"resize","dataPropertyName":"user_image"},"typeVersion":1},{"id":"755658dd-37eb-492a-a2a7-c76b5dd20bd4","name":"Extract user selfie as base64","type":"n8n-nodes-base.extractFromFile","position":[8640,912],"parameters":{"options":{},"operation":"binaryToPropery","destinationKey":"user_image","binaryPropertyName":"user_image"},"typeVersion":1},{"id":"19574e9a-3276-405e-9bc2-7ad1a75c10cd","name":"Generate VTO with Gemini API","type":"n8n-nodes-base.httpRequest","position":[9536,1008],"parameters":{"url":"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image-preview:generateContent","method":"POST","options":{"timeout":120000,"response":{"response":{"responseFormat":"json"}}},"jsonBody":"={{ $json.api_payload }}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"nodeCredentialType":"googlePalmApi"},"credentials":{"googlePalmApi":{"id":"YozcaJ0IJnxtXtq6","name":"Jignesh API Key"}},"retryOnFail":true,"typeVersion":4.2},{"id":"130fa21d-dd0e-4580-bad8-13a00956cfda","name":"Delete VTO context from Redis","type":"n8n-nodes-base.redis","position":[10432,1008],"parameters":{"key":"=vto_context_{{ $json.contacts[0].wa_id }}","operation":"delete"},"typeVersion":1},{"id":"3339b281-64a3-497b-9653-b84f73841e2d","name":"Get VTO context from Redis","type":"n8n-nodes-base.redis","position":[7296,1104],"parameters":{"key":"=vto_context_{{ $json.contacts[0].wa_id }}","options":{},"operation":"get"},"typeVersion":1},{"id":"8bbb9949-4661-4696-ade9-7cd702e8c0b4","name":"Get WhatsApp media URL","type":"n8n-nodes-base.httpRequest","position":[7968,1104],"parameters":{"url":"=https://graph.facebook.com/v19.0/{{ $('Extract image ID, waId, and product ID').item.json.imageId }}","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"whatsAppApi"},"typeVersion":4.2},{"id":"8003ff1b-ac5d-4f23-8b39-d7a54c32bfcf","name":"Download user selfie","type":"n8n-nodes-base.httpRequest","position":[8192,1104],"parameters":{"url":"={{ $json.url }}","options":{"response":{"response":{"responseFormat":"file","outputPropertyName":"user_image"}}},"authentication":"predefinedCredentialType","nodeCredentialType":"whatsAppApi"},"typeVersion":4.2},{"id":"0c89b60a-8bc7-4aed-b0c6-aed6ab7991cc","name":"Download product image from Drive","type":"n8n-nodes-base.googleDrive","position":[9904,2064],"parameters":{"fileId":{"__rl":true,"mode":"id","value":"={{ $json.document.metadata.product_image_url }}"},"options":{},"operation":"download","authentication":"serviceAccount"},"typeVersion":3},{"id":"5a8a8d84-4c55-44fb-af66-234d0d10be22","name":"Convert product image to base64","type":"n8n-nodes-base.extractFromFile","position":[10128,2064],"parameters":{"options":{},"operation":"binaryToPropery"},"typeVersion":1},{"id":"937723b2-490b-426a-bb1b-fc38873546c8","name":"Upload product image to WhatsApp","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[12144,1792],"parameters":{"url":"=https://graph.facebook.com/v19.0/{{ $json.key }}/media","method":"POST","options":{"timeout":15000},"sendBody":true,"contentType":"multipart-form-data","authentication":"predefinedCredentialType","bodyParameters":{"parameters":[{"name":"messaging_product","value":"whatsapp"},{"name":"file","parameterType":"formBinaryData","inputDataFieldName":"data"},{"name":"type","value":"image/jpeg"}]},"nodeCredentialType":"whatsAppApi"},"retryOnFail":true,"typeVersion":4.2},{"id":"c296c374-7c20-4346-9ec3-c12820a33ad0","name":"Send product message with buttons","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[12368,1872],"parameters":{"url":"=https://graph.facebook.com/v19.0/{{ $json.key}}/messages","method":"POST","options":{},"jsonBody":"={\n  \"messaging_product\": \"whatsapp\",\n  \"recipient_type\": \"individual\",\n  \"to\": \"{{ $('Convert product image base64 to binary').first().json.to_number }}\",\n  \"type\": \"interactive\",\n  \"interactive\": {\n    \"type\": \"button\",\n    \"header\": {\n      \"type\": \"image\",\n      \"image\": {\n        \"id\": \"{{ $json.id }}\"\n      }\n    },\n    \"body\": {\n      \"text\": {{ $('Convert product image base64 to binary').first().json.bodyTextEscaped }}\n    },\n    \"footer\": {\n      \"text\": \"Powered by Bytez | Reply for assistance\"\n    },\n    \"action\": {\n      \"buttons\": [\n        {\n          \"type\": \"reply\",\n          \"reply\": {\n            \"id\": \"ORDER_{{ $('Convert product image base64 to binary').first().json.productId }}\",\n            \"title\": \"🛒 Order Now\"\n          }\n        },\n        {\n          \"type\": \"reply\",\n          \"reply\": {\n            \"id\": \"VTO_{{ $('Convert product image base64 to binary').first().json.productId }}\",\n            \"title\": \"👗 Virtual Try-On\"\n          }\n        }\n      ]\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"whatsAppApi"},"retryOnFail":true,"typeVersion":4.2},{"id":"6a7462e4-7038-4b3f-bf0f-11bb81403d8c","name":"Loop through products","type":"n8n-nodes-base.splitInBatches","position":[11472,1872],"parameters":{"options":{"reset":false}},"typeVersion":3},{"id":"c044e979-26c4-43e2-b869-4260e384feec","name":"Download product image from Drive (VTO)","type":"n8n-nodes-base.googleDrive","position":[8192,720],"parameters":{"fileId":{"__rl":true,"mode":"id","value":"={{ $json.product_image_url }}"},"options":{},"operation":"download","authentication":"serviceAccount"},"typeVersion":3},{"id":"11937477-4aec-47c3-a613-e3f59d256722","name":"Ask user to send correct photo","type":"n8n-nodes-base.whatsApp","position":[7744,1200],"webhookId":"8aecac1f-5fe4-4c4d-a2bb-12d317a4662e","parameters":{"textBody":"Please send a clear, front-facing photo of yourself to use the virtual try-on feature.","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('Route interactive vs image message').item.json.contacts[0].wa_id }}"},"typeVersion":1},{"id":"d436178b-d025-428e-8e88-35d1e0dd3b91","name":"Prompt user to upload selfie","type":"n8n-nodes-base.whatsApp","position":[7360,-432],"webhookId":"1146d67d-3d47-4a1b-b8ea-b5111b5cb144","parameters":{"textBody":"✨ Virtual try-on activated!\n\nPlease upload a clear, front-facing photo of yourself to see how this T-shirt looks on you.","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('Parse button and user data').item.json.waId }}"},"typeVersion":1},{"id":"5e8c9f77-39c7-409a-ac8a-4f17abd77112","name":"Upload VTO result to WhatsApp","type":"n8n-nodes-base.httpRequest","position":[9984,1008],"parameters":{"url":"=https://graph.facebook.com/v19.0/{{ $json.key}}/media","method":"POST","options":{"timeout":15000},"sendBody":true,"contentType":"multipart-form-data","authentication":"predefinedCredentialType","bodyParameters":{"parameters":[{"name":"messaging_product","value":"whatsapp"},{"name":"file","parameterType":"formBinaryData","inputDataFieldName":"VTO"},{"name":"type","value":"image/jpeg"}]},"nodeCredentialType":"whatsAppApi"},"retryOnFail":true,"typeVersion":4.2},{"id":"cb15a9f3-766a-4cfd-87f7-e0f123b1eef8","name":"Send VTO result to user","type":"n8n-nodes-base.httpRequest","position":[10208,1008],"parameters":{"url":"=https://graph.facebook.com/v19.0/{{$json.key}}/messages","method":"POST","options":{},"jsonBody":"={\n  \"messaging_product\": \"whatsapp\",\n  \"recipient_type\": \"individual\",\n  \"to\": \"{{ $('Route interactive vs image message').item.json.contacts[0].wa_id }}\",\n  \"type\": \"image\",\n  \"image\": {\n    \"id\": \"{{ $json.id }}\",\n    \"caption\": \"✨ Your virtual try-on result!\"\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"whatsAppApi"},"retryOnFail":true,"typeVersion":4.2},{"id":"dd950826-591a-43f6-b56e-8d3fc1e33779","name":"Convert Gemini response to image file","type":"n8n-nodes-base.convertToFile","position":[9760,1008],"parameters":{"options":{},"operation":"toBinary","sourceProperty":"candidates[0].content.parts[0].inlineData.data","binaryPropertyName":"VTO"},"typeVersion":1.1},{"id":"d1c50b63-deee-47c0-ad1f-af1a413ac084","name":"Analyze user selfie with Gemini","type":"@n8n/n8n-nodes-langchain.googleGemini","position":[8416,1104],"parameters":{"text":"You are an image analysis assistant.\n\nTask:\nAnalyze the image and determine whether EXACTLY ONE real human person is visible.\n\nRules:\n- Count only real human beings.\n- Do NOT count mannequins, statues, drawings, posters, images on screens, or reflections.\n- If there is exactly 1 person → respond \"YES\"\n- If there are 0 people → respond \"NO\"\n- If there are 2 or more people → respond \"NO\"\n\nOutput format:\nRespond with ONLY one word: YES or NO\nDo not include any extra text, explanation, punctuation, or formatting.\n","modelId":{"__rl":true,"mode":"list","value":"models/gemini-2.5-flash","cachedResultName":"models/gemini-2.5-flash"},"options":{},"resource":"image","inputType":"binary","operation":"analyze","binaryPropertyName":"user_image"},"credentials":{"googlePalmApi":{"id":"YozcaJ0IJnxtXtq6","name":"Jignesh API Key"}},"typeVersion":1},{"id":"6dcebd94-f7a0-4455-8c2a-0470cbbac32a","name":"Send text response to user","type":"n8n-nodes-base.whatsApp","position":[8656,2192],"webhookId":"8c6b0783-47cd-4fc8-ad73-5992b7461721","parameters":{"textBody":"={{ $json.responseText }}","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('WhatsApp message trigger').item.json.contacts[0].wa_id }}"},"typeVersion":1},{"id":"b8e70696-1f3e-49f2-82d1-6e0da5467d0b","name":"Ask user to resend valid photo","type":"n8n-nodes-base.whatsApp","position":[9312,1200],"webhookId":"300b7657-1def-4e79-9f98-8e16ac13b981","parameters":{"textBody":"⚠️ We couldn't detect exactly one person in your photo.\n\nPlease make sure:\n• Only one person is in the frame\n• You have a clear front-facing view\n• The lighting is good\n\nPlease try again.","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('Route interactive vs image message').item.json.contacts[0].wa_id }}"},"typeVersion":1},{"id":"50f03b72-dede-45a6-b110-d1c64f542dc6","name":"Notify user VTO is processing","type":"n8n-nodes-base.whatsApp","position":[9312,816],"webhookId":"processing-webhook","parameters":{"textBody":"⏳ Creating your virtual try-on... This may take a moment. Please wait.","operation":"send","phoneNumberId":"804155476125570","additionalFields":{},"recipientPhoneNumber":"={{ $('Route interactive vs image message').item.json.contacts[0].wa_id }}"},"typeVersion":1},{"id":"c449500b-2303-498a-9d9d-d6c7115a78b6","name":"Parse button and user data","type":"n8n-nodes-base.code","position":[6016,80],"parameters":{"jsCode":"const message = $input.first().json.entry?.[0]?.changes?.[0]?.value?.messages?.[0];\nconst contact = $input.first().json.entry?.[0]?.changes?.[0]?.value?.contacts?.[0];\n\nconst buttonId = $input.first().json.messages[0].interactive.button_reply.id;\nconst waId = $input.first().json.contacts[0].wa_id;\nconst userName = $input.first().json.contacts[0].profile.name;\n\nlet prefix = null;\nlet productId = null;\n\nif (buttonId?.startsWith(\"VTO_\")) {\n    prefix = \"VTO_\";\n    productId = buttonId.substring(4);\n} else if (buttonId?.startsWith(\"ORDER_\")) {\n    prefix = \"ORDER_\";\n    productId = buttonId.substring(6);\n}\n\n$input.first().json.prefix = prefix;\n$input.first().json.productId = productId;\n$input.first().json.waId = waId;\n$input.first().json.userName = userName;\n\nreturn $input.first();"},"typeVersion":2},{"id":"1de08af7-976a-482b-8ffc-bd121a557769","name":"📌 Group: Entry & Router1","type":"n8n-nodes-base.stickyNote","position":[5632,-48],"parameters":{"color":7,"width":956,"height":608,"content":"## 📥 Entry & Message Router\nReceives all incoming WhatsApp messages.\nRoutes traffic by type:\n- Button/image → interactive handler\n- Text → validation pipeline"},"typeVersion":1},{"id":"78e04d36-5352-4bc3-8419-5d82c93b7449","name":"WhatsApp message trigger","type":"n8n-nodes-base.whatsAppTrigger","position":[5296,1024],"webhookId":"6b645b70-61db-4d4d-af47-2f39295cf196","parameters":{"options":{},"updates":["messages"]},"typeVersion":1},{"id":"448fed6d-99a9-47fb-9073-fc14f23046f7","name":"Group: VTO Context Check","type":"n8n-nodes-base.stickyNote","position":[7072,880],"parameters":{"color":7,"width":848,"height":492,"content":"## 🔴 VTO Context Check\nGETs `vto_context_{waId}` from Redis. If a product ID is stored (user previously tapped Try-On), proceed to image processing. If not found, ask user to tap the Try-On button on a product first."},"typeVersion":1},{"id":"0ec56bf9-33a5-44ef-bcc7-2d8154f09c85","name":"Group: Image Preparation","type":"n8n-nodes-base.stickyNote","position":[7936,544],"parameters":{"color":7,"width":1056,"height":780,"content":"## 🖼️ Image Download & Preparation\nFetches product image from MongoDB → downloads from Google Drive → resizes to 1024×1024. In parallel, fetches the user selfie from WhatsApp media API → downloads → resizes to 1024×1024. Both images are converted to base64 for Gemini."},"typeVersion":1},{"id":"d42de00f-749e-4c6d-8971-c64b66c60937","name":"Group: Validate Generate Send","type":"n8n-nodes-base.stickyNote","position":[9024,688],"parameters":{"color":7,"width":1600,"height":716,"content":"## 🤖 Validate, Generate & Send\n\nGemini checks if exactly one real person is in the selfie. If valid, both images are sent to Gemini 2.5 Flash to generate the try-on result. Output is uploaded to WhatsApp and sent to the user. Redis VTO context is cleared after delivery. Invalid photos prompt a retry."},"typeVersion":1},{"id":"8a0ef9cf-6ebc-4d52-b25f-ac3f71364385","name":"Check if message is button or image","type":"n8n-nodes-base.if","position":[5584,1024],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"f9b79970-779c-4668-9502-02e7a04a46fb","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.messages[0].type }}","rightValue":"interactive"},{"id":"176886ef-31af-4331-8b1c-b77a8786f5e9","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.messages[0].type }}","rightValue":"image"}]}},"typeVersion":2.2},{"id":"8180e0b1-eb66-415f-a60c-20728897d6ed","name":"Route interactive vs image message","type":"n8n-nodes-base.switch","position":[5824,368],"parameters":{"rules":{"values":[{"outputKey":"Button click","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"e6a2eb2d-bd6d-4952-b88d-71286c9f6a7d","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.messages[0].type }}","rightValue":"interactive"}]},"renameOutput":true},{"outputKey":"Image received","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"180b7e41-002f-4889-80ac-a52145b377f0","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.messages[0].type }}","rightValue":"image"}]},"renameOutput":true}]},"options":{}},"typeVersion":3.2},{"id":"805b97d3-2874-43ff-b2d6-8a5a5b1b284e","name":"Route VTO vs order button tap","type":"n8n-nodes-base.switch","position":[6240,80],"parameters":{"rules":{"values":[{"outputKey":"VTO","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"87d43119-f8cf-4c44-a045-13fb5a8c586d","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.prefix }}","rightValue":"VTO_"}]},"renameOutput":true},{"outputKey":"Order","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"8522fa38-d834-476b-83c8-0f22957831c3","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.prefix }}","rightValue":"ORDER_"}]},"renameOutput":true}]},"options":{}},"typeVersion":3.2},{"id":"13be1098-b721-40ba-8518-76250f54f965","name":"Route JSON intent vs plain text reply","type":"n8n-nodes-base.if","position":[8432,2176],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"89f70c2d-204c-432a-9368-cf12cd5bb720","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.responseType }}","rightValue":"json"}]}},"typeVersion":2.2},{"id":"eabef4a8-9a42-45a3-b4bd-e30b0311d358","name":"Route product search vs recommend","type":"n8n-nodes-base.switch","position":[8656,1936],"parameters":{"rules":{"values":[{"outputKey":"product_search","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"8b9ecbc4-30cb-4cf8-9e03-f21f6583f76a","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.intentData.intent }}","rightValue":"product_search"}]},"renameOutput":true},{"outputKey":"recommend","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"5ba5dc9c-1a53-42e1-af9e-860993f8b1c1","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.intentData.intent }}","rightValue":"recommend"}]},"renameOutput":true}]},"options":{}},"typeVersion":3.2},{"id":"c1bba81c-3a96-4a10-827b-bf9e27a2c7c2","name":"Is product cached in Redis?","type":"n8n-nodes-base.if","position":[9328,1872],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"6b6fdef2-9976-4eb7-bb53-a74dd2afae94","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json.cachedProductsJson }}","rightValue":""}]}},"typeVersion":2.2},{"id":"87239b9b-7596-4016-aab6-3d1d30007d63","name":"Pass valid messages, block invalid","type":"n8n-nodes-base.if","position":[6208,2304],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"26de16a8-ff08-4c93-a5e4-a3be678a6209","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.validation.isValid }}","rightValue":""}]}},"typeVersion":2.2},{"id":"32da4b15-461c-481e-9f0e-566c7e9d20b3","name":"Is VTO product ID stored in Redis?","type":"n8n-nodes-base.if","position":[7520,1104],"parameters":{"conditions":{"string":[{"value1":"={{ $json.propertyName }}","operation":"isNotEmpty"}]}},"typeVersion":1},{"id":"d4fc7939-1fa9-4a2e-a991-c1a61b0f1e5d","name":"Gemini: confirm exactly one person","type":"n8n-nodes-base.if","position":[8640,1104],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"c783a5a2-a8a7-4016-b0fd-ad9121e6c2c1","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.content.parts[0].text }}","rightValue":"YES"}]}},"typeVersion":2.2},{"id":"10b63728-4769-415c-b1de-c53c892f9cad","name":"Validate merged selfie before try-on","type":"n8n-nodes-base.if","position":[9088,912],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f650a7b6-0602-405d-9bf3-9c11329d2375","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.content.parts[0].text }}","rightValue":"YES"}]}},"typeVersion":2.2},{"id":"e8b3f8b9-44f3-4de6-a299-b960d51a9d29","name":"Parse cached product JSON array","type":"n8n-nodes-base.code","position":[11248,1744],"parameters":{"jsCode":"const productsJson = $input.first().json.cachedProductsJson;\nconst products = JSON.parse(productsJson);\nconsole.log(`✅ Cache HIT - Found ${products.length} products.`);\nreturn products.map(p => ({ json: p }));"},"typeVersion":2},{"id":"bfce07d0-b484-43ff-a031-4cee473a67e8","name":"Unpack products from cache result","type":"n8n-nodes-base.code","position":[11248,1984],"parameters":{"jsCode":"const products = $input.first().json.products;\n\nreturn products.map(p => ({ json: p }));"},"typeVersion":2},{"id":"5fd38a9a-15df-4d86-91cd-2f351891c938","name":"Build Redis cache key from search query","type":"n8n-nodes-base.code","position":[8880,1872],"parameters":{"jsCode":"const item = $input.first().json;\nconst userMessage = item.intentData.details;\n\n// Generate a cache key based on the specific search details\nconst cacheKey = `cache:product:${userMessage.toLowerCase().replace(/[^a-z0-9]/g, '_').substring(0, 100)}`;\n\nitem.cacheKey = cacheKey;\nreturn item;\n"},"typeVersion":2},{"id":"24ee484d-e390-4d40-a1b7-9754042e99dc","name":"Extract image ID, waId, and product ID","type":"n8n-nodes-base.code","position":[7744,1008],"parameters":{"jsCode":"const context = $('Get VTO context from Redis').first().json.propertyName;\n\nreturn {\n  json: {\n    imageId: $('Route interactive vs image message').first().json.messages[0].image.id,\n    waId: $('Route interactive vs image message').first().json.contacts[0].wa_id,\n    productId: context\n  }\n}"},"typeVersion":2},{"id":"e4d2709c-95b3-493c-9fd0-32fc5bc7374d","name":"Combine products with base64 images","type":"n8n-nodes-base.code","position":[10800,1984],"parameters":{"jsCode":"const items = $input.all();\n\nconst productItems = items.filter(item => item.json.document && item.json.document.metadata);\nconst imageData = items.find(item => item.json.data && Array.isArray(item.json.data));\n\nconst products = productItems.map(item => item.json.document.metadata);\n\nif (products.length === 0) {\n  return [];\n}\n\nconst base64Images = imageData && imageData.json.data ? imageData.json.data : [];\n\nconst productsWithImages = products.map((product, index) => {\n  return {\n    ...product,\n    imageBase64: base64Images[index] || null\n  };\n});\n\nconst cacheKey = $('Build Redis cache key from search query').first().json.cacheKey;\n\nreturn {\n  json: {\n    products: productsWithImages,\n    productsJson: JSON.stringify(productsWithImages),\n    cacheKey: cacheKey,\n    totalProducts: productsWithImages.length,\n    imagesAttached: base64Images.length\n  }\n};"},"typeVersion":2},{"id":"257e7891-8b5f-4718-855f-4e23794031e2","name":"Load session and append user message","type":"n8n-nodes-base.code","position":[6928,2224],"parameters":{"jsCode":"// Get the item from the previous node\nconst item = $input.first().json;\n\n// --- 1. Extract Data ---\nconst { senderId, messageText, sessionValue, userName } = item;\n\n/**\n * Creates a new session object with default values.\n */\nconst createNewSession = (userId, uName) => {\n  const currentTime = new Date().toISOString();\n  return {\n    userId: userId,\n    userName: uName,\n    messageHistory: [],\n    createdAt: currentTime,\n    lastActivity: currentTime,\n    messageCount: 0\n  };\n};\n\n// --- 2. Load or Create Session ---\nlet session;\nlet isNewSession = false;\n\nif (sessionValue) {\n  try {\n    session = JSON.parse(sessionValue);\n  } catch (e) {\n    session = createNewSession(senderId, userName);\n    isNewSession = true;\n  }\n} else {\n  session = createNewSession(senderId, userName);\n  isNewSession = true;\n}\n\n// --- 3. Update Session State ---\nsession.lastActivity = new Date().toISOString();\nsession.userName = userName;\nsession.messageCount = (session.messageCount || 0) + 1;\n\n// Add user's message to history\nsession.messageHistory.push({\n  role: 'user',\n  content: messageText,\n  timestamp: session.lastActivity\n});\n\n// Keep only the last 20 messages.\nif (session.messageHistory.length > 20) {\n  session.messageHistory = session.messageHistory.slice(-20);\n}\n\n// --- 4. Prepare Output ---\nitem.session = session;\nitem.isNewSession = isNewSession;\n\nreturn item;"},"typeVersion":2},{"id":"08d0b3f8-c5c9-4274-8ee5-c0c810e65a6b","name":"Append AI reply to session history","type":"n8n-nodes-base.code","position":[7984,2176],"parameters":{"jsCode":"// This node adds the AI's final response to the session history.\nconst item = $input.first().json;\n\nlet session = item.session;\n\nif (!session) {\n  const currentTime = new Date().toISOString();\n  session = {\n    userId: item.senderId || item.contacts?.[0]?.wa_id || 'unknown_user',\n    userName: item.userName || 'User',\n    messageHistory: [],\n    createdAt: currentTime,\n    lastActivity: currentTime,\n    messageCount: 0\n  };\n  item.session = session;\n}\n\nlet assistantMessage = '';\n\nif (item.responseType === 'json') {\n  const intent = item.intentData.intent;\n  const details = item.intentData.details;\n  assistantMessage = `Understood intent: '${intent}'. Details: '${details}'.`;\n  if (intent === 'product_search') {\n      assistantMessage = `Okay, searching for: ${details}. Let me find some great options for you! 🛍️`;\n  }\n} else {\n  assistantMessage = item.responseText;\n}\n\nsession.messageHistory.push({\n  role: 'assistant',\n  content: assistantMessage,\n  timestamp: new Date().toISOString()\n});\n\nif (session.messageHistory.length > 20) {\n  session.messageHistory = session.messageHistory.slice(-20);\n}\n\nlet userIdentifier = item.senderId;\n\nif (!userIdentifier) {\n  userIdentifier = item.contacts?.[0]?.wa_id;\n}\n\nif (!userIdentifier) {\n  userIdentifier = session.userId;\n}\n\nitem.redisKey = userIdentifier || `error_unknown_sender_${new Date().getTime()}`;\nitem.updatedSessionString = JSON.stringify(session);\n\nreturn item;"},"typeVersion":2},{"id":"ce62ffc8-679b-4eca-a604-9640b2f2889f","name":"Detect JSON intent or plain text reply","type":"n8n-nodes-base.code","position":[7760,2176],"parameters":{"jsCode":"// This node checks the AI's response, parses it if it's JSON, and sets a response type.\nconst item = $input.first().json;\nconst aiOutput = item.output;\n\n// Default to a text response\nitem.responseType = 'text';\nitem.responseText = aiOutput;\n\nif (typeof aiOutput === 'string' && aiOutput.trim().startsWith('{')) {\n  try {\n    const parsedJson = JSON.parse(aiOutput);\n    if (typeof parsedJson === 'object' && parsedJson !== null && parsedJson.intent) {\n      item.responseType = 'json';\n      item.intentData = parsedJson;\n      delete item.responseText;\n    } else {\n        item.responseText = \"I received a response, but it was not in the expected format. Please try again.\";\n    }\n  } catch (e) {\n    console.log('Could not parse AI output as JSON. Treating as text.');\n  }\n} else if (typeof aiOutput !== 'string') {\n    item.responseText = String(aiOutput);\n}\n\nreturn item;\n"},"typeVersion":2},{"id":"e0470c00-81e8-4578-8d74-926907833d45","name":"Build product card message body","type":"n8n-nodes-base.code","position":[11696,1792],"parameters":{"jsCode":"const product = $input.first().json;\nconst to_number = $('WhatsApp message trigger').first().json.contacts[0].wa_id;\n\nlet senderId;\ntry {\n  senderId = $('Load session and append user message').first().json.senderId;\n} catch (error) {\n  senderId = product.senderId || product.recipient_phone || to_number || '919638137734';\n}\n\nconst productName = product.title || product.name || product.product_name || 'Product';\nconst price = product.price || product.product_price || '0';\nconst seller = product.seller_name || product.seller || 'In-House';\nconst availability = product.availability || product.stock_status || 'In Stock';\nconst productId = product._id || product.product_id || product.id || Date.now();\n\nconst formattedPrice = $input.first().json.discounted_price;\n\nlet bodyText = `🛍️ *${productName}*\\n\\n💰 *Price:* ₹${formattedPrice}\\n🧑‍💼 *Seller:* ${seller}\\n📦 *Availability:* ${availability}`;\n\nconst escapedBodyText = JSON.stringify(bodyText);\n\nlet imageBase64 = product.imageBase64 || product.image_base64 || product.base64Image || null;\n\nif (imageBase64 && imageBase64.includes('base64,')) {\n  imageBase64 = imageBase64.split('base64,')[1];\n}\n\nconst returnData = {\n  recipientPhone: senderId,\n  to_number: to_number,\n  bodyText: bodyText,\n  bodyTextEscaped: escapedBodyText,\n  productId: productId,\n  productName: productName,\n  price: formattedPrice,\n  seller: seller,\n  availability: availability,\n  hasImage: !!imageBase64,\n  originalProduct: product\n};\n\nif (imageBase64) {\n  returnData.imageBase64 = imageBase64;\n  returnData.imageType = 'image/jpeg';\n  returnData.imageName = `${productName.replace(/[^a-zA-Z0-9]/g, '_')}.jpg`;\n} else {\n  returnData.imageBase64 = null;\n  returnData.note = 'No image available for this product';\n}\n\nreturn {json: returnData};"},"typeVersion":2},{"id":"19a1c507-9071-4706-8e0c-262ba992797e","name":"Convert product image base64 to binary","type":"n8n-nodes-base.code","position":[11920,1792],"parameters":{"jsCode":"const inputData = $input.first().json;\nconst imageBase64 = inputData.imageBase64;\n\nif (!imageBase64) {\n  return {\n    json: {\n      ...inputData,\n      skipImageUpload: true\n    }\n  };\n}\n\nlet cleanBase64 = imageBase64;\nif (imageBase64.includes('base64,')) {\n  cleanBase64 = imageBase64.split('base64,')[1];\n}\n\nreturn {\n  json: inputData,\n  binary: {\n    data: {\n      data: cleanBase64,\n      mimeType: 'image/jpeg',\n      fileName: inputData.imageName || 'product.jpg'\n    }\n  }\n};"},"typeVersion":2},{"id":"2603eb03-479f-4b89-8476-463d04461c7c","name":"Merge product, selfie, and validation result","type":"n8n-nodes-base.merge","position":[8864,896],"parameters":{"mode":"combine","options":{},"combineBy":"combineByPosition","numberInputs":3},"typeVersion":3},{"id":"6011710c-a123-4309-8c04-5e81cc6f9557","name":"Combine vector search results with images","type":"n8n-nodes-base.merge","position":[10576,1984],"parameters":{"mode":"combine","options":{},"combineBy":"combineAll"},"typeVersion":3.2},{"id":"b62fd56d-b942-414d-937a-4545d062a128","name":"Aggregate all product base64 images","type":"n8n-nodes-base.aggregate","position":[10352,2064],"parameters":{"options":{},"fieldsToAggregate":{"fieldToAggregate":[{"fieldToAggregate":"data"}]}},"typeVersion":1},{"id":"a4901b1e-a1b8-419d-9d2d-b0cbb4870799","name":"Build Gemini image generation API payload","type":"n8n-nodes-base.code","position":[9312,1008],"parameters":{"jsCode":"const items = $input.all();\n\nlet productImageBase64, userImageBase64, productImageUrl, userImageUrl;\n\nif (items.length > 0) {\n  const item = items[0].json;\n  productImageBase64 = item.product_image_base64 || item.product_image || item.productImage;\n  userImageBase64 = item.user_image_base64 || item.user_image || item.modelImage || item.userImage;\n  productImageUrl = item.product_image_url || item.productImageUrl;\n  userImageUrl = item.user_image_url || item.userImageUrl || item.modelImageUrl;\n}\n\nif (!productImageBase64 && !productImageUrl) {\n  throw new Error('❌ Missing product/garment image data');\n}\nif (!userImageBase64 && !userImageUrl) {\n  throw new Error('❌ Missing model/person image data');\n}\n\nconst cleanProductImage = productImageBase64\n  ? String(productImageBase64).replace(/^data:image\\/[^;]+;base64,/, '').trim()\n  : null;\n\nconst cleanUserImage = userImageBase64\n  ? String(userImageBase64).replace(/^data:image\\/[^;]+;base64,/, '').trim()\n  : null;\n\nconst detectMimeType = (base64String) => {\n  if (!base64String) return 'image/jpeg';\n  const match = String(base64String).match(/^data:image\\/([^;]+);base64,/);\n  if (match) return `image/${match[1]}`;\n  const signatures = {'/9j/': 'image/jpeg','iVBORw0KGgo': 'image/png','R0lGOD': 'image/gif','UklGR': 'image/webp'};\n  for (const [sig, mime] of Object.entries(signatures)) {\n    if (base64String.startsWith(sig)) return mime;\n  }\n  return 'image/jpeg';\n};\n\nconst productMimeType = detectMimeType(productImageBase64);\nconst userMimeType = detectMimeType(userImageBase64);\n\nconst ultraAggressivePrompt = `Professional virtual try-on: Apply the garment from IMAGE 1 onto the person in IMAGE 2. Replace the existing upper body clothing with the new garment naturally and realistically. Keep the face, pose, background, and lower body unchanged.`;\n\nconst imageParts = [];\n\nif (cleanProductImage) {\n  imageParts.push({inlineData: {mimeType: productMimeType, data: cleanProductImage}});\n} else if (productImageUrl) {\n  imageParts.push({fileData: {mimeType: \"image/jpeg\", fileUri: productImageUrl}});\n}\n\nif (cleanUserImage) {\n  imageParts.push({inlineData: {mimeType: userMimeType, data: cleanUserImage}});\n} else if (userImageUrl) {\n  imageParts.push({fileData: {mimeType: \"image/jpeg\", fileUri: userImageUrl}});\n}\n\nconst apiPayload = {\n  contents: [{role: \"user\", parts: [{text: ultraAggressivePrompt}, ...imageParts]}],\n  generationConfig: {temperature: 0.2, topP: 0.9, topK: 30, maxOutputTokens: 8192, candidateCount: 1},\n  safetySettings: [\n    {category: \"HARM_CATEGORY_HARASSMENT\", threshold: \"BLOCK_ONLY_HIGH\"},\n    {category: \"HARM_CATEGORY_HATE_SPEECH\", threshold: \"BLOCK_ONLY_HIGH\"},\n    {category: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", threshold: \"BLOCK_MEDIUM_AND_ABOVE\"},\n    {category: \"HARM_CATEGORY_DANGEROUS_CONTENT\", threshold: \"BLOCK_ONLY_HIGH\"}\n  ]\n};\n\nreturn [{json: {product_image_clean: cleanProductImage, user_image_clean: cleanUserImage, product_mime_type: productMimeType, user_mime_type: userMimeType, api_payload: apiPayload, timestamp: new Date().toISOString()}}];"},"typeVersion":2},{"id":"c3988767-bb62-4381-8d53-658266957f9f","name":"Session memory for shopping agent","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[7552,2528],"parameters":{"sessionKey":"={{ $('WhatsApp message trigger').item.json.contacts[0].wa_id }}","sessionIdType":"customKey","contextWindowLength":50},"typeVersion":1.3},{"id":"699e8b08-66b0-4c2c-94b6-4b4f641ccc33","name":"Session memory for order agent","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[7248,272],"parameters":{"sessionKey":"={{ $json.waId }}","sessionIdType":"customKey","contextWindowLength":50},"typeVersion":1.3}],"pinData":{},"connections":{"Check Redis cache":{"main":[[{"node":"Is product cached in Redis?","type":"main","index":0}]]},"OpenAI embeddings":{"ai_embedding":[[{"node":"MongoDB Atlas vector search","type":"ai_embedding","index":0}]]},"Download user selfie":{"main":[[{"node":"Analyze user selfie with Gemini","type":"main","index":0},{"node":"Resize user selfie to 1024px","type":"main","index":0}]]},"GPT-4o (order agent)":{"ai_languageModel":[[{"node":"Order orchestration AI agent","type":"ai_languageModel","index":0}]]},"Loop through products":{"main":[[],[{"node":"Build product card message body","type":"main","index":0}]]},"Save session to Redis":{"main":[[{"node":"Route JSON intent vs plain text reply","type":"main","index":0}]]},"Get WhatsApp media URL":{"main":[[{"node":"Download user selfie","type":"main","index":0}]]},"Create order in MongoDB":{"ai_tool":[[{"node":"Order orchestration AI agent","type":"ai_tool","index":0}]]},"Send VTO result to user":{"main":[[{"node":"Delete VTO context from Redis","type":"main","index":0}]]},"Store products in cache":{"main":[[{"node":"Unpack products from cache result","type":"main","index":0}]]},"Set VTO context in Redis":{"main":[[{"node":"Prompt user to upload selfie","type":"main","index":0}]]},"WhatsApp message trigger":{"main":[[{"node":"Check if message is button or image","type":"main","index":0}]]},"Validate incoming message":{"main":[[{"node":"Pass valid messages, block invalid","type":"main","index":0}]]},"Get VTO context from Redis":{"main":[[{"node":"Is VTO product ID stored in Redis?","type":"main","index":0}]]},"Log order to Google Sheets":{"ai_tool":[[{"node":"Order orchestration AI agent","type":"ai_tool","index":0}]]},"Parse button and user data":{"main":[[{"node":"Route VTO vs order button tap","type":"main","index":0}]]},"Get user session from Redis":{"main":[[{"node":"Load session and append user message","type":"main","index":0}]]},"Is product cached in Redis?":{"main":[[{"node":"Parse cached product JSON array","type":"main","index":0}],[{"node":"MongoDB Atlas vector search","type":"main","index":0}]]},"MongoDB Atlas vector search":{"main":[[{"node":"Download product image from Drive","type":"main","index":0},{"node":"Combine vector search results with images","type":"main","index":0}]]},"AI shopping agent (BytezBot)":{"main":[[{"node":"Detect JSON intent or plain text reply","type":"main","index":0}]]},"Generate VTO with Gemini API":{"main":[[{"node":"Convert Gemini response to image file","type":"main","index":0}]]},"Order orchestration AI agent":{"main":[[{"node":"Send order confirmation","type":"main","index":0}]]},"Resize user selfie to 1024px":{"main":[[{"node":"Extract user selfie as base64","type":"main","index":0}]]},"Extract user selfie as base64":{"main":[[{"node":"Merge product, selfie, and validation result","type":"main","index":0}]]},"Get product info from MongoDB":{"ai_tool":[[{"node":"Order orchestration AI agent","type":"ai_tool","index":0}]]},"Route VTO vs order button tap":{"main":[[{"node":"Set VTO context in Redis","type":"main","index":0}],[{"node":"Order orchestration AI agent","type":"main","index":0}]]},"Upload VTO result to WhatsApp":{"main":[[{"node":"Send VTO result to user","type":"main","index":0}]]},"GPT-5-nano (intent classifier)":{"ai_languageModel":[[{"node":"AI shopping agent (BytezBot)","type":"ai_languageModel","index":0}]]},"Get product image from MongoDB":{"main":[[{"node":"Download product image from Drive (VTO)","type":"main","index":0}]]},"Resize product image to 1024px":{"main":[[{"node":"Extract product image as base64","type":"main","index":0}]]},"Session memory for order agent":{"ai_memory":[[{"node":"Order orchestration AI agent","type":"ai_memory","index":0}]]},"Analyze user selfie with Gemini":{"main":[[{"node":"Gemini: confirm exactly one person","type":"main","index":0}]]},"Build product card message body":{"main":[[{"node":"Convert product image base64 to binary","type":"main","index":0}]]},"Convert product image to base64":{"main":[[{"node":"Aggregate all product base64 images","type":"main","index":0}]]},"Extract product image as base64":{"main":[[{"node":"Merge product, selfie, and validation result","type":"main","index":1}]]},"Parse cached product JSON array":{"main":[[{"node":"Loop through products","type":"main","index":0}]]},"Upload product image to WhatsApp":{"main":[[{"node":"Send product message with buttons","type":"main","index":0}]]},"Download product image from Drive":{"main":[[{"node":"Convert product image to base64","type":"main","index":0}]]},"Route product search vs recommend":{"main":[[{"node":"Build Redis cache key from search query","type":"main","index":0}],[{"node":"Build Redis cache key from search query","type":"main","index":0}]]},"Send product message with buttons":{"main":[[{"node":"Loop through products","type":"main","index":0}]]},"Session memory for shopping agent":{"ai_memory":[[{"node":"AI shopping agent (BytezBot)","type":"ai_memory","index":0}]]},"Unpack products from cache result":{"main":[[{"node":"Loop through products","type":"main","index":0}]]},"Append AI reply to session history":{"main":[[{"node":"Save session to Redis","type":"main","index":0}]]},"Gemini: confirm exactly one person":{"main":[[{"node":"Merge product, selfie, and validation result","type":"main","index":2}],[{"node":"Merge product, selfie, and validation result","type":"main","index":2}]]},"Is VTO product ID stored in Redis?":{"main":[[{"node":"Extract image ID, waId, and product ID","type":"main","index":0}],[{"node":"Ask user to send correct photo","type":"main","index":0}]]},"Pass valid messages, block invalid":{"main":[[{"node":"Get user session from Redis","type":"main","index":0}],[{"node":"Send validation error to user","type":"main","index":0}]]},"Route interactive vs image message":{"main":[[{"node":"Parse button and user data","type":"main","index":0}],[{"node":"Get VTO context from Redis","type":"main","index":0}]]},"Aggregate all product base64 images":{"main":[[{"node":"Combine vector search results with images","type":"main","index":1}]]},"Check if message is button or image":{"main":[[{"node":"Route interactive vs image message","type":"main","index":0}],[{"node":"Validate incoming message","type":"main","index":0}]]},"Combine products with base64 images":{"main":[[{"node":"Store products in cache","type":"main","index":0}]]},"Load session and append user message":{"main":[[{"node":"AI shopping agent (BytezBot)","type":"main","index":0}]]},"Validate merged selfie before try-on":{"main":[[{"node":"Build Gemini image generation API payload","type":"main","index":0},{"node":"Notify user VTO is processing","type":"main","index":0}],[{"node":"Ask user to resend valid photo","type":"main","index":0}]]},"Convert Gemini response to image file":{"main":[[{"node":"Upload VTO result to WhatsApp","type":"main","index":0}]]},"Route JSON intent vs plain text reply":{"main":[[{"node":"Route product search vs recommend","type":"main","index":0}],[{"node":"Send text response to user","type":"main","index":0}]]},"Convert product image base64 to binary":{"main":[[{"node":"Upload product image to WhatsApp","type":"main","index":0}]]},"Detect JSON intent or plain text reply":{"main":[[{"node":"Append AI reply to session history","type":"main","index":0}]]},"Extract image ID, waId, and product ID":{"main":[[{"node":"Get product image from MongoDB","type":"main","index":0},{"node":"Get WhatsApp media URL","type":"main","index":0}]]},"Build Redis cache key from search query":{"main":[[{"node":"Check Redis cache","type":"main","index":0}]]},"Download product image from Drive (VTO)":{"main":[[{"node":"Resize product image to 1024px","type":"main","index":0}]]},"Build Gemini image generation API payload":{"main":[[{"node":"Generate VTO with Gemini API","type":"main","index":0}]]},"Combine vector search results with images":{"main":[[{"node":"Combine products with base64 images","type":"main","index":0}]]},"Merge product, selfie, and validation result":{"main":[[{"node":"Validate merged selfie before try-on","type":"main","index":0}]]}}},"lastUpdatedBy":29,"workflowInfo":{"nodeCount":83,"nodeTypes":{"n8n-nodes-base.if":{"count":7},"n8n-nodes-base.code":{"count":13},"n8n-nodes-base.merge":{"count":2},"n8n-nodes-base.redis":{"count":7},"n8n-nodes-base.switch":{"count":3},"n8n-nodes-base.mongoDb":{"count":1},"n8n-nodes-base.whatsApp":{"count":7},"n8n-nodes-base.aggregate":{"count":1},"n8n-nodes-base.editImage":{"count":2},"n8n-nodes-base.stickyNote":{"count":13},"n8n-nodes-base.googleDrive":{"count":2},"n8n-nodes-base.httpRequest":{"count":7},"n8n-nodes-base.mongoDbTool":{"count":2},"n8n-nodes-base.convertToFile":{"count":1},"n8n-nodes-base.splitInBatches":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":2},"n8n-nodes-base.extractFromFile":{"count":3},"n8n-nodes-base.whatsAppTrigger":{"count":1},"n8n-nodes-base.googleSheetsTool":{"count":1},"@n8n/n8n-nodes-langchain.googleGemini":{"count":1},"@n8n/n8n-nodes-langchain.lmChatOpenAi":{"count":2},"@n8n/n8n-nodes-langchain.embeddingsOpenAi":{"count":1},"@n8n/n8n-nodes-langchain.memoryBufferWindow":{"count":2},"@n8n/n8n-nodes-langchain.vectorStoreMongoDBAtlas":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"BytezTech","username":"chintan","bio":"Technology partner for startups and growing businesses. We build scalable Mobile Apps (Flutter, Native), Web Platforms (Laravel, MERN, Next.js), and AI/ML solutions using Python. Focused on clean architecture, security-first development, and long-term product scalability. Let’s build systems that grow with your business.","verified":true,"links":["https://byteztech.com/"],"avatar":"https://gravatar.com/avatar/78d67bdade378e9982a64f629cf9268fb40bb058b3c3316e7334fffd80ea1b83?r=pg&d=retro&size=200"},"nodes":[{"id":9,"icon":"fa:image","name":"n8n-nodes-base.editImage","codex":{"data":{"details":"The Edit Image node allows you to manipulate and edit images. Use this node when you want to:\n\n- Blur an image\n- Add a border to an image\n- Create a new image\n- Crop an image\n- Composite an image on top of another\n- Draw on an image\n- Get information about the image\n- Rotate an image\n- Change the size of an image\n- Shear an image along the X or Y axis\n- Add text to the image","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.editimage/"}]},"categories":["Marketing","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Files","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Edit Image","color":"#553399"},"iconData":{"icon":"image","type":"icon"},"displayName":"Edit Image","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"},{"id":27,"name":"Marketing"}]},{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":33,"icon":"file:redis.svg","name":"n8n-nodes-base.redis","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.redis/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/redis/"}]},"categories":["Development","Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Redis"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiNBNDFFMTEiIGQ9Ik01Ny42NTYgNDMuOTljLTMuMjAxIDEuNjgzLTE5Ljc4NyA4LjU2MS0yMy4zMTggMTAuNDE3cy01LjQ5NCAxLjgzOC04LjI4My40OTRjLTIuNzktMS4zNDMtMjAuNDQ5LTguNTM1LTIzLjYyOS0xMC4wNjdDLjgzNCA0NC4wNjYuMDAyIDQzLjQyMi4wMDIgNDIuODExdi02LjExN3MyMi45OC01LjA0NSAyNi42OS02LjM4OCA0Ljk5NS0xLjM5IDguMTU0LS4yMjVjMy4xNiAxLjE2NSAyMi4wMzUgNC42MDMgMjUuMTU0IDUuNzU2djYuMDMyYzAgLjYwNS0uNzIgMS4yODMtMi4zNSAyLjEyNHoiLz48cGF0aCBmaWxsPSIjRDgyQzIwIiBkPSJNNTcuNjU2IDM3Ljg3MmMtMy4yMDEgMS42ODUtMTkuNzg3IDguNTYtMjMuMzE4IDEwLjQxN3MtNS40OTQgMS44MzgtOC4yODMuNDk0Yy0yLjc5LTEuMzQzLTIwLjQ0OS04LjUzNC0yMy42My0xMC4wNjhzLTMuMjQzLTIuNTg4LS4xMjItMy44MmwyNC4zODgtOS41MmMzLjcxLTEuMzQgNC45OTQtMS4zOSA4LjE1My0uMjI1czE5LjY0MyA3Ljc4IDIyLjc0NyA4Ljk1MWMzLjEwMyAxLjE3IDMuMjQgMi4wODYuMDM3IDMuNzg2eiIvPjxwYXRoIGZpbGw9IiNBNDFFMTEiIGQ9Ik01Ny42NTYgMzQuMDE1Yy0zLjIwMSAxLjY4My0xOS43ODcgOC41NjEtMjMuMzE4IDEwLjQxN3MtNS40OTQgMS44MzgtOC4yODMuNDk1Yy0yLjc5LTEuMzQ0LTIwLjQ0OS04LjUzNi0yMy42MjktMTAuMDY3Qy44MzQgMzQuMDkyLjAwMiAzMy40NDcuMDAyIDMyLjgzNlYyNi43MnMyMi45OC01LjA0NSAyNi42OS02LjM4N2MzLjcxMS0xLjM0MyA0Ljk5NS0xLjM5IDguMTU0LS4yMjUgMy4xNiAxLjE2NSAyMi4wMzUgNC42MDIgMjUuMTU0IDUuNzU2djYuMDMyYzAgLjYwNS0uNzIgMS4yODMtMi4zNSAyLjEyM3oiLz48cGF0aCBmaWxsPSIjRDgyQzIwIiBkPSJNNTcuNjU2IDI3Ljg5OGMtMy4yMDEgMS42ODUtMTkuNzg3IDguNTYxLTIzLjMxOCAxMC40MTdzLTUuNDk0IDEuODM4LTguMjgzLjQ5NWMtMi43OS0xLjM0NC0yMC40NDktOC41MzQtMjMuNjMtMTAuMDY3LTMuMTgtMS41MzQtMy4yNDMtMi41ODgtLjEyMi0zLjgybDI0LjM4OC05LjUyYzMuNzEtMS4zNDMgNC45OTQtMS4zOSA4LjE1My0uMjI1IDMuMTYgMS4xNjYgMTkuNjQ0IDcuNzg1IDIyLjc2NSA4LjkzNXMzLjI0IDIuMDg1LjAzOCAzLjc4NXoiLz48cGF0aCBmaWxsPSIjQTQxRTExIiBkPSJNNTcuNjU2IDIzLjY3MWMtMy4yMDEgMS42ODMtMTkuNzg3IDguNTYxLTIzLjMxOCAxMC40MTlzLTUuNDk0IDEuODM4LTguMjgzLjQ5NWMtMi43OS0xLjM0NC0yMC40NDktOC41MzUtMjMuNjI5LTEwLjA2OS0xLjU5Mi0uNzY1LTIuNDI0LTEuNDExLTIuNDI0LTIuMDJ2LTYuMTFzMjIuOTgtNS4wNDUgMjYuNjktNi4zODggNC45OTUtMS4zOSA4LjE1NC0uMjI1YzMuMTYgMS4xNjUgMjIuMDM1IDQuNTkxIDI1LjE1NCA1Ljc0NXY2LjAzMmMwIC42MDUtLjcyIDEuMjgzLTIuMzUgMi4xMjN6Ii8+PHBhdGggZmlsbD0iI0Q4MkMyMCIgZD0iTTU3LjY1NiAxNy41NTNjLTMuMjAxIDEuNjg1LTE5Ljc4NyA4LjU2MS0yMy4zMTggMTAuNDE3cy01LjQ5NCAxLjgzOC04LjI4My40OTVjLTIuNzktMS4zNDQtMjAuNDQ5LTguNTM0LTIzLjYzLTEwLjA2OHMtMy4yNDMtMi41ODctLjEyMi0zLjgybDI0LjM4OC05LjUyYzMuNzEtMS4zNDMgNC45OTQtMS4zOSA4LjE1My0uMjI2IDMuMTYgMS4xNjUgMTkuNjQzIDcuNzg1IDIyLjc2NSA4LjkzNnMzLjI0IDIuMDg1LjAzOCAzLjc4NXoiLz48cGF0aCBmaWxsPSIjRkZGIiBkPSJtMzEuNDk3IDE1LjAzMi0xLjg4LTMuMTUzLTYuMDAyLS41NDUgNC40OC0xLjYzTDI2Ljc1IDcuMmw0LjE5MiAxLjY1MyAzLjk1NS0xLjMwNS0xLjA3IDIuNTg2IDQuMDMyIDEuNTI0LTUuMTk4LjU0NnptLTEwLjAxNCA2LjI3NSAxMy45MDMtMi4xNTMtNC4yIDYuMjExem0tMTEuMTctNS4xNjdjMC0xLjYxIDMuMzE0LTIuOTA2IDcuNDMxLTIuOTA2IDQuMTE4IDAgNy40MzIgMS4yOTYgNy40MzIgMi45MDZzLTMuMzE0IDIuOTA1LTcuNDMyIDIuOTA1Yy00LjExNyAwLTcuNDMxLTEuMjk1LTcuNDMxLTIuOTA1Ii8+PHBhdGggZmlsbD0iIzdBMEMwMCIgZD0ibTUyLjIzMyAxNS43MTQtOC4yMjQgMy4yNzYtLjAwNy02LjU1NnoiLz48cGF0aCBmaWxsPSIjQUQyMTE1IiBkPSJtNDQuMDEgMTguOTkxLS44OS4zNTMtOC4yMTctMy4yNzYgOS4wOTQtMy42M3oiLz48L2c+PC9zdmc+"},"displayName":"Redis","typeVersion":1,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":5,"name":"Development"}]},{"id":39,"icon":"fa:sync","name":"n8n-nodes-base.splitInBatches","codex":{"data":{"alias":["Loop","Concatenate","Batch","Split","Split In Batches"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Loop Over Items","color":"#007755"},"iconData":{"icon":"sync","type":"icon"},"displayName":"Loop Over Items (Split in Batches)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":59,"icon":"file:mongodb.svg","name":"n8n-nodes-base.mongoDb","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.mongodb/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/mongodb/"}]},"categories":["Development","Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"MongoDB"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgdmlld0JveD0iMCAwIDMyIDMyIj48cGF0aCBmaWxsPSIjNTk5NjM2IiBkPSJtMTUuOS4wODcuODU0IDEuNjA0Yy4xOTIuMjk2LjQuNTU4LjY0NS44MDJhMjIgMjIgMCAwIDEgMi4wMDQgMi4yNjZjMS40NDcgMS45IDIuNDIzIDQuMDEgMy4xMiA2LjI5Mi40MTggMS4zOTQuNjQ1IDIuODI0LjY2MiA0LjI3LjA3IDQuMzIzLTEuNDEyIDguMDM1LTQuNCAxMS4xMmExMyAxMyAwIDAgMS0xLjU3IDEuMzQyYy0uMjk2IDAtLjQzNi0uMjI3LS41NTgtLjQzNmEzLjYgMy42IDAgMCAxLS40MzYtMS4yNTVjLS4xMDUtLjUyMy0uMTc0LTEuMDQ2LS4xNC0xLjU4NnYtLjI0NEMxNi4wNTcgMjQuMjEgMTUuNzk2LjIxIDE1LjkuMDg3Ii8+PHBhdGggZmlsbD0iIzZjYWM0OCIgZD0iTTE1LjkuMDM0Yy0uMDM1LS4wNy0uMDctLjAxNy0uMTA1LjAxNy4wMTcuMzUtLjEwNS42NjItLjI5Ni45Ni0uMjEuMjk2LS40ODguNTIzLS43NjcuNzY3LTEuNTUgMS4zNDItMi43NyAyLjk2My0zLjc0NyA0Ljc3Ni0xLjMgMi40NC0xLjk3IDUuMDU1LTIuMTYgNy44MDgtLjA4Ny45OTMuMzE0IDQuNDk3LjYyNyA1LjUwOC44NTQgMi42ODQgMi4zODggNC45MzMgNC4zNzUgNi44ODUuNDg4LjQ3IDEuMDEuOTA2IDEuNTUgMS4zMjUuMTU3IDAgLjE3NC0uMTQuMjEtLjI0NGE1IDUgMCAwIDAgLjE1Ny0uNjhsLjM1LTIuNjE0eiIvPjxwYXRoIGZpbGw9IiNjMmJmYmYiIGQ9Ik0xNi43NTQgMjguODQ1Yy4wMzUtLjQuMjI3LS43MzIuNDM2LTEuMDYzLS4yMS0uMDg3LS4zNjYtLjI2LS40ODgtLjQ1M2EzLjIgMy4yIDAgMCAxLS4yNi0uNTc1Yy0uMjQ0LS43MzItLjI5Ni0xLjUtLjM2Ni0yLjI0OHYtLjQ1M2MtLjA4Ny4wNy0uMTA1LjY2Mi0uMTA1Ljc1YTE3IDE3IDAgMCAxLS4zMTQgMi4zNTNjLS4wNTIuMzE0LS4wODcuNjI3LS4yOC45MDYgMCAuMDM1IDAgLjA3LjAxNy4xMjIuMzE0LjkyNC40IDEuODY1LjQ1MyAyLjgyNHYuMzVjMCAuNDE4LS4wMTcuMzMuMzMuNDcuMTQuMDUyLjI5Ni4wNy40MzYuMTc0LjEwNSAwIC4xMjItLjA4Ny4xMjItLjE1N2wtLjA1Mi0uNTc1di0xLjYwNGMtLjAxNy0uMjguMDM1LS41NTguMDctLjgyeiIvPjwvc3ZnPg=="},"displayName":"MongoDB","typeVersion":1,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":5,"name":"Development"}]},{"id":112,"icon":"fa:map-signs","name":"n8n-nodes-base.switch","codex":{"data":{"alias":["Router","If","Path","Filter","Condition","Logic","Branch","Case"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"Switch","color":"#506000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"Switch","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":827,"icon":"file:whatsapp.svg","name":"n8n-nodes-base.whatsApp","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.whatsapp/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/whatsapp/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"WhatsApp Business Cloud"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTQuODY4IDQzLjMwMyAyLjY5NC05LjgzNWExOC45NCAxOC45NCAwIDAgMS0yLjUzNS05LjQ4OUM1LjAzMiAxMy41MTQgMTMuNTQ4IDUgMjQuMDE0IDVhMTguODcgMTguODcgMCAwIDEgMTMuNDMgNS41NjZBMTguODcgMTguODcgMCAwIDEgNDMgMjMuOTk0Yy0uMDA0IDEwLjQ2NS04LjUyMiAxOC45OC0xOC45ODYgMTguOThoLS4wMDhhMTkgMTkgMCAwIDEtOS4wNzMtMi4zMTF6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTQuODY4IDQzLjgwM2EuNS41IDAgMCAxLS40ODItLjYzMWwyLjYzOS05LjYzNmExOS41IDE5LjUgMCAwIDEtMi40OTctOS41NTZDNC41MzIgMTMuMjM4IDEzLjI3MyA0LjUgMjQuMDE0IDQuNWExOS4zNyAxOS4zNyAwIDAgMSAxMy43ODQgNS43MTNBMTkuMzYgMTkuMzYgMCAwIDEgNDMuNSAyMy45OTRjLS4wMDQgMTAuNzQxLTguNzQ2IDE5LjQ4LTE5LjQ4NiAxOS40OGExOS41NCAxOS41NCAwIDAgMS05LjE0NC0yLjI3N2wtOS44NzUgMi41ODlhLjUuNSAwIDAgMS0uMTI3LjAxNyIvPjxwYXRoIGZpbGw9IiNjZmQ4ZGMiIGQ9Ik0yNC4wMTQgNWExOC44NyAxOC44NyAwIDAgMSAxMy40MyA1LjU2NkExOC44NyAxOC44NyAwIDAgMSA0MyAyMy45OTRjLS4wMDQgMTAuNDY1LTguNTIyIDE4Ljk4LTE4Ljk4NiAxOC45OGgtLjAwOGExOSAxOSAwIDAgMS05LjA3My0yLjMxMWwtMTAuMDY1IDIuNjQgMi42OTQtOS44MzVhMTguOTQgMTguOTQgMCAwIDEtMi41MzUtOS40ODlDNS4wMzIgMTMuNTE0IDEzLjU0OCA1IDI0LjAxNCA1bTAtMUMxMi45OTggNCA0LjAzMiAxMi45NjIgNC4wMjcgMjMuOTc5YTIwIDIwIDAgMCAwIDIuNDYxIDkuNjIyTDMuOTAzIDQzLjA0YS45OTguOTk4IDAgMCAwIDEuMjE5IDEuMjMxbDkuNjg3LTIuNTRhMjAgMjAgMCAwIDAgOS4xOTcgMi4yNDRjMTEuMDI0IDAgMTkuOTktOC45NjMgMTkuOTk1LTE5Ljk4QTE5Ljg2IDE5Ljg2IDAgMCAwIDM4LjE1MyA5Ljg2IDE5Ljg3IDE5Ljg3IDAgMCAwIDI0LjAxNCA0Ii8+PHBhdGggZmlsbD0iIzQwYzM1MSIgZD0iTTM1LjE3NiAxMi44MzJhMTUuNjcgMTUuNjcgMCAwIDAtMTEuMTU3LTQuNjI2Yy04LjcwNCAwLTE1Ljc4MyA3LjA3Ni0xNS43ODcgMTUuNzc0YTE1Ljc0IDE1Ljc0IDAgMCAwIDIuNDEzIDguMzk2bC4zNzYuNTk3LTEuNTk1IDUuODIxIDUuOTczLTEuNTY2LjU3Ny4zNDJhMTUuNzUgMTUuNzUgMCAwIDAgOC4wMzIgMi4xOTloLjAwNmM4LjY5OCAwIDE1Ljc3Ny03LjA3NyAxNS43OC0xNS43NzZhMTUuNjggMTUuNjggMCAwIDAtNC42MTgtMTEuMTYxIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE5LjI2OCAxNi4wNDVjLS4zNTUtLjc5LS43MjktLjgwNi0xLjA2OC0uODItLjI3Ny0uMDEyLS41OTMtLjAxMS0uOTA5LS4wMTFzLS44My4xMTktMS4yNjUuNTk0LTEuNjYxIDEuNjIyLTEuNjYxIDMuOTU2IDEuNyA0LjU5IDEuOTM3IDQuOTA2IDMuMjgyIDUuMjU5IDguMTA0IDcuMTYxYzQuMDA3IDEuNTggNC44MjMgMS4yNjYgNS42OTMgMS4xODdzMi44MDctMS4xNDcgMy4yMDItMi4yNTUuMzk1LTIuMDU3LjI3Ny0yLjI1NWMtLjExOS0uMTk4LS40MzUtLjMxNi0uOTA5LS41NTRzLTIuODA3LTEuMzg1LTMuMjQyLTEuNTQzLS43NTEtLjIzNy0xLjA2OC4yMzhjLS4zMTYuNDc0LTEuMjI1IDEuNTQzLTEuNTAyIDEuODU5cy0uNTU0LjM1Ny0xLjAyOC4xMTktMi4wMDItLjczOC0zLjgxNS0yLjM1NGMtMS40MS0xLjI1Ny0yLjM2Mi0yLjgxLTIuNjM5LTMuMjg1LS4yNzctLjQ3NC0uMDMtLjczMS4yMDgtLjk2OC4yMTMtLjIxMy40NzQtLjU1NC43MTItLjgzMS4yMzctLjI3Ny4zMTYtLjQ3NS40NzQtLjc5MXMuMDc5LS41OTQtLjA0LS44MzFjLS4xMTctLjIzOC0xLjAzOS0yLjU4NC0xLjQ2MS0zLjUyMiIvPjwvc3ZnPg=="},"displayName":"WhatsApp Business Cloud","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1141,"icon":"file:openAiLight.svg","name":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.embeddingsopenai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Embeddings"]}}},"group":"[\"transform\"]","defaults":{"name":"Embeddings OpenAI"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg0IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NyAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MiA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSIjN0Q3RDg3Ii8+Cjwvc3ZnPgo="},"displayName":"Embeddings OpenAI","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1153,"icon":"file:openAiLight.svg","name":"@n8n/n8n-nodes-langchain.lmChatOpenAi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenAI Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg0IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NyAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MiA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSIjN0Q3RDg3Ii8+Cjwvc3ZnPgo="},"displayName":"OpenAI Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1163,"icon":"fa:database","name":"@n8n/n8n-nodes-langchain.memoryBufferWindow","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.memorybufferwindow/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Memory"],"Memory":["For beginners"]}}},"group":"[\"transform\"]","defaults":{"name":"Simple Memory"},"iconData":{"icon":"database","type":"icon"},"displayName":"Simple Memory","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1234,"icon":"file:convertToFile.svg","name":"n8n-nodes-base.convertToFile","codex":{"data":{"alias":["CSV","Spreadsheet","Excel","xls","xlsx","ods","tabular","encode","encoding","Move Binary Data","Binary","File","JSON","HTML","ICS","iCal","RTF","64","Base64"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.converttofile/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Files","Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Convert to File"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEzLjc2MTkgMkMxMy4yNDM3IDIgMTIuODIzNiAyLjQyMDA5IDEyLjgyMzYgMi45MzgzMVYxNS4yNTI2QzEzLjMxOTkgMTUuNDY0MyAxMy43ODUxIDE1Ljc3MiAxNC4xOTEgMTYuMTc1N0wyMS4yMjgzIDIzLjE3MzlDMjIuMDU0OCAyMy45OTU4IDIyLjUxOTUgMjUuMTEzMiAyMi41MTk1IDI2LjI3ODhDMjIuNTE5NSAyNy40NDQzIDIyLjA1NDggMjguNTYxOCAyMS4yMjgzIDI5LjM4MzdMMTQuMTkxIDM2LjM4MTlDMTMuNzg1IDM2Ljc4NTYgMTMuMzE5OSAzNy4wOTMyIDEyLjgyMzYgMzcuMzA1VjM3LjM1MjdDMTIuODIzNiAzNy44NzA5IDEzLjI0MzcgMzguMjkxIDEzLjc2MTkgMzguMjkxSDM5LjA2MTdDMzkuNTc5OSAzOC4yOTEgNDAgMzcuODcwOSA0MCAzNy4zNTI3TDQwIDE1Ljc5NEgyNy4xNDQzQzI2LjYyNjEgMTUuNzk0IDI2LjIwNiAxNS4zNzM5IDI2LjIwNiAxNC44NTU3VjJIMTMuNzYxOVoiIGZpbGw9IiMzQTQyRTkiLz4KPHBhdGggZD0iTTI4Ljg2NDUgMkMyOC43NzgxIDIgMjguNzA4MSAyLjA3MDAyIDI4LjcwODEgMi4xNTYzOVYxMi44MjI3QzI4LjcwODEgMTMuMDgxOCAyOC45MTgyIDEzLjI5MTkgMjkuMTc3MyAxMy4yOTE5SDM5Ljg0MzZDMzkuOTMgMTMuMjkxOSA0MCAxMy4yMjE5IDQwIDEzLjEzNTVMNDAgMTIuNjI2M0M0MCAxMi4zNzc4IDM5LjkwMTQgMTIuMTM5NSAzOS43MjYgMTEuOTYzNkwzMC4wNjEgMi4yNzU2MUMyOS44ODUgMi4wOTkxNiAyOS42NDYgMiAyOS4zOTY3IDJIMjguODY0NVoiIGZpbGw9IiMzQTQyRTkiLz4KPHBhdGggZD0iTTkuNzcyNjggMzQuNjAwM0M5LjA0MTg2IDMzLjg2NTQgOS4wNDUxNyAzMi42NzcyIDkuNzgwMDcgMzEuOTQ2NEwxMy42MzE1IDI4LjExNjNMMC45MzgzMTEgMjguMTE2M0MwLjQyMDA5NiAyOC4xMTYzIC0yLjI2NTE5ZS0wOCAyNy42OTYyIDAgMjcuMTc4TDguMjAyOTdlLTA4IDI1LjMwMTRDMS4wNDY4MmUtMDcgMjQuNzgzMiAwLjQyMDA5NSAyNC4zNjMxIDAuOTM4MzExIDI0LjM2MzFIMTMuNTUyOUw5Ljc4MDA3IDIwLjYxMTJDOS4wNDUxNyAxOS44ODA0IDkuMDQxODYgMTguNjkyMiA5Ljc3MjY4IDE3Ljk1NzNDMTAuNTAzNSAxNy4yMjI0IDExLjY5MTcgMTcuMjE5MSAxMi40MjY2IDE3Ljk0OTlMMTkuNDYzOSAyNC45NDgxQzE5LjgxODEgMjUuMzAwNCAyMC4wMTczIDI1Ljc3OTMgMjAuMDE3MyAyNi4yNzg4QzIwLjAxNzMgMjYuNzc4MyAxOS44MTgxIDI3LjI1NzIgMTkuNDYzOSAyNy42MDk1TDEyLjQyNjYgMzQuNjA3N0MxMS42OTE3IDM1LjMzODUgMTAuNTAzNSAzNS4zMzUyIDkuNzcyNjggMzQuNjAwM1oiIGZpbGw9IiMzQTQyRTkiLz4KPC9zdmc+Cg=="},"displayName":"Convert to File","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1235,"icon":"file:extractFromFile.svg","name":"n8n-nodes-base.extractFromFile","codex":{"data":{"alias":["CSV","Spreadsheet","Excel","xls","xlsx","ods","tabular","decode","decoding","Move Binary Data","Binary","File","PDF","JSON","HTML","ICS","iCal","txt","Text","RTF","XML","64","Base64","Convert"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.extractfromfile/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Files","Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Extract from File"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAuOTM3NSAyQzAuNDE5NzMzIDIgMCAyLjQxOTczIDAgMi45Mzc1VjM3LjMyMjFDMCAzNy44Mzk5IDAuNDE5NzMzIDM4LjI1OTYgMC45Mzc1IDM4LjI1OTZIMjYuMjE1NEMyNi43MzMyIDM4LjI1OTYgMjcuMTUyOSAzNy44Mzk5IDI3LjE1MjkgMzcuMzIyMUwyNy4xNTI5IDMwLjY3MTlMMTYuNzk2OSAzMC42NzE5QzE0Ljg5ODQgMzAuNjcxOSAxMy4zNTk0IDI5LjEzMjkgMTMuMzU5NCAyNy4yMzQ0VjI1LjM1OTRDMTMuMzU5NCAyMy40NjA5IDE0Ljg5ODQgMjEuOTIxOSAxNi43OTY5IDIxLjkyMTlIMjcuMTUyOUwyNy4xNTI5IDE1Ljc4MjFIMTQuMzA4M0MxMy43OTA2IDE1Ljc4MjEgMTMuMzcwOCAxNS4zNjI0IDEzLjM3MDggMTQuODQ0NlYySDAuOTM3NVoiIGZpbGw9IiMzNTNGNkUiLz4KPHBhdGggZD0iTTE2LjAyNzEgMkMxNS45NDA4IDIgMTUuODcwOCAyLjA2OTk2IDE1Ljg3MDggMi4xNTYyNVYxMi44MTM0QzE1Ljg3MDggMTMuMDcyMyAxNi4wODA3IDEzLjI4MjEgMTYuMzM5NiAxMy4yODIxSDI2Ljk5NjdDMjcuMDgzIDEzLjI4MjEgMjcuMTUyOSAxMy4yMTIyIDI3LjE1MjkgMTMuMTI1OUwyNy4xNTI5IDEyLjYxNzFDMjcuMTUyOSAxMi4zNjg4IDI3LjA1NDUgMTIuMTMwNyAyNi44NzkxIDExLjk1NUwxNy4yMjI1IDIuMjc1MzhDMTcuMDQ2NiAyLjA5OTA4IDE2LjgwNzkgMiAxNi41NTg4IDJIMTYuMDI3MVoiIGZpbGw9IiMzNTNGNkUiLz4KPHBhdGggZD0iTTI5Ljc2NDIgMzQuNjUwM0MyOS4wMzQgMzMuOTE2IDI5LjAzNzQgMzIuNzI4OCAyOS43NzE2IDMxLjk5ODZMMzMuNjE5NyAyOC4xNzE5TDE2Ljc5NjkgMjguMTcxOUMxNi4yNzkxIDI4LjE3MTkgMTUuODU5NCAyNy43NTIxIDE1Ljg1OTQgMjcuMjM0NFYyNS4zNTk0QzE1Ljg1OTQgMjQuODQxNiAxNi4yNzkxIDI0LjQyMTkgMTYuNzk2OSAyNC40MjE5TDMzLjU0MTIgMjQuNDIxOUwyOS43NzE2IDIwLjY3MzNDMjkuMDM3NCAxOS45NDMxIDI5LjAzNCAxOC43NTU5IDI5Ljc2NDIgMTguMDIxNkMzMC40OTQ0IDE3LjI4NzQgMzEuNjgxNiAxNy4yODQgMzIuNDE1OSAxOC4wMTQyTDM5LjQ0NzEgMjUuMDA2NEMzOS44MDEgMjUuMzU4MyA0MCAyNS44MzY4IDQwIDI2LjMzNTlDNDAgMjYuODM1IDM5LjgwMSAyNy4zMTM1IDM5LjQ0NzEgMjcuNjY1NUwzMi40MTU5IDM0LjY1NzZDMzEuNjgxNiAzNS4zODc4IDMwLjQ5NDQgMzUuMzg0NSAyOS43NjQyIDM0LjY1MDNaIiBmaWxsPSIjMzUzRjZFIi8+Cjwvc3ZnPgo="},"displayName":"Extract from File","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1236,"icon":"file:aggregate.svg","name":"n8n-nodes-base.aggregate","codex":{"data":{"alias":["Aggregate","Combine","Flatten","Transform","Array","List","Item"],"details":"","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.aggregate/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Aggregate"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJub25lIj48ZyBmaWxsPSIjRkY2RDVBIiBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDE0OGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDE0NmM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJINDRjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6bTAgOTZjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxNDZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYyNGMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDQ0Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyem0wIDk2YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTQ2YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkg0NGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik03NCA3NmMwIDYuNjI3IDUuMzczIDEyIDEyIDEyaDExNi4yMTdjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMydjU2YzAgMjYuOTc4IDEwLjI3MiA1MS41NTcgMjcuMTE5IDcwLjAzOSA1LjA1NSA1LjU0NSA1LjA1NSAxNC4zNzcgMCAxOS45MjItMTYuODQ3IDE4LjQ4Mi0yNy4xMTkgNDMuMDYxLTI3LjExOSA3MC4wMzl2NTZjMCAxNy42NzMtMTQuMzI3IDMyLTMyIDMySDg2Yy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjI0YzAgNi42MjcgNS4zNzMgMTIgMTIgMTJoMTE2LjIxN2M0NC4xODMgMCA4MC0zNS44MTcgODAtODB2LTU2YzAtMzAuOTI4IDI1LjA3Mi01NiA1Ni01NmE1Ljc4MyA1Ljc4MyAwIDAgMCA1Ljc4My01Ljc4M3YtMzYuNDM0YTUuNzgzIDUuNzgzIDAgMCAwLTUuNzgzLTUuNzgzYy0zMC45MjggMC01Ni0yNS4wNzItNTYtNTZ2LTU2YzAtNDQuMTgzLTM1LjgxNy04MC04MC04MEg4NmMtNi42MjcgMC0xMiA1LjM3My0xMiAxMnoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zNzYgMjQ0YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkgzODhjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPSJhIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="},"displayName":"Aggregate","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1260,"icon":"file:whatsapp.svg","name":"n8n-nodes-base.whatsAppTrigger","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.whatsapptrigger/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/whatsapp/"}]},"categories":["Communication"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"WhatsApp Trigger"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTQuODY4IDQzLjMwMyAyLjY5NC05LjgzNWExOC45NCAxOC45NCAwIDAgMS0yLjUzNS05LjQ4OUM1LjAzMiAxMy41MTQgMTMuNTQ4IDUgMjQuMDE0IDVhMTguODcgMTguODcgMCAwIDEgMTMuNDMgNS41NjZBMTguODcgMTguODcgMCAwIDEgNDMgMjMuOTk0Yy0uMDA0IDEwLjQ2NS04LjUyMiAxOC45OC0xOC45ODYgMTguOThoLS4wMDhhMTkgMTkgMCAwIDEtOS4wNzMtMi4zMTF6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTQuODY4IDQzLjgwM2EuNS41IDAgMCAxLS40ODItLjYzMWwyLjYzOS05LjYzNmExOS41IDE5LjUgMCAwIDEtMi40OTctOS41NTZDNC41MzIgMTMuMjM4IDEzLjI3MyA0LjUgMjQuMDE0IDQuNWExOS4zNyAxOS4zNyAwIDAgMSAxMy43ODQgNS43MTNBMTkuMzYgMTkuMzYgMCAwIDEgNDMuNSAyMy45OTRjLS4wMDQgMTAuNzQxLTguNzQ2IDE5LjQ4LTE5LjQ4NiAxOS40OGExOS41NCAxOS41NCAwIDAgMS05LjE0NC0yLjI3N2wtOS44NzUgMi41ODlhLjUuNSAwIDAgMS0uMTI3LjAxNyIvPjxwYXRoIGZpbGw9IiNjZmQ4ZGMiIGQ9Ik0yNC4wMTQgNWExOC44NyAxOC44NyAwIDAgMSAxMy40MyA1LjU2NkExOC44NyAxOC44NyAwIDAgMSA0MyAyMy45OTRjLS4wMDQgMTAuNDY1LTguNTIyIDE4Ljk4LTE4Ljk4NiAxOC45OGgtLjAwOGExOSAxOSAwIDAgMS05LjA3My0yLjMxMWwtMTAuMDY1IDIuNjQgMi42OTQtOS44MzVhMTguOTQgMTguOTQgMCAwIDEtMi41MzUtOS40ODlDNS4wMzIgMTMuNTE0IDEzLjU0OCA1IDI0LjAxNCA1bTAtMUMxMi45OTggNCA0LjAzMiAxMi45NjIgNC4wMjcgMjMuOTc5YTIwIDIwIDAgMCAwIDIuNDYxIDkuNjIyTDMuOTAzIDQzLjA0YS45OTguOTk4IDAgMCAwIDEuMjE5IDEuMjMxbDkuNjg3LTIuNTRhMjAgMjAgMCAwIDAgOS4xOTcgMi4yNDRjMTEuMDI0IDAgMTkuOTktOC45NjMgMTkuOTk1LTE5Ljk4QTE5Ljg2IDE5Ljg2IDAgMCAwIDM4LjE1MyA5Ljg2IDE5Ljg3IDE5Ljg3IDAgMCAwIDI0LjAxNCA0Ii8+PHBhdGggZmlsbD0iIzQwYzM1MSIgZD0iTTM1LjE3NiAxMi44MzJhMTUuNjcgMTUuNjcgMCAwIDAtMTEuMTU3LTQuNjI2Yy04LjcwNCAwLTE1Ljc4MyA3LjA3Ni0xNS43ODcgMTUuNzc0YTE1Ljc0IDE1Ljc0IDAgMCAwIDIuNDEzIDguMzk2bC4zNzYuNTk3LTEuNTk1IDUuODIxIDUuOTczLTEuNTY2LjU3Ny4zNDJhMTUuNzUgMTUuNzUgMCAwIDAgOC4wMzIgMi4xOTloLjAwNmM4LjY5OCAwIDE1Ljc3Ny03LjA3NyAxNS43OC0xNS43NzZhMTUuNjggMTUuNjggMCAwIDAtNC42MTgtMTEuMTYxIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE5LjI2OCAxNi4wNDVjLS4zNTUtLjc5LS43MjktLjgwNi0xLjA2OC0uODItLjI3Ny0uMDEyLS41OTMtLjAxMS0uOTA5LS4wMTFzLS44My4xMTktMS4yNjUuNTk0LTEuNjYxIDEuNjIyLTEuNjYxIDMuOTU2IDEuNyA0LjU5IDEuOTM3IDQuOTA2IDMuMjgyIDUuMjU5IDguMTA0IDcuMTYxYzQuMDA3IDEuNTggNC44MjMgMS4yNjYgNS42OTMgMS4xODdzMi44MDctMS4xNDcgMy4yMDItMi4yNTUuMzk1LTIuMDU3LjI3Ny0yLjI1NWMtLjExOS0uMTk4LS40MzUtLjMxNi0uOTA5LS41NTRzLTIuODA3LTEuMzg1LTMuMjQyLTEuNTQzLS43NTEtLjIzNy0xLjA2OC4yMzhjLS4zMTYuNDc0LTEuMjI1IDEuNTQzLTEuNTAyIDEuODU5cy0uNTU0LjM1Ny0xLjAyOC4xMTktMi4wMDItLjczOC0zLjgxNS0yLjM1NGMtMS40MS0xLjI1Ny0yLjM2Mi0yLjgxLTIuNjM5LTMuMjg1LS4yNzctLjQ3NC0uMDMtLjczMS4yMDgtLjk2OC4yMTMtLjIxMy40NzQtLjU1NC43MTItLjgzMS4yMzctLjI3Ny4zMTYtLjQ3NS40NzQtLjc5MXMuMDc5LS41OTQtLjA0LS44MzFjLS4xMTctLjIzOC0xLjAzOS0yLjU4NC0xLjQ2MS0zLjUyMiIvPjwvc3ZnPg=="},"displayName":"WhatsApp Trigger","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"}]},{"id":1290,"icon":"file:mongodb.svg","name":"@n8n/n8n-nodes-langchain.vectorStoreMongoDBAtlas","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.vectorstoremongodbatlas/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Vector Stores","Tools","Root Nodes"],"Tools":["Other Tools"],"Vector Stores":["Other Vector Stores"]}}},"group":"[\"transform\"]","defaults":{"name":"MongoDB Atlas Vector Store"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjI1OCIgdmlld0JveD0iMCAwIDEyMCAyNTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik04My4wMDg5IDI4Ljc1NTlDNzIuMTMyOCAxNS45MDg2IDYyLjc2NzMgMi44NjA1MyA2MC44NTM5IDAuMTUwNTU0QzYwLjY1MjUgLTAuMDUwMTg0OCA2MC4zNTAzIC0wLjA1MDE4NDggNjAuMTQ4OSAwLjE1MDU1NEM1OC4yMzU1IDIuODYwNTMgNDguODY5OSAxNS45MDg2IDM3Ljk5MzggMjguNzU1OUMtNTUuMzU5NCAxNDcuMjkyIDUyLjY5NjggMjI3LjI4NyA1Mi42OTY4IDIyNy4yODdMNTMuNjAzMSAyMjcuODg5QzU0LjQwODcgMjQwLjIzNSA1Ni40MjI4IDI1OCA1Ni40MjI4IDI1OEg2MC40NTFINjQuNDc5MkM2NC40NzkyIDI1OCA2Ni40OTM0IDI0MC4zMzUgNjcuMjk5IDIyNy44ODlMNjguMjA1MiAyMjcuMTg3QzY4LjMwNiAyMjcuMTg3IDE3Ni4zNjIgMTQ3LjI5MiA4My4wMDg5IDI4Ljc1NTlaTTYwLjQ1MSAyMjUuNDhDNjAuNDUxIDIyNS40OCA1NS42MTcyIDIyMS4zNjUgNTQuMzA4MSAyMTkuMjU3VjIxOS4wNTdMNjAuMTQ4OSA4OS45ODEzQzYwLjE0ODkgODkuNTc5OCA2MC43NTMyIDg5LjU3OTggNjAuNzUzMiA4OS45ODEzTDY2LjU5NCAyMTkuMDU3VjIxOS4yNTdDNjUuMjg0OCAyMjEuMzY1IDYwLjQ1MSAyMjUuNDggNjAuNDUxIDIyNS40OFoiIGZpbGw9IiMwMDY4NEEiLz4KPC9zdmc+Cg=="},"displayName":"MongoDB Atlas Vector Store","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1309,"icon":"file:gemini.svg","name":"@n8n/n8n-nodes-langchain.googleGemini","codex":{"data":{"alias":["LangChain","video","document","audio","transcribe","assistant"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.googlegemini/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Miscellaneous","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"Google Gemini"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iX2Zvb3RlclNwYXJrXzk4dWR0XzE1MSIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiB2aWV3Qm94PSIwIDAgNjQgNjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTU3LjA2NjcgMjguNjEwM0M1Mi4xMzU5IDI2LjQ4NzggNDcuODIxNyAyMy41NzYgNDQuMTIyMyAxOS44Nzg0QzQwLjQyNDcgMTYuMTgwOCAzNy41MTI4IDExLjg2NDkgMzUuMzkwMiA2LjkzNDJDMzQuNTc1NCA1LjA0NDQ5IDMzLjkyMDYgMy4xMDIwNCAzMy40MTg2IDEuMTEwNDlDMzMuMjU0OSAwLjQ1OTM2OCAzMi42NzExIDAuMDAxMDM3NiAzMiAwLjAwMTAzNzZDMzEuMzI4OCAwLjAwMTAzNzYgMzAuNzQ1IDAuNDU5MzY4IDMwLjU4MTMgMS4xMTA0OUMzMC4wNzkzIDMuMTAyMDQgMjkuNDI0NiA1LjA0MjY3IDI4LjYwOTcgNi45MzQyQzI2LjQ4NzIgMTEuODY0OSAyMy41NzUzIDE2LjE4MDggMTkuODc3NyAxOS44Nzg0QzE2LjE4IDIzLjU3NiAxMS44NjQgMjYuNDg3OCA2LjkzMzI3IDI4LjYxMDNDNS4wNDM1MyAyOS40MjUxIDMuMTAxMDUgMzAuMDc5OSAxLjEwOTQ3IDMwLjU4MTlDMC40NTgzMzggMzAuNzQ1NiAwIDMxLjMyOTQgMCAzMi4wMDA1QzAgMzIuNjcxNiAwLjQ1ODMzOCAzMy4yNTU1IDEuMTA5NDcgMzMuNDE5MUMzLjEwMTA1IDMzLjkyMTEgNS4wNDE3MiAzNC41NzU5IDYuOTMzMjcgMzUuMzkwN0MxMS44NjQgMzcuNTEzMiAxNi4xNzgyIDQwLjQyNTEgMTkuODc3NyA0NC4xMjI2QzIzLjU3NzEgNDcuODIwMiAyNi40ODcyIDUyLjEzNjEgMjguNjA5NyA1Ny4wNjY4QzI5LjQyNDYgNTguOTU2NSAzMC4wNzkzIDYwLjg5OSAzMC41ODEzIDYyLjg5MDVDMzAuNzQ1IDYzLjU0MTYgMzEuMzI4OCA2NCAzMiA2NEMzMi42NzExIDY0IDMzLjI1NDkgNjMuNTQxNiAzMy40MTg2IDYyLjg5MDVDMzMuOTIwNiA2MC44OTkgMzQuNTc1NCA1OC45NTgzIDM1LjM5MDIgNTcuMDY2OEMzNy41MTI4IDUyLjEzNjEgNDAuNDI0NyA0Ny44MjIgNDQuMTIyMyA0NC4xMjI2QzQ3LjgxOTkgNDAuNDI1MSA1Mi4xMzU5IDM3LjUxMzIgNTcuMDY2NyAzNS4zOTA3QzU4Ljk1NjQgMzQuNTc1OSA2MC44OTg5IDMzLjkyMTEgNjIuODkwNSAzMy40MTkxQzYzLjU0MTYgMzMuMjU1NSA2NCAzMi42NzE2IDY0IDMyLjAwMDVDNjQgMzEuMzI5NCA2My41NDE2IDMwLjc0NTYgNjIuODkwNSAzMC41ODE5QzYwLjg5ODkgMzAuMDc5OSA1OC45NTgyIDI5LjQyNTEgNTcuMDY2NyAyOC42MTAzWiIgZmlsbD0id2hpdGUiPjwvcGF0aD48bWFzayBpZD0ibWFzazBfMTA4NTlfNDg5NCIgc3R5bGU9Im1hc2stdHlwZTphbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0Ij48cGF0aCBkPSJNMzIgMEMzMi42NzExIDEuMTQ0ZS0wNSAzMy4yNTUzIDAuNDU4MjYzIDMzLjQxODkgMS4xMDkzOEMzMy45MjA5IDMuMTAwOTMgMzQuNTc1OCA1LjA0Mzg5IDM1LjM5MDYgNi45MzM1OUMzNy41MTMxIDExLjg2MzkgNDAuNDI0NyAxNi4xNzk2IDQ0LjEyMjEgMTkuODc3QzQ3LjgyMTUgMjMuNTc0NSA1Mi4xMzU3IDI2LjQ4NjkgNTcuMDY2NCAyOC42MDk0QzU4Ljk1OCAyOS40MjQyIDYwLjg5OSAzMC4wNzkxIDYyLjg5MDYgMzAuNTgxMUM2My41NDE1IDMwLjc0NDggNjMuOTk5OCAzMS4zMjgxIDY0IDMxLjk5OUM2NCAzMi42NzAxIDYzLjU0MTcgMzMuMjU0MiA2Mi44OTA2IDMzLjQxOEM2MC44OTkgMzMuOTE5OSA1OC45NTYxIDM0LjU3NDggNTcuMDY2NCAzNS4zODk2QzUyLjEzNTggMzcuNTEyMSA0Ny44MTk2IDQwLjQyMzcgNDQuMTIyMSA0NC4xMjExQzQwLjQyNDYgNDcuODIwNCAzNy41MTMxIDUyLjEzNDkgMzUuMzkwNiA1Ny4wNjU0QzM0LjU3NTggNTguOTU3IDMzLjkyMDkgNjAuODk4MSAzMy40MTg5IDYyLjg4OTZDMzMuMjU1MiA2My41NDA3IDMyLjY3MTEgNjMuOTk5IDMyIDYzLjk5OUMzMS4zMjg5IDYzLjk5OSAzMC43NDQ4IDYzLjU0MDcgMzAuNTgxMSA2Mi44ODk2QzMwLjA3OTEgNjAuODk4MSAyOS40MjQyIDU4Ljk1NTEgMjguNjA5NCA1Ny4wNjU0QzI2LjQ4NjkgNTIuMTM0OSAyMy41NzczIDQ3LjgxODYgMTkuODc3OSA0NC4xMjExQzE2LjE3ODYgNDAuNDIzNyAxMS44NjQyIDM3LjUxMjEgNi45MzM1OSAzNS4zODk2QzUuMDQyMDQgMzQuNTc0OCAzLjEwMDk2IDMzLjkxOTkgMS4xMDkzOCAzMy40MThDMC40NTgzMDkgMzMuMjU0MiAwIDMyLjY3MDEgMCAzMS45OTlDMC4wMDAyMDE1NDggMzEuMzI4MSAwLjQ1ODQ2MyAzMC43NDQ4IDEuMTA5MzggMzAuNTgxMUMzLjEwMDk2IDMwLjA3OTEgNS4wNDM4NiAyOS40MjQyIDYuOTMzNTkgMjguNjA5NEMxMS44NjQzIDI2LjQ4NjkgMTYuMTgwNCAyMy41NzQ1IDE5Ljg3NzkgMTkuODc3QzIzLjU3NTMgMTYuMTc5NiAyNi40ODY5IDExLjg2MzkgMjguNjA5NCA2LjkzMzU5QzI5LjQyNDIgNS4wNDIwNyAzMC4wNzkxIDMuMTAwOTMgMzAuNTgxMSAxLjEwOTM4QzMwLjc0NDggMC40NTgyNiAzMS4zMjg5IDAgMzIgMFoiIGZpbGw9ImJsYWNrIj48L3BhdGg+PHBhdGggZD0iTTMyIDBDMzIuNjcxMSAxLjE0NGUtMDUgMzMuMjU1MyAwLjQ1ODI2MyAzMy40MTg5IDEuMTA5MzhDMzMuOTIwOSAzLjEwMDkzIDM0LjU3NTggNS4wNDM4OSAzNS4zOTA2IDYuOTMzNTlDMzcuNTEzMSAxMS44NjM5IDQwLjQyNDcgMTYuMTc5NiA0NC4xMjIxIDE5Ljg3N0M0Ny44MjE1IDIzLjU3NDUgNTIuMTM1NyAyNi40ODY5IDU3LjA2NjQgMjguNjA5NEM1OC45NTggMjkuNDI0MiA2MC44OTkgMzAuMDc5MSA2Mi44OTA2IDMwLjU4MTFDNjMuNTQxNSAzMC43NDQ4IDYzLjk5OTggMzEuMzI4MSA2NCAzMS45OTlDNjQgMzIuNjcwMSA2My41NDE3IDMzLjI1NDIgNjIuODkwNiAzMy40MThDNjAuODk5IDMzLjkxOTkgNTguOTU2MSAzNC41NzQ4IDU3LjA2NjQgMzUuMzg5NkM1Mi4xMzU4IDM3LjUxMjEgNDcuODE5NiA0MC40MjM3IDQ0LjEyMjEgNDQuMTIxMUM0MC40MjQ2IDQ3LjgyMDQgMzcuNTEzMSA1Mi4xMzQ5IDM1LjM5MDYgNTcuMDY1NEMzNC41NzU4IDU4Ljk1NyAzMy45MjA5IDYwLjg5ODEgMzMuNDE4OSA2Mi44ODk2QzMzLjI1NTIgNjMuNTQwNyAzMi42NzExIDYzLjk5OSAzMiA2My45OTlDMzEuMzI4OSA2My45OTkgMzAuNzQ0OCA2My41NDA3IDMwLjU4MTEgNjIuODg5NkMzMC4wNzkxIDYwLjg5ODEgMjkuNDI0MiA1OC45NTUxIDI4LjYwOTQgNTcuMDY1NEMyNi40ODY5IDUyLjEzNDkgMjMuNTc3MyA0Ny44MTg2IDE5Ljg3NzkgNDQuMTIxMUMxNi4xNzg2IDQwLjQyMzcgMTEuODY0MiAzNy41MTIxIDYuOTMzNTkgMzUuMzg5NkM1LjA0MjA0IDM0LjU3NDggMy4xMDA5NiAzMy45MTk5IDEuMTA5MzggMzMuNDE4QzAuNDU4MzA5IDMzLjI1NDIgMCAzMi42NzAxIDAgMzEuOTk5QzAuMDAwMjAxNTQ4IDMxLjMyODEgMC40NTg0NjMgMzAuNzQ0OCAxLjEwOTM4IDMwLjU4MTFDMy4xMDA5NiAzMC4wNzkxIDUuMDQzODYgMjkuNDI0MiA2LjkzMzU5IDI4LjYwOTRDMTEuODY0MyAyNi40ODY5IDE2LjE4MDQgMjMuNTc0NSAxOS44Nzc5IDE5Ljg3N0MyMy41NzUzIDE2LjE3OTYgMjYuNDg2OSAxMS44NjM5IDI4LjYwOTQgNi45MzM1OUMyOS40MjQyIDUuMDQyMDcgMzAuMDc5MSAzLjEwMDkzIDMwLjU4MTEgMS4xMDkzOEMzMC43NDQ4IDAuNDU4MjYgMzEuMzI4OSAwIDMyIDBaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMTA4NTlfNDg5NCkiPjwvcGF0aD48L21hc2s+PGcgbWFzaz0idXJsKCNtYXNrMF8xMDg1OV80ODk0KSI+PGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZl8xMDg1OV80ODk0KSI+PGVsbGlwc2UgY3g9IjE0LjIwODQiIGN5PSIxNi43MTY0IiByeD0iMTQuMjA4NCIgcnk9IjE2LjcxNjQiIHRyYW5zZm9ybT0ibWF0cml4KDAuOTQyMzQzIDAuMzM0NjQ5IC0wLjMzNDY1NiAwLjk0MjM0IC03Ljk3OSAxMy43NzM1KSIgZmlsbD0iI0ZGRTQzMiI+PC9lbGxpcHNlPjwvZz48ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzEwODU5XzQ4OTQpIj48ZWxsaXBzZSBjeD0iMjcuMDU0MyIgY3k9IjIuNTUxMTQiIHJ4PSIxOC4zOTQ0IiByeT0iMTguNzk4NSIgZmlsbD0iI0ZDNDEzRCI+PC9lbGxpcHNlPjwvZz48ZyBmaWx0ZXI9InVybCgjZmlsdGVyMl9mXzEwODU5XzQ4OTQpIj48ZWxsaXBzZSBjeD0iMTkuMjI0NSIgY3k9IjI0LjkwNDIiIHJ4PSIxOS4yMjQ1IiByeT0iMjQuOTA0MiIgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTg4MDcgLTAuMDQ4ODI1NCAwLjA0ODgyNjYgMC45OTg4MDcgLTEuNzI3NzggMzIuNjU3MykiIGZpbGw9IiMwMEI5NUMiPjwvZWxsaXBzZT48L2c+PGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjNfZl8xMDg1OV80ODk0KSI+PGVsbGlwc2UgY3g9IjE5LjIyNDUiIGN5PSIyNC45MDQyIiByeD0iMTkuMjI0NSIgcnk9IjI0LjkwNDIiIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk4ODA3IC0wLjA0ODgyNTQgMC4wNDg4MjY2IDAuOTk4ODA3IC0xLjcyNzc4IDMyLjY1NzMpIiBmaWxsPSIjMDBCOTVDIj48L2VsbGlwc2U+PC9nPjxnIGZpbHRlcj0idXJsKCNmaWx0ZXI0X2ZfMTA4NTlfNDg5NCkiPjxlbGxpcHNlIGN4PSIxOC44NDI5IiBjeT0iMjAuNzQ0MSIgcng9IjE4Ljg0MjkiIHJ5PSIyMC43NDQxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg1NDMwMSAtMC41MTk3NzkgMC41MTk3OSAwLjg1NDI5NCAtNy4xMzU3NCA0Ny41MDc4KSIgZmlsbD0iIzAwQjk1QyI+PC9lbGxpcHNlPjwvZz48ZyBmaWx0ZXI9InVybCgjZmlsdGVyNV9mXzEwODU5XzQ4OTQpIj48ZWxsaXBzZSBjeD0iNjYuNDYxNyIgY3k9IjI0Ljk3NyIgcng9IjE4LjA5MzMiIHJ5PSIxNy40MjI5IiBmaWxsPSIjMzE4NkZGIj48L2VsbGlwc2U+PC9nPjxnIGZpbHRlcj0idXJsKCNmaWx0ZXI2X2ZfMTA4NTlfNDg5NCkiPjxlbGxpcHNlIGN4PSIyMC45MjkyIiBjeT0iMjIuMDc1MiIgcng9IjIwLjkyOTIiIHJ5PSIyMi4wNzUyIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjc5NTk5IDAuNjA1MzEgLTAuNjA1MzIgMC43OTU5ODIgLTIuODE4ODUgLTcuNDMzMjMpIiBmaWxsPSIjRkJCQzA0Ij48L2VsbGlwc2U+PC9nPjxnIGZpbHRlcj0idXJsKCNmaWx0ZXI3X2ZfMTA4NTlfNDg5NCkiPjxlbGxpcHNlIGN4PSIyNC4xMzExIiBjeT0iMjIuMjkxOSIgcng9IjI0LjEzMTEiIHJ5PSIyMi4yOTE5IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjgyNDAzNyAwLjU2NjUzNiAtMC41NjY1NDYgMC44MjQwMyAzOS42MzM4IDAuMzEwNjA4KSIgZmlsbD0iIzMxODZGRiI+PC9lbGxpcHNlPjwvZz48ZyBmaWx0ZXI9InVybCgjZmlsdGVyOF9mXzEwODU5XzQ4OTQpIj48cGF0aCBkPSJNNTQuMjI1NSAtMi4zMDQwM0M1Ny4wMTk1IDEuNDk0NjIgNTMuNDI5NCA4Ljg4MDQgNDYuMjA2OCAxNC4xOTI2QzM4Ljk4NDIgMTkuNTA0OCAzMC44NjQyIDIwLjczMTggMjguMDcwMiAxNi45MzMxQzI1LjI3NjIgMTMuMTM0NSAyOC44NjYzIDUuNzQ4NjcgMzYuMDg4OSAwLjQzNjQ4NkM0My4zMTE1IC00Ljg3NTcgNTEuNDMxNSAtNi4xMDI2NyA1NC4yMjU1IC0yLjMwNDAzWiIgZmlsbD0iIzc0OUJGRiI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjZmlsdGVyOV9mXzEwODU5XzQ4OTQpIj48ZWxsaXBzZSBjeD0iMjcuNTg1MyIgY3k9IjE3LjE0NzgiIHJ4PSIyNy41ODUzIiByeT0iMTcuMTQ3OCIgdHJhbnNmb3JtPSJtYXRyaXgoMC43MzMxNjYgLTAuNjgwMDQ5IDAuNjgwMDYxIDAuNzMzMTU1IC0xMi4yNTgzIDkuNDk2OTUpIiBmaWxsPSIjRkM0MTNEIj48L2VsbGlwc2U+PC9nPjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIxMF9mXzEwODU5XzQ4OTQpIj48ZWxsaXBzZSBjeD0iMTQuNzgxOSIgY3k9IjguNTk2MzciIHJ4PSIxNC43ODE5IiByeT0iOC41OTYzNyIgdHJhbnNmb3JtPSJtYXRyaXgoMC44MTMxODYgMC41ODIwMDQgLTAuNTgyMDE2IDAuODEzMTc3IDYuMzc4NDIgMzAuNTExKSIgZmlsbD0iI0ZGRUU0OCI+PC9lbGxpcHNlPjwvZz48L2c+PGRlZnM+PGZpbHRlciBpZD0iZmlsdGVyMF9mXzEwODU5XzQ4OTQiIHg9Ii0xOS42MTgiIHk9IjEyLjkwMjciIHdpZHRoPSIzOC44NjgxIiBoZWlnaHQ9IjQyLjc1NjIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMi40NTk2NSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzEwODU5XzQ4OTQiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PGZpbHRlciBpZD0iZmlsdGVyMV9mXzEwODU5XzQ4OTQiIHg9Ii0xNS4xMjIzIiB5PSItNDAuMDI5NiIgd2lkdGg9Ijg0LjM1MzMiIGhlaWdodD0iODUuMTYxNSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ij48L2ZlRmxvb2Q+PGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiPjwvZmVCbGVuZD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMS44OTExIiByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfMTA4NTlfNDg5NCI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48ZmlsdGVyIGlkPSJmaWx0ZXIyX2ZfMTA4NTlfNDg5NCIgeD0iLTIwLjc2ODIiIHk9IjExLjQ4MzUiIHdpZHRoPSI3OC45MTYxIiBoZWlnaHQ9IjkwLjIxOTYiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuMTA4NiIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzEwODU5XzQ4OTQiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PGZpbHRlciBpZD0iZmlsdGVyM19mXzEwODU5XzQ4OTQiIHg9Ii0yMC43NjgyIiB5PSIxMS40ODM1IiB3aWR0aD0iNzguOTE2MSIgaGVpZ2h0PSI5MC4yMTk2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD48ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjEwLjEwODYiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8xMDg1OV80ODk0Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImZpbHRlcjRfZl8xMDg1OV80ODk0IiB4PSItMTkuODUiIHk9IjE0Ljk2NjQiIHdpZHRoPSI3OS4xODg2IiBoZWlnaHQ9IjgwLjkzNzgiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuMTA4NiIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzEwODU5XzQ4OTQiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PGZpbHRlciBpZD0iZmlsdGVyNV9mXzEwODU5XzQ4OTQiIHg9IjI5LjE1NjEiIHk9Ii0xMS42NTgyIiB3aWR0aD0iNzQuNjExMSIgaGVpZ2h0PSI3My4yNzAzIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD48ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjkuNjA2MTMiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8xMDg1OV80ODk0Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImZpbHRlcjZfZl8xMDg1OV80ODk0IiB4PSItMzguMjkxIiB5PSItMTYuMjY4NyIgd2lkdGg9Ijc3LjUzOCIgaGVpZ2h0PSI3OC4xNTEzIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD48ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjguNzA1OTEiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8xMDg1OV80ODk0Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImZpbHRlcjdfZl8xMDg1OV80ODk0IiB4PSI3Ljc4MDM4IiB5PSItNi4wOTgxIiB3aWR0aD0iNzguMjE4MSIgaGVpZ2h0PSI3Ni44OTgyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD48ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjcuNzc0NzMiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8xMDg1OV80ODk0Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImZpbHRlcjhfZl8xMDg1OV80ODk0IiB4PSIxMy4yMDgyIiB5PSItMTguNDI1IiB3aWR0aD0iNTUuODc5MyIgaGVpZ2h0PSI1MS40NzkxIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD48ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjYuOTU2OTQiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8xMDg1OV80ODk0Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgaWQ9ImZpbHRlcjlfZl8xMDg1OV80ODk0IiB4PSItMTUuNDczOSIgeT0iLTMxLjAyNzIiIHdpZHRoPSI3MC4yMDM0IiBoZWlnaHQ9IjY4LjY3MzUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS44NzU5OCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzEwODU5XzQ4OTQiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PGZpbHRlciBpZD0iZmlsdGVyMTBfZl8xMDg1OV80ODk0IiB4PSItMTQuMTczIiB5PSIyMC40NzQiIHdpZHRoPSI1NS4xMzczIiBoZWlnaHQ9IjUxLjI2MSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ij48L2ZlRmxvb2Q+PGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiPjwvZmVCbGVuZD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI3LjI3MjUzIiByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfMTA4NTlfNDg5NCI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMTA4NTlfNDg5NCIgeDE9IjE4LjE5MzEiIHkxPSI0Mi44MjEiIHgyPSI1MS40MzM1IiB5Mj0iMTQuNzk1OSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM0ODkzRkMiPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjAuMjciIHN0b3AtY29sb3I9IiM0ODkzRkMiPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjAuNzc2OTgxIiBzdG9wLWNvbG9yPSIjOTY5REZGIj48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQkQ5OUZFIj48L3N0b3A+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PC9zdmc+Cg=="},"displayName":"Google Gemini","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":40,"name":"Support Chatbot"},{"id":47,"name":"AI Chatbot"}],"image":[]}}