返回首頁

GitHub Repo

Dify 社群回報 OpenAPI 參數繼承缺陷,自訂工具可能送出錯誤路徑

路徑層級的共用參數可能在匯入時遺失,Swagger 格式還可能直接遭拒。原始碼與規格可交叉核對成因,但修補發布與完整影響範圍仍待確認。

The original uploader was Ggia at Greek Wikipedia. · CC BY-SA 2.5 · Image source
zh-Hant

Dify 社群於 9 月 26 日回報,自訂工具匯入 OpenAPI 文件時,會漏掉宣告在路徑層級的共用參數。案例來自標示為 1.17.1 的自架原始碼環境,並附主分支提交資訊與最小重現規格;截至查核時,議題仍開啟。[問題回報](https://github.com/langgenius/dify/issues/42994)

案例把 `user_id` 放在 `/users/{user_id}` 下的 `parameters`,而非 GET 操作內。回報指出,生成的工具沒有該輸入欄位,請求路徑也保留變數括號,未代入提供的值。改用 Swagger 2.0 格式時,則把 `parameters` 誤當成操作,因缺少 `operationId` 而拒絕匯入。[重現細節](https://github.com/langgenius/dify/issues/42994)

這種宣告方式符合 OpenAPI 3.0 規格:路徑層級參數適用於該路徑的所有操作;操作可以覆寫參數,但不能將它移除。判定是否為同一參數,必須同時比較名稱與位置,因此修補不能只把兩份清單直接串接,還須處理覆寫與重複項目。[OpenAPI 規格](https://spec.openapis.org/oas/v3.0.0.html#path-item-object)

檢視 Dify 1.17.1 的解析器可見,建立工具時只取各 HTTP 操作中的參數,沒有先合併路徑層級定義;Swagger 轉換流程則遍歷路徑物件的所有鍵,直接要求每個項目具備操作識別碼。這兩段實作與回報描述相符。[版本原始碼](https://github.com/langgenius/dify/blob/1.17.1/api/core/tools/utils/parser.py)

Dify 官方文件說明,匯入 OpenAPI 規格會自動生成工具介面,供工作流程與代理呼叫外部服務。據此判斷,這項缺陷可能讓合法的企業 API 定義在接入代理時遺失必要輸入;排查重點應包含轉換後的欄位與實際 HTTP 請求,不能只看模型是否選對工具。[工具文件](https://docs.dify.ai/en/cloud/use-dify/workspace/tools)

工程團隊可先以測試端點比對路徑層級與操作層級兩種宣告,確認欄位生成和參數替換是否一致。依規格設計回歸案例時,也應涵蓋同名但位置不同的參數,以及操作覆寫共用定義後的型別與必填設定。若多個工具共用同一份規格,還應逐一驗證各操作,避免單一端點測試通過就推定整份定義相容。

回報者表示已有修補與回歸測試,但本次未能確認合併或正式版發布狀態。現有證據也不足以界定所有受影響版本及雲端部署;後續應追蹤維護者確認、修補測試與發布紀錄。[議題狀態](https://github.com/langgenius/dify/issues/42994)

來源

  1. Custom tools ignore parameters declared on an OpenAPI path item — Issue #42994
  2. Dify 1.17.1 — API tool schema parser
  3. OpenAPI Specification v3.0.0 — Path Item Object
  4. Dify Tools