如果沒有可用的文件資料,如何發送空二進位資料?

在這個流程中,如果我收到媒體 URL,我會從 URL 下載圖像並將其作為數據發送給 AI 模型。

如果沒有媒體,另一個分支就會啟動。數據不存在。

我如何告訴模型在數據存在時使用它,如果不存在則忽略它?

2個讚

如果false分支沒有數據,AI節點可能會失敗。您需要2條不同的消息。看起來會是這樣

歡迎 @Yash_Ganthe 加入我們的社群!我是 Jay,也是一位 n8n 認證創作者。

使用程式碼節點的方法是這裡較簡潔的做法。在 false 分支中,使用程式碼節點來移除二進位資料,然後再進行合併:

return $input.all().map(item => ({
  json: item.json,
  binary: {}
}));

然後合併兩個分支,並將組合後的輸出傳入單一 AI 節點 - 在無媒體路徑上,模型只會收到一個空的二進位物件,它可以順利處理而不會出現錯誤。

如上所示進行了更改。合併已配置為附加輸入。如果其中一個輸入缺失,沒有選項可以選擇另一個輸入。

合併節點輸出:

[ 
{
"text": "Test15", 
"media_url": "" 
}
]

二進位值似乎為空。

LLM 節點給出錯誤:

第一個參數必須是字符串類型或 Buffer、ArrayBuffer、Array 或類似 Array 的物件的實例。收到 undefined

節點配置如下:

問題在於傳遞 binary: {} 仍然會在項目上留下 binary 鍵,而 LLM 節點會嘗試從中讀取 data 欄位 - 這是未定義的。修復方法是在沒有檔案時完全移除 binary 鍵:

return $input.all().map(item => {
  const result = { json: item.json };
  if (item.binary && Object.keys(item.binary).length > 0) {
    result.binary = item.binary;
  }
  return result;
});

這樣,沒有檔案的項目就完全不會有 binary 屬性,所以 LLM 節點不會嘗試從中讀取。

LLM 現在出現錯誤訊息:

此操作預期節點的輸入資料應包含二進位檔案「data」,但找不到 [項目 0]

@Yash_Ganthe 用這個工作流試試看,100% 可以用。

仍然是相同的錯誤。請注意,data 預期是二進制數據,不是陣列。

此操作期望節點的輸入數據包含一個二進制文件 ‘data’,但找不到 [item 0]

@Yash_Ganthe 這個錯誤是因為節點仍然在期望 item 上有一個名為 data 的 binary 屬性,即使你在 false 分支上。在 false 路徑上新增一個 Code 節點(在進入 AI 模型之前),使用以下程式碼:

for (const item of $input.all()) {
  item.binary = {};
}
return $input.all();

這個程式碼會明確地將 binary 設定為一個空物件,這樣可以告訴下遊節點沒有 binary 資料可用,而不是留下未定義的狀態。區別在於:使用 undefined 會觸發「找不到 binary」的錯誤,而使用空 {} 則可以順利通過。

The binary is expected to have a data property which is expected to be empty in the False branch.

item.binary = { data:{} };

Added this. Still the same error.

該項目沒有二進位欄位「data」[項目 0]

檢查您指定輸入二進位欄位名稱的參數是否正確,以及它是否與二進位輸入中的欄位相符。

當我將二進位設定為空時,我會收到此錯誤。

我所需要的只是一種方式,可以在輸入中未傳送任何影像時,讓模型的輸入作為空檔案。

請使用下方的 JSON,它會正常運作。只是要提醒一下,我是 n8n Creator,已經建立過許多類似的工作流程,所以你可以放心使用這個方法。

你需要將 AI Agent 與 OpenAI Chat Model 節點搭配使用,這樣該功能才能正確運作(在有檔案時傳送檔案,在檔案缺失時將其視為沒有檔案)。我已經測試過這個設定,在我的工作流程中運作得完全沒有問題。

The Aggregate node removes the binary data that has come from the Download node. Due to this, the Agent node does not receive the binary data.

If I remove the Aggregate node and connect the Merge to the Agent, the JSON data reaches the Agent twice as 2 items. Is there a way to retain the binary data?

簡短版本:不要試著讓一個節點「可選擇性地」接收影像 — 那是讓你卡關的地方。既然你已經有了兩個分支,就把它們分開一直保持到模型:

• 如果你使用的是內建 AI/模型節點:在每個分支上放一個模型節點 — 媒體分支設定為二進位影像輸入,無媒體分支設定為純文字 — 如果需要重新合併,在模型後面使用 Merge。
• 如果你透過 HTTP Request 節點呼叫模型:根據分支構建請求本文 — 媒體分支包含影像部分 (base64),無媒體分支傳送純文字本文。(你可以在一個節點中使用表達式,只在二進位存在時才新增影像區塊,但兩個節點更容易閱讀。)
要避免的是在模型之前合併兩個分支 — 它會在空二進位項目上拋出錯誤,而且 Merge 往往會丟棄二進位資料。歡迎加入社群 :waving_hand:

@Yash_Ganthe 抱歉我忘記開啟「包含二進制」模式,我已經修復了。

你可以再檢查一下我的 JSON。很高興能幫助你!希望這能解決你的問題。

I did it in a simpler way. The image received from Whatsapp is successfully uploaded to Google drive. However, the Agent is not able to access it. I have kept the drive images in a public folder and have tried accessing them successfully from other browsers.