From fed397f74590a3f1c3be3bfca96e4967fe38a3e1 Mon Sep 17 00:00:00 2001 From: Lucas Gomide Date: Tue, 13 May 2025 10:51:21 -0300 Subject: [PATCH] refactor: move logic to fetch agent to utilities file (#2822) --- src/crewai/agent.py | 37 ++--------------------------- src/crewai/utilities/agent_utils.py | 34 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/crewai/agent.py b/src/crewai/agent.py index 9a16b7047..77fffc7e1 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -20,12 +20,12 @@ from crewai.tools.agent_tools.agent_tools import AgentTools from crewai.utilities import Converter, Prompts from crewai.utilities.agent_utils import ( get_tool_names, + load_agent_from_repository, parse_tools, render_text_description_and_args, ) from crewai.utilities.constants import TRAINED_AGENTS_DATA_FILE, TRAINING_DATA_FILE from crewai.utilities.converter import generate_model_description -from crewai.utilities.errors import AgentRepositoryError from crewai.utilities.events.agent_events import ( AgentExecutionCompletedEvent, AgentExecutionErrorEvent, @@ -143,42 +143,9 @@ class Agent(BaseAgent): @model_validator(mode="before") def validate_from_repository(cls, v): if v is not None and (from_repository := v.get("from_repository")): - return cls._load_agent_from_repository(from_repository) | v + return load_agent_from_repository(from_repository) | v return v - @classmethod - def _load_agent_from_repository(cls, from_repository: str) -> Dict[str, Any]: - attributes: Dict[str, Any] = {} - if from_repository: - import importlib - - from crewai.cli.authentication.token import get_auth_token - from crewai.cli.plus_api import PlusAPI - - client = PlusAPI(api_key=get_auth_token()) - response = client.get_agent(from_repository) - if response.status_code != 200: - raise AgentRepositoryError( - f"Agent {from_repository} could not be loaded: {response.text}" - ) - - agent = response.json() - for key, value in agent.items(): - if key == "tools": - attributes[key] = [] - for tool_name in value: - try: - module = importlib.import_module("crewai_tools") - 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}" - ) from e - else: - attributes[key] = value - return attributes - @model_validator(mode="after") def post_init_setup(self): self.agent_ops_agent_name = self.role diff --git a/src/crewai/utilities/agent_utils.py b/src/crewai/utilities/agent_utils.py index 8af665140..907020520 100644 --- a/src/crewai/utilities/agent_utils.py +++ b/src/crewai/utilities/agent_utils.py @@ -16,6 +16,7 @@ from crewai.tools.base_tool import BaseTool from crewai.tools.structured_tool import CrewStructuredTool from crewai.tools.tool_types import ToolResult from crewai.utilities import I18N, Printer +from crewai.utilities.errors import AgentRepositoryError from crewai.utilities.exceptions.context_window_exceeding_exception import ( LLMContextLengthExceededException, ) @@ -428,3 +429,36 @@ def show_agent_logs( printer.print( content=f"\033[95m## Final Answer:\033[00m \033[92m\n{formatted_answer.output}\033[00m\n\n" ) + + +def load_agent_from_repository(from_repository: str) -> Dict[str, Any]: + attributes: Dict[str, Any] = {} + if from_repository: + import importlib + + from crewai.cli.authentication.token import get_auth_token + from crewai.cli.plus_api import PlusAPI + + client = PlusAPI(api_key=get_auth_token()) + response = client.get_agent(from_repository) + if response.status_code != 200: + raise AgentRepositoryError( + f"Agent {from_repository} could not be loaded: {response.text}" + ) + + agent = response.json() + for key, value in agent.items(): + if key == "tools": + attributes[key] = [] + for tool_name in value: + try: + module = importlib.import_module("crewai_tools") + 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}" + ) from e + else: + attributes[key] = value + return attributes