8
n8n 中文网amn8n.com

会议记录通知

高级

这是一个AI Summarization, Multimodal AI领域的自动化工作流,包含 16 个节点。主要使用 Set, Code, Slack, DateTime, SplitOut 等节点。 使用Gemini AI和Slack通知自动化会议笔记摘要

前置要求
  • Slack Bot Token 或 Webhook URL
  • 可能需要目标 API 的认证凭证
  • Google Gemini API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "6nKbFj90W1K6L90c",
  "meta": {
    "instanceId": "bbc3fa3cd7d64d8ff0c4877d98dee68ce7dadacc5e089546680c915b3e5a212b",
    "templateCredsSetupCompleted": true
  },
  "name": "会议记录通知",
  "tags": [],
  "nodes": [
    {
      "id": "173f23e7-fbd7-4dd1-acbe-4784be565a22",
      "name": "计划触发器",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -464,
        -288
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "98ee19dc-ccee-430a-8186-37337fa71619",
      "name": "AI转换",
      "type": "n8n-nodes-base.aiTransform",
      "position": [
        656,
        -288
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst today = new Date();\nconst oneWeekAgo = new Date();\noneWeekAgo.setDate(today.getDate() - 7);\n\nconst filteredItems = items.filter((item) => {\n  const itemDate = new Date(item?.json?.formattedDate);\n  return itemDate >= oneWeekAgo && itemDate <= today;\n});\n\nreturn filteredItems;\n",
        "instructions": "Filter the formatted Date in the past week upto today",
        "codeGeneratedForPrompt": "Filter the formatted Date in the past week upto today"
      },
      "typeVersion": 1
    },
    {
      "id": "b08111fc-f718-4009-aed8-4746d204f801",
      "name": "Google Gemini聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        888,
        -64
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "F27E5eCnDR6vZBbg",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6fac9ef2-7876-4f71-a4aa-32aed028bf49",
      "name": "发送消息",
      "type": "n8n-nodes-base.slack",
      "position": [
        1456,
        -288
      ],
      "webhookId": "cb7cf410-be03-47eb-a39f-08e04c4d1021",
      "parameters": {
        "text": "test",
        "select": "channel",
        "blocksUi": "={{ '{ \"blocks\": ' + JSON.stringify($json.blocks) + ' }' }}",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09CV2VC877",
          "cachedResultName": "meeting-notes"
        },
        "messageType": "block",
        "otherOptions": {
          "includeLinkToWorkflow": false
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "id": "XBHT6VDVo1vwvFz2",
          "name": "Slack account"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.3
    },
    {
      "id": "fd642df4-da0e-43b7-b6bf-4cd9bb80f9d6",
      "name": "摘要",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        1016,
        -64
      ],
      "parameters": {
        "url": "=https://api.meetgeek.ai/v1/meetings/{{ $json.extract_meeting_id }}/summary/",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "xTo22iPOKW4a71o3",
          "name": "Bearer Auth account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "daf0670b-e2d7-446d-9d63-32952e99d55b",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -312,
        -432
      ],
      "parameters": {
        "width": 464,
        "height": 304,
        "content": "## 从记录员获取会议数据"
      },
      "typeVersion": 1
    },
    {
      "id": "b6d8b4ef-1dbb-410a-a656-d6cb77e3cf64",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        392,
        -480
      ],
      "parameters": {
        "width": 400,
        "height": 352,
        "content": "## 格式化日期并重构数据"
      },
      "typeVersion": 1
    },
    {
      "id": "d5ceabf5-c4c4-4d40-8cd9-719537478abc",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        -464
      ],
      "parameters": {
        "width": 320,
        "height": 544,
        "content": "## 从会议记录中提取摘要和行动项"
      },
      "typeVersion": 1
    },
    {
      "id": "2248164e-c74c-43cf-ba80-2c314969310b",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        880,
        -288
      ],
      "parameters": {
        "text": "=# 📝 Meeting Notes Summarizer with Action Items\n\nYou are an AI assistant that **summarizes meeting notes** and **extracts clear action items**.\n\n---\n\n## 🔹 Input Data\n- **meeting_id**: `{{ $json.extract_meeting_id }}`\n- **title**: `{{ $json.title }}`\n\n---\n\n## 🔹 Task Instructions\n1. Call the **Meeting Note Summary API** using the **HTTP Request node**, passing `meeting_id` as a path parameter.  \n2. For each API response, generate a summary for the corresponding meeting.  \n3. Provide a **concise summary** in **3–5 bullet points**.  \n4. Extract a structured **Action Items** list with:\n   - **Task description**  \n   - **Responsible person** (if mentioned, otherwise `Unassigned`)  \n   - **Deadline** (if mentioned, otherwise `No deadline`)  \n5. Ensure each meeting summary **includes the meeting title** (`{{ $json.title }}`).  \n6. If the meeting notes are **empty or missing**, still return the JSON format but use:\n   - `\"summary\": [\"No summary available\"]`  \n   - `\"action_items\": []`  \n\n---\n\n## 🔹 Output Format (JSON)\n```json\n{\n  \"title\": \"{{ $json.title }}\",\n  \"summary\": [\n    \"point 1\",\n    \"point 2\",\n    \"point 3\"\n  ],\n  \"action_items\": [\n    {\n      \"task\": \"Task description\",\n      \"owner\": \"Person name / Unassigned\",\n      \"deadline\": \"Date / No deadline\"\n    }\n  ]\n}\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "f20b3135-24b3-4d49-bceb-1c10f32ac9bf",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1208,
        -416
      ],
      "parameters": {
        "width": 368,
        "height": 288,
        "content": "## 设置 Slack 通知"
      },
      "typeVersion": 1
    },
    {
      "id": "4086c066-d09c-47f0-b19e-f8b56fcf0d8a",
      "name": "为会议 ID 添加自定义名称",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        -288
      ],
      "parameters": {
        "include": "except",
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f26be114-60b9-4017-ada9-db48cb79968a",
              "name": "extract_meeting_id",
              "type": "string",
              "value": "={{ $json.meeting_id }}"
            }
          ]
        },
        "excludeFields": "meeting_id",
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "06de46ec-90b5-48a7-95e8-52e1899a3d81",
      "name": "拆分会议",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -16,
        -288
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "=meetings"
      },
      "typeVersion": 1
    },
    {
      "id": "46c0edee-9d49-4278-bf55-0244d6085290",
      "name": "获取会议列表",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -240,
        -288
      ],
      "parameters": {
        "url": "https://api.meetgeek.ai/v1/meetings/",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "xTo22iPOKW4a71o3",
          "name": "Bearer Auth account"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.2
    },
    {
      "id": "e66baa91-7c07-4c23-93e0-cb2cea49ccd9",
      "name": "格式化日期",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        432,
        -288
      ],
      "parameters": {
        "date": "={{ $json.timestamp_start_utc }}",
        "format": "yyyy-MM-dd",
        "options": {
          "includeInputFields": true
        },
        "operation": "formatDate"
      },
      "typeVersion": 2
    },
    {
      "id": "3e1feb23-bf70-4e23-8ce2-ec0c752fe9f1",
      "name": "重构为 Slack 块",
      "type": "n8n-nodes-base.code",
      "position": [
        1232,
        -288
      ],
      "parameters": {
        "jsCode": "// Input: array of note-taker outputs\nconst notes = $input.all().map(item => item.json);\n\n// Slack blocks array\nlet blocks = [];\n\nnotes.forEach((note, index) => {\n  // Clean and parse JSON inside code block\n  const cleaned = note.output.replace(/```json|```/g, '').trim();\n  let parsed;\n\n  try {\n    parsed = JSON.parse(cleaned);\n  } catch (err) {\n    parsed = { title: `Meeting ${index + 1}`, summary: [\"Could not parse notes\"], action_items: [] };\n  }\n\n  // Meeting header with title\n  blocks.push({\n    type: \"header\",\n    text: {\n      type: \"plain_text\",\n      text: parsed.title || `Meeting ${index + 1}`\n    }\n  });\n\n  // Summary section\n  if (parsed.summary && parsed.summary.length > 0) {\n    blocks.push({\n      type: \"section\",\n      text: {\n        type: \"mrkdwn\",\n        text: \"*Summary:*\\n\" + parsed.summary.map(s => `• ${s}`).join(\"\\n\")\n      }\n    });\n  }\n\n  // Action items section\n  if (parsed.action_items && parsed.action_items.length > 0) {\n    blocks.push({\n      type: \"section\",\n      text: {\n        type: \"mrkdwn\",\n        text: \"*Action Items:*\"\n      }\n    });\n\n    parsed.action_items.forEach(item => {\n      blocks.push({\n        type: \"section\",\n        text: {\n          type: \"mrkdwn\",\n          text: `• *Task:* ${item.task || \"N/A\"}\\n   *Owner:* ${item.owner || \"Unassigned\"}\\n   *Deadline:* ${item.deadline || \"No deadline\"}`\n        }\n      });\n    });\n  } else {\n    // If no action items\n    blocks.push({\n      type: \"section\",\n      text: {\n        type: \"mrkdwn\",\n        text: \"_No action items available_\"\n      }\n    });\n  }\n\n  // Divider\n  blocks.push({ type: \"divider\" });\n});\n\nreturn { blocks };\n"
      },
      "executeOnce": true,
      "typeVersion": 2
    },
    {
      "id": "97e0f0e6-6745-4b45-a019-c89e76de9ec5",
      "name": "便利贴5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -1008
      ],
      "parameters": {
        "width": 512,
        "height": 544,
        "content": "## 📌 会议记录摘要生成器与 Slack 通知器"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "bdd7ca4b-f73e-491e-b697-0e419879a2b8",
  "connections": {
    "summary": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Restructure to slack block",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format date": {
      "main": [
        [
          {
            "node": "AI Transform",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Transform": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split meetings": {
      "main": [
        [
          {
            "node": "Add custom name for meeting id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get meetings list",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get meetings list": {
      "main": [
        [
          {
            "node": "Split meetings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Restructure to slack block": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add custom name for meeting id": {
      "main": [
        [
          {
            "node": "Format date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - AI 摘要总结, 多模态 AI

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量16
分类2
节点类型12
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Sayone Technologies

Sayone Technologies

@sayonetech

SayOne Technologies is a digital transformation and IT services company headquartered in India, with a strong focus on web, mobile, and AI-driven solutions for the retail tech space. With over a decade of experience, SayOne partners with global businesses to build scalable applications, optimize inventory and operations using next-gen AI, and deliver customer-centric digital products.

外部链接
在 n8n.io 查看

分享此工作流