Duibonduil's picture
Upload 3 files
297ed13 verified
import os
import importlib
import subprocess
import sys
import traceback
import logging
from typing import List, Dict
from .. import AgentModel
logger = logging.getLogger(__name__)
_agent_cache: Dict[str, AgentModel] = {}
def list_agents() -> List[AgentModel]:
"""
List all cached agents
Returns:
List[AgentModel]: The list of agent models
"""
if len(_agent_cache) == 0:
for m in _list_agents():
_agent_cache[m.id] = m
return _agent_cache
def get_agent(agent_id) -> AgentModel:
"""
Get the agent model by agent name
Args:
agent_id: The name of the agent
Returns:
AgentModel: The agent model
"""
if len(_agent_cache) == 0:
list_agents()
if agent_id not in _agent_cache:
raise Exception(f"Agent {agent_id} not found")
return _agent_cache[agent_id]
def _list_agents() -> List[AgentModel]:
agents_dir = os.path.join(os.getcwd(), "agent_deploy")
if not os.path.exists(agents_dir):
logger.warning(f"Agents directory {agents_dir} does not exist")
return []
if agents_dir not in sys.path:
sys.path.append(agents_dir)
agents = []
for agent_id in os.listdir(agents_dir):
try:
agent_path = os.path.join(agents_dir, agent_id)
if os.path.isdir(agent_path):
requirements_file = os.path.join(agent_path, "requirements.txt")
if os.path.exists(requirements_file):
p = subprocess.Popen(
["pip", "install", "-r", requirements_file],
cwd=agent_path,
)
p.wait()
if p.returncode != 0:
logger.error(
f"Error installing requirements for agent {agent_id}, path {agent_path}"
)
continue
agent_file = os.path.join(agent_path, "agent.py")
if os.path.exists(agent_file):
try:
instance = _get_agent_instance(agent_id)
if hasattr(instance, "name"):
name = instance.name()
else:
name = agent_id
if hasattr(instance, "description"):
description = instance.description()
else:
description = ""
agent_model = AgentModel(
id=agent_id,
name=name,
description=description,
path=agent_path,
instance=instance,
)
agents.append(agent_model)
logger.info(
f"Loaded agent {agent_id} successfully, path {agent_path}"
)
except Exception as e:
logger.error(
f"Error loading agent {agent_id}: {traceback.format_exc()}"
)
continue
else:
logger.warning(f"Agent {agent_id} does not have agent.py file")
except Exception as e:
logger.error(
f"Error loading agent {agent_id}, path {agent_path} : {traceback.format_exc()}"
)
continue
return agents
def _get_agent_instance(agent_name):
try:
agent_module = importlib.import_module(
name=f"{agent_name}.agent",
)
except Exception as e:
msg = f"Error loading agent {agent_name}, cwd:{os.getcwd()}, sys.path:{sys.path}: {traceback.format_exc()}"
logger.error(msg)
raise Exception(msg)
if hasattr(agent_module, "AWorldAgent"):
agent = agent_module.AWorldAgent()
return agent
else:
raise Exception(f"Agent {agent_name} does not have AWorldAgent class")