From 8d3b42c84101df05874e343bb12e2592b5a0f90e Mon Sep 17 00:00:00 2001 From: zyqzyq Date: Thu, 14 May 2026 11:15:34 +0800 Subject: [PATCH 1/2] add show_on to ToolParameter --- src/dify_plugin/entities/tool.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dify_plugin/entities/tool.py b/src/dify_plugin/entities/tool.py index 5fda0019..01403a74 100644 --- a/src/dify_plugin/entities/tool.py +++ b/src/dify_plugin/entities/tool.py @@ -14,6 +14,7 @@ from dify_plugin.entities import I18nObject, ParameterOption from dify_plugin.entities.invoke_message import InvokeMessage from dify_plugin.entities.model.message import PromptMessageTool +from dify_plugin.entities.model.provider import FormShowOnObject from dify_plugin.entities.oauth import OAuthSchema from dify_plugin.entities.provider_config import ( CommonParameterType, @@ -122,6 +123,7 @@ class ToolParameterForm(Enum): options: list[ToolParameterOption] | None = None # MCP object and array type parameters use this field to store the schema input_schema: Mapping[str, Any] | None = None + show_on: list[FormShowOnObject] = Field(default_factory=list) @docs( From 059fd9d09f35c776d539655225260631acf159e7 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Sat, 1 Aug 2026 00:51:34 +0800 Subject: [PATCH 2/2] feat(tool): support conditional parameter visibility --- src/dify_plugin/entities/tool.py | 10 +++++++-- tests/entities/test_tool.py | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/dify_plugin/entities/tool.py b/src/dify_plugin/entities/tool.py index 6705c570..cdebcb84 100644 --- a/src/dify_plugin/entities/tool.py +++ b/src/dify_plugin/entities/tool.py @@ -48,7 +48,10 @@ class ToolIdentity(BaseModel): description="The option of the tool parameter", ) class ToolParameterOption(ParameterOption): - pass + show_on: list[FormShowOnObject] = Field( + default_factory=list, + description="The conditions that control whether the option is shown", + ) @docs( @@ -131,7 +134,10 @@ class ToolParameterForm(Enum): options: list[ToolParameterOption] | None = None # MCP object and array type parameters use this field to store the schema input_schema: Mapping[str, Any] | None = None - show_on: list[FormShowOnObject] = Field(default_factory=list) + show_on: list[FormShowOnObject] = Field( + default_factory=list, + description="The conditions that control whether the parameter is shown", + ) @model_validator(mode="after") def validate_multiple(self) -> "ToolParameter": diff --git a/tests/entities/test_tool.py b/tests/entities/test_tool.py index a0b692eb..b6748708 100644 --- a/tests/entities/test_tool.py +++ b/tests/entities/test_tool.py @@ -44,3 +44,41 @@ def test_tool_parameter_rejects_invalid_multiple_select( "form": "form", **values, }) + + +def test_tool_parameter_preserves_show_on_conditions() -> None: + base = { + "name": "format", + "label": {"en_US": "Format"}, + "human_description": {"en_US": "Output format"}, + "type": "select", + "form": "form", + } + conditions = [{"variable": "mode", "value": "advanced"}] + parameter = ToolParameter.model_validate( + base + | { + "show_on": conditions, + "options": [ + { + "value": "json", + "label": {"en_US": "JSON"}, + "show_on": conditions, + } + ], + } + ) + + assert [condition.model_dump() for condition in parameter.show_on] == conditions + assert parameter.options + assert [ + condition.model_dump() for condition in parameter.options[0].show_on + ] == conditions + assert ToolParameter.model_validate(parameter.model_dump()) == parameter + + defaulted = ToolParameter.model_validate( + base | {"options": [{"value": "text", "label": {"en_US": "Text"}}]} + ) + assert defaulted.show_on == [] + assert defaulted.options + assert defaulted.options[0].show_on == []