{ "meta": { "instanceId": "6a2a7715680b8313f7cb4676321c5baa46680adfb913072f089f2766f42e43bd" }, "nodes": [ { "id": "f577f6bd-b1a4-48ec-9329-7bccc3fc1463", "name": "Get All files", "type": "n8n-nodes-base.httpRequest", "position": [ 400, -100 ], "parameters": { "url": "=https://yqtvdcvjboenlblgcivl.supabase.co/storage/v1/object/list/private", "method": "POST", "options": {}, "jsonBody": "={\n \"prefix\": \"\",\n \"limit\": 100,\n \"offset\": 0,\n \"sortBy\": {\n \"column\": \"name\",\n \"order\": \"asc\"\n }\n}", "sendBody": true, "specifyBody": "json", "authentication": "predefinedCredentialType", "nodeCredentialType": "supabaseApi" }, "credentials": { "supabaseApi": { "id": "t8AQJzvZvrOMDLec", "name": "Supabase account My Airtable Gen" } }, "typeVersion": 4.2 }, { "id": "10693bc8-560d-4cf6-8bd0-2fe3f4d863d1", "name": "Default Data Loader", "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader", "position": [ 1780, 100 ], "parameters": { "options": { "metadata": { "metadataValues": [ { "name": "=file_id", "value": "={{ $json.id }}" } ] } }, "jsonData": "={{ $('Merge').item.json.data ?? $('Merge').item.json.text }}", "jsonMode": "expressionData" }, "typeVersion": 1 }, { "id": "49428060-e707-4269-8344-77b301f56f7c", "name": "Recursive Character Text Splitter", "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter", "position": [ 1780, 280 ], "parameters": { "options": {}, "chunkSize": 500, "chunkOverlap": 200 }, "typeVersion": 1 }, { "id": "08742063-e235-4874-a128-b352786b19ce", "name": "Extract Document PDF", "type": "n8n-nodes-base.extractFromFile", "position": [ 1240, 0 ], "parameters": { "options": {}, "operation": "pdf" }, "typeVersion": 1, "alwaysOutputData": false }, { "id": "21f19360-d7ce-4106-ae5a-aa0f15b7c4aa", "name": "Embeddings OpenAI", "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi", "position": [ 1600, 80 ], "parameters": { "model": "text-embedding-3-small", "options": {} }, "credentials": { "openAiApi": { "id": "fLfRtaXbR0EVD0pl", "name": "OpenAi account" } }, "typeVersion": 1 }, { "id": "4147409f-8686-418f-b979-04f8c8e7fe42", "name": "Create File record2", "type": "n8n-nodes-base.supabase", "position": [ 1540, -100 ], "parameters": { "tableId": "files", "fieldsUi": { "fieldValues": [ { "fieldId": "name", "fieldValue": "={{ $('Loop Over Items').item.json.name }}" }, { "fieldId": "storage_id", "fieldValue": "={{ $('Loop Over Items').item.json.id }}" } ] } }, "credentials": { "supabaseApi": { "id": "t8AQJzvZvrOMDLec", "name": "Supabase account My Airtable Gen" } }, "typeVersion": 1 }, { "id": "016f1afe-172b-4609-b451-8d67609214d3", "name": "If", "type": "n8n-nodes-base.if", "position": [ 720, -100 ], "parameters": { "options": {}, "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "9b14e306-a04d-40f7-bc5b-b8eda8d8f7f2", "operator": { "type": "boolean", "operation": "true", "singleValue": true }, "leftValue": "={{ \n !$('Aggregate').item.json.data || \n !Array.isArray($('Aggregate').item.json.data) || \n !$('Aggregate').item.json.data.some(item => \n item.storage_id === $('Loop Over Items').item.json.id \n ) \n}}", "rightValue": "" }, { "id": "c3c0af88-9aea-4539-8948-1b69e601c27c", "operator": { "type": "string", "operation": "notEquals" }, "leftValue": "={{ $json.name }}", "rightValue": ".emptyFolderPlaceholder" } ] } }, "typeVersion": 2.2 }, { "id": "75e8a7db-8c4a-4ad8-b902-062cbc93e1eb", "name": "Get All Files", "type": "n8n-nodes-base.supabase", "position": [ 20, -100 ], "parameters": { "tableId": "files", "operation": "getAll" }, "credentials": { "supabaseApi": { "id": "t8AQJzvZvrOMDLec", "name": "Supabase account My Airtable Gen" } }, "typeVersion": 1, "alwaysOutputData": true }, { "id": "b22a3bab-f615-4d8a-8832-ce25b1a385fe", "name": "Download", "type": "n8n-nodes-base.httpRequest", "position": [ 900, -100 ], "parameters": { "url": "=https://yqtvdcvjboenlblgcivl.supabase.co/storage/v1/object/private/{{ $json.name }}", "options": {}, "authentication": "predefinedCredentialType", "nodeCredentialType": "supabaseApi" }, "credentials": { "supabaseApi": { "id": "t8AQJzvZvrOMDLec", "name": "Supabase account My Airtable Gen" } }, "typeVersion": 4.2 }, { "id": "50d1fede-4bd0-4cd4-b74a-7d689fe211cc", "name": "Loop Over Items", "type": "n8n-nodes-base.splitInBatches", "position": [ 560, -100 ], "parameters": { "options": {}, "batchSize": "=1" }, "typeVersion": 3 }, { "id": "f9c23b5e-0b40-4886-b54f-59fb46132d3f", "name": "When clicking ‘Test workflow’", "type": "n8n-nodes-base.manualTrigger", "position": [ -160, -100 ], "parameters": {}, "typeVersion": 1 }, { "id": "0a0ec290-2c3d-40ba-8d03-6abf75202e73", "name": "Aggregate", "type": "n8n-nodes-base.aggregate", "position": [ 220, -100 ], "parameters": { "options": {}, "aggregate": "aggregateAllItemData" }, "typeVersion": 1, "alwaysOutputData": true }, { "id": "32b3e2e1-2d25-4dd1-93e8-3f693beb7b6f", "name": "When chat message received", "type": "@n8n/n8n-nodes-langchain.chatTrigger", "position": [ 800, -1020 ], "webhookId": "3c40d311-7996-4ed4-b2fa-c73bea5f4cf5", "parameters": { "options": {} }, "typeVersion": 1.1 }, { "id": "79073b5c-a4ad-45a6-bbfa-e900a05bfde3", "name": "OpenAI Chat Model1", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 940, -820 ], "parameters": { "options": {} }, "credentials": { "openAiApi": { "id": "zJhr5piyEwVnWtaI", "name": "OpenAi club" } }, "typeVersion": 1 }, { "id": "f8663483-76d5-4fc8-ad07-7eec815ff7a6", "name": "Embeddings OpenAI2", "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi", "position": [ 1020, -540 ], "parameters": { "model": "text-embedding-3-small", "options": {} }, "credentials": { "openAiApi": { "id": "SphXAX7rlwRLkiox", "name": "Test club key" } }, "typeVersion": 1 }, { "id": "a1458799-d379-46de-93e6-a5ba0c665163", "name": "OpenAI Chat Model2", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 1300, -680 ], "parameters": { "options": {} }, "credentials": { "openAiApi": { "id": "SphXAX7rlwRLkiox", "name": "Test club key" } }, "typeVersion": 1 }, { "id": "d6eeda2f-c984-406d-a625-726840308413", "name": "Vector Store Tool1", "type": "@n8n/n8n-nodes-langchain.toolVectorStore", "position": [ 1100, -820 ], "parameters": { "name": "knowledge_base", "topK": 8, "description": "Retrieve data about user request" }, "typeVersion": 1 }, { "id": "e1d9a348-7d44-4ad1-adbd-2c9a31e06876", "name": "Switch", "type": "n8n-nodes-base.switch", "position": [ 1060, -100 ], "parameters": { "rules": { "values": [ { "outputKey": "txt", "conditions": { "options": { "version": 1, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "operator": { "type": "boolean", "operation": "true", "singleValue": true }, "leftValue": "={{$binary.data?.fileExtension == undefined }}", "rightValue": "txt" } ] }, "renameOutput": true }, { "outputKey": "pdf", "conditions": { "options": { "version": 1, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "bf04cbec-dd86-4607-988f-4c96b6fd4b58", "operator": { "type": "string", "operation": "equals" }, "leftValue": "={{$binary.data.fileExtension }}", "rightValue": "pdf" } ] }, "renameOutput": true } ] }, "options": {} }, "typeVersion": 3.1 }, { "id": "d38afb92-87ae-4e2a-a712-ec24b1efd105", "name": "Insert into Supabase Vectorstore", "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase", "position": [ 1700, -100 ], "parameters": { "mode": "insert", "options": { "queryName": "match_documents" }, "tableName": { "__rl": true, "mode": "list", "value": "documents", "cachedResultName": "documents" } }, "credentials": { "supabaseApi": { "id": "t8AQJzvZvrOMDLec", "name": "Supabase account My Airtable Gen" } }, "typeVersion": 1 }, { "id": "1a903b2e-cab0-4798-b820-ec08d6a71ddd", "name": "Merge", "type": "n8n-nodes-base.merge", "position": [ 1380, -100 ], "parameters": {}, "typeVersion": 3 }, { "id": "3afd552e-4995-493e-9cd5-ef496dfe359f", "name": "AI Agent", "type": "@n8n/n8n-nodes-langchain.agent", "position": [ 1020, -1020 ], "parameters": { "options": {} }, "typeVersion": 1.7 }, { "id": "d9688acc-311b-42fd-afa8-2c0e493be34b", "name": "Supabase Vector Store", "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase", "position": [ 1020, -660 ], "parameters": { "options": { "metadata": { "metadataValues": [ { "name": "file_id", "value": "300b0128-0955-4058-b0d3-a9aefe728432" } ] } }, "tableName": { "__rl": true, "mode": "list", "value": "documents", "cachedResultName": "documents" } }, "credentials": { "supabaseApi": { "id": "t8AQJzvZvrOMDLec", "name": "Supabase account My Airtable Gen" } }, "typeVersion": 1 }, { "id": "66df007c-0418-4551-950e-32e7d79840bd", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 340, -220 ], "parameters": { "height": 89.3775420487804, "content": "### Replace Storage name, database ID and credentials." }, "typeVersion": 1 }, { "id": "b164b520-20dd-44a4-aa3b-647391786b20", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ -20, -220 ], "parameters": { "height": 80, "content": "### Replace credentials." }, "typeVersion": 1 }, { "id": "8688c219-5af4-4e54-9fd1-91851829445b", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ 1540, -220 ], "parameters": { "height": 80, "content": "### Replace credentials." }, "typeVersion": 1 }, { "id": "45c6ece4-f849-4496-8149-31385f5e36a4", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [ 840, -220 ], "parameters": { "height": 89.3775420487804, "content": "### Replace Storage name, database ID and credentials." }, "typeVersion": 1 }, { "id": "2ca07cb0-b5f4-4761-b954-faf2131872d9", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ 1500, 220 ], "parameters": { "height": 80, "content": "### Replace credentials." }, "typeVersion": 1 }, { "id": "8d682dae-6f88-42f0-a717-affffd37d882", "name": "Sticky Note5", "type": "n8n-nodes-base.stickyNote", "position": [ 1140, -520 ], "parameters": { "height": 80, "content": "### Replace credentials." }, "typeVersion": 1 }, { "id": "796b5dca-d60e-43a9-afe8-194244643557", "name": "Sticky Note9", "type": "n8n-nodes-base.stickyNote", "position": [ -520, -940 ], "parameters": { "color": 7, "width": 330.5152611046425, "height": 239.5888196628349, "content": "### ... or watch set up video [10 min]\n[![Youtube Thumbnail](https://res.cloudinary.com/de9jgixzm/image/upload/v1739773273/Youtube%20Thumbs/Chat%20With%20FIles.png)](https://www.youtube.com/watch?v=glWUkdZe_3w)\n" }, "typeVersion": 1 }, { "id": "eba121de-a3f7-4ba5-8396-f7d64e648322", "name": "Sticky Note7", "type": "n8n-nodes-base.stickyNote", "position": [ -820, -1460 ], "parameters": { "color": 7, "width": 636.2128494576581, "height": 497.1532689930921, "content": "![5min Logo](https://res.cloudinary.com/de9jgixzm/image/upload/v1739773200/Skool%20Assets/ejm3hqnvhgwpnu2fv92s.png)\n## AI Agent To Chat With Files In Supabase Storage\n**Made by [Mark Shcherbakov](https://www.linkedin.com/in/marklowcoding/) from community [5minAI](https://www.skool.com/5minai-2861)**\n\nManually retrieving and analyzing specific information from large document repositories is time-consuming and inefficient. This workflow automates the process by vectorizing documents and enabling AI-powered interactions, making it easy to query and retrieve context-based information from uploaded files.\n\nThe workflow integrates Supabase with an AI-powered chatbot to process, store, and query text and PDF files. The steps include:\n- Fetching and comparing files to avoid duplicate processing.\n- Handling file downloads and extracting content based on the file type.\n- Converting documents into vectorized data for contextual information retrieval.\n- Storing and querying vectorized data from a Supabase vector store.\n\n" }, "typeVersion": 1 }, { "id": "df054036-d6b9-4f53-86cb-85ad96f07d0e", "name": "Sticky Note6", "type": "n8n-nodes-base.stickyNote", "position": [ -820, -940 ], "parameters": { "color": 7, "width": 280.2462120317618, "height": 545.9087885077763, "content": "### Set up steps\n\n1. **Fetch File List from Supabase**:\n - Use Supabase to retrieve the stored file list from a specified bucket.\n - Add logic to manage empty folder placeholders returned by Supabase, avoiding incorrect processing.\n\n2. **Compare and Filter Files**:\n - Aggregate the files retrieved from storage and compare them to the existing list in the Supabase `files` table.\n - Exclude duplicates and skip placeholder files to ensure only unprocessed files are handled.\n\n3. **Handle File Downloads**:\n - Download new files using detailed storage configurations for public/private access.\n - Adjust the storage settings and GET requests to match your Supabase setup.\n\n4. **File Type Processing**:\n - Use a Switch node to target specific file types (e.g., PDFs or text files).\n - Employ relevant tools to process the content:\n - For PDFs, extract embedded content.\n - For text files, directly process the text data.\n\n5. **Content Chunking**:\n - Break large text data into smaller chunks using the Text Splitter node.\n - Define chunk size (default: 500 tokens) and overlap to retain necessary context across chunks.\n\n6. **Vector Embedding Creation**:\n - Generate vectorized embeddings for the processed content using OpenAI's embedding tools.\n - Ensure metadata, such as file ID, is included for easy data retrieval.\n\n7. **Store Vectorized Data**:\n - Save the vectorized information into a dedicated Supabase vector store.\n - Use the default schema and table provided by Supabase for seamless setup.\n\n8. **AI Chatbot Integration**:\n - Add a chatbot node to handle user input and retrieve relevant document chunks.\n - Use metadata like file ID for targeted queries, especially when multiple documents are involved." }, "typeVersion": 1 }, { "id": "450a1e49-4be9-451a-9d05-2860e29c3695", "name": "Sticky Note8", "type": "n8n-nodes-base.stickyNote", "position": [ 540, -1160 ], "parameters": { "color": 5, "width": 951.7421645394404, "height": 809.7437181509877, "content": "## Scenario 2 - AI agent" }, "typeVersion": 1 }, { "id": "c3814c5d-8881-4598-897e-268019bee1bc", "name": "Sticky Note10", "type": "n8n-nodes-base.stickyNote", "position": [ -260, -280 ], "parameters": { "color": 5, "width": 2304.723519246249, "height": 739.2522526116408, "content": "## Scenario 1 - Flow for adding new files from Supabase storage" }, "typeVersion": 1 } ], "pinData": {}, "connections": { "If": { "main": [ [ { "node": "Download", "type": "main", "index": 0 } ], [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Merge": { "main": [ [ { "node": "Create File record2", "type": "main", "index": 0 } ] ] }, "Switch": { "main": [ [ { "node": "Merge", "type": "main", "index": 0 } ], [ { "node": "Extract Document PDF", "type": "main", "index": 0 } ] ] }, "Download": { "main": [ [ { "node": "Switch", "type": "main", "index": 0 } ] ] }, "Aggregate": { "main": [ [ { "node": "Get All files", "type": "main", "index": 0 } ] ] }, "Get All Files": { "main": [ [ { "node": "Aggregate", "type": "main", "index": 0 } ] ] }, "Get All files": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Loop Over Items": { "main": [ null, [ { "node": "If", "type": "main", "index": 0 } ] ] }, "Embeddings OpenAI": { "ai_embedding": [ [ { "node": "Insert into Supabase Vectorstore", "type": "ai_embedding", "index": 0 } ] ] }, "Embeddings OpenAI2": { "ai_embedding": [ [ { "node": "Supabase Vector Store", "type": "ai_embedding", "index": 0 } ] ] }, "OpenAI Chat Model1": { "ai_languageModel": [ [ { "node": "AI Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "OpenAI Chat Model2": { "ai_languageModel": [ [ { "node": "Vector Store Tool1", "type": "ai_languageModel", "index": 0 } ] ] }, "Vector Store Tool1": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Create File record2": { "main": [ [ { "node": "Insert into Supabase Vectorstore", "type": "main", "index": 0 } ] ] }, "Default Data Loader": { "ai_document": [ [ { "node": "Insert into Supabase Vectorstore", "type": "ai_document", "index": 0 } ] ] }, "Extract Document PDF": { "main": [ [ { "node": "Merge", "type": "main", "index": 1 } ] ] }, "Supabase Vector Store": { "ai_vectorStore": [ [ { "node": "Vector Store Tool1", "type": "ai_vectorStore", "index": 0 } ] ] }, "When chat message received": { "main": [ [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Insert into Supabase Vectorstore": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Recursive Character Text Splitter": { "ai_textSplitter": [ [ { "node": "Default Data Loader", "type": "ai_textSplitter", "index": 0 } ] ] }, "When clicking ‘Test workflow’": { "main": [ [ { "node": "Get All Files", "type": "main", "index": 0 } ] ] } } }