Custom API tool sends `true` for boolean request-body properties given the string "false"

オープン 初心者向け
#42,350 コメント 1 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
88/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
api, backend

調査の方向性

api/core/tools/custom_tool/tool.py の _convert_body_property_type から始め、その boolean の処理を _convert_body_property_any_of と比較します。api/tests/unit_tests/core/tools/test_custom_tool.py で _build_tool を使ってこのケースを再現し、文字列形式の boolean 値が期待されるリクエストボディの値を生成する一方で、認識されない文字列はリモート検証に利用できる状態で残ることを確認します。

索引モデルが issue の本文から書いたものです。

説明

Self Checks
  • I have read the Contributing Guide and Language Policy.
  • This is only for bug report, if you would like to ask a question, please head to Discussions.
  • I have searched for existing issues search for existing issues, including closed ones.
  • I confirm that I am using English to submit this report, otherwise it will be closed.
  • 【中文用户 & Non English User】请使用英语提交,否则会被关闭 :)
  • Please do not modify this template :) and fill in all the required fields.
Dify version

1.17.1 (main, 38f9d85)

Cloud or Self Hosted

Self Hosted (Source)

Steps to reproduce

ApiTool._convert_body_property_type (api/core/tools/custom_tool/tool.py:359) converts a request-body property declared as type: boolean with return bool(value). In Python bool("false") is True, so when the value arrives as the string "false" (or "0") the tool serializes true into the JSON body. The sibling _convert_body_property_any_of (tool.py:326-332) already parses boolean strings correctly, so the plain type: boolean path behaves differently from an anyOf schema for the same property.

Reachable path: ApiToolManageService.test_api_tool_previewApiTool.validate_credentialsdo_http_request, where the parameters arrive as raw strings and are never cast to the declared types.

  1. Create a custom (OpenAPI) tool whose request body has "enabled": {"type": "boolean"}.
  2. Test the tool in the console with enabled set to false.
  3. Inspect the request body the target API receives.

Minimal unit reproduction:

tool = _build_tool()  # helper from api/tests/unit_tests/core/tools/test_custom_tool.py
assert tool._convert_body_property_type({"type": "boolean"}, "false") is False  # fails: returns True

tool.do_http_request(url, "POST", headers={}, parameters={"enabled": "false"})
# outgoing JSON body is {"enabled": true}
✔️ Expected Behavior

"false" / "0" are sent as false, "true" / "1" as true, exactly as the anyOf branch in the same file already does; unrecognized strings are passed through for the remote API to validate.

❌ Actual Behavior

The request body contains "enabled": true — the opposite of what was submitted. A flag meant to disable something is sent as enabled.

主要言語
TypeScript
スター
157k
フォーク
24.7k
平均マージ
22時間 32分
マージ済み PR(30日)
611

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

langgenius/dify のほかの issue

langgenius/dify の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。