N8N 인텔리전트 에이전트/작업 흐름에 OpenAI 호환 API 생성
고급
이것은자동화 워크플로우로, 21개의 노드를 포함합니다.주로 If, N8n, Set, Code, Webhook 등의 노드를 사용하며. 여러 AI 워크플로우에 일반 OpenAI 호환 API 엔드포인트 만들기
사전 요구사항
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •대상 API의 인증 정보가 필요할 수 있음
- •OpenAI API Key
사용된 노드 (21)
카테고리
-
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "CcsSozcaZmwgTZRJ",
"meta": {
"instanceId": "d2b7bf62ebeaf79f36ba97778f61f82b716fe9a9dd9efd59e42986e968c3c6ce",
"templateId": "4217",
"templateCredsSetupCompleted": true
},
"name": "Create OpenAI-Compatible API For N8n Agents/Workflows",
"tags": [],
"nodes": [
{
"id": "f8831a38-92ef-44e5-99dd-0f410e9c0883",
"name": "집계",
"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
],
"webhookId": "f88b9992-b7b9-4ab5-829c-7b89e9cc4775",
"parameters": {
"path": "youragents/models",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "855c24f5-0758-4344-b780-523383b51de1",
"name": "메모2",
"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": "메모3",
"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
],
"webhookId": "e8c56164-1825-4ac4-9c23-d209f4907458",
"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 Webhook 트리거s",
"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": "채팅 메시지 수신 시",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
928,
1632
],
"webhookId": "6ec7783c-8f47-4fdf-9838-7846b1da4bfa",
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "51aa0e26-8cb5-4561-9d9c-a5e9e306fecb",
"name": "메모1",
"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": "심플 메모리",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
1184,
1840
],
"parameters": {},
"typeVersion": 1.3
}
],
"active": true,
"pinData": {},
"settings": {},
"versionId": "682200cb-34fb-4bf3-9239-0a435e1ec12a",
"connections": {
"Aggregate": {
"main": [
[
{
"node": "3c36a5c8-28da-4656-aa9d-8593926b3e77",
"type": "main",
"index": 0
}
]
]
},
"c28b03cb-bd1b-41d5-ba1b-486a099afb92": {
"main": [
[
{
"node": "cb4e2823-21af-418e-9f46-9c367932aef4",
"type": "main",
"index": 0
}
]
]
},
"5e832bb8-c2a2-453b-9aef-b08862c659fc": {
"main": [
[
{
"node": "790bb7d3-7b5d-417f-9d31-2f01d6ac89f3",
"type": "main",
"index": 0
}
],
[
{
"node": "4d0d9dfa-2df0-49dd-a60c-1164347c85c5",
"type": "main",
"index": 0
}
]
]
},
"f1c9a7d9-9958-4e3f-bd2d-22fb77028cd8": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"n8n Webhooks": {
"ai_languageModel": [
[
{
"node": "5280f412-126a-45ca-8d3e-8fe460d966d7",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "5280f412-126a-45ca-8d3e-8fe460d966d7",
"type": "ai_memory",
"index": 0
}
]
]
},
"3c36a5c8-28da-4656-aa9d-8593926b3e77": {
"main": [
[]
]
},
"cb4e2823-21af-418e-9f46-9c367932aef4": {
"main": [
[
{
"node": "f1c9a7d9-9958-4e3f-bd2d-22fb77028cd8",
"type": "main",
"index": 0
}
]
]
},
"fe6a6983-4b80-4b54-92f2-ffe7235d0c2e": {
"main": [
[
{
"node": "b296aba2-a74a-47fb-8461-c1d17badab28",
"type": "main",
"index": 0
}
]
]
},
"790bb7d3-7b5d-417f-9d31-2f01d6ac89f3": {
"main": [
[
{
"node": "1a2c1e1b-d5ea-4da6-ae86-081a700ca80d",
"type": "main",
"index": 0
}
]
]
},
"4d0d9dfa-2df0-49dd-a60c-1164347c85c5": {
"main": [
[
{
"node": "f2a859c0-c7d4-49cc-baf6-b711700cef46",
"type": "main",
"index": 0
}
]
]
},
"1a2c1e1b-d5ea-4da6-ae86-081a700ca80d": {
"main": [
[
{
"node": "68572df2-ea64-4520-9b67-3d60a2059992",
"type": "main",
"index": 0
}
]
]
},
"f2a859c0-c7d4-49cc-baf6-b711700cef46": {
"main": [
[
{
"node": "9312f313-97f5-4ff7-9bbd-65d0ec3c6c2d",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "5280f412-126a-45ca-8d3e-8fe460d966d7",
"type": "main",
"index": 0
}
]
]
},
"b296aba2-a74a-47fb-8461-c1d17badab28": {
"main": [
[
{
"node": "5e832bb8-c2a2-453b-9aef-b08862c659fc",
"type": "main",
"index": 0
}
]
]
},
"5280f412-126a-45ca-8d3e-8fe460d966d7": {
"main": [
[]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
시각화 참조 라이브러리에서 n8n 노드를 탐색
可视化 참조 라이브러리에서 n8n 노드를 탐색
If
Ftp
Set
+
If
Ftp
Set
113 노드I versus AI
기타
OpenAI, LangChain, API 통합을 사용한 작업 자동화 초보자 가이드
OpenAI, LangChain 및 API 통합을 사용한 작업 자동화 시작자 가이드
If
Set
Code
+
If
Set
Code
33 노드Meelioo
콘텐츠 제작
[템플릿] AI 반려동물 가게 v8
🐶 AI 펫 샵 어시스턴트 - GPT-4o, Google 캘린더 및 WhatsApp/Instagram/Facebook 통합
If
N8n
Set
+
If
N8n
Set
244 노드Amanda Benks
영업
AI 대리인 레스토랑 [템플릿]
🤖 WhatsApp, 인스타그램, 메신저의 AI 레스토랑 도우미
If
N8n
Set
+
If
N8n
Set
239 노드Amanda Benks
기타
AI 스마트 어시스턴트: Supabase 스토리지 및 Google Drive 파일과 대화
AI스마트어시스턴트:与Supabase存储및Google Drive文件对话
If
Set
Wait
+
If
Set
Wait
62 노드Mark Shcherbakov
엔지니어링
[템플릿] - 대시보드 채팅
AI 모델 대시보드 사용: LLM 워크플로우의 토큰 지표 및 비용 추적
N8n
Set
Code
+
N8n
Set
Code
30 노드Hugo
워크플로우 정보
난이도
고급
노드 수21
카테고리-
노드 유형13
저자
Dele Odufuye
@deleodufuyeAward winning IT pro. Serial entrepreneur. Mentor. Investor. Ex-MD/VP Cavista Holdings. Builds tech solutions for business problems. Founder, Lucidus Fortis.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유