Skip to content

Commit d991976

Browse files
committed
fix(tools): hide skill script tool when no scripts exist
1 parent e6df097 commit d991976

2 files changed

Lines changed: 44 additions & 1 deletion

File tree

src/google/adk/tools/skill_toolset.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ def _build_skill_system_instruction(prefix: str | None = None) -> str:
105105
)
106106

107107

108+
def _skill_has_scripts(skill: models.Skill) -> bool:
109+
"""Returns whether a skill exposes at least one executable script."""
110+
resources = getattr(skill, "resources", None)
111+
if resources is None:
112+
return False
113+
return bool(resources.list_scripts())
114+
115+
108116
class ListSkillsTool(BaseTool):
109117
"""Tool to list all available skills."""
110118

@@ -1037,8 +1045,11 @@ def __init__(
10371045
ListSkillsTool(self),
10381046
LoadSkillTool(self),
10391047
LoadSkillResourceTool(self),
1040-
RunSkillScriptTool(self),
10411048
]
1049+
if self._registry or any(
1050+
_skill_has_scripts(skill) for skill in self._skills.values()
1051+
):
1052+
self._tools.append(RunSkillScriptTool(self))
10421053
if self._registry:
10431054
self._tools.append(SearchSkillsTool(self))
10441055

tests/unittests/tools/test_skill_toolset.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,38 @@ async def test_get_tools(mock_skill1, mock_skill2):
225225
assert isinstance(tools[3], skill_toolset.RunSkillScriptTool)
226226

227227

228+
@pytest.mark.asyncio
229+
async def test_get_tools_excludes_run_skill_script_when_no_skill_has_scripts(
230+
mock_skill2,
231+
):
232+
toolset = skill_toolset.SkillToolset([mock_skill2])
233+
234+
tools = await toolset.get_tools()
235+
236+
assert [tool.name for tool in tools] == [
237+
"list_skills",
238+
"load_skill",
239+
"load_skill_resource",
240+
]
241+
assert not any(
242+
isinstance(tool, skill_toolset.RunSkillScriptTool) for tool in tools
243+
)
244+
245+
246+
@pytest.mark.asyncio
247+
async def test_get_tools_includes_run_skill_script_when_any_skill_has_scripts(
248+
mock_skill1,
249+
mock_skill2,
250+
):
251+
toolset = skill_toolset.SkillToolset([mock_skill2, mock_skill1])
252+
253+
tools = await toolset.get_tools()
254+
255+
assert any(
256+
isinstance(tool, skill_toolset.RunSkillScriptTool) for tool in tools
257+
)
258+
259+
228260
@pytest.mark.asyncio
229261
async def test_resolve_additional_tools_from_state_none(mock_skill1):
230262
toolset = skill_toolset.SkillToolset([mock_skill1])

0 commit comments

Comments
 (0)