KI-Lernassistent (RAG): Google Gemini mit Drive und Supabase Vektorsuche
Dies ist ein Personal Productivity, AI RAG-Bereich Automatisierungsworkflow mit 28 Nodes. Hauptsächlich werden Code, Postgres, GoogleDrive, SplitInBatches, Agent und andere Nodes verwendet. KI-Lernassistent (RAG): Google Gemini mit Drive und Supabase Vektorsuche
- •PostgreSQL-Datenbankverbindungsdaten
- •Google Drive API-Anmeldedaten
- •Google Gemini API Key
- •Supabase URL und API Key
Verwendete Nodes (28)
Kategorie
{
"meta": {
"instanceId": "a243f35537ecbb3a29ba49c4cf2200720075b362bcc7d02523f79748238bcfd6",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "0db018d8-693f-4e47-be62-4b34d7b8d77f",
"name": "Einbettungen Google Gemini",
"type": "@n8n/n8n-nodes-langchain.embeddingsGoogleGemini",
"position": [
912,
592
],
"parameters": {},
"credentials": {
"googlePalmApi": {
"id": "VCZQfcHNj0rHxcNf",
"name": "GEMINI_API_KUDDUS"
}
},
"typeVersion": 1
},
{
"id": "edf2e17e-a730-486b-8e2a-8acaef9e84a3",
"name": "Supabase Vektorspeicher",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
912,
400
],
"parameters": {
"mode": "retrieve-as-tool",
"options": {},
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
},
"toolDescription": "Use this tool to search and retrieve relevant information from the user's study materials stored in the vector database. Query the documents to answer user questions accurately."
},
"credentials": {
"supabaseApi": {
"id": "OweRv8RLSfhKJyfg",
"name": "Supabase account"
}
},
"typeVersion": 1.3
},
{
"id": "1a55495f-44be-4c71-9a9d-f4886a8980a8",
"name": "Postgres Chat Speicher",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
368,
608
],
"parameters": {
"sessionKey": "={{ $json.sessionId }}",
"sessionIdType": "customKey",
"contextWindowLength": 10
},
"credentials": {
"postgres": {
"id": "KbYSAyR6T3ljhFKn",
"name": "Postgres account"
}
},
"typeVersion": 1.3
},
{
"id": "39d7a9b3-66d8-41fb-8454-6a80885131d1",
"name": "Rechner",
"type": "@n8n/n8n-nodes-langchain.toolCalculator",
"position": [
768,
464
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d943532d-4ae7-4829-a381-191cf84ea622",
"name": "Bei Chat-Nachricht empfangen",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
176,
192
],
"webhookId": "6f7911bb-b08c-40ba-b613-a81d3d26ee18",
"parameters": {
"public": true,
"options": {}
},
"typeVersion": 1.3
},
{
"id": "f37c1723-0049-4b1d-8354-3acfd5179cb4",
"name": "Google Gemini-Chat-Modell",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
256,
448
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-pro"
},
"credentials": {
"googlePalmApi": {
"id": "VCZQfcHNj0rHxcNf",
"name": "GEMINI_API_KUDDUS"
}
},
"typeVersion": 1
},
{
"id": "225fb496-37d1-4dd7-b008-179ebb0880cc",
"name": "Folder all file to vector",
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"position": [
576,
448
],
"parameters": {
"workflowId": {
"__rl": true,
"mode": "list",
"value": "DXm6uptDmBBGVVWV",
"cachedResultUrl": "/workflow/DXm6uptDmBBGVVWV",
"cachedResultName": "Drive folder all file to Supabase Vector Store Database for RAG"
},
"workflowInputs": {
"value": {
"Drive_Folder_link": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Drive_Folder_link', ``, 'string') }}"
},
"schema": [
{
"id": "Drive_Folder_link",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Drive_Folder_link",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Drive_Folder_link"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"typeVersion": 2.2
},
{
"id": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"name": "Study Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
448,
192
],
"parameters": {
"text": "={{ $json.chatInput }}",
"options": {
"systemMessage": "You are a Study AI Assistant that helps users interact with their study materials in a natural, conversational way.\n\n## Core Behavior\n\n**Always respond conversationally and helpfully.** You can answer questions, provide information from stored materials, and assist with file uploads - all while maintaining a friendly, natural dialogue.\n\n## Input Handling\n\n### 1. Google Drive Links\nWhen you detect a Google Drive URL (folder or file):\n- **Pattern**: `https://drive.google.com/drive/folders/` or `https://drive.google.com/file/d/`\n- **Action**: Automatically trigger the `DriveFolderToSupabase` workflow\n- **Response**: Confirm the upload is processing: \"I'm uploading your files to the vector store. This will take a moment...\"\n\n### 2. Study Material Queries\nWhen users ask questions about their materials:\n- **Search the vector store** using available retrieval tools\n- **Always check the vector store first** before saying you don't have information\n- Provide clear, helpful answers with citations\n- Include document names, sections, or page numbers when available\n\n### 3. General Conversation\nWhen users engage in general conversation:\n- Respond naturally and helpfully\n- If they're asking about themselves or their materials, **search the vector store**\n- Use context from previous messages in the conversation\n- Be conversational, not robotic\n\n## Critical Rules\n\n1. **Never refuse to search**: If someone asks \"what is in the documents\" or \"tell me about X\", immediately query the vector store with relevant keywords\n2. **Infer intent**: Questions like \"about me\", \"what's my name\", or \"vector database\" should trigger a vector store search for relevant content\n3. **Use broad searches**: When unsure, search with general terms rather than refusing to help\n4. **Acknowledge limitations gracefully**: Only say you can't find information AFTER searching, not before\n5. **Maintain conversation context**: Reference previous exchanges naturally\n\n## Search Strategy\n\nWhen querying the vector store:\n- Use **keywords and concepts** from the user's question\n- Try **multiple related terms** if the first search yields poor results\n- For vague queries like \"tell me what's in the documents\", search with terms like: \"overview\", \"introduction\", \"main topic\", \"summary\"\n- **Always attempt a search** before saying you don't have the information\n\n## Response Format\n\n- **Direct answers** to questions\n- **Cite sources** when providing information from documents\n- **Suggest related topics** when appropriate\n- **Ask clarifying questions** only when absolutely necessary (not as a default)\n\n## Examples\n\n**Bad Response**: \"I need a specific question or topic to search for.\"\n**Good Response**: *[Searches vector store]* \"Based on your uploaded materials, I found information about [topic]. Here's what I can tell you...\"\n\n**Bad Response**: \"I don't have access to personal information like your name.\"\n**Good Response**: *[Searches vector store for personal info]* \"I searched your documents and found [relevant information], or if nothing is found: \"I searched your uploaded materials but didn't find personal information stored. What would you like to know about your study content?\"\n"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "cf65699a-9e5a-4c24-b256-fe3892c154fd",
"name": "Haftnotiz",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
96
],
"parameters": {
"width": 336,
"height": 640,
"content": "# 🤖 AI Study Assistant (RAG Chat)\n\n**Purpose:** Conversational AI that helps you study by answering questions from your uploaded documents.\n\n**Flow:** Chat Input → AI Agent → Vector Search + Memory + Tools → Response\n\n**Key Features:**\n- Natural conversation with your study materials\n- Auto-processes Drive links shared in chat\n- Semantic search across documents\n- Persistent chat memory\n- Calculator for math problems\n\n**Tools Connected:**\n1. Supabase Vector Store (document search)\n2. Drive Folder Uploader (auto-index new files)\n3. Calculator (math operations)\n4. Postgres Memory (conversation history)\n"
},
"typeVersion": 1
},
{
"id": "eddf672b-4bd8-45d6-bf4e-29ddd688f1e5",
"name": "Haftnotiz1",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
32
],
"parameters": {
"color": 4,
"width": 288,
"height": 352,
"content": "**AI Agent (Core)** - Orchestrates all tools and memory. Handles Drive links, searches documents, maintains context, and responds naturally using Gemini 2.5 Pro.\n"
},
"typeVersion": 1
},
{
"id": "c201dfbd-714c-4629-8a49-9acc006af38a",
"name": "Haftnotiz2",
"type": "n8n-nodes-base.stickyNote",
"position": [
912,
256
],
"parameters": {
"height": 272,
"content": "**Document Search Tool** - Retrieves relevant information from uploaded study materials using semantic similarity search with 768-dim embeddings.\n"
},
"typeVersion": 1
},
{
"id": "e29b5f39-3fcb-40b2-9ba0-02ef7d070f2a",
"name": "Haftnotiz3",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
512
],
"parameters": {
"height": 208,
"content": "\n\n\n\n\n\n**Drive Uploader Tool** - When user shares a Drive link in chat, automatically triggers the indexing workflow to add files to vector store.\n"
},
"typeVersion": 1
},
{
"id": "54a5e290-1ec4-4b97-96ed-d424aaf3c2ca",
"name": "Einbettungen Google Gemini4",
"type": "@n8n/n8n-nodes-langchain.embeddingsGoogleGemini",
"position": [
1232,
1392
],
"parameters": {},
"credentials": {
"googlePalmApi": {
"id": "VCZQfcHNj0rHxcNf",
"name": "GEMINI_API_KUDDUS"
}
},
"typeVersion": 1
},
{
"id": "7682b868-5215-452d-b110-ff8007f2d059",
"name": "Default Data Loader2",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
1408,
1376
],
"parameters": {
"options": {},
"dataType": "binary"
},
"typeVersion": 1.1
},
{
"id": "ceacbea3-3c6a-47d1-83a6-386cb1166414",
"name": "Execute a SQL query",
"type": "n8n-nodes-base.postgres",
"position": [
400,
1120
],
"parameters": {
"query": "DROP TABLE IF EXISTS documents CASCADE;\n\nCREATE EXTENSION IF NOT EXISTS vector;\n\nCREATE TABLE IF NOT EXISTS documents (\n id bigserial PRIMARY KEY,\n content text,\n metadata jsonb,\n embedding vector(768)\n);\n\nCREATE OR REPLACE FUNCTION match_documents(\n query_embedding vector(768),\n match_count int DEFAULT NULL,\n filter jsonb DEFAULT '{}'::jsonb\n)\nRETURNS TABLE (\n id bigint,\n content text,\n metadata jsonb,\n similarity double precision\n)\nLANGUAGE sql\nAS $$\n SELECT\n d.id,\n d.content,\n d.metadata,\n 1 - (d.embedding <=> query_embedding) AS similarity\n FROM documents d\n WHERE (filter = '{}'::jsonb OR d.metadata @> filter)\n ORDER BY d.embedding <=> query_embedding\n LIMIT match_count;\n$$;\n",
"options": {},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "KbYSAyR6T3ljhFKn",
"name": "Postgres account"
}
},
"typeVersion": 2.6
},
{
"id": "90883ae9-8d17-4a72-83be-da4dae013343",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
176,
1120
],
"parameters": {
"jsCode": "// Get the Drive_Folder_link from the workflow input\nconst driveUrl = $input.first().json.Drive_Folder_link;\n\n// Extract Google Drive folder/file ID from URL\nfunction getDriveId(url) {\n const folderMatch = url.match(/\\/folders\\/([a-zA-Z0-9_-]+)/);\n const fileMatch = url.match(/\\/file\\/d\\/([a-zA-Z0-9_-]+)/);\n return folderMatch ? folderMatch[1] : (fileMatch ? fileMatch[1] : null);\n}\n\n// Process input items\nreturn items.map(item => {\n const chatInput = item.json.chatInput || driveUrl || '';\n const driveId = getDriveId(chatInput);\n\n return {\n json: {\n originalInput: chatInput,\n folderId: driveId,\n driveId: driveId\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "1e5ac5c6-ae2c-400d-b531-a18c823a3d07",
"name": "When Executed by Another Workflow",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
-32,
1120
],
"parameters": {
"inputSource": "jsonExample",
"jsonExample": "{\n \"Drive_Folder_link\": \"https://drive.google.com/drive/folders/example\"\n}"
},
"typeVersion": 1.1
},
{
"id": "472c0470-a590-476a-b23b-77617b042a39",
"name": "Über Elemente schleifen",
"type": "n8n-nodes-base.splitInBatches",
"position": [
832,
1120
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "8e8a66a7-9a2c-4ed9-91b3-80d805b1dbab",
"name": "Dateien und Ordner suchen",
"type": "n8n-nodes-base.googleDrive",
"position": [
608,
1120
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Code in JavaScript').item.json.folderId }}"
}
},
"options": {},
"resource": "fileFolder"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "CVN95k3ctbjWs60e",
"name": "Google_Drive_gaming"
}
},
"typeVersion": 3
},
{
"id": "21559a2e-f0d3-40a1-8809-5f2a31cde811",
"name": "Insert into Supabase Vectorstore",
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
"position": [
1280,
1120
],
"parameters": {
"mode": "insert",
"options": {
"queryName": "match_documents"
},
"tableName": {
"__rl": true,
"mode": "list",
"value": "documents",
"cachedResultName": "documents"
}
},
"credentials": {
"supabaseApi": {
"id": "OweRv8RLSfhKJyfg",
"name": "Supabase account"
}
},
"typeVersion": 1
},
{
"id": "a818d7b0-1c5e-4273-96d1-d72ff2960823",
"name": "Datei herunterladen",
"type": "n8n-nodes-base.googleDrive",
"position": [
1072,
1136
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"googleFileConversion": {
"conversion": {
"docsToFormat": "text/plain"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "CVN95k3ctbjWs60e",
"name": "Google_Drive_gaming"
}
},
"typeVersion": 3
},
{
"id": "0cf08172-6b3e-44a9-aec7-44a2b5e582ff",
"name": "Haftnotiz4",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
1296
],
"parameters": {
"width": 176,
"height": 128,
"content": "**List Drive Files** - Retrieves all files from the specified Google Drive folder using extracted folder ID.\n"
},
"typeVersion": 1
},
{
"id": "98009dab-d49a-4205-9d9b-da29c3560d98",
"name": "Haftnotiz5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1040,
960
],
"parameters": {
"width": 150,
"content": "**List Drive Files** - Retrieves all files from the specified Google Drive folder using extracted folder ID.\n"
},
"typeVersion": 1
},
{
"id": "57415dae-d6cd-4c5a-8305-ee9100bec975",
"name": "Haftnotiz6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
864
],
"parameters": {
"color": 7,
"height": 240,
"content": "**Store Embeddings** - Generates 768-dim vectors via Gemini and inserts documents into Supabase for semantic search.\n**AI Embeddings** - Converts text to 768-dimensional vectors using Google Gemini text-embedding-004 model.\n**Document Loader** - Extracts and formats text from binary files for the embedding generator.\n"
},
"typeVersion": 1
},
{
"id": "677fd038-4cd9-483b-84ff-98373a6affb4",
"name": "Haftnotiz7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
944
],
"parameters": {
"color": 5,
"width": 368,
"height": 512,
"content": "# 📁 Drive to Supabase Vector Store for Study RAG\n\nProcesses Google Drive folder files into Supabase vector embeddings for RAG applications.\n\n**Flow:** Drive URL → Parse ID → Init DB → Fetch Files → Loop → Download → Embed → Store\n\n**Requirements:**\n- Google Drive OAuth2\n- Supabase + Postgres credentials\n- Google Gemini API key\n\n**Input:** `{\"Drive_Folder_link\": \"your_drive_url\"}`\n**Output:** Vector embeddings in Supabase documents table\n"
},
"typeVersion": 1
},
{
"id": "975c4447-f0fe-48fd-afb9-e4da35b30080",
"name": "Haftnotiz8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
1280
],
"parameters": {
"width": 176,
"height": 128,
"content": "**Trigger Node** - Starts workflow when called from another n8n workflow. Accepts Drive folder URL as input.\n"
},
"typeVersion": 1
},
{
"id": "a9cdb11e-fbb5-43b8-aa5d-6ea48be4fc85",
"name": "Haftnotiz9",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
1280
],
"parameters": {
"width": 150,
"height": 128,
"content": "**Extract Folder ID** - Parses Google Drive URL using regex to extract folder/file ID for API calls.\n"
},
"typeVersion": 1
},
{
"id": "01282543-fd57-4815-af73-bf26a2ff4a12",
"name": "Haftnotiz10",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
1280
],
"parameters": {
"width": 176,
"content": "**Initialize Database** - Creates Supabase vector table with pgvector extension and match_documents search function. ⚠️ Drops existing table!\n"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Calculator": {
"ai_tool": [
[
{
"node": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"type": "ai_tool",
"index": 0
}
]
]
},
"Download File": {
"main": [
[
{
"node": "21559a2e-f0d3-40a1-8809-5f2a31cde811",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Download File",
"type": "main",
"index": 0
}
]
]
},
"90883ae9-8d17-4a72-83be-da4dae013343": {
"main": [
[
{
"node": "ceacbea3-3c6a-47d1-83a6-386cb1166414",
"type": "main",
"index": 0
}
]
]
},
"ceacbea3-3c6a-47d1-83a6-386cb1166414": {
"main": [
[
{
"node": "Search files and folders",
"type": "main",
"index": 0
}
]
]
},
"7682b868-5215-452d-b110-ff8007f2d059": {
"ai_document": [
[
{
"node": "21559a2e-f0d3-40a1-8809-5f2a31cde811",
"type": "ai_document",
"index": 0
}
]
]
},
"Postgres Chat Memory": {
"ai_memory": [
[
{
"node": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"type": "ai_memory",
"index": 0
}
]
]
},
"Supabase Vector Store": {
"ai_tool": [
[
{
"node": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"type": "ai_tool",
"index": 0
}
]
]
},
"Embeddings Google Gemini": {
"ai_embedding": [
[
{
"node": "Supabase Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Search files and folders": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Embeddings Google Gemini4": {
"ai_embedding": [
[
{
"node": "21559a2e-f0d3-40a1-8809-5f2a31cde811",
"type": "ai_embedding",
"index": 0
}
]
]
},
"225fb496-37d1-4dd7-b008-179ebb0880cc": {
"ai_tool": [
[
{
"node": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"type": "ai_tool",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "2cec8fcc-a3ed-459e-9e30-1fad8a7b6765",
"type": "main",
"index": 0
}
]
]
},
"21559a2e-f0d3-40a1-8809-5f2a31cde811": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"1e5ac5c6-ae2c-400d-b531-a18c823a3d07": {
"main": [
[
{
"node": "90883ae9-8d17-4a72-83be-da4dae013343",
"type": "main",
"index": 0
}
]
]
}
}
}Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Experte - Persönliche Produktivität, KI RAG
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
Mantaka Mahir
@mantakamahirAl Automation Expert || Al Agents || n8n || Python || LangChain || Helping businesses scale revenue and reduce costs with Al driven automation .
Diesen Workflow teilen