Mein Workflow 3

Experte

Dies ist ein AI Summarization, Multimodal AI-Bereich Automatisierungsworkflow mit 33 Nodes. Hauptsächlich werden Set, Code, Merge, ManualTrigger, ReadWriteFile und andere Nodes verwendet. 🤖📝 Notizen-Automatisierung mit GPT-4o-mini für Workflows

Voraussetzungen
  • OpenAI API Key
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "id": "bpWoWCIC6CNDalPP",
  "meta": {
    "instanceId": "e3b8c25a8cb5935de24fc3d0e60a61032f6dc1d69388fb7fdac79d48279775d0"
  },
  "name": "My workflow 3",
  "tags": [],
  "nodes": [
    {
      "id": "2d5d8cee-5333-44d7-a637-9d8401d46b10",
      "name": "Bei Klick auf 'Workflow ausführen'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        1168,
        432
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "d02cdb9c-6473-4331-99b5-3a3b20d92a77",
      "name": "Workflow parsen",
      "type": "n8n-nodes-base.code",
      "position": [
        2752,
        432
      ],
      "parameters": {
        "jsCode": "function unwrap(input) {\n  let wf = input;\n  if (Array.isArray(wf)) wf = wf[0];\n\n  // Tu caso: { workflow: { data: {...} }, nodes: [] }\n  if (wf?.workflow?.data?.nodes) return wf.workflow;\n\n  // Caso común: { data: { nodes } }\n  if (wf?.data?.nodes) return wf;\n\n  // Plano: { nodes }\n  if (wf?.nodes) return { data: wf };\n\n  throw new Error('No encuentro un workflow válido (workflow.data.nodes / data.nodes / nodes).');\n}\n\nconst wrapped = unwrap($json);             // { data: {...} }\nconst nodesAll = wrapped.data?.nodes ?? [];\nconst realNodes = nodesAll.filter(n => n.type !== 'n8n-nodes-base.stickyNote');\n\nconst summary = realNodes.map(n => ({ name: n.name, type: n.type })).slice(0, 50);\n\nreturn [{\n  json: {\n    wrappedWorkflow: wrapped,                 // lo llevamos hasta el final\n    realNodes,                                // array para el split\n    nodesSummaryText: JSON.stringify(summary, null, 2)\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "bae8a3be-0c25-4b22-9353-6ff77e534fd9",
      "name": "Gesamt-Notiz",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        3152,
        -224
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "=You are a technical writer specialized in n8n. You write clear, concise, and actionable sticky notes, including bullet points, gotchas, and configuration parameters.\n\nTake in account the following context of the user about the workflow:  {{ $('Your Workflow Description').item.json.Context }}\n\nPlease include in the end of the note always my contact informatio, you will se below in the example: \n\n\n\nHere some examples, depending on the node you can add extra information that you think is relevant: \n\n## 🎧 Newsletter-to-Audio Conversation Flow\\n\\nThis workflow turns unread newsletters from your email inbox into dynamic audio conversations between two AI voices — inspired by **Google's NotebookLM** ability to summarize and humanize dense content.\\n\\n### ✨ How it works:\\n1. 📨 **Fetch Unread Newsletters** using Gmail (e.g., sender: \\\"your_favorite@newsletter.com\\\").\\n2. 🧠 **Summarize and Reformat** the content into a dialogue using an LLM (like OpenAI or Gemini).\\n3. 🗣️ **Generate Voices** for each part of the conversation using a TTS service (e.g., ElevenLabs, Google TTS).\\n4. 🎛️ **Merge Audio Segments** into a natural back-and-forth flow using FFmpeg or audio nodes.\\n5. 📤 **Send the Final Audio** file back to your email inbox (or deliver to another channel like Telegram or Drive).\\n\\n### 💡 Inspired by:\\nNotebookLM's approach to making long-form text more digestible by turning it into personalized, conversational summaries.\\n\\nYou can modify:\\n- 🎙️ The tone and voice of the personas\\n- 🕵️ Email filters (e.g., subject or sender)\\n- 📫 The delivery method (email, storage, etc.)\\n\\n> Ideal for turning passive subscriptions into engaging, hands-free content.\\n\\n\\n### \n\n📬 Need help or want to collaborate?\\n\\nIf you have any questions, need help setting this up, or want to share feedback — feel free to reach out:  \\n📩 **Luis.acosta@news2podcast.com** or DM me in twitter [@guanchehacker](http:\\\\www.x.com/GuancheHacker) \\n\\nIf you're looking to build something more advanced with audio and AI, let me know and I’ll figure out how I can help you!\\n\n\n"
            },
            {
              "content": "=Generate a general sticky note to document this n8n workflow. Include:\nH2 with the workflow title\nGoal (3–4 sentences)\nHow it works (bullets)\nParameters to configure\nLimitations / Gotchas\nExpected result\nMaximum 220–250 words, in Markdown.\nWorkflow summary (trimmed JSON):\n{{ $json.nodesSummaryText }}\n\n\n\n"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "YOUR_ID_OPEN_AI",
          "name": "YOUR_NAME_OPEN_AI"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "d442ab6b-c8c1-4a57-8159-42ce93131537",
      "name": "Elemente aufteilen",
      "type": "n8n-nodes-base.code",
      "position": [
        3552,
        208
      ],
      "parameters": {
        "jsCode": "const arr = $json.realNodes || [];\nreturn arr.map(n => ({ json: n }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "91f0d27e-72f1-4c28-877d-2463725817c2",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        5920,
        -16
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "3c74b066-0050-4776-8cf3-4893ca5c0aac",
      "name": "Übersicht umbenennen",
      "type": "n8n-nodes-base.code",
      "position": [
        5136,
        -224
      ],
      "parameters": {
        "jsCode": "return [{ json: { overviewContent: $json.message.content } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "76e63340-af6e-4952-9534-1abba43eb27d",
      "name": "Merge2",
      "type": "n8n-nodes-base.merge",
      "position": [
        6320,
        416
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "e0f43eca-b076-446a-9c40-49efce250641",
      "name": "Workflow zusammenstellen",
      "type": "n8n-nodes-base.code",
      "position": [
        6720,
        416
      ],
      "parameters": {
        "jsCode": "function uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = Math.random()*16|0, v = c==='x'? r : (r&0x3|0x8);\n    return v.toString(16);\n  });\n}\n\nconst parts = $input.all().map(i => i.json);\n\nconst wrapped = parts.find(p => p.wrappedWorkflow)?.wrappedWorkflow;\nif (!wrapped) throw new Error('Assemble: missing wrappedWorkflow');\nconst root = wrapped.data ? wrapped.data : wrapped;\n\nconst stickies = parts.find(p => Array.isArray(p.stickies))?.stickies ?? [];\nconst moves    = parts.find(p => Array.isArray(p.moves))?.moves ?? [];\nconst overviewContent = parts.find(p => typeof p.overviewContent === 'string')?.overviewContent ?? '## Overview\\n(No content)';\n\n// ensure top-level keys\nroot.name = root.name || 'Workflow';\nroot.nodes = Array.isArray(root.nodes) ? root.nodes : [];\nroot.connections = root.connections || {};\nroot.settings = root.settings || { executionOrder: 'v1' };\nroot.pinData = root.pinData || {};\nroot.tags = root.tags || [];\n\n// remove old stickies\nroot.nodes = root.nodes.filter(n => n.type !== 'n8n-nodes-base.stickyNote');\n\n// apply moves\nconst moveMap = new Map(moves.map(m => [m.id, m.position]));\nfor (const n of root.nodes) {\n  const pos = moveMap.get(n.id);\n  if (pos) n.position = pos;\n}\n\n// anchors AFTER moving nodes\nconst xs = root.nodes.map(n => n.position?.[0] ?? 0);\nconst ys = root.nodes.map(n => n.position?.[1] ?? 0);\nconst minX = Math.min(...xs);\nconst topY = Math.min(...ys);\n\n// overview (yellow) to the left of first row\nconst OVERVIEW_W = 600;\nconst OVERVIEW_H = 1020;\nconst OVERVIEW_MARGIN = 80;\nconst OVERVIEW_COLOR = 3; // yellow in most themes (try 4 if your theme differs)\n\nconst overviewSticky = {\n  parameters: { content: overviewContent, width: OVERVIEW_W, height: OVERVIEW_H, color: OVERVIEW_COLOR },\n  id: uuidv4(),\n  name: 'Sticky Note - Overview',\n  type: 'n8n-nodes-base.stickyNote',\n  position: [ minX - OVERVIEW_MARGIN - OVERVIEW_W, topY ],\n  typeVersion: 1,\n};\n\n// add overview + per-node stickies\nroot.nodes.push(overviewSticky, ...stickies);\n\n// output root object\nconst out = JSON.stringify(root, null, 2);\nreturn [{\n  json: {},\n  binary: {\n    data: {\n      data: Buffer.from(out, 'utf8').toString('base64'),\n      fileName: 'workflow-with-sticky.json',\n      mimeType: 'application/json'\n    }\n  }\n}];\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "daf97d55-acb3-4303-a6f5-1f0bbca131f0",
      "name": "Inhalt abrufen",
      "type": "n8n-nodes-base.code",
      "position": [
        4336,
        32
      ],
      "parameters": {
        "jsCode": "\nreturn $input.all().map(it => ({\n  json: { content: it.json?.message?.content ?? '' }\n}));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d0ece629-d110-401a-8134-0111af313714",
      "name": "Layout-Blöcke RTL",
      "type": "n8n-nodes-base.code",
      "position": [
        5520,
        192
      ],
      "parameters": {
        "jsCode": "/******** CONFIG — adjust as needed ********/\nconst NODE_W   = 300;    // visual width of an n8n node (approx.)\nconst NODE_H   = 100;    // visual height of an n8n node (approx.)\nconst STICKY_W = 380;    // sticky note width\nconst STICKY_H = 1020;   // sticky note height (taller for documentation)\nconst STICKY_COLOR = 7;  // color (7 = white in most themes, 0 = yellow, etc.)\nconst GAP_X    = 16;     // horizontal gap between blocks (node + sticky)\nconst GAP_Y    = 48;     // vertical gap between node and sticky (used in baseline)\nconst ROW_GAP  = 48;     // vertical gap between block rows (only used if wrapping)\nconst MAX_PER_ROW = 9999;// prevent wrapping (set to e.g. 6 to enable wrapping)\nconst START_RIGHT_MARGIN = 40; // margin from the rightmost node\n\n// fine-tuning micro adjustments\nconst CENTER_TWEAK_X = 0;   // + right, - left (horizontal alignment tweak)\nconst CENTER_TWEAK_Y = 0;   // + down,  - up   (small tweak applied to node Y only)\nconst STICKY_BASELINE_TWEAK = 0; // global tweak for all stickies (+ down / - up)\n\n/******** helpers ********/\nfunction uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);\n    return v.toString(16);\n  });\n}\n\n/******** INPUT → normalize to { node, content } ********/\nconst raw = $input.all().map(i => i.json);\n\nfunction defaultContent(n) {\n  return `### ${n.name} (${n.type})\n\n- Purpose: …\n- Inputs/Outputs: …\n- Key fields: …\n- Tip: …`;\n}\n\nconst items = raw.map(it => {\n  // case: { node, content }\n  if (it?.node?.type) {\n    return { node: it.node, content: it.content ?? it.message?.content ?? defaultContent(it.node) };\n  }\n  // case: item is a node itself\n  if (it?.type && it?.id && Array.isArray(it.position)) {\n    return { node: it, content: it.content ?? it.message?.content ?? defaultContent(it) };\n  }\n  return null;\n}).filter(Boolean);\n\n// skip already existing sticky notes\nconst filtered = items.filter(i => i.node.type !== 'n8n-nodes-base.stickyNote');\nif (!filtered.length) {\n  return [{ json: { stickies: [], moves: [] } }];\n}\n\n/******** ORDER: right → left ********/\nconst sorted = filtered.slice().sort((a, b) =>\n  (b.node.position?.[0] ?? 0) - (a.node.position?.[0] ?? 0)\n);\n\n/******** GLOBAL ANCHORS / METRICS ********/\nconst allX = filtered.map(i => i.node.position?.[0] ?? 0);\nconst allY = filtered.map(i => i.node.position?.[1] ?? 0);\nconst maxX = Math.max(...allX);\nconst minY = Math.min(...allY);\n\n// baseline for ALL stickies = aligned to the lowest node\n// (in n8n, larger Y means lower on the canvas)\nconst lowestNodeY = Math.max(...allY);\n\n// initial cursor to the right of the rightmost node\nlet cursorRight = maxX + START_RIGHT_MARGIN;\nlet rowTop = Number.isFinite(minY) ? minY : 0;\n\n// block size = node above + gap + sticky below\nconst BLOCK_W = Math.max(NODE_W, STICKY_W);\nconst BLOCK_H = NODE_H + GAP_Y + STICKY_H;\n\nconst stickies = [];\nconst moves = [];\nlet countInRow = 0;\n\n/******** PLACEMENT LOOP (node above, sticky centered below) ********/\nfor (const it of sorted) {\n  const node = it.node;\n  const content = it.content;\n\n  const blockRight = cursorRight;\n  const blockLeft  = blockRight - BLOCK_W;\n\n  // NODE: X is centered inside block\n  const nodeX = Math.round(blockLeft + (BLOCK_W - NODE_W) / 2 + CENTER_TWEAK_X);\n\n  // NODE: Y is preserved from original position (fallback to rowTop) + micro tweak\n  const origY = Array.isArray(node.position) && Number.isFinite(node.position[1])\n    ? node.position[1]\n    : rowTop;\n  const nodeY = Math.round(origY + CENTER_TWEAK_Y);\n\n  // STICKY: X is centered under node, Y is the same baseline for all stickies\n  const nodeCenterX = nodeX + NODE_W / 2;\n  const stickyX = Math.round(nodeCenterX - STICKY_W / 2);\n\n  const baselineStickyY = Math.round(lowestNodeY + NODE_H + GAP_Y + STICKY_BASELINE_TWEAK);\n  const stickyY = baselineStickyY;\n\n  // record node move (X recalculated; Y preserved)\n  moves.push({ id: node.id, position: [nodeX, nodeY] });\n\n  // create sticky note\n  stickies.push({\n    parameters: { content, width: STICKY_W, height: STICKY_H, color: STICKY_COLOR },\n    id: uuidv4(),\n    name: `Sticky Note - ${node.name}`,\n    type: 'n8n-nodes-base.stickyNote',\n    position: [stickyX, stickyY],\n    typeVersion: 1,\n  });\n\n  // advance to the next block to the LEFT\n  cursorRight = blockLeft - GAP_X;\n  countInRow++;\n\n  // optional row wrapping if MAX_PER_ROW < 9999\n  if (countInRow >= MAX_PER_ROW) {\n    countInRow = 0;\n    cursorRight = maxX + START_RIGHT_MARGIN;\n    rowTop += BLOCK_H + ROW_GAP;\n  }\n}\n\n/******** OUTPUT ********/\nreturn [{ json: { stickies, moves } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "b65b6172-b06b-4f81-bd4a-e9a9341b223e",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        4736,
        192
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "b7a16515-7672-422b-b457-9ec117b38561",
      "name": "Workflow laden",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        1968,
        432
      ],
      "parameters": {
        "options": {},
        "fileSelector": "/Your_path_to_file/workflow.json"
      },
      "typeVersion": 1
    },
    {
      "id": "a1c6f979-dca9-48ad-9fc8-0e944f99ec79",
      "name": "Konvertieren zu JSON",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2352,
        432
      ],
      "parameters": {
        "options": {
          "encoding": "utf8"
        },
        "operation": "fromJson"
      },
      "typeVersion": 1
    },
    {
      "id": "b146ef1b-8e1d-4b9b-a14d-a633c471bc6d",
      "name": "Knoten-Notizen",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        3936,
        32
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Please, base on the title and the node json Write a sticky note that descirbe what the node do:\n\nTitle: {{ $json.name }} \n\nNode JSON:\n```json\n{{ JSON.stringify($json, null, 2) }}"
            },
            {
              "content": "=You are a technical writer specialized in n8n. You write clear, concise, and actionable sticky notes, including bullet points, gotchas, and configuration parameters if necessary.\n\nImportant: For simple nodes, with out or with a few parameters (e.g., Click Trigger, Merge, Write File, Read File) just write the title and short sticky notee.\n\nIf necessary, take in account the following context of the user about the workflow:  {{ $('Your Workflow Description').item.json.Context }}\n\nFor complex nodes (e.g., Code, AI Agent, …), please follow the structure below. Consider the node’s content (such as the prompt or code) to explain its purpose in a customized way.\n\n## 📁 Load Workflow \n\n### 🎯 Purpose\nLoad an existing workflow from a specified file path to facilitate automation and documentation efforts.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - File path to the workflow JSON.\n- **Outputs:** \n  - Loaded workflow data for further use in the automation process.\n\n### ⚙️ Key Fields to Configure\n- **File Selector:** \n  - Specify the path to the workflow JSON file, e.g., `/Your_path_to_file/workflow.json`.\n  \n### 📝 Tip / Validation\n- Ensure the file path is correct and accessible by n8n to avoid file not found errors.\n- Validate the JSON structure of the workflow file to prevent loading issues; malformed JSON will lead to errors during processing.\n"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "YOUR_ID_OPEN_AI",
          "name": "YOUR_NAME_OPEN_AI"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "eba8ad6b-ae3c-429f-9b6b-6d2a552f8bcf",
      "name": "Dokumentierten Workflow speichern",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        7120,
        416
      ],
      "parameters": {
        "options": {},
        "fileName": "/Your_path_to_file/workflow-with-sticky.json",
        "operation": "write"
      },
      "typeVersion": 1
    },
    {
      "id": "82ba3312-bb0f-4e3e-9a38-f57cc6473477",
      "name": "Notiz - Übersicht",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        496,
        -224
      ],
      "parameters": {
        "color": 3,
        "width": 600,
        "height": 1020,
        "content": "## 📝 Workflow Documentation Helper  \n\n### Goal:  \nThis workflow automates the documentation process for your n8n workflows, generating structured sticky notes quickly. By using various nodes, it transforms workflow components into a comprehensive draft that can be easily edited. This helps streamline the documentation, saving you time and effort while ensuring consistency.  \n\n### How it works:  \n- 🦸 **Trigger Manually** using the manual execution node.  \n- 🧩 **Parse Your Workflow** to extract necessary details.  \n- 🛠️ **Compile Sticky Notes** for each node using the OpenAI node.  \n- ⚙️ **Merge and Format** information into a cohesive layout with custom code.  \n- 📁 **Read and Write Files** to save and load the workflow documentation.  \n- 🔄 **Convert to JSON** for easy storage and future editing.  \n\n### Parameters to configure:  \n- 📄 Input file path for workflows to be documented.  \n- 🔠 Custom formatting styles for generated sticky notes.  \n- 💬 Node-specific settings within the OpenAI integration.  \n\n### Limitations / Gotchas:  \n- Ensure all node types are supported by the OpenAI and parsing logic.  \n- Manual intervention may be needed for highly complex workflows.  \n- Be cautious with file permissions for reading/writing documentation.\n\n### Expected result:  \nThe workflow will produce a neatly structured sticky note draft that includes an overview and specifics of each node, enhancing the documentation process and making it readily available for review.  \n\n\n### 📬 Need help or want to collaborate?  \nIf you have any questions, need help setting this up, or want to share feedback — feel free to reach out:  \n📩 **Luis.acosta@news2podcast.com** or DM me in Twitter [@guanchehacker](http://www.x.com/GuancheHacker)  \n\nIf you're looking to build something more advanced with documentation automation, let me know and I’ll figure out how I can help you!"
      },
      "typeVersion": 1
    },
    {
      "id": "9cdc2133-3378-472f-894f-1b1f0d54467a",
      "name": "Notiz - Dokumentierten Workflow speichern",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7072,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📝 Save Documented Workflow \n\n### 🎯 Purpose\nSave the current workflow as a JSON file to aid in documentation and provide a reusable format for future reference.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - None.\n- **Outputs:** \n  - A saved JSON file containing the documented workflow.\n\n### ⚙️ Key Fields to Configure\n- **File Name:** \n  - Specify the file path and name, e.g., `/Your_path_to_file/workflow-with-sticky.json`.\n\n### 📝 Tip / Validation\n- Ensure the specified file path is writable by n8n to prevent permission denied errors.\n- Remember to update the file name if you're saving different versions to avoid overwriting previous documentation."
      },
      "typeVersion": 1
    },
    {
      "id": "c387e2cd-2d54-4ff0-a64c-01aae4c00cca",
      "name": "Notiz - Workflow zusammenstellen",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6688,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🛠 Assemble Workflow\n\n### 🎯 Purpose\nFacilitates the organization and creation of a workflow by assembling nodes, setting positions, and including sticky notes for documentation.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - Array of node data including wrapping workflow, stickies, moves, and overview content.\n- **Outputs:** \n  - Assembled workflow JSON with organized nodes and corresponding sticky notes.\n\n### ⚙️ Key Fields to Configure\n- **Nodes:** \n  - Define nodes as part of the workflow.\n- **Stickies:** \n  - Specify additional sticky notes to include in the final JSON.\n- **Moves:** \n  - Provide mapping for node positions to rearrange nodes accordingly.\n- **Overview Content:** \n  - Custom overview text to be displayed in the designated sticky note.\n\n### 📝 Tip / Gotchas\n- Ensure the `wrappedWorkflow` is correctly specified; failure to provide it will throw an error.\n- The `stickyNote` nodes are removed before adding new stickies, so previous sticky notes won't remain in the final output.\n- When arranging nodes, valid positional data should be included in the `moves` to ensure nodes are correctly placed.\n- The overview sticky note is always positioned to the left, based on the calculated positions of other nodes—consider adjusting node placements accordingly."
      },
      "typeVersion": 1
    },
    {
      "id": "71bf95ee-6c6c-4352-8aff-1173efb8a4f3",
      "name": "Notiz - Merge2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6272,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🌀 Merge2 \n\n### 🎯 Purpose\nCombine multiple input streams into a single output stream based on their respective positions.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "053e226c-d51f-4284-bf3e-25be15b82879",
      "name": "Notiz - Layout-Blöcke RTL",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5488,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 Layout Blocks RTL \n\n### 🎯 Purpose\nGenerate sticky notes to document nodes in a workflow, positioning them right to left for improved readability and organization.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - A collection of nodes to be documented.\n- **Outputs:** \n  - Sticky notes with descriptions and positioning adjustments based on the nodes they correspond to.\n\n### ⚙️ Key Fields to Configure\n- **Node Width (NODE_W):** \n  - Set the visual width of an n8n node (default: 300).\n- **Node Height (NODE_H):** \n  - Set the visual height of an n8n node (default: 100).\n- **Sticky Note Width (STICKY_W):** \n  - Set the width of the sticky notes (default: 380).\n- **Sticky Note Height (STICKY_H):** \n  - Set the height of the sticky notes (default: 1020).\n- **Color (STICKY_COLOR):** \n  - Choose the color of the sticky notes (default: 7 for white).\n- **Gaps (GAP_X, GAP_Y, ROW_GAP):** \n  - Configure the horizontal and vertical gaps between blocks and rows.\n\n### 📝 Tip / Validation\n- Ensure that the nodes provided as input include the required properties, such as `type` and `position`.\n- Adjust **MAX_PER_ROW** to manage how many sticky notes appear in a single row; set to high values (e.g., 9999) to avoid wrapping.\n- Verify alignment tweaks (`CENTER_TWEAK_X`, `CENTER_TWEAK_Y`) if sticky notes do not align as expected."
      },
      "typeVersion": 1
    },
    {
      "id": "bda0a61e-4402-4b84-8c27-751d43d2832d",
      "name": "Notiz - Übersicht umbenennen",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5088,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🔄 Rename Overview \n\n### 🎯 Purpose\nThis node extracts the `content` from a JSON message and renames the output to `overviewContent`, aiding in the organization of workflow documentation.\n\n### 🔄 Inputs / Outputs\n- **Inputs:**\n  - A JSON object containing a `message` with the field `content`.\n- **Outputs:**\n  - A new JSON object where the extracted content is stored under the key `overviewContent`.\n\n### ⚙️ Key Fields to Configure\n- **jsCode:** \n  - JavaScript code that performs the extraction and renaming. The provided code is:\n    ```javascript\n    return [{ json: { overviewContent: $json.message.content } }];\n    ```\n\n### 📝 Tip / Validation\n- Ensure the input JSON contains a valid `message` object with a `content` field to prevent errors during processing.\n- Use this node to streamline workflow documentation by giving a clear and concise overview extracted from your data."
      },
      "typeVersion": 1
    },
    {
      "id": "23ab26ba-d6e0-41a3-af42-9b21d83498e3",
      "name": "Notiz - Merge",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4688,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🔗 Merge\n\n### 🎯 Purpose\nCombine multiple input data sets into a single output by aligning them according to their positions.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "48f061f4-aded-41ce-80cf-b6bbf1930105",
      "name": "Notiz - Inhalt abrufen",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4304,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 Get Content \n\n### 🎯 Purpose\nExtracts the `content` field from incoming messages, returning a structured array for further processing in the workflow.\n\n### 🔄 Inputs / Outputs\n- **Inputs:**\n  - An array of objects, each potentially containing a `message` with a `content` field.\n- **Outputs:**\n  - An array of objects with each object containing a `content` field.\n\n### ⚙️ Key Fields to Configure\n- **JavaScript Code (`jsCode`):**\n  - The custom JavaScript code that processes incoming data to extract the `content`. \n  - Code snippet:\n    ```javascript\n    return $input.all().map(it => ({\n      json: { content: it.json?.message?.content ?? '' }\n    }));\n    ```\n\n### 📝 Tip / Gotchas\n- The code uses optional chaining (`?.`) and a fallback (`?? ''`), meaning if a `content` field is missing, it will return an empty string instead of `undefined`.\n- Ensure that the incoming messages have the expected structure to avoid unexpected output.\n- Use this node at the point in your workflow where you need to aggregate or process message contents effectively."
      },
      "typeVersion": 1
    },
    {
      "id": "793599a3-6f14-4b2b-8558-c2fc4ff65938",
      "name": "Notiz - Knoten-Notizen",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3904,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📝 Node Sticky Notes \n\n### 🎯 Purpose\nThis node assists in generating draft sticky notes for documenting workflows automatically, allowing users to streamline their documentation process without starting from scratch.\n\n### 🔄 Inputs / Outputs\n- **Inputs:**\n  - Workflow title and JSON content for note drafting.\n- **Outputs:**\n  - Draft sticky note that summarizes the workflow, including critical information and parameters for user reference.\n\n### ⚙️ Key Fields to Configure\n- **Model ID:** \n  - Choose the AI model for generating the sticky notes (default: `gpt-4o-mini`).\n- **Messages:** \n  - Customize the initiation message for context-aware note generation.\n\n### 📝 Tip / Validation\n- Ensure that the workflow context is provided to enrich the relevance of the generated notes.\n- Double-check the parameters used in your node for accuracy to enhance the final output quality."
      },
      "typeVersion": 1
    },
    {
      "id": "26c685d5-63e3-46eb-9a3e-55fbcef5d4a8",
      "name": "Notiz - Elemente aufteilen",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3504,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 Split Out Items \n\n### 🎯 Purpose\nTransform a list of nodes into individual items for easier manipulation and processing in your workflow.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - A list of real nodes as an array from the previous step in the workflow.\n- **Outputs:** \n  - An array of JSON objects, each representing an individual node.\n\n### ⚙️ Key Fields to Configure\n- **JavaScript Code (jsCode):** \n  - This code extracts the nodes from the input array and returns them as individual JSON objects:\n    ```javascript\n    const arr = $json.realNodes || [];\n    return arr.map(n => ({ json: n }));\n    ```\n\n### 📝 Tip / Validation\n- Ensure that the input contains the `realNodes` key populated with an array. If it’s null or undefined, the output will be an empty array.\n- Test your workflow after implementing this node to confirm that items are split as expected."
      },
      "typeVersion": 1
    },
    {
      "id": "507cfb33-ae3c-4242-9836-0e9abcaa4396",
      "name": "Notiz - Gesamt-Notiz",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3104,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📝 Overall Sticky Note\n\n### 🎯 Purpose\nThe \"Overall Sticky Note\" node is designed to generate a comprehensive draft for documenting n8n workflows. It simplifies the documentation process by creating an initial sticky note that provides structure and essential information about the workflow’s functionality.\n\n### 🔄 Inputs / Outputs\n- **Inputs:**\n  - User context to tailor the note based on their specific workflow details.\n- **Outputs:**\n  - A polished sticky note formatted in Markdown, ready for further editing or direct use.\n\n### ⚙️ Key Fields to Configure\n- **Workflow Title:** \n  - The title of the workflow to be documented.\n- **User Context:** \n  - Information about the workflow provided by the user, which informs the content of the note.\n\n### 📝 Tip / Gotchas\n- Ensure that the user context is accurately defined for a more personalized and relevant sticky note.\n- The resulting content should be reviewed and edited for clarity and completeness, as the auto-generated note serves as a first draft.\n- Stick to the suggested word limit (220-250 words) to maintain readability.\n\n### 📬 Need help or want to collaborate?\nIf you have any questions, need help setting this up, or want to share feedback — feel free to reach out:  \n📩 **Luis.acosta@news2podcast.com** or DM me on Twitter [@guanchehacker](http://www.x.com/GuancheHacker).  \nIf you're looking to build something more advanced with audio and AI, let me know, and I’ll figure out how I can help you!"
      },
      "typeVersion": 1
    },
    {
      "id": "ea92af01-0f2b-455e-a045-2d5b44e1c8d8",
      "name": "Notiz - Workflow parsen",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2720,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 Parse Workflow \n\n### 🎯 Purpose\nParse and unwrap a given workflow JSON to create a structured output that excludes sticky notes and presents an overview of the real nodes.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - Workflow JSON that may have multiple formats, including nested structures.\n- **Outputs:** \n  - A structured workflow object with a summary of nodes for documentation purposes.\n\n### ⚙️ Key Fields to Configure\n- **JavaScript Code (jsCode):** \n  - The embedded script to unwrap and refine the workflow input, identifying nodes suitable for documentation.\n\n### 📝 Tip / Validation\n- Ensure the workflow JSON is provided in one of the expected formats to prevent errors:\n  - `{ workflow: { data: {...} }, nodes: [] }`\n  - `{ data: { nodes } }`\n  - `{ nodes }`\n- The node filters out sticky note types; consider any implications for your documentation strategy.\n- Monitor the output; a maximum of 50 nodes will be included in the summary for brevity."
      },
      "typeVersion": 1
    },
    {
      "id": "eedd22ce-0611-4652-9e89-38acd9dcbafb",
      "name": "Notiz - Konvertieren zu JSON",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2320,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 Convert to JSON \n\n### 🎯 Purpose\nConvert data from a specified source into JSON format to facilitate integration and data manipulation within workflows.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - Source data that needs to be converted into JSON.\n- **Outputs:** \n  - JSON-formatted data ready for further processing or use in automation tasks.\n\n### ⚙️ Key Fields to Configure\n- **Operation:** \n  - Set to `fromJson` to indicate the conversion operation being performed.\n- **Encoding:** \n  - Specify the character encoding to be used (default is `utf8`), ensuring proper handling of text data.\n\n### 📝 Tip / Validation\n- Double-check that the source data is valid and correctly formatted to avoid conversion issues.\n- Ensure that JSON output meets the expected structure for downstream nodes in the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "38927bc0-cf8a-4460-9577-f4bef1306039",
      "name": "Notiz - Workflow laden",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1920,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 Load Workflow \n\n### 🎯 Purpose\nLoad an existing workflow from a specified file path to facilitate automation and documentation efforts.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - File path to the workflow JSON.\n- **Outputs:** \n  - Loaded workflow data for further use in the automation process.\n\n### ⚙️ Key Fields to Configure\n- **File Selector:** \n  - Specify the path to the workflow JSON file, e.g., `/Your_path_to_file/workflow.json`.\n\n### 📝 Tip / Validation\n- Ensure the file path is correct and accessible by n8n to avoid file not found errors.\n- Validate the JSON structure of the workflow file to prevent loading issues; malformed JSON will lead to errors during processing."
      },
      "typeVersion": 1
    },
    {
      "id": "3964cc90-e5c1-4f30-8e9c-68b3f1f542f8",
      "name": "Notiz - Kontext",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📝 Your Workflow Description \n\n### 🎯 Purpose\nFacilitates the documentation of workflows by generating an initial draft for your sticky note, saving time and effort in the documentation process.\n\n### 🔄 Inputs / Outputs\n- **Inputs:** \n  - None specified.\n- **Outputs:** \n  - A first draft of the sticky note documenting the workflow.\n\n### ⚙️ Key Fields to Configure\n- **Assignments:**\n  - **Name:** \"Context\"\n  - **Value:** Provides a brief description of the workflow's purpose: \"This workflow is a helper for documenting workflows.\"\n\n### 📝 Tip / Validation\n- Utilize the generated sticky note as a foundation for more detailed documentation, customizing it as needed.\n- Review and refine the draft to ensure it meets your documentation standards before finalizing."
      },
      "typeVersion": 1
    },
    {
      "id": "c0a3b2ba-3a46-4dca-875a-e662c027e09f",
      "name": "Notiz - Bei Klick auf 'Workflow ausführen'",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🖱️ When clicking ‘Execute workflow’\n\n### 🎯 Purpose\nTrigger the execution of the current workflow manually through the n8n interface.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7144a58f-5ef0-47ea-815f-be22932dc846",
      "name": "Notiz - Merge1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5888,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🌀 Merge1 \n\n### 🎯 Purpose\nCombine data streams from multiple sources into a single output, facilitating data integration and streamlined processing.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "28a0415c-cb0f-40ca-b3b0-b6d224ea5a50",
      "name": "Ihre Workflow-Beschreibung",
      "type": "n8n-nodes-base.set",
      "position": [
        1568,
        432
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "b0b10570-9ced-46a0-9cec-1fce59d1a254",
              "name": "Context",
              "type": "string",
              "value": "This workflow is a helper for documenting workflows. It creates a first draft of your sticky note so you don’t have to start from scratch with the documentation."
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "2fb91050-d1cd-4412-b4ad-96ccb57f6aa3",
  "connections": {
    "b65b6172-b06b-4f81-bd4a-e9a9341b223e": {
      "main": [
        [
          {
            "node": "d0ece629-d110-401a-8134-0111af313714",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "91f0d27e-72f1-4c28-877d-2463725817c2": {
      "main": [
        [
          {
            "node": "76e63340-af6e-4952-9534-1abba43eb27d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "76e63340-af6e-4952-9534-1abba43eb27d": {
      "main": [
        [
          {
            "node": "e0f43eca-b076-446a-9c40-49efce250641",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "daf97d55-acb3-4303-a6f5-1f0bbca131f0": {
      "main": [
        [
          {
            "node": "b65b6172-b06b-4f81-bd4a-e9a9341b223e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b7a16515-7672-422b-b457-9ec117b38561": {
      "main": [
        [
          {
            "node": "a1c6f979-dca9-48ad-9fc8-0e944f99ec79",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d02cdb9c-6473-4331-99b5-3a3b20d92a77": {
      "main": [
        [
          {
            "node": "bae8a3be-0c25-4b22-9353-6ff77e534fd9",
            "type": "main",
            "index": 0
          },
          {
            "node": "d442ab6b-c8c1-4a57-8159-42ce93131537",
            "type": "main",
            "index": 0
          },
          {
            "node": "76e63340-af6e-4952-9534-1abba43eb27d",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "a1c6f979-dca9-48ad-9fc8-0e944f99ec79": {
      "main": [
        [
          {
            "node": "d02cdb9c-6473-4331-99b5-3a3b20d92a77",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3c74b066-0050-4776-8cf3-4893ca5c0aac": {
      "main": [
        [
          {
            "node": "91f0d27e-72f1-4c28-877d-2463725817c2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d442ab6b-c8c1-4a57-8159-42ce93131537": {
      "main": [
        [
          {
            "node": "b146ef1b-8e1d-4b9b-a14d-a633c471bc6d",
            "type": "main",
            "index": 0
          },
          {
            "node": "b65b6172-b06b-4f81-bd4a-e9a9341b223e",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "e0f43eca-b076-446a-9c40-49efce250641": {
      "main": [
        [
          {
            "node": "eba8ad6b-ae3c-429f-9b6b-6d2a552f8bcf",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b146ef1b-8e1d-4b9b-a14d-a633c471bc6d": {
      "main": [
        [
          {
            "node": "daf97d55-acb3-4303-a6f5-1f0bbca131f0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d0ece629-d110-401a-8134-0111af313714": {
      "main": [
        [
          {
            "node": "91f0d27e-72f1-4c28-877d-2463725817c2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "bae8a3be-0c25-4b22-9353-6ff77e534fd9": {
      "main": [
        [
          {
            "node": "3c74b066-0050-4776-8cf3-4893ca5c0aac",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "28a0415c-cb0f-40ca-b3b0-b6d224ea5a50": {
      "main": [
        [
          {
            "node": "b7a16515-7672-422b-b457-9ec117b38561",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2d5d8cee-5333-44d7-a637-9d8401d46b10": {
      "main": [
        [
          {
            "node": "28a0415c-cb0f-40ca-b3b0-b6d224ea5a50",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Experte - KI-Zusammenfassung, Multimodales KI

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Experte
Anzahl der Nodes33
Kategorie2
Node-Typen8
Schwierigkeitsbeschreibung

Für fortgeschrittene Benutzer, komplexe Workflows mit 16+ Nodes

Autor
Luis Acosta

Luis Acosta

@podcast-tools

I'm passionate about people and technology, with a hands-on and creative approach. Lately, my main focus has shifted towards process automation using artificial intelligence and the creation of meaningful content. I enjoy exploring how emerging technologies can simplify workflows, enhance productivity, and open new creative possibilities.

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34