AI 포맷화를 사용하여 Markdown 내용을 Contentful 텍스트로 변환
중급
이것은Engineering, AI분야의자동화 워크플로우로, 12개의 노드를 포함합니다.주로 Code, Merge, HttpRequest, Agent, LmChatOpenAi 등의 노드를 사용하며인공지능 기술을 결합하여 스마트 자동화를 구현합니다. AI 포맷을 사용하여 Markdown 내용을 Contentful 텍스트로 변환
사전 요구사항
- •대상 API의 인증 정보가 필요할 수 있음
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "uIREtTV8TRuF3lru",
"meta": {
"instanceId": "6bcff5ef8a06e8086902526a05c2a4c7bf5da8101f89e582301ed78094606f40"
},
"name": "Convert Markdown Content to Contentful Rich Text with AI Formatting.",
"tags": [
{
"id": "NEDxtCyOlsLSVNBI",
"name": "Formatter",
"createdAt": "2025-05-17T10:41:27.012Z",
"updatedAt": "2025-05-17T10:41:27.012Z"
},
{
"id": "B6FHhLBUZRavCehy",
"name": "Content Creation",
"createdAt": "2025-05-17T10:41:40.276Z",
"updatedAt": "2025-05-17T10:41:40.276Z"
}
],
"nodes": [
{
"id": "f50b2f81-d9b4-4206-a18c-a02573afe8e7",
"name": "새로 포맷된 Contentful 엔트리 생성",
"type": "n8n-nodes-base.httpRequest",
"position": [
1680,
240
],
"parameters": {
"url": "=https://api.contentful.com/spaces/{INSERT_YOUR_SPACE}/environments/master/entries",
"method": "POST",
"options": {},
"jsonBody": "={{ $json }}",
"sendBody": true,
"jsonHeaders": "{\n \"Authorization\": \"Bearer {INSERT TOKEN HERE}\",\n \"Content-Type\": \"application/vnd.contentful.management.v1+json\",\n \"X-Contentful-Version\": \"2\", \n \"X-Contentful-Content-Type\": \"knowledgeBaseArticle\"\n}",
"sendHeaders": true,
"specifyBody": "json",
"specifyHeaders": "json"
},
"typeVersion": 4.2
},
{
"id": "d2d8efbc-3914-4c9b-98fe-566c1843f58d",
"name": "다른 워크플로우에 의해 실행 시",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
-380,
20
],
"parameters": {
"inputSource": "jsonExample",
"jsonExample": "{\n \"title\": \"...\",\n \"slug\": \"...\",\n \"category\": {\n \"id\": \"...\"\n },\n \"description\": \"...\",\n \"keywords\": [\"keyword1\", \"keyword2\"],\n \"content\": \"...\",\n \"metaTitle\": \"...\",\n \"metaDescription\": \"...\",\n \"readingTime\": \"...\",\n \"difficulty\": \"...\"\n}"
},
"typeVersion": 1.1
},
{
"id": "57960c96-94ce-43d1-83b8-d6417b79373a",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
1020,
240
],
"parameters": {},
"typeVersion": 3
},
{
"id": "f304bcec-2150-4767-95a9-38c1e98e2c52",
"name": "Format1",
"type": "n8n-nodes-base.code",
"position": [
1360,
240
],
"parameters": {
"jsCode": "// Get all items passed into this node as an array\nconst items = $input.all();\n\n\n// If you always have at least two items:\nconst firstItem = items[0].json;\nconst secondItem = items[1].json;\n\n// Overwrite the first item’s “content” with the second item’s “content”\nfirstItem.content = secondItem.content;\n\nreturn [\n {\n json: {\n fields: {\n title: { \"en-US\": firstItem.title },\n slug: { \"en-US\": firstItem.slug },\n category: {\n \"en-US\": {\n sys: {\n type: \"Link\",\n linkType: \"Entry\",\n id: firstItem.category.id\n }\n }\n },\n description: { \"en-US\": firstItem.description },\n keywords: { \"en-US\": firstItem.keywords },\n content: {\n \"en-US\": {\n nodeType: \"document\",\n data: {},\n content: firstItem.content\n }\n },\n metaTitle: { \"en-US\": firstItem.metaTitle },\n metaDescription: { \"en-US\": firstItem.metaDescription },\n readingTime: { \"en-US\": firstItem.readingTime },\n difficulty: { \"en-US\": firstItem.difficulty }\n }\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "85edaba2-c42b-4ca8-af84-080255dd93d3",
"name": "Markdown을 Contentful 형식으로 변환",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
340,
380
],
"parameters": {
"text": "=Here is the markdown content to convert:\n\n{{ $json.contentChunk }}",
"options": {
"systemMessage": "=You are a npm package which takes markdown and converts it to valid Contentful Rich Text\n\nHere are some examples of input to output:\n\nAdditional Rules to Avoid Validation Errors:\n\nEnsure every single node, especially heading and paragraph types, includes the \"data\": {} property explicitly. Do NOT omit \"data\" even if it is empty.\n\nValidate that each text, inline, or block element consistently adheres to this structure:\n\n{\n \"nodeType\": \"<type>\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"<childType>\",\n \"value\": \"<textValue>\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n}\nFor elements like text nodes, always explicitly include \"data\": {} alongside \"marks\": [] even if they are empty arrays or objects.\n\nDo not output nodes without the complete structure specified above, as this can cause validation failures in Contentful.\n\nConfirm explicitly that \"content\": [] is included, even if empty, for nodes that require it (e.g., embedded-asset-block, hr, etc.).\n\nNever output incomplete nodes missing \"data\" or \"content\".\n\nExample of Correct Minimal Node Structure:\n\n{\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Your text here.\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n}\n\nAlways strictly follow this guidance to ensure successful content publishing and avoid repeated validation errors.\n\n1. Paragraphs\n\nMarkdown:\n\nThis is a paragraph of text.\n\nContentful Rich Text JSON:\n\n{\n \"nodeType\": \"document\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"This is a paragraph of text.\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n}\n2. Headings\n\nMarkdown:\n\n# Heading Level 1\n## Heading Level 2\n### Heading Level 3\n\nContentful Rich Text JSON:\n\n{\n \"nodeType\": \"document\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"heading-1\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Heading Level 1\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n },\n {\n \"nodeType\": \"heading-2\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Heading Level 2\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n },\n {\n \"nodeType\": \"heading-3\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Heading Level 3\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n}\n\n3. Bold and Italic Text\n\nMarkdown:\n\n**Bold Text**\n*Italic Text*\n\nContentful Rich Text JSON:\n\n{\n \"nodeType\": \"document\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Bold Text\",\n \"marks\": [\n {\n \"type\": \"bold\"\n }\n ],\n \"data\": {}\n }\n ]\n },\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Italic Text\",\n \"marks\": [\n {\n \"type\": \"italic\"\n }\n ],\n \"data\": {}\n }\n ]\n }\n ]\n}\n4. Lists\n\nMarkdown:\n\n- Unordered Item 1\n- Unordered Item 2\n\n1. Ordered Item 1\n2. Ordered Item 2\n\nContentful Rich Text JSON:\n\n{\n \"nodeType\": \"document\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"unordered-list\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"list-item\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Unordered Item 1\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n },\n {\n \"nodeType\": \"list-item\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Unordered Item 2\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n }\n ]\n },\n {\n \"nodeType\": \"ordered-list\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"list-item\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Ordered Item 1\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n },\n {\n \"nodeType\": \"list-item\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Ordered Item 2\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}\n5. Links\n\nMarkdown:\n\n[Contentful](https://www.contentful.com)\n\nContentful Rich Text JSON:\n\n{\n \"nodeType\": \"document\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"paragraph\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"hyperlink\",\n \"data\": {\n \"uri\": \"https://www.contentful.com\"\n },\n \"content\": [\n {\n \"nodeType\": \"text\",\n \"value\": \"Contentful\",\n \"marks\": [],\n \"data\": {}\n }\n ]\n }\n ]\n }\n ]\n}\n6. Images\n\nMarkdown:\n\n\n\nContentful Rich Text JSON:\n\n{\n \"nodeType\": \"document\",\n \"data\": {},\n \"content\": [\n {\n \"nodeType\": \"embedded-asset-block\",\n \"data\": {\n \"target\": {\n \"sys\": {\n \"id\": \"asset-id\",\n \"type\": \"Link\",\n \"linkType\": \"Asset\"\n }\n }\n },\n \"content\": []\n }\n ]\n}\n\nRules:\n- The output must be valid Rich Text based on the specifications\n- Do not make up any new types, only use the information that is available\n- Do not output anything else besides the Contetnful RIch Text JSON in the format specified above\n- Do not include ```json before the output. The output needs to be parseable JSON\n- You must include a node to account for every single work in the input. DO NOT exclude any data from the input\n\nHere are all the possible types:\n\nimport { BLOCKS } from './blocks';\nimport { INLINES } from './inlines';\nimport { Block, Inline, ListItemBlock, Text } from './types';\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype EmptyNodeData = {};\n// BLOCKS\n\n// Heading\nexport interface Heading1 extends Block {\n nodeType: BLOCKS.HEADING_1;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\nexport interface Heading2 extends Block {\n nodeType: BLOCKS.HEADING_2;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\nexport interface Heading3 extends Block {\n nodeType: BLOCKS.HEADING_3;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\nexport interface Heading4 extends Block {\n nodeType: BLOCKS.HEADING_4;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\nexport interface Heading5 extends Block {\n nodeType: BLOCKS.HEADING_5;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\nexport interface Heading6 extends Block {\n nodeType: BLOCKS.HEADING_6;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\n// Paragraph\nexport interface Paragraph extends Block {\n nodeType: BLOCKS.PARAGRAPH;\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\n// Quote\nexport interface Quote extends Block {\n nodeType: BLOCKS.QUOTE;\n data: EmptyNodeData;\n content: Paragraph[];\n}\n// Horizontal rule\nexport interface Hr extends Block {\n nodeType: BLOCKS.HR;\n /**\n *\n * @maxItems 0\n */\n data: EmptyNodeData;\n content: Array<Inline | Text>;\n}\n\n// OL\nexport interface OrderedList extends Block {\n nodeType: BLOCKS.OL_LIST;\n data: EmptyNodeData;\n content: ListItem[];\n}\n// UL\nexport interface UnorderedList extends Block {\n nodeType: BLOCKS.UL_LIST;\n data: EmptyNodeData;\n content: ListItem[];\n}\n\nexport interface ListItem extends Block {\n nodeType: BLOCKS.LIST_ITEM;\n data: EmptyNodeData;\n content: ListItemBlock[];\n}\n\n// taken from graphql schema-generator/contentful-types/link.ts\nexport interface Link<T extends string = string> {\n sys: {\n type: 'Link';\n linkType: T;\n id: string;\n };\n}\n\nexport interface ResourceLink {\n sys: {\n type: 'ResourceLink';\n linkType: 'Contentful:Entry';\n urn: string;\n };\n}\n\nexport interface EntryLinkBlock extends Block {\n nodeType: BLOCKS.EMBEDDED_ENTRY;\n data: {\n target: Link<'Entry'>;\n };\n /**\n *\n * @maxItems 0\n */\n content: Array<Inline | Text>;\n}\n\nexport interface AssetLinkBlock extends Block {\n nodeType: BLOCKS.EMBEDDED_ASSET;\n data: {\n target: Link<'Asset'>;\n };\n /**\n *\n * @maxItems 0\n */\n content: Array<Inline | Text>;\n}\n\nexport interface ResourceLinkBlock extends Block {\n nodeType: BLOCKS.EMBEDDED_RESOURCE;\n data: {\n target: ResourceLink;\n };\n /**\n *\n * @maxItems 0\n */\n content: Array<Inline | Text>;\n}\n\n// INLINE\n\nexport interface EntryLinkInline extends Inline {\n nodeType: INLINES.EMBEDDED_ENTRY;\n data: {\n target: Link<'Entry'>;\n };\n /**\n *\n * @maxItems 0\n */\n content: Text[];\n}\n\nexport interface ResourceLinkInline extends Inline {\n nodeType: INLINES.EMBEDDED_RESOURCE;\n data: {\n target: ResourceLink;\n };\n /**\n *\n * @maxItems 0\n */\n content: Text[];\n}\n\nexport interface Hyperlink extends Inline {\n nodeType: INLINES.HYPERLINK;\n data: {\n uri: string;\n };\n content: Text[];\n}\n\nexport interface AssetHyperlink extends Inline {\n nodeType: INLINES.ASSET_HYPERLINK;\n data: {\n target: Link<'Asset'>;\n };\n content: Text[];\n}\n\nexport interface EntryHyperlink extends Inline {\n nodeType: INLINES.ENTRY_HYPERLINK;\n data: {\n target: Link<'Entry'>;\n };\n content: Text[];\n}\n\nexport interface ResourceHyperlink extends Inline {\n nodeType: INLINES.RESOURCE_HYPERLINK;\n data: {\n target: ResourceLink;\n };\n content: Text[];\n}\n\nexport interface TableCell extends Block {\n nodeType: BLOCKS.TABLE_HEADER_CELL | BLOCKS.TABLE_CELL;\n data: {\n colspan?: number;\n rowspan?: number;\n };\n\n /**\n * @minItems 1\n */\n content: Paragraph[];\n}\n\nexport interface TableHeaderCell extends TableCell {\n nodeType: BLOCKS.TABLE_HEADER_CELL;\n}\n\n// An abstract table row can have both table cell types\n\nexport interface TableRow extends Block {\n nodeType: BLOCKS.TABLE_ROW;\n data: EmptyNodeData;\n\n /**\n * @minItems 1\n */\n content: TableCell[];\n}\n\nexport interface Table extends Block {\n nodeType: BLOCKS.TABLE;\n data: EmptyNodeData;\n\n /**\n * @minItems 1\n */\n content: TableRow[];\n}"
},
"promptType": "define"
},
"typeVersion": 1.8
},
{
"id": "3b409954-1506-46da-8ea9-ed2c938b84fc",
"name": "제목별로 분할",
"type": "n8n-nodes-base.code",
"position": [
0,
220
],
"parameters": {
"jsCode": "// Split the markdown into sections using ## as the logical chunk point\nconst splitByHeading = (markdown, headingLevel = 3) => {\n const headingRegex = new RegExp(`(?=^${'#'.repeat(headingLevel)}\\\\s)`, 'gm');\n return markdown.split(headingRegex).filter(chunk => chunk.trim());\n};\n\n// Get the first input item's content\nconst input = items[0].json;\nconst chunks = splitByHeading(input.content);\n\nreturn chunks.map((chunk, index) => {\n return {\n json: {\n index,\n slug: input.slug?.trim(),\n title: input.title?.trim(),\n contentChunk: chunk.trim(),\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "d9bd0b06-730b-4e63-a3f4-73678b09aaa7",
"name": "리치 텍스트 객체 결합",
"type": "n8n-nodes-base.code",
"position": [
720,
380
],
"parameters": {
"jsCode": "const combinedContent = [];\n\nfor (const item of items) {\n let raw = item.json;\n\n // Handle if AI agent returned a stringified JSON inside a property like `output`\n if (typeof raw === 'object' && typeof raw.output === 'string') {\n try {\n raw = JSON.parse(raw.output);\n } catch (e) {\n throw new Error(`Failed to parse JSON from agent output:\\n${raw.output}`);\n }\n }\n\n // Handle if AI agent returned plain stringified JSON (not wrapped in a key)\n if (typeof raw === 'string') {\n try {\n raw = JSON.parse(raw);\n } catch (e) {\n throw new Error(`Failed to parse raw JSON string:\\n${raw}`);\n }\n }\n\n // Add content from parsed result\n if (raw?.content?.length) {\n combinedContent.push(...raw.content);\n }\n}\n\nreturn [\n {\n json: {\n nodeType: 'document',\n data: {},\n content: combinedContent\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "08f5c7a8-3200-47bf-a4c9-5333956ddf49",
"name": "OpenAI Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
300,
620
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1",
"cachedResultName": "gpt-4.1"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "KLN8ZfDzv8mW6pyu",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "e1bbe1ba-3be3-44c9-af34-e27c56246545",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
200,
80
],
"parameters": {
"width": 880,
"height": 760,
"content": "# Converts to Proprietary Format for Contentful\n\n- Uses an example output format to generate content to specific rich text formatting for contentful upload.\n- References the contentful documentation for the bot to pull from."
},
"typeVersion": 1
},
{
"id": "36266f04-12cf-4a19-8d60-45974e69ab6b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
-340
],
"parameters": {
"color": 3,
"width": 980,
"height": 860,
"content": "# Publishes to Contentful API\n\n## Requirements\n\n- Add your space ID to the endpoint\n- Add your Management Token to the flow\n\n\n| Field Name | Type | Description |\n|------------|------|-------------|\n| Title | Short text | The title of the article. Acts as the entry title. |\n| Slug | Short text | URL-friendly version of the title, used in routing. |\n| Category | Reference | Linked content type representing the article's category. |\n| Description | Long text | A short summary or overview of the article. |\n| Keywords | Short text (list) | SEO keywords for the article. |\n| Meta Title | Short text | SEO-specific title shown in browser tab and search engines. |\n| Meta Description | Long text | SEO-specific description used in search engine previews. |\n| Difficulty Level | Short text | Indicates how advanced the content is (e.g., Beginner, Intermediate, Advanced). |\n| Related Articles | References (many) | Links to other related article entries for cross-referencing. |\n| Content | Rich text | Main body of the article. Supports formatting, embeds, etc. |\n| readingTime | Short text | Estimated reading time (e.g., \"5 min read\"). |"
},
"typeVersion": 1
},
{
"id": "f0ecec88-c4a7-472f-b71b-d78f57635472",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-800,
-520
],
"parameters": {
"color": 5,
"width": 900,
"height": 620,
"content": "# Varritech Free Workflows for n8n\n\nAccess our collection of **free, ready-to-use n8n workflows** designed to streamline your data operations and automation needs.\n\n## What You'll Get:\n- Pre-built data integration workflows\n- Time-saving automation templates\n- Step-by-step implementation guides\n- Regular updates with new workflows\n\n## How to Use:\n1. Download our free workflows\n2. Import into your n8n instance\n3. Configure with your credentials\n4. Start automating immediately\n\n**Note:** For additional workflows, tutorials, and technical support, visit our website at [varritech.com](https://varritech.com)\n\n*Unlock the full potential of n8n with Varritech's workflow solutions!*"
},
"typeVersion": 1
},
{
"id": "e4bf6af7-cd5a-4f54-9512-5e91d86f6bf6",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
620
],
"parameters": {
"color": 4,
"width": 980,
"height": 540,
"content": "# Need Additional Help With Contentful?\n\nThank you for using our free n8n Upload to Contentful workflow! If you need assistance with:\n\n- Custom Contentful implementations\n- Advanced content modeling strategies\n- API integration optimization\n- Content migration services\n- Extending your automation workflows\n\n**Varritech is here to help!** Our team specializes in CMS implementations and automation solutions to streamline your content operations.\n\nVisit [varritech.com](https://varritech.com) for expert support with your Contentful and automation needs."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1",
"executionTimeout": 600
},
"versionId": "c049c9ae-5037-4f0e-b499-65b5315529b3",
"connections": {
"57960c96-94ce-43d1-83b8-d6417b79373a": {
"main": [
[
{
"node": "f304bcec-2150-4767-95a9-38c1e98e2c52",
"type": "main",
"index": 0
}
]
]
},
"f304bcec-2150-4767-95a9-38c1e98e2c52": {
"main": [
[
{
"node": "f50b2f81-d9b4-4206-a18c-a02573afe8e7",
"type": "main",
"index": 0
}
]
]
},
"3b409954-1506-46da-8ea9-ed2c938b84fc": {
"main": [
[
{
"node": "85edaba2-c42b-4ca8-af84-080255dd93d3",
"type": "main",
"index": 0
}
]
]
},
"08f5c7a8-3200-47bf-a4c9-5333956ddf49": {
"ai_languageModel": [
[
{
"node": "85edaba2-c42b-4ca8-af84-080255dd93d3",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"d9bd0b06-730b-4e63-a3f4-73678b09aaa7": {
"main": [
[
{
"node": "57960c96-94ce-43d1-83b8-d6417b79373a",
"type": "main",
"index": 1
}
]
]
},
"85edaba2-c42b-4ca8-af84-080255dd93d3": {
"main": [
[
{
"node": "d9bd0b06-730b-4e63-a3f4-73678b09aaa7",
"type": "main",
"index": 0
}
]
]
},
"d2d8efbc-3914-4c9b-98fe-566c1843f58d": {
"main": [
[
{
"node": "3b409954-1506-46da-8ea9-ed2c938b84fc",
"type": "main",
"index": 0
},
{
"node": "57960c96-94ce-43d1-83b8-d6417b79373a",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 엔지니어링, 인공지능
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Github 기반 자동 단위 테스트 생성기
GitHub PR 자동 Jest 테스트 생성, 이중 AI 검토 지원
Code
Merge
Github
+
Code
Merge
Github
24 노드Cristiano Varriale
엔지니어링
VDS 워크플로우 공개판
사용AI、GitHub및Vercel에서文本提示构建및部署MVP
If
Code
Wait
+
If
Code
Wait
54 노드Varritech
데브옵스
AI 어시스턴트와 Airtable 대화 및 데이터 분석
AI스마트어시스턴트与Airtable对话及데이터분석
If
Set
Merge
+
If
Set
Merge
41 노드Mark Shcherbakov
엔지니어링
OpenAI와 RAGAS 방법을 사용하여 AI 대리자 응답 정확성 평가
OpenAI와 RAGAS 방법을 사용하여 AI 대리자 응답 정확성을 평가
Set
Code
Merge
+
Set
Code
Merge
27 노드Jimleuk
엔지니어링
평가 지표:답변 유사도
평가 지표: 답변 유사도
Set
Code
Merge
+
Set
Code
Merge
21 노드Jimleuk
엔지니어링
자동화 뉴스-브리핑 AI 에이전트 v13
AI 뉴스 연구 팀: 24/7 브리핑 자동화, Perplexity 인용 포함
Set
Code
Gmail
+
Set
Code
Gmail
37 노드Derek Cheung
제품