Custom API tool sends `true` for boolean request-body properties given the string "false"
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 88/100
調査の方向性
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_preview → ApiTool.validate_credentials → do_http_request, where the parameters arrive as raw strings and are never cast to the declared types.
- Create a custom (OpenAPI) tool whose request body has
"enabled": {"type": "boolean"}. - Test the tool in the console with
enabledset tofalse. - 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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
langgenius/dify のほかの issue
-
Annotation Reply: a stored score threshold of 0.0 is silently replaced with 1, disabling the feature オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
langgenius/dify#42639 · コメント 1 件 · リアクション 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
langgenius/dify#42468 · コメント 1 件 · リアクション 1 件 ·
-
🐞 bug
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
langgenius/dify#42446 · リアクション 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
langgenius/dify#42355 · コメント 1 件 · リアクション 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
langgenius/dify#42326 · コメント 1 件 · リアクション 1 件 ·
langgenius/dify の issue をすべて見る
似ている issue
-
calcite-components needs triage refactor
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
Esri/calcite-design-system#15203 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 91/100
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
難易度 1/5 1時間未満 初心者へのやさしさ 95/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
Automattic/studio#4908 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 90/100