{
  "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
          }
        ]
      ]
    }
  }
}