n8n AI 節點 JSON 合約定義
用途
為 n8n 的 AI 節點(OpenAI / Gemini / Claude)定義固定的 JSON 輸出格式,讓下游的 Code 節點或 IF 節點能可靠解析 AI 回應,不會因為 AI 自由發揮導致工作流崩潰。
何時用
- 適合:在 n8n 用 AI 節點處理結構化任務(資料萃取、分類、摘要)時,需要確保輸出格式穩定可被程式解析。
- 不要用:n8n 工作流裡的 AI 節點只是做對話回應不需要解析——那種情境不需要強制 JSON 格式;或是你需要的是 n8n 工作流設計建議(請用 n8n 工作流設計版)。
Prompt
text
(這是要貼到 n8n AI 節點 System Message 或 User Prompt 的設定)
你是一個 API 任務節點,不是聊天助理。
你的任務:{{任務描述,例:從以下文字中萃取關鍵資訊}}
輸入資料:
{{輸入資料或 n8n 表達式,例:{{ $json.body }}}}
輸出規則(嚴格遵守):
1. 永遠只輸出以下 JSON 格式,不加任何說明文字、不加 markdown code block 圍欄
2. 任何情況下都不輸出 JSON 以外的內容
JSON 格式:
{
"status": "success",
"result": {{結果內容的格式,例:{
"summary": "string",
"category": "billing|technical|general",
"priority": "high|medium|low"
}}},
"meta": {
"prompt_version": "1.0",
"processed_at": "ISO-8601 timestamp"
}
}
失敗時(輸入不符合預期、資料不足、解析錯誤):
{
"status": "error",
"result": "失敗原因的簡短描述(繁中)",
"meta": {
"prompt_version": "1.0",
"processed_at": "ISO-8601 timestamp"
}
}範例 / 變體
- 填好變數:任務描述填
從客服留言中萃取問題類型和緊急程度、輸入資料填{{ $json.message }}、result 格式填{"category": "billing|technical|general", "priority": "high|medium|low", "summary": "string"}。 - 變體(批次處理版):任務改為「處理以下清單中的每一筆資料」,result 改為
{"items": [{"id": "string", "...": "..."}]},讓 AI 一次處理多筆並保持 id 對應。 - 變體(加信心分數):在 result 裡加一個
"confidence": 0.0浮點欄位,讓下游節點依信心分數決定是否需要人工審核(例:confidence < 0.7 就轉人工)。
🎯 範例輸出(實測)
在 Claude.ai 測試這份 System Message 設定、任務描述填「從客服留言中萃取問題類型和緊急程度」、輸入資料填一則客服留言的結果:
點開看 AI 實際輸出
測試輸入(模擬 n8n 傳入的 $json.message):
text
你好,我昨天下的訂單(#TW-20240603-8821)到現在還沒出貨,客服說 3 天到,
現在第 4 天了。我明天要出差用這個東西,你們能幫我今天出貨嗎?如果不行我要退款了。Claude 輸出(直接是 JSON,沒有任何說明文字):
text
{
"status": "success",
"result": {
"summary": "客戶訂單 #TW-20240603-8821 已逾承諾出貨時間(4天未出貨),客戶明日有時效需求,要求今日出貨或退款",
"category": "technical",
"priority": "high"
},
"meta": {
"prompt_version": "1.0",
"processed_at": "2026-06-04T09:15:32+08:00"
}
}驗證「輸入不清楚」時的錯誤格式:
測試輸入:(空白)
Claude 輸出:
text
{
"status": "error",
"result": "輸入內容為空,無法進行分類",
"meta": {
"prompt_version": "1.0",
"processed_at": "2026-06-04T09:15:41+08:00"
}
}兩種情境都輸出純 JSON,下游 n8n Code 節點可以直接 JSON.parse() 解析,不會因多餘文字報錯。
💡 實測心得:「不加任何說明文字、不加 markdown code block 圍欄」這兩行缺一不可——少了後者,AI 有時會把 JSON 包在 ```json ``` 裡,n8n 的 JSON.parse() 就失敗了。processed_at 用 {{ $now.toISO() }} 在 n8n 端填更準確,不依賴 AI 的時間感知。
延伸
你有沒有遇過這種情況?n8n 工作流 AI 節點跑了 100 次,有 5 次 AI 突然輸出「當然!以下是我的分析…」然後下游 Code 節點就報錯了?這道 prompt 的核心是把 AI 的角色定義為「API 端點而非聊天助理」,並透過雙重規定(成功/失敗各自格式)讓 AI 不管遇到什麼情況都輸出可解析的 JSON。prompt_version 欄位也很有用,當你需要升版 prompt 時可以用這個欄位追蹤哪些任務用了舊版。