From 7c4889f5c94ed096f431c7347df5a3855b9f7200 Mon Sep 17 00:00:00 2001 From: Lucas Gomide Date: Wed, 14 May 2025 11:37:48 -0300 Subject: [PATCH] Enhance Agent repository feedback & fix Tool auto-import (#2829) * fix: fix tool auto-import from agent repository * feat: enhance error message when agent is not found --- src/crewai/utilities/agent_utils.py | 11 ++++++++--- tests/agent_test.py | 23 ++++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/crewai/utilities/agent_utils.py b/src/crewai/utilities/agent_utils.py index 907020520..e580c26ce 100644 --- a/src/crewai/utilities/agent_utils.py +++ b/src/crewai/utilities/agent_utils.py @@ -441,6 +441,11 @@ def load_agent_from_repository(from_repository: str) -> Dict[str, Any]: client = PlusAPI(api_key=get_auth_token()) response = client.get_agent(from_repository) + if response.status_code == 404: + raise AgentRepositoryError( + f"Agent {from_repository} does not exist, make sure the name is correct or the agent is available on your organization" + ) + if response.status_code != 200: raise AgentRepositoryError( f"Agent {from_repository} could not be loaded: {response.text}" @@ -450,14 +455,14 @@ def load_agent_from_repository(from_repository: str) -> Dict[str, Any]: for key, value in agent.items(): if key == "tools": attributes[key] = [] - for tool_name in value: + for tool in value: try: module = importlib.import_module("crewai_tools") - tool_class = getattr(module, tool_name) + tool_class = getattr(module, tool["name"]) attributes[key].append(tool_class()) except Exception as e: raise AgentRepositoryError( - f"Tool {tool_name} could not be loaded: {e}" + f"Tool {tool['name']} could not be loaded: {e}" ) from e else: attributes[key] = value diff --git a/tests/agent_test.py b/tests/agent_test.py index 8cd2c075c..800860c9f 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -2044,7 +2044,7 @@ def test_agent_from_repository(mock_get_agent, mock_get_auth_token): "role": "test role", "goal": "test goal", "backstory": "test backstory", - "tools": ["SerperDevTool"], + "tools": [{"name": "SerperDevTool"}], } mock_get_agent.return_value = mock_get_response agent = Agent(from_repository="test_agent") @@ -2066,7 +2066,7 @@ def test_agent_from_repository_override_attributes(mock_get_agent, mock_get_auth "role": "test role", "goal": "test goal", "backstory": "test backstory", - "tools": ["SerperDevTool"], + "tools": [{"name": "SerperDevTool"}], } mock_get_agent.return_value = mock_get_response agent = Agent(from_repository="test_agent", role="Custom Role") @@ -2086,7 +2086,7 @@ def test_agent_from_repository_with_invalid_tools(mock_get_agent, mock_get_auth_ "role": "test role", "goal": "test goal", "backstory": "test backstory", - "tools": ["DoesNotExist"], + "tools": [{"name": "DoesNotExist"}], } mock_get_agent.return_value = mock_get_response with pytest.raises( @@ -2096,6 +2096,19 @@ def test_agent_from_repository_with_invalid_tools(mock_get_agent, mock_get_auth_ Agent(from_repository="test_agent") +@patch("crewai.cli.plus_api.PlusAPI.get_agent") +def test_agent_from_repository_internal_error(mock_get_agent, mock_get_auth_token): + mock_get_response = MagicMock() + mock_get_response.status_code = 500 + mock_get_response.text = "Internal server error" + mock_get_agent.return_value = mock_get_response + with pytest.raises( + AgentRepositoryError, + match="Agent test_agent could not be loaded: Internal server error", + ): + Agent(from_repository="test_agent") + + @patch("crewai.cli.plus_api.PlusAPI.get_agent") def test_agent_from_repository_agent_not_found(mock_get_agent, mock_get_auth_token): mock_get_response = MagicMock() @@ -2104,6 +2117,6 @@ def test_agent_from_repository_agent_not_found(mock_get_agent, mock_get_auth_tok mock_get_agent.return_value = mock_get_response with pytest.raises( AgentRepositoryError, - match="Agent NOT_FOUND could not be loaded: Agent not found", + match="Agent test_agent does not exist, make sure the name is correct or the agent is available on your organization", ): - Agent(from_repository="NOT_FOUND") + Agent(from_repository="test_agent")