AutomationFlowsAI & RAG › Answer Webhook Voice Queries From Google Drive Docs Using Gpt-4o-mini and…

Answer Webhook Voice Queries From Google Drive Docs Using Gpt-4o-mini and…

Original n8n title: Answer Webhook Voice Queries From Google Drive Docs Using Gpt-4o-mini and Supabase

ByPlacetel @placetel on n8n.io

This workflow indexes Google Drive documents into a Supabase vector store using OpenAI embeddings, then exposes a webhook that uses a GPT-4o-mini RAG agent to answer incoming questions with short, voice-friendly responses grounded in the stored documents. Runs on a daily…

Cron / scheduled trigger★★★★☆ complexityAI-powered20 nodesHTTP RequestGoogle DriveDocument Default Data LoaderOpenAI EmbeddingsSupabase Vector StoreAgentOpenAI Chat
AI & RAG Trigger: Cron / scheduled Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16136 — we link there as the canonical source.

This workflow follows the Agent → Documentdefaultdataloader 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 →

Download .json
{
  "meta": {
    "templateId": "rag-knowledge-base-webhook-voice"
  },
  "name": "RAG Knowledge Base \u2013 Webhook to Voice Assistant",
  "tags": [],
  "nodes": [
    {
      "id": "f03da6d9-93b6-4040-8d39-3054ad137cbe",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -848,
        -528
      ],
      "parameters": {
        "color": 4,
        "width": 712,
        "height": 460,
        "content": "\ud83d\udcda LOAD DATA FLOW \u2013 Dokumenten-Indexierung\n\nZweck:\nLiest Dokumente aus einer Quelle (z.B. Google Drive) \nund speichert sie als Vektoren in einer \nVektordatenbank. 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- Ordner-ID / Quelle anpassen\n- Embeddings Modell festlegen\n- Vector Store Credentials hinterlegen\n- Nur unterst\u00fctzte Dateiformate verwenden"
      },
      "typeVersion": 1
    },
    {
      "id": "4b88caba-d028-44cc-a2e9-dd3fda4e4a76",
      "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": "69a4dd21-b126-49a6-b533-1e13f497edaf",
      "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": "9a922612-b2a9-4061-9b4c-fab7ffad57bc",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        528,
        -496
      ],
      "parameters": {
        "color": 4,
        "width": 832,
        "height": 432,
        "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\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- LLM Modell und Credentials hinterlegen\n- Gleiches Embeddings Modell wie Load Flow verwenden!"
      },
      "typeVersion": 1
    },
    {
      "id": "fcbcfab3-4a0b-41a7-8aa3-006e8243c6cd",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        -288
      ],
      "parameters": {
        "width": 384,
        "height": 224,
        "content": "\u26a0\ufe0f WICHTIG \u2013 Embeddings Konsistenz\n\nDas Embeddings Modell muss in BEIDEN Flows \nidentisch sein:\n- Load Data Flow: Embeddings Node\n- Retriever Flow: Embeddings Node\n\nUnterschiedliche Modelle f\u00fchren zu \nfehlerhaften Suchergebnissen!"
      },
      "typeVersion": 1
    },
    {
      "id": "41b1c997-0db4-4a69-919f-d91a87a4be13",
      "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": "e93b10b5-a806-40b1-a2e6-da44c0705dba",
      "name": "Manueller Start \u2013 Reindex",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -832,
        320
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "14c54b2d-26bd-421c-a411-4fe5306576a1",
      "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": "b2578a63-93ce-4525-a91e-f3304df21775",
      "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": "a35e3a56-f890-4096-94b6-449a8ddf70c8",
      "name": "Loop \u2013 Jede Datei",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -368,
        320
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "f859c1fe-0601-4a66-bdc6-f13150c69597",
      "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": "647dcab8-973e-49e4-b156-ea34c4614713",
      "name": "Text Loader",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        224,
        304
      ],
      "parameters": {
        "loader": "textLoader",
        "options": {},
        "dataType": "binary"
      },
      "typeVersion": 1.1
    },
    {
      "id": "8a164618-fe3b-406d-b79b-2aae6cb89a89",
      "name": "OpenAI Embeddings \u2013 Indexierung",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        -80,
        304
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "259f433a-22fa-48e8-9866-a80cd2d361b4",
      "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": "28e07b4b-b35c-4c08-8c94-2ed06b52a1ea",
      "name": "Webhook \u2013 Frage empfangen",
      "type": "n8n-nodes-base.webhook",
      "position": [
        576,
        80
      ],
      "parameters": {
        "path": "rag-knowledge-webhook",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "2a6e3d1a-f33c-4756-98ac-0334749ed5ac",
      "name": "RAG \u2013 Antwort generieren",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        816,
        80
      ],
      "parameters": {
        "text": "={{ $json.body.chatInput }}",
        "options": {
          "systemMessage": "Du bist ein hilfreicher Assistent. Beantworte Fragen ausschlie\u00dflich auf Basis der bereitgestellten Dokumente. Antworte kurz und klar (maximal 5 S\u00e4tze) \u2013 die Antwort wird vorgelesen. Wenn du eine Frage nicht beantworten kannst, sage: 'Dazu habe ich leider keine Information.' Gib am Ende immer die Quelle (Dateiname) an."
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "d39e90a9-5f92-4b0f-b5b1-0164ffd8c65c",
      "name": "GPT-4o-mini",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        688,
        288
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "2675b084-e2d3-463b-b035-0843bcbe9eb9",
      "name": "Supabase \u2013 Wissensdatenbank",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        880,
        320
      ],
      "parameters": {
        "mode": "retrieve-as-tool",
        "options": {
          "queryName": "match_documents"
        },
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "documents",
          "cachedResultName": "documents"
        },
        "toolDescription": "Wissensdatenbank. Durchsucht indexierte Dokumente semantisch und gibt relevante Textpassagen zur\u00fcck."
      },
      "typeVersion": 1.3
    },
    {
      "id": "a4d7be78-7ed4-4d83-a2a0-b4e50aef4436",
      "name": "OpenAI Embeddings \u2013 Abfrage",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        1024,
        528
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "2aed682a-ccfc-4d8c-9803-d6c3000fa55f",
      "name": "Webhook \u2013 Antwort zur\u00fcckgeben",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1168,
        80
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.5
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "GPT-4o-mini": {
      "ai_languageModel": [
        [
          {
            "node": "RAG \u2013 Antwort generieren",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Text Loader": {
      "ai_document": [
        [
          {
            "node": "Supabase \u2013 Chunks speichern",
            "type": "ai_document",
            "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
          }
        ]
      ]
    },
    "RAG \u2013 Antwort generieren": {
      "main": [
        [
          {
            "node": "Webhook \u2013 Antwort zur\u00fcckgeben",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manueller Start \u2013 Reindex": {
      "main": [
        [
          {
            "node": "Google Drive \u2013 Dateien auflisten",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook \u2013 Frage empfangen": {
      "main": [
        [
          {
            "node": "RAG \u2013 Antwort generieren",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Embeddings \u2013 Abfrage": {
      "ai_embedding": [
        [
          {
            "node": "Supabase \u2013 Wissensdatenbank",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Supabase \u2013 Chunks speichern": {
      "main": [
        []
      ]
    },
    "Supabase \u2013 Wissensdatenbank": {
      "ai_tool": [
        [
          {
            "node": "RAG \u2013 Antwort generieren",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "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
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow indexes Google Drive documents into a Supabase vector store using OpenAI embeddings, then exposes a webhook that uses a GPT-4o-mini RAG agent to answer incoming questions with short, voice-friendly responses grounded in the stored documents. Runs on a daily…

Source: https://n8n.io/workflows/16136/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

WooriFisa. Uses agent, httpRequest, documentDefaultDataLoader, vectorStorePinecone. Scheduled trigger; 86 nodes.

Agent, HTTP Request, Document Default Data Loader +14
AI & RAG

WooriFisa 최종. Uses memoryMongoDbChat, agent, httpRequest, documentDefaultDataLoader. Scheduled trigger; 68 nodes.

Memory Mongo Db Chat, Agent, HTTP Request +14
AI & RAG

Overview

Agent, OpenAI Chat, HTTP Request +7
AI & RAG

AI-Business-Agent. Uses vectorStoreSupabase, embeddingsOpenAi, documentDefaultDataLoader, textSplitterRecursiveCharacterTextSplitter. Scheduled trigger; 27 nodes.

Supabase Vector Store, OpenAI Embeddings, Document Default Data Loader +7
AI & RAG

This workflow automatically indexes your n8n workflows every 24 hours, converts them into vector embeddings using OpenAI and stores them in Supabase. It exposes a webhook that lets you query your work

HTTP Request, Supabase, Document Default Data Loader +5