返回首頁

GitHub Repo

Dify 社群提出結構化輸出修補,處理欄位名稱與 Schema 關鍵字衝突

10 月 29 日的 Dify 社群回報指出,特定欄位名稱搭配本地 Schema 引用,可能使代理建立失敗。作者翌日提出修補並公布測試結果,但截至查核時尚未合併。

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

Dify 的結構化輸出層出現一項欄位命名相容性問題。社群於 10 月 29 日針對 main 分支的 dify-agent 回報:當輸出欄位名為 default,且透過 $ref 指向本地 $defs 定義時,建立代理可能拋出 KeyError。相同結構只把欄位改名為 widget,便可正常處理;這使問題定位到 Schema 遍歷,而非模型生成內容。問題回報

JSON Schema 以 $defs 儲存可重用的子結構,再由 $ref 引用,適合多個欄位共用同一物件定義。這些引用具有明確的結構語意;遍歷器必須區分 Schema 關鍵字,以及 properties 內由使用者自訂的欄位名稱。JSON Schema 官方說明

Dify 公開程式碼顯示,輸出層會先展開本地引用,再把 Schema 交給 Pydantic。現有遍歷遇到 default、enum、const 等鍵名時,會保留其值而跳過深入處理。這項規則也套用到欄位名稱映射,因而可能留下未展開的引用,卻移除了根層 $defs,讓後續 Schema 生成失敗。輸出層程式碼

10 月 30 日提出的修補改為依所在位置決定遍歷方式:在 Schema 物件中保留字面資料,在欄位映射中則逐項處理子 Schema。作者回報,新增測試在原版本有 13 項失敗,套用修補後輸出層測試為 33 項全數通過;這些結果尚未獨立重跑,PR 仍等待審查。修補提案與測試

對工程團隊而言,這意味著既有資料契約的欄位名稱,可能影響代理初始化。回報也指出相同路徑會漏查非本地引用,但目前證據不足以推論可觸發外部存取。採用巢狀結構化輸出的團隊,可先用實際 Schema 驗證代理建立流程,並追蹤修補合併及正式版本收錄情況。

來源

  1. Dify issue #45092:Schema 關鍵字欄位名稱造成結構化輸出失敗
  2. Dify PR #45093:修正關鍵字欄位名稱下的引用解析
  3. Dify 結構化輸出層原始碼
  4. JSON Schema:模組化結構與引用