You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.5 KiB
154 lines
5.5 KiB
import os
|
|
|
|
import yaml
|
|
from dotenv import load_dotenv
|
|
from loguru import logger
|
|
from swarm_models import OpenAIChat
|
|
|
|
from swarms.structs.agent import Agent
|
|
|
|
load_dotenv()
|
|
|
|
|
|
# Function to create and optionally run agents from a YAML file
|
|
def create_agents_from_yaml(
|
|
yaml_file: str, return_type: str = "agents", *args, **kwargs
|
|
):
|
|
"""
|
|
Create agents based on configurations defined in a YAML file.
|
|
If a 'task' is provided in the YAML, the agent will execute the task after creation.
|
|
|
|
Args:
|
|
yaml_file (str): Path to the YAML file containing agent configurations.
|
|
return_type (str): Determines the return value. "agents" to return agent list,
|
|
"tasks" to return task results, "both" to return both agents and tasks.
|
|
*args: Additional positional arguments for agent customization.
|
|
**kwargs: Additional keyword arguments for agent customization.
|
|
|
|
Returns:
|
|
List[Agent] or List[Task Results] or Tuple(List[Agent], List[Task Results])
|
|
"""
|
|
logger.info(f"Checking if the YAML file {yaml_file} exists...")
|
|
|
|
# Check if the YAML file exists
|
|
if not os.path.exists(yaml_file):
|
|
logger.error(f"YAML file {yaml_file} not found.")
|
|
raise FileNotFoundError(f"YAML file {yaml_file} not found.")
|
|
|
|
# Load the YAML configuration
|
|
logger.info(f"Loading YAML file {yaml_file}")
|
|
with open(yaml_file, "r") as file:
|
|
config = yaml.safe_load(file)
|
|
|
|
# Ensure agents key exists
|
|
if "agents" not in config:
|
|
logger.error(
|
|
"The YAML configuration does not contain 'agents'."
|
|
)
|
|
raise ValueError(
|
|
"The YAML configuration does not contain 'agents'."
|
|
)
|
|
|
|
# List to store created agents and task results
|
|
agents = []
|
|
task_results = []
|
|
|
|
# Iterate over each agent configuration and create agents
|
|
for agent_config in config["agents"]:
|
|
logger.info(f"Creating agent: {agent_config['agent_name']}")
|
|
|
|
# Get the OpenAI API key from environment or YAML config
|
|
api_key = (
|
|
os.getenv("OPENAI_API_KEY")
|
|
or agent_config["model"]["openai_api_key"]
|
|
)
|
|
|
|
# Create an instance of OpenAIChat model
|
|
model = OpenAIChat(
|
|
openai_api_key=api_key,
|
|
model_name=agent_config["model"]["model_name"],
|
|
temperature=agent_config["model"]["temperature"],
|
|
max_tokens=agent_config["model"]["max_tokens"],
|
|
*args,
|
|
**kwargs, # Pass any additional arguments to the model
|
|
)
|
|
|
|
# Ensure the system prompt is provided
|
|
if "system_prompt" not in agent_config:
|
|
logger.error(
|
|
f"System prompt is missing for agent: {agent_config['agent_name']}"
|
|
)
|
|
raise ValueError(
|
|
f"System prompt is missing for agent: {agent_config['agent_name']}"
|
|
)
|
|
|
|
# Initialize the agent using the configuration
|
|
agent = Agent(
|
|
agent_name=agent_config["agent_name"],
|
|
system_prompt=agent_config["system_prompt"],
|
|
llm=model,
|
|
max_loops=agent_config.get("max_loops", 1),
|
|
autosave=agent_config.get("autosave", True),
|
|
dashboard=agent_config.get("dashboard", False),
|
|
verbose=agent_config.get("verbose", False),
|
|
dynamic_temperature_enabled=agent_config.get(
|
|
"dynamic_temperature_enabled", False
|
|
),
|
|
saved_state_path=agent_config.get("saved_state_path"),
|
|
user_name=agent_config.get("user_name", "default_user"),
|
|
retry_attempts=agent_config.get("retry_attempts", 1),
|
|
context_length=agent_config.get("context_length", 100000),
|
|
return_step_meta=agent_config.get(
|
|
"return_step_meta", False
|
|
),
|
|
output_type=agent_config.get("output_type", "str"),
|
|
*args,
|
|
**kwargs, # Pass any additional arguments to the agent
|
|
)
|
|
|
|
logger.info(
|
|
f"Agent {agent_config['agent_name']} created successfully."
|
|
)
|
|
agents.append(agent)
|
|
|
|
# Check if a task is provided, and if so, run the agent
|
|
task = agent_config.get("task")
|
|
if task:
|
|
logger.info(
|
|
f"Running task '{task}' with agent {agent_config['agent_name']}"
|
|
)
|
|
try:
|
|
output = agent.run(task)
|
|
logger.info(
|
|
f"Output for agent {agent_config['agent_name']}: {output}"
|
|
)
|
|
task_results.append(
|
|
{
|
|
"agent_name": agent_config["agent_name"],
|
|
"task": task,
|
|
"output": output,
|
|
}
|
|
)
|
|
except Exception as e:
|
|
logger.error(
|
|
f"Error running task for agent {agent_config['agent_name']}: {e}"
|
|
)
|
|
task_results.append(
|
|
{
|
|
"agent_name": agent_config["agent_name"],
|
|
"task": task,
|
|
"error": str(e),
|
|
}
|
|
)
|
|
|
|
# Return results based on the `return_type`
|
|
if return_type == "agents":
|
|
return agents
|
|
elif return_type == "tasks":
|
|
return task_results
|
|
elif return_type == "both":
|
|
return agents, task_results
|
|
else:
|
|
logger.error(f"Invalid return_type: {return_type}")
|
|
raise ValueError(f"Invalid return_type: {return_type}")
|