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..0a7f9fc04f 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 agents == ["module_agent", "valid_agent", "yaml_agent"] + assert "random_folder" not in agents + assert "data" not in agents + assert "tmp" not in agents