8
n8n 中文网amn8n.com

使用Gemini、Slack和Notion从新闻简报创建AI情报摘要

高级

这是一个Miscellaneous, AI Summarization, Multimodal AI领域的自动化工作流,包含 19 个节点。主要使用 Set, Code, Gmail, Slack, Filter 等节点。 使用Gemini、Slack和Notion从新闻简报创建AI情报摘要

前置要求
  • Google 账号和 Gmail API 凭证
  • Slack Bot Token 或 Webhook URL
  • Notion API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "2b4a3d81eafa60e4b2dfa202fdf88e491b785e2a2a6ca005b137d831a6faa7c0",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "2755b9eb-352a-447f-9960-d34fb4905045",
      "name": "获取带标签的新闻简报",
      "type": "n8n-nodes-base.gmail",
      "notes": "Fetches emails with your specified label from the last 24 hours",
      "position": [
        288,
        384
      ],
      "webhookId": "bf88d99c-1bea-4f19-9ef5-3c0a59eb862c",
      "parameters": {
        "limit": 20,
        "simple": false,
        "filters": {
          "labelIds": [
            "YOUR_GMAIL_LABEL_ID"
          ],
          "receivedAfter": "={{ $today.minus(1, 'days') }}"
        },
        "options": {},
        "operation": "getAll"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "yvJI2wRBiA9DGTL4",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "b53fe8a3-8cc6-4343-ad86-6d64ca6b4e72",
      "name": "合并所有新闻简报",
      "type": "n8n-nodes-base.aggregate",
      "notes": "Combines all newsletter emails into a single item for AI processing",
      "position": [
        736,
        384
      ],
      "parameters": {
        "include": "specifiedFields",
        "options": {},
        "aggregate": "aggregateAllItemData",
        "fieldsToInclude": "headers.from, subject, textAsHtml",
        "destinationFieldName": "newsletter"
      },
      "typeVersion": 1
    },
    {
      "id": "0e35800c-542d-49b5-80eb-2900fb2bb6b3",
      "name": "AI 新闻简报分析师",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "notes": "AI agent that analyzes newsletters and generates insights based on your configuration",
      "position": [
        1024,
        384
      ],
      "parameters": {
        "text": "=Analyze today's newsletters and create a comprehensive brief for {{ $('Configuration').item.json.recipient_name }}.\n\n## Context\n{{ $('Configuration').item.json.business_context }}\n\n## Task 1: Executive Summary\nFrom today's newsletters, identify 3-5 developments that matter for {{ $('Configuration').item.json.target_audience }}. For each:\n\n**[Development Title]**\n- TL;DR: [2-3 sentences explaining what this is about]\n- Why this matters: [1-2 sentences on real business impact for your audience]\n- Implementation reality: [What it would actually take to adopt this]\n- Source: [Newsletter sender name]\n\nOnly include developments that pass this test: {{ $('Configuration').item.json.relevance_filter }}\n\nAs part of the executive summary, include a short tl;dr that should be maximum of 1-2 sentences summarizing all the developments you extract.\n\n## Task 2: Content-Inspiring Questions\nGenerate 3-4 questions that could become {{ $('Configuration').item.json.content_platforms }} content. Each question should:\n- Connect to real operational challenges\n- Bridge technical capability and business reality\n- Feel non-obvious but highly relevant\n\nFormat:\n**Question:** [Concise, thought-provoking question]\n**Context:** [1 sentence on why this question matters now, referencing specific newsletter content]\n**Relevant Content Pillar:** [name of the content pillar this relates to]\n\n## Task 3: Hidden Patterns\nBrief note on any patterns across multiple newsletters that suggest an emerging theme your audience should track.\n\nRemember: Filter aggressively. If something is just \"interesting\" but not actionable for your specific audience, exclude it. Focus on signal, not noise.\n\n## Content to analyze\n\nHere are the newsletters and their content: {{ \n$json.newsletter.map(item => \n  `Subject: \"${item.subject}\"\nFull content follows:\n${item.textAsHtml}`\n).join('\\\\n\\\\n==========\\\\n\\\\n')\n}}",
        "options": {
          "systemMessage": "=You are an AI intelligence analyst for {{ $('Configuration').item.json.company_name }}, helping to filter the daily flood of newsletters through a specific operational lens.\n\n## Core Context\n\n### Who You Serve\n{{ $('Configuration').item.json.target_audience_description }}\n\n### Your Unique Perspective\nYou view information through three interconnected lenses:\n1. **Operational Reality**: How does this actually work in a running business?\n2. **Technical Feasibility**: What's required to implement this at scale?\n3. **Human Dynamics**: How will teams actually adopt and use this?\n\n### Content Focus Areas\n{{ $('Configuration').item.json.content_pillars }}\n\n## Processing Framework\n\nWhen analyzing newsletters and updates:\n\n### Relevance Filter\nINCLUDE information about:\n- New capabilities that could change how operations work (not just make them faster)\n- Implementation patterns from companies in the {{ $('Configuration').item.json.company_size_range }} range\n- Tools or frameworks that bridge technical capability and business operations\n- Real implementation case studies (not just press releases)\n- {{ $('Configuration').item.json.additional_include_criteria }}\n\nEXCLUDE information about:\n- Pure research advances without clear operational application\n- Consumer products without business applications\n- Generic tool updates that are just feature additions\n- {{ $('Configuration').item.json.additional_exclude_criteria }}\n\n### Analysis Depth\nFor each relevant item, consider:\n- What operational problem does this actually solve?\n- What would implementing this require (people, process, technology)?\n- How does this connect to what {{ $('Configuration').item.json.target_audience }} are already doing?\n\nIf needed, and really only in cases where you feel it's required, you can use the Perplexity tool to find additional information. Be efficient in your use.\n\n## Output Requirements\n\n### Executive Summary Structure\n- Lead with operational impact, not technical innovation\n- Connect developments to specific challenges your audience faces\n- Use concrete examples over abstract possibilities\n- Maintain calm clarity - no breathless hype\n- Maximum 3-5 key developments per day (quality over quantity)\n- Keep language free of jargon and accessible\n- Go for conciseness while including essential information\n\n### Question Generation Philosophy\nCreate questions that:\n- Bridge the gap between potential and operational reality\n- Challenge conventional thinking\n- Explore practical implementation tensions\n- Address the \"how\" after others cover the \"what\"\n- Connect capabilities to business outcomes\n- Use clear, accessible language without corporate jargon\n\nQuestions should feel like they come from someone who has actually worked in this space, not someone theorizing about it.\n\nRemember: Your audience needs insights that are worth their precious mental space during commutes and reflection time."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "retryOnFail": true,
      "typeVersion": 2.2
    },
    {
      "id": "c1986c22-9219-4dd0-8c59-88d618f06065",
      "name": "每日早晨触发器",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "Runs daily at 8am UTC - adjust timezone as needed",
      "position": [
        -176,
        384
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "111aea15-2a77-4326-b132-58d6ab8d054a",
      "name": "过滤空结果",
      "type": "n8n-nodes-base.filter",
      "notes": "Only proceeds if emails were found",
      "position": [
        512,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9fda51d9-feb0-464d-9ab7-a8d32b4654a3",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3da6d119-88a4-49ad-9af1-c82e6dc3deb2",
      "name": "Slack 格式化",
      "type": "n8n-nodes-base.code",
      "notes": "Converts AI analysis to rich Slack Block Kit format",
      "position": [
        1424,
        288
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Format the structured AI analysis for Slack Block Kit\nconst data = $input.item.json;\nconst analysis = Array.isArray(data) ? data[0].output : (data.output || data);\nconst config = $('Configuration').item.json;\n\n// Helper function to format date nicely\nconst formatDate = (dateStr) => {\n  const date = dateStr ? new Date(dateStr) : new Date();\n  return date.toLocaleDateString('en-US', { \n    weekday: 'long', \n    year: 'numeric', \n    month: 'long', \n    day: 'numeric' \n  });\n};\n\n// Helper to truncate text to avoid Slack's block limits\nconst truncateText = (text, maxLength = 3000) => {\n  if (text && text.length > maxLength) {\n    return text.substring(0, maxLength - 3) + '...';\n  }\n  return text || '';\n};\n\n// Use the TLDR from the AI agent or create a fallback\nlet tldrSummary = \"\";\nif (analysis.executive_summary?.tldr) {\n  tldrSummary = analysis.executive_summary.tldr;\n} else if (analysis.executive_summary?.developments && analysis.executive_summary.developments.length > 0) {\n  const devCount = analysis.executive_summary.developments.length;\n  const topics = analysis.executive_summary.developments\n    .slice(0, 2)\n    .map(dev => dev.title.split(' ').slice(0, 4).join(' '))\n    .join(\" and \");\n  tldrSummary = `${devCount} key developments today: ${topics}. Focus on signal over noise.`;\n} else {\n  tldrSummary = \"No developments met our strict relevance criteria today. This is valuable signal - not every day brings operationally relevant news.\";\n}\n\n// Build the blocks array\nlet blocks = [\n  {\n    \"type\": \"header\",\n    \"text\": {\n      \"type\": \"plain_text\",\n      \"text\": `📰 | ${config.brief_title || 'Intelligence Brief'}`\n    }\n  },\n  {\n    \"type\": \"context\",\n    \"elements\": [\n      {\n        \"text\": `📅 ${formatDate(analysis.metadata?.date_analyzed)} | 👤 ${config.recipient_name || 'Team'}`,\n        \"type\": \"mrkdwn\"\n      }\n    ]\n  },\n  {\n    \"type\": \"divider\"\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": \"📢 | *TL;DR*\"\n    }\n  },\n  {\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": truncateText(tldrSummary, 3000)\n    }\n  },\n  {\n    \"type\": \"divider\"\n  }\n];\n\n// Add news summary if we have developments\nif (analysis.executive_summary?.developments && analysis.executive_summary.developments.length > 0) {\n  blocks.push({\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": \"📰 | *KEY DEVELOPMENTS*\"\n    }\n  });\n\n  // Build rich text elements for each development\n  let richTextElements = [];\n  \n  analysis.executive_summary.developments.forEach((dev, index) => {\n    // Add title with source\n    richTextElements.push({\n      \"type\": \"rich_text_section\",\n      \"elements\": [\n        {\n          \"type\": \"text\",\n          \"text\": `${dev.title}`,\n          \"style\": {\n            \"code\": true\n          }\n        },\n        {\n          \"type\": \"text\",\n          \"text\": ` - ${dev.source || 'Newsletter'}`,\n          \"style\": {\n            \"italic\": true\n          }\n        },\n        {\n          \"type\": \"text\",\n          \"text\": \"\\n\"\n        }\n      ]\n    });\n    \n    // Add content in quote block \n    richTextElements.push({\n      \"type\": \"rich_text_quote\",\n      \"elements\": [\n        {\n          \"type\": \"text\",\n          \"text\": \"TL;DR:\",\n          \"style\": {\n            \"bold\": true\n          }\n        },\n        {\n          \"type\": \"text\",\n          \"text\": `\\n${truncateText(dev.tldr_development, 500)}\\n\\n`\n        },\n        {\n          \"type\": \"text\",\n          \"text\": \"Why it matters:\",\n          \"style\": {\n            \"bold\": true\n          }\n        },\n        {\n          \"type\": \"text\",\n          \"text\": `\\n${truncateText(dev.operational_impact, 500)}\\n\\n`\n        },\n        {\n          \"type\": \"text\",\n          \"text\": \"Implementation Reality:\",\n          \"style\": {\n            \"bold\": true\n          }\n        },\n        {\n          \"type\": \"text\",\n          \"text\": `\\n${truncateText(dev.implementation_reality, 500)}\\n\\n`\n        }\n      ]\n    });\n    \n    // Add separator between items (except after last item)\n    if (index < analysis.executive_summary.developments.length - 1) {\n      richTextElements.push({\n        \"type\": \"rich_text_section\",\n        \"elements\": [\n          {\n            \"type\": \"text\",\n            \"text\": \"\\n\"\n          }\n        ]\n      });\n    }\n  });\n  \n  richTextElements.push({\n    \"type\": \"rich_text_section\",\n    \"elements\": []\n  });\n  \n  blocks.push({\n    \"type\": \"rich_text\",\n    \"elements\": richTextElements\n  });\n  \n  blocks.push({\n    \"type\": \"divider\"\n  });\n}\n\n// Add content questions if we have them\nif (analysis.content_questions && analysis.content_questions.length > 0) {\n  blocks.push({\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": \"🤔 | *CONTENT INSPIRATION*\"\n    }\n  });\n  \n  let questionElements = [];\n  \n  analysis.content_questions.forEach((q, index) => {\n    questionElements.push({\n      \"type\": \"rich_text_quote\",\n      \"elements\": [\n        {\n          \"type\": \"text\",\n          \"text\": `\"${truncateText(q.question, 500)}\"\\n\\n`,\n          \"style\": {\n            \"bold\": true\n          }\n        },\n        {\n          \"type\": \"text\",\n          \"text\": truncateText(q.context, 500),\n          \"style\": {\n            \"italic\": true\n          }\n        }\n      ]\n    });\n    \n    if (q.content_pillar) {\n      questionElements.push({\n        \"type\": \"rich_text_section\",\n        \"elements\": [\n          {\n            \"type\": \"text\",\n            \"text\": `📁 Content Pillar: ${q.content_pillar}`,\n            \"style\": {\n              \"italic\": true\n            }\n          }\n        ]\n      });\n    }\n    \n    if (index < analysis.content_questions.length - 1) {\n      questionElements.push({\n        \"type\": \"rich_text_section\",\n        \"elements\": [\n          {\n            \"type\": \"text\",\n            \"text\": \"\\n\"\n          }\n        ]\n      });\n    }\n  });\n  \n  questionElements.push({\n    \"type\": \"rich_text_section\",\n    \"elements\": []\n  });\n  \n  blocks.push({\n    \"type\": \"rich_text\",\n    \"elements\": questionElements\n  });\n  \n  blocks.push({\n    \"type\": \"divider\"\n  });\n}\n\n// Add hidden patterns if present\nif (analysis.hidden_patterns?.pattern) {\n  blocks.push({\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": \"🔍 | *EMERGING PATTERN*\"\n    }\n  });\n  \n  blocks.push({\n    \"type\": \"section\",\n    \"text\": {\n      \"type\": \"mrkdwn\",\n      \"text\": `_${truncateText(analysis.hidden_patterns.pattern, 3000)}_`\n    }\n  });\n  \n  if (analysis.hidden_patterns.relevance) {\n    blocks.push({\n      \"type\": \"context\",\n      \"elements\": [\n        {\n          \"type\": \"mrkdwn\",\n          \"text\": `*Relevance:* ${truncateText(analysis.hidden_patterns.relevance, 2900)}`\n        }\n      ]\n    });\n  }\n  \n  blocks.push({\n    \"type\": \"divider\"\n  });\n}\n\n// Add footer\nblocks.push({\n  \"type\": \"context\",\n  \"elements\": [\n    {\n      \"type\": \"mrkdwn\",\n      \"text\": `_${config.footer_message || 'Focus on signal, not noise. Make informed decisions.'}_`\n    }\n  ]\n});\n\n// Add stats if available\nif (analysis.metadata) {\n  let statsText = \"\";\n  \n  if (analysis.metadata.total_developments) {\n    statsText += `📊 ${analysis.metadata.total_developments} developments analyzed`;\n    \n    if (analysis.executive_summary?.developments?.length) {\n      statsText += `, ${analysis.executive_summary.developments.length} passed relevance threshold`;\n    }\n  }\n  \n  if (analysis.metadata.newsletter_count) {\n    if (statsText) statsText += \" | \";\n    statsText += `📧 ${analysis.metadata.newsletter_count} newsletters processed`;\n  }\n  \n  if (statsText) {\n    blocks.push({\n      \"type\": \"context\",\n      \"elements\": [\n        {\n          \"type\": \"mrkdwn\",\n          \"text\": `_${statsText}_`\n        }\n      ]\n    });\n  }\n}\n\nconst blockKitJson = {\n  \"blocks\": blocks\n};\n\nreturn {\n  blocksUi: JSON.stringify(blockKitJson),\n  rawBlocks: blocks,\n  blockKitObject: blockKitJson,\n  hasContent: (analysis.executive_summary?.developments?.length > 0) || \n              (analysis.content_questions?.length > 0) || \n              analysis.hidden_patterns?.pattern,\n  developmentCount: analysis.executive_summary?.developments?.length || 0,\n  questionCount: analysis.content_questions?.length || 0,\n  metadata: analysis.metadata\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "76e03f5c-553a-4b15-9fc4-171d45300c60",
      "name": "发送至 Slack",
      "type": "n8n-nodes-base.slack",
      "notes": "Sends formatted brief to your Slack channel",
      "position": [
        1648,
        288
      ],
      "webhookId": "0ff2b8f9-344a-4f43-9fd7-b8149a5d5ca9",
      "parameters": {
        "text": "Daily Newsletter Brief",
        "select": "channel",
        "blocksUi": "={{ $json.blocksUi }}",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_SLACK_CHANNEL_ID"
        },
        "messageType": "block",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "id": "I1AdBji1W6jc0rm7",
          "name": "Slack account"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "314f38f4-0663-417a-a811-c3ab59df9186",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "notes": "Primary AI model for newsletter analysis",
      "position": [
        880,
        624
      ],
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "id": "bA9Ec45f0B7Bpa10",
          "name": "OpenRouter"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "bfbc76fb-5ca3-4801-8b1a-1534bf45e7c1",
      "name": "输出解析模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "notes": "Model for structured output parsing",
      "position": [
        1296,
        816
      ],
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "id": "bA9Ec45f0B7Bpa10",
          "name": "OpenRouter"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0d990fe0-495c-4967-b53c-480f84f301b2",
      "name": "拆分问题",
      "type": "n8n-nodes-base.splitOut",
      "notes": "Separates content questions for individual processing",
      "position": [
        1424,
        480
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.content_questions"
      },
      "typeVersion": 1
    },
    {
      "id": "bd52e7e9-c35e-4e8e-bf50-d6945bb02891",
      "name": "保存问题至 Notion",
      "type": "n8n-nodes-base.notion",
      "notes": "Creates Notion pages for each content question (optional)",
      "position": [
        1648,
        480
      ],
      "parameters": {
        "title": "={{ $json.question }}",
        "blockUi": {
          "blockValues": [
            {
              "text": {
                "text": [
                  {
                    "text": "={{ $json.context }}",
                    "annotationUi": {
                      "italic": true
                    }
                  }
                ]
              },
              "richText": true
            },
            {
              "textContent": "=Content Pillar: {{ $json.content_pillar }}"
            },
            {
              "textContent": "=Generated from newsletter analysis on {{ $today.format('MM-dd-yyyy') }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_NOTION_DATABASE_ID"
        }
      },
      "credentials": {
        "notionApi": {
          "id": "toqwsLC7U4Kur83F",
          "name": "Notion"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c4553d6c-3b7a-4018-b91d-fce030c48590",
      "name": "Perplexity 研究工具",
      "type": "n8n-nodes-base.perplexityTool",
      "notes": "Optional tool for the AI agent to gather additional context",
      "position": [
        1168,
        608
      ],
      "parameters": {
        "model": "sonar-pro",
        "options": {},
        "messages": {
          "message": [
            {
              "content": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('message0_Text', ``, 'string') }}"
            }
          ]
        },
        "requestOptions": {}
      },
      "credentials": {
        "perplexityApi": {
          "id": "Lp8s8pOa5dCRCcUm",
          "name": "Perplexity account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "88953eaf-035a-4c44-8d17-98432b4a5a8f",
      "name": "多表:您可以连接多个表以实现有组织的数据结构",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "notes": "Ensures AI output follows the expected JSON structure",
      "position": [
        1296,
        656
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"executive_summary\": {\n    \"tldr\": \"Quick summary across all developments\",\n    \"developments\": [\n      {\n        \"title\": \"Development Title Here\",\n        \"operational_impact\": \"Why this matters operationally\",\n        \"implementation_reality\": \"What it would actually take to adopt this\",\n        \"tldr_development\": \"TL;DR of the development\",\n        \"source\": \"Newsletter source name\"\n      }\n    ]\n  },\n  \"content_questions\": [\n    {\n      \"question\": \"The thought-provoking question itself\",\n      \"context\": \"Why this question matters now, with newsletter reference\",\n      \"content_pillar\": \"Relevant content pillar\"\n    }\n  ],\n  \"hidden_patterns\": {\n    \"pattern\": \"Description of emerging theme across newsletters\",\n    \"relevance\": \"Why this pattern matters for the audience\"\n  },\n  \"metadata\": {\n    \"date_analyzed\": \"2024-01-20\",\n    \"newsletter_count\": 2,\n    \"total_developments\": 5\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "fb930565-a81e-40cd-96d6-340b6bf64138",
      "name": "对话记忆",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "notes": "Maintains context across multiple AI interactions",
      "position": [
        1024,
        704
      ],
      "parameters": {
        "contextWindowLength": 7
      },
      "typeVersion": 1.3
    },
    {
      "id": "68c99298-c391-4026-b589-8f09028c5966",
      "name": "配置",
      "type": "n8n-nodes-base.set",
      "notes": "📝 CUSTOMIZE THESE VALUES for your business and use case",
      "position": [
        64,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "2aa9dd22-9fe1-46a4-9927-7b8a997c30af",
              "name": "recipient_name",
              "type": "string",
              "value": "Who the brief is for (e.g., \"Tech Team\")"
            },
            {
              "id": "f2440cb8-6076-4dac-831b-c38c489fbff8",
              "name": "company_name",
              "type": "string",
              "value": "Your company name"
            },
            {
              "id": "550c6854-c3c2-4aec-8c89-3e4d11dc5f7e",
              "name": "business_context",
              "type": "string",
              "value": "What your company does/goals"
            },
            {
              "id": "30be18e1-0242-45f7-a1da-8b20b35e7c35",
              "name": "target_audience",
              "type": "string",
              "value": "Who you're analyzing for (e.g., \"product managers and engineering leaders\")"
            },
            {
              "id": "39659801-9da6-4259-b07c-9d19b4bdac62",
              "name": "target_audience_description",
              "type": "string",
              "value": "Detailed description of your audience"
            },
            {
              "id": "91841974-0e77-4068-8568-4e762269e43e",
              "name": "company_size_range",
              "type": "string",
              "value": "Size of companies you focus on (e.g., \"50-200 employee\")"
            },
            {
              "id": "a4a9ad55-1817-46da-a787-4892a94f3787",
              "name": "relevance_filter",
              "type": "string",
              "value": "The key question to filter relevant news"
            },
            {
              "id": "4f3237ae-a44f-4594-ac3d-27d2488c0e48",
              "name": "content_platforms",
              "type": "string",
              "value": "Where you'll use insights (e.g., \"LinkedIn posts, internal updates\")"
            },
            {
              "id": "def78ff4-6ef5-4eeb-9c86-7f10a6d2aa0a",
              "name": "content_pillars",
              "type": "string",
              "value": "Your main content focus areas (3 pillars)"
            },
            {
              "id": "14fd66df-9969-4228-a68f-20e34b372e3f",
              "name": "additional_include_criteria",
              "type": "string",
              "value": "Extra things to include in analysis"
            },
            {
              "id": "c7906cd3-9589-4b9f-b07b-724042d2f404",
              "name": "additional_exclude_criteria",
              "type": "string",
              "value": "Things to exclude from analysis"
            },
            {
              "id": "0435bcaa-85b7-4ae3-8ee4-7c933e9d44ae",
              "name": "brief_title",
              "type": "string",
              "value": "Title for your Slack briefs (e.g., \"Tech Intelligence Brief\")"
            },
            {
              "id": "f1f74e29-fe24-4620-8def-c0e8a02b17e7",
              "name": "footer_message",
              "type": "string",
              "value": "Footer text for your briefs"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2da8b52f-779b-4289-aa2a-2072116feb20",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1664,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 767,
        "height": 1133,
        "content": "## 🤖 AI 驱动的新闻简报智能摘要"
      },
      "typeVersion": 1
    },
    {
      "id": "71e94dba-2edf-4183-874c-cfa9c35ffa5d",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -272
      ],
      "parameters": {
        "width": 443,
        "height": 507,
        "content": "## ⚙️ 设置步骤"
      },
      "typeVersion": 1
    },
    {
      "id": "1c04e69c-16cb-43b3-a952-53a7ccc3cd24",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        272
      ],
      "parameters": {
        "width": 443,
        "height": 520,
        "content": "## 🔧 必要配置"
      },
      "typeVersion": 1
    },
    {
      "id": "04f9d0ca-0bd3-4367-af91-42491570b1c6",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        -272
      ],
      "parameters": {
        "color": 2,
        "width": 423,
        "height": 491,
        "content": "## 🚨 重要说明"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "Configuration": {
      "main": [
        [
          {
            "node": "Get Labeled Newsletters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format for Slack": {
      "main": [
        [
          {
            "node": "Send to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Conversation Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Newsletter Analyst",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Output Parser Model": {
      "ai_languageModel": [
        [
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Questions": {
      "main": [
        [
          {
            "node": "Save Questions to Notion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Newsletter Analyst": {
      "main": [
        [
          {
            "node": "Format for Slack",
            "type": "main",
            "index": 0
          },
          {
            "node": "Split Out Questions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Morning Trigger": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Newsletter Analyst",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Combine All Newsletters": {
      "main": [
        [
          {
            "node": "AI Newsletter Analyst",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Labeled Newsletters": {
      "main": [
        [
          {
            "node": "Filter Out Empty Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Out Empty Results": {
      "main": [
        [
          {
            "node": "Combine All Newsletters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Perplexity Research Tool": {
      "ai_tool": [
        [
          {
            "node": "AI Newsletter Analyst",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Newsletter Analyst",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

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

需要付费吗?

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

工作流信息
难度等级
高级
节点数量19
分类3
节点类型15
难度说明

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

外部链接
在 n8n.io 查看

分享此工作流