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.
352 lines
9.4 KiB
352 lines
9.4 KiB
# GroupChat Swarm Documentation
|
|
|
|
A production-grade multi-agent system enabling sophisticated group conversations between AI agents with customizable speaking patterns, parallel processing capabilities, and comprehensive conversation tracking.
|
|
|
|
## Advanced Configuration
|
|
|
|
### Agent Parameters
|
|
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| agent_name | str | Required | Unique identifier for the agent |
|
|
| system_prompt | str | Required | Role and behavior instructions |
|
|
| llm | Any | Required | Language model instance |
|
|
| max_loops | int | 1 | Maximum conversation turns |
|
|
| autosave | bool | False | Enable conversation saving |
|
|
| dashboard | bool | False | Enable monitoring dashboard |
|
|
| verbose | bool | True | Enable detailed logging |
|
|
| dynamic_temperature | bool | True | Enable dynamic temperature |
|
|
| retry_attempts | int | 1 | Failed request retry count |
|
|
| context_length | int | 200000 | Maximum context window |
|
|
| output_type | str | "string" | Response format type |
|
|
| streaming_on | bool | False | Enable streaming responses |
|
|
|
|
### GroupChat Parameters
|
|
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| name | str | "GroupChat" | Chat group identifier |
|
|
| description | str | "" | Purpose description |
|
|
| agents | List[Agent] | [] | Participating agents |
|
|
| speaker_fn | Callable | round_robin | Speaker selection function |
|
|
| max_loops | int | 10 | Maximum conversation turns |
|
|
|
|
|
|
## Table of Contents
|
|
|
|
- [Installation](#installation)
|
|
- [Core Concepts](#core-concepts)
|
|
- [Basic Usage](#basic-usage)
|
|
- [Advanced Configuration](#advanced-configuration)
|
|
- [Speaker Functions](#speaker-functions)
|
|
- [Response Models](#response-models)
|
|
- [Advanced Examples](#advanced-examples)
|
|
- [API Reference](#api-reference)
|
|
- [Best Practices](#best-practices)
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
pip3 install swarms swarm-models loguru
|
|
```
|
|
|
|
## Core Concepts
|
|
|
|
The GroupChat system consists of several key components:
|
|
|
|
1. **Agents**: Individual AI agents with specialized knowledge and roles
|
|
2. **Speaker Functions**: Control mechanisms for conversation flow
|
|
3. **Chat History**: Structured conversation tracking
|
|
4. **Response Models**: Pydantic models for data validation
|
|
|
|
## Basic Usage
|
|
|
|
```python
|
|
|
|
import os
|
|
from dotenv import load_dotenv
|
|
from swarm_models import OpenAIChat
|
|
from swarms import Agent, GroupChat, expertise_based
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
load_dotenv()
|
|
|
|
# Get the OpenAI API key from the environment variable
|
|
api_key = os.getenv("OPENAI_API_KEY")
|
|
|
|
# Create an instance of the OpenAIChat class
|
|
model = OpenAIChat(
|
|
openai_api_key=api_key,
|
|
model_name="gpt-4o-mini",
|
|
temperature=0.1,
|
|
)
|
|
|
|
# Example agents
|
|
agent1 = Agent(
|
|
agent_name="Financial-Analysis-Agent",
|
|
system_prompt="You are a financial analyst specializing in investment strategies.",
|
|
llm=model,
|
|
max_loops=1,
|
|
autosave=False,
|
|
dashboard=False,
|
|
verbose=True,
|
|
dynamic_temperature_enabled=True,
|
|
user_name="swarms_corp",
|
|
retry_attempts=1,
|
|
context_length=200000,
|
|
output_type="string",
|
|
streaming_on=False,
|
|
)
|
|
|
|
agent2 = Agent(
|
|
agent_name="Tax-Adviser-Agent",
|
|
system_prompt="You are a tax adviser who provides clear and concise guidance on tax-related queries.",
|
|
llm=model,
|
|
max_loops=1,
|
|
autosave=False,
|
|
dashboard=False,
|
|
verbose=True,
|
|
dynamic_temperature_enabled=True,
|
|
user_name="swarms_corp",
|
|
retry_attempts=1,
|
|
context_length=200000,
|
|
output_type="string",
|
|
streaming_on=False,
|
|
)
|
|
|
|
agents = [agent1, agent2]
|
|
|
|
chat = GroupChat(
|
|
name="Investment Advisory",
|
|
description="Financial and tax analysis group",
|
|
agents=agents,
|
|
speaker_fn=expertise_based,
|
|
)
|
|
|
|
history = chat.run(
|
|
"How to optimize tax strategy for investments?"
|
|
)
|
|
print(history.model_dump_json(indent=2))
|
|
|
|
```
|
|
|
|
## Speaker Functions
|
|
|
|
|
|
### Built-in Functions
|
|
|
|
```python
|
|
def round_robin(history: List[str], agent: Agent) -> bool:
|
|
"""
|
|
Enables agents to speak in turns.
|
|
Returns True for each agent in sequence.
|
|
"""
|
|
return True
|
|
|
|
def expertise_based(history: List[str], agent: Agent) -> bool:
|
|
"""
|
|
Enables agents to speak based on their expertise.
|
|
Returns True if agent's role matches conversation context.
|
|
"""
|
|
return agent.system_prompt.lower() in history[-1].lower() if history else True
|
|
|
|
def random_selection(history: List[str], agent: Agent) -> bool:
|
|
"""
|
|
Randomly selects speaking agents.
|
|
Returns True/False with 50% probability.
|
|
"""
|
|
import random
|
|
return random.choice([True, False])
|
|
|
|
def most_recent(history: List[str], agent: Agent) -> bool:
|
|
"""
|
|
Enables agents to respond to their mentions.
|
|
Returns True if agent was last speaker.
|
|
"""
|
|
return agent.agent_name == history[-1].split(":")[0].strip() if history else True
|
|
```
|
|
|
|
### Custom Speaker Function Example
|
|
|
|
```python
|
|
def custom_speaker(history: List[str], agent: Agent) -> bool:
|
|
"""
|
|
Custom speaker function with complex logic.
|
|
|
|
Args:
|
|
history: Previous conversation messages
|
|
agent: Current agent being evaluated
|
|
|
|
Returns:
|
|
bool: Whether agent should speak
|
|
"""
|
|
# No history - let everyone speak
|
|
if not history:
|
|
return True
|
|
|
|
last_message = history[-1].lower()
|
|
|
|
# Check for agent expertise keywords
|
|
expertise_relevant = any(
|
|
keyword in last_message
|
|
for keyword in agent.expertise_keywords
|
|
)
|
|
|
|
# Check for direct mentions
|
|
mentioned = agent.agent_name.lower() in last_message
|
|
|
|
# Check if agent hasn't spoken recently
|
|
not_recent_speaker = not any(
|
|
agent.agent_name in msg
|
|
for msg in history[-3:]
|
|
)
|
|
|
|
return expertise_relevant or mentioned or not_recent_speaker
|
|
|
|
# Usage
|
|
chat = GroupChat(
|
|
agents=[agent1, agent2],
|
|
speaker_fn=custom_speaker
|
|
)
|
|
```
|
|
|
|
## Response Models
|
|
|
|
### Complete Schema
|
|
|
|
```python
|
|
class AgentResponse(BaseModel):
|
|
"""Individual agent response in a conversation turn"""
|
|
agent_name: str
|
|
role: str
|
|
message: str
|
|
timestamp: datetime = Field(default_factory=datetime.now)
|
|
turn_number: int
|
|
preceding_context: List[str] = Field(default_factory=list)
|
|
|
|
class ChatTurn(BaseModel):
|
|
"""Single turn in the conversation"""
|
|
turn_number: int
|
|
responses: List[AgentResponse]
|
|
task: str
|
|
timestamp: datetime = Field(default_factory=datetime.now)
|
|
|
|
class ChatHistory(BaseModel):
|
|
"""Complete conversation history"""
|
|
turns: List[ChatTurn]
|
|
total_messages: int
|
|
name: str
|
|
description: str
|
|
start_time: datetime = Field(default_factory=datetime.now)
|
|
```
|
|
|
|
## Advanced Examples
|
|
|
|
### Multi-Agent Analysis Team
|
|
|
|
```python
|
|
# Create specialized agents
|
|
data_analyst = Agent(
|
|
agent_name="Data-Analyst",
|
|
system_prompt="You analyze numerical data and patterns",
|
|
llm=model
|
|
)
|
|
|
|
market_expert = Agent(
|
|
agent_name="Market-Expert",
|
|
system_prompt="You provide market insights and trends",
|
|
llm=model
|
|
)
|
|
|
|
strategy_advisor = Agent(
|
|
agent_name="Strategy-Advisor",
|
|
system_prompt="You formulate strategic recommendations",
|
|
llm=model
|
|
)
|
|
|
|
# Create analysis team
|
|
analysis_team = GroupChat(
|
|
name="Market Analysis Team",
|
|
description="Comprehensive market analysis group",
|
|
agents=[data_analyst, market_expert, strategy_advisor],
|
|
speaker_fn=expertise_based,
|
|
max_loops=15
|
|
)
|
|
|
|
# Run complex analysis
|
|
history = analysis_team.run("""
|
|
Analyze the current market conditions:
|
|
1. Identify key trends
|
|
2. Evaluate risks
|
|
3. Recommend investment strategy
|
|
""")
|
|
```
|
|
|
|
### Parallel Processing
|
|
|
|
```python
|
|
# Define multiple analysis tasks
|
|
tasks = [
|
|
"Analyze tech sector trends",
|
|
"Evaluate real estate market",
|
|
"Review commodity prices",
|
|
"Assess global economic indicators"
|
|
]
|
|
|
|
# Run tasks concurrently
|
|
histories = chat.concurrent_run(tasks)
|
|
|
|
# Process results
|
|
for task, history in zip(tasks, histories):
|
|
print(f"\nAnalysis for: {task}")
|
|
for turn in history.turns:
|
|
for response in turn.responses:
|
|
print(f"{response.agent_name}: {response.message}")
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Agent Design**
|
|
- Give agents clear, specific roles
|
|
- Use detailed system prompts
|
|
- Set appropriate context lengths
|
|
- Enable retries for reliability
|
|
|
|
2. **Speaker Functions**
|
|
- Match function to use case
|
|
- Consider conversation flow
|
|
- Handle edge cases
|
|
- Add appropriate logging
|
|
|
|
3. **Error Handling**
|
|
- Use try-except blocks
|
|
- Log errors appropriately
|
|
- Implement retry logic
|
|
- Provide fallback responses
|
|
|
|
4. **Performance**
|
|
- Use concurrent processing for multiple tasks
|
|
- Monitor context lengths
|
|
- Implement proper cleanup
|
|
- Cache responses when appropriate
|
|
|
|
## API Reference
|
|
|
|
### GroupChat Methods
|
|
|
|
| Method | Description | Arguments | Returns |
|
|
|--------|-------------|-----------|---------|
|
|
| run | Run single conversation | task: str | ChatHistory |
|
|
| batched_run | Run multiple sequential tasks | tasks: List[str] | List[ChatHistory] |
|
|
| concurrent_run | Run multiple parallel tasks | tasks: List[str] | List[ChatHistory] |
|
|
| get_recent_messages | Get recent messages | n: int = 3 | List[str] |
|
|
|
|
### Agent Methods
|
|
|
|
| Method | Description | Returns |
|
|
|--------|-------------|---------|
|
|
| run | Process single task | str |
|
|
| generate_response | Generate LLM response | str |
|
|
| save_context | Save conversation context | None | |