Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/dify_plugin/entities/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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":
Expand Down
38 changes: 38 additions & 0 deletions tests/entities/test_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 == []