AutomationFlowsAI & RAG › Build a Product Catalog Chatbot with Mistral Ai, Google Drive & Supabase RAG

Build a Product Catalog Chatbot with Mistral Ai, Google Drive & Supabase RAG

ByDIGITAL BIZ TECH @dbt on n8n.io

This workflow builds a dual-system that connects automated document ingestion with a live product catalog chatbot powered by Mistral AI and Supabase.

Event trigger★★★★★ complexityAI-powered40 nodesGoogle DriveDocument Default Data LoaderText Splitter Character Text SplitterEmbeddings Mistral CloudSupabase Vector StoreLm Chat Mistral CloudMemory Buffer WindowChat Trigger
AI & RAG Trigger: Event Nodes: 40 Complexity: ★★★★★ AI nodes: yes Added:

This workflow corresponds to n8n.io template #10459 — 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 →

Download .json
{
  "nodes": [
    {
      "id": "7ee96301-3c33-431e-b098-827e4ff1ef9a",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1824,
        304
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "87114bf9-78cf-434f-b1ef-892d7a88665c",
      "name": "Set File ID",
      "type": "n8n-nodes-base.set",
      "position": [
        -1328,
        320
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "10646eae-ae46-4327-a4dc-9987c2d76173",
              "name": "file_id",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "f4536df5-d0b1-4392-bf17-b8137fb31a44",
              "name": "file_type",
              "type": "string",
              "value": "={{ $json.mimeType }}"
            },
            {
              "id": "77d782de-169d-4a46-8a8e-a3831c04d90f",
              "name": "file_title",
              "type": "string",
              "value": "={{ $json.name }}"
            },
            {
              "id": "9bde4d7f-e4f3-4ebd-9338-dce1350f9eab",
              "name": "file_url",
              "type": "string",
              "value": "={{ $json.webViewLink }}"
            },
            {
              "id": "fae402c8-c486-4b57-8d28-bf669db6b442",
              "name": "last_modified_date",
              "type": "string",
              "value": "={{ $json.modifiedTime }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "08806589-35a2-47f5-8478-a5833921a378",
      "name": "Google Drive1",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -2080,
        304
      ],
      "parameters": {
        "limit": 150,
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "url",
            "value": "="
          }
        },
        "options": {
          "fields": [
            "id",
            "name",
            "webViewLink",
            "mimeType",
            "*"
          ]
        },
        "resource": "fileFolder",
        "searchMethod": "query"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "e9769228-810b-49ad-b3f3-9ba506426a10",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -896,
        320
      ],
      "parameters": {
        "options": {},
        "operation": "fromJson"
      },
      "typeVersion": 1
    },
    {
      "id": "4d617e84-f840-44db-9c0b-f1b8e7a510b3",
      "name": "Default Data Loader1",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        128,
        480
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "source_url",
                "value": "={{ $json.metadata.url }}"
              },
              {
                "name": "blobType",
                "value": "application/jsonb"
              },
              {
                "name": "loc",
                "value": "={{ $json.metadata.loc }}"
              },
              {
                "name": "title",
                "value": "={{ $json.metadata.title }}"
              },
              {
                "name": "page_no",
                "value": "={{ $json.metadata.page }}"
              },
              {
                "name": "topics",
                "value": "={{ $('map data into fields').item.json['topics '] }}"
              }
            ]
          }
        },
        "jsonData": "={{ $json.content }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "60638340-405f-40f0-a366-0d0cfeaa748f",
      "name": "Character Text Splitter1",
      "type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
      "position": [
        208,
        592
      ],
      "parameters": {
        "chunkSize": 100000
      },
      "typeVersion": 1
    },
    {
      "id": "338993e9-5533-48be-aca5-0b7f94e407cd",
      "name": "Embeddings Mistral Cloud2",
      "type": "@n8n/n8n-nodes-langchain.embeddingsMistralCloud",
      "position": [
        16,
        608
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "28c68d4a-a057-4844-99ce-d8ba61dc8635",
      "name": "Insert into Supabase Vectorstore",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        32,
        320
      ],
      "parameters": {
        "mode": "insert",
        "options": {
          "queryName": "match_website_mark"
        },
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "website_mark",
          "cachedResultName": "website_mark"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "10d4cdd8-bb87-47fe-815d-9df3dbb00a64",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        -720,
        320
      ],
      "parameters": {
        "amount": 8
      },
      "typeVersion": 1.1
    },
    {
      "id": "60509aa4-872a-40bd-873c-665d59ef8d88",
      "name": "Wait4",
      "type": "n8n-nodes-base.wait",
      "position": [
        560,
        320
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "cb7a06ea-1272-48d3-bd3b-c26401b3c6a6",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2368,
        304
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "df903e02-f71d-49e8-b247-b285b9229ac2",
      "name": "Supabase Vector Store",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        -1072,
        1488
      ],
      "parameters": {
        "mode": "retrieve-as-tool",
        "topK": 10,
        "options": {
          "queryName": "match_product"
        },
        "toolName": "documents",
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "products",
          "cachedResultName": "products"
        },
        "toolDescription": "Use RAG to look up information in the knowledgebase."
      },
      "typeVersion": 1
    },
    {
      "id": "8a39783b-5c59-4f6a-817a-d18f2aad682e",
      "name": "Mistral Cloud Chat Model4",
      "type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
      "position": [
        -1856,
        1552
      ],
      "parameters": {
        "model": "mistral-medium-latest",
        "options": {
          "temperature": 0.7
        }
      },
      "typeVersion": 1
    },
    {
      "id": "44f63ffe-17ae-4ad4-9f9a-b40f9e12f045",
      "name": "Embeddings Mistral Cloud",
      "type": "@n8n/n8n-nodes-langchain.embeddingsMistralCloud",
      "position": [
        -1232,
        1552
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "41d840ba-6ee3-4c90-9a9f-e5261f6dadb1",
      "name": "Simple Memory1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -1632,
        1536
      ],
      "parameters": {
        "contextWindowLength": 15
      },
      "typeVersion": 1.3
    },
    {
      "id": "dec01f91-30f9-4410-ae0e-30466607e5a3",
      "name": "Webhook1",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -2208,
        1232
      ],
      "parameters": {
        "path": "b4c843be-698d-40c6-8e31-9370f5e165e0",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "c209a25c-eb4d-4a48-9055-0b132ab1f772",
      "name": "Edit Fields1",
      "type": "n8n-nodes-base.set",
      "position": [
        -2048,
        1232
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9a9a245e-f1a1-4282-bb02-a81ffe629f0f",
              "name": "chatInput",
              "type": "string",
              "value": "={{ $json.chatInput || $json.body?.chatInput || $json.body?.[0]?.chatInput }}"
            },
            {
              "id": "b80831d8-c653-4203-8706-adedfdb98f77",
              "name": "sessionId",
              "type": "string",
              "value": "={{ $json.sessionId || $json.body?.sessionId || $json.body?.[0]?.sessionId }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "52e03830-fc49-4bb4-b9da-b7694c237870",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2144,
        176
      ],
      "parameters": {
        "color": 5,
        "height": 336,
        "content": "## Drive ingestion\nFinds files in the configured Drive folder. Loops over items and downloads each file.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "df9dba08-cc68-4268-ad4b-a27faa661fce",
      "name": "extract metadata",
      "type": "n8n-nodes-base.code",
      "position": [
        -1600,
        320
      ],
      "parameters": {
        "jsCode": "// n8n Code Node - SharePoint URL with Version Parameter\n// Use this in a \"Code\" node in n8n\n\nconst items = $input.all();\n\nconst outputItems = items.map(item => {\n  const data = item.json;\n  \n  // Use existing LinkingUrl if available\n  if (data.LinkingUrl) {\n    return {\n      json: {\n        ...data,\n        fileUrl: data.LinkingUrl\n      }\n    };\n  }\n  \n  // Construct versioned URL\n  let fileUrl = '';\n  \n  if (data.ServerRelativeUrl && data.ContentTag) {\n    // Base URL with server relative path\n    fileUrl = 'https://nosta.sharepoint.com' + data.ServerRelativeUrl;\n    \n    // Extract GUID from ContentTag and create version parameter\n    const guidMatch = data.ContentTag.match(/\\{([^}]+)\\}/);\n    if (guidMatch) {\n      const versionId = guidMatch[1].toLowerCase().replace(/-/g, '');\n      fileUrl += `?d=w${versionId}`;\n    }\n  }\n  \n  return {\n    json: {\n      ...data,\n      fileUrl: fileUrl\n    }\n  };\n});\n\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "c387499d-5e44-4385-8cc6-16e28b7b4d7e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        192
      ],
      "parameters": {
        "color": 5,
        "width": 192,
        "height": 304,
        "content": "## map extracted metadata "
      },
      "typeVersion": 1
    },
    {
      "id": "6bc90f18-32ff-47ae-a4be-727d42580393",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -352,
        208
      ],
      "parameters": {
        "color": 5,
        "height": 272,
        "content": "### Chunk & split\nCreates text chunks with overlap to prepare for embeddings.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7f030ecd-600a-47a7-976d-f4a456e375db",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1152,
        192
      ],
      "parameters": {
        "color": 5,
        "width": 192,
        "height": 304,
        "content": "### downloaded file from google drive"
      },
      "typeVersion": 1
    },
    {
      "id": "3a18d2df-f3d3-436f-a43f-c556619b33f9",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        192
      ],
      "parameters": {
        "color": 5,
        "width": 208,
        "height": 304,
        "content": "### Parse content\nConverts downloaded file into JSON/text and attaches minimal metadata (page, title, source_url)."
      },
      "typeVersion": 1
    },
    {
      "id": "9e71eb01-c2b9-478f-bdc5-161fd1dcf70f",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        208
      ],
      "parameters": {
        "color": 5,
        "width": 182,
        "height": 272,
        "content": "## Map fields\nMaps parsed JSON into standardized fields\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0f48281c-ce78-4bbe-bacd-cf8ae0ea44cb",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1648,
        160
      ],
      "parameters": {
        "color": 5,
        "width": 176,
        "height": 352,
        "content": "## Extract metadata\nPulls file id, title, modified date, and other metadata used downstream.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "092ea181-86c2-4727-a5ce-24dc94cc8e31",
      "name": "Google Drive  get file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -1088,
        320
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.file_id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "5f6a16f5-e10a-4015-acdb-cdbeb4e2a321",
      "name": "map data into fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -528,
        320
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "639b4deb-04df-4b10-a146-65e83d98537a",
              "name": "title",
              "type": "string",
              "value": "={{ $json.data.page_title }} && {{ $json.data.title }}  "
            },
            {
              "id": "a9c8c87e-86e5-48ac-b7e4-e5ac23b48ca9",
              "name": "summary",
              "type": "string",
              "value": "={{ $json.data.comprehensive_summary }}  "
            },
            {
              "id": "8bdd5e0e-585c-4d39-a688-8994cf1145fd",
              "name": "topics ",
              "type": "string",
              "value": "={{ $json.data.key_topics }} "
            },
            {
              "id": "0d5bfbfc-b1c0-4ecb-81c0-dd3b693ed302",
              "name": "process markdown",
              "type": "string",
              "value": "={{ $json.data.processed_markdown }}"
            },
            {
              "id": "1b3de282-470e-4f86-b5f7-374eb9f3a8c0",
              "name": "raw markdwon",
              "type": "string",
              "value": "={{ $json.data.raw_markdown }}"
            },
            {
              "id": "e58b64ff-4de6-41d5-8f0f-0738864be725",
              "name": "cleaned markdown",
              "type": "string",
              "value": "={{ $json.data.fit_markdown }}"
            },
            {
              "id": "0fcd4bf6-8083-4bfb-9b9e-53d0653e7ca9",
              "name": "URL",
              "type": "string",
              "value": "={{ $json.data.url}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "baa333ed-24cb-45c4-b88a-ea4cea117c25",
      "name": "convert data into chunks",
      "type": "n8n-nodes-base.code",
      "position": [
        -304,
        320
      ],
      "parameters": {
        "jsCode": "const DEFAULT_CHUNK_SIZE = 2000;   // chunk size\nconst DEFAULT_OVERLAP = 0.3;       // 30% overlap\n\nfunction splitTextWithOverlap(text, chunkSize, overlap) {\n  const step = Math.max(1, Math.floor(chunkSize * (1 - overlap)));\n  const parts = [];\n  for (let start = 0; start < text.length; start += step) {\n    parts.push(text.slice(start, start + chunkSize));\n  }\n  return parts;\n}\n\nfunction extractUrl(text) {\n  if (!text) return \"\";\n  const match = text.match(/https?:\\/\\/[^\\s)'\"<>]+/);\n  return match ? match[0] : \"\";\n}\n\nconst incoming = $input.item.json;\n\n// 1. Combine fields for embedding\nconst combinedText = [\n  incoming.summary || \"\",\n  incoming[\"cleaned markdown\"] || \"\",\n  incoming[\"process markdown\"] || \"\"\n].join(\"\\n\\n\");\n\n// 2. Pick only ONE URL\nlet url = incoming.url || \"\";\nif (!url) {\n  url = extractUrl(incoming[\"cleaned markdown\"]) || extractUrl(incoming[\"raw markdwon\"]);\n}\n\n// 3. Chunk\nconst parts = splitTextWithOverlap(combinedText, DEFAULT_CHUNK_SIZE, DEFAULT_OVERLAP);\n\n// 4. Build output with metadata\nlet charPos = 0;\nconst response = parts.map((part, idx) => {\n  const from = charPos;\n  const to = charPos + part.length;\n  const out = {\n    content: part,\n    metadata: {\n      title: incoming.title || \"\",\n      url,                 // \u2705 only one URL\n      page: 1,\n      chunk_index: idx,\n      loc: { Characters: { from, to } }\n    }\n  };\n  charPos = to;\n  return { json: out };\n});\n\nreturn response;\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "4a7f01a0-9b1f-4d53-85be-31c2c3c627c0",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        176
      ],
      "parameters": {
        "color": 5,
        "width": 416,
        "height": 560,
        "content": "## vector store and data loader\n### Embeddings \u2192 Store\nGenerates embeddings and inserts them into the Supabase vector table for RAG queries.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "83cf290d-040e-465d-973e-b9a01973e217",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -2208,
        1392
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "e961571d-89fa-4291-ba98-e749b6574c62",
      "name": "product catalog agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1696,
        1184
      ],
      "parameters": {
        "text": "={{ $json.chatInput }}",
        "options": {
          "systemMessage": "=## Persona\nYou are a helpful, intelligent AI support agent for  Catalog Suggestions\n\nWhen asked for suggestions/catalog info:\n\n## Knowledge Access Instructions\n- **Primary Source**: Always use the **Supabase store (products)** as the catalog reference.  \n- Query Supabase **only when the user asks for product suggestions or catalog info**.  \n\nIf a product is **found in Supabase**, display:  \n- Item name  \n- Item number  \n- Technical specifications  \n- Dimensions  \n- Product image  \n\n\n\n\n---\n\n\n\nDisplay Results:\n\nAlways show the user\u2019s chosen grade wherever possible.guide and help user and Incorporate theiur choice. \n\n\nConversation Flow Template\n\nAgent (Greeting)\n\"Hello! \ud83d\udc4b I can help you  browse the catalog.\nWould you like to start explore product suggestions?\"\n\nUser (Form start)\n\"Yes, let\u2019s configure a product.\"\n\n\n\u2192 If the user asks for suggestions, query Supabase.\n\n\n\n\n\n",
          "returnIntermediateSteps": false
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "dda37d31-6eea-4199-9d4d-f5f3d26ed9dc",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1808,
        1088
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 288,
        "content": "## Catalog Agent\nQueries Supabase only when needed. Returns product name, specs, image, and suggested items.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6ad0f9e3-4ae0-4f69-8258-c9bcb96f9e0c",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2256,
        1088
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 448,
        "content": "### Chat & Trigger\nReceives user queries via chat or webhook. Starts the RAG lookup when the user asks for product suggestions.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2e6bae65-a6d5-4f1c-bd9d-4cc6efaa1fd9",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1312,
        1376
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 272,
        "content": "## vector store with product catalog\n### Supabase Vectorstore\nHolds document vectors used by the agent to retrieve relevant product info at query time.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9aa14ebc-a28d-4067-b0a3-dfc18b0402bd",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3008,
        -16
      ],
      "parameters": {
        "width": 464,
        "height": 560,
        "content": "\n## How it works\n- Loads files from a selected Google Drive folder.  \n- Extracts key details from each file (title, modified date, type).  \n- Converts documents into readable text.  \n- Splits long text into smaller, well-structured sections for efficient processing.  \n- Turns each text chunk into a **vector embedding** \u2014 a numeric form that captures meaning.  \n- Saves all embeddings in a **Supabase vector table** for later retrieval.  \n- When a user asks a question (via chat or webhook):  \n  - Finds the most relevant text chunks in Supabase.  \n  - Sends them to a language model to generate a precise answer.  \n- Lets users search or explore large product catalogs using simple natural language.\n\n\n## Setup steps\n1. Connect both Google Drive and Supabase credentials.  \n2. Set your source Drive folder ID in the Google Drive node.  \n3. Verify the Supabase table name in the \u201cInsert into Supabase Vectorstore\u201d node.  \n4. Run the workflow once to index a few test files.  \n5. Use the chat trigger or webhook to start asking questions.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c8268dc2-c532-466a-bd15-13ca9db738b7",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2432,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 2032,
        "height": 752,
        "content": "# Drive ingestion\nFinds files in a Drive folder and loops through each file for processing.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ab41c3ae-cfab-479c-aaf0-174e34d27767",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 1104,
        "height": 752,
        "content": "## Chunk and Embed\nSplits text into chunks, creates embeddings, and saves them to Supabase.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e19e722d-3e51-42ba-bc64-3b17348d0b3a",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        224
      ],
      "parameters": {
        "color": 5,
        "height": 256,
        "content": "## Rate / pacing\nDelays between inserts to avoid API rate limits and ensure stable ingestion.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f476d73d-94e8-45a2-918d-22b861132960",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        1440
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 256,
        "content": "## Simple Memory\nShort-window memory for session context; do not store sensitive data.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d4143eb7-8fc1-4f5e-a220-6f0eaa049ae4",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        1456
      ],
      "parameters": {
        "color": 7,
        "width": 192,
        "height": 224,
        "content": "### Mistral Model \nMistral handles text generation and user query."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Wait1": {
      "main": [
        [
          {
            "node": "map data into fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait4": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook1": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set File ID": {
      "main": [
        [
          {
            "node": "Google Drive  get file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "product catalog agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory1": {
      "ai_memory": [
        [
          {
            "node": "product catalog agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "extract metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "extract metadata": {
      "main": [
        [
          {
            "node": "Set File ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Default Data Loader1": {
      "ai_document": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "map data into fields": {
      "main": [
        [
          {
            "node": "convert data into chunks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Vector Store": {
      "ai_tool": [
        [
          {
            "node": "product catalog agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive  get file": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Character Text Splitter1": {
      "ai_textSplitter": [
        [
          {
            "node": "Default Data Loader1",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings Mistral Cloud": {
      "ai_embedding": [
        [
          {
            "node": "Supabase Vector Store",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "convert data into chunks": {
      "main": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings Mistral Cloud2": {
      "ai_embedding": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Mistral Cloud Chat Model4": {
      "ai_languageModel": [
        [
          {
            "node": "product catalog agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "product catalog agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert into Supabase Vectorstore": {
      "main": [
        [
          {
            "node": "Wait4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Google Drive1",
            "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.

Pro

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

About this workflow

This workflow builds a dual-system that connects automated document ingestion with a live product catalog chatbot powered by Mistral AI and Supabase.

Source: https://n8n.io/workflows/10459/ — 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

Chat with docs - 5minAI New version. Uses httpRequest, documentDefaultDataLoader, textSplitterRecursiveCharacterTextSplitter, embeddingsOpenAi. Event-driven trigger; 62 nodes.

HTTP Request, Document Default Data Loader, Text Splitter Recursive Character Text Splitter +10
AI & RAG

I prepared a detailed guide that illustrates the entire process of building an AI agent using Supabase and Google Drive within N8N workflows.

HTTP Request, Document Default Data Loader, Text Splitter Recursive Character Text Splitter +10
AI & RAG

OIL Rag. Uses lmChatOpenAi, embeddingsOpenAi, agent, telegramTrigger. Event-driven trigger; 53 nodes.

OpenAI Chat, OpenAI Embeddings, Agent +12
AI & RAG

This n8n workflow automates the process of ingesting files from Google Drive into a Supabase database, preparing them for a knowledge base system. It supports text-based files (PDF, DOCX, TXT, etc.) a

Google Drive Trigger, Postgres, Supabase +11
AI & RAG

This template creates a comprehensive, production-ready Retrieval-Augmented Generation (RAG) system. It builds a sophisticated AI agent that can answer questions based on documents stored in a specifi

Reranker Cohere, Supabase Vector Store, Agent +10