diff --git a/groupchat.py b/groupchat.py new file mode 100644 index 00000000..71dbe7ac --- /dev/null +++ b/groupchat.py @@ -0,0 +1,46 @@ +from swarms.swarms.groupchat import GroupChat +from langchain.llms import OpenAIChat +from swarms import Worker + +llm = OpenAIChat( + model_name='gpt-4', + openai_api_key="api-key", + temperature=0.5 +) + +Worker1 = Worker( + llm=llm, + ai_name="Optimus Prime", + ai_role="Worker in a swarm", + external_tools=None, + human_in_the_loop=False, + temperature=0.5, +) + +Worker2 = Worker( + llm=llm, + ai_name="Optimus Prime", + ai_role="Worker in a swarm", + external_tools=None, + human_in_the_loop=False, + temperature=0.5, +) + +workers = [Worker1, Worker2] +messages = [ + { + "role": "system", + "context": f"Read the above conversation. Then select the next role from {self.agent_names} to play. Only return the role.", + } +] + +agent = GroupChat( + workers, + messages, + name="groupchat", + max_consecutive_auto_reply=1, + human_input_mode="NEVER", + system_message="Group chat manager", +) + +agent.run(messages, workers) diff --git a/swarms/agents/__init__.py b/swarms/agents/__init__.py index 3b0112c9..648f7a90 100644 --- a/swarms/agents/__init__.py +++ b/swarms/agents/__init__.py @@ -1,15 +1,14 @@ """Agent Infrastructure, models, memory, utils, tools""" -#agents +# agents # from swarms.agents.profitpilot import ProfitPilot # from swarms.agents.aot import AoTAgent # from swarms.agents.multi_modal_visual_agent import MultiModalAgent from swarms.agents.omni_modal_agent import OmniModalAgent - -#utils +# utils from swarms.agents.message import Message from swarms.agents.stream_response import stream -# from swarms.agents.base import AbstractAgent \ No newline at end of file +# from swarms.agents.base import AbstractAgent diff --git a/swarms/swarms/groupchat.py b/swarms/swarms/groupchat.py index 1e66bd49..79cf6944 100644 --- a/swarms/swarms/groupchat.py +++ b/swarms/swarms/groupchat.py @@ -4,6 +4,7 @@ from typing import Dict, List, Optional, Union from swarms.workers.worker import Worker + @dataclass class GroupChat: """A group chat with multiple participants with a list of workers and a max number of rounds""" @@ -11,7 +12,11 @@ class GroupChat: workers: List[Worker] messages: List[Dict] max_rounds: int = 10 +<<<<<<< Updated upstream admin_name: str = "Admin" #admin worker +======= + admin_name: str = "Admin" # admin agent +>>>>>>> Stashed changes @property def worker_names(self) -> List[str]: @@ -20,17 +25,24 @@ class GroupChat: def reset(self): self.messages.clear() +<<<<<<< Updated upstream def worker_by_name(self, name: str) -> Worker: """Find the next speaker baed on the message""" return self.workers[self.worker_names.index(name)] +======= + + def agent_by_name(self, name: str) -> Worker: + """Find the next speaker baed on the message""" + return self.agents[self.agent_names.index(name)] +>>>>>>> Stashed changes def next_worker(self, worker: Worker) -> Worker: """Returns the next worker in the list""" return self.workers[ (self.workers_names.index(worker.ai_name) + 1) % len(self.workers) ] - + def select_speaker_msg(self): """Return the message to select the next speaker""" @@ -41,7 +53,7 @@ class GroupChat: Read the following conversation then select the next role from {self.worker_names} to play and only return the role """ - + def select_speaker( self, last_speaker: Worker, @@ -67,17 +79,16 @@ class GroupChat: def _participant_roles(self): return "\n".join( - [f"{worker.ai_name}: {worker.system_message}" for worker in self.workers] + [f"{agent.ai_name}: {agent.system_message}" for agent in self.workers] ) - class GroupChatManager(Worker): def __init__( self, groupchat: GroupChat, name: Optional[str] = "chat_manager", - #unlimited auto reply + # unlimited auto reply max_consecutive_auto_reply: Optional[int] = sys.maxsize, human_input_mode: Optional[str] = "NEVER", system_message: Optional[str] = "Group chat manager", @@ -103,18 +114,18 @@ class GroupChatManager(Worker): sender: Optional[Worker] = None, config: Optional[GroupChat] = None, ) -> Union[str, Dict, None]: - #run + # run if messages is None: messages = [] - + message = messages[-1] speaker = sender groupchat = config for i in range(groupchat.max_rounds): if message["role"] != "function": - message["name"]= speaker.ai_name - + message["name"] = speaker.ai_name + groupchat.messages.append(message) #broadcast the message to all workers except the speaker @@ -130,11 +141,11 @@ class GroupChatManager(Worker): break try: - #select next speaker + # select next speaker speaker = groupchat.select_speaker(speaker, self) - #let the speaker speak + # let the speaker speak reply = speaker.generate_reply(sender=self) - + except KeyboardInterrupt: #let the admin speak if interrupted if groupchat.admin_name in groupchat.worker_names: @@ -142,12 +153,12 @@ class GroupChatManager(Worker): speaker = groupchat.worker_by_name(groupchat.admin_name) reply = speaker.generate_reply(sender=self) else: - #admin worker is not found in particpants + #admin agent is not found in particpants raise if reply is None: break - #speaker sends message without requesting a reply + # speaker sends message without requesting a reply speaker.send( reply, self,