This workflow corresponds to n8n.io template #16411 — we link there as the canonical source.
This workflow follows the Chainretrievalqa → Retrievervectorstore 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 →
{
"meta": {
"templateId": "placetel-rag-voice-assistant-googledrive-groq"
},
"name": "Placetel AI \u2013 RAG Voice Assistant with Google Drive & Supabase (Groq)",
"tags": [],
"nodes": [
{
"id": "2fcd4ac9-9850-4dd9-8eb2-5b2bddd5ca8b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
-688
],
"parameters": {
"color": 4,
"width": 712,
"height": 620,
"content": "\ud83d\udcda LOAD DATA FLOW \u2013 Dokumenten-Indexierung\n\nZweck:\nLiest Dokumente aus Google Drive und speichert sie\nals Vektoren in einer Vektordatenbank. Muss bei neuen Dokumenten \nmanuell ausgef\u00fchrt werden oder l\u00e4uft automatisch \nper Schedule Trigger.\n\nAblauf:\n1. Dokumente auflisten (HTTP Request / Drive Node)\n2. IDs extrahieren (Code Node)\n3. Jede Datei einzeln verarbeiten (Loop)\n4. Datei herunterladen & Text laden (Data Loader)\n5. Vektoren erstellen (Embeddings Node)\n6. Chunks dauerhaft speichern (Vector Store)\n\n\u26a0\ufe0f Konfiguration erforderlich:\n- Ordnerpfad / Quelle anpassen\n- Google Drive OAuth2 Credential hinterlegen\n- OpenAI API Key f\u00fcr Embeddings hinterlegen\n- Supabase Credentials hinterlegen\n- Nur unterst\u00fctzte Dateiformate verwenden (.txt)"
},
"typeVersion": 1
},
{
"id": "8c874401-8365-49a2-8dc7-675872b39416",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
-64
],
"parameters": {
"color": 7,
"width": 1372,
"height": 876,
"content": "### \ud83d\udcda Load Data Flow"
},
"typeVersion": 1
},
{
"id": "c56d79b7-d5d2-4a84-ae95-892cc1da2c1c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
-64
],
"parameters": {
"color": 7,
"width": 840,
"height": 876,
"content": "### \ud83c\udfaf 2. Retriever Flow"
},
"typeVersion": 1
},
{
"id": "d70fa8c7-5d96-43e4-9e6e-0974b7d45c84",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
-656
],
"parameters": {
"color": 4,
"width": 832,
"height": 592,
"content": "\ud83c\udfaf RETRIEVER FLOW \u2013 Wissensabfrage via Webhook\n\nZweck:\nEmpf\u00e4ngt Fragen per Webhook, durchsucht semantisch \ndie Vektordatenbank und gibt eine strukturierte \nAntwort zur\u00fcck \u2013 optimiert f\u00fcr telefonische \nSprachausgabe.\n\nAblauf:\n1. Frage per Webhook empfangen (POST)\n2. Semantische Suche in Vektordatenbank\n3. Antwort via LLM generieren (Groq)\n4. Antwort an den Aufrufer zur\u00fcckgeben\n\n\u26a0\ufe0f Konfiguration erforderlich:\n- Webhook URL in aufrufendem System hinterlegen\n- Erwarteter Request Body: { \"chatInput\": \"...\" }\n- System Prompt an Use Case anpassen\n- Groq API Key hinterlegen\n- Supabase Credentials hinterlegen\n- Gleiches Embeddings Modell wie Load Flow verwenden!"
},
"typeVersion": 1
},
{
"id": "785418cd-19c1-4a5c-986d-54e7b514ca9d",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
-288
],
"parameters": {
"width": 384,
"height": 260,
"content": "\u26a0\ufe0f WICHTIG \u2013 Embeddings Konsistenz\n\nDas Embeddings Modell muss in BEIDEN Flows \nidentisch sein:\n- Load Data Flow: OpenAI Embeddings \u2013 Indexierung\n- Retriever Flow: OpenAI Embeddings \u2013 Abfrage\n\nUnterschiedliche Modelle f\u00fchren zu \nfehlerhaften Suchergebnissen!\n\nEmpfohlen: text-embedding-3-small"
},
"typeVersion": 1
},
{
"id": "0203ee1f-38ff-44b4-a407-7fe7f48d6847",
"name": "T\u00e4glich 02:00 Uhr \u2013 Auto-Reindex",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-832,
160
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 2
}
]
}
},
"typeVersion": 1.3
},
{
"id": "69327c93-d29e-4402-bf57-5f1dd63d54fe",
"name": "Manueller Start \u2013 Reindex",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-832,
320
],
"parameters": {},
"typeVersion": 1
},
{
"id": "fda96966-6669-48c6-9456-2740df9e6655",
"name": "Google Drive \u2013 Dateien auflisten",
"type": "n8n-nodes-base.httpRequest",
"position": [
-624,
320
],
"parameters": {
"url": "https://www.googleapis.com/drive/v3/files",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "'DEINE_ORDNER_ID' in parents and trashed = false"
},
{
"name": "fields",
"value": "files(id,name,mimeType)"
}
]
},
"nodeCredentialType": "googleDriveOAuth2Api"
},
"typeVersion": 4.4
},
{
"id": "e75b853b-9041-4e73-bdf3-e0504faa0bd6",
"name": "Datei-IDs extrahieren",
"type": "n8n-nodes-base.code",
"position": [
-192,
512
],
"parameters": {
"jsCode": "const files = $input.first().json.files;\nreturn files.map(f => ({ json: f }));"
},
"typeVersion": 2
},
{
"id": "2ff508d3-5eef-40be-9abd-23b3e44ecd82",
"name": "Loop \u2013 Jede Datei",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-368,
320
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "bb0d9208-a396-4217-a5e3-fa8836154a8b",
"name": "Google Drive \u2013 Datei herunterladen",
"type": "n8n-nodes-base.googleDrive",
"position": [
32,
512
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"typeVersion": 3
},
{
"id": "7dc04dce-dbb7-49ee-98d4-e46e9e91797e",
"name": "Text Loader",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
224,
304
],
"parameters": {
"loader": "textLoader",
"options": {},
"dataType": "binary"
},
"typeVersion": 1.1
},
{
"id": "488c0a97-ccb2-49c8-8c90-1d403ea4df24",
"name": "OpenAI Embeddings \u2013 Indexierung",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
-80,
304
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "0d014d7e-0976-47e5-a11b-de82b12db470",
"name": "Supabase \u2013 Chunks speichern",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
32,
48
],
"parameters": {
"mode": "insert",
"options": {
"queryName": "match_documents"
},
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
}
},
"typeVersion": 1.3
},
{
"id": "59ebd416-d408-4378-8f8f-e5e0d6d86b12",
"name": "Placetel \u2013 Webhook Eingang",
"type": "n8n-nodes-base.webhook",
"position": [
576,
80
],
"parameters": {
"path": "rag-knowledge-webhook",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2.1
},
{
"id": "e7484e96-a6f0-4d97-a2fc-ffef217da032",
"name": "OpenAI Embeddings \u2013 Abfrage",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
976,
672
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "e2e0baff-01d6-4e97-a7d9-013c57054d08",
"name": "Placetel \u2013 Antwort zur\u00fcckgeben",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1168,
80
],
"parameters": {
"options": {},
"respondWith": "allIncomingItems"
},
"typeVersion": 1.5
},
{
"id": "913462f4-2acb-4bd7-9ec6-1866050d0d90",
"name": "Question and Answer Chain",
"type": "@n8n/n8n-nodes-langchain.chainRetrievalQa",
"position": [
800,
80
],
"parameters": {
"text": "={{ $json.body.chatInput }}",
"options": {},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "4f3c1d07-86b2-4dfc-ab37-f2cbb2fc8acf",
"name": "Vector Store Retriever",
"type": "@n8n/n8n-nodes-langchain.retrieverVectorStore",
"position": [
928,
288
],
"parameters": {
"topK": 3
},
"typeVersion": 1
},
{
"id": "ba154af9-3749-431d-ac8c-4913e581d8f0",
"name": "Supabase Vector Store",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
784,
496
],
"parameters": {
"options": {
"queryName": "match_documents"
},
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
}
},
"typeVersion": 1.3
},
{
"id": "d4d3b101-b7e3-4179-aa35-241bec669dd4",
"name": "Groq Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
688,
288
],
"parameters": {
"model": "llama-3.1-8b-instant",
"options": {}
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"connections": {
"Text Loader": {
"ai_document": [
[
{
"node": "Supabase \u2013 Chunks speichern",
"type": "ai_document",
"index": 0
}
]
]
},
"Groq Chat Model": {
"ai_languageModel": [
[
{
"node": "Question and Answer Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Loop \u2013 Jede Datei": {
"main": [
[
{
"node": "Supabase \u2013 Chunks speichern",
"type": "main",
"index": 0
}
],
[
{
"node": "Datei-IDs extrahieren",
"type": "main",
"index": 0
}
]
]
},
"Datei-IDs extrahieren": {
"main": [
[
{
"node": "Google Drive \u2013 Datei herunterladen",
"type": "main",
"index": 0
}
]
]
},
"Supabase Vector Store": {
"ai_vectorStore": [
[
{
"node": "Vector Store Retriever",
"type": "ai_vectorStore",
"index": 0
}
]
]
},
"Vector Store Retriever": {
"ai_retriever": [
[
{
"node": "Question and Answer Chain",
"type": "ai_retriever",
"index": 0
}
]
]
},
"Question and Answer Chain": {
"main": [
[
{
"node": "Placetel \u2013 Antwort zur\u00fcckgeben",
"type": "main",
"index": 0
}
]
]
},
"Manueller Start \u2013 Reindex": {
"main": [
[
{
"node": "Google Drive \u2013 Dateien auflisten",
"type": "main",
"index": 0
}
]
]
},
"Placetel \u2013 Webhook Eingang": {
"main": [
[
{
"node": "Question and Answer Chain",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Embeddings \u2013 Abfrage": {
"ai_embedding": [
[
{
"node": "Supabase Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Supabase \u2013 Chunks speichern": {
"main": [
[]
]
},
"OpenAI Embeddings \u2013 Indexierung": {
"ai_embedding": [
[
{
"node": "Supabase \u2013 Chunks speichern",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Google Drive \u2013 Dateien auflisten": {
"main": [
[
{
"node": "Loop \u2013 Jede Datei",
"type": "main",
"index": 0
}
]
]
},
"T\u00e4glich 02:00 Uhr \u2013 Auto-Reindex": {
"main": [
[
{
"node": "Google Drive \u2013 Dateien auflisten",
"type": "main",
"index": 0
}
]
]
},
"Google Drive \u2013 Datei herunterladen": {
"main": [
[
{
"node": "Loop \u2013 Jede Datei",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow indexes text files from Google Drive into a Supabase vector store using OpenAI embeddings, then answers Placetel webhook questions with a Groq-hosted Llama model using retrieval-augmented generation. Runs a daily schedule at 02:00 or starts manually to reindex…
Source: https://n8n.io/workflows/16411/ — 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.
My Workflow. Uses outputParserStructured, httpRequest, lmChatGoogleGemini, chainLlm. Scheduled trigger; 82 nodes.
This comprehensive workflow bundle is designed as a powerful starter kit, enabling you to build a multi-functional AI assistant on Telegram. It seamlessly integrates AI-powered voice interactions, an
Search Worflow Docker Complete. Uses documentDefaultDataLoader, textSplitterCharacterTextSplitter, vectorStoreSupabase, embeddingsOllama. Scheduled trigger; 71 nodes.
HeyDinastia. Uses executeCommand, httpRequest, youTube, postgres. Webhook trigger; 66 nodes.
crawl4 ai. Uses documentDefaultDataLoader, textSplitterCharacterTextSplitter, vectorStoreSupabase, embeddingsOllama. Scheduled trigger; 65 nodes.