8
n8n 中文网amn8n.com

使用GPT-4.1 Mini和Notion数据库创建AI精选科技新闻摘要

高级

这是一个Content Creation, AI Summarization领域的自动化工作流,包含 20 个节点。主要使用 Code, Notion, HttpRequest, ManualTrigger, Agent 等节点。 使用GPT-4.1 Mini和Notion数据库创建AI精选科技新闻摘要

前置要求
  • Notion API Key
  • 可能需要目标 API 的认证凭证
  • OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "meta": {
    "instanceId": "5f3c5e6f777b2c7f976eff784f15d2e2501680193b55be3d2ceef10db21e51fb",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "c6bfc0f0-ba09-47f7-9224-56581124b177",
      "name": "当点击“执行工作流”时",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        432,
        64
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b53c4d1d-ea67-4ef8-a637-3ed694d78845",
      "name": "HTTP 请求",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3136,
        368
      ],
      "parameters": {
        "url": "https://api.notion.com/v1/pages",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $item(\"0\").$node[\"Code in JavaScript2\"].json.pagePayload }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer NOTION_API_KEY_WITH_ACCESS_TO_PAGE"
            },
            {
              "name": "Notion-Version",
              "value": "2022-06-28"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "046cff62-c51c-4568-91e3-b387641a6800",
      "name": "获取多个数据库页面",
      "type": "n8n-nodes-base.notion",
      "position": [
        720,
        240
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "key": "Date|date",
              "date": "={{$now.minus({days: 1}).toISO()}}",
              "condition": "after"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "matchType": "allFilters",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "26f79f2b-1851-8054-a6af-e7106fc0ce40",
          "cachedResultUrl": "https://www.notion.so/26f79f2b18518054a6afe7106fc0ce40",
          "cachedResultName": "Tech & Startups rss feed"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "id": "sRT9MWg4gspaOMaP",
          "name": "Notion account"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "6a1e2866-d724-4ddf-92e6-124540e376b6",
      "name": "JavaScript代码",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        272
      ],
      "parameters": {
        "jsCode": "const techKeywords = [\n  \"tech\", \"startup\", \"ai\", \"openai\", \"google\", \"microsoft\", \"apple\",\n  \"iphone\", \"app\", \"software\", \"vc\", \"funding\", \"ipo\", \"venture\",\n  \"silicon valley\", \"cloud\", \"semiconductor\", \"data\", \"innovation\",\n  \"tiktok\", \"meta\", \"facebook\", \"amazon\", \"netflix\", \"snap\"\n];\n\nreturn items.filter(item => {\n  const text = (\n    (item.json.property_title || \"\") + \" \" +\n    (item.json.property_summary || \"\") + \" \" +\n    (item.json.property_full_article || \"\")\n  ).toLowerCase();\n\n  return techKeywords.some(k => text.includes(k));\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c61e26d7-22bc-4135-9d9f-49219dbdd36f",
      "name": "## 步骤1. 将新闻保存在向量存储中(每日运行)",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        1312,
        240
      ],
      "parameters": {
        "options": {},
        "inputText": "=Classify the article into one of these categories: \"Tech/Startup\" or \"Other\".\nReturn only one word: Tech/Startup or Other.\n\nTitle: {{$json.property_title}}\nSummary: {{$json.property_summary}}\nFull article: {{$json.property_full_article}}\n",
        "categories": {
          "categories": [
            {
              "category": "Other",
              "description": "not Tech/Startup"
            },
            {
              "category": "Tech/Startup",
              "description": "Tech/Startup"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "64df328e-4a0d-428c-9e6f-26cd378a3371",
      "name": "OpenAI 聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1360,
        448
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "j4OqIQtI7Um6LEX2",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "54ceedf7-a9bf-4a50-a3a8-8cdc37c0b9f8",
      "name": "JavaScript代码1",
      "type": "n8n-nodes-base.code",
      "position": [
        1744,
        480
      ],
      "parameters": {
        "jsCode": "\nconst articles = items.map(item => item.json);\n\n// Return one array in one item\nreturn [{ json: { articles } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "13728a28-ba6e-465d-9257-2ec7cbc3a9a7",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2128,
        384
      ],
      "parameters": {
        "text": "={{ $json.articles }}",
        "options": {
          "systemMessage": "=\nYou are an expert technology editor creating a **daily curated digest** of technology and startup news.\nYou receive a list of articles as input (with titles, summaries, and links).\n\n### Your Goals:\n\n1. **Create a single daily digest page** that feels like a professional publication.\n2. **Write a short intro paragraph** summarizing the day’s main themes.\n3. **Group articles by categories** (e.g., *AI & Developer Tools, Startups & Funding, Consumer Tech, Regulation, Hardware & Gadgets, Web & Internet Services*).\n\n   * Only include categories that are relevant for today’s articles.\n4. **For each article**:\n\n   * Use a **bullet point format**.\n   * Write in **concise editorial style** (2–3 sentences max per article).\n   * Always include the **title as a link** to the article.\n5. **End with a closing note** like “That’s it for today’s digest.”\n\n### Formatting Rules:\n\n* Use **Markdown headings** (`#`, `##`) for sections.\n* Ensure **links are clickable Markdown links**.\n* Do **not** include raw JSON, system notes, or AI meta-commentary.\n* Output should be **clean and publish-ready** for Notion.\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "d93debb8-7e57-4117-92fe-64b43501b326",
      "name": "OpenAI 聊天模型1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2176,
        608
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "j4OqIQtI7Um6LEX2",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d5cd2cc9-5f16-40c7-97c4-68edbee168a3",
      "name": "使用 JavaScript2 编写代码",
      "type": "n8n-nodes-base.code",
      "position": [
        2656,
        400
      ],
      "parameters": {
        "jsCode": "// Get markdown digest from AI output\nconst digest = $json[\"output\"];\nconst today = new Date().toISOString().split(\"T\")[0]; // YYYY-MM-DD\n\n// Helper: convert a markdown line into a Notion block\nfunction mdToBlock(line) {\n  line = line.trim();\n\n  // Headings\n  if (line.startsWith(\"### \")) {\n    return {\n      object: \"block\",\n      type: \"heading_3\",\n      heading_3: {\n        rich_text: [{ type: \"text\", text: { content: line.replace(/^### /, \"\") } }]\n      }\n    };\n  }\n  if (line.startsWith(\"## \")) {\n    return {\n      object: \"block\",\n      type: \"heading_2\",\n      heading_2: {\n        rich_text: [{ type: \"text\", text: { content: line.replace(/^## /, \"\") } }]\n      }\n    };\n  }\n  if (line.startsWith(\"# \")) {\n    return {\n      object: \"block\",\n      type: \"heading_1\",\n      heading_1: {\n        rich_text: [{ type: \"text\", text: { content: line.replace(/^# /, \"\") } }]\n      }\n    };\n  }\n\n  // Bulleted list\n  if (line.startsWith(\"- \")) {\n    const linkMatch = line.match(/\\[(.*?)\\]\\((.*?)\\)/);\n    let textContent = line.replace(/^- /, \"\");\n    let richText = [];\n\n    if (linkMatch) {\n      richText.push({\n        type: \"text\",\n        text: { content: linkMatch[1], link: { url: linkMatch[2] } }\n      });\n      const after = textContent.replace(linkMatch[0], \"\").trim();\n      if (after) {\n        richText.push({ type: \"text\", text: { content: \" \" + after } });\n      }\n    } else {\n      richText.push({ type: \"text\", text: { content: textContent } });\n    }\n\n    return {\n      object: \"block\",\n      type: \"bulleted_list_item\",\n      bulleted_list_item: { rich_text: richText }\n    };\n  }\n\n  // Horizontal rule\n  if (line.startsWith(\"---\")) {\n    return { object: \"block\", type: \"divider\", divider: {} };\n  }\n\n  // Regular paragraph\n  if (line.length > 0) {\n    return {\n      object: \"block\",\n      type: \"paragraph\",\n      paragraph: { rich_text: [{ type: \"text\", text: { content: line } }] }\n    };\n  }\n\n  // Empty line → blank paragraph\n  return {\n    object: \"block\",\n    type: \"paragraph\",\n    paragraph: { rich_text: [] }\n  };\n}\n\n// Convert markdown into array of Notion blocks\nconst blocks = digest.split(\"\\n\").map(mdToBlock).filter(Boolean);\n\n// Split blocks into chunks of 100\nconst chunkSize = 100;\nconst chunks = [];\nfor (let i = 0; i < blocks.length; i += chunkSize) {\n  chunks.push(blocks.slice(i, i + chunkSize));\n}\n\nreturn {\n  pagePayload: {\n    parent: { page_id: \"26f79f2b185180ffa6aded90ddd9ba4c\" }, // your parent page\n    icon: { emoji: \"📰\" },\n    cover: {\n      external: { url: \"https://upload.wikimedia.org/wikipedia/commons/6/62/Tuscankale.jpg\" }\n    },\n    properties: {\n      title: [\n        {\n          text: { content: `Tech & Startup Daily Digest – ${today}` }\n        }\n      ]\n    },\n    children: chunks[0] // first 100 blocks only\n  },\n  extraChunks: chunks.slice(1) // save rest for appending\n};\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "6caf59be-ed6b-4ac7-8699-28fd3cc0c799",
      "name": "计划触发器",
      "type": "n8n-nodes-base.scheduleTrigger",
      "disabled": true,
      "position": [
        448,
        384
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 20
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7a2e7407-a775-466b-8022-37836b1927f6",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        -48
      ],
      "parameters": {
        "height": 576,
        "content": "## 手动激活用于测试"
      },
      "typeVersion": 1
    },
    {
      "id": "ba4b3f32-885b-4155-ab8e-a30530dc1f07",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        240
      ],
      "parameters": {
        "width": 208,
        "height": 128,
        "content": "## 我们可以将其安排为每日执行"
      },
      "typeVersion": 1
    },
    {
      "id": "8e8e21ca-190f-491e-be20-f14861347e2e",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        16
      ],
      "parameters": {
        "height": 416,
        "content": "## 可以修改日期过滤器以获取指定天数或小时内的 Notion 数据库文章"
      },
      "typeVersion": 1
    },
    {
      "id": "3c1c0e30-ebe5-4b1b-b431-916716b822f1",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        48
      ],
      "parameters": {
        "height": 400,
        "content": "## 此代码对我们这些**科技和初创**领域的所需文章进行初步筛选"
      },
      "typeVersion": 1
    },
    {
      "id": "adff5b0a-8745-4a2e-9325-3a165055ac91",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        32
      ],
      "parameters": {
        "width": 368,
        "height": 560,
        "content": "## 使用文本分类模型(gpt-4.1-mini)对文章进行进一步筛选"
      },
      "typeVersion": 1
    },
    {
      "id": "1d4c0870-766f-453a-a2cc-dc4f38f433f1",
      "name": "便签6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1696,
        352
      ],
      "parameters": {
        "height": 320,
        "content": "## 将文章合并到一个对象中传递给 AI 代理"
      },
      "typeVersion": 1
    },
    {
      "id": "0709856a-1b2e-4c31-97c8-b4546169cf60",
      "name": "便签7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2096,
        192
      ],
      "parameters": {
        "width": 304,
        "height": 544,
        "content": "## 将所有文章摘要合并为具有原始 Notion 页面格式的单个文章"
      },
      "typeVersion": 1
    },
    {
      "id": "c36eeaae-77ee-4d73-9e2f-6879c9c1801d",
      "name": "便签8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2528,
        272
      ],
      "parameters": {
        "width": 384,
        "height": 288,
        "content": "## 格式化为正确的 Notion 页面 JSON 对象以传递给 HTTP 节点"
      },
      "typeVersion": 1
    },
    {
      "id": "5dfb71e3-db06-49a2-b3ce-ff953a00ac50",
      "name": "便签9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3040,
        272
      ],
      "parameters": {
        "width": 320,
        "height": 304,
        "content": "## 创建 Notion 页面"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code in JavaScript2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Text Classifier": {
      "main": [
        [],
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get many database pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Text Classifier",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Text Classifier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript2": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many database pages": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Get many database pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

高级 - 内容创作, AI 摘要总结

需要付费吗?

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

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

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

外部链接
在 n8n.io 查看

分享此工作流