{"workflow":{"id":14552,"name":"Answer wealth management portfolio questions with Google Sheets, live prices and Google Gemini","views":40,"recentViews":4,"totalViews":40,"createdAt":"2026-04-01T10:27:37.823Z","description":"# (Wealth Management) Client Question → Instant Answer Assistant \n## (n8n + Google Sheets + AI + API)\n\nThis workflow allows users to ask portfolio-related questions in a simple format (`C001: your question`). It validates the input, fetches client data and holdings from Google Sheets, retrieves live market prices via API, calculates portfolio performance and generates a short AI-powered response.\n\n### Quick Implementation Steps\n\n1. Connect Google Sheets (clients, holdings, interaction_logs)\n2. Configure `Get Live Prices` API endpoint\n3. Add credentials for `Generate AI Answer` (Google Gemini)\n4. Ensure input format: `C001: your question`\n5. Run test cases (valid + invalid inputs)\n\n\n## What It Does\n\nThis workflow acts as an intelligent financial assistant that responds to client portfolio queries in real time. It starts by receiving a chat message through the **When chat message received** node and processes it using **Parse Client Message** to extract the client ID and question.\n\nOnce validated, it retrieves client details using **Get Client Profile** and portfolio holdings via **Get Client Holdings**. It then fetches live stock prices through the **Get Live Prices** API and merges all data using **Merge Portfolio Data** to compute metrics like invested value, current value, profit/loss and returns.\n\nFinally, the workflow builds a structured prompt in **Build AI Prompt** and generates a concise response using **Generate AI Answer**, ensuring the reply is accurate, controlled and based only on available data.\n\n\n## Who Can Use This Workflow\n\n- Financial advisors managing multiple client portfolios  \n- Wealth management platforms  \n- Fintech developers building AI-driven assistants  \n- Anyone looking to automate portfolio Q&A workflows  \n\n\n## Requirements\n\n- n8n (self-hosted or cloud)\n- Google Sheets account with:\n  - `clients` sheet\n  - `holdings` sheet\n  - `interaction_logs` sheet\n- Live price API endpoint (used in **Get Live Prices**)\n- Google Gemini API credentials (used in **Generate AI Answer**)\n\n\n## How It Works & Setup Guide\n\n### 1. Trigger & Input Parsing\n\n- **When chat message received** receives input\n- **Parse Client Message** extracts:\n  - `client_id`\n  - `question`\n- **IF Valid Input?** validates format\n\nIf invalid:\n- **Build Invalid Input Response**\n- **Log Invalid Input**\n- **Return Invalid Response**\n\n\n### 2. Client & Holdings Lookup\n\n- **Get Client Profile** fetches client details\n- **IF Client Found?** ensures existence\n- **Get Client Holdings** retrieves holdings\n- **Prepare Symbols** extracts stock symbols\n- **IF Holdings Found?** validates data\n\nFailure handling:\n- **Build Client Not Found Response**\n- **Build No Holdings Response**\n\n\n### 3. Market Data Fetching\n\n- **Get Live Prices** calls external API\n- **Normalize Price Response** standardizes output\n- **IF Price API Worked?** validates API success\n\nFailure handling:\n- **Build API Failed Response**\n\n\n### 4. Portfolio Calculation\n\n- **Merge Portfolio Data** computes:\n  - Invested amount\n  - Current value\n  - P&L\n  - Return %\n  - Best performer\n  - Weakest performer\n  - Missing prices\n\n\n### 5. Market Context (Optional Enhancement)\n\n- **Get Market Context**\n- **Attach Market Context**\n\nAdds optional insights like:\n- Nifty/Sensex movement\n- Market tone\n\n\n### 6. AI Response Generation\n\n- **Build AI Prompt** creates structured prompt\n- **Generate AI Answer** generates response\n- **Extract AI Answer** extracts clean reply\n\n\n### 7. Final Output\n\nFinal response includes:\n- Client ID\n- Question\n- AI reply\n- Status\n- Timestamp\n\n\n## How To Customize Nodes\n\n- **Parse Client Message**\n  - Modify input format rules\n- **Get Live Prices**\n  - Replace with another API (Alpha Vantage, Twelve Data, etc.)\n- **Merge Portfolio Data**\n  - Add more financial metrics (CAGR, allocation %, etc.)\n- **Build AI Prompt**\n  - Change tone (formal, advisory, aggressive)\n- **Generate AI Answer**\n  - Replace Gemini with Hugging Face / OpenAI models\n\n\n## Add-Ons (Enhancements)\n\n- Add Slack notifications for responses\n- Save AI replies to CRM\n- Add email delivery for clients\n- Implement caching for price API\n- Add retry logic for API failures\n- Support multi-client batch processing\n\n\n## Use Case Examples\n\n1. Client asks: *“C001: How is my portfolio performing?”*  \n2. Advisor checks: *“C002: Which stock is my top performer?”*  \n3. User queries: *“C003: Why is my portfolio down?”*  \n4. Daily automated portfolio summary generation  \n5. Integration with chatbot for real-time advisory  \n\nThere can be many more use cases depending on how this workflow is extended.\n\n\n## Troubleshooting Guide\n\n| Issue | Possible Cause | Solution |\n|------|--------------|---------|\n| Invalid input error | Wrong format | Use `C001: your question` |\n| Client not found | Missing in sheet | Check `clients` sheet |\n| No holdings found | Empty data | Verify `holdings` sheet |\n| API failed | Endpoint issue | Check API URL or timeout |\n| AI reply empty | Model issue | Verify API credentials |\n| Incorrect calculations | Missing price data | Check API response |\n\n\n## 🤝 Need Help?\n\nIf you need help setting up this workflow, customizing nodes or building advanced automation solutions, feel free to reach out.\n\nFor professional support, custom workflow development or enterprise-grade automation, contact our [n8n workflow developers](https://www.weblineindia.com/hire-n8n-developers/) at **WeblineIndia**. We help businesses build scalable and intelligent automation systems tailored to their needs.\n","workflow":{"id":"yFfwPclgdgnSPstc","meta":{"instanceId":"d5a3f226268c824634130edfe0663edaf5156b09db684602637a005d81ac3199"},"name":"Client Question → Instant Answer Assistant(new version)","tags":[],"nodes":[{"id":"68866f52-49c9-4d33-9d28-fc430b61bf8b","name":"When chat message received","type":"@n8n/n8n-nodes-langchain.chatTrigger","position":[5552,2688],"webhookId":"3efab814-9f0a-4f5d-8f48-ae414d005d0a","parameters":{"options":{"responseMode":"lastNode"}},"typeVersion":1.4},{"id":"e7302a95-1ba1-4ecc-8c16-e133ae4ac25e","name":"Parse Client Message","type":"n8n-nodes-base.code","position":[5776,2688],"parameters":{"mode":"runOnceForEachItem","jsCode":"const text =\n  $json.chatInput ||\n  $json.message ||\n  $json.text ||\n  '';\n\nif (!text || !String(text).trim()) {\n  return {\n    valid: false,\n    error_stage: 'input_validation',\n    error_message: 'Empty message received. Use format: C001: Your question',\n    raw_message: text || ''\n  };\n}\n\nif (!String(text).includes(':')) {\n  return {\n    valid: false,\n    error_stage: 'input_validation',\n    error_message: 'Invalid format. Use: C001: Your question',\n    raw_message: text\n  };\n}\n\nconst parts = String(text).split(':');\nconst client_id = (parts[0] || '').trim().toUpperCase();\nconst question = parts.slice(1).join(':').trim();\n\nif (!client_id) {\n  return {\n    valid: false,\n    error_stage: 'input_validation',\n    error_message: 'Client ID is missing. Use format: C001: Your question',\n    raw_message: text\n  };\n}\n\nif (!question) {\n  return {\n    valid: false,\n    error_stage: 'input_validation',\n    error_message: 'Question is missing after client ID.',\n    raw_message: text,\n    client_id\n  };\n}\n\nreturn {\n  valid: true,\n  raw_message: text,\n  client_id,\n  question,\n  source_channel: 'chat',\n  received_at: new Date().toISOString()\n};"},"typeVersion":2},{"id":"b0e7cf73-ae51-41bb-b3bc-1c87e25c7705","name":"IF Valid Input?","type":"n8n-nodes-base.if","position":[6000,2688],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"valid_check_1","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.valid }}","rightValue":true}]}},"typeVersion":2.2},{"id":"910c9fe7-188c-4021-bd66-4bcf1a0c7e85","name":"Build Invalid Input Response","type":"n8n-nodes-base.code","position":[5664,3056],"parameters":{"jsCode":"return [{\n  json: {\n    status: 'failed',\n    error_stage: $json.error_stage || 'input_validation',\n    action_taken: 'Rejected invalid input',\n    client_id: $json.client_id || null,\n    question: $json.question || null,\n    raw_message: $json.raw_message || null,\n    reply: $json.error_message || 'Invalid input',\n    source_channel: $json.source_channel || 'chat',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"0550e1d5-c21d-4589-a13a-20e5dd63637a","name":"Log Invalid Input","type":"n8n-nodes-base.googleSheets","position":[5840,3056],"parameters":{"columns":{"value":{},"schema":[{"id":"timestamp","type":"string","display":true,"removed":false,"required":false,"displayName":"timestamp","defaultMatch":false,"canBeUsedToMatch":true},{"id":"client_id","type":"string","display":true,"removed":false,"required":false,"displayName":"client_id","defaultMatch":false,"canBeUsedToMatch":true},{"id":"question","type":"string","display":true,"removed":false,"required":false,"displayName":"question","defaultMatch":false,"canBeUsedToMatch":true},{"id":"reply","type":"string","display":true,"removed":false,"required":false,"displayName":"reply","defaultMatch":false,"canBeUsedToMatch":true},{"id":"status","type":"string","display":true,"removed":false,"required":false,"displayName":"status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"action_taken","type":"string","display":true,"removed":false,"required":false,"displayName":"action_taken","defaultMatch":false,"canBeUsedToMatch":true},{"id":"error_stage","type":"string","display":true,"removed":false,"required":false,"displayName":"error_stage","defaultMatch":false,"canBeUsedToMatch":true},{"id":"source_channel","type":"string","display":true,"removed":false,"required":false,"displayName":"source_channel","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"name","value":"interaction_logs"},"documentId":{"__rl":true,"mode":"list","value":"1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM/edit?usp=drivesdk","cachedResultName":"Portfolio_AI_System"}},"credentials":{"googleSheetsOAuth2Api":{"id":"eUZMZqnoN3N6wxJf","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"f6271a50-6035-40d7-bf13-a3a77780e071","name":"Return Invalid Response","type":"n8n-nodes-base.code","position":[6016,3056],"parameters":{"jsCode":"return [{\n  json: {\n    reply: $json.reply,\n    status: $json.status,\n    error_stage: $json.error_stage\n  }\n}];"},"typeVersion":2},{"id":"ff7f936e-9f53-407a-9a17-c452bb454f89","name":"Get Client Profile","type":"n8n-nodes-base.googleSheets","position":[6224,2592],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"={{ $json.client_id }}","lookupColumn":"client_id"}]},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM/edit#gid=0","cachedResultName":"clients"},"documentId":{"__rl":true,"mode":"list","value":"1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM/edit?usp=drivesdk","cachedResultName":"Portfolio_AI_System"}},"credentials":{"googleSheetsOAuth2Api":{"id":"eUZMZqnoN3N6wxJf","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"e45b88cb-4172-4dba-b2a9-1937a0f663b1","name":"IF Client Found?","type":"n8n-nodes-base.if","position":[6448,2592],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"client_found_check","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ !!$json.client_id }}","rightValue":true}]}},"typeVersion":2.2},{"id":"7fc08ba7-2fb8-498b-bbf4-d2ab23ee62eb","name":"Build Client Not Found Response","type":"n8n-nodes-base.code","position":[9712,2976],"parameters":{"jsCode":"const parsed = $('Parse Client Message').first().json;\n\nreturn [{\n  json: {\n    status: 'failed',\n    error_stage: 'client_lookup',\n    action_taken: 'Stopped because client was not found',\n    client_id: parsed.client_id || null,\n    question: parsed.question || null,\n    reply: `Client ID ${parsed.client_id || ''} was not found in the client sheet.`,\n    source_channel: parsed.source_channel || 'chat',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"f42b8d59-3998-47d9-8898-8674f32d5294","name":"Get Client Holdings","type":"n8n-nodes-base.googleSheets","position":[6672,2496],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"={{ $('Parse Client Message').first().json.client_id }}","lookupColumn":"client_id"}]},"sheetName":{"__rl":true,"mode":"name","value":"holdings"},"documentId":{"__rl":true,"mode":"list","value":"1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM/edit?usp=drivesdk","cachedResultName":"Portfolio_AI_System"}},"credentials":{"googleSheetsOAuth2Api":{"id":"eUZMZqnoN3N6wxJf","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"e61cfad3-18cc-4c43-975a-72e1aebd884b","name":"Prepare Symbols","type":"n8n-nodes-base.code","position":[6896,2496],"parameters":{"jsCode":"const holdings = $input.all().map(item => item.json).filter(x => Object.keys(x).length > 0);\nconst parsed = $('Parse Client Message').first().json;\nconst client = $('Get Client Profile').first().json || {};\n\nif (!holdings.length) {\n  return [{\n    json: {\n      holdings_found: false,\n      client_id: parsed.client_id,\n      question: parsed.question,\n      client_name: client.client_name || null\n    }\n  }];\n}\n\nconst symbols = holdings\n  .map(h => (h.symbol || '').trim().toUpperCase())\n  .filter(Boolean);\n\nreturn [{\n  json: {\n    holdings_found: true,\n    holdings,\n    symbols,\n    client_id: parsed.client_id,\n    question: parsed.question,\n    client_name: client.client_name || null,\n    risk_profile: client.risk_profile || null,\n    goal: client.goal || null,\n    tone: client.tone || 'simple',\n    source_channel: parsed.source_channel || 'chat',\n    received_at: parsed.received_at\n  }\n}];"},"typeVersion":2},{"id":"61e3855d-35ef-4cd2-b628-c1705e0be181","name":"IF Holdings Found?","type":"n8n-nodes-base.if","position":[7120,2496],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"holdings_found_check","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.holdings_found }}","rightValue":true}]}},"typeVersion":2.2},{"id":"14ef2640-f1ab-403e-b36f-918d6f346cae","name":"Build No Holdings Response","type":"n8n-nodes-base.code","position":[9712,2784],"parameters":{"jsCode":"const item = $input.first().json;\n\nreturn [{\n  json: {\n    status: 'failed',\n    error_stage: 'holdings_lookup',\n    action_taken: 'Stopped because no holdings were found',\n    client_id: item.client_id || null,\n    question: item.question || null,\n    reply: `No holdings were found for client ${item.client_id || ''}.`,\n    source_channel: item.source_channel || 'chat',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"6149d05f-f7b1-4446-9898-47bbe02b8fbd","name":"Get Live Prices","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[7344,2400],"parameters":{"url":"https://memic-nse-quotes-api.hf.space/quotes","method":"POST","options":{"timeout":30000},"sendBody":true,"bodyParameters":{"parameters":[{"name":"symbols","value":"={{ $json.symbols }}"}]}},"typeVersion":4.4},{"id":"47a5734a-fb89-40af-bc6c-f84b6728d17b","name":"Normalize Price Response","type":"n8n-nodes-base.code","position":[7568,2400],"parameters":{"jsCode":"const prep = $('Prepare Symbols').first().json;\nconst api = $input.first().json || {};\n\nconst prices = api.prices || {};\nconst errors = api.errors || {};\nconst apiWorked = !!api.prices || Object.keys(api).length > 0;\n\nreturn [{\n  json: {\n    ...prep,\n    api_worked: apiWorked,\n    prices,\n    price_errors: errors,\n    raw_price_response: api\n  }\n}];"},"typeVersion":2},{"id":"ab88bdeb-675e-4908-9a6d-0ed70c2c1806","name":"IF Price API Worked?","type":"n8n-nodes-base.if","position":[7792,2400],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"api_worked_check","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.api_worked }}","rightValue":true}]}},"typeVersion":2.2},{"id":"d8576673-6dd2-4ac4-a6b2-f5e36e61a722","name":"Build API Failed Response","type":"n8n-nodes-base.code","position":[9712,2592],"parameters":{"jsCode":"const item = $input.first().json;\n\nreturn [{\n  json: {\n    status: 'failed',\n    error_stage: 'market_api',\n    action_taken: 'Stopped because live price API failed',\n    client_id: item.client_id || null,\n    question: item.question || null,\n    reply: 'Live market prices could not be fetched right now. Please try again shortly.',\n    source_channel: item.source_channel || 'chat',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"cd28bc55-3d8f-49e7-8b27-7884bc8af321","name":"Merge Portfolio Data","type":"n8n-nodes-base.code","position":[8032,2352],"parameters":{"jsCode":"const data = $input.first().json;\nconst holdings = data.holdings || [];\nconst prices = data.prices || {};\nconst errors = data.price_errors || {};\n\nconst merged = holdings.map(h => {\n  const symbol = (h.symbol || '').trim().toUpperCase();\n  const p = prices[symbol] || {};\n  const quantity = Number(h.quantity || 0);\n  const avgBuy = Number(h.avg_buy_price || 0);\n  const invested = quantity * avgBuy;\n\n  const hasPrice =\n    p.last_price !== undefined &&\n    p.last_price !== null &&\n    p.last_price !== '';\n\n  const ltp = hasPrice ? Number(p.last_price) : null;\n  const current_value = hasPrice ? quantity * ltp : null;\n  const pnl = hasPrice ? current_value - invested : null;\n  const pnl_pct = hasPrice && invested ? (pnl / invested) * 100 : null;\n\n  return {\n    row_number: h.row_number ?? null,\n    client_id: h.client_id,\n    asset_name: h.asset_name,\n    symbol,\n    asset_type: h.asset_type,\n    quantity,\n    avg_buy_price: avgBuy,\n    ltp,\n    invested,\n    current_value,\n    pnl,\n    pnl_pct,\n    price_available: hasPrice,\n    price_error: errors[symbol] || null\n  };\n});\n\nconst validHoldings = merged.filter(h =>\n  h.price_available &&\n  h.current_value !== null &&\n  h.pnl !== null &&\n  h.pnl_pct !== null\n);\n\nconst total_invested_all = merged.reduce((sum, h) => sum + Number(h.invested || 0), 0);\nconst total_invested_priced = validHoldings.reduce((sum, h) => sum + Number(h.invested || 0), 0);\nconst total_current_value = validHoldings.reduce((sum, h) => sum + Number(h.current_value || 0), 0);\nconst total_pnl = total_current_value - total_invested_priced;\nconst total_return_pct = total_invested_priced ? (total_pnl / total_invested_priced) * 100 : 0;\n\nconst sortedAsc = [...validHoldings].sort((a, b) => a.pnl_pct - b.pnl_pct);\nconst sortedDesc = [...validHoldings].sort((a, b) => b.pnl_pct - a.pnl_pct);\n\nconst weakest_performer = sortedAsc[0] || null;\nconst best_performer = sortedDesc[0] || null;\n\nconst missing_prices = merged\n  .filter(h => !h.price_available)\n  .map(h => ({\n    symbol: h.symbol,\n    asset_name: h.asset_name,\n    invested: h.invested,\n    reason: h.price_error || 'Price not available'\n  }));\n\nreturn [{\n  json: {\n    client_id: data.client_id,\n    client_name: data.client_name,\n    question: data.question,\n    risk_profile: data.risk_profile,\n    goal: data.goal,\n    tone: data.tone,\n    source_channel: data.source_channel,\n    received_at: data.received_at,\n    holdings: merged,\n    portfolio_summary: {\n      total_invested_all,\n      total_invested_priced,\n      total_current_value,\n      total_pnl,\n      total_return_pct,\n      priced_holdings_count: validHoldings.length,\n      missing_price_count: missing_prices.length\n    },\n    best_performer,\n    weakest_performer,\n    missing_prices\n  }\n}];"},"typeVersion":2},{"id":"d435ea0d-0ae1-4f66-85ba-43cbe60fdfb4","name":"Get Market Context","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[8240,2304],"parameters":{"url":"https://memic-nse-quotes-api.hf.space/summary","options":{"timeout":15000}},"typeVersion":4.4},{"id":"9bfee56f-8321-423a-ab81-0c58c55f80b5","name":"Attach Market Context","type":"n8n-nodes-base.code","position":[8464,2304],"parameters":{"jsCode":"const portfolio = $('Merge Portfolio Data').first().json;\nconst ctx = $input.first().json || {};\n\nconst market_context = {\n  nifty_change_pct: ctx.nifty_change_pct ?? null,\n  sensex_change_pct: ctx.sensex_change_pct ?? null,\n  market_tone: ctx.market_tone ?? 'not available',\n  summary: ctx.summary ?? 'Market context not available'\n};\n\nreturn [{\n  json: {\n    ...portfolio,\n    market_context\n  }\n}];"},"typeVersion":2},{"id":"8089e345-e8a0-42f0-b284-17aa798ca3e9","name":"Build AI Prompt","type":"n8n-nodes-base.code","position":[8688,2304],"parameters":{"jsCode":"const data = $input.first().json;\n\n          const holdingsText = (data.holdings || [])\n            .map(h => {\n              const invested = h.invested != null ? `₹${Number(h.invested).toFixed(2)}` : 'N/A';\n              const ltp = h.ltp != null ? `₹${Number(h.ltp).toFixed(2)}` : 'N/A';\n              const currentValue = h.current_value != null ? `₹${Number(h.current_value).toFixed(2)}` : 'N/A';\n              const pnl = h.pnl != null ? `₹${Number(h.pnl).toFixed(2)}` : 'N/A';\n              const pnlPct = h.pnl_pct != null ? `${Number(h.pnl_pct).toFixed(2)}%` : 'N/A';\n\n              return `- ${h.asset_name} (${h.symbol}): quantity ${h.quantity}, avg buy ₹${Number(h.avg_buy_price).toFixed(2)}, invested ${invested}, LTP ${ltp}, current value ${currentValue}, P&L ${pnl}, return ${pnlPct}, price available ${h.price_available ? 'yes' : 'no'}`;\n            })\n            .join('\\n');\n\n          const missingPricesText = (data.missing_prices || []).length\n            ? data.missing_prices\n                .map(x => `- ${x.asset_name} (${x.symbol}): invested ₹${Number(x.invested || 0).toFixed(2)}, reason: ${x.reason}`)\n                .join('\\n')\n            : 'None';\n\n          const prompt = `\nYou are a financial assistant.\n\nSTRICT RULES:\n- Use ONLY the numbers and facts provided below.\n- Never calculate new numbers on your own.\n- Never invent market reasons, company news or assumptions.\n- Never give buy/sell advice unless explicitly asked.\n- Keep the reply short, clear and client-friendly.\n- Maximum 4 short lines.\n- Reply in this order:\n  1. Overall portfolio summary\n  2. Best and weakest performer\n  3. Missing price note if applicable\n  4. Direct answer to the question\n\nClient profile:\nName: ${data.client_name || 'Client'}\nRisk profile: ${data.risk_profile || 'N/A'}\nGoal: ${data.goal || 'N/A'}\nTone: ${data.tone || 'simple'}\n\nClient question:\n${data.question}\n\nPortfolio summary:\n- Total invested across all holdings: ₹${Number(data.portfolio_summary.total_invested_all).toFixed(2)}\n- Total invested in priced holdings: ₹${Number(data.portfolio_summary.total_invested_priced).toFixed(2)}\n- Current value of priced holdings: ₹${Number(data.portfolio_summary.total_current_value).toFixed(2)}\n- Overall P&L on priced holdings: ₹${Number(data.portfolio_summary.total_pnl).toFixed(2)}\n- Return on priced holdings: ${Number(data.portfolio_summary.total_return_pct).toFixed(2)}%\n- Best performer: ${data.best_performer?.asset_name || 'N/A'} (${data.best_performer?.symbol || 'N/A'}), P&L ${data.best_performer?.pnl != null ? `₹${Number(data.best_performer.pnl).toFixed(2)}` : 'N/A'}, return ${data.best_performer?.pnl_pct != null ? `${Number(data.best_performer.pnl_pct).toFixed(2)}%` : 'N/A'}\n- Weakest performer: ${data.weakest_performer?.asset_name || 'N/A'} (${data.weakest_performer?.symbol || 'N/A'}), P&L ${data.weakest_performer?.pnl != null ? `₹${Number(data.weakest_performer.pnl).toFixed(2)}` : 'N/A'}, return ${data.weakest_performer?.pnl_pct != null ? `${Number(data.weakest_performer.pnl_pct).toFixed(2)}%` : 'N/A'}\n- Priced holdings count: ${data.portfolio_summary.priced_holdings_count}\n- Missing price count: ${data.portfolio_summary.missing_price_count}\n\nOptional market context:\n- Nifty change: ${data.market_context?.nifty_change_pct ?? 'N/A'}\n- Sensex change: ${data.market_context?.sensex_change_pct ?? 'N/A'}\n- Market tone: ${data.market_context?.market_tone ?? 'N/A'}\n- Market summary: ${data.market_context?.summary ?? 'N/A'}\n\nHoldings details:\n${holdingsText}\n\nMissing price holdings:\n${missingPricesText}\n          `.trim();\n\n          return [{\n            json: {\n              client_id: data.client_id,\n              client_name: data.client_name,\n              question: data.question,\n              source_channel: data.source_channel,\n              received_at: data.received_at,\n              prompt\n            }\n          }];"},"typeVersion":2},{"id":"052d0285-c7c7-492a-b3da-ebe5a3474651","name":"Generate AI Answer","type":"@n8n/n8n-nodes-langchain.googleGemini","onError":"continueRegularOutput","position":[8848,2304],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"models/gemini-3.1-flash-lite-preview","cachedResultName":"models/gemini-3.1-flash-lite-preview"},"options":{},"messages":{"values":[{"content":"={{ $json.prompt }}"}]},"builtInTools":{}},"credentials":{"googlePalmApi":{"id":"TnOa7bXrtfAIazjK","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1.1},{"id":"a4cc0070-579e-4953-b215-186445e120cb","name":"Extract AI Answer","type":"n8n-nodes-base.code","position":[9152,2304],"parameters":{"jsCode":"const parsed = $('Build AI Prompt').first().json;\nconst res = $input.first().json || {};\n\nconst reply =\n  res.content?.parts?.[0]?.text ||\n  res.candidates?.[0]?.content?.parts?.[0]?.text ||\n  res.text ||\n  null;\n\nif (!reply) {\n  return [{\n    json: {\n      success: false,\n      client_id: parsed.client_id,\n      question: parsed.question,\n      source_channel: parsed.source_channel,\n      received_at: parsed.received_at,\n      reply: null\n    }\n  }];\n}\n\nreturn [{\n  json: {\n    success: true,\n    client_id: parsed.client_id,\n    question: parsed.question,\n    source_channel: parsed.source_channel,\n    received_at: parsed.received_at,\n    reply: String(reply).trim()\n  }\n}];"},"typeVersion":2},{"id":"0d66b8f7-e422-434e-adb5-032c9a9c10d1","name":"Format Final Output","type":"n8n-nodes-base.set","position":[9328,2304],"parameters":{"mode":"raw","options":{},"jsonOutput":"={\n  \"success\": {{ $json.success }},\n  \"client_id\": \"{{$json.client_id}}\",\n  \"question\": \"{{$json.question}}\",\n  \"reply\": \"{{$json.reply}}\",\n  \"source_channel\": \"{{$json.source_channel}}\",\n  \"received_at\": \"{{$json.received_at}}\",\n  \"response_type\": \"portfolio_answer\",\n  \"timestamp\": $now.toISO()\n}"},"typeVersion":3.4},{"id":"4f21440d-a03d-408d-9e70-4274ee645c8b","name":"IF AI Reply Exists?","type":"n8n-nodes-base.if","position":[9488,2304],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"ai_success_check","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.success }}","rightValue":true}]}},"typeVersion":2.2},{"id":"67a023b7-9cad-4148-bc78-604d2f6ed1a5","name":"Build AI Failed Response","type":"n8n-nodes-base.code","position":[9712,2400],"parameters":{"jsCode":"const item = $input.first().json;\n\nreturn [{\n  json: {\n    status: 'failed',\n    error_stage: 'ai_generation',\n    action_taken: 'Stopped because AI reply was empty',\n    client_id: item.client_id || null,\n    question: item.question || null,\n    reply: 'AI could not generate a response right now. Please try again.',\n    source_channel: item.source_channel || 'chat',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"4966f532-b5ea-47b7-be03-4a255875632a","name":"Build Success Result","type":"n8n-nodes-base.code","position":[9712,2208],"parameters":{"jsCode":"const item = $input.first().json;\n\nreturn [{\n  json: {\n    status: 'success',\n    error_stage: null,\n    action_taken: 'Generated portfolio reply',\n    client_id: item.client_id,\n    question: item.question,\n    reply: item.reply,\n    source_channel: item.source_channel || 'chat',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"783bc341-c57a-4924-81eb-da1bfa42a788","name":"Log Result","type":"n8n-nodes-base.googleSheets","position":[9936,2592],"parameters":{"columns":{"value":{"reply":"={{ $json.reply }}","status":"={{ $json.status }}","question":"={{ $json.question }}","client_id":"={{ $json.client_id }}","timestamp":"={{ $json.timestamp }}","error_stage":"={{ $json.error_stage }}","action_taken":"={{ $json.action_taken }}","source_channel":"={{ $json.source_channel }}"},"schema":[{"id":"timestamp","type":"string","display":true,"required":false,"displayName":"timestamp","defaultMatch":false,"canBeUsedToMatch":true},{"id":"client_id","type":"string","display":true,"required":false,"displayName":"client_id","defaultMatch":false,"canBeUsedToMatch":true},{"id":"question","type":"string","display":true,"required":false,"displayName":"question","defaultMatch":false,"canBeUsedToMatch":true},{"id":"reply","type":"string","display":true,"required":false,"displayName":"reply","defaultMatch":false,"canBeUsedToMatch":true},{"id":"status","type":"string","display":true,"required":false,"displayName":"status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"action_taken","type":"string","display":true,"required":false,"displayName":"action_taken","defaultMatch":false,"canBeUsedToMatch":true},{"id":"error_stage","type":"string","display":true,"required":false,"displayName":"error_stage","defaultMatch":false,"canBeUsedToMatch":true},{"id":"source_channel","type":"string","display":true,"required":false,"displayName":"source_channel","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":1803741055,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM/edit#gid=1803741055","cachedResultName":"interaction_logs"},"documentId":{"__rl":true,"mode":"list","value":"1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Utb59F9XfxP6j--TdE1HOApUk8Gv8CTIS2_BK3voTHM/edit?usp=drivesdk","cachedResultName":"Portfolio_AI_System"}},"credentials":{"googleSheetsOAuth2Api":{"id":"eUZMZqnoN3N6wxJf","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"7a37330e-719d-4611-95b8-687edb9fe4fa","name":"Create Gmail Draft","type":"n8n-nodes-base.gmail","position":[9936,2784],"webhookId":"db1d7c87-c100-4df0-bc94-1b0807ca65d9","parameters":{"message":"={{ $json.reply }}","options":{},"subject":"={{ 'Portfolio reply for ' + ($json.client_id || 'client') }}","resource":"draft"},"credentials":{"gmailOAuth2":{"id":"kuYiVOOw6fCz9gdf","name":"Gmail account"}},"typeVersion":2.1},{"id":"7e1c0e4b-5ba7-4e88-8479-da78cf639741","name":"Return Final Output","type":"n8n-nodes-base.code","position":[10160,2688],"parameters":{"jsCode":"return [{\n  json: {\n    final_status: $json.status,\n    client_id: $json.client_id,\n    question: $json.question,\n    reply: $json.reply,\n    action_taken: $json.action_taken\n  }\n}];"},"typeVersion":2},{"id":"7206a880-de32-401c-81c9-81d0849118d6","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[5520,1888],"parameters":{"width":1184,"height":352,"content":"## Client Portfolio Assistant\n\n### How it works\nThis workflow takes a client message (e.g., \"C001: question\"), validates the format and identifies the client. It fetches client profile and holdings from Google Sheets, pulls live market prices and calculates portfolio metrics like total value, P&L and returns. Optional market context is added for better insights. An AI model then generates a short, accurate and client-friendly response based only on this data. All interactions are logged for tracking and reliability.\n\n### Setup steps\n1. Create Google Sheets with clients, holdings and logs.\n2. Connect Google Sheets credentials in n8n.\n3. Add live price API endpoint.\n4. Add market summary API (optional).\n5. Configure AI node (Gemini or HF).\n6. Test using: `C001: your question`"},"typeVersion":1},{"id":"d45905e9-459c-42d1-bb42-e606485af00f","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[5536,2432],"parameters":{"color":7,"width":624,"height":784,"content":"##  Input Handling & Validation\nThis section handles incoming chat messages and ensures they follow the correct format.\n\nIt extracts the client ID and question and checks for common issues like empty input or missing separators. If validation fails, the workflow immediately stops, logs the issue and returns a clean error response.\n\nThis keeps the rest of the workflow safe from bad data."},"typeVersion":1},{"id":"d2a9527e-e203-4c1c-8a0c-22d8a36e2097","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[6192,2336],"parameters":{"color":7,"width":832,"height":448,"content":"## Client & Portfolio Lookup\nHere, the workflow fetches client profile and holdings from Google Sheets using the client ID.\n\nIt also prepares stock symbols required for fetching live prices. If the client doesn’t exist or no holdings are found, the workflow stops early and returns a clear message.\n\nThis ensures only valid and complete data moves forward."},"typeVersion":1},{"id":"1a06b4de-8bd0-418d-a471-1eb1e0cd14d6","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[7264,2144],"parameters":{"color":7,"width":896,"height":432,"content":"##  Price Fetch & Portfolio Calculation\nThis part calls the live market API to fetch prices for all holdings.\n\nIt then merges this data with the portfolio and calculates key metrics like invested value, current value, profit/loss and returns. It also identifies the best and weakest performers and tracks any missing price data.\n\nThis step builds a complete and accurate portfolio snapshot."},"typeVersion":1},{"id":"b902a2fd-015f-4935-888b-e47ef4032091","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[8208,2096],"parameters":{"color":7,"width":1072,"height":432,"content":"## AI Answer Generation\nA structured prompt is created using portfolio data, client profile and optional market context.\n\nThe AI generates a short, clear response based strictly on the provided data. Rules are applied to avoid incorrect calculations or assumptions.\n\nThe final answer is extracted and cleaned before sending forward."},"typeVersion":1},{"id":"4110e681-918a-4655-8fab-4714acf574d5","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[9312,2000],"parameters":{"color":7,"width":896,"height":1040,"content":"##  Final Response & Logging\nThe workflow formats the final output with the reply, client details and status.\n\nIt can also log interactions or be extended to send responses to other systems like CRM, email or Slack.\n\nThis acts as the final delivery layer of the workflow."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"binaryMode":"separate","executionOrder":"v1"},"versionId":"4ea4fc78-6026-44ef-a217-03b3f05c2c70","connections":{"Log Result":{"main":[[{"node":"Return Final Output","type":"main","index":0}]]},"Build AI Prompt":{"main":[[{"node":"Generate AI Answer","type":"main","index":0}]]},"Get Live Prices":{"main":[[{"node":"Normalize Price Response","type":"main","index":0}]]},"IF Valid Input?":{"main":[[{"node":"Get Client Profile","type":"main","index":0}],[{"node":"Build Invalid Input Response","type":"main","index":0}]]},"Prepare Symbols":{"main":[[{"node":"IF Holdings Found?","type":"main","index":0}]]},"IF Client Found?":{"main":[[{"node":"Get Client Holdings","type":"main","index":0}],[{"node":"Build Client Not Found Response","type":"main","index":0}]]},"Extract AI Answer":{"main":[[{"node":"Format Final Output","type":"main","index":0}]]},"Log Invalid Input":{"main":[[{"node":"Return Invalid Response","type":"main","index":0}]]},"Create Gmail Draft":{"main":[[{"node":"Return Final Output","type":"main","index":0}]]},"Generate AI Answer":{"main":[[{"node":"Extract AI Answer","type":"main","index":0}]]},"Get Client Profile":{"main":[[{"node":"IF Client Found?","type":"main","index":0}]]},"Get Market Context":{"main":[[{"node":"Attach Market Context","type":"main","index":0}]]},"IF Holdings Found?":{"main":[[{"node":"Get Live Prices","type":"main","index":0}],[{"node":"Build No Holdings Response","type":"main","index":0}]]},"Format Final Output":{"main":[[{"node":"IF AI Reply Exists?","type":"main","index":0}]]},"Get Client Holdings":{"main":[[{"node":"Prepare Symbols","type":"main","index":0}]]},"IF AI Reply Exists?":{"main":[[{"node":"Build Success Result","type":"main","index":0}],[{"node":"Build AI Failed Response","type":"main","index":0}]]},"Build Success Result":{"main":[[{"node":"Log Result","type":"main","index":0}]]},"IF Price API Worked?":{"main":[[{"node":"Merge Portfolio Data","type":"main","index":0}],[{"node":"Build API Failed Response","type":"main","index":0}]]},"Merge Portfolio Data":{"main":[[{"node":"Get Market Context","type":"main","index":0}]]},"Parse Client Message":{"main":[[{"node":"IF Valid Input?","type":"main","index":0}]]},"Attach Market Context":{"main":[[{"node":"Build AI Prompt","type":"main","index":0}]]},"Build AI Failed Response":{"main":[[{"node":"Log Result","type":"main","index":0}]]},"Normalize Price Response":{"main":[[{"node":"IF Price API Worked?","type":"main","index":0}]]},"Build API Failed Response":{"main":[[{"node":"Log Result","type":"main","index":0}]]},"Build No Holdings Response":{"main":[[{"node":"Log Result","type":"main","index":0}]]},"When chat message received":{"main":[[{"node":"Parse Client Message","type":"main","index":0}]]},"Build Invalid Input Response":{"main":[[{"node":"Log Invalid Input","type":"main","index":0}]]},"Build Client Not Found Response":{"main":[[{"node":"Log Result","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":36,"nodeTypes":{"n8n-nodes-base.if":{"count":5},"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":15},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.stickyNote":{"count":6},"n8n-nodes-base.httpRequest":{"count":2},"n8n-nodes-base.googleSheets":{"count":4},"@n8n/n8n-nodes-langchain.chatTrigger":{"count":1},"@n8n/n8n-nodes-langchain.googleGemini":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"WeblineIndia","username":"weblineindia","bio":"A Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.","verified":true,"links":["https://www.weblineindia.com/hire-n8n-developers/"],"avatar":"https://gravatar.com/avatar/a229d43aefca4588581583c58bb37b4773aebbdf4c1fef86a08bb1d38eae91fa?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"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-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/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"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/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"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/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"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-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/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.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"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":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"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/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting 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/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/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/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"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/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"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/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/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.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":356,"icon":"file:gmail.svg","name":"n8n-nodes-base.gmail","codex":{"data":{"alias":["email","human","form","wait","hitl","approval"],"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/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"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-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/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"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/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"transform\"]","defaults":{"name":"Gmail"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"},"displayName":"Gmail","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"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":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":1247,"icon":"fa:comments","name":"@n8n/n8n-nodes-langchain.chatTrigger","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.chattrigger/"}]},"categories":["Core Nodes","Langchain"]}},"group":"[\"trigger\"]","defaults":{"name":"When chat message received"},"iconData":{"icon":"comments","type":"icon"},"displayName":"Chat Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"},{"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":[]}}