當 Node-RED 自動化流程越來越多,如果每個分頁都要手動拉一次「Prompt 組裝 ➔ Exec 節點 ➔ 指令引號跳脫 ➔ JSON 解析 ➔ 雙軌解包防禦」,編輯畫面看起來會像是一坨打結的耳機線。
未來想加一個--effort low或更換模型參數,就得在 10 個分頁裡手動改 10 次,極度容易改漏。
今天我們就用 Subflow(子流程),把 Googleagy.exe的呼叫邏輯打包成一個專屬的自訂節點🤖 agy 推理核心大腦,其他分頁直接拖拉出來就能像原生節點一樣隨插即用!
本文同步發布於 GitHub: 2026-18th-it-ironman
| 比較項目 | ❌ 分頁到處複製貼上(重複造輪子) | ✅ 封裝為 Subflow 樂高積木 |
|---|---|---|
| 畫布整潔度 | 每個流程都需要 4~5 顆繁瑣節點,線條交錯凌亂 | 只需 1 顆自訂積木節點,畫布極致清爽 |
| 全域升級維護 | 改一個參數(如--max-tokens)要手動改 10 個分頁 |
修改 Subflow 1 處,全專案所有分頁自動同步升級! |
| 跨流程複用性 | 靠 Copy-Paste,久了各分頁版本漂移不一致 | 像原生節點般陳列在左側面板,隨拖隨用 |
| 輸入相容與健壯性 | 容易漏掉引號跳脫、Schema 轉義或雙軌解包防禦 | 內部自帶標準化輸入相容與解包防禦,零出錯率 |

Subflow 內部由三個核心環節緊密配合,外部只需要傳入 msg.prompt(或可選的 msg.schema),其餘所有繁瑣的 CLI 轉義與解包工作全在積木內部自體完成:
[外部流程輸入: msg.prompt / msg.schema]
↓
【第 1 站:指令組裝與參數正規化 (Function)】 ➔ 自動相容字串/物件,安全跳脫引號,動態追加 Schema 參數
↓
【第 2 站:呼叫本機 agy CLI (Exec)】 ➔ 執行本機 agy.exe,具備非同步執行與權限自動跳過保護
↓
【第 3 站:雙軌解包防禦 (Function)】 ➔ 自動相容 structured_output 與純文字,永遠輸出乾淨的 JSON 物件
↓
[外部流程接收: 乾淨標準的 msg.payload]
在 Node-RED 編輯器中建立一個乾淨的子流程容器:
點擊右上角「選單」➔「子流程(Subflows)」➔「新建立子流程(Create Subflow)」。
點擊左上角「編輯屬性」按鈕:
名稱(Name):🤖 agy 推理核心大腦
分類(Category):選擇外觀選項,然後再類別的下拉式選單選擇添加新的,填寫 AI 模組(設定完成後,左側節點選單會自動多出一個名為「AI 模組」的自訂分組,專屬積木就躺在裡面!)。

描述(Info):封裝本機 Google agy CLI 呼叫使用、JSON Schema 契約約束與雙軌解包防禦的通用積木。
輸入埠(Inputs):1
輸出埠(Outputs):1

拉入一個 Function 節點,命名為 1. 建立 agy 指令。
這個節點的職責是將外部傳來的各種雜亂輸入(可能是純文字、可能是物件、可能帶有 Schema 約束)標準化為安全可執行的本機 CLI 指令:
// 1. 自動相容外部傳入的 prompt 或 payload
const prompt = msg.prompt || (typeof msg.payload === 'string' ? msg.payload : JSON.stringify(msg.payload));
// 2. 基礎指令:使用 JSON.stringify 確保 Windows 命令列引號安全跳脫
let cmd = `agy -p ${JSON.stringify(prompt)} --dangerously-skip-permissions`;
// 3. 動態 Schema 約束支援:若外部有傳入 msg.schema,自動追加結構化參數
if (msg.schema) {
const schemaStr = typeof msg.schema === 'object' ? JSON.stringify(msg.schema) : msg.schema;
cmd += ` --json-schema ${JSON.stringify(schemaStr)} --output-format json`;
}
msg.payload = cmd;
return msg;
💡 設計亮點:
外部調用時完全不用管命令列的跳脫字元!無論提示詞裡面有沒有雙引號、換行符號或特殊的 JSON 語法,透過JSON.stringify處理後都能安全傳遞給 PowerShell / CMD 執行。
agy.exe(Exec 節點)拉入一個 Exec 節點,命名為 2. 呼叫 agy.exe,負責呼叫本機安裝好的 agy cli。
msg.payload 傳入)。60 秒,防止模型在極度複雜任務下無限期卡死。連線方式:將步驟 2 的輸出端連至 Exec 節點的輸入端。
拉入一個 Function 節點,命名為 3. 雙軌解包。
在串接 AI CLI 時,回傳的資料結構可能會因為有無指定 --json-schema 而有所不同:
structured_output 屬性中。response 字串中,或者直接吐出純文字字串。為了讓下游節點永遠不需要寫重複的 try-catch 或判斷式,我們在 Subflow 內部完成雙軌安全解包:
let parsed;
try {
parsed = typeof msg.payload === 'string' ? JSON.parse(msg.payload) : msg.payload;
} catch (e) {
parsed = { response: msg.payload };
}
// 軌道 1:優先提取 JSON Schema 約束下的 structured_output
let result = parsed.structured_output;
// 軌道 2:若無 structured_output,則檢查一般 response
if (!result && parsed.response) {
try {
result = typeof parsed.response === 'string' ? JSON.parse(parsed.response) : parsed.response;
} catch (e) {
result = parsed.response;
}
}
// 終極保底:吐出最純淨的解包物件或原始結果
msg.payload = result || parsed;
return msg;
連線方式:將 Exec 節點的第一個輸出埠(標準輸出 stdout)連至此節點,最後將此節點的輸出端連至 Subflow 的輸出埠(Output Port)。
點擊子流程分頁右上角的「完成」,回到主畫布。
現在,你可以在任何日常流程中調用這顆專屬積木:
🤖 agy 推理核心大腦 拖拉至畫布。inject 節點,後方接上一個 debug 節點。inject 節點中注入想詢問的問題,整條 AI 推理與防禦解析即可自動完成!我們拉出兩個 Inject 測試節點,分別驗證「一般問答」與「嚴格 Schema 結構化輸出」的表現:
{
"prompt": "請以繁體中文一句話解釋什麼是 Subflow 子流程"
}
"Subflow(子流程)是 Node-RED 中將多個節點封裝為單一可重複使用自訂積木的模組化機制。"
{
"prompt": "分析這份日誌並歸納:[ERROR] Disk space low on C: drive (only 2% free)",
"schema": {
"type": "object",
"properties": {
"level": { "type": "string" },
"component": { "type": "string" },
"suggestion": { "type": "string" }
},
"required": ["level", "component", "suggestion"]
}
}
{
"level": "ERROR",
"component": "Disk Storage (C:)",
"suggestion": "請立即執行暫存檔清理或搬移 Downloads 檔案至外接儲存裝置,釋放磁碟空間。"
}
msg.schema,自動注入 --json-schema 參數,並由雙軌解包節點自動抽取 structured_output,下游拿到的直接是型別嚴格的 JavaScript 物件!本篇包含 Subflow 完整定義、參數預處理、Exec 本機調用與雙軌解包防禦邏輯,已完整封裝為 Flow JSON 檔。在 Node-RED 點擊「右上角漢堡選單」➔「匯入」即可一鍵部署出專屬的 AI 積木:
今天解決了過去「在每個分頁複製貼上 4~5 顆繁瑣節點」的低效模式,成功打造出全專案共用的 🤖 agy 推理核心大腦 Subflow 積木。未來任何新流程只要拉出這顆積木,就能立刻獲得本機 AI 的強大推理能力!