ホームへ戻る

GitHub Repo

Difyコミュニティ、HTTP配列のシリアライズ不具合を報告 JSONリクエストでデータがひそかに変わる可能性

DifyのHTTP Requestノードについて、Pythonの文字列表現でオブジェクト配列が挿入され、送信前にnull値やオブジェクト構造が変わる可能性が報告された。コミュニティはJSONシリアライズによる修正を提案しているが、まだマージされておらず、正式リリースへの影響範囲は確認されていない。

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

Difyコミュニティは10月3日、再現ケースを報告した。HTTP RequestノードがArray[Object]変数をリクエスト本文に埋め込む際、上流データとは異なる内容を送信する可能性があり、エラーも発生しないという。報告では、セルフホストのソースコードデプロイ環境が示され、バージョン欄には1.17.1とmainのコミット8222397が記載されている。この情報だけでは、すべての1.17.1デプロイで同じ挙動が起きるとは判断できない。問題報告

このケースでは、まずCodeノードでブール値、null値、シングルクォートを含む文字列を含む2つのオブジェクトを生成し、その配列をHTTPリクエストのJSON本文に挿入する。報告された出力では、2つ目のオブジェクトが1つ目のオブジェクトの文字列フィールドに連結されていた。さらに簡略化したケースでは、nullが文字列"None"に変わった。raw-textに切り替えるとPython形式のまま残り、有効なJSONとしては使えない。再現コードと出力

報告では、原因は変数を文字列に変換する処理にあるとしている。オブジェクト配列にstr(value)を使うことで、シングルクォート、True、Noneが生成され、実行器がそれをテンプレートに貼り付ける。その後、JSONの経路ではrepair_jsonを通るため、解析可能ではあっても意味が変わったデータになる可能性がある。つまり、「リクエストが正常に送信された」ことだけでは、データの完全性を確認できない。技術分析

公式ドキュメントでは、HTTP Requestはワークフローから外部APIに接続するノードとされており、上流変数の動的な挿入と、JSONやRaw Textなどの本文形式に対応している。検索結果やモデルが整理したオブジェクト配列を別のサービスに送るワークフローでは、受信側のフィールド型と配列長を照合するようエンジニアに促す事例といえる。ただし、これは報告内容から導いたデプロイ時の確認案であり、この種のワークフローすべてが影響を受けることを示す証拠はない。公式ドキュメント

同日、Graphon向けの修正案が提出され、ArrayObjectSegment.textでjson.dumpsを使うよう変更している。提案者によると、再現テストと26項目の変数テストは追加され、すべて成功した。しかし確認時点で提案はオープンのままで、レビュー記録もない。今後は、マージ状況、Difyが修正を取り込むバージョン、そして空配列が依然として空文字列を出力する境界ケースを追う必要がある。修正提案

出典

  1. HTTP Request node: array[object] variables are inserted as Python repr, corrupting the request body
  2. fix: serialize array object segment text as JSON
  3. HTTP Request — Dify Docs