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