This workflow corresponds to n8n.io template #9438 — 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 →
{
"id": "CcsSozcaZmwgTZRJ",
"meta": {
"templateId": "4217",
"templateCredsSetupCompleted": true
},
"name": "Create OpenAI-Compatible API For N8n Agents/Workflows",
"tags": [],
"nodes": [
{
"id": "f8831a38-92ef-44e5-99dd-0f410e9c0883",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
1424,
992
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "3c36a5c8-28da-4656-aa9d-8593926b3e77",
"name": "Models Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1600,
992
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={{\n({\n \"object\": \"list\",\n \"data\": $json.data.map(item => ({\n \"id\": item.path,\n \"object\": \"model\",\n \"created\": Math.floor($now / 1000),\n \"owned_by\": \"system\"\n }))\n})\n}}"
},
"executeOnce": false,
"typeVersion": 1.2
},
{
"id": "c28b03cb-bd1b-41d5-ba1b-486a099afb92",
"name": "GET models",
"type": "n8n-nodes-base.webhook",
"position": [
896,
992
],
"parameters": {
"path": "youragents/models",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "855c24f5-0758-4344-b780-523383b51de1",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
848,
800
],
"parameters": {
"color": 7,
"width": 1016,
"height": 452,
"content": "## 1. Listing All Available Models \n[Read more about the Webhook Trigger node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/)\n\nOur first endpoint is for listing all models. We will get all n8n workflows with the tag 'aimodel' and then map the response to be OpenAI /models compatible"
},
"typeVersion": 1
},
{
"id": "d5f0446d-2e59-47ee-a442-f66490d8759d",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2000,
784
],
"parameters": {
"color": 7,
"width": 1448,
"height": 588,
"content": "## 2. Request a Chat Completion \n[Read more about the HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest)\n\nOur second endpoint is for executing a chat completion. Note that depending on if you have connected with an agent, the response expected is a \"stream\" and returned data needs to be of type `text/plain`."
},
"typeVersion": 1
},
{
"id": "cb4e2823-21af-418e-9f46-9c367932aef4",
"name": "Get many workflows",
"type": "n8n-nodes-base.n8n",
"position": [
1088,
992
],
"parameters": {
"filters": {
"tags": "aimodel"
},
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "f1c9a7d9-9958-4e3f-bd2d-22fb77028cd8",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
1264,
992
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "b03926a4-4ad9-4d87-8188-989fa5158a07",
"name": "name",
"type": "string",
"value": "={{ $json.name }}"
},
{
"id": "88bd31bd-005d-4734-bffa-4fd3b8487166",
"name": "id",
"type": "string",
"value": "={{ $json.id }}"
},
{
"id": "7fbabd24-8dea-495e-96fe-da08790f971c",
"name": "path",
"type": "string",
"value": "={{ $json.nodes.find(node => node.parameters?.path).parameters.path }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "fe6a6983-4b80-4b54-92f2-ffe7235d0c2e",
"name": "POST ChatCompletions",
"type": "n8n-nodes-base.webhook",
"position": [
2096,
1072
],
"parameters": {
"path": "youragents/chat/completions",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode",
"authentication": "headerAuth"
},
"typeVersion": 2
},
{
"id": "b296aba2-a74a-47fb-8461-c1d17badab28",
"name": "Remap to Response API Schema",
"type": "n8n-nodes-base.code",
"position": [
2352,
1072
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "function tranformContent(content) {\n return [].concat(content).map(content => {\n if (typeof content === 'string') {\n return { type: \"input_text\", text: content };\n }\n return {\n type: getInputType(content.type),\n [content.type]: content[content.type].url\n }\n })\n};\n\nfunction getInputType(type) {\n if (type === 'image_url') return 'input_image';\n if (type === 'file_url') return 'input_file';\n return 'input_text';\n}\n\nconst input = $input.item.json.body.messages.map(message => ({\n role: message.role,\n content: tranformContent(message.content)\n}));\n\nreturn { input };"
},
"typeVersion": 2
},
{
"id": "f2a859c0-c7d4-49cc-baf6-b711700cef46",
"name": "Format Completion Response",
"type": "n8n-nodes-base.code",
"position": [
3040,
1200
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "return {\n \"id\": $('POST ChatCompletions').item.json.headers['cf-ray'],\n \"object\": \"chat.completion\",\n \"created\": Math.floor($now / 1000),\n \"model\":$('POST ChatCompletions').item.json.body.model,\n \"choices\": [{\n index: 0,\n finish_reason: \"stop\",\n \"message\": {\n \"content\": $('Call workflow webhook1').item.json.output,\n \"refusal\": null,\n \"role\": \"assistant\"\n }\n }],\n \"usage\": {\n \"completion_tokens\": null,\n \"completion_tokens_details\": null,\n \"prompt_tokens\": null,\n \"prompt_tokens_details\": null,\n \"total_tokens\": null\n },\n \"system_fingerprint\": $('POST ChatCompletions').item.json.headers['cf-ray']\n}"
},
"typeVersion": 2
},
{
"id": "9312f313-97f5-4ff7-9bbd-65d0ec3c6c2d",
"name": "JSON Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
3200,
1200
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={{ $json }}"
},
"typeVersion": 1.2
},
{
"id": "68572df2-ea64-4520-9b67-3d60a2059992",
"name": "Text Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
3200,
976
],
"parameters": {
"options": {},
"respondWith": "text",
"responseBody": "={{ $json.data }}"
},
"typeVersion": 1.2
},
{
"id": "1a2c1e1b-d5ea-4da6-ae86-081a700ca80d",
"name": "Format Stream Response",
"type": "n8n-nodes-base.code",
"position": [
3024,
976
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const chunk = {\n id: $('POST ChatCompletions').item.json.headers['cf-ray'],\n object:\"chat.completion.chunk\",\n created: Math.floor($now / 1000),\n model: $('POST ChatCompletions').item.json.body.model,\n system_fingerprint: $('POST ChatCompletions').item.json.headers['cf-ray'],\n choices: [{\n index: 0,\n delta: { content: $('Call workflow webhook').item.json.output }\n }],\n \"usage\": {\n \"completion_tokens\": null,\n \"completion_tokens_details\": null,\n \"prompt_tokens\": null,\n \"prompt_tokens_details\": null,\n \"total_tokens\": null\n }\n};\n\nconst data = [\n `data: ${JSON.stringify(chunk)}`,\n `data: [DONE]`\n].join('\\n\\n');\n\nreturn { data };"
},
"typeVersion": 2
},
{
"id": "5e832bb8-c2a2-453b-9aef-b08862c659fc",
"name": "Is Stream?",
"type": "n8n-nodes-base.if",
"position": [
2576,
1072
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "213702bf-d5c2-4a8a-b5c8-e55f804e4496",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $('POST ChatCompletions').first().json.body.stream }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "790bb7d3-7b5d-417f-9d31-2f01d6ac89f3",
"name": "Call workflow webhook",
"type": "n8n-nodes-base.httpRequest",
"position": [
2816,
976
],
"parameters": {
"url": "=https://n8n.lucidusfortis.com/webhook/{{ $('POST ChatCompletions').first().json.body.model }}",
"method": "POST",
"options": {},
"jsonBody": "={{\n{\n model: $('POST ChatCompletions').first().json.body.model,\n stream: $('POST ChatCompletions').first().json.body.stream,\n chatInput: $json.input.toJsonString(),\n sessionId: $('POST ChatCompletions').item.json.headers['cf-ray'],\n fromLLM: true\n}\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "n8nApi"
},
"typeVersion": 4.2
},
{
"id": "4d0d9dfa-2df0-49dd-a60c-1164347c85c5",
"name": "Call workflow webhook1",
"type": "n8n-nodes-base.httpRequest",
"position": [
2816,
1200
],
"parameters": {
"url": "=https://n8n.lucidusfortis.com/webhook/{{ $('POST ChatCompletions').first().json.body.model }}",
"method": "POST",
"options": {},
"jsonBody": "={{\n{\n model: $('POST ChatCompletions').item.json.body.model,\n stream: false,\n chatInput: $json.input.toJsonString(),\n sessionId: $('POST ChatCompletions').item.json.headers['cf-ray'],\n fromLLM: true\n}\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "n8nApi"
},
"typeVersion": 4.2
},
{
"id": "d8728083-673c-479a-b804-6bbad1fa1581",
"name": "n8n Webhooks",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1056,
1824
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "youragentname",
"cachedResultName": "youragentname"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "f96c8bae-1c75-4e01-bd41-bfc0b047d0f7",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
928,
1632
],
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "51aa0e26-8cb5-4561-9d9c-a5e9e306fecb",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
1392
],
"parameters": {
"color": 7,
"width": 680,
"height": 580,
"content": "## 3. Create a New Custom OpenAI Credential\n[Learn more about OpenAI Credentials](https://docs.n8n.io/integrations/builtin/credentials/openai/)\n\nTo chat with n8n workflow, the approach is to mimic an openAI compatible API connected through the OpenAI model subnode. The first step is to setup a new OpenAI credential so that we can change the Base URL."
},
"typeVersion": 1
},
{
"id": "5280f412-126a-45ca-8d3e-8fe460d966d7",
"name": "Powered By n8n Workflow Models",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1120,
1632
],
"parameters": {
"options": {}
},
"typeVersion": 2.2
},
{
"id": "9ecab0cf-c376-4ab1-81ce-896e1766b734",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
1184,
1840
],
"parameters": {},
"typeVersion": 1.3
}
],
"active": true,
"settings": {},
"versionId": "682200cb-34fb-4bf3-9239-0a435e1ec12a",
"connections": {
"Aggregate": {
"main": [
[
{
"node": "Models Response",
"type": "main",
"index": 0
}
]
]
},
"GET models": {
"main": [
[
{
"node": "Get many workflows",
"type": "main",
"index": 0
}
]
]
},
"Is Stream?": {
"main": [
[
{
"node": "Call workflow webhook",
"type": "main",
"index": 0
}
],
[
{
"node": "Call workflow webhook1",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"n8n Webhooks": {
"ai_languageModel": [
[
{
"node": "Powered By n8n Workflow Models",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "Powered By n8n Workflow Models",
"type": "ai_memory",
"index": 0
}
]
]
},
"Models Response": {
"main": [
[]
]
},
"Get many workflows": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"POST ChatCompletions": {
"main": [
[
{
"node": "Remap to Response API Schema",
"type": "main",
"index": 0
}
]
]
},
"Call workflow webhook": {
"main": [
[
{
"node": "Format Stream Response",
"type": "main",
"index": 0
}
]
]
},
"Call workflow webhook1": {
"main": [
[
{
"node": "Format Completion Response",
"type": "main",
"index": 0
}
]
]
},
"Format Stream Response": {
"main": [
[
{
"node": "Text Response",
"type": "main",
"index": 0
}
]
]
},
"Format Completion Response": {
"main": [
[
{
"node": "JSON Response",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "Powered By n8n Workflow Models",
"type": "main",
"index": 0
}
]
]
},
"Remap to Response API Schema": {
"main": [
[
{
"node": "Is Stream?",
"type": "main",
"index": 0
}
]
]
},
"Powered By n8n Workflow Models": {
"main": [
[]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Transform your n8n workflows into OpenAI-compatible API endpoints, allowing you to access multiple workflows as selectable AI models through a single integration.
Source: https://n8n.io/workflows/9438/ — 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 transforms WhatsApp into a powerful personal AI using n8n + Green-API. Send text or voice messages — the assistant understands intent and handles daily tasks automatically. 💰 Expense & i
GameMasterAi. Uses agent, lmChatOpenAi, discord, chatTrigger. Webhook trigger; 36 nodes.
Create A Branded Ai-Powered Website Chatbot. Uses memoryBufferWindow, respondToWebhook, lmChatOpenAi, toolHttpRequest. Webhook trigger; 24 nodes.
Code Respondtowebhook. Uses memoryBufferWindow, respondToWebhook, lmChatOpenAi, toolHttpRequest. Webhook trigger; 24 nodes.
Engage website visitors with an intelligent chat widget powered by OpenAI. This template includes: 💬 Natural conversation handling 📅 Microsoft Outlook calendar integration 📝 Lead capture and informati