{"workflow":{"id":14036,"name":"Maintain RAG embeddings with OpenAI, Postgres and auto drift rollback","views":62,"recentViews":1,"totalViews":62,"createdAt":"2026-03-14T09:34:40.228Z","description":"## Overview\n\nThis workflow implements a **self-healing Retrieval-Augmented Generation (RAG) maintenance system** that automatically updates document embeddings, evaluates retrieval quality, detects embedding drift, and safely promotes or rolls back embedding updates.\n\nMaintaining high-quality embeddings in production RAG systems is difficult. When source documents change or embedding models evolve, updates can accidentally degrade retrieval quality or introduce semantic drift.\n\nThis workflow solves that problem by introducing an **automated evaluation and rollback pipeline** for embeddings.\n\nIt periodically checks for document changes, regenerates embeddings for updated content, evaluates the new embeddings against a set of predefined **golden test questions**, and compares the results with the currently active embeddings.\n\nQuality metrics such as **Recall@K, keyword similarity, and answer variance** are calculated, while embedding vectors are also analyzed for **semantic drift** using cosine distance.\n\nIf the new embeddings outperform the current ones and remain within acceptable drift limits, they are automatically promoted to production. Otherwise, the system safely rolls back or flags the update for manual review.\n\nThis creates a **robust, production-safe RAG lifecycle automation system**.\n\n---\n\n## How It Works\n\n### 1. Workflow Trigger\nThe workflow can start in two ways:\n\n- **Scheduled trigger** running daily\n- **Webhook trigger** when source documents change\n\nBoth paths lead to a centralized configuration node that defines parameters such as chunk size, thresholds, and notification settings.\n\n### 2. Document Retrieval & Change Detection\nDocuments are fetched from the configured source (GitHub, Drive, Confluence, or other APIs).\n\nThe workflow then:\n- Splits documents into deterministic chunks\n- Computes SHA-256 hashes for each chunk\n- Compares them with previously stored hashes in Postgres\n\nOnly **new or modified chunks** proceed for embedding generation, which significantly reduces processing cost.\n\n### 3. Embedding Generation\nChanged chunks are processed through:\n\n- Recursive text splitting\n- Document loading\n- OpenAI embedding generation\n\nThese embeddings are stored as a **candidate vector store** rather than immediately replacing the production embeddings.\n\nMetadata about the embedding version is stored in Postgres.\n\n### 4. Golden Question Evaluation\nA set of **golden test questions** stored in the database is used to evaluate retrieval quality.\n\nTwo AI agents are used:\n\n- One queries the **candidate embeddings**\n- One queries the **current production embeddings**\n\nBoth generate answers using retrieved context.\n\n### 5. Quality Metrics Calculation\nThe workflow calculates several evaluation metrics:\n\n- **Recall@K** to measure retrieval effectiveness\n- **Keyword similarity** between generated answers and expected answers\n- **Answer length variance** to detect inconsistencies\n\nThese are combined into a **weighted quality score**.\n\n### 6. Embedding Drift Detection\nThe workflow compares embedding vectors between versions using **cosine distance**.\n\nThis identifies **semantic drift**, which may occur due to:\n\n- embedding model updates\n- chunking changes\n- document structure changes\n\n### 7. Promotion or Rollback\nThe workflow checks two conditions:\n\n1. Quality score exceeds the configured threshold\n2. Embedding drift remains below the drift threshold\n\nIf both conditions pass:\n\n- The candidate embeddings are **promoted to active**\n\nIf not:\n\n- The system **rolls back to the previous embeddings**\n- Or **flags the update for human review**\n\n### 8. Notifications\nA webhook notification is sent with:\n\n- update status\n- quality score\n- drift score\n- timestamp\n\nThis allows teams to monitor embedding health automatically.\n\n---\n\n## Setup Instructions\n\n1. **Configure Document Source**\n\nEdit the **Workflow Configuration** node and set:\n\n- `documentSourceUrl`  \n  API endpoint or file source containing your documents.\n\nExamples include:\n- GitHub repository API\n- Google Drive export API\n- Confluence REST API\n\n---\n\n2. **Configure Postgres Database**\n\nCreate the following tables in your Postgres database:\n\n- `document_chunks`\n- `embeddings`\n- `embedding_versions`\n- `golden_questions`\n\nThese tables store chunk hashes, embedding vectors, version metadata, and evaluation questions.\n\nConnect the **Postgres nodes** using your database credentials.\n\n---\n\n3. **Add OpenAI Credentials**\n\nConfigure credentials for:\n\n- **OpenAI Embeddings**\n- **OpenAI Chat Model**\n\nThese are used for generating embeddings and answering evaluation questions.\n\n---\n\n4. **Populate Golden Questions**\n\nInsert evaluation questions into the `golden_questions` table.\n\nEach record should include:\n\n- `question_text`\n- expected passages\n- expected answer keywords\n\nThese questions represent critical queries your RAG system must answer correctly.\n\n---\n\n5. **Configure Notification Webhook**\n\nAdd a Slack or Teams webhook URL in the configuration node.\n\nNotifications will be sent whenever:\n\n- embeddings are promoted\n- embeddings are rolled back\n- manual review is required\n\n---\n\n6. **Adjust Quality Thresholds**\n\nIn the configuration node you can modify:\n\n- `qualityThreshold`\n- `driftThreshold`\n- `chunkSize`\n- `chunkOverlap`\n\nThese parameters control the sensitivity of the evaluation system.\n\n---\n\n## Use Cases\n\n### Production RAG Monitoring\nAutomatically evaluate and update embeddings in production knowledge systems without risking degraded results.\n\n### Continuous Knowledge Base Updates\nKeep embeddings synchronized with frequently changing documentation, repositories, or internal knowledge bases.\n\n### Safe Embedding Model Upgrades\nTest new embedding models against production data before promoting them.\n\n### AI System Reliability\nDetect retrieval regressions before they affect end users.\n\n### Enterprise AI Governance\nProvide automated evaluation and rollback capabilities for mission-critical RAG deployments.\n\n---\n\n## Requirements\n\nThis workflow requires the following services:\n\n- **n8n**\n- **Postgres Database**\n- **OpenAI API**\n\nRecommended integrations:\n\n- Slack or Microsoft Teams (for notifications)\n\nRequired nodes include:\n\n- Schedule Trigger\n- Webhook\n- HTTP Request\n- Postgres\n- Compare Datasets\n- Code nodes\n- OpenAI Embeddings\n- OpenAI Chat Model\n- Vector Store nodes\n- AI Agent nodes\n\n---\n\n## Summary\n\nThis workflow provides a **fully automated self-healing RAG infrastructure** for maintaining embedding quality in production systems.\n\nBy combining **change detection, golden-question evaluation, embedding drift analysis, and automatic rollback**, it ensures that retrieval performance improves safely over time.\n\nIt is ideal for teams running **production AI assistants, knowledge bases, or internal search systems** that depend on high-quality vector embeddings.","workflow":{"meta":{"instanceId":"48aac30adfc5487a33ef16e0e958096f27cef40df3ed0febcbe1ca199e789786"},"nodes":[{"id":"e5d849d1-ca42-457f-8bf6-9afce5e203cd","name":"Daily RAG Maintenance Schedule","type":"n8n-nodes-base.scheduleTrigger","position":[-2592,544],"parameters":{"rule":{"interval":[{"triggerAtHour":2}]}},"typeVersion":1.3},{"id":"46c10059-edfb-410f-afd0-c5841f9eb0db","name":"Source Change Webhook","type":"n8n-nodes-base.webhook","position":[-2592,720],"webhookId":"fdb7663c-2a3a-42bc-993a-cbb7ed1c7fd6","parameters":{"path":"rag-update","options":{},"httpMethod":"POST"},"typeVersion":2.1},{"id":"ebd11e90-ec01-4770-9050-df2590234763","name":"Workflow Configuration","type":"n8n-nodes-base.set","position":[-2176,624],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"documentSourceUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Document source URL (GitHub, Drive, Confluence)__>"},{"id":"id-2","name":"chunkSize","type":"number","value":1000},{"id":"id-3","name":"chunkOverlap","type":"number","value":200},{"id":"id-4","name":"qualityThreshold","type":"number","value":0.85},{"id":"id-5","name":"driftThreshold","type":"number","value":0.15},{"id":"id-6","name":"notificationWebhook","type":"string","value":"<__PLACEHOLDER_VALUE__Slack/Teams webhook URL for notifications__>"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"9a9337b0-f69e-4a48-b6b2-41671d4ce27f","name":"Fetch Documents from Source","type":"n8n-nodes-base.httpRequest","position":[-1888,544],"parameters":{"url":"={{ $('Workflow Configuration').first().json.documentSourceUrl }}","options":{"response":{"response":{"responseFormat":"json"}}}},"typeVersion":4.3},{"id":"75dcd272-6cde-4182-a737-5878dfb6ef6a","name":"Chunk Documents & Compute Hash","type":"n8n-nodes-base.code","position":[-1712,544],"parameters":{"jsCode":"// Get configuration from Workflow Configuration node\nconst config = $('Workflow Configuration').first().json;\nconst chunkSize = config.chunkSize || 1000;\nconst chunkOverlap = config.chunkOverlap || 200;\nconst sourceRevision = config.sourceRevision || 'v1';\n\n// Get documents from previous node\nconst documents = $input.all();\n\n// Function to calculate SHA-256 hash\nconst crypto = require('crypto');\nfunction calculateHash(text) {\n  return crypto.createHash('sha256').update(text).digest('hex');\n}\n\n// Function to chunk text with deterministic splitting\nfunction chunkText(text, size, overlap) {\n  const chunks = [];\n  let start = 0;\n  \n  while (start < text.length) {\n    const end = Math.min(start + size, text.length);\n    const chunk = text.substring(start, end);\n    chunks.push(chunk);\n    \n    if (end >= text.length) break;\n    start += size - overlap;\n  }\n  \n  return chunks;\n}\n\n// Process all documents and create chunks\nconst results = [];\nconst timestamp = new Date().toISOString();\n\nfor (const doc of documents) {\n  const content = doc.json.content || doc.json.text || JSON.stringify(doc.json);\n  const chunks = chunkText(content, chunkSize, chunkOverlap);\n  \n  chunks.forEach((chunk, index) => {\n    const hash = calculateHash(chunk);\n    const chunkId = `${doc.json.id || 'doc'}_chunk_${index}`;\n    \n    results.push({\n      chunkId: chunkId,\n      content: chunk,\n      hash: hash,\n      chunkSize: chunkSize,\n      chunkOverlap: chunkOverlap,\n      sourceRevision: sourceRevision,\n      timestamp: timestamp\n    });\n  });\n}\n\nreturn results.map(item => ({ json: item }));","notice":"Splits documents into small pieces and creates a fingerprint (hash) for each piece"},"typeVersion":2},{"id":"e2465a66-7ebc-4397-821b-1e3db90bb3e1","name":"Fetch Previous Chunk Hashes","type":"n8n-nodes-base.postgres","position":[-1808,784],"parameters":{"query":"SELECT chunk_id, content_hash, embedding_version FROM document_chunks WHERE is_active = true","options":{},"operation":"executeQuery"},"typeVersion":2.6},{"id":"f3c313cc-22bd-43d5-8e2d-711dcb51ca45","name":"Detect Changed Chunks","type":"n8n-nodes-base.compareDatasets","position":[-1440,608],"parameters":{"options":{},"fuzzyCompare":true,"mergeByFields":{"values":[{"field1":"hash","field2":"content_hash"}]}},"typeVersion":2.3},{"id":"cc6d43e4-ce35-46dc-89e0-3535da38f600","name":"OpenAI Embeddings","type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","position":[-528,1136],"parameters":{"notice":"Converts text into numbers (embeddings) that AI can understand","options":{}},"typeVersion":1.2},{"id":"7b6b95f5-6b60-4f06-86fd-866759f00ae5","name":"Recursive Text Splitter","type":"@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter","position":[-1088,960],"parameters":{"notice":"Splits text into chunks for the AI to process","options":{},"chunkSize":"={{ $('Workflow Configuration').first().json.chunkSize }}","chunkOverlap":"={{ $('Workflow Configuration').first().json.chunkOverlap }}"},"typeVersion":1},{"id":"a8c7e05c-fe84-4de9-bdaa-f33edd20c288","name":"Document Loader","type":"@n8n/n8n-nodes-langchain.documentDefaultDataLoader","position":[-1120,768],"parameters":{"notice":"Loads documents and prepares them for embedding","options":{},"textSplittingMode":"custom"},"typeVersion":1.1},{"id":"a6d72254-9a77-401c-b86d-1b4c58030403","name":"New Vector Store (Candidate)","type":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","position":[-1104,576],"parameters":{"mode":"insert","memoryKey":{"__rl":true,"mode":"list","value":"vector_store_key"}},"typeVersion":1.3},{"id":"2959fcfd-5b93-4468-b295-4a87fcf55a4c","name":"Store Embedding Metadata","type":"n8n-nodes-base.code","position":[-800,576],"parameters":{"jsCode":"// Extract embedding metadata including model name, version, timestamp, and source revision\n\nconst items = $input.all();\n\n// Get configuration from Workflow Configuration node\nconst config = $('Workflow Configuration').first().json;\n\n// Extract metadata\nconst embeddingModel = config.embeddingModel || 'text-embedding-ada-002';\nconst modelVersion = config.modelVersion || 'v2';\nconst embeddingTimestamp = new Date().toISOString();\nconst sourceRevision = config.sourceRevision || $('Fetch Documents from Source').first().json.revision || 'latest';\nconst chunkCount = items.length;\n\n// Return metadata object\nreturn [{\n  json: {\n    embeddingModel: embeddingModel,\n    modelVersion: modelVersion,\n    embeddingTimestamp: embeddingTimestamp,\n    sourceRevision: sourceRevision,\n    chunkCount: chunkCount\n  }\n}];"},"typeVersion":2},{"id":"d221d657-735f-458b-89d6-b9bee5203678","name":"Save Embedding Version Metadata","type":"n8n-nodes-base.postgres","position":[-608,608],"parameters":{"table":{"__rl":true,"mode":"name","value":"embedding_versions"},"schema":{"__rl":true,"mode":"list","value":"public"},"columns":{"value":{"chunk_count":"={{ $json.chunk_count }}","is_candidate":true,"model_version":"={{ $json.model_version }}","embedding_model":"={{ $json.embedding_model }}","source_revision":"={{ $json.source_revision }}","embedding_timestamp":"={{ $json.embedding_timestamp }}"},"mappingMode":"defineBelow"},"options":{}},"typeVersion":2.6},{"id":"3f59580c-fd71-4d0f-a207-3e2abe4f931c","name":"Fetch Golden Questions","type":"n8n-nodes-base.postgres","position":[-272,560],"parameters":{"query":"SELECT question_id, question_text, expected_passages, expected_answer_keywords FROM golden_questions WHERE is_active = true","options":{},"operation":"executeQuery"},"typeVersion":2.6},{"id":"80ea7d22-0593-4381-9ed5-ce11efd2be2f","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-64,336],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini"},"options":{},"builtInTools":{}},"typeVersion":1.3},{"id":"65567321-858a-46fa-a1b8-e59ce5e7304f","name":"Fetch Previous Embeddings","type":"n8n-nodes-base.postgres","position":[-272,736],"parameters":{"query":"SELECT embedding_vector, chunk_id FROM embeddings WHERE version_id = (SELECT id FROM embedding_versions WHERE is_active = true LIMIT 1)","options":{},"operation":"executeQuery"},"typeVersion":2.6},{"id":"b3acc41b-0d1c-4d01-8408-314a53ffc44c","name":"Calculate Quality Metrics","type":"n8n-nodes-base.code","position":[464,560],"parameters":{"jsCode":"// Calculate quality metrics comparing new vs old answers\nconst items = $input.all();\n\n// Separate new and old answers\nconst newAnswers = items.filter(item => item.json.answerType === 'new');\nconst oldAnswers = items.filter(item => item.json.answerType === 'old');\n\n// Initialize metrics\nlet totalRecallAtK = 0;\nlet totalSimilarityScore = 0;\nlet totalAnswerLengthVariance = 0;\nconst k = 5; // Top-k passages to consider\n\n// Process each question\nfor (let i = 0; i < newAnswers.length; i++) {\n  const newAnswer = newAnswers[i].json;\n  const oldAnswer = oldAnswers[i].json;\n  \n  // Calculate Recall@K - check if expected passages were retrieved\n  const expectedPassages = newAnswer.expectedPassages || [];\n  const retrievedPassages = newAnswer.retrievedPassages || [];\n  const topKRetrieved = retrievedPassages.slice(0, k);\n  \n  let retrievedCount = 0;\n  for (const expected of expectedPassages) {\n    if (topKRetrieved.some(retrieved => retrieved.includes(expected))) {\n      retrievedCount++;\n    }\n  }\n  \n  const recallAtK = expectedPassages.length > 0 ? retrievedCount / expectedPassages.length : 0;\n  totalRecallAtK += recallAtK;\n  \n  // Calculate similarity score between answer and expected keywords\n  const expectedKeywords = newAnswer.expectedKeywords || [];\n  const answerText = (newAnswer.answer || '').toLowerCase();\n  \n  let keywordMatches = 0;\n  for (const keyword of expectedKeywords) {\n    if (answerText.includes(keyword.toLowerCase())) {\n      keywordMatches++;\n    }\n  }\n  \n  const similarityScore = expectedKeywords.length > 0 ? keywordMatches / expectedKeywords.length : 0;\n  totalSimilarityScore += similarityScore;\n  \n  // Calculate answer length variance\n  const newLength = (newAnswer.answer || '').length;\n  const oldLength = (oldAnswer.answer || '').length;\n  const avgLength = (newLength + oldLength) / 2;\n  const lengthVariance = avgLength > 0 ? Math.abs(newLength - oldLength) / avgLength : 0;\n  totalAnswerLengthVariance += lengthVariance;\n}\n\nconst numQuestions = newAnswers.length || 1;\n\n// Calculate average metrics\nconst avgRecallAtK = totalRecallAtK / numQuestions;\nconst avgSimilarityScore = totalSimilarityScore / numQuestions;\nconst avgAnswerLengthVariance = totalAnswerLengthVariance / numQuestions;\n\n// Calculate weighted quality score\n// Higher recall and similarity = better, lower variance = better\nconst qualityScore = (\n  (avgRecallAtK * 0.4) + \n  (avgSimilarityScore * 0.4) + \n  ((1 - avgAnswerLengthVariance) * 0.2)\n);\n\nreturn [\n  {\n    json: {\n      recallAtK: avgRecallAtK,\n      similarityScore: avgSimilarityScore,\n      answerLengthVariance: avgAnswerLengthVariance,\n      qualityScore: qualityScore,\n      numQuestionsEvaluated: numQuestions,\n      timestamp: new Date().toISOString()\n    }\n  }\n];","notice":"Compares new vs old answers to see which is better (recall, similarity, length)"},"typeVersion":2},{"id":"5c3f669c-f827-4d1d-ab6c-0683eb23d368","name":"Calculate Embedding Drift","type":"n8n-nodes-base.code","position":[688,560],"parameters":{"jsCode":"// Calculate Embedding Drift between old and new embeddings\n// This compares embedding vectors to detect semantic drift\n\nconst items = $input.all();\n\n// Helper function to calculate cosine distance between two vectors\nfunction cosineDistance(vecA, vecB) {\n  if (!vecA || !vecB || vecA.length !== vecB.length) {\n    return null;\n  }\n  \n  let dotProduct = 0;\n  let normA = 0;\n  let normB = 0;\n  \n  for (let i = 0; i < vecA.length; i++) {\n    dotProduct += vecA[i] * vecB[i];\n    normA += vecA[i] * vecA[i];\n    normB += vecB[i] * vecB[i];\n  }\n  \n  normA = Math.sqrt(normA);\n  normB = Math.sqrt(normB);\n  \n  if (normA === 0 || normB === 0) {\n    return null;\n  }\n  \n  const cosineSimilarity = dotProduct / (normA * normB);\n  return 1 - cosineSimilarity; // Convert similarity to distance\n}\n\n// Fetch embedding vectors from both versions\nconst oldEmbeddings = items.filter(item => item.json.version === 'old').map(item => item.json.embedding);\nconst newEmbeddings = items.filter(item => item.json.version === 'new').map(item => item.json.embedding);\n\n// Calculate drift scores\nconst driftScores = [];\n\nfor (let i = 0; i < Math.min(oldEmbeddings.length, newEmbeddings.length); i++) {\n  const distance = cosineDistance(oldEmbeddings[i], newEmbeddings[i]);\n  if (distance !== null) {\n    driftScores.push(distance);\n  }\n}\n\n// Calculate statistics\nconst avgDrift = driftScores.length > 0 \n  ? driftScores.reduce((sum, score) => sum + score, 0) / driftScores.length \n  : 0;\n\nconst maxDrift = driftScores.length > 0 \n  ? Math.max(...driftScores) \n  : 0;\n\n// Get drift threshold from workflow configuration\nconst config = $('Workflow Configuration').first().json;\nconst driftThreshold = config.driftThreshold || 0.15; // Default threshold\n\n// Return drift analysis\nreturn [{\n  json: {\n    driftScore: avgDrift,\n    maxDrift: maxDrift,\n    avgDrift: avgDrift,\n    driftThreshold: driftThreshold,\n    driftDetected: avgDrift > driftThreshold,\n    numComparisons: driftScores.length,\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"8b968fe4-643a-456e-9203-b8ed6b55fa72","name":"Quality Improved?","type":"n8n-nodes-base.if","position":[912,560],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"id-1","operator":{"type":"number","operation":"gt"},"leftValue":"={{ $json.qualityScore }}","rightValue":"={{ $('Workflow Configuration').first().json.qualityThreshold }}"},{"id":"id-2","operator":{"type":"number","operation":"lt"},"leftValue":"={{ $json.driftScore }}","rightValue":"={{ $('Workflow Configuration').first().json.driftThreshold }}"}]}},"typeVersion":2.3},{"id":"59d710fc-e69a-4579-8481-99820b6f7906","name":"Promote New Embeddings","type":"n8n-nodes-base.postgres","position":[1264,336],"parameters":{"query":"UPDATE embedding_versions SET is_active = true, is_candidate = false WHERE id = (SELECT id FROM embedding_versions WHERE is_candidate = true ORDER BY embedding_timestamp DESC LIMIT 1); UPDATE embedding_versions SET is_active = false WHERE is_candidate = false AND is_active = true;","options":{},"operation":"executeQuery"},"typeVersion":2.6},{"id":"5bd21c63-c692-46ba-85c9-375d058d44df","name":"Rollback to Previous Embeddings","type":"n8n-nodes-base.postgres","position":[1264,528],"parameters":{"query":"DELETE FROM embedding_versions WHERE is_candidate = true; UPDATE embedding_versions SET is_active = true WHERE id = (SELECT id FROM embedding_versions WHERE is_active = false ORDER BY embedding_timestamp DESC LIMIT 1);","options":{},"operation":"executeQuery"},"typeVersion":2.6},{"id":"fe56b7a7-9b48-4027-b2be-671e7a5c8087","name":"Flag for Human Review","type":"n8n-nodes-base.set","position":[1264,704],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"status","type":"string","value":"NEEDS_REVIEW"},{"id":"id-2","name":"reason","type":"string","value":"Quality metrics ambiguous - manual review required"},{"id":"id-3","name":"qualityScore","type":"number","value":"={{ $json.qualityScore }}"},{"id":"id-4","name":"driftScore","type":"number","value":"={{ $json.driftScore }}"},{"id":"id-5","name":"stickyNote","type":"string","value":"Results unclear - needs human to decide"}]}},"typeVersion":3.4},{"id":"2f1c22b3-3b65-49f5-8589-07cb9f1275aa","name":"Send Notification","type":"n8n-nodes-base.httpRequest","position":[1616,496],"parameters":{"url":"={{ $('Workflow Configuration').first().json.notificationWebhook }}","method":"POST","options":{},"sendBody":true,"bodyParameters":{"parameters":[{"name":"status","value":"={{ $('Quality Improved?').item.json.status || 'unknown' }}"},{"name":"message","value":"={{ $('Promote New Embeddings').item ? 'Embeddings promoted' : ($('Rollback to Previous Embeddings').item ? 'Embeddings rolled back' : 'Manual review required') }}"},{"name":"qualityScore","value":"={{ $('Calculate Quality Metrics').first().json.qualityScore }}"},{"name":"driftScore","value":"={{ $('Calculate Embedding Drift').first().json.driftScore }}"},{"name":"timestamp","value":"={{ new Date().toISOString() }}"}]}},"typeVersion":4.3},{"id":"926483cd-5885-4965-8041-52249e122a34","name":"Generate Answers (New)","type":"@n8n/n8n-nodes-langchain.agent","position":[32,-96],"parameters":{"text":"={{ $json.question_text }}","options":{"systemMessage":"You are a RAG quality testing assistant. Answer the question using the vector store retrieval tool. Provide a detailed answer based on the retrieved context."},"promptType":"define"},"typeVersion":3},{"id":"8ccd53ea-448c-4ac8-83cb-f3b1569886d0","name":"Generate Answers (Old)","type":"@n8n/n8n-nodes-langchain.agent","position":[32,720],"parameters":{"text":"={{ $json.question_text }}","options":{"systemMessage":"You are a RAG quality testing assistant. Answer the question using the vector store retrieval tool. Provide a detailed answer based on the retrieved context."},"promptType":"define"},"typeVersion":3},{"id":"ea0fdd00-42ef-4cf1-8717-31878250a696","name":"Query New Vector Store (Tool)","type":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","position":[112,272],"parameters":{"mode":"retrieve-as-tool","memoryKey":{"__rl":true,"mode":"list","value":"vector_store_key"},"toolDescription":"Searches the NEW embeddings to find relevant info"},"typeVersion":1.3},{"id":"10b00af5-e40b-434b-9f8a-12423c457ec9","name":"Query Old Vector Store (Tool)","type":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","position":[32,944],"parameters":{"mode":"retrieve-as-tool","memoryKey":{"__rl":true,"mode":"list","value":"vector_store_key"},"toolDescription":"Searches the OLD embeddings to find relevant info"},"typeVersion":1.3},{"id":"4fff807d-8058-4315-bf37-57fc21e0b51d","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[416,272],"parameters":{"color":7,"width":400,"height":464,"content":"## Retrieval Quality Evaluation\n\nThis step evaluates answers generated from the new and old embeddings.\n\nMetrics calculated include:\n• Recall@K for retrieved passages\n• Keyword similarity in answers\n• Answer length variance\n\nThese metrics are combined into a weighted quality score used to determine if the new embeddings improve RAG performance."},"typeVersion":1},{"id":"22c2e5d7-ba09-4287-87ec-692f038b063b","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-656,1024],"parameters":{"color":7,"width":368,"height":256,"content":"## OpenAI Embeddings"},"typeVersion":1},{"id":"65a88fe4-9094-4166-b1c0-05facfaddbdf","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[48,112],"parameters":{"color":7,"width":336,"height":256,"content":"## Vector Store Retrieval Tools\n\nThese vector store tools allow AI agents to retrieve relevant context from embeddings.\nQuery New Vector Store searches candidate embeddings."},"typeVersion":1},{"id":"8346cd65-581b-43ac-aa4d-8359584c625d","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-80,-256],"parameters":{"color":7,"width":384,"height":352,"content":"## RAG Answer Generation\n\nThis agents answer the same questions using different vector stores.\nOne agent queries the new candidate embeddings."},"typeVersion":1},{"id":"f925fc28-3bc9-4a90-96dc-7b0f52368a8d","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[1536,384],"parameters":{"color":7,"width":288,"height":272,"content":"A notification is then sent through the configured webhook to inform the team about the update status."},"typeVersion":1},{"id":"ccc28ddf-cd78-4160-8e3b-dd853bfc5f50","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1120,192],"parameters":{"color":7,"width":384,"height":672,"content":" ## Deployment Outcome\n\nBased on evaluation results, the workflow either promotes the new embeddings, rolls back to the previous version, or flags the update for manual review."},"typeVersion":1},{"id":"8321cb20-23f8-409e-bc20-9e4e5f0a8060","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-688,464],"parameters":{"color":7,"width":656,"height":496,"content":"## Golden Question Evaluation\n\nThe system runs predefined golden questions against both the new and old vector stores.\nAI agents generate answers using retrieved context so the workflow can evaluate retrieval and answer quality."},"typeVersion":1},{"id":"af796be8-4449-47d5-9ffb-882b1278bc37","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1136,448],"parameters":{"color":7,"width":304,"height":736,"content":"## Embedding Creation\n\nChanged document chunks are embedded using OpenAI embeddings."},"typeVersion":1},{"id":"84cbef0e-1d93-440e-9bc9-e5e310df8389","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[-1520,368],"parameters":{"color":7,"width":320,"height":576,"content":"##Chunk Change Detection\n\nNew document chunk hashes are compared with hashes stored in Postgres."},"typeVersion":1},{"id":"049e6eb0-c276-49fb-b188-6ed8a568249d","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[16,560],"parameters":{"color":7,"width":368,"height":528,"content":"## RAG Answer Generation\n\nThis agents answer the same questions using existing vector stores.\nOne agent queries the old candidate embeddings"},"typeVersion":1},{"id":"18631d03-add9-43d2-ba34-47e86af6cc79","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[-1968,336],"parameters":{"color":7,"width":384,"height":576,"content":"## Document Retrieval & Chunking\n\nDocuments are fetched from the configured source and split into deterministic chunks.\nEach chunk receives a SHA-256 hash to detect content changes and ensure only modified chunks are reprocessed."},"typeVersion":1},{"id":"f178914d-4ac1-4941-a6df-fab448ea6c68","name":"Sticky Note14","type":"n8n-nodes-base.stickyNote","position":[-2688,384],"parameters":{"color":7,"width":672,"height":528,"content":"## Workflow Trigger & Config\n\nThis section starts the workflow via schedule or webhook trigger.\nIt defines key parameters such as document source URL, chunk size, overlap, quality threshold, drift threshold, and notification webhook used throughout the workflow."},"typeVersion":1},{"id":"ac724435-1642-4bc8-a66c-47f95dcc45ba","name":"Sticky Note13","type":"n8n-nodes-base.stickyNote","position":[848,464],"parameters":{"color":7,"height":240,"content":"## compare scores"},"typeVersion":1},{"id":"ec692a1c-7ff4-46bf-8798-29752574ac24","name":"Sticky Note15","type":"n8n-nodes-base.stickyNote","position":[-3392,464],"parameters":{"width":576,"height":544,"content":" This workflow maintains a self-healing Retrieval-Augmented Generation (RAG) system by automatically updating document embeddings, evaluating quality, detecting embedding drift, and safely promoting or rolling back model updates.\n\nHow it works\n\nThe workflow runs on a daily schedule or webhook trigger when source documents change.\nDocuments are fetched from a configured source, chunked deterministically, and hashed to detect modified content.\n\nOnly changed chunks are embedded using OpenAI embeddings and stored as a candidate embedding version.\n\nThe system then evaluates the candidate embeddings by asking a set of golden test questions. Answers generated using the new embeddings are compared against answers from the current active embeddings.\n\nQuality metrics such as Recall@K, keyword similarity, and answer variance are calculated. The workflow also measures embedding drift using cosine distance between embedding vectors.\n\nIf quality improves and drift is acceptable, the candidate embeddings are promoted. Otherwise, the system rolls back to the previous embeddings or flags the update for manual review.\n\n"},"typeVersion":1}],"pinData":{},"connections":{"Document Loader":{"ai_document":[[{"node":"New Vector Store (Candidate)","type":"ai_document","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Generate Answers (New)","type":"ai_languageModel","index":0},{"node":"Generate Answers (Old)","type":"ai_languageModel","index":0}]]},"OpenAI Embeddings":{"ai_embedding":[[{"node":"New Vector Store (Candidate)","type":"ai_embedding","index":0},{"node":"Query New Vector Store (Tool)","type":"ai_embedding","index":0},{"node":"Query Old Vector Store (Tool)","type":"ai_embedding","index":0}]]},"Quality Improved?":{"main":[[{"node":"Promote New Embeddings","type":"main","index":0}],[{"node":"Rollback to Previous Embeddings","type":"main","index":0},{"node":"Flag for Human Review","type":"main","index":0}]]},"Detect Changed Chunks":{"main":[[{"node":"New Vector Store (Candidate)","type":"main","index":0}]]},"Flag for Human Review":{"main":[[{"node":"Send Notification","type":"main","index":0}]]},"Source Change Webhook":{"main":[[{"node":"Workflow Configuration","type":"main","index":0}]]},"Fetch Golden Questions":{"main":[[{"node":"Generate Answers (New)","type":"main","index":0},{"node":"Generate Answers (Old)","type":"main","index":0}]]},"Generate Answers (New)":{"main":[[{"node":"Calculate Quality Metrics","type":"main","index":0}]]},"Generate Answers (Old)":{"main":[[{"node":"Calculate Quality Metrics","type":"main","index":0}]]},"Promote New Embeddings":{"main":[[{"node":"Send Notification","type":"main","index":0}]]},"Workflow Configuration":{"main":[[{"node":"Fetch Documents from Source","type":"main","index":0},{"node":"Fetch Previous Chunk Hashes","type":"main","index":0}]]},"Recursive Text Splitter":{"ai_textSplitter":[[{"node":"Document Loader","type":"ai_textSplitter","index":0}]]},"Store Embedding Metadata":{"main":[[{"node":"Save Embedding Version Metadata","type":"main","index":0}]]},"Calculate Embedding Drift":{"main":[[{"node":"Quality Improved?","type":"main","index":0}]]},"Calculate Quality Metrics":{"main":[[{"node":"Calculate Embedding Drift","type":"main","index":0}]]},"Fetch Documents from Source":{"main":[[{"node":"Chunk Documents & Compute Hash","type":"main","index":0}]]},"Fetch Previous Chunk Hashes":{"main":[[{"node":"Detect Changed Chunks","type":"main","index":1}]]},"New Vector Store (Candidate)":{"main":[[{"node":"Store Embedding Metadata","type":"main","index":0}]]},"Query New Vector Store (Tool)":{"ai_tool":[[{"node":"Generate Answers (New)","type":"ai_tool","index":0}]]},"Query Old Vector Store (Tool)":{"ai_tool":[[{"node":"Generate Answers (Old)","type":"ai_tool","index":0}]]},"Chunk Documents & Compute Hash":{"main":[[{"node":"Detect Changed Chunks","type":"main","index":0}]]},"Daily RAG Maintenance Schedule":{"main":[[{"node":"Workflow Configuration","type":"main","index":0}]]},"Rollback to Previous Embeddings":{"main":[[{"node":"Send Notification","type":"main","index":0}]]},"Save Embedding Version Metadata":{"main":[[{"node":"Fetch Golden Questions","type":"main","index":0},{"node":"Fetch Previous Embeddings","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":41,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.set":{"count":2},"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.postgres":{"count":6},"n8n-nodes-base.stickyNote":{"count":14},"n8n-nodes-base.httpRequest":{"count":2},"@n8n/n8n-nodes-langchain.agent":{"count":2},"n8n-nodes-base.compareDatasets":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"@n8n/n8n-nodes-langchain.lmChatOpenAi":{"count":1},"@n8n/n8n-nodes-langchain.embeddingsOpenAi":{"count":1},"@n8n/n8n-nodes-langchain.vectorStoreInMemory":{"count":3},"@n8n/n8n-nodes-langchain.documentDefaultDataLoader":{"count":1},"@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"ResilNext","username":"rnair1996","bio":"","verified":true,"links":[""],"avatar":"https://gravatar.com/avatar/c20bc6c3bcdf260fac3c28c556a8db661ee93670037a3ceb857e047851f6f438?r=pg&d=retro&size=200"},"nodes":[{"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":30,"icon":"file:postgres.svg","name":"n8n-nodes-base.postgres","codex":{"data":{"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-i-chose-n8n-over-zapier-in-2020/","icon":"😍","label":"Why I chose n8n over Zapier in 2020"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with 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/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-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.postgres/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/postgres/"}]},"categories":["Development","Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Postgres"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNzkgODEiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTc3LjM5MSA0Ny45MjJjLS40NjYtMS40MTItMS42ODgtMi4zOTYtMy4yNjgtMi42MzItLjc0NS0uMTExLTEuNTk4LS4wNjQtMi42MDguMTQ0LTEuNzYuMzYzLTMuMDY1LjUwMS00LjAxOC41MjggMy41OTYtNi4wNzIgNi41MjEtMTIuOTk3IDguMjA0LTE5LjUxNSAyLjcyMi0xMC41NCAxLjI2OC0xNS4zNDEtLjQzMi0xNy41MTNDNzAuNzcgMy4xODUgNjQuMjA2LjA5NyA1Ni4yODcuMDAyYy00LjIyNC0uMDUyLTcuOTMzLjc4Mi05Ljg2NyAxLjM4MmEzNyAzNyAwIDAgMC01Ljc3LS41MjhjLTMuODA5LS4wNjEtNy4xNzQuNzctMTAuMDUgMi40NzZhNDYgNDYgMCAwIDAtNy4wOTgtMS43ODJDMTYuNTYxLjQxMSAxMC45NjggMS4yOTkgNi44NzYgNC4xOSAxLjkyMiA3LjY4OS0uMzc1IDEzLjc3LjA1IDIyLjI2MmMuMTM1IDIuNjk2IDEuNjQzIDEwLjkgNC4wMTggMTguNjggMS4zNjUgNC40NzIgMi44MiA4LjE4NSA0LjMyNiAxMS4wMzggMi4xMzUgNC4wNDYgNC40MTkgNi40MjggNi45ODQgNy4yODQgMS40MzguNDc5IDQuMDQ5LjgxNCA2Ljc5Ny0xLjQ3M2E2IDYgMCAwIDAgMS40MjkgMS4yM2MuNzgzLjQ5NCAxLjc0Ljg5NyAyLjY5NiAxLjEzNiAzLjQ0Ni44NjIgNi42NzQuNjQ2IDkuNDI3LS41NjFsLjA0MSAxLjM2Mi4wNiAxLjg5OWMuMTYzIDQuMDY0LjQ0IDcuMjIzIDEuMjU5IDkuNDM0LjA0NS4xMjIuMTA1LjMwNy4xNjkuNTAzLjQwOSAxLjI1MSAxLjA5MiAzLjM0NiAyLjgzIDQuOTg3IDEuOCAxLjY5OSAzLjk3OCAyLjIyIDUuOTcyIDIuMjIgMSAwIDEuOTU1LS4xMzEgMi43OTItLjMxMSAyLjk4NC0uNjM5IDYuMzczLTEuNjE0IDguODI0LTUuMTA0IDIuMzE4LTMuMyAzLjQ0NC04LjI3IDMuNjQ4LTE2LjEwMWwuMDc0LS42MzQuMDQ4LS40MTQuNTQ2LjA0OC4xNDEuMDFjMy4wMzkuMTM4IDYuNzU1LS41MDYgOS4wMzctMS41NjYgMS44MDMtLjgzNyA3LjU4Mi0zLjg4OCA2LjIyMS04LjAwNyIvPjxwYXRoIGZpbGw9IiMzMzY3OTEiIGQ9Ik03Mi4xOTUgNDguNzIzYy05LjAzNiAxLjg2NC05LjY1Ny0xLjE5NS05LjY1Ny0xLjE5NSA5LjU0MS0xNC4xNTcgMTMuNTI5LTMyLjEyNyAxMC4wODctMzYuNTI1QzYzLjIzNS0uOTk0IDQ2Ljk4MSA0LjY4IDQ2LjcxIDQuODI3bC0uMDg3LjAxNmMtMS43ODUtLjM3MS0zLjc4My0uNTkxLTYuMDI5LS42MjgtNC4wODktLjA2Ny03LjE5IDEuMDcyLTkuNTQ0IDIuODU3IDAgMC0yOC45OTUtMTEuOTQ1LTI3LjY0NyAxNS4wMjMuMjg3IDUuNzM3IDguMjIzIDQzLjQxIDE3LjY4OSAzMi4wMzEgMy40Ni00LjE2MSA2LjgwMy03LjY3OSA2LjgwMy03LjY3OSAxLjY2IDEuMTAzIDMuNjQ4IDEuNjY2IDUuNzMyIDEuNDYzbC4xNjItLjEzN2E2LjMgNi4zIDAgMCAwIC4wNjUgMS42MmMtMi40MzkgMi43MjUtMS43MjIgMy4yMDMtNi41OTcgNC4yMDYtNC45MzMgMS4wMTctMi4wMzUgMi44MjYtLjE0MyAzLjI5OSAyLjI5NC41NzQgNy42IDEuMzg2IDExLjE4NS0zLjYzM2wtLjE0My41NzNjLjk1Ni43NjUgMS42MjYgNC45NzggMS41MTQgOC43OTdzLS4xODggNi40NDEuNTY1IDguNDg5IDEuNTAzIDYuNjU2IDcuOTEyIDUuMjgyYzUuMzU1LTEuMTQ4IDguMTMtNC4xMjEgOC41MTYtOS4wODEuMjc0LTMuNTI2Ljg5NC0zLjAwNS45MzMtNi4xNThsLjQ5Ny0xLjQ5M2MuNTczLTQuNzguMDkxLTYuMzIyIDMuMzktNS42MDVsLjgwMi4wN2MyLjQyOC4xMSA1LjYwNi0uMzkxIDcuNDcxLTEuMjU3IDQuMDE2LTEuODY0IDYuMzk4LTQuOTc2IDIuNDM4LTQuMTU4Ii8+PHBhdGggZD0iTTMyLjc0NyAyNC42NmMtLjgxNC0uMTEzLTEuNTUyLS4wMDgtMS45MjUuMjc0YS43LjcgMCAwIDAtLjI5Mi40N2MtLjA0Ny4zMzYuMTg4LjcwNy4zMzMuODk4LjQwOS41NDIgMS4wMDYuOTE1IDEuNTk4Ljk5N2EyIDIgMCAwIDAgLjI1Ni4wMThjLjk4NiAwIDEuODgzLS43NjggMS45NjItMS4zMzUuMDk5LS43MS0uOTMyLTEuMTgzLTEuOTMxLTEuMzIybTI2Ljk3NS4wMjJjLS4wNzgtLjU1Ni0xLjA2OC0uNzE1LTIuMDA3LS41ODRzLTEuODQ4LjU1NC0xLjc3MiAxLjExMmMuMDYxLjQzNC44NDQgMS4xNzQgMS43NzEgMS4xNzRxLjExNyAwIC4yMzctLjAxNmMuNjE5LS4wODYgMS4wNzMtLjQ3OSAxLjI4OC0uNzA1LjMyOS0uMzQ1LjUxOC0uNzMuNDg0LS45OG0xNS40NzcgMjMuODI4Yy0uMzQ1LTEuMDQyLTEuNDUzLTEuMzc3LTMuMjk2LS45OTctNS40NzEgMS4xMjktNy40My4zNDctOC4wNzMtLjEyNyA0LjI1Mi02LjQ3OCA3Ljc1LTE0LjMwOCA5LjYzNy0yMS42MTQuODk0LTMuNDYxIDEuMzg4LTYuNjc1IDEuNDI4LTkuMjk0LjA0NS0yLjg3Ni0uNDQ1LTQuOTg4LTEuNDU1LTYuMjc5LTQuMDcyLTUuMjAzLTEwLjA0OC03Ljk5NC0xNy4yODMtOC4wNy00Ljk3My0uMDU2LTkuMTc1IDEuMjE3LTkuOTkgMS41NzVhMjUgMjUgMCAwIDAtNS42MjItLjcyMmMtMy43MzQtLjA2LTYuOTYxLjgzNC05LjYzMyAyLjY1NWE0MyA0MyAwIDAgMC03LjgyOC0yLjA1MmMtNi4zNDItMS4wMjEtMTEuMzgxLS4yNDgtMTQuOTc4IDIuMy00LjI5MSAzLjA0LTYuMjcyIDguNDc1LTUuODg4IDE2LjE1Mi4xMjkgMi41ODMgMS42MDEgMTAuNTI5IDMuOTIzIDE4LjEzOSAzLjA1NyAxMC4wMTYgNi4zOCAxNS42ODYgOS44NzcgMTYuODUyYTQuNCA0LjQgMCAwIDAgMS40MDIuMjMyYzEuMjc2IDAgMi44MzktLjU3NSA0LjQ2Ni0yLjUzMWExNjEgMTYxIDAgMCAxIDYuMTU2LTYuOTY2IDkuOSA5LjkgMCAwIDAgNC40MjkgMS4xOTFsLjAxLjEyMWMtLjMxLjM2OC0uNTY0LjY5LS43ODEuOTY1LTEuMDcgMS4zNTgtMS4yOTMgMS42NDEtNC43MzggMi4zNTEtLjk4LjIwMi0zLjU4Mi43MzgtMy42MiAyLjU2My0uMDQxIDEuOTkzIDMuMDc2IDIuODMgMy40MzEgMi45MTkgMS4yMzguMzEgMi40My40NjMgMy41NjguNDYzIDIuNzY2IDAgNS4yLS45MDkgNy4xNDUtMi42NjgtLjA2IDcuMTA2LjIzNiAxNC4xMDcgMS4wODkgMTYuMjQxLjY5OSAxLjc0NiAyLjQwNiA2LjAxNCA3Ljc5OCA2LjAxNC43OTEgMCAxLjY2Mi0uMDkyIDIuNjItLjI5NyA1LjYyNy0xLjIwNyA4LjA3MS0zLjY5NCA5LjAxNi05LjE3Ny41MDYtMi45MyAxLjM3NC05LjkyOCAxLjc4Mi0xMy42ODIuODYyLjI2OSAxLjk3MS4zOTIgMy4xNy4zOTIgMi41MDEgMCA1LjM4Ny0uNTMxIDcuMTk3LTEuMzcyIDIuMDMzLS45NDQgNS43MDItMy4yNjEgNS4wMzctNS4yNzR6TTYxLjggMjMuMTQ3Yy0uMDE5IDEuMTA4LS4xNzEgMi4xMTQtLjMzMyAzLjE2NC0uMTc0IDEuMTI5LS4zNTQgMi4yOTctLjM5OSAzLjcxNS0uMDQ1IDEuMzc5LjEyOCAyLjgxNC4yOTQgNC4yLjMzNyAyLjgwMS42ODIgNS42ODUtLjY1NSA4LjUzMWExMSAxMSAwIDAgMS0uNTkyLTEuMjE4Yy0uMTY2LS40MDMtLjUyNy0xLjA1LTEuMDI3LTEuOTQ2LTEuOTQ0LTMuNDg3LTYuNDk3LTExLjY1Mi00LjE2Ny0xNC45ODQuNjk0LS45OTIgMi40NTYtMi4wMTEgNi44NzktMS40NjN6TTU2LjQzOSA0LjM3NGM2LjQ4Mi4xNDMgMTEuNjA5IDIuNTY4IDE1LjI0IDcuMjA3IDIuNzg0IDMuNTU4LS4yODIgMTkuNzQ5LTkuMTU4IDMzLjcxNmwtLjI2OS0uMzM5LS4xMTItLjE0YzIuMjk0LTMuNzg4IDEuODQ1LTcuNTM2IDEuNDQ2LTEwLjg1OS0uMTY0LTEuMzY0LS4zMTktMi42NTItLjI4LTMuODYxLjA0MS0xLjI4My4yMS0yLjM4Mi4zNzQtMy40NDYuMjAyLTEuMzExLjQwNy0yLjY2Ny4zNS00LjI2NWExLjggMS44IDAgMCAwIC4wMzctLjYwMWMtLjE0NC0xLjUzMy0xLjg5NC02LjEyLTUuNDYyLTEwLjI3My0xLjk1MS0yLjI3MS00Ljc5Ny00LjgxMy04LjY4Mi02LjUyN2EyOS4zIDI5LjMgMCAwIDEgNi41MTUtLjYxMnpNMjAuMTY3IDUzLjI5OGMtMS43OTMgMi4xNTUtMy4wMzEgMS43NDItMy40MzggMS42MDctMi42NTMtLjg4NS01LjczLTYuNDkxLTguNDQ0LTE1LjM4Mi0yLjM0OC03LjY5My0zLjcyLTE1LjQyOC0zLjgyOS0xNy41OTctLjM0My02Ljg2IDEuMzItMTEuNjQxIDQuOTQzLTE0LjIxIDUuODk2LTQuMTgxIDE1LjU4OS0xLjY3OSAxOS40ODQtLjQwOWwtLjE3LjE2M2MtNi4zOTEgNi40NTUtNi4yNCAxNy40ODMtNi4yMjQgMTguMTU3YTIyIDIyIDAgMCAwIC4wNTEgMS4xMzVjLjExIDEuODU1LjMxNSA1LjMwNy0uMjMyIDkuMjE3LS41MDggMy42MzMuNjEyIDcuMTg5IDMuMDcyIDkuNzU2cS4zODMuMzk4Ljc5NS43NWExNjQgMTY0IDAgMCAwLTYuMDA4IDYuODE0em02LjgzLTkuMTEzYy0xLjk4My0yLjA2OS0yLjg4NC00Ljk0Ny0yLjQ3MS03Ljg5Ni41NzctNC4xMy4zNjQtNy43MjcuMjUtOS42NTlsLS4wMzktLjY5NGMuOTM0LS44MjggNS4yNjEtMy4xNDYgOC4zNDYtMi40MzkgMS40MDguMzIzIDIuMjY2IDEuMjgxIDIuNjIzIDIuOTMxIDEuODQ2IDguNTM5LjI0NCAxMi4wOTgtMS4wNDMgMTQuOTU3LS4yNjUuNTg5LS41MTYgMS4xNDYtLjczIDEuNzIybC0uMTY2LjQ0NWMtLjQyIDEuMTI2LS44MTEgMi4xNzMtMS4wNTMgMy4xNjctMi4xMDgtLjAwNi00LjE1OS0uOTA3LTUuNzE4LTIuNTM0em0uMzI0IDExLjUxNmE1IDUgMCAwIDEtMS40OTQtLjY0MmMuMjcxLS4xMjguNzU0LS4zMDEgMS41OTEtLjQ3NCA0LjA1Mi0uODM0IDQuNjc4LTEuNDIzIDYuMDQ1LTMuMTU4LjMxMy0uMzk4LjY2OS0uODQ5IDEuMTYtMS4zOTguNzMzLS44MjEgMS4wNjgtLjY4MiAxLjY3Ni0uNDMuNDkzLjIwNC45NzIuODIxIDEuMTY3IDEuNTAxLjA5Mi4zMjEuMTk1LjkzLS4xNDMgMS40MDQtMi44NTUgMy45OTctNy4wMTUgMy45NDYtMTAuMDAzIDMuMTk4em0yMS4yMDcgMTkuNzM1Yy00Ljk1NyAxLjA2Mi02LjcxMy0xLjQ2Ny03Ljg2OS00LjM1OS0uNzQ3LTEuODY3LTEuMTEzLTEwLjI4NS0uODUzLTE5LjU4MmExLjEgMS4xIDAgMCAwLS4wNDgtLjM1NiA1IDUgMCAwIDAtLjEzOS0uNjU3Yy0uMzg3LTEuMzUzLTEuMzMxLTIuNDg0LTIuNDYyLTIuOTUzLS40NS0uMTg2LTEuMjc1LS41MjgtMi4yNjctLjI3NC4yMTItLjg3MS41NzgtMS44NTUuOTc2LTIuOTIxbC4xNjctLjQ0OGMuMTg4LS41MDUuNDIzLTEuMDI5LjY3My0xLjU4MyAxLjM0Ny0yLjk5MiAzLjE5Mi03LjA5MSAxLjE5LTE2LjM1LS43NS0zLjQ2OC0zLjI1NC01LjE2MS03LjA1LTQuNzY4LTIuMjc2LjIzNS00LjM1OCAxLjE1NC01LjM5NiAxLjY4cS0uMzM0LjE2OS0uNjE4LjMyOWMuMjktMy40OTQgMS4zODUtMTAuMDI0IDUuNDgxLTE0LjE1NiAyLjU3OS0yLjYwMSA2LjAxNC0zLjg4NiAxMC4xOTktMy44MTcgOC4yNDYuMTM1IDEzLjUzNCA0LjM2NyAxNi41MTggNy44OTMgMi41NzEgMy4wMzkgMy45NjQgNi4xIDQuNTIgNy43NTEtNC4xNzktLjQyNS03LjAyMi40LTguNDYzIDIuNDYtMy4xMzUgNC40ODEgMS43MTUgMTMuMTc4IDQuMDQ2IDE3LjM1OC40MjcuNzY2Ljc5NiAxLjQyOC45MTIgMS43MDkuNzU5IDEuODM5IDEuNzQyIDMuMDY3IDIuNDU5IDMuOTY0LjIyLjI3NS40MzMuNTQxLjU5Ni43NzQtMS4yNjYuMzY1LTMuNTM5IDEuMjA4LTMuMzMyIDUuNDIyLS4xNjcgMi4xMTUtMS4zNTYgMTIuMDE2LTEuOTU5IDE1LjUxNC0uNzk3IDQuNjIxLTIuNDk3IDYuMzQzLTcuMjc5IDcuMzY4em0yMC42OTMtMjMuNjhjLTEuMjk0LjYwMS0zLjQ2IDEuMDUyLTUuNTE4IDEuMTQ4LTIuMjczLjEwNy0zLjQzLS4yNTUtMy43MDItLjQ3Ny0uMTI4LTIuNjI2Ljg1LTIuOTAxIDEuODg0LTMuMTkxLjE2My0uMDQ2LjMyMS0uMDkuNDc0LS4xNDRhNCA0IDAgMCAwIC4zMTMuMjNjMS44MjcgMS4yMDYgNS4wODUgMS4zMzYgOS42ODUuMzg2bC4wNS0uMDFjLS42Mi41OC0xLjY4MiAxLjM1OS0zLjE4NyAyLjA1OHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Postgres","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":5,"name":"Development"}]},{"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":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"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/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"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/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/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/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/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, 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/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/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"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/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-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"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":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":836,"icon":"file:compare.svg","name":"n8n-nodes-base.compareDatasets","codex":{"data":{"alias":["Join","Concatenate","Compare","Dataset","Split","Sync","Syncing"],"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.comparedatasets/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"Compare Datasets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzODQiIGhlaWdodD0iNTEyIj48cGF0aCBmaWxsPSIjZWQyMzBkIiBkPSJNMzUyIDQ0OEgzMmMtMTcuNjkgMC0zMiAxNC4zMS0zMiAzMnMxNC4zMSAzMS4xIDMyIDMxLjFoMzIwYzE3LjY5IDAgMzItMTQuMzEgMzItMzEuMXMtMTQuMy0zMi0zMi0zMiIvPjxwYXRoIGZpbGw9IiM2MmY3MzAiIGQ9Ik00OCAyMDhoMTEydjExMS4xYzAgMTcuNjkgMTQuMzEgMzEuMSAzMiAzMS4xczMyLTE0LjMxIDMyLTMxLjFWMjA4aDExMmMxNy42OSAwIDMyLTE0LjMyIDMyLTMyLjAxUzM1My42OSAxNDQgMzM2IDE0NEgyMjRWMzJjMC0xNy42OS0xNC4zMS0zMi4wMS0zMi0zMi4wMXMtMzIgMTQuMzQtMzIgMzIuMDJ2MTEySDQ4Yy0xNy42OSAwLTMyIDE0LjMxLTMyIDMxLjk5czE0LjMxIDMyIDMyIDMyIi8+PC9zdmc+"},"displayName":"Compare Datasets","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"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":1191,"icon":"fa:grip-lines-vertical","name":"@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.textsplitterrecursivecharactertextsplitter/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Text Splitters"]}}},"group":"[\"transform\"]","defaults":{"name":"Recursive Character Text Splitter"},"iconData":{"icon":"grip-lines-vertical","type":"icon"},"displayName":"Recursive Character Text Splitter","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1209,"icon":"fa:database","name":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.vectorstoreinmemory/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Vector Stores","Tools","Root Nodes"],"Tools":["Other Tools"],"Vector Stores":["For Beginners"]}}},"group":"[\"transform\"]","defaults":{"name":"Simple Vector Store"},"iconData":{"icon":"database","type":"icon"},"displayName":"Simple Vector Store","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1243,"icon":"file:binary.svg","name":"@n8n/n8n-nodes-langchain.documentDefaultDataLoader","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.documentdefaultdataloader/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Document Loaders"]}}},"group":"[\"transform\"]","defaults":{"name":"Default Data Loader"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3NjgiIGhlaWdodD0iMTAyNCI+PHBhdGggZmlsbD0iIzdEN0Q4NyIgZD0iTTAgOTYwVjY0aDU3NmwxOTIgMTkydjcwNHptNzA0LTY0MEw1MTIgMTI4SDY0djc2OGg2NDB6TTMyMCA1MTJIMTI4VjI1NmgxOTJ6bS02NC0xOTJoLTY0djEyOGg2NHptMCA0NDhoNjR2NjRIMTI4di02NGg2NFY2NDBoLTY0di02NGgxMjh6bTI1Ni0zMjBoNjR2NjRIMzg0di02NGg2NFYzMjBoLTY0di02NGgxMjh6bTY0IDM4NEgzODRWNTc2aDE5MnptLTY0LTE5MmgtNjR2MTI4aDY0eiIvPjwvc3ZnPg=="},"displayName":"Default Data Loader","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":5,"name":"Engineering"},{"id":48,"name":"AI RAG"}],"image":[]}}