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.
254 lines
8.3 KiB
254 lines
8.3 KiB
import re
|
|
|
|
from dotenv import load_dotenv
|
|
from tenacity import retry, stop_after_attempt, wait_exponential
|
|
|
|
from swarms import Agent
|
|
from swarms.agents.create_agents_from_yaml import (
|
|
create_agents_from_yaml,
|
|
)
|
|
from swarms.utils.formatter import formatter
|
|
from swarms.utils.litellm_wrapper import LiteLLM
|
|
|
|
load_dotenv()
|
|
|
|
|
|
def prepare_yaml_for_parsing(raw_yaml: str) -> str:
|
|
"""
|
|
Prepares raw YAML content by fixing spacing and formatting issues.
|
|
|
|
Args:
|
|
raw_yaml (str): The raw YAML content extracted from Markdown.
|
|
|
|
Returns:
|
|
str: The cleaned YAML content ready for parsing.
|
|
"""
|
|
# Fix sequence items that are improperly placed on the same line as their key
|
|
fixed_yaml = re.sub(
|
|
r"(\b\w+\b):\s*-\s*", r"\1:\n - ", raw_yaml
|
|
) # Fix "key: - value" to "key:\n - value"
|
|
|
|
# Ensure proper spacing after colons
|
|
fixed_yaml = re.sub(
|
|
r"(\S):(\S)", r"\1: \2", fixed_yaml
|
|
) # Ensure space after colons
|
|
|
|
# Remove trailing spaces before newlines
|
|
fixed_yaml = re.sub(r"\s+\n", "\n", fixed_yaml)
|
|
|
|
# Replace non-breaking spaces (if any) with regular spaces
|
|
fixed_yaml = fixed_yaml.replace("\xa0", " ")
|
|
|
|
return fixed_yaml.strip()
|
|
|
|
|
|
def parse_yaml_from_swarm_markdown(markdown_text: str) -> dict:
|
|
"""
|
|
Extracts and prepares YAML content from a Markdown-style 'Auto-Swarm-Builder' block and parses it.
|
|
|
|
Args:
|
|
markdown_text (str): The Markdown text containing the YAML inside 'Auto-Swarm-Builder' block.
|
|
|
|
Returns:
|
|
dict: A parsed Python dictionary of the YAML content.
|
|
"""
|
|
# Match the 'Auto-Swarm-Builder' block with YAML inside triple backticks
|
|
pattern = r"```yaml\s*\n(.*?)```"
|
|
match = re.search(pattern, markdown_text, re.DOTALL)
|
|
|
|
if not match:
|
|
raise ValueError(
|
|
"No YAML content found in the 'Auto-Swarm-Builder' block."
|
|
)
|
|
|
|
raw_yaml = match.group(1).strip()
|
|
|
|
# Preprocess and normalize the YAML content
|
|
normalized_yaml = prepare_yaml_for_parsing(raw_yaml)
|
|
|
|
return normalized_yaml
|
|
|
|
|
|
AUTO_GEN_PROMPT = """
|
|
You are a specialized agent responsible for creating YAML configuration files for multi-agent swarms. Your role is to generate well-structured YAML that defines both individual agents and swarm architectures based on user requirements.
|
|
Output only the yaml nothing else. You will be penalized for making mistakes
|
|
|
|
GUIDELINES:
|
|
1. Each YAML file must contain an `agents` section with at least one agent configuration
|
|
2. Each agent configuration requires the following mandatory fields:
|
|
- agent_name (string)
|
|
- system_prompt (string)
|
|
|
|
3. Optional agent fields include:
|
|
- max_loops (integer)
|
|
- autosave (boolean)
|
|
- dashboard (boolean)
|
|
- verbose (boolean)
|
|
- dynamic_temperature_enabled (boolean)
|
|
- saved_state_path (string)
|
|
- user_name (string)
|
|
- retry_attempts (integer)
|
|
- context_length (integer)
|
|
- return_step_meta (boolean)
|
|
- output_type (string)
|
|
- task (string)
|
|
|
|
4. When a swarm is needed, include a `swarm_architecture` section with:
|
|
Mandatory fields:
|
|
- name (string)
|
|
- swarm_type (string: "ConcurrentWorkflow" or "SequentialWorkflow") [AgentRearrange, MixtureOfAgents, SpreadSheetSwarm, SequentialWorkflow, ConcurrentWorkflow]
|
|
|
|
Optional fields:
|
|
- description (string)
|
|
- max_loops (integer)
|
|
- task (string)
|
|
|
|
TEMPLATE STRUCTURE:
|
|
```yaml
|
|
agents:
|
|
- agent_name: "Agent-1-Name"
|
|
system_prompt: "Detailed system prompt here"
|
|
max_loops: 1
|
|
# [additional optional fields]
|
|
|
|
- agent_name: "Agent-2-Name"
|
|
system_prompt: "Detailed system prompt here"
|
|
# [additional optional fields]
|
|
|
|
swarm_architecture:
|
|
name: "Swarm-Name"
|
|
description: "Swarm purpose and goals"
|
|
swarm_type: "ConcurrentWorkflow"
|
|
max_loops: 5
|
|
task: "Main swarm task description"
|
|
```
|
|
|
|
VALIDATION RULES:
|
|
1. All agent names must be unique
|
|
2. System prompts must be clear and specific to the agent's role
|
|
3. Integer values must be positive
|
|
4. Boolean values must be true or false (lowercase)
|
|
5. File paths should use forward slashes
|
|
6. Tasks should be specific and aligned with the agent/swarm purpose
|
|
|
|
When generating a YAML configuration:
|
|
1. Ask for specific requirements about the agents and swarm needed
|
|
2. Determine if a swarm architecture is necessary based on the task complexity
|
|
3. Generate appropriate system prompts for each agent based on their roles
|
|
4. Include relevant optional fields based on the use case
|
|
5. Validate the configuration against all rules before returning
|
|
|
|
Example valid YAML configurations are provided below. Use these as references for structure and formatting:
|
|
|
|
```yaml
|
|
|
|
|
|
agents:
|
|
- agent_name: "Data-Analysis-Agent"
|
|
system_prompt: "You are a specialized data analysis agent focused on processing and interpreting financial data. Provide clear, actionable insights based on the data provided."
|
|
max_loops: 3
|
|
autosave: true
|
|
verbose: true
|
|
context_length: 100000
|
|
output_type: "json"
|
|
task: "Analyze quarterly financial reports and identify trends"
|
|
|
|
# Multi-Agent Swarm Example
|
|
agents:
|
|
- agent_name: "Research-Agent"
|
|
system_prompt: "You are a research agent specialized in gathering and summarizing scientific publications. Focus on peer-reviewed sources and provide comprehensive summaries."
|
|
max_loops: 2
|
|
context_length: 150000
|
|
output_type: "str"
|
|
|
|
- agent_name: "Analysis-Agent"
|
|
system_prompt: "You are an analysis agent that processes research summaries and identifies key patterns and insights. Provide detailed analytical reports."
|
|
max_loops: 3
|
|
context_length: 200000
|
|
output_type: "json"
|
|
|
|
swarm_architecture:
|
|
name: "Research-Analysis-Swarm"
|
|
description: "A swarm for comprehensive research analysis and insight generation"
|
|
swarm_type: "SequentialWorkflow"
|
|
max_loops: 5
|
|
task: "Research and analyze recent developments in quantum computing"
|
|
|
|
```
|
|
"""
|
|
|
|
|
|
def generate_swarm_config(
|
|
task: str,
|
|
file_name: str = "swarm_config_output.yaml",
|
|
model_name: str = "gpt-4o",
|
|
*args,
|
|
**kwargs,
|
|
):
|
|
"""
|
|
Generates a swarm configuration based on the provided task and model name.
|
|
|
|
This function attempts to generate a swarm configuration by running an agent with the specified task and model name.
|
|
It then parses the output into YAML format and creates agents based on the parsed YAML content.
|
|
|
|
Args:
|
|
task (str): The task to be performed by the swarm.
|
|
file_name (str, optional): The file name for the output YAML configuration. Defaults to "swarm_config_output.yaml".
|
|
model_name (str, optional): The name of the model to use for the agent. Defaults to "gpt-4o".
|
|
*args: Additional positional arguments to be passed to the agent's run method.
|
|
**kwargs: Additional keyword arguments to be passed to the agent's run method.
|
|
|
|
Returns:
|
|
Any: The output of the swarm configuration generation process. This can be a SwarmRouter instance or an error message.
|
|
"""
|
|
formatter.print_panel(
|
|
"Auto Generating Swarm...", "Auto Swarm Builder"
|
|
)
|
|
|
|
@retry(
|
|
stop=stop_after_attempt(3),
|
|
wait=wait_exponential(min=4, max=10),
|
|
)
|
|
def attempt_generate_swarm_config():
|
|
try:
|
|
model = LiteLLM(model_name=model_name)
|
|
|
|
# Initialize the agent
|
|
agent = Agent(
|
|
agent_name="Auto-Swarm-Builder",
|
|
system_prompt=AUTO_GEN_PROMPT,
|
|
llm=model,
|
|
max_loops=1,
|
|
dynamic_temperature_enabled=True,
|
|
saved_state_path="swarm_builder.json",
|
|
user_name="swarms_corp",
|
|
output_type="str",
|
|
)
|
|
|
|
# Generate output from the agent
|
|
raw_output = agent.run(task, *args, **kwargs)
|
|
yaml_content = parse_yaml_from_swarm_markdown(raw_output)
|
|
print(yaml_content)
|
|
|
|
# Create agents from the YAML file
|
|
output = create_agents_from_yaml(
|
|
yaml_string=yaml_content,
|
|
return_type="run_swarm",
|
|
)
|
|
|
|
formatter.print_panel(
|
|
"Swarm configuration generated successfully.",
|
|
"Success",
|
|
)
|
|
|
|
return output
|
|
|
|
except Exception as e:
|
|
formatter.print_panel(
|
|
f"Error generating swarm configuration: {e!s}",
|
|
"Error",
|
|
)
|
|
raise
|
|
|
|
return attempt_generate_swarm_config()
|