{
  "id": "2HpBpZwugqjJkzGG",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "\u516c\u8a8d\u8cc7\u683c\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\uff12",
  "tags": [],
  "nodes": [
    {
      "id": "a098fd17-ac8f-4c24-9639-e65da61c8d81",
      "name": "Trigger: Schedule Workflow",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        4624,
        1168
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "4edeab76-0808-45fd-8979-a49e860bd1bf",
      "name": "Fetch RSS: Roomie Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        4848,
        688
      ],
      "parameters": {
        "url": "https://www.roomie.jp/feed/",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "0d311e18-d8e2-4024-b0e8-8c46737e709a",
      "name": "Merge: Combine All RSS Feeds",
      "type": "n8n-nodes-base.merge",
      "position": [
        5072,
        1104
      ],
      "parameters": {
        "numberInputs": 6
      },
      "typeVersion": 3.2
    },
    {
      "id": "2285efbb-420d-401b-aa5b-3e334affd97c",
      "name": "AI: Rank Articles by Practical Value",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        5968,
        1168
      ],
      "parameters": {
        "text": "=\u3042\u306a\u305f\u306f\u300c\u4ed5\u4e8b\u8853\u30fb\u751f\u7523\u6027\u30fb\u52b9\u7387\u5316\u300d\u306b\u95a2\u3059\u308b\u8a18\u4e8b\u3092\u8a55\u4fa1\u3059\u308bAI\u3067\u3059\u3002\n\n\u4ee5\u4e0b\u306e\u8a18\u4e8b\u4e00\u89a7\u3092\u8a55\u4fa1\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u3010\u8a55\u4fa1\u306e\u76ee\u7684\u3011\n\n\u30fb\u5e45\u5e83\u3044\u4eba\u306b\u5f79\u7acb\u3064\u300c\u4ed5\u4e8b\u8853\u30fb\u751f\u7523\u6027\u30fb\u52b9\u7387\u5316\u300d\u306e\u8a18\u4e8b\u3092\u9078\u5b9a\u3059\u308b\n\u30fb\u5b9f\u969b\u306b\u884c\u52d5\u306b\u79fb\u305b\u308b\u5177\u4f53\u6027\u306e\u3042\u308b\u8a18\u4e8b\u3092\u512a\u5148\u3059\u308b\n\n\u3010\u8a55\u4fa1\u57fa\u6e96\u3011\n\n\u30fb\u591a\u304f\u306e\u4eba\uff08\u8077\u7a2e\u554f\u308f\u305a\uff09\u306b\u5f53\u3066\u306f\u307e\u308b\u5185\u5bb9\u304b\n\u30fb\u518d\u73fe\u6027\u304c\u3042\u308b\u304b\uff08\u8ab0\u3067\u3082\u5b9f\u8df5\u3067\u304d\u308b\u304b\uff09\n\u30fb\u5177\u4f53\u7684\u306a\u65b9\u6cd5\u3084\u624b\u9806\u304c\u66f8\u304b\u308c\u3066\u3044\u308b\u304b\n\u30fb\u62bd\u8c61\u8ad6\u3067\u306f\u306a\u304f\u3001\u5b9f\u7528\u7684\u306a\u5185\u5bb9\u304b\n\u30fb\u3059\u3050\u306b\u884c\u52d5\u306b\u79fb\u305b\u308b\u304b\n\u30fb\u4e00\u90e8\u306e\u5c02\u9580\u8077\u30fb\u7279\u6b8a\u306a\u74b0\u5883\u306b\u4f9d\u5b58\u3057\u3066\u3044\u306a\u3044\u304b\n\u30fb\u8aad\u3093\u3060\u5f8c\u306b\u300c\u4f55\u3092\u3059\u308c\u3070\u3044\u3044\u304b\u300d\u304c\u660e\u78ba\u304b\n\n\u3010\u6e1b\u70b9\u5bfe\u8c61\u3011\n\n\u30fb\u7cbe\u795e\u8ad6\u30fb\u30e2\u30c1\u30d9\u30fc\u30b7\u30e7\u30f3\u8ad6\u306e\u307f\u306e\u8a18\u4e8b\n\u30fb\u62bd\u8c61\u7684\u306a\u307e\u3068\u3081\u8a18\u4e8b\n\u30fb\u518d\u73fe\u6027\u304c\u4f4e\u3044\u5185\u5bb9\uff08\u7279\u5b9a\u306e\u74b0\u5883\u30fb\u500b\u4eba\u4f9d\u5b58\uff09\n\u30fb\u5ba3\u4f1d\u30fb\u5e83\u544a\u8272\u304c\u5f37\u3044\u8a18\u4e8b\n\u30fb\u7d50\u8ad6\u304c\u66d6\u6627\u3067\u884c\u52d5\u306b\u7e4b\u304c\u3089\u306a\u3044\u8a18\u4e8b\n\n\u3010URL\u306b\u95a2\u3059\u308b\u91cd\u8981\u30eb\u30fc\u30eb\uff08\u8ffd\u52a0\uff09\u3011\n\n\u30fblink\u304c\u4ee5\u4e0b\u306b\u8a72\u5f53\u3059\u308b\u5834\u5408\u306f\u5fc5\u305a\u9664\u5916\u3059\u308b\u3053\u3068\n\n* example.com \u3092\u542b\u3080\n* URL\u304c\u5b58\u5728\u3057\u306a\u3044\u53ef\u80fd\u6027\u304c\u9ad8\u3044\u3082\u306e\n* \u660e\u3089\u304b\u306b\u30c0\u30df\u30fc\uff08article1 \u306a\u3069\uff09\n* http/https\u3067\u59cb\u307e\u3089\u306a\u3044\u3082\u306e\n\n\u30fb\u9664\u5916\u3057\u305f\u8a18\u4e8b\u306f\u4e00\u5207\u51fa\u529b\u3057\u306a\u3044\n\n\u3010\u30b9\u30b3\u30a2\u30eb\u30fc\u30eb\u3011\n\n\u30fb0\u301c100\u70b9\u306e\u6574\u6570\u3067\u8a55\u4fa1\u3059\u308b\u3053\u3068\n\u30fb50\u70b9\u304c\u5e73\u5747\n\u30fb70\u70b9\u4ee5\u4e0a\u3067\u6709\u76ca\n\u30fb80\u70b9\u4ee5\u4e0a\u3067\u975e\u5e38\u306b\u5b9f\u7528\u7684\n\u30fb90\u70b9\u4ee5\u4e0a\u3067\u8ab0\u3067\u3082\u5b9f\u8df5\u3067\u304d\u308b\u512a\u826f\u8a18\u4e8b\n\n\u3010\u91cd\u8981\u3011\n\n\u30fb\u300c\u5177\u4f53\u6027\u300d\u3068\u300c\u518d\u73fe\u6027\u300d\u3092\u6700\u91cd\u8996\u3059\u308b\u3053\u3068\n\u30fb\u3067\u304d\u308b\u3060\u3051\u591a\u304f\u306e\u4eba\u306b\u5f53\u3066\u306f\u307e\u308b\u5185\u5bb9\u3092\u9ad8\u8a55\u4fa1\u306b\u3059\u308b\u3053\u3068\n\u30fb\u30cb\u30c3\u30c1\u3059\u304e\u308b\u5185\u5bb9\u306f\u8a55\u4fa1\u3092\u4e0b\u3052\u308b\u3053\u3068\n\u30fbURL\u304c\u6b63\u5e38\u306a\u8a18\u4e8b\u306e\u307f\u5bfe\u8c61\u306b\u3059\u308b\u3053\u3068\n\n\u30fb\u5fc5\u305a\u6307\u5b9a\u3055\u308c\u305fJSON\u5f62\u5f0f\u3067\u8fd4\u3059\n\u30fb\u914d\u5217\u3067\u8fd4\u3059\n\u30fbtitle\u306f\u305d\u306e\u307e\u307e\u4f7f\u3046\n\u30fbscore\u306f\u5fc5\u305a0\u301c100\u306e\u6574\u6570\u3067\u51fa\u3059\n\u30fbscore\u304c\u9ad8\u3044\u8a18\u4e8b\u304b\u308910\u500b\u306e\u307f\u51fa\u529b\u3059\u308b\n\n\u3010\u51fa\u529b\u5f62\u5f0f\u3011\n\n[\n{\n\"title\": \"\u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\",\n\"link\": \"URL\",\n\"score\": 85,\n\"reason\": \"\u306a\u305c\u8a55\u4fa1\u3057\u305f\u304b\uff08\u5177\u4f53\u7684\u306b\uff09\"\n}\n]\n\n\u8a18\u4e8b\u4e00\u89a7:\n\n{{ JSON.stringify($json.articles) }}\n",
        "batching": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "3a00bb1b-441c-4d8c-afe4-fac73dd8ff07",
      "name": "Model: Gemini",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        5968,
        1392
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-flash-lite"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d628d670-f5e6-434e-a242-3a3ada7d99be",
      "name": "Parser: Structured JSON",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        6112,
        1392
      ],
      "parameters": {
        "jsonSchemaExample": "[\n  {\n    \"title\": \"\u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\",\n    \"link\": \"URL\",\n    \"score\": 85,\n    \"reason\": \"\u7406\u7531\"\n  }\n]"
      },
      "typeVersion": 1.3
    },
    {
      "id": "d2d462eb-d87e-440e-bd7a-cc84661109d2",
      "name": "Fetch: Article HTML",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        6768,
        1168
      ],
      "parameters": {
        "url": "={{ $json.link }}",
        "options": {
          "redirect": {
            "redirect": {}
          }
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "047dd732-a9ac-4f4b-ba94-d5af7fdf109d",
      "name": "Format: Slack Message Output",
      "type": "n8n-nodes-base.code",
      "position": [
        7632,
        1024
      ],
      "parameters": {
        "jsCode": "return items.map((item, index) => {\n\n  let data;\n\n  try {\n    data = JSON.parse(item.json.output);\n  } catch (e) {\n    data = item.json;\n  }\n\n  const text = `\u25a0 ${index + 1}\n\n${data.link || '\u30ea\u30f3\u30af\u306a\u3057'}\n\n\u3010\u8981\u7d04\u3011\n${data.summary || '\u306a\u3057'}\n\n\u3010\u5bfe\u8c61\u3011\n${data.target || '\u306a\u3057'}\n\n\u3010\u6d3b\u7528\u4f8b\u3011\n${data.use_case || '\u306a\u3057'}\n\n\u3010\u52b9\u679c\u3011\n${data.effect || '\u306a\u3057'}\n`;\n\n  return {\n    json: {\n      text: text,\n      target: data.target || '',\n      use_case: data.use_case || '',\n      effect: data.effect || ''\n    }\n  };\n\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "73ecd2c3-6b80-4144-b381-d572ae877b28",
      "name": "Notify: Send Summary to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        7920,
        1024
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0AFRAJ1RTM",
          "cachedResultName": "gmail\u30a2\u30e9\u30fc\u30c82"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "dae23d25-03af-492f-8d18-c18d3341f770",
      "name": "AI: Generate Structured Summary",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        7216,
        1168
      ],
      "parameters": {
        "text": "=\u3042\u306a\u305f\u306f\u30c7\u30fc\u30bf\u6574\u5f62\u5c02\u7528AI\u3067\u3059\u3002\n\n\u4ee5\u4e0b\u306e\u5165\u529b\u3092\u5206\u6790\u3057\u3001\u5fc5\u305a\u300c\u6b63\u3057\u3044JSON\u30aa\u30d6\u30b8\u30a7\u30af\u30c81\u500b\u306e\u307f\u300d\u3092\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u3010\u6700\u91cd\u8981\u30eb\u30fc\u30eb\u3011\n\u30fbJSON\u4ee5\u5916\u306e\u6587\u5b57\u3092\u4e00\u5207\u66f8\u304b\u306a\u3044\n\u30fb\u8aac\u660e\u6587\u3092\u66f8\u304b\u306a\u3044\n\u30fb\u524d\u7f6e\u304d\u7981\u6b62\n\u30fb\u5f8c\u66f8\u304d\u7981\u6b62\n\u30fb\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u7981\u6b62\n\u30fb```json \u3084 ``` \u3092\u66f8\u304b\u306a\u3044\n\u30fb\u5fc5\u305a { \u3067\u59cb\u307e\u308a } \u3067\u7d42\u308f\u308b1\u3064\u306eJSON\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3060\u3051\u3092\u8fd4\u3059\n\u30fb\u914d\u5217\u3067\u8fd4\u3055\u306a\u3044\n\u30fb\u8907\u6570\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u8fd4\u3055\u306a\u3044\n\u30fbkey\u540d\u306f\u5fc5\u305a\u4ee5\u4e0b\u3068\u5b8c\u5168\u4e00\u81f4\u3055\u305b\u308b\n\u30fb\u3059\u3079\u3066\u306evalue\u306f\u6587\u5b57\u5217\u306b\u3059\u308b\n\u30fb\u6587\u5b57\u5217\u306e\u5024\u306f\u5fc5\u305a\u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8 \" \" \u3067\u56f2\u3080\n\u30fb\u5404\u30ad\u30fc\u3068\u5024\u306e\u533a\u5207\u308a\u306f\u5fc5\u305a\u30b3\u30ed\u30f3 : \u3092\u4f7f\u3046\n\u30fb\u5404\u9805\u76ee\u306e\u672b\u5c3e\u306f\u3001\u6700\u5f8c\u306e\u9805\u76ee\u4ee5\u5916\u5fc5\u305a\u30ab\u30f3\u30de , \u3092\u5165\u308c\u308b\n\u30fbJSON\u3068\u3057\u3066\u69cb\u6587\u30a8\u30e9\u30fc\u306e\u306a\u3044\u5f62\u5f0f\u3067\u8fd4\u3059\n\u30fb\u6539\u884c\u306f\u3057\u3066\u3088\u3044\u304c\u3001\u5fc5\u305aJSON\u3068\u3057\u3066\u6b63\u3057\u3044\u5f62\u5f0f\u3092\u4fdd\u3064\n\u30fb\u4e0d\u660e\u306a\u9805\u76ee\u306f\u63a8\u6e2c\u3057\u3059\u304e\u305a\u3001\u7a7a\u6587\u5b57 \"\" \u3092\u5165\u308c\u308b\n\n\u3010key\u3011\n\u4ee5\u4e0b\u306e5\u3064\u4ee5\u5916\u306ekey\u3092\u7d76\u5bfe\u306b\u51fa\u529b\u3057\u306a\u3044\u3053\u3068\n\nsummary\ntarget\nuse_case\neffect\nlink\n\n\u3010\u51fa\u529b\u5f62\u5f0f\u3011\n{\n  \"summary\": \"\",\n  \"target\": \"\",\n  \"use_case\": \"\",\n  \"effect\": \"\",\n  \"link\": \"\",\n}\n\n\u3010\u5185\u5bb9\u30eb\u30fc\u30eb\u3011\n\u30fbsummary:\n  \u8a18\u4e8b\u5168\u4f53\u306e\u8981\u70b9\u3092\u7c21\u6f54\u306b\u307e\u3068\u3081\u308b\n  100\u301c220\u6587\u5b57\u7a0b\u5ea6\u3092\u76ee\u5b89\u306b\u3059\u308b\n\n\u30fbtarget:\n  \u3069\u3093\u306a\u4eba\u306b\u5411\u3044\u3066\u3044\u308b\u5185\u5bb9\u304b\u3092\u308f\u304b\u308a\u3084\u3059\u304f\u66f8\u304f\n  30\u301c120\u6587\u5b57\u7a0b\u5ea6\u3092\u76ee\u5b89\u306b\u3059\u308b\n\n\u30fbuse_case:\n  \u3069\u3093\u306a\u5834\u9762\u3067\u6d3b\u304b\u305b\u308b\u304b\u3001\u5b9f\u969b\u306e\u4f7f\u3044\u3069\u3053\u308d\u3092\u66f8\u304f\n  50\u301c180\u6587\u5b57\u7a0b\u5ea6\u3092\u76ee\u5b89\u306b\u3059\u308b\n\n\u30fbeffect:\n  \u3053\u306e\u8a18\u4e8b\u306e\u5185\u5bb9\u3092\u5b9f\u8df5\u3059\u308b\u3068\u3069\u306e\u3088\u3046\u306a\u826f\u3044\u5909\u5316\u304c\u3042\u308b\u304b\u3092\u5177\u4f53\u7684\u306b\u66f8\u304f\n  \u5fc5\u305a200\u6587\u5b57\u4ee5\u4e0a400\u6587\u5b57\u4ee5\u4e0b\u306b\u3059\u308b\n\n\u30fblink:\n  \u5165\u529b\u306e\u30ea\u30f3\u30af\u3092\u305d\u306e\u307e\u307e\u5165\u308c\u308b\n  \u7701\u7565\u3057\u306a\u3044\n\n\u3010\u6587\u7ae0\u30eb\u30fc\u30eb\u3011\n\u30fb\u65e5\u672c\u8a9e\u3067\u66f8\u304f\n\u30fb\u7c21\u6f54\u3067\u81ea\u7136\u306a\u6587\u7ae0\u306b\u3059\u308b\n\u30fb\u4e0d\u8981\u306a\u8a87\u5f35\u8868\u73fe\u306f\u7981\u6b62\n\u30fb\u62bd\u8c61\u7684\u3059\u304e\u308b\u8868\u73fe\u3092\u907f\u3051\u308b\n\u30fb\u672c\u6587\u306b\u306a\u3044\u5185\u5bb9\u3092\u4f5c\u308a\u3059\u304e\u306a\u3044\n\u30fb\u6539\u884c\u6587\u5b57\u3084\u7279\u6b8a\u8a18\u53f7\u3092\u7121\u7406\u306b\u5165\u308c\u306a\u3044\n\u30fb\u6587\u5b57\u5217\u4e2d\u306b\u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8 \" \u3092\u4f7f\u3044\u305f\u3044\u5834\u5408\u306f\u3001JSON\u3068\u3057\u3066\u58ca\u308c\u306a\u3044\u3088\u3046\u306b\u9069\u5207\u306b\u30a8\u30b9\u30b1\u30fc\u30d7\u3059\u308b\n\u30fb\u51fa\u529b\u524d\u306b\u3001JSON\u3068\u3057\u3066\u6b63\u3057\u3044\u304b\u3092\u5fc5\u305a\u81ea\u5df1\u78ba\u8a8d\u3057\u3066\u304b\u3089\u8fd4\u3059\n\u30fb\u7279\u306b\u300c\u30ab\u30f3\u30de\u629c\u3051\u300d\u300c\u9589\u3058\u30ab\u30c3\u30b3\u629c\u3051\u300d\u300c\u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\u629c\u3051\u300d\u3092\u7d76\u5bfe\u306b\u8d77\u3053\u3055\u306a\u3044\u3053\u3068\n\n\u3010\u81ea\u5df1\u78ba\u8a8d\u30c1\u30a7\u30c3\u30af\u3011\n\u8fd4\u7b54\u524d\u306b\u5fc5\u305a\u4ee5\u4e0b\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3059\u308b\u3053\u3068\n1. JSON\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f1\u500b\u3060\u3051\u304b\n2. key\u306f6\u500b\u3060\u3051\u304b\n3. \u3059\u3079\u3066\u306evalue\u306f\u6587\u5b57\u5217\u304b\n4. \u6700\u5f8c\u306e\u9805\u76ee\u4ee5\u5916\u306b\u30ab\u30f3\u30de\u304c\u5165\u3063\u3066\u3044\u308b\u304b\n5. effect\u306f200\u6587\u5b57\u4ee5\u4e0a400\u6587\u5b57\u4ee5\u4e0b\u304b\n6. link\u306f\u5165\u529b\u30ea\u30f3\u30af\u3092\u305d\u306e\u307e\u307e\u5165\u308c\u3066\u3044\u308b\u304b\n7. JSON\u4ee5\u5916\u306e\u6587\u5b57\u3092\u4e00\u5207\u542b\u3093\u3067\u3044\u306a\u3044\u304b\n\n\u3010\u5165\u529b\u3011\n\u30ea\u30f3\u30af:\n{{ $json.link }}\n\n\u672c\u6587:\n{{ $json.cleanText }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "887c89aa-679b-49ab-bd26-992336acd53a",
      "name": "Model: OpenAI",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        7216,
        1392
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "gpt-4.1-nano"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "f8b11bce-e559-4583-9299-b051fb5bbe9d",
      "name": "Filter: Articles from Last 24 Hours",
      "type": "n8n-nodes-base.code",
      "position": [
        5296,
        1168
      ],
      "parameters": {
        "jsCode": "// ==============================\n// \u2460 \u73fe\u5728\u6642\u523b\u3092\u53d6\u5f97\n// ==============================\nconst now = new Date();\n\n// ==============================\n// \u2461 24\u6642\u9593\uff08\u30df\u30ea\u79d2\uff09\n// ==============================\nconst ONE_DAY = 24 * 60 * 60 * 1000;\n\n// ==============================\n// \u2462 \u30d5\u30a3\u30eb\u30bf\u51e6\u7406\n// ==============================\nreturn items.filter(item => {\n\n  // \u8a18\u4e8b\u306e\u65e5\u6642\u53d6\u5f97\uff08isoDate\u512a\u5148\uff09\n  const dateString = item.json.isoDate || item.json.pubDate;\n\n  // \u65e5\u4ed8\u304c\u306a\u3044\u5834\u5408\u306f\u9664\u5916\n  if (!dateString) return false;\n\n  const articleDate = new Date(dateString);\n\n  // \u6642\u9593\u5dee\u3092\u8a08\u7b97\n  const diff = now - articleDate;\n\n  // ==============================\n  // \u2463 24\u6642\u9593\u4ee5\u5185\u3060\u3051\u6b8b\u3059\n  // ==============================\n  return diff <= ONE_DAY;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "89de2102-9456-4861-a160-c10df58a4a8e",
      "name": "Aggregate: Build Article Array",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        5744,
        1168
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "articles"
      },
      "typeVersion": 1
    },
    {
      "id": "4573d563-4da0-4ca4-a063-7d17e35112a9",
      "name": "Split: Top 10 Articles",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        6320,
        1168
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output"
      },
      "typeVersion": 1
    },
    {
      "id": "e399bd2f-abec-4ae4-96b4-ae649357363a",
      "name": "STEP1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4576,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 1224,
        "content": "## STEP1: Data Collection\n\nFetch articles from multiple RSS feeds (Roomie, Lifehacker, and note) and merge them into one list"
      },
      "typeVersion": 1
    },
    {
      "id": "3666a995-35b0-48dd-acc3-c051b1d0b98d",
      "name": "STEP2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5216,
        896
      ],
      "parameters": {
        "color": 7,
        "width": 708,
        "height": 648,
        "content": "## STEP2: Data Filtering & Structuring\nFilter articles within the last 24 hours and transform them into a structured format for AI processing"
      },
      "typeVersion": 1
    },
    {
      "id": "9d4ce466-8129-437f-a748-e08478f23868",
      "name": "STEP3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5920,
        896
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 648,
        "content": "## STEP3: AI-Based Article Scoring and Selection\n\nEvaluate each article using AI based on practical usefulness, clarity, reproducibility, and actionability.\n\nThe results are ranked and filtered to select the top 10 highly actionable articles.\n\nThe selected articles are then split into individual items for further processing."
      },
      "typeVersion": 1
    },
    {
      "id": "3bd80cf9-3868-4e26-a442-e0b17e331ac3",
      "name": "STEP4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6480,
        896
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 440,
        "content": "## STEP4: Content Retrieval & Preparation\nPrepare article links, fetch each article HTML, and extract and clean the main text content for further processing"
      },
      "typeVersion": 1
    },
    {
      "id": "8e27a85e-0f49-40d3-9a76-6d0af290f094",
      "name": "STEP5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7152,
        896
      ],
      "parameters": {
        "color": 7,
        "width": 404,
        "height": 792,
        "content": "## STEP5: AI Article Summarization\nGenerate summary, target, use cases, effect, and link"
      },
      "typeVersion": 1
    },
    {
      "id": "6e5c167d-8e2a-46b8-b394-9dec84288e04",
      "name": "STEP6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7552,
        896
      ],
      "parameters": {
        "color": 7,
        "width": 740,
        "height": 328,
        "content": "## STEP6: Notification\nFormat the result and send it to Slack"
      },
      "typeVersion": 1
    },
    {
      "id": "d90f7b1b-b78f-471f-a924-dbae373faf90",
      "name": "WORKFLOW OVERVIEW",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3776,
        592
      ],
      "parameters": {
        "width": 800,
        "height": 1352,
        "content": "## AUTOMATE RSS AI SUMMARIZATION WITH SLACK DELIVERY AND TTS AUDIO ARCHIVING\n\n## Who\u2019s it for\nThis workflow is designed to help Japanese-speaking professionals, and learners stay updated with practical productivity and lifehack insights.\n\nIt is especially suitable for those who prefer actionable tips and want to consume content in both text and audio formats.\n\n\n---\n\n## What it does\nThis workflow collects and processes Japanese productivity articles from multiple RSS sources.\n\nIt filters recent articles (last 24 hours), ranks them using AI based on practical value, and selects the top 10.\n\nFor each article, it:\n- Retrieves and cleans the content\n- Generates structured summaries in Japanese\n- Converts summaries into natural voice scripts\n\nAudio files are generated and stored in Google Drive, while summarized text is delivered to Slack as a daily digest.\n\n---\n\n## How it works\n1. Scheduled trigger runs the workflow  \n2. RSS feeds are fetched and merged  \n3. Articles are filtered (last 24 hours)  \n4. AI ranks and selects top 10 articles  \n5. Content is retrieved and cleaned  \n6. AI generates summaries and voice scripts  \n7. Audio is generated and stored in Google Drive  \n8. Text summaries are formatted and sent to Slack  \n\n---\n\n## Requirements\n- Google Gemini API  \n- OpenAI API  \n- Slack OAuth2  \n- (Optional) Google Drive credentials for audio file storage\n- A Slack channel for receiving notifications\n\n---\n\n## How to set up\n- Configure API credentials, set the Slack channel, and activate the workflow.\n- Enable audio generation and connect Google Drive if needed. \n\n---\n\n## How to customize\n- Change RSS sources  \n- Adjust filtering range  \n- Modify AI scoring logic  \n- Customize Slack format  \n- Enable/disable audio  "
      },
      "typeVersion": 1
    },
    {
      "id": "35abbb16-a8b8-4206-8238-a0633e7d63d1",
      "name": "Prepare: Extract Article Link for HTTP",
      "type": "n8n-nodes-base.set",
      "position": [
        6544,
        1168
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9ca0c4fe-23bc-4e6c-adf5-672be949d2ae",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ba313ba9-f552-4e04-baa2-a88bf64e3d3c",
      "name": "Transform: Normalize Article Data",
      "type": "n8n-nodes-base.set",
      "position": [
        5520,
        1168
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7d734121-23b4-43fe-88ef-6a3053d6a3ca",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "f6b9e622-0847-43a6-853e-122ecac79d9d",
              "name": "summary",
              "type": "string",
              "value": "={{ $json.content }}"
            },
            {
              "id": "93fbe759-8c1e-4a08-833c-70f52372da52",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "32635686-b534-4099-b2c8-b389ef9eab1b",
      "name": "Extract: Clean Text from HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        6992,
        1168
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const html = $json.data || '';\n\n// ==============================\n// \u2460 \u5546\u54c1URL\u62bd\u51fa\uff08\u2190\u3053\u3053\u8ffd\u52a0\uff09\n// ==============================\nconst links = [...html.matchAll(/href=\"(https?:\\/\\/[^\"]+)\"/g)]\n  .map(m => m[1]);\n\nconst productUrl = links.find(url =>\n  url.includes('amazon') ||\n  url.includes('rakuten') ||\n  url.includes('store') ||\n  url.includes('shop')\n);\n\n// ==============================\n// \u2461 \u30c6\u30ad\u30b9\u30c8\u62bd\u51fa\uff08\u65e2\u5b58\u51e6\u7406\uff09\n// ==============================\nlet text = html\n  .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n  .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n  .replace(/<[^>]*>/g, '')\n  .replace(/[^\u3041-\u3093\u30a1-\u30f3\u4e00-\u9fa5a-zA-Z0-9\u3002\u3001\uff01\uff1f\\s]/g, '');\n\ntext = text\n  .split('\\n')\n  .map(line => line.trim())\n  .filter(line => line.length > 20)\n  .join('\\n');\n\ntext = text.replace(/\\s+/g, ' ').trim().slice(0, 3000);\n\n// ==============================\n// \u2462 \u51fa\u529b\n// ==============================\nreturn {\n  json: {\n    link: $('Prepare: Extract Article Link for HTTP').item.json.link,\n    cleanText: text,\n    product_url: productUrl || ''\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "a7aa1409-4854-429d-97a1-1838f3c080ea",
      "name": "Fetch RSS: Lifehacker Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        4848,
        880
      ],
      "parameters": {
        "url": "https://www.lifehacker.jp/feed/index.xml",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "1733eb1f-7b46-437b-afd0-bfad39b83dbe",
      "name": "AI: Convert to Voice Script",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        7600,
        1376
      ],
      "parameters": {
        "text": "=\u3042\u306a\u305f\u306f\u671d\u306e\u60c5\u5831\u756a\u7d44\u306e\u30ca\u30ec\u30fc\u30bf\u30fc\u3067\u3059\u3002\n\u4ee5\u4e0b\u306e\u8a18\u4e8b\u6574\u7406\u30c7\u30fc\u30bf\u3092\u3001\u97f3\u58f0\u3067\u805e\u3044\u3066\u7406\u89e3\u3057\u3084\u3059\u3044\u81ea\u7136\u306a\u65e5\u672c\u8a9e\u306b\u66f8\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u3010\u76ee\u7684\u3011\n\u30fb\u8aad\u307f\u4e0a\u3052\u305f\u3068\u304d\u306b\u4e0d\u81ea\u7136\u306b\u306a\u3089\u306a\u3044\u3053\u3068\n\u30fb\u96e3\u3057\u3044\u8a00\u3044\u56de\u3057\u3092\u907f\u3051\u308b\u3053\u3068\n\u30fb1\u8a18\u4e8b\u3042\u305f\u308a150\u301c250\u6587\u5b57\u7a0b\u5ea6\u306b\u3059\u308b\u3053\u3068\n\u30fb\u300c\u3053\u306e\u8a18\u4e8b\u3067\u306f\u301c\u300d\u300c\u7279\u306b\u301c\u306a\u4eba\u306b\u5411\u3044\u3066\u3044\u307e\u3059\u300d\u300c\u4eca\u65e5\u3059\u3050\u8a66\u3059\u306a\u3089\u301c\u300d\u306e\u3088\u3046\u306b\u81ea\u7136\u306b\u3064\u306a\u3050\u3053\u3068\n\u30fb\u30ea\u30f3\u30af\u3084\u8a18\u53f7\u306e\u7f85\u5217\u306f\u8aad\u307e\u305b\u306a\u3044\u3053\u3068\n\u30fb\u97f3\u58f0\u5411\u3051\u306a\u306e\u3067\u7b87\u6761\u66f8\u304d\u7981\u6b62\n\u30fb\u656c\u8a9e\u306f\u3084\u308f\u3089\u304b\u304f\u81ea\u7136\u306b\u3059\u308b\n\n\u3010\u51fa\u529b\u5f62\u5f0f\u3011\n{\n  \"radio_text\": \"\"\n}\n\n\u3010\u5165\u529b\u3011\n{{ $json.output }}",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "a5d3df40-d30f-427e-a427-bec5708890e7",
      "name": "Generate: Voice Audio (TTS)",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        8352,
        1376
      ],
      "parameters": {
        "input": "={{ $json.script }}",
        "options": {
          "response_format": "mp3",
          "binaryPropertyOutput": "audio"
        },
        "resource": "audio"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "f7eec888-3e82-4c8f-a495-02375261fa94",
      "name": "Upload: Save Audio to Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        8528,
        1376
      ],
      "parameters": {
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultUrl": "https://drive.google.com/drive",
          "cachedResultName": "/ (Root folder)"
        },
        "inputDataFieldName": "audio"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "147eae21-99f4-4d0e-9506-ed343d2029e5",
      "name": "Fetch RSS: Note Work Tips",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        4848,
        1072
      ],
      "parameters": {
        "url": "https://note.com/hashtag/%E4%BB%95%E4%BA%8B%E8%A1%93/rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "be9797f1-a322-4371-b1ba-47f4bbd26ce6",
      "name": "Fetch RSS: Note Productivity",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        4848,
        1264
      ],
      "parameters": {
        "url": "https://note.com/hashtag/%E7%94%9F%E7%94%A3%E6%80%A7/rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "b635d478-f54d-402b-b6fb-ffae07d8bb54",
      "name": "Fetch RSS: Note Efficiency",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        4848,
        1456
      ],
      "parameters": {
        "url": "https://note.com/hashtag/%E5%8A%B9%E7%8E%87%E5%8C%96/rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "17ff9382-a67c-42b2-8bc3-6dd6e64e8f64",
      "name": "Fetch RSS: Note Cost Performance",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        4848,
        1648
      ],
      "parameters": {
        "url": "https://note.com/hashtag/%E3%82%B3%E3%82%B9%E3%83%91%E9%87%8D%E8%A6%96/rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "f01bb78c-9341-44e3-a44c-0c99cbea6c13",
      "name": "Aggregate: Collect Voice Script Segments",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        7904,
        1376
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "text"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "85aa2f06-9bf4-4293-b2a1-488588cd00a5",
      "name": "Format: Build Final Voice Script",
      "type": "n8n-nodes-base.code",
      "position": [
        8160,
        1376
      ],
      "parameters": {
        "jsCode": "const segments = $input.first().json.text || [];\n\nconst body = segments\n  .map((item, index) => {\n    let raw = item.json || item;\n\n    let text = '';\n\n    try {\n      // ```json \u3092\u9664\u53bb\n      const cleaned = raw\n        .replace(/```json/g, '')\n        .replace(/```/g, '')\n        .trim();\n\n      const parsed = JSON.parse(cleaned);\n      text = parsed.radio_text || '';\n    } catch (e) {\n      text = '';\n    }\n\n    return `\u7b2c${index + 1}\u4ef6\u76ee\u3067\u3059\u3002${text}`;\n  })\n  .join('\\n\\n');\n\nconst script = `\n\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059\u3002\n\n\u4eca\u65e5\u306e\u4ed5\u4e8b\u8853\u30fb\u751f\u7523\u6027\u30cb\u30e5\u30fc\u30b9\u3092\u3001\u805e\u304d\u3084\u3059\u304f\u307e\u3068\u3081\u3066\u304a\u5c4a\u3051\u3057\u307e\u3059\u3002\n\n${body}\n\n\u4ee5\u4e0a\u3001\u4eca\u65e5\u306e\u6ce8\u76ee\u30cb\u30e5\u30fc\u30b9\u3067\u3057\u305f\u3002\n\u6c17\u306b\u306a\u3063\u305f\u8a18\u4e8b\u306f\u3001\u3042\u3068\u3067Slack\u306e\u30ea\u30f3\u30af\u304b\u3089\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\n`.trim();\n\nreturn [\n  {\n    json: {\n      script,\n      date: new Date().toISOString().slice(0, 10),\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "ee50558f-b1a2-4046-b0b5-0b11ac92193f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7552,
        1216
      ],
      "parameters": {
        "color": 7,
        "width": 544,
        "height": 480,
        "content": "## STEP7: Voice Script Preparation\nConvert summarized articles into voice-friendly text and combine them into a single narration flow."
      },
      "typeVersion": 1
    },
    {
      "id": "d80a84dd-479f-4d15-bdc7-0d77c2ac700f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8096,
        1216
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 480,
        "content": "## STEP8: Audio Generation & Storage\nGenerate audio from the final script and save it to Google Drive for distribution or reuse."
      },
      "typeVersion": 1
    },
    {
      "id": "d3376595-4d3d-4ab9-8882-9731d576eed1",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        7600,
        1552
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-3.5-turbo",
          "cachedResultName": "gpt-3.5-turbo"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "0d2f9f05-3fdb-482e-96ca-3cfc1fe91d7d",
  "connections": {
    "Model: Gemini": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Rank Articles by Practical Value",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Model: OpenAI": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Generate Structured Summary",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Convert to Voice Script",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fetch: Article HTML": {
      "main": [
        [
          {
            "node": "Extract: Clean Text from HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS: Roomie Feed": {
      "main": [
        [
          {
            "node": "Merge: Combine All RSS Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split: Top 10 Articles": {
      "main": [
        [
          {
            "node": "Prepare: Extract Article Link for HTTP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parser: Structured JSON": {
      "ai_outputParser": [
        [
          {
            "node": "AI: Rank Articles by Practical Value",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS: Note Work Tips": {
      "main": [
        [
          {
            "node": "Merge: Combine All RSS Feeds",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Fetch RSS: Lifehacker Feed": {
      "main": [
        [
          {
            "node": "Merge: Combine All RSS Feeds",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Fetch RSS: Note Efficiency": {
      "main": [
        [
          {
            "node": "Merge: Combine All RSS Feeds",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "Trigger: Schedule Workflow": {
      "main": [
        [
          {
            "node": "Fetch RSS: Roomie Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch RSS: Note Work Tips",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch RSS: Lifehacker Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch RSS: Note Productivity",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch RSS: Note Efficiency",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch RSS: Note Cost Performance",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Convert to Voice Script": {
      "main": [
        [
          {
            "node": "Aggregate: Collect Voice Script Segments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate: Voice Audio (TTS)": {
      "main": [
        [
          {
            "node": "Upload: Save Audio to Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS: Note Productivity": {
      "main": [
        [
          {
            "node": "Merge: Combine All RSS Feeds",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Format: Slack Message Output": {
      "main": [
        [
          {
            "node": "Notify: Send Summary to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge: Combine All RSS Feeds": {
      "main": [
        [
          {
            "node": "Filter: Articles from Last 24 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract: Clean Text from HTML": {
      "main": [
        [
          {
            "node": "AI: Generate Structured Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate: Build Article Array": {
      "main": [
        [
          {
            "node": "AI: Rank Articles by Practical Value",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Generate Structured Summary": {
      "main": [
        [
          {
            "node": "AI: Convert to Voice Script",
            "type": "main",
            "index": 0
          },
          {
            "node": "Format: Slack Message Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS: Note Cost Performance": {
      "main": [
        [
          {
            "node": "Merge: Combine All RSS Feeds",
            "type": "main",
            "index": 5
          }
        ]
      ]
    },
    "Format: Build Final Voice Script": {
      "main": [
        [
          {
            "node": "Generate: Voice Audio (TTS)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transform: Normalize Article Data": {
      "main": [
        [
          {
            "node": "Aggregate: Build Article Array",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter: Articles from Last 24 Hours": {
      "main": [
        [
          {
            "node": "Transform: Normalize Article Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Rank Articles by Practical Value": {
      "main": [
        [
          {
            "node": "Split: Top 10 Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare: Extract Article Link for HTTP": {
      "main": [
        [
          {
            "node": "Fetch: Article HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate: Collect Voice Script Segments": {
      "main": [
        [
          {
            "node": "Format: Build Final Voice Script",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}