This workflow corresponds to n8n.io template #6169 — we link there as the canonical source.
This workflow follows the Agent → Chat Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "7QhxjMbqHv5tk9wM",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Email History RAG",
"tags": [],
"nodes": [
{
"id": "dec780ab-9e05-4305-ba52-8a92dfc266e7",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-7040,
800
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "13f21017-5470-4e0e-8d13-aea6d98c4918",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-7440,
448
],
"parameters": {
"width": 1162,
"height": 796,
"content": "# RAG AI Agent\n"
},
"typeVersion": 1
},
{
"id": "b6615316-94c0-4091-b6e3-8cdf64cb0902",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-6048,
1472
],
"parameters": {},
"typeVersion": 1
},
{
"id": "349336cd-9373-4553-aa13-9cf6a427a0c6",
"name": "RAG Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-6944,
576
],
"parameters": {
"options": {
"systemMessage": "=You are a helpful assistant that will get data from RAG and send a good response to user.\n\nToday date is this if user ask for dated or latest data: {{ $now }}\n\nSo add date when send query to vector database because I am already setting the date field in embedding."
}
},
"typeVersion": 1.7
},
{
"id": "16acb16b-8d56-425a-b484-fa4ffc3f5616",
"name": "Embeddings OpenAI5",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
-5680,
912
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "262344fa-8b26-4665-b0ff-e1354e6d84eb",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-6128,
448
],
"parameters": {
"color": 4,
"width": 1200,
"height": 788,
"content": "# Watch Trigger (Email) - New Email\n## Get new Email -> Extract the text -> Add to Vector Store"
},
"typeVersion": 1
},
{
"id": "69d042bf-b75a-414e-a2e2-a62632e6aef2",
"name": "Embeddings OpenAI11",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
-5200,
1712
],
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "cd126bb7-60a6-450b-b31c-cfd9517e9441",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
-6128,
1328
],
"parameters": {
"width": 1596,
"height": 740,
"content": "# Get All Emails -> Store embedding in vector db\n"
},
"typeVersion": 1
},
{
"id": "d7481948-2972-42e9-b2ef-900c55bc6465",
"name": "Qdrant Email Vector Store",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"position": [
-6736,
896
],
"parameters": {
"mode": "retrieve-as-tool",
"options": {},
"toolName": "emails_vector_search",
"toolDescription": "=Call this tool to perform a vector embeddings search in my e-mail database. For time-specific queries:\n1. ALWAYS include the time frame in your query (e.g., \"interviews scheduled after April 27, 2025\" or \"interviews for next week April 28-May 4, 2025\")\n2. For future events, explicitly mention \"future\" or \"upcoming\" in your query",
"qdrantCollection": {
"__rl": true,
"mode": "list",
"value": "emails_history",
"cachedResultName": "emails_history"
}
},
"typeVersion": 1.1
},
{
"id": "8b9845c3-a9e6-47a1-ae0e-8e66a15b5812",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
-7248,
576
],
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "2c320869-b169-4961-a8fd-5403c7a1366e",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-6864,
800
],
"parameters": {},
"typeVersion": 1.3
},
{
"id": "7cecd74a-bde6-4fcf-8622-81620c63b20f",
"name": "Store Emails in Vector DB",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"position": [
-5568,
672
],
"parameters": {
"mode": "insert",
"options": {},
"qdrantCollection": {
"__rl": true,
"mode": "list",
"value": "emails_history",
"cachedResultName": "emails_history"
}
},
"typeVersion": 1.1
},
{
"id": "82da160a-a572-4cdf-a260-f7a0c51a30fa",
"name": "New Email",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-6064,
672
],
"parameters": {
"filters": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "954a8ea4-9e00-43b9-9fe2-6d717b6dccd7",
"name": "Get new Email Body",
"type": "n8n-nodes-base.gmail",
"position": [
-5840,
672
],
"parameters": {
"simple": false,
"options": {},
"messageId": "={{ $json.id }}",
"operation": "get"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "6735edda-91ff-4872-8c13-bec68a8af925",
"name": "Get all emails",
"type": "n8n-nodes-base.gmail",
"position": [
-5824,
1472
],
"parameters": {
"simple": false,
"filters": {},
"options": {},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "f01ccf0e-caf4-44f1-a385-a6eb2b063551",
"name": "Refactor Email Body data",
"type": "n8n-nodes-base.code",
"position": [
-5616,
1472
],
"parameters": {
"jsCode": "const emails = $input.all().map((item) => item.json);\n\nconst extractedData = emails.map((email) => {\n // Remove line breaks and excessive spaces from body\n const cleanBody = email.text\n ?.replace(/(\\r\\n|\\n|\\r)/gm, ' ') // Replace newlines with space\n ?.replace(/\\s+/g, ' ') // Collapse multiple spaces\n ?.trim(); // Remove leading/trailing space\n\n return {\n to: email.to?.value?.[0]?.address || '',\n from: email.from?.value?.[0]?.address || '',\n fromName: email.from?.value?.[0]?.name || '',\n date: email.date || '',\n subject: email.subject || '',\n body: cleanBody || '',\n emailId: email.id || '',\n };\n});\n\nreturn extractedData;\n"
},
"typeVersion": 2
},
{
"id": "19fe59c6-6576-453a-8098-97e47c72c033",
"name": "Loop over all emails",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-5344,
1472
],
"parameters": {
"options": {},
"batchSize": 50
},
"typeVersion": 3
},
{
"id": "1e6d26d8-60e3-4128-82b4-a5e61d83cff1",
"name": "Store Emails in Vector DB1",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"position": [
-5024,
1456
],
"parameters": {
"mode": "insert",
"options": {},
"qdrantCollection": {
"__rl": true,
"mode": "list",
"value": "emails_history",
"cachedResultName": "emails_history"
}
},
"typeVersion": 1.1
},
{
"id": "5200b258-2c96-4d38-9c92-b5353ada6957",
"name": "Set proper metadata",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
-5024,
1696
],
"parameters": {
"options": {
"metadata": {
"metadataValues": [
{
"name": "created_at",
"value": "={{ $json.date }}"
},
{
"name": "data_source",
"value": "gmail"
}
]
}
},
"jsonData": "=Email details:\nDate: {{ $json.date }}\n\nFrom Email: {{ $json.from }}\nFrom Name: {{ $json.fromName }}\n\nTo Email: {{ $json.to }}\n\nEmail Subject:\n{{ $json.subject }}\n\nEmail body:\n{{ $json.body }}",
"jsonMode": "expressionData"
},
"typeVersion": 1
},
{
"id": "512bb68a-94d7-4e0f-ab51-265f19d670bd",
"name": "Split emails",
"type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
"position": [
-4944,
1888
],
"parameters": {
"separator": "Email details:"
},
"typeVersion": 1
},
{
"id": "73a26bce-0df2-4755-8175-8a0e367f7418",
"name": "Set proper metadata1",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
-5424,
880
],
"parameters": {
"options": {
"metadata": {
"metadataValues": [
{
"name": "=data_source",
"value": "=gmail"
},
{
"name": "=created_at",
"value": "={{ $json.date }}"
}
]
}
},
"jsonData": "=Email details:\nDate: {{ $json.headers.date }}\n\nFrom Email: {{ $json.from.value[0].address }}\nFrom Name: {{ $json.from.value[0].name }}\n\nTo Email: {{ $json.to.value[0].address }}\n\nEmail Subject:\n{{ $json.subject }}\n\nEmail body:\n{{ $json.text }}",
"jsonMode": "expressionData"
},
"typeVersion": 1
},
{
"id": "c70f74e1-75ab-4ce3-9c84-f92ff1d7a762",
"name": "Split emails1",
"type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
"position": [
-5344,
1056
],
"parameters": {
"separator": "Email details:"
},
"typeVersion": 1
},
{
"id": "051c026e-0fd7-4182-a388-0ccd6e0c085e",
"name": "Embeddings OpenAI",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
-6784,
1072
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "1e9fceab-0844-4201-b731-1ceca71a306c",
"connections": {
"New Email": {
"main": [
[
{
"node": "Get new Email Body",
"type": "main",
"index": 0
}
]
]
},
"RAG Agent": {
"main": [
[]
]
},
"Split emails": {
"ai_textSplitter": [
[
{
"node": "Set proper metadata",
"type": "ai_textSplitter",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "RAG Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Split emails1": {
"ai_textSplitter": [
[
{
"node": "Set proper metadata1",
"type": "ai_textSplitter",
"index": 0
}
]
]
},
"Get all emails": {
"main": [
[
{
"node": "Refactor Email Body data",
"type": "main",
"index": 0
}
]
]
},
"Embeddings OpenAI": {
"ai_embedding": [
[
{
"node": "Qdrant Email Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "RAG Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Embeddings OpenAI5": {
"ai_embedding": [
[
{
"node": "Store Emails in Vector DB",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Get new Email Body": {
"main": [
[
{
"node": "Store Emails in Vector DB",
"type": "main",
"index": 0
}
]
]
},
"Embeddings OpenAI11": {
"ai_embedding": [
[
{
"node": "Store Emails in Vector DB1",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Set proper metadata": {
"ai_document": [
[
{
"node": "Store Emails in Vector DB1",
"type": "ai_document",
"index": 0
}
]
]
},
"Loop over all emails": {
"main": [
[],
[
{
"node": "Store Emails in Vector DB1",
"type": "main",
"index": 0
}
]
]
},
"Set proper metadata1": {
"ai_document": [
[
{
"node": "Store Emails in Vector DB",
"type": "ai_document",
"index": 0
}
]
]
},
"Refactor Email Body data": {
"main": [
[
{
"node": "Loop over all emails",
"type": "main",
"index": 0
}
]
]
},
"Qdrant Email Vector Store": {
"ai_tool": [
[
{
"node": "RAG Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Store Emails in Vector DB1": {
"main": [
[
{
"node": "Loop over all emails",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "RAG Agent",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Get all emails",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2openAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
> Summary: > This workflow listens for new Gmail messages, extracts and cleans email content, generates embeddings via OpenAI, stores them in a Qdrant vector database, and then enables a Retrieval‑Augmented‑Generation (RAG) agent to answer user queries against those stored…
Source: https://n8n.io/workflows/6169/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Alfred (funcional). Uses gmailTool, googleCalendarTool, gmail, embeddingsOpenAi. Event-driven trigger; 83 nodes.
Your AI workforce is ready. Are you?
Agent IA Projet Client. Uses executeWorkflowTrigger, lmChatOpenAi, toolWorkflow, vectorStoreQdrant. Event-driven trigger; 79 nodes.
This intelligent chatbot leverages cutting-edge financial APIs and AI-driven analysis to deliver comprehensive stock research reports. Get instant access to professional-grade investment analysis that
This n8n template automatically classifies incoming emails (Sales, Support, Internal, Finance, Promotions) and routes them to a dedicated OpenAI LLM Agent for processing. Depending on the category, th