diff --git a/src/dify_plugin/entities/tool.py b/src/dify_plugin/entities/tool.py index ef4e0d7a..cdebcb84 100644 --- a/src/dify_plugin/entities/tool.py +++ b/src/dify_plugin/entities/tool.py @@ -15,6 +15,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, @@ -47,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( @@ -130,6 +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, + 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 == []