昨天我們的 Agent 學會了辨識「會議類型」、「專案名稱」與專案關聯,但一個穩定可靠的系統,不只要能在順利時完美運作,更要在發生意外時能有條理的處理失敗。
今天的目標是為我們的 MCP Agent 建立錯誤處理與狀態回報機制,讓它變得更加「可靠」。
Error Trigger
節點統一捕獲異常如果沒有錯誤處理,流程會直接中斷,我們不僅無法得知任務失敗,也不知道問題出在哪裡,因此一個好的錯誤處理機制能帶來四大好處
需要先為「會議記錄」的資料庫增加欄位,用來追蹤每一次處理的狀態與結果。
進入「會議記錄」資料庫,新增以下欄位,若已有則不用
因為要在流程的一開始就追蹤狀態,因此我們需要調整 n8n 工作流的順序,概念想法是先建立空的記錄,後更新完整內容。
建立初始會議記錄
Create a Database Page
會議記錄
AI會議摘要 {{ new Date().toLocaleDateString('zh-TW') }}
Session ID
{{ $('Webhook').item.json.body.session_id }}
摘要狀態
摘要生成中
為了讓後續的節點(包括錯誤流程)知道要更新哪一筆「會議記錄」,我們需要將剛剛建立的 Page ID 保存下來。
Edit Fields
節點保存 Page ID
Manual Mapping
pageID
{{ $('建立初始會議記錄').first().json.id }}
這樣設定之後,這個 「Edit Fields」 節點就會將 Notion Page ID 成功地加入到工作流的資料中,方便後續所有節點取用。
我們在流程開始時建立了初始記錄,現在需要在流程的尾端,將 AI 處理好的完整資料更新回剛剛建立的初始記錄欄位裡。
由於 If
節點會讓資料流產生分岔,我們需要分別處理 True
和 False
兩條路徑。
當成功匹配到專案時,已經經過了許多的節點,因此會導致「專案查詢」的輸出結果,會沒有我們之前保存的 pageID
。
為了解決這個問題,我們需要使用 Merge
節點,將「專案查詢」的結果和我們需要的 pageID
重新合併在一起。
新增 「Merge」 節點
Merge
節點。設定 「Merge」 節點連線
Merge
節點的 Input 1
。Merge
節點的 Input 2
。設定 「Merge」 節點參數
點開 「Merge」 節點的設定
Combine
Position
修改「寫入會議紀錄」節點
將此節點連接到 Merge
節點之後,將 Operation 從 Create
改為 Update
{{ $json.pageID }}
(現在可以從 Merge
節點的合併結果中取到值了!)Properties
區域,點擊 Add Property
,更新或新增以下所有欄位
{{ DateTime.now().toISODate() }}
已完成
{{ $('AI 摘要與任務提取').first().json.meeting_info.summary }}
{{ $('AI 摘要與任務提取').first().json.meeting_info.tasks }}
{{ $('AI 摘要與任務提取').item.json.meeting_info.meeting_type }}
{{ $('AI 摘要與任務提取').item.json.session_id }}
{{ $('專案查詢').first().json.id }}
💡 n8n 偵錯技巧:解決「無法新增屬性」問題
在設定
Update
節點時,可能會遇到編輯器無法載入屬性列表(No execution data available)的問題。這是因為編輯器需要一個「範本 ID」來讀取資料庫結構。可以使用「先寫死,再改活」的方式來解決
- 1. 先取得真實 Page ID
- 先完整跑一次工作流
- 再到工作流上方的 Executions
- 找到剛剛錯誤工作流裡面的 「Merge」節點
- 複製
pageID
- 2. 使用真實 Page ID 載入屬性
- 回到工作流上方的 Editor 的「寫入會議紀錄」節點
- 在
By ID
欄位,暫時貼上剛剛複製的真實 ID- 此時下方的
Properties
區域就可以正常設定了!- 3. 設定所有屬性
在Properties
區域,點擊Add Property
,更新或新增以下所有欄位:
- 會議日期:
{{ DateTime.now().toISODate() }}
- 摘要狀態:
已完成
- 會議摘要:
{{ $('AI 摘要與任務提取').first().json.meeting_info.summary }}
- 行動任務:
{{ $('AI 摘要與任務提取').first().json.meeting_info.tasks }}
- 會議類型:
{{ $('AI 摘要與任務提取').item.json.meeting_info.meeting_type }}
- Session ID:
{{ $('AI 摘要與任務提取').item.json.session_id }}
- GIGI 工作室專案庫:
{{ $('專案查詢').first().json.id }}
- 4. 將 ID 改回動態表達式:
設定完所有屬性後,務必回到By ID
欄位,將寫死的 ID 重新改回動態表達式{{ $json.pageID }}
。透過這樣的技巧節點就能在執行時動態接收正確的
pageID
了。
如同我剛剛所說的,流程已經經過了許多的節點,因此也會沒有我們之前保存的 pageID
,所以我們要
Mergee
節點的 Input 1
。Mergee
節點的 Input 2
。完成以上的修改後,工作流就能根據 AI 的判斷結果,準確地更新對應 Notion 頁面的內容與狀態了!
現在要建立一個專門處理失敗情境的獨立工作流。
Create workflow
建立一個全新的工作流M2A Agent Error Handler
M2A Agent
工作流Settings
打開工作流設定Error Workflow
的下拉選單中,選擇我們剛剛建立的 M2A Agent Error Handler
只要 M2A Agent
工作流中任何一個節點(Webhook 除外)執行失敗,n8n 就會自動觸發 M2A Agent Error Handler
工作流,並把錯誤相關的資料傳遞過去。
回到 M2A Agent Error Handler
工作流,來實作錯誤發生時的具體動作。
Error Trigger
傳來的資料結構比較複雜,我們先用一個 Code 節點把它整理成方便使用的格式。
Error Trigger
後新增一個 Code
節點。格式化錯誤資訊
const execution = $input.item.json.execution;
const error = $input.item.json.error;
const formattedError = {
sessionId: `errorID_${execution?.id || 'unknown'}`,
workflowName: $input.item.json.workflow?.name || execution?.workflow?.name || '未知工作流',
nodeName: execution?.error?.node?.name || '未知節點',
errorMessage: execution?.error?.message || '未知錯誤',
notionUrl: `http://localhost:5678/workflow/Q2Kd8E56GkaFWscI/executions/${execution?.id || 'unknown'}`,
errorType: execution?.error?.level || 'Unknown',
timestamp: new Date().toISOString(),
executionId: execution?.id || 'unknown-execution'
};
return [formattedError];
在 Notion 中建立一筆詳細的錯誤記錄,方便日後追蹤和分析。
建立錯誤訊息
M2A Agent Notion Credential
Database Page
Create
會議記錄
❌ {{ $json.workflowName }} 執行錯誤-ID#{{ $json.executionId }}
Add Property
錯誤
{{ $json.sessionId }}
🚨 工作流執行失敗
**失敗節點**: {{ $json.nodeName }}
**錯誤類型**: {{ $json.errorType }}
**錯誤訊息**: {{ $json.errorMessage }}
**執行時間**: {{ $json.timestamp }}
**執行記錄連結**: {{ $json.notionUrl }}
複製主流程中的 LINE 通知節點,並貼到此處,確保 JSON
的值設定為
{
"messages": [
{
"type": "text",
"text": "🚨 M2A Agent 處理失敗通知 🚨\n\n錯誤記錄: {{ $json.name }}\n\n查看詳情: {{ $json.url }}"
}
]
}
現在來實際測試一下結果,需要手動製造一個錯誤。
M2A Agent
M2A Agent
工作流的 Executions
,會看到一筆失敗的記錄。再檢查 M2A Agent Error Handler
的 Executions
,會看到一筆成功的記錄。測試完成後,請務必記得要復原。
✅ 完成項目
Error Trigger
建立了可重複使用的集中式錯誤處理工作流今天透過建立獨立的錯誤處理工作流,將「成功路徑」與「失敗路徑」分離,實現了軟體工程中一個非常重要的概念,我的主工作流簡潔,只專注於核心業務,而所有的異常處理邏輯則被集中管理,不僅提高了可靠性,也讓未來的維護和擴充變得更加容易。
🎯 明天計劃
從會議對話中自動辨識「參與夥伴」,並與 Notion 使用者資料庫進行匹配,實現會議記錄的智慧標記與歸檔。