From 95921e57e3e480bb463f608e002cd4716763e6c4 Mon Sep 17 00:00:00 2001 From: Mark Nawar Date: Sat, 28 Feb 2026 03:43:02 +0200 Subject: [PATCH 1/2] fix: filter non-agent directoris from list_agents() --- src/google/adk/cli/utils/agent_loader.py | 19 +++++--- .../unittests/cli/utils/test_agent_loader.py | 45 +++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/google/adk/cli/utils/agent_loader.py b/src/google/adk/cli/utils/agent_loader.py index 8b5805c5a9..efd24648dc 100644 --- a/src/google/adk/cli/utils/agent_loader.py +++ b/src/google/adk/cli/utils/agent_loader.py @@ -335,13 +335,18 @@ def load_agent(self, agent_name: str) -> Union[BaseAgent, App]: def list_agents(self) -> list[str]: """Lists all agents available in the agent loader (sorted alphabetically).""" base_path = Path.cwd() / self.agents_dir - agent_names = [ - x - for x in os.listdir(base_path) - if os.path.isdir(os.path.join(base_path, x)) - and not x.startswith(".") - and x != "__pycache__" - ] + agent_names = [] + for x in os.listdir(base_path): + if ( + os.path.isdir(os.path.join(base_path, x)) + and not x.startswith(".") + and x != "__pycache__" + ): + try: + self._determine_agent_language(x) + agent_names.append(x) + except ValueError: + continue agent_names.sort() return agent_names diff --git a/tests/unittests/cli/utils/test_agent_loader.py b/tests/unittests/cli/utils/test_agent_loader.py index f3eb33969a..bf1fbad380 100644 --- a/tests/unittests/cli/utils/test_agent_loader.py +++ b/tests/unittests/cli/utils/test_agent_loader.py @@ -993,3 +993,48 @@ def __init__(self): assert len(detailed_list) == 1 assert detailed_list[0]["name"] == agent_name assert not detailed_list[0]["is_computer_use"] + + def test_list_agents_excludes_non_agent_directories(self): + """Test that list_agents filters out directories without agent definitions.""" + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + valid_package = temp_path / "valid_agent" + valid_package.mkdir() + (valid_package / "__init__.py").write_text(dedent(""" + from google.adk.agents.base_agent import BaseAgent + + class ValidAgent(BaseAgent): + def __init__(self): + super().__init__(name="valid_agent") + + root_agent = ValidAgent() + """)) + + valid_module = temp_path / "module_agent" + valid_module.mkdir() + (valid_module / "agent.py").write_text(dedent(""" + from google.adk.agents.base_agent import BaseAgent + + class ModuleAgent(BaseAgent): + def __init__(self): + super().__init__(name="module_agent") + + root_agent = ModuleAgent() + """)) + + valid_yaml = temp_path / "yaml_agent" + valid_yaml.mkdir() + (valid_yaml / "root_agent.yaml").write_text("name: yaml_agent\n") + + (temp_path / "random_folder").mkdir() + (temp_path / "data").mkdir() + (temp_path / "tmp").mkdir() + + loader = AgentLoader(str(temp_path)) + agents = loader.list_agents() + + assert sorted(agents) == ["module_agent", "valid_agent", "yaml_agent"] + assert "random_folder" not in agents + assert "data" not in agents + assert "tmp" not in agents From 14622f3e315e32b375588f6896db781a102cf752 Mon Sep 17 00:00:00 2001 From: Mark Nawar Date: Sat, 28 Feb 2026 04:43:20 +0200 Subject: [PATCH 2/2] [gemini-feedback]- test: assert list order without sorted() to verify alphabetical contract --- tests/unittests/cli/utils/test_agent_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unittests/cli/utils/test_agent_loader.py b/tests/unittests/cli/utils/test_agent_loader.py index bf1fbad380..0a7f9fc04f 100644 --- a/tests/unittests/cli/utils/test_agent_loader.py +++ b/tests/unittests/cli/utils/test_agent_loader.py @@ -1034,7 +1034,7 @@ def __init__(self): loader = AgentLoader(str(temp_path)) agents = loader.list_agents() - assert sorted(agents) == ["module_agent", "valid_agent", "yaml_agent"] + assert agents == ["module_agent", "valid_agent", "yaml_agent"] assert "random_folder" not in agents assert "data" not in agents assert "tmp" not in agents