|
|
|
import os
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
from swarm_models import OpenAIChat
|
|
|
|
from swarms.structs.agent import Agent
|
|
|
|
from swarms.structs.groupchat import GroupChat, expertise_based
|
|
|
|
|
|
|
|
|
|
|
|
def setup_test_agents():
|
|
|
|
model = OpenAIChat(
|
|
|
|
openai_api_key=os.getenv("OPENAI_API_KEY"),
|
|
|
|
model_name="gpt-4",
|
|
|
|
temperature=0.1,
|
|
|
|
)
|
|
|
|
|
|
|
|
return [
|
|
|
|
Agent(
|
|
|
|
agent_name="Agent1",
|
|
|
|
system_prompt="You only respond with 'A'",
|
|
|
|
llm=model,
|
|
|
|
),
|
|
|
|
Agent(
|
|
|
|
agent_name="Agent2",
|
|
|
|
system_prompt="You only respond with 'B'",
|
|
|
|
llm=model,
|
|
|
|
),
|
|
|
|
Agent(
|
|
|
|
agent_name="Agent3",
|
|
|
|
system_prompt="You only respond with 'C'",
|
|
|
|
llm=model,
|
|
|
|
),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_round_robin_speaking():
|
|
|
|
chat = GroupChat(agents=setup_test_agents())
|
|
|
|
history = chat.run("Say your letter")
|
|
|
|
|
|
|
|
# Verify agents speak in order
|
|
|
|
responses = [
|
|
|
|
r.message for t in history.turns for r in t.responses
|
|
|
|
]
|
|
|
|
assert responses == ["A", "B", "C"] * (len(history.turns))
|
|
|
|
|
|
|
|
|
|
|
|
def test_concurrent_processing():
|
|
|
|
chat = GroupChat(agents=setup_test_agents())
|
|
|
|
tasks = ["Task1", "Task2", "Task3"]
|
|
|
|
histories = chat.concurrent_run(tasks)
|
|
|
|
|
|
|
|
assert len(histories) == len(tasks)
|
|
|
|
for history in histories:
|
|
|
|
assert history.total_messages > 0
|
|
|
|
|
|
|
|
|
|
|
|
def test_expertise_based_speaking():
|
|
|
|
agents = setup_test_agents()
|
|
|
|
chat = GroupChat(agents=agents, speaker_fn=expertise_based)
|
|
|
|
|
|
|
|
# Test each agent's expertise trigger
|
|
|
|
for agent in agents:
|
|
|
|
history = chat.run(f"Trigger {agent.system_prompt}")
|
|
|
|
first_response = history.turns[0].responses[0]
|
|
|
|
assert first_response.agent_name == agent.agent_name
|
|
|
|
|
|
|
|
|
|
|
|
def test_max_loops_limit():
|
|
|
|
max_loops = 3
|
|
|
|
chat = GroupChat(agents=setup_test_agents(), max_loops=max_loops)
|
|
|
|
history = chat.run("Test message")
|
|
|
|
|
|
|
|
assert len(history.turns) == max_loops
|
|
|
|
|
|
|
|
|
|
|
|
def test_error_handling():
|
|
|
|
broken_agent = Agent(
|
|
|
|
agent_name="BrokenAgent",
|
|
|
|
system_prompt="You raise errors",
|
|
|
|
llm=None,
|
|
|
|
)
|
|
|
|
|
|
|
|
chat = GroupChat(agents=[broken_agent])
|
|
|
|
history = chat.run("Trigger error")
|
|
|
|
|
|
|
|
assert "Error" in history.turns[0].responses[0].message
|
|
|
|
|
|
|
|
|
|
|
|
def test_conversation_context():
|
|
|
|
agents = setup_test_agents()
|
|
|
|
complex_prompt = "Previous message refers to A. Now trigger B. Finally discuss C."
|
|
|
|
|
|
|
|
chat = GroupChat(agents=agents, speaker_fn=expertise_based)
|
|
|
|
history = chat.run(complex_prompt)
|
|
|
|
|
|
|
|
responses = [
|
|
|
|
r.agent_name for t in history.turns for r in t.responses
|
|
|
|
]
|
|
|
|
assert all(agent.agent_name in responses for agent in agents)
|
|
|
|
|
|
|
|
|
|
|
|
def test_large_agent_group():
|
|
|
|
large_group = setup_test_agents() * 5 # 15 agents
|
|
|
|
chat = GroupChat(agents=large_group)
|
|
|
|
history = chat.run("Test scaling")
|
|
|
|
|
|
|
|
assert history.total_messages > len(large_group)
|
|
|
|
|
|
|
|
|
|
|
|
def test_long_conversations():
|
|
|
|
chat = GroupChat(agents=setup_test_agents(), max_loops=50)
|
|
|
|
history = chat.run("Long conversation test")
|
|
|
|
|
|
|
|
assert len(history.turns) == 50
|
|
|
|
assert history.total_messages > 100
|
|
|
|
|
|
|
|
|
|
|
|
def test_stress_batched_runs():
|
|
|
|
chat = GroupChat(agents=setup_test_agents())
|
|
|
|
tasks = ["Task"] * 100
|
|
|
|
histories = chat.batched_run(tasks)
|
|
|
|
|
|
|
|
assert len(histories) == len(tasks)
|
|
|
|
total_messages = sum(h.total_messages for h in histories)
|
|
|
|
assert total_messages > len(tasks) * 3
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
load_dotenv()
|
|
|
|
|
|
|
|
functions = [
|
|
|
|
test_round_robin_speaking,
|
|
|
|
test_concurrent_processing,
|
|
|
|
test_expertise_based_speaking,
|
|
|
|
test_max_loops_limit,
|
|
|
|
test_error_handling,
|
|
|
|
test_conversation_context,
|
|
|
|
test_large_agent_group,
|
|
|
|
test_long_conversations,
|
|
|
|
test_stress_batched_runs,
|
|
|
|
]
|
|
|
|
|
|
|
|
for func in functions:
|
|
|
|
try:
|
|
|
|
print(f"Running {func.__name__}...")
|
|
|
|
func()
|
|
|
|
print("✓ Passed")
|
|
|
|
except Exception as e:
|
|
|
|
print(f"✗ Failed: {str(e)}")
|