AI 기반 회의 효과 자동 분석 및 Slack 피드백 전송
고급
이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 18개의 노드를 포함합니다.주로 If, Set, Code, Wait, Slack 등의 노드를 사용하며. AI 기반 회의 효과 자동 분석 및 Slack 피드백 발송
사전 요구사항
- •Slack Bot Token 또는 Webhook URL
- •Google Drive API 인증 정보
- •OpenAI API Key
사용된 노드 (18)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "271ad271582e33e7052a1750142c4d1e028deb0c5d010978918984ab393ca4cf",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"name": "AI 에이전트",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
448,
32
],
"parameters": {
"options": {
"systemMessage": "=# Meeting Coach AI System Prompt\n\nYou are a Meeting Coach AI that analyzes meeting effectiveness and provides constructive feedback.\n\n## Role and Purpose\n\nAnalyze meeting minutes or transcripts to provide objective and specific feedback on meeting effectiveness, communication quality, and areas for improvement. Avoid being overly critical and ensure to include actionable improvement suggestions.\n\n## Steps\n\n1. If there is a Google Docs URL for the meeting minutes, use it to retrieve the minutes from Google Drive. If not, search Google Drive using the meeting title name to retrieve the relevant minutes.\n2. If the meeting minutes cannot be found, report this and conclude.\n3. Review the retrieved meeting minutes to understand the full text and content.\n4. Compile feedback with the following content:\n\n## Analysis Items and Output Format\n\n### 1. Meeting Effectiveness\n\n- **Effectiveness Score**: Rate from 0% to 100%\n- Analyze from the following perspectives:\n - **Meeting Purpose**: What was the goal of the meeting?\n - **Achievements**: What was accomplished toward the goal?\n - **Challenges**: What hindered the meeting's effectiveness (e.g., topic derailment, lack of focus)?\n - **Conclusions and Next Steps**: Were specific decisions and action items clearly defined?\n\n### 2. Speaking Time Distribution\n\n- Display each participant's speaking time as a percentage\n- Comments on speaking balance:\n - Was the balance appropriate?\n - Was it a one-sided conversation?\n - Suggestions for more effective dialogue\n\n### 3. Interruptions\n\n- Analyze whether there were significant interruptions and their impact on the meeting\n- Note if there were no interruptions\n\n### 4. Communication Quality\n\nRate each of the following items on a 5-star scale (★☆☆☆☆ to ★★★★★) and provide specific comments:\n\n- **Clarity**: Were the agenda and opinions communicated clearly?\n - ★☆☆☆☆: Very unclear\n - ★★☆☆☆: Unclear\n - ★★★☆☆: Average\n - ★★★★☆: Clear\n - ★★★★★: Very clear\n\n- **Friendliness**: Was the atmosphere cooperative and positive?\n - ★☆☆☆☆: Hostile\n - ★★☆☆☆: Somewhat cold\n - ★★★☆☆: Average\n - ★★★★☆: Friendly\n - ★★★★★: Very friendly\n\n- **Decisiveness**: Were decisions and next actions clearly defined?\n - ★☆☆☆☆: No decisions made\n - ★★☆☆☆: Ambiguous\n - ★★★☆☆: Some decisions\n - ★★★★☆: Clear decisions\n - ★★★★★: Very clear decisions and actions\n\n- **Listening**: Did participants listen to and try to understand each other's opinions?\n - ★☆☆☆☆: Not listening at all\n - ★★☆☆☆: Not listening much\n - ★★★☆☆: Average\n - ★★★★☆: Listening well\n - ★★★★★: Listening very well\n\nFor each item:\n- Quote specific examples of what went well from the conversation\n- Points that could be improved and specific suggestions\n\n### 5. Disagreements\n\n- List topics that became points of discussion\n- Briefly explain each participant's position\n- Note whether issues were resolved or remained unresolved\n- If there were no conflicts, note \"None in particular\"\n\n### 6. Meeting Info\n\n- Meeting title (extract from minutes, or \"Unknown\" if unavailable)\n- List of participants\n\n## Tone and Style\n\n- **Constructive**: Provide insights for growth, not criticism\n- **Specific**: Quote concrete examples from the conversation rather than abstract evaluations\n- **Balanced**: Point out both strengths and areas for improvement\n- **Practical**: Include improvement suggestions that can be implemented immediately\n\n## Output Format\n\n**Meeting Effectiveness** → **[Your evaluated score]%**\n* [Analysis of meeting purpose]\n* [What was achieved]\n* [Challenges]\n* [Evaluation of conclusions and next steps]\n\n**Speaking Time Distribution**\n* **[Participant name]**: [Your calculated percentage]%\n* **[Participant name]**: [Your calculated percentage]%\n* [Comments on speaking balance]\n* [Improvement suggestions]\n\n**Interruptions**\n* [Analysis of presence and impact of interruptions]\n\n**Communication Quality**\n* [Your evaluated number of ★s] **| Clarity**: [Evaluation comment]\n* [Your evaluated number of ★s] **| Friendliness**: [Evaluation comment]\n* [Your evaluated number of ★s] **| Decisiveness**: [Evaluation comment]\n* [Your evaluated number of ★s] **| Listening**: [Evaluation comment]\n* [Specific improvement suggestions and examples of positive points]\n\n**Disagreements**\n❌ [Topic name]:\n1. **[Participant name]**: [Explanation of position]\n2. **[Participant name]**: [Explanation of position]\n3. **Resolution status**: [Explanation of whether consensus was reached or issue remains unresolved]\n\n(If no conflicts: \"There were no significant disagreements.\")\n\n**Meeting Info**\n* **Meeting Title**: [Title]\n* **Participants**: [Participant list]\n\n---\n\nWhen meeting minutes or transcripts are provided, analyze and provide feedback following the above format. Evaluate each assessment item appropriately based on the actual meeting content."
}
},
"typeVersion": 2.2
},
{
"id": "199072fb-3fb9-440d-aa57-44dc6afb2bee",
"name": "OpenAI 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
368,
240
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5",
"cachedResultName": "gpt-5"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "azgro9Tx2nlIAQVv",
"name": "OpenAi(tobe)"
}
},
"typeVersion": 1.2
},
{
"id": "0194fded-a382-47e8-8cec-0a6936df9faa",
"name": "문서 검색",
"type": "n8n-nodes-base.googleDriveTool",
"position": [
576,
416
],
"parameters": {
"limit": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Limit', ``, 'number') }}",
"filter": {
"whatToSearch": "files"
},
"options": {},
"resource": "fileFolder",
"queryString": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Search_Query', ``, 'string') }}"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "hOG09SnmNsGXlS9o",
"name": "GoogleDrive(j.tobe)"
}
},
"typeVersion": 3
},
{
"id": "4a61eb43-d664-493b-887e-c412d6652dfc",
"name": "문서 가져오기",
"type": "n8n-nodes-base.googleDocsTool",
"position": [
672,
240
],
"parameters": {
"operation": "get",
"documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', ``, 'string') }}"
},
"credentials": {
"googleDocsOAuth2Api": {
"id": "gIuEB1RhXjXKNGUs",
"name": "GoogldDocs(j.tobe)"
}
},
"typeVersion": 2
},
{
"id": "9d1fa3ac-5030-416e-8020-b2eec0c1f1b4",
"name": "메시지 전송",
"type": "n8n-nodes-base.slack",
"position": [
1040,
240
],
"webhookId": "ae52c4f6-573f-4388-93d9-a8af0142d929",
"parameters": {
"text": "=テスト",
"user": {
"__rl": true,
"mode": "id",
"value": "U03H0J4KU7R"
},
"select": "user",
"blocksUi": "={{ $json.slackPayload }}",
"messageType": "block",
"otherOptions": {
"mrkdwn": true
},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "jxDf84zs6Dwcn8NL",
"name": "Slack(j.tobe)"
}
},
"typeVersion": 2.3
},
{
"id": "e9a57402-de45-403f-8f0c-b764dffb7a5c",
"name": "심플 메모리",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
448,
416
],
"parameters": {},
"typeVersion": 1.3
},
{
"id": "22b64ef2-5672-43c7-9a8c-e761447eedc1",
"name": "Google 캘린더 트리거",
"type": "n8n-nodes-base.googleCalendarTrigger",
"position": [
-672,
240
],
"parameters": {
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "eventEnded",
"calendarId": {
"__rl": true,
"mode": "id",
"value": "=[your-id]"
}
},
"credentials": {
"googleCalendarOAuth2Api": {
"id": "t5AgzbZYZniiNqS3",
"name": "Google Calendar (j.tobe)"
}
},
"typeVersion": 1
},
{
"id": "c70fd6b4-5428-44ab-8080-f4a10a35de58",
"name": "필드 편집",
"type": "n8n-nodes-base.set",
"position": [
112,
240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "82a8a73d-5c24-4c67-aed4-8d3f26ccf8f8",
"name": "chatInput",
"type": "string",
"value": "={{ $json.summary }} というタイトルの会議を行い {{ $json.attachment[0].fileUrl }} という URL の Google Docs に気議事録を保存しました\n\nGoogle Docs の fileId は {{ $json.attachment[0].fileId }} です"
},
{
"id": "3f8f99b5-9cf2-4005-b1fc-cc89fa79183a",
"name": "=sessionId",
"type": "string",
"value": "=a {{ $json.id }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e468e662-b2fa-4f8a-b01d-e0213cdb4d40",
"name": "대기",
"type": "n8n-nodes-base.wait",
"position": [
-496,
240
],
"webhookId": "04af6fbe-7a07-494a-ad4b-ac3b2d46414b",
"parameters": {
"unit": "minutes"
},
"typeVersion": 1.1
},
{
"id": "8cbf5fe5-879c-456a-9b4d-66d1f04f0b26",
"name": "이벤트 가져오기",
"type": "n8n-nodes-base.googleCalendar",
"position": [
-336,
240
],
"parameters": {
"eventId": "={{ $json.id }}",
"options": {},
"calendar": {
"__rl": true,
"mode": "id",
"value": "=[your-id]"
},
"operation": "get"
},
"credentials": {
"googleCalendarOAuth2Api": {
"id": "t5AgzbZYZniiNqS3",
"name": "Google Calendar (j.tobe)"
}
},
"typeVersion": 1.3
},
{
"id": "ed8ecac5-c3c2-464b-8cfe-540a76525187",
"name": "테스트 트리거",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
-160,
32
],
"webhookId": "14967cec-2211-4d1c-9570-8e7d85ced11e",
"parameters": {
"options": {
"responseMode": "lastNode"
}
},
"typeVersion": 1.3
},
{
"id": "398412f8-29fa-49eb-ac55-cfef96469809",
"name": "코드",
"type": "n8n-nodes-base.code",
"position": [
896,
240
],
"parameters": {
"jsCode": "/**\n * n8n Code node (JavaScript)\n * 入力: $input.first().json.output に Markdown風の長文(実改行 or リテラル \"\\n\")\n * 出力: 最初のアイテムに以下を格納\n * - json.blocks: Array<Block>(Block Kit の配列)\n * - json.slackPayload: { blocks: Array<Block> } // ← UI Builder と同じトップレベル\n * - json.text_fallback: Slack text 用フォールバック\n *\n * 次ノード(Slack 送信例):\n * - Body JSON に {{$json.slackPayload}} をそのまま使う\n * - もしくは blocks: {{$json.blocks}}, text: {{$json.text_fallback}}\n */\n\n// ===== Utils =====\nfunction toActualNewlines(s) {\n if (typeof s !== 'string') return '';\n return s.replace(/\\r\\n?/g, '\\n').replace(/\\\\n/g, '\\n');\n}\n\n// インライン: *bold* / **bold**, _italic_, `code`, [text](url)\nfunction tokenizeInline(text) {\n const tokens = [];\n let i = 0;\n\n const pushPlain = (t) => { if (t) tokens.push({ type: 'text', text: t }); };\n\n const patterns = [\n { // code\n re: /`([^`]+)`/g,\n build: (m) => ({ type: 'text', text: m[1], style: { code: true } }),\n },\n { // bold **...**\n re: /\\*\\*([^*]+)\\*\\*/g,\n build: (m) => ({ type: 'text', text: m[1], style: { bold: true } }),\n },\n { // bold *...* (先頭の箇条書き \"* \" と衝突しないよう調整)\n re: /(^|[^*])\\*([^*\\n]+)\\*(?!\\*)/g,\n build: (m) => [{ type: 'text', text: m[1] || '' }, { type: 'text', text: m[2], style: { bold: true } }],\n isComposite: true,\n },\n { // italic _..._\n re: /_([^_]+)_/g,\n build: (m) => ({ type: 'text', text: m[1], style: { italic: true } }),\n },\n { // link [text](url)\n re: /\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g,\n build: (m) => ({ type: 'link', url: m[2], text: m[1] }),\n },\n ];\n\n while (i < text.length) {\n let earliest = null, pat = null;\n for (const p of patterns) {\n p.re.lastIndex = i;\n const m = p.re.exec(text);\n if (m && (!earliest || m.index < earliest.index)) {\n earliest = m; pat = p;\n }\n }\n if (!earliest) { pushPlain(text.slice(i)); break; }\n\n if (earliest.index > i) pushPlain(text.slice(i, earliest.index));\n\n if (pat.isComposite) {\n const built = pat.build(earliest);\n for (const b of built) if (b.text !== '') tokens.push(b);\n } else {\n tokens.push(pat.build(earliest));\n }\n\n i = earliest.index + earliest[0].length;\n }\n\n return tokens.length ? tokens : [{ type: 'text', text }];\n}\n\nfunction makeSectionElementsFromText(t) {\n return tokenizeInline(t);\n}\n\n// ===== Block builders =====\nfunction headerBlock(text) {\n return { type: 'header', text: { type: 'plain_text', text: text.slice(0, 150) } };\n}\nfunction paragraphBlock(text) {\n return { type: 'rich_text', elements: [{ type: 'rich_text_section', elements: makeSectionElementsFromText(text) }] };\n}\nfunction quoteBlock(lines) {\n const elements = lines.map(l => ({ type: 'rich_text_section', elements: makeSectionElementsFromText(l) }));\n return { type: 'rich_text', elements: [{ type: 'rich_text_quote', elements }] };\n}\nfunction preBlock(lines) {\n return { type: 'rich_text', elements: [{ type: 'rich_text_preformatted', elements: [{ type: 'text', text: lines.join('\\n') }] }] };\n}\nfunction listBlock(style, indent, sections) {\n return { type: 'rich_text', elements: [{ type: 'rich_text_list', style, indent, elements: sections }] };\n}\n\n// ===== Parser =====\nfunction convertMarkdownToBlocks(mdRaw) {\n const md = toActualNewlines(mdRaw);\n const lines = md.split('\\n');\n const blocks = [];\n\n let inCode = false, codeBuf = [];\n let inQuote = false, quoteBuf = [];\n\n // リスト状態(style/indent で束ねる)\n let listActive = false, listStyle = null, listIndent = 0, listItems = [];\n\n const flushQuote = () => {\n if (inQuote && quoteBuf.length) blocks.push(quoteBlock(quoteBuf));\n inQuote = false; quoteBuf = [];\n };\n const flushList = () => {\n if (listActive && listItems.length) blocks.push(listBlock(listStyle, listIndent, listItems));\n listActive = false; listStyle = null; listIndent = 0; listItems = [];\n };\n const startList = (style, indent) => {\n if (!listActive || listStyle !== style || listIndent !== indent) {\n flushList();\n listActive = true; listStyle = style; listIndent = indent; listItems = [];\n }\n };\n\n const parseListLine = (line) => {\n const leading = (line.match(/^\\s*/)[0] || '').length;\n const trimmed = line.trim();\n if (/^[-*•]\\s+/.test(trimmed)) {\n return { style: 'bullet', indent: Math.floor(leading / 2), text: trimmed.replace(/^[-*•]\\s+/, '') };\n }\n const m = trimmed.match(/^(\\d+)\\.\\s+(.+)$/);\n if (m) {\n return { style: 'ordered', indent: Math.floor(leading / 2), text: m[2] };\n }\n return null;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n\n // ``` code fence\n if (/^\\s*```/.test(raw)) {\n flushQuote(); flushList();\n if (!inCode) { inCode = true; codeBuf = []; }\n else { blocks.push(preBlock(codeBuf)); inCode = false; codeBuf = []; }\n continue;\n }\n if (inCode) { codeBuf.push(raw); continue; }\n\n // 空行は区切り\n if (/^\\s*$/.test(raw)) {\n flushQuote(); flushList();\n continue;\n }\n\n // 引用\n if (/^\\s*>+\\s?/.test(raw)) {\n flushList();\n const q = raw.replace(/^\\s*>+\\s?/, '');\n inQuote = true; quoteBuf.push(q);\n continue;\n } else if (inQuote) {\n flushQuote();\n }\n\n // 見出し(#〜### or **見出し** 単独行)\n if (/^\\s*#{1,3}\\s+/.test(raw) || /^\\s*\\*\\*(.+?)\\*\\*\\s*$/.test(raw)) {\n flushQuote(); flushList();\n const text = /^\\s*#{1,3}\\s+/.test(raw)\n ? raw.replace(/^\\s*#{1,3}\\s+/, '').trim()\n : (raw.match(/^\\s*\\*\\*(.+?)\\*\\*\\s*$/)[1] || '').trim();\n blocks.push(headerBlock(text));\n continue;\n }\n\n // リスト\n const li = parseListLine(raw);\n if (li) {\n flushQuote();\n startList(li.style, li.indent);\n listItems.push({ type: 'rich_text_section', elements: makeSectionElementsFromText(li.text) });\n continue;\n } else {\n flushList();\n }\n\n // 通常段落\n blocks.push(paragraphBlock(raw));\n }\n\n // 残り\n if (inCode && codeBuf.length) blocks.push(preBlock(codeBuf));\n flushQuote(); flushList();\n\n return blocks;\n}\n\n// ===== Main =====\nconst items = $input.all();\nconst first = $input.first();\nconst source = first?.json?.output ?? '';\n\nconst blocks = convertMarkdownToBlocks(source);\n\n// text_fallback: 最初の header / paragraph を抽出\nlet textFallback = 'Message';\nfor (const b of blocks) {\n if (b.type === 'header') { textFallback = b.text?.text?.slice(0, 300) || textFallback; break; }\n if (b.type === 'rich_text') {\n const el = b.elements?.[0];\n if (el?.type === 'rich_text_section') {\n const s = (el.elements || [])\n .map(e => e.type === 'text' ? e.text : (e.type === 'link' ? (e.text || e.url) : ''))\n .join('');\n if (s) { textFallback = s.slice(0, 300); break; }\n }\n }\n}\n\n// 返却フォーマット(UI Builder と同じトップに blocks)\nfirst.json.blocks = blocks; // 配列(必要ならこちらを直接使う)\nfirst.json.slackPayload = { blocks }; // ← 期待どおりの { \"blocks\": [...] }\nfirst.json.text_fallback = textFallback;\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "bc7b5908-d4b5-4d91-b682-59b98c30d79b",
"name": "조건문",
"type": "n8n-nodes-base.if",
"position": [
-160,
240
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "6385b3c0-7c81-46f4-81cd-3693ea460ab1",
"operator": {
"type": "boolean",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.attachment }} ",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "d7a63115-97ba-4022-9338-f7ab40252b56",
"name": "아무 작업 없음",
"type": "n8n-nodes-base.noOp",
"position": [
112,
448
],
"parameters": {},
"typeVersion": 1
},
{
"id": "71f79653-49b9-4faa-bd5b-2787ab8bb30a",
"name": "스티커 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
-752,
-48
],
"parameters": {
"width": 768,
"height": 656,
"content": "## Triggers\n* End of Google Calendar Event\n* Chat Trigger for testing"
},
"typeVersion": 1
},
{
"id": "a42391fb-cda2-438e-957b-8c342f505842",
"name": "스티커 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
-48
],
"parameters": {
"color": 4,
"height": 464,
"content": "## Adjust format\nAdjust input format for next node that is AI Agent"
},
"typeVersion": 1
},
{
"id": "5f128546-5780-48c4-967e-eb81fff4f611",
"name": "스티커 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-48
],
"parameters": {
"color": 5,
"width": 496,
"height": 656,
"content": "## AI node\nThis AI Agent analyze your meeting transcription, and give a feedback."
},
"typeVersion": 1
},
{
"id": "65be1eda-c622-4bd6-83b9-1c066b55427d",
"name": "스티커 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
848,
-48
],
"parameters": {
"color": 3,
"width": 384,
"height": 656,
"content": "## Output node \n* Changet format from regular markdown to Slack mrkdown by code node\n* Post a slack message\n* You can change the settings to send other channels"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"bc7b5908-d4b5-4d91-b682-59b98c30d79b": {
"main": [
[
{
"node": "c70fd6b4-5428-44ab-8080-f4a10a35de58",
"type": "main",
"index": 0
}
],
[
{
"node": "d7a63115-97ba-4022-9338-f7ab40252b56",
"type": "main",
"index": 0
}
]
]
},
"398412f8-29fa-49eb-ac55-cfef96469809": {
"main": [
[
{
"node": "9d1fa3ac-5030-416e-8020-b2eec0c1f1b4",
"type": "main",
"index": 0
}
]
]
},
"e468e662-b2fa-4f8a-b01d-e0213cdb4d40": {
"main": [
[
{
"node": "8cbf5fe5-879c-456a-9b4d-66d1f04f0b26",
"type": "main",
"index": 0
}
]
]
},
"4a61eb43-d664-493b-887e-c412d6652dfc": {
"ai_tool": [
[
{
"node": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"type": "ai_tool",
"index": 0
}
]
]
},
"650def54-b86d-444f-9d0f-0b20aa6ec372": {
"main": [
[
{
"node": "398412f8-29fa-49eb-ac55-cfef96469809",
"type": "main",
"index": 0
}
]
]
},
"0194fded-a382-47e8-8cec-0a6936df9faa": {
"ai_tool": [
[
{
"node": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"type": "ai_tool",
"index": 0
}
]
]
},
"c70fd6b4-5428-44ab-8080-f4a10a35de58": {
"main": [
[
{
"node": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"type": "main",
"index": 0
}
]
]
},
"8cbf5fe5-879c-456a-9b4d-66d1f04f0b26": {
"main": [
[
{
"node": "bc7b5908-d4b5-4d91-b682-59b98c30d79b",
"type": "main",
"index": 0
}
]
]
},
"ed8ecac5-c3c2-464b-8cfe-540a76525187": {
"main": [
[
{
"node": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"type": "main",
"index": 0
}
]
]
},
"e9a57402-de45-403f-8f0c-b764dffb7a5c": {
"ai_memory": [
[
{
"node": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"type": "ai_memory",
"index": 0
}
]
]
},
"199072fb-3fb9-440d-aa57-44dc6afb2bee": {
"ai_languageModel": [
[
{
"node": "650def54-b86d-444f-9d0f-0b20aa6ec372",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"22b64ef2-5672-43c7-9a8c-e761447eedc1": {
"main": [
[
{
"node": "e468e662-b2fa-4f8a-b01d-e0213cdb4d40",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 콘텐츠 제작, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
✨🩷자동화소셜 미디어콘텐츠게시工厂 + 系统提示组合
基于动态系统提示및GPT-4o의AI驱动多平台소셜 미디어콘텐츠工厂
If
Set
Code
+
If
Set
Code
100 노드Amit Mehta
콘텐츠 제작
批量 SEO 콘텐츠 생성 및 AI 이미지 포함 Webflow 드래그 앤 드롭 생성 (템플릿)
GPT, Gemini 이미지, Webflow 드라フト를 사용하여 대량 SEO 콘텐츠 생성
If
Set
Code
+
If
Set
Code
54 노드Dahiana
콘텐츠 제작
완전한 B2B 판매 프로세스: Apollo 잠재 고객 생성, Mailgun 프로모션 및 AI 응답 관리
완전한 B2B 판매 프로세스: Apollo 잠재 고객 생성, Mailgun 확장 및 AI 응답 관리
If
Set
Code
+
If
Set
Code
116 노드Paul
콘텐츠 제작
시각화 참조 라이브러리에서 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
콘텐츠 제작
1. 플레이리스트 상세 설정 로봇 복사본
Suno, GPT-4, Runway, Creatomate로 AI 생성 YouTube 음악 플레이리스트 생성
If
Set
Code
+
If
Set
Code
203 노드Joseph
콘텐츠 제작