parent
c07356dfc3
commit
7578353d63
@ -0,0 +1,136 @@
|
|||||||
|
# Interactive GroupChat Example
|
||||||
|
|
||||||
|
This is an example of the InteractiveGroupChat module in swarms. [Click here for full documentation](https://docs.swarms.world/en/latest/swarms/structs/interactive_groupchat/)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can get started by first installing swarms with the following command, or [click here for more detailed installation instructions](https://docs.swarms.world/en/latest/swarms/install/install/):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip3 install -U swarms
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
```txt
|
||||||
|
OPENAI_API_KEY=""
|
||||||
|
ANTHROPIC_API_KEY=""
|
||||||
|
GROQ_API_KEY=""
|
||||||
|
```
|
||||||
|
|
||||||
|
# Code
|
||||||
|
|
||||||
|
|
||||||
|
## Interactive Session in Terminal
|
||||||
|
|
||||||
|
```python
|
||||||
|
from swarms import Agent
|
||||||
|
from swarms.structs.interactive_groupchat import InteractiveGroupChat
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Initialize agents
|
||||||
|
financial_advisor = Agent(
|
||||||
|
agent_name="FinancialAdvisor",
|
||||||
|
system_prompt="You are a financial advisor specializing in investment strategies and portfolio management.",
|
||||||
|
random_models_on=True,
|
||||||
|
output_type="final",
|
||||||
|
)
|
||||||
|
|
||||||
|
tax_expert = Agent(
|
||||||
|
agent_name="TaxExpert",
|
||||||
|
system_prompt="You are a tax expert who provides guidance on tax optimization and compliance.",
|
||||||
|
random_models_on=True,
|
||||||
|
output_type="final",
|
||||||
|
)
|
||||||
|
|
||||||
|
investment_analyst = Agent(
|
||||||
|
agent_name="InvestmentAnalyst",
|
||||||
|
system_prompt="You are an investment analyst focusing on market trends and investment opportunities.",
|
||||||
|
random_models_on=True,
|
||||||
|
output_type="final",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a list of agents including both Agent instances and callables
|
||||||
|
agents = [
|
||||||
|
financial_advisor,
|
||||||
|
tax_expert,
|
||||||
|
investment_analyst,
|
||||||
|
]
|
||||||
|
|
||||||
|
# Initialize another chat instance in interactive mode
|
||||||
|
interactive_chat = InteractiveGroupChat(
|
||||||
|
name="Interactive Financial Advisory Team",
|
||||||
|
description="An interactive team of financial experts providing comprehensive financial advice",
|
||||||
|
agents=agents,
|
||||||
|
max_loops=1,
|
||||||
|
output_type="all",
|
||||||
|
interactive=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Start the interactive session
|
||||||
|
print("\nStarting interactive session...")
|
||||||
|
# interactive_chat.run("What is the best methodology to accumulate gold and silver commodities, and what is the best long-term strategy to accumulate them?")
|
||||||
|
interactive_chat.start_interactive_session()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"An error occurred in interactive mode: {e}")
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Run Method // Manual Method
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
from swarms import Agent
|
||||||
|
from swarms.structs.interactive_groupchat import InteractiveGroupChat
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Initialize agents
|
||||||
|
financial_advisor = Agent(
|
||||||
|
agent_name="FinancialAdvisor",
|
||||||
|
system_prompt="You are a financial advisor specializing in investment strategies and portfolio management.",
|
||||||
|
random_models_on=True,
|
||||||
|
output_type="final",
|
||||||
|
)
|
||||||
|
|
||||||
|
tax_expert = Agent(
|
||||||
|
agent_name="TaxExpert",
|
||||||
|
system_prompt="You are a tax expert who provides guidance on tax optimization and compliance.",
|
||||||
|
random_models_on=True,
|
||||||
|
output_type="final",
|
||||||
|
)
|
||||||
|
|
||||||
|
investment_analyst = Agent(
|
||||||
|
agent_name="InvestmentAnalyst",
|
||||||
|
system_prompt="You are an investment analyst focusing on market trends and investment opportunities.",
|
||||||
|
random_models_on=True,
|
||||||
|
output_type="final",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a list of agents including both Agent instances and callables
|
||||||
|
agents = [
|
||||||
|
financial_advisor,
|
||||||
|
tax_expert,
|
||||||
|
investment_analyst,
|
||||||
|
]
|
||||||
|
|
||||||
|
# Initialize another chat instance in interactive mode
|
||||||
|
interactive_chat = InteractiveGroupChat(
|
||||||
|
name="Interactive Financial Advisory Team",
|
||||||
|
description="An interactive team of financial experts providing comprehensive financial advice",
|
||||||
|
agents=agents,
|
||||||
|
max_loops=1,
|
||||||
|
output_type="all",
|
||||||
|
interactive=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Start the interactive session
|
||||||
|
print("\nStarting interactive session...")
|
||||||
|
# interactive_chat.run("What is the best methodology to accumulate gold and silver commodities, and what is the best long-term strategy to accumulate them?")
|
||||||
|
interactive_chat.run('@TaxExpert how can I understand tax tactics for crypto payroll in solana?')
|
||||||
|
except Exception as e:
|
||||||
|
print(f"An error occurred in interactive mode: {e}")
|
||||||
|
```
|
@ -0,0 +1,164 @@
|
|||||||
|
from pydantic import BaseModel, Field
|
||||||
|
from typing import Optional, List, Dict, Any, Union, Literal
|
||||||
|
|
||||||
|
SwarmType = Literal[
|
||||||
|
"AgentRearrange",
|
||||||
|
"MixtureOfAgents",
|
||||||
|
"SpreadSheetSwarm",
|
||||||
|
"SequentialWorkflow",
|
||||||
|
"ConcurrentWorkflow",
|
||||||
|
"GroupChat",
|
||||||
|
"MultiAgentRouter",
|
||||||
|
"AutoSwarmBuilder",
|
||||||
|
"HiearchicalSwarm",
|
||||||
|
"auto",
|
||||||
|
"MajorityVoting",
|
||||||
|
"MALT",
|
||||||
|
"DeepResearchSwarm",
|
||||||
|
"CouncilAsAJudge",
|
||||||
|
"InteractiveGroupChat",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class AgentSpec(BaseModel):
|
||||||
|
agent_name: Optional[str] = Field(
|
||||||
|
# default=None,
|
||||||
|
description="The unique name assigned to the agent, which identifies its role and functionality within the swarm.",
|
||||||
|
)
|
||||||
|
description: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description="A detailed explanation of the agent's purpose, capabilities, and any specific tasks it is designed to perform.",
|
||||||
|
)
|
||||||
|
system_prompt: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description="The initial instruction or context provided to the agent, guiding its behavior and responses during execution.",
|
||||||
|
)
|
||||||
|
model_name: Optional[str] = Field(
|
||||||
|
default="gpt-4o-mini",
|
||||||
|
description="The name of the AI model that the agent will utilize for processing tasks and generating outputs. For example: gpt-4o, gpt-4o-mini, openai/o3-mini",
|
||||||
|
)
|
||||||
|
auto_generate_prompt: Optional[bool] = Field(
|
||||||
|
default=False,
|
||||||
|
description="A flag indicating whether the agent should automatically create prompts based on the task requirements.",
|
||||||
|
)
|
||||||
|
max_tokens: Optional[int] = Field(
|
||||||
|
default=8192,
|
||||||
|
description="The maximum number of tokens that the agent is allowed to generate in its responses, limiting output length.",
|
||||||
|
)
|
||||||
|
temperature: Optional[float] = Field(
|
||||||
|
default=0.5,
|
||||||
|
description="A parameter that controls the randomness of the agent's output; lower values result in more deterministic responses.",
|
||||||
|
)
|
||||||
|
role: Optional[str] = Field(
|
||||||
|
default="worker",
|
||||||
|
description="The designated role of the agent within the swarm, which influences its behavior and interaction with other agents.",
|
||||||
|
)
|
||||||
|
max_loops: Optional[int] = Field(
|
||||||
|
default=1,
|
||||||
|
description="The maximum number of times the agent is allowed to repeat its task, enabling iterative processing if necessary.",
|
||||||
|
)
|
||||||
|
tools_list_dictionary: Optional[List[Dict[Any, Any]]] = Field(
|
||||||
|
default=None,
|
||||||
|
description="A dictionary of tools that the agent can use to complete its task.",
|
||||||
|
)
|
||||||
|
mcp_url: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description="The URL of the MCP server that the agent can use to complete its task.",
|
||||||
|
)
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
arbitrary_types_allowed = True
|
||||||
|
|
||||||
|
|
||||||
|
class AgentCompletion(BaseModel):
|
||||||
|
agent_config: Optional[AgentSpec] = Field(
|
||||||
|
None,
|
||||||
|
description="The configuration of the agent to be completed.",
|
||||||
|
)
|
||||||
|
task: Optional[str] = Field(
|
||||||
|
None, description="The task to be completed by the agent."
|
||||||
|
)
|
||||||
|
history: Optional[Union[Dict[Any, Any], List[Dict[str, str]]]] = (
|
||||||
|
Field(
|
||||||
|
default=None,
|
||||||
|
description="The history of the agent's previous tasks and responses. Can be either a dictionary or a list of message objects.",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
model_config = {
|
||||||
|
"arbitrary_types_allowed": True,
|
||||||
|
"populate_by_name": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Agents(BaseModel):
|
||||||
|
"""Configuration for a collection of agents that work together as a swarm to accomplish tasks."""
|
||||||
|
|
||||||
|
agents: List[AgentSpec] = Field(
|
||||||
|
description="A list containing the specifications of each agent that will participate in the swarm, detailing their roles and functionalities."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class SwarmSpec(BaseModel):
|
||||||
|
name: Optional[str] = Field(
|
||||||
|
None,
|
||||||
|
description="The name of the swarm, which serves as an identifier for the group of agents and their collective task.",
|
||||||
|
max_length=100,
|
||||||
|
)
|
||||||
|
description: Optional[str] = Field(
|
||||||
|
None,
|
||||||
|
description="A comprehensive description of the swarm's objectives, capabilities, and intended outcomes.",
|
||||||
|
)
|
||||||
|
agents: Optional[List[AgentSpec]] = Field(
|
||||||
|
None,
|
||||||
|
description="A list of agents or specifications that define the agents participating in the swarm.",
|
||||||
|
)
|
||||||
|
max_loops: Optional[int] = Field(
|
||||||
|
default=1,
|
||||||
|
description="The maximum number of execution loops allowed for the swarm, enabling repeated processing if needed.",
|
||||||
|
)
|
||||||
|
swarm_type: Optional[SwarmType] = Field(
|
||||||
|
None,
|
||||||
|
description="The classification of the swarm, indicating its operational style and methodology.",
|
||||||
|
)
|
||||||
|
rearrange_flow: Optional[str] = Field(
|
||||||
|
None,
|
||||||
|
description="Instructions on how to rearrange the flow of tasks among agents, if applicable.",
|
||||||
|
)
|
||||||
|
task: Optional[str] = Field(
|
||||||
|
None,
|
||||||
|
description="The specific task or objective that the swarm is designed to accomplish.",
|
||||||
|
)
|
||||||
|
img: Optional[str] = Field(
|
||||||
|
None,
|
||||||
|
description="An optional image URL that may be associated with the swarm's task or representation.",
|
||||||
|
)
|
||||||
|
return_history: Optional[bool] = Field(
|
||||||
|
True,
|
||||||
|
description="A flag indicating whether the swarm should return its execution history along with the final output.",
|
||||||
|
)
|
||||||
|
rules: Optional[str] = Field(
|
||||||
|
None,
|
||||||
|
description="Guidelines or constraints that govern the behavior and interactions of the agents within the swarm.",
|
||||||
|
)
|
||||||
|
tasks: Optional[List[str]] = Field(
|
||||||
|
None,
|
||||||
|
description="A list of tasks that the swarm should complete.",
|
||||||
|
)
|
||||||
|
messages: Optional[
|
||||||
|
Union[List[Dict[Any, Any]], Dict[Any, Any]]
|
||||||
|
] = Field(
|
||||||
|
None,
|
||||||
|
description="A list of messages that the swarm should complete.",
|
||||||
|
)
|
||||||
|
stream: Optional[bool] = Field(
|
||||||
|
False,
|
||||||
|
description="A flag indicating whether the swarm should stream its output.",
|
||||||
|
)
|
||||||
|
service_tier: Optional[str] = Field(
|
||||||
|
"standard",
|
||||||
|
description="The service tier to use for processing. Options: 'standard' (default) or 'flex' for lower cost but slower processing.",
|
||||||
|
)
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
arbitrary_types_allowed = True
|
@ -1,242 +0,0 @@
|
|||||||
from typing import List, Callable
|
|
||||||
|
|
||||||
from swarms.structs.agent import Agent
|
|
||||||
from swarms.utils.loguru_logger import logger
|
|
||||||
from swarms.structs.base_swarm import BaseSwarm
|
|
||||||
from swarms.structs.conversation import Conversation
|
|
||||||
|
|
||||||
|
|
||||||
# def select_next_speaker_bid(
|
|
||||||
# step: int,
|
|
||||||
# agents: List[Agent],
|
|
||||||
# ) -> int:
|
|
||||||
# """Selects the next speaker."""
|
|
||||||
# bids = []
|
|
||||||
# for agent in agents:
|
|
||||||
# bid = ask_for_bid(agent)
|
|
||||||
# bids.append(bid)
|
|
||||||
# max_value = max(bids)
|
|
||||||
# max_indices = [i for i, x in enumerate(bids) if x == max_value]
|
|
||||||
# idx = random.choice(max_indices)
|
|
||||||
# return idx
|
|
||||||
|
|
||||||
|
|
||||||
def select_next_speaker_roundtable(
|
|
||||||
step: int, agents: List[Agent]
|
|
||||||
) -> int:
|
|
||||||
"""Selects the next speaker."""
|
|
||||||
return step % len(agents)
|
|
||||||
|
|
||||||
|
|
||||||
def select_next_speaker_director(
|
|
||||||
step: int, agents: List[Agent], director: Agent
|
|
||||||
) -> int:
|
|
||||||
# if the step if even => director
|
|
||||||
# => director selects next speaker
|
|
||||||
if step % 2 == 1:
|
|
||||||
idx = 0
|
|
||||||
else:
|
|
||||||
idx = director.select_next_speaker() + 1
|
|
||||||
return idx
|
|
||||||
|
|
||||||
|
|
||||||
def run_director(self, task: str):
|
|
||||||
"""Runs the multi-agent collaboration with a director."""
|
|
||||||
n = 0
|
|
||||||
self.reset()
|
|
||||||
self.inject("Debate Moderator", task)
|
|
||||||
print("(Debate Moderator): \n")
|
|
||||||
|
|
||||||
while n < self.max_loops:
|
|
||||||
name, message = self.step()
|
|
||||||
print(f"({name}): {message}\n")
|
|
||||||
n += 1
|
|
||||||
|
|
||||||
|
|
||||||
# [MAYBE]: Add type hints
|
|
||||||
class MultiAgentCollaboration(BaseSwarm):
|
|
||||||
"""
|
|
||||||
Multi-agent collaboration class.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
agents (List[Agent]): The agents in the collaboration.
|
|
||||||
selection_function (callable): The function that selects the next speaker.
|
|
||||||
Defaults to select_next_speaker.
|
|
||||||
max_loops (int): The maximum number of iterations. Defaults to 10.
|
|
||||||
autosave (bool): Whether to autosave the state of all agents. Defaults to True.
|
|
||||||
saved_file_path_name (str): The path to the saved file. Defaults to
|
|
||||||
"multi_agent_collab.json".
|
|
||||||
stopping_token (str): The token that stops the collaboration. Defaults to
|
|
||||||
"<DONE>".
|
|
||||||
results (list): The results of the collaboration. Defaults to [].
|
|
||||||
logger (logging.Logger): The logger. Defaults to logger.
|
|
||||||
logging (bool): Whether to log the collaboration. Defaults to True.
|
|
||||||
|
|
||||||
|
|
||||||
Methods:
|
|
||||||
reset: Resets the state of all agents.
|
|
||||||
inject: Injects a message into the collaboration.
|
|
||||||
inject_agent: Injects an agent into the collaboration.
|
|
||||||
step: Steps through the collaboration.
|
|
||||||
ask_for_bid: Asks an agent for a bid.
|
|
||||||
select_next_speaker: Selects the next speaker.
|
|
||||||
run: Runs the collaboration.
|
|
||||||
format_results: Formats the results of the run method.
|
|
||||||
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
>>> from swarm_models import OpenAIChat
|
|
||||||
>>> from swarms.structs import Agent
|
|
||||||
>>> from swarms.swarms.multi_agent_collab import MultiAgentCollaboration
|
|
||||||
>>>
|
|
||||||
>>> # Initialize the language model
|
|
||||||
>>> llm = OpenAIChat(
|
|
||||||
>>> temperature=0.5,
|
|
||||||
>>> )
|
|
||||||
>>>
|
|
||||||
>>>
|
|
||||||
>>> ## Initialize the workflow
|
|
||||||
>>> agent = Agent(llm=llm, max_loops=1, dashboard=True)
|
|
||||||
>>>
|
|
||||||
>>> # Run the workflow on a task
|
|
||||||
>>> out = agent.run("Generate a 10,000 word blog on health and wellness.")
|
|
||||||
>>>
|
|
||||||
>>> # Initialize the multi-agent collaboration
|
|
||||||
>>> swarm = MultiAgentCollaboration(
|
|
||||||
>>> agents=[agent],
|
|
||||||
>>> max_loops=4,
|
|
||||||
>>> )
|
|
||||||
>>>
|
|
||||||
>>> # Run the multi-agent collaboration
|
|
||||||
>>> swarm.run()
|
|
||||||
>>>
|
|
||||||
>>> # Format the results of the multi-agent collaboration
|
|
||||||
>>> swarm.format_results(swarm.results)
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
name: str = "MultiAgentCollaboration",
|
|
||||||
description: str = "A multi-agent collaboration.",
|
|
||||||
director: Agent = None,
|
|
||||||
agents: List[Agent] = None,
|
|
||||||
select_next_speaker: Callable = None,
|
|
||||||
max_loops: int = 10,
|
|
||||||
autosave: bool = True,
|
|
||||||
saved_file_path_name: str = "multi_agent_collab.json",
|
|
||||||
stopping_token: str = "<DONE>",
|
|
||||||
logging: bool = True,
|
|
||||||
*args,
|
|
||||||
**kwargs,
|
|
||||||
):
|
|
||||||
super().__init__(
|
|
||||||
name=name,
|
|
||||||
description=description,
|
|
||||||
agents=agents,
|
|
||||||
*args,
|
|
||||||
**kwargs,
|
|
||||||
)
|
|
||||||
self.name = name
|
|
||||||
self.description = description
|
|
||||||
self.director = director
|
|
||||||
self.agents = agents
|
|
||||||
self.select_next_speaker = select_next_speaker
|
|
||||||
self._step = 0
|
|
||||||
self.max_loops = max_loops
|
|
||||||
self.autosave = autosave
|
|
||||||
self.saved_file_path_name = saved_file_path_name
|
|
||||||
self.stopping_token = stopping_token
|
|
||||||
self.results = []
|
|
||||||
self.logger = logger
|
|
||||||
self.logging = logging
|
|
||||||
|
|
||||||
# Conversation
|
|
||||||
self.conversation = Conversation(
|
|
||||||
time_enabled=False, *args, **kwargs
|
|
||||||
)
|
|
||||||
|
|
||||||
def default_select_next_speaker(
|
|
||||||
self, step: int, agents: List[Agent]
|
|
||||||
) -> int:
|
|
||||||
"""Default speaker selection function."""
|
|
||||||
return step % len(agents)
|
|
||||||
|
|
||||||
def inject(self, name: str, message: str):
|
|
||||||
"""Injects a message into the multi-agent collaboration."""
|
|
||||||
for agent in self.agents:
|
|
||||||
self.conversation.add(name, message)
|
|
||||||
agent.run(self.conversation.return_history_as_string())
|
|
||||||
self._step += 1
|
|
||||||
|
|
||||||
def step(self) -> str:
|
|
||||||
"""Steps through the multi-agent collaboration."""
|
|
||||||
speaker_idx = self.select_next_speaker(
|
|
||||||
self._step, self.agents
|
|
||||||
)
|
|
||||||
speaker = self.agents[speaker_idx]
|
|
||||||
message = speaker.send()
|
|
||||||
|
|
||||||
for receiver in self.agents:
|
|
||||||
self.conversation.add(speaker.name, message)
|
|
||||||
receiver.run(self.conversation.return_history_as_string())
|
|
||||||
|
|
||||||
self._step += 1
|
|
||||||
|
|
||||||
if self.logging:
|
|
||||||
self.log_step(speaker, message)
|
|
||||||
|
|
||||||
return self.conversation.return_history_as_string()
|
|
||||||
|
|
||||||
def log_step(self, speaker: str, response: str):
|
|
||||||
"""Logs the step of the multi-agent collaboration."""
|
|
||||||
self.logger.info(f"{speaker.name}: {response}")
|
|
||||||
|
|
||||||
def run(self, task: str, *args, **kwargs):
|
|
||||||
"""Runs the multi-agent collaboration."""
|
|
||||||
for _ in range(self.max_loops):
|
|
||||||
result = self.step()
|
|
||||||
if self.autosave:
|
|
||||||
self.save_state()
|
|
||||||
if self.stopping_token in result:
|
|
||||||
break
|
|
||||||
return self.conversation.return_history_as_string()
|
|
||||||
|
|
||||||
# def format_results(self, results):
|
|
||||||
# """Formats the results of the run method"""
|
|
||||||
# formatted_results = "\n".join(
|
|
||||||
# [
|
|
||||||
# f"{result['agent']} responded: {result['response']}"
|
|
||||||
# for result in results
|
|
||||||
# ]
|
|
||||||
# )
|
|
||||||
# return formatted_results
|
|
||||||
|
|
||||||
# def save(self):
|
|
||||||
# """Saves the state of all agents."""
|
|
||||||
# state = {
|
|
||||||
# "step": self._step,
|
|
||||||
# "results": [
|
|
||||||
# {"agent": r["agent"].name, "response": r["response"]}
|
|
||||||
# for r in self.results
|
|
||||||
# ],
|
|
||||||
# }
|
|
||||||
|
|
||||||
# with open(self.saved_file_path_name, "w") as file:
|
|
||||||
# json.dump(state, file)
|
|
||||||
|
|
||||||
# def load(self):
|
|
||||||
# """Loads the state of all agents."""
|
|
||||||
# with open(self.saved_file_path_name) as file:
|
|
||||||
# state = json.load(file)
|
|
||||||
# self._step = state["step"]
|
|
||||||
# self.results = state["results"]
|
|
||||||
# return state
|
|
||||||
|
|
||||||
# def __repr__(self):
|
|
||||||
# return (
|
|
||||||
# f"MultiAgentCollaboration(agents={self.agents},"
|
|
||||||
# f" selection_function={self.select_next_speaker},"
|
|
||||||
# f" max_loops={self.max_loops}, autosave={self.autosave},"
|
|
||||||
# f" saved_file_path_name={self.saved_file_path_name})"
|
|
||||||
# )
|
|
Loading…
Reference in new issue