AutomationFlowsAI & RAG › Create Universal Openai-compatible API Endpoints for Multiple AI Workflows

Create Universal Openai-compatible API Endpoints for Multiple AI Workflows

ByDele Odufuye @deleodufuye on n8n.io

Transform your n8n workflows into OpenAI-compatible API endpoints, allowing you to access multiple workflows as selectable AI models through a single integration.

Webhook trigger★★★★☆ complexityAI-powered21 nodesn8nHTTP RequestOpenAI ChatChat TriggerAgentMemory Buffer Window
AI & RAG Trigger: Webhook Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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": [
        []
      ]
    }
  }
}
Pro

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 →

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

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

Tool Calculator, Google Sheets Tool, OpenAI Chat +10
AI & RAG

GameMasterAi. Uses agent, lmChatOpenAi, discord, chatTrigger. Webhook trigger; 36 nodes.

Agent, OpenAI Chat, Discord +6
AI & RAG

Create A Branded Ai-Powered Website Chatbot. Uses memoryBufferWindow, respondToWebhook, lmChatOpenAi, toolHttpRequest. Webhook trigger; 24 nodes.

Memory Buffer Window, OpenAI Chat, Tool Http Request +6
AI & RAG

Code Respondtowebhook. Uses memoryBufferWindow, respondToWebhook, lmChatOpenAi, toolHttpRequest. Webhook trigger; 24 nodes.

Memory Buffer Window, OpenAI Chat, Tool Http Request +6
AI & RAG

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

Memory Buffer Window, OpenAI Chat, Tool Http Request +6