使用 n8n AI Assistant 重新命名節點後無法保存工作流程

嗨各位,

我最近遇到了這個問題並手動修復了它。在這裡發佈我的發現,以防這不是預期的行為——或者以防 AI 助手需要改進。

問題

我要求 n8n AI 助手重新命名我工作流中的幾個節點。它進行了編輯,一切在畫布上看起來都很好。但在那之後,工作流變得完全無法保存——我之後進行的每次編輯都失敗並出現:

Problem saving workflow
Autosave failed: Cannot convert undefined or null to object

瀏覽器控制台顯示相同的錯誤反覆從畫布渲染器和保存處理器觸發:

症狀 (AI)

  • 重新命名是我唯一要求 AI 助手做的事情,但在它編輯後,工作流 JSON 回傳時有多個節點級別的欄位被明確設置為 null——比如 credentialswebhookIdnotesnotesInFlowexecuteOnceretryOnFailalwaysOutputDataonError
  • 任何通常不需要這些屬性的節點在標準 n8n 導出中只是完全省略該鍵。AI 助手的編輯往返反而將它們寫成了 null
  • 一旦該結構進入畫布,之後的每個操作(移動節點、保存、自動保存)都會因為相同的 Object.keys TypeError 而崩潰,因為 nodeTransforms.ts 嘗試規範化這些欄位,但不期望字面值 null

根本原因 (AI)

nodeTransforms.ts(由畫布 diffing 邏輯和 useWorkflowSaving.ts 使用)在計算要保存的 diff 時在某些節點屬性(如 credentials)上呼叫 Object.keys(...)Object.keys(null) 會拋出錯誤,所以一旦工作流中的一個節點具有 null 而不是省略的鍵,保存/自動保存整個工作流就會中斷——不只是該節點。

看起來 AI 助手的節點編輯路徑序列化節點物件時沒有丟棄解析為 null 的鍵,這會產生技術上有效的 JSON,但前端不安全的節點形狀。

解決方案 (手動)

導出工作流 JSON,移除任何節點上值為 null 的任何鍵(而不是將其設置為 null),然後重新導入。例如,在受影響的節點上,移除類似以下的鍵:

"credentials": null,
"webhookId": null,
"notes": null,
"notesInFlow": null,
"executeOnce": null,
"retryOnFail": null,
"alwaysOutputData": null,
"onError": null

這樣如果節點不使用這些鍵,節點物件就根本沒有那些鍵。移除 null 欄位並重新導入後(從檔案導入到新工作流,而不是貼上到畫布),工作流恢復正常保存和自動保存。

希望這能為某人省去幾小時的除錯時間!
這看起來像是 AI 助手序列化節點編輯方式中的一個錯誤——希望從 n8n 團隊獲得確認,因為任何使用它進行大量編輯節點的人都可能遇到同樣的問題。

很棒的發現,@mohamed3nan !!!
聽起來確實是個bug

很好的文章——報告和記錄根本原因確實很有幫助。如果再發生這種情況,而你想跳過手動 JSON 編輯,一個小型的 Code 節點可以自動化清理過程:

const workflow = JSON.parse($input.item.json.workflowJson);
workflow.nodes = workflow.nodes.map(node =>
  Object.fromEntries(Object.entries(node).filter(([_, v]) => v !== null))
);
return { workflowJson: JSON.stringify(workflow) };

將匯出的工作流程 JSON 貼到 Set 節點中,通過這個節點執行,然後匯入輸出——如果這個 bug 涉及複雜的工作流程,可以省去幾分鐘的時間。

一個問題,@mohamed3nan
你是自行託管你的 AI 沙箱嗎?

@kjooleng,我還沒試過自我代管,因為它看起來有點複雜……

我目前使用 Daytona 選項,因為它的設定容易得多……

@mohamed3nan 由於AI助手功能仍在預覽階段且存在此錯誤,如果是簡單任務的話,正常調整或手動操作會更好。

我已建立 ADO-5601 作為我們的內部工單來解決此問題。

新版本 n8n@2.33.0 已發布,其中包括 GitHub PR 34668