This workflow corresponds to n8n.io template #9626 — 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "1c57da69-7af2-47c8-8bc2-92e49449bd81",
"name": "Splitting into Chunks",
"type": "n8n-nodes-base.code",
"position": [
2192,
-496
],
"parameters": {
"jsCode": "const text = $input.first().json.text;\nconst chunkSize = 1000;\n\nlet chunks = [];\nfor (let i = 0; i < text.length; i += chunkSize) {\n chunks.push({\n json: { chunk: text.slice(i, i + chunkSize) }\n });\n}\n\nreturn chunks;\n\n"
},
"typeVersion": 2
},
{
"id": "d5ed1aaf-6089-4731-980d-b5c356b22403",
"name": "Embedding Uploaded document",
"type": "n8n-nodes-base.httpRequest",
"position": [
2416,
-496
],
"parameters": {
"url": "https://api.together.xyz/v1/embeddings",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "BAAI/bge-large-en-v1.5"
},
{
"name": "input",
"value": "={{ $json.chunk }}"
}
]
},
"genericAuthType": "httpBearerAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "0b1c609f-e335-4541-8dae-e3517ec4bb63",
"name": "Save the embedding in DB",
"type": "n8n-nodes-base.supabase",
"position": [
2624,
-496
],
"parameters": {
"tableId": "RAG",
"fieldsUi": {
"fieldValues": [
{
"fieldId": "chunk",
"fieldValue": "={{ $('Splitting into Chunks').item.json.chunk }}"
},
{
"fieldId": "embeddings",
"fieldValue": "={{ JSON.stringify($json.data[0].embedding) }}"
}
]
}
},
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "3a39d174-434e-4c81-921c-8a354fad5ebe",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
2064,
64
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "chunk"
}
]
}
},
"typeVersion": 1
},
{
"id": "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2",
"name": "Search Embeddings",
"type": "n8n-nodes-base.httpRequest",
"position": [
1840,
64
],
"parameters": {
"url": "https://enter-your-supabase-host/rest/v1/rpc/matchembeddings1",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "=query_embedding",
"value": "={{ $json.data[0].embedding }}"
},
{
"name": "match_count",
"value": "5"
}
]
},
"nodeCredentialType": "supabaseApi"
},
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "76c8df3f-cf64-4848-b077-d04e9de88d12",
"name": "Embend User Message",
"type": "n8n-nodes-base.httpRequest",
"position": [
1616,
64
],
"parameters": {
"url": "https://api.together.xyz/v1/embeddings",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "BAAI/bge-large-en-v1.5"
},
{
"name": "input",
"value": "={{ $json.chatInput }}"
}
]
},
"genericAuthType": "httpBearerAuth"
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d8dba80c-597e-470b-852b-6d53363238bc",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
2272,
288
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2272,
64
],
"parameters": {
"text": "=You are a helpful and professional customer support agent. Use the following context to answer the user's question. \n\nHandle greetings without the need of the context...\n\nContext:\n{{ $json.chunk }}\n\nUser's message:\n{{ $('When chat message received').item.json.chatInput }}\n\nFormat your reply in WhatsApp style:\n- Use _italics_ for emphasis\n- Use *bold* for key points\n- Use \u2022 for bullet lists (no markdown dashes or hashes)\n- Keep responses short, clear, and conversational, like real WhatsApp support\n- Avoid markdown headers or code blocks\n\nGive a clear, accurate, and friendly response based only on the context. \nIf the answer cannot be found in the context, reply: _\"I don't know based on the provided information.\"_\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6",
"name": "Extract Text from PDF File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2000,
-496
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "490c541e-fae8-4965-9840-9e13d562acdd",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
1392,
64
],
"parameters": {
"options": {}
},
"typeVersion": 1.3
},
{
"id": "8add4f5e-d2f8-4ea8-a6e1-6d4912d60393",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
-768
],
"parameters": {
"width": 1584,
"height": 512,
"content": "### Part 1: Feeding the AI Knowledge (The \"Librarian\" part)\n\nThis part of the workflow runs whenever someone uploads a new PDF contract using your Jotform form. Its only job is to read, understand, and store the information from that document.\n\n* A user uploads a PDF contract through a JotForm, which is then downloaded.\n* The system extracts the raw text and splits it into smaller, more manageable chunks.\n* Each text chunk is converted into a numerical representation, called an embedding, that captures its semantic meaning.\n* These embeddings and their original text are stored in a Supabase vector database, effectively creating a searchable knowledge library.\n"
},
"typeVersion": 1
},
{
"id": "d764c67f-cca8-476e-8d63-78d2733f6b64",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
-208
],
"parameters": {
"width": 1600,
"height": 656,
"content": "---\n\n### Part 2: Asking the AI a Question (The \"Researcher\" part)\n\nThis part of the workflow runs whenever a user sends a message in a chat interface. Its job is to find the right information from the library and generate an answer.\n\n* A user asks a question, which the system converts into a numerical embedding to understand its meaning.\n* This embedding is used to search a vector database, retrieving the most relevant chunks of text from the stored documents.\n* The retrieved text chunks are then provided to an AI agent as the sole context for answering the question.\n* The AI generates a precise and accurate answer based only on the provided context, ensuring it doesn't invent information."
},
"typeVersion": 1
},
{
"id": "d1f68d16-6baa-4420-8606-dbc7ca5791c7",
"name": "JotForm Trigger",
"type": "n8n-nodes-base.jotFormTrigger",
"position": [
1376,
-496
],
"parameters": {
"form": "252862840518058",
"onlyAnswers": false
},
"credentials": {
"jotFormApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "8f035b6b-c3c0-449a-acb4-0c359c309e32",
"name": "Grab New knowledgebase",
"type": "n8n-nodes-base.httpRequest",
"position": [
1584,
-496
],
"parameters": {
"url": "=https://api.jotform.com/submission/{{ $json.submissionID }}?apiKey=enter-your-jotfomr-api",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "b826edc5-d97f-498c-bea1-b3f3d1430635",
"name": "Grab the uploaded knowledgebase file link",
"type": "n8n-nodes-base.httpRequest",
"position": [
1792,
-496
],
"parameters": {
"url": "={{ $json.content.answers['6'].answer[0] }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "APIKEY",
"value": "enter-your-jotfomr-api"
}
]
}
},
"typeVersion": 4.2
}
],
"connections": {
"AI Agent": {
"main": [
[]
]
},
"Aggregate": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"JotForm Trigger": {
"main": [
[
{
"node": "Grab New knowledgebase",
"type": "main",
"index": 0
}
]
]
},
"Search Embeddings": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Embend User Message": {
"main": [
[
{
"node": "Search Embeddings",
"type": "main",
"index": 0
}
]
]
},
"Splitting into Chunks": {
"main": [
[
{
"node": "Embedding Uploaded document",
"type": "main",
"index": 0
}
]
]
},
"Grab New knowledgebase": {
"main": [
[
{
"node": "Grab the uploaded knowledgebase file link",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Extract Text from PDF File": {
"main": [
[
{
"node": "Splitting into Chunks",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "Embend User Message",
"type": "main",
"index": 0
}
]
]
},
"Embedding Uploaded document": {
"main": [
[
{
"node": "Save the embedding in DB",
"type": "main",
"index": 0
}
]
]
},
"Grab the uploaded knowledgebase file link": {
"main": [
[
{
"node": "Extract Text from PDF File",
"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.
googlePalmApihttpBearerAuthjotFormApisupabaseApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Youtube Video: https://youtu.be/dEtV7OYuMFQ?si=fOAlZWz4aDuFFovH
Source: https://n8n.io/workflows/9626/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Proxmox Ai Agent With N8N And Generative Ai Integration. Uses httpRequest, toolHttpRequest, outputParserAutofixing, lmChatGoogleGemini. Chat trigger; 35 nodes.
Telegram. Uses httpRequest, toolHttpRequest, outputParserAutofixing, lmChatGoogleGemini. Chat trigger; 35 nodes.
This template automates IT operations on a Proxmox Virtual Environment (VE) using an AI-powered conversational agent built with n8n. By integrating Proxmox APIs and generative AI models (e.g., Google
This Chatbot automates the process of discovering job openings and generating tailored job application emails.