使用 MS SQL 節點搭配 AI Agent 中的 $fromAI() 時出現「Invalid schema for tool: "type: None"」

描述問題/錯誤/問題

描述問題/錯誤/問題
我有一個 AI Agent 節點,附帶了一個 Microsoft SQL 節點作為工具。
SQL 節點在查詢欄位中使用 $fromAI(),以便代理能夠動態建立
查詢。每當代理嘗試調用此工具時,
它都會失敗並出現不良請求錯誤。
錯誤訊息是什麼(如果有的話)?

節點「EXPERTO SQL」中的問題:不良請求 - 請檢查您的參數。
函式「AnalisisAgentes」的架構無效:架構必須是「type: "object"」的 JSON Schema,
得到的是「type: "None"」。
設定

  • 節點:Microsoft SQL(執行查詢),在 AI Agent 內用作工具

  • LLM:Azure OpenAI Chat Model

  • 查詢欄位值:{{ $fromAI('description') }}

  • 工具描述:手動設定
    我已經嘗試過的

  • 更改 $fromAI 參數名稱:{{ $fromAI('sqlQuery', 'SQL to execute', 'string') }}

  • 驗證「工具描述」欄位是否有文字

  • 重啟並重新保存工作流程
    以上都沒有解決錯誤。架構仍然生成為 type: \"None\"
    而不是 type: \"object\",Azure OpenAI 會拒絕此項。
    問題
    是否有已知的修復方法或解決方案來強制 MS SQL 工具節點在 AI Agent 內使用時生成
    有效的 JSON Schema(type: \"object\")?

    image

您的 n8n 設定資訊

  • n8n 版本: 2.20.6(自託管)
  • 資料庫(預設:SQLite):
  • n8n EXECUTIONS_PROCESS 設定(預設:own, main):
  • 執行 n8n 的方式(Docker、npm、n8n cloud、桌面應用程式):npm
  • 作業系統:Windows Server 2019

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

錯誤發生的原因是 $fromAI() 在沒有類型參數的情況下會產生一個包含 "type": null 的架構,而不是有效的 JSON Schema 類型。修正方法:在你的 $fromAI() 呼叫中始終明確指定類型。對於 SQL 查詢字串,應該是:$fromAI('query', 'The SQL query to execute', 'string')。沒有第三個參數,n8n 無法推斷類型,架構驗證就會失敗。另外請確保你沒有用雙層花括號包裝 $fromAI() - 它應該直接在欄位中使用,不使用 {{ }} 語法。

嗨 @nguyenthieutoan,感謝你的回覆!

我按照你提到的兩項更改進行了操作 — 移除了 {{ }} 並明確將類型設定為 'string'。我也試過將工具描述從手動設定切換到自動設定再切回去。但所有情況下的錯誤訊息都完全相同:

Invalid schema for function ‘Microsoft_SQL’: schema must be a JSON Schema of ‘type: “object”’, got ‘type: “None”’。

這是我目前在查詢欄位中的內容:

$fromAI('sqlQuery', 'The SQL query to execute against [CMS].[dbo].[VW_HAGLOG]', 'string')

設定:

  • n8n 版本:2.20.6(自託管,npm,Windows Server 2019)
  • LLM:Azure OpenAI Chat Model
  • 節點:Microsoft SQL(執行查詢),連接為 AI Agent 的工具

無論如何配置,schema 傳送到模型時仍然顯示為 type: "None"。你有其他建議的解決方法嗎?

謝謝!

非常感謝您測試這一切並分享詳細資訊。

鑑於您已經:

  • 移除了 {{ }} 並在查詢欄位中直接呼叫 $fromAI(...)

  • 明確將類型設定為 'string'

  • 嘗試過不同的工具描述模式

而架構仍然顯示為 type: "None",這看起來真的像是 Microsoft SQL 節點在 AI Agent 內公開其工具架構的方式存在限制/錯誤,而不是您這邊的配置問題。

此時我會考慮兩個選項:

  1. 嘗試最小化的 $fromAI
    首先我會快速測試一個非常簡單的版本,像這樣:

    text
    

    {{$fromAI("query")}}

    如果這仍然導致 type: "None",我們可以相當確定這是節點特有的問題,而不是關於 $fromAI 簽名本身的問題。

  2. 切換至子工作流程 + Call n8n Workflow Tool
    對於您想在生產環境中依賴的東西,我會建議:

    • 主工作流程:AI Agent → Call n8n Workflow Tool(作為您的「SQL 執行器」)

    • 子工作流程:Workflow Input Trigger → Microsoft SQL(Execute Query)

    在子工作流程中:

    • 定義像 sqlQuery 這樣的輸入,並將其對應到 MS SQL 查詢欄位

    • 將工作流程輸入設定為由模型自動定義,以便代理程式可以根據工具描述填充它們。

    這樣做您可以:

    • 透過工作流程輸入控制架構,而不是依賴於 MS SQL 節點的工具架構

    • 獲得更好的錯誤處理,如果模型生成錯誤的 SQL,可以傳回更清晰的訊息

    • 輕鬆在其他代理程式/工作流程中重複使用此「SQL 執行器」。

從我這邊來說:您的 $fromAI 使用方式已經有效,剩餘的問題可能在節點/架構層級。在 n8n 推出修復之前,子工作流程 + Call Workflow Tool 模式是我在實際專案中最信任的方法。

選項 1 — 最少的 $fromAI 呼叫

我用最簡單的形式替換了查詢欄位:

$fromAI("query")

出現相同的錯誤:

Invalid schema for function ‘Microsoft_SQL’: schema must be a JSON Schema of ‘type: “object”’, got ‘type: “None”’.

選項 2 — 子工作流 + 呼叫 n8n 工作流工具

我按照你建議的模式構建:

  • 子工作流:執行工作流觸發器(定義 sqlQuery 輸入為字串)→ Microsoft SQL(執行查詢)在查詢欄位中使用 {{ $json.sqlQuery }}。
  • 主工作流:AI 代理 + Azure OpenAI 聊天模型 + 呼叫 n8n 工作流工具,指向子工作流,將 $fromAI('sqlQuery', '...', 'string') 對應到工作流輸入。

錯誤相同,只有函數名稱改變:

Invalid schema for function ‘executeSQL’: schema must be a JSON Schema of ‘type: “object”’, got ‘type: “None”’.

所以相同的 type: "None" 架構問題在完全不同的工具節點上重現(呼叫 n8n 工作流工具而不是 Microsoft SQL)。這排除了 MS SQL 節點作為根本原因,並指向更深層的問題 — 要麼在 n8n 2.20.6 如何為帶有 $fromAI() 參數的工具生成 JSON 架構,要麼在這些架構如何發送到 Azure OpenAI(它的驗證比標準 OpenAI 更嚴格)。

鑑於兩個不同的工具節點產生完全相同的格式不正確的架構,我傾向於認為這是架構生成層中的高級錯誤,而不是配置問題。我已經開設了一個 GitHub 問題,包含所有詳細資訊和重現步驟。

主工作流

子工作流

感謝你對兩個選項進行了如此全面的測試 — 這真的是非常寶貴的數據。

錯誤同時出現在 MS SQL 節點和 Call n8n Workflow Tool 節點上的事實,確認這 不是節點特定的問題。type: "None" 字串是洩漏到 JSON Schema 序列化中的 Python 風格 null — 這是 n8n <= 2.20.x 與 Azure OpenAI 配對時的已知問題,Azure OpenAI 執行的是比標準 OpenAI 端點更嚴格的結構描述驗證。

根本原因: n8n 的 $fromAI() 結構描述生成器在某些邊界情況下會生成 type: null,但 Azure OpenAI 拒絕任何不是有效 JSON Schema 類型字串的內容。標準 OpenAI 則更寬鬆,通常會忽略它。

確定的解決方案 — 改用 Code 節點作為工具:

與其直接連接 MS SQL 作為工具,改用 Code 節點,該節點:

  1. 從代理接收 SQL 查詢作為硬編碼字串輸入
  2. 透過子工作流程中的 MS SQL 節點執行查詢(如同你已有的做法)
  3. 返回結果

對於「Call n8n Workflow Tool」,關鍵修復是在 Execute Workflow Trigger 節點中將 Workflow Inputs → type 明確設定為 string,然後在 Tool 節點中清楚地設定輸入描述。確保你 沒有在子工作流程觸發器本身使用 $fromAI() — 該欄位應該只使用 {{ $json.sqlQuery }}。

或者,最快的方式:升級到 n8n 2.21+,該版本已修補此結構描述序列化錯誤。

如果現在無法升級,請分享你的 Execute Workflow Trigger 輸入定義螢幕截圖,我可以精確指出 None 在哪裡洩漏。

感謝你的分析,它幫助我知道該往哪個方向尋找。

重要更新:我安裝了最新版本的 n8n,但錯誤仍然完全相同。我找到了官方錯誤報告(n8n 倉庫中的議題 #25276),這清楚地表明更新並不能解決此問題 — 它已在當前版本上確認存在,並且在更新後仍然持續。這也不是 Azure 獨有的:相同的 type: "None" 錯誤也被標準 OpenAI 和 Anthropic 拒絕。根本原因是 n8n 在工具的 input_schema 根部生成了無效的模式,使用 type: "None" 而不是 "object"。

因此,如你所建議的更新到 2.21+ 版本並未解決問題 — 而且從我看到的情況來看,該版本號與此錯誤所在的實際 n8n 版本控制不相符(v2.6.3)。

我現在需要的,這很緊急:你知道有什麼方法可以強制工具模式在根部使用 type: "object" 嗎(某個補丁、設定或中間節點)?我需要工具立即開始工作,降級不是選項。如果有幫助,我可以發給你一張執行工作流程觸發器的螢幕截圖,這樣你可以精確定位 None 是從哪裡洩露出來的。

感謝你深入調查該錯誤報告 - 這確認了這是核心中更深層的 schema 序列化問題,不是單純版本更新就能解決的。

最可靠的解決方案是我之前提到的程式碼節點作為工具的方法。由於程式碼節點不會經過 $fromAI() schema 產生器,就不會有 type: None 洩漏。設定程式碼節點並提供清楚的輸入說明,在程式碼中撰寫 SQL 查詢,然後從子工作流程呼叫 MS SQL 節點。agent 會將查詢作為純字串傳遞,schema 就能保持乾淨。

針對「呼叫 n8n 工作流程工具」路徑 - 確保子工作流程中的「執行工作流程觸發器」將其輸入定義為 string 型別(而非留空)。空白輸入是造成 schema 根目錄出現 type: None 的原因。進入觸發器節點,手動新增一個欄位並將型別設為 string,這樣應該就能解決 schema 拒絕問題,即使沒有 n8n 方面的錯誤修正也行。

更新 — 目前已有修正進行中。

已連結一個提交請求,它解決了根本原因:PR #31681 — fix(Microsoft SQL Node): Allow expressions in the query field(開啟於 2026 年 6 月 3 日,由社群成員編寫)。它與我們回報的問題相關,所以一旦合併並在發布中推出,就會關閉該問題。

提醒各位注意:目前該 PR 已連結/開啟,但尚未合併到穩定版本 — 所以單純更新還不會修正問題。請關注該 PR 和 n8n 更新日誌,等到包含該修正的版本發布後再更新。

暫時可用的解決方案(用於從 AI Agent 使用 MS SQL 節點作為工具):

  1. 在查詢欄位中,直接寫入 $fromAI(),不要包含 {{ }} 包裝:
    $fromAI('sqlQuery', 'SELECT query to run against [DB].[schema].[table]', 'string')
    
    當節點作為工具使用時,n8n 需要原樣解析 $fromAI() 運算式來建立 JSON Schema。將其包裝在 {{ }} 中會導致 schema 輸出為 type: "None" 而不是 "object"。
  2. 將工具描述設定為自動設定,讓 n8n 從聲明的 $fromAI 引數推導 schema。
  3. 確保引號是直引號('),而不是智慧/排版引號 — 那些也會破壞解析。

這種組合會強制產生有效的 type: "object" 根 schema。一旦 #31681 在某個版本中推出,查詢欄位應該能乾淨地接受運算式,就不需要這個解決方案了。