parent
20a994b62f
commit
5a3fb81b77
@ -1,182 +0,0 @@
|
||||
from typing import List
|
||||
|
||||
from langchain_experimental.autonomous_agents import AutoGPT
|
||||
|
||||
from swarms.structs.agent import Agent
|
||||
from swarms.tools.base_tool import BaseTool
|
||||
from swarms.utils.decorators import error_decorator, timing_decorator
|
||||
|
||||
|
||||
class Worker(Agent):
|
||||
"""
|
||||
The Worker class represents an autonomous agent that can perform tassks through
|
||||
function calls or by running a chat.
|
||||
|
||||
Args:
|
||||
name (str, optional): Name of the agent. Defaults to "Autobot Swarm Worker".
|
||||
role (str, optional): Role of the agent. Defaults to "Worker in a swarm".
|
||||
external_tools (list, optional): List of external tools. Defaults to None.
|
||||
human_in_the_loop (bool, optional): Whether to include human in the loop. Defaults to False.
|
||||
temperature (float, optional): Temperature for the agent. Defaults to 0.5.
|
||||
llm ([type], optional): Language model. Defaults to None.
|
||||
openai_api_key (str, optional): OpenAI API key. Defaults to None.
|
||||
|
||||
Raises:
|
||||
RuntimeError: If there is an error while setting up the agent.
|
||||
|
||||
Example:
|
||||
>>> worker = Worker(
|
||||
... name="My Worker",
|
||||
... role="Worker",
|
||||
... external_tools=[MyTool1(), MyTool2()],
|
||||
... human_in_the_loop=False,
|
||||
... temperature=0.5,
|
||||
... )
|
||||
>>> worker.run("What's the weather in Miami?")
|
||||
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
name: str = "WorkerAgent",
|
||||
role: str = "Worker in a swarm",
|
||||
external_tools=None,
|
||||
human_in_the_loop: bool = False,
|
||||
temperature: float = 0.5,
|
||||
llm=None,
|
||||
openai_api_key: str = None,
|
||||
tools: List[BaseTool] = None,
|
||||
embedding_size: int = 1536,
|
||||
search_kwargs: dict = {"k": 8},
|
||||
verbose: bool = False,
|
||||
memory: callable = None,
|
||||
*args,
|
||||
**kwargs,
|
||||
):
|
||||
self.name = name
|
||||
self.role = role
|
||||
self.external_tools = external_tools
|
||||
self.human_in_the_loop = human_in_the_loop
|
||||
self.temperature = temperature
|
||||
self.llm = llm
|
||||
self.openai_api_key = openai_api_key
|
||||
self.tools = tools
|
||||
self.embedding_size = embedding_size
|
||||
self.search_kwargs = search_kwargs
|
||||
self.verbose = verbose
|
||||
self.memory = memory
|
||||
|
||||
self.setup_tools(external_tools)
|
||||
self.setup_memory()
|
||||
self.setup_agent()
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
Reset the message history.
|
||||
"""
|
||||
self.message_history = []
|
||||
|
||||
def receieve(self, name: str, message: str) -> None:
|
||||
"""
|
||||
Receive a message and update the message history.
|
||||
|
||||
Parameters:
|
||||
- `name` (str): The name of the sender.
|
||||
- `message` (str): The received message.
|
||||
"""
|
||||
self.message_history.append(f"{name}: {message}")
|
||||
|
||||
def send(self) -> str:
|
||||
"""Send message history."""
|
||||
self.agent.run(task=self.message_history)
|
||||
|
||||
def setup_tools(self, external_tools):
|
||||
"""
|
||||
Set up tools for the worker.
|
||||
|
||||
Parameters:
|
||||
- `external_tools` (list): List of external tools (optional).
|
||||
|
||||
Example:
|
||||
```
|
||||
external_tools = [MyTool1(), MyTool2()]
|
||||
worker = Worker(model_name="gpt-4",
|
||||
openai_api_key="my_key",
|
||||
name="My Worker",
|
||||
role="Worker",
|
||||
external_tools=external_tools,
|
||||
human_in_the_loop=False,
|
||||
temperature=0.5)
|
||||
```
|
||||
"""
|
||||
if self.tools is None:
|
||||
self.tools = []
|
||||
|
||||
if external_tools is not None:
|
||||
self.tools.extend(external_tools)
|
||||
|
||||
def setup_memory(self):
|
||||
"""
|
||||
Set up memory for the worker.
|
||||
"""
|
||||
try:
|
||||
self.vectorstore = self.memory
|
||||
|
||||
except Exception as error:
|
||||
raise RuntimeError(
|
||||
"Error setting up memory perhaps try try tuning the"
|
||||
f" embedding size: {error}"
|
||||
)
|
||||
|
||||
def setup_agent(self):
|
||||
"""
|
||||
Set up the autonomous agent.
|
||||
"""
|
||||
try:
|
||||
self.agent = AutoGPT.from_llm_and_tools(
|
||||
ai_name=self.name,
|
||||
ai_role=self.role,
|
||||
tools=self.tools,
|
||||
llm=self.llm,
|
||||
# memory = None,
|
||||
human_in_the_loop=self.human_in_the_loop,
|
||||
)
|
||||
|
||||
except Exception as error:
|
||||
raise RuntimeError(f"Error setting up agent: {error}")
|
||||
|
||||
@error_decorator
|
||||
@timing_decorator
|
||||
def run(self, task: str = None, *args, **kwargs):
|
||||
"""
|
||||
Run the autonomous agent on a given task.
|
||||
|
||||
Parameters:
|
||||
- `task`: The task to be processed.
|
||||
|
||||
Returns:
|
||||
- `result`: The result of the agent's processing.
|
||||
"""
|
||||
try:
|
||||
result = self.agent.run([task], *args, **kwargs)
|
||||
return result
|
||||
except Exception as error:
|
||||
raise RuntimeError(f"Error while running agent: {error}")
|
||||
|
||||
@error_decorator
|
||||
@timing_decorator
|
||||
def __call__(self, task: str = None, *args, **kwargs):
|
||||
"""
|
||||
Make the worker callable to run the agent on a given task.
|
||||
|
||||
Parameters:
|
||||
- `task`: The task to be processed.
|
||||
|
||||
Returns:
|
||||
- `results`: The results of the agent's processing.
|
||||
"""
|
||||
try:
|
||||
result = self.agent.run([task], *args, **kwargs)
|
||||
return result
|
||||
except Exception as error:
|
||||
raise RuntimeError(f"Error while running agent: {error}")
|
@ -0,0 +1,74 @@
|
||||
import pytest
|
||||
from unittest.mock import Mock, patch
|
||||
from swarms.structs.mixture_of_agents import MixtureOfAgents
|
||||
from swarms.structs.agent import Agent
|
||||
from swarms.memory.base_vectordb import BaseVectorDatabase
|
||||
|
||||
|
||||
def test_init():
|
||||
with patch.object(
|
||||
MixtureOfAgents, "agent_check"
|
||||
) as mock_agent_check, patch.object(
|
||||
MixtureOfAgents, "final_agent_check"
|
||||
) as mock_final_agent_check, patch.object(
|
||||
MixtureOfAgents, "swarm_initialization"
|
||||
) as mock_swarm_initialization, patch.object(
|
||||
MixtureOfAgents, "communication_protocol"
|
||||
) as mock_communication_protocol:
|
||||
agents = [Mock(spec=Agent)]
|
||||
final_agent = Mock(spec=Agent)
|
||||
scp = Mock(spec=BaseVectorDatabase)
|
||||
MixtureOfAgents(agents=agents, final_agent=final_agent, scp=scp)
|
||||
mock_agent_check.assert_called_once()
|
||||
mock_final_agent_check.assert_called_once()
|
||||
mock_swarm_initialization.assert_called_once()
|
||||
mock_communication_protocol.assert_called_once()
|
||||
|
||||
|
||||
def test_communication_protocol():
|
||||
agents = [Mock(spec=Agent)]
|
||||
final_agent = Mock(spec=Agent)
|
||||
scp = Mock(spec=BaseVectorDatabase)
|
||||
swarm = MixtureOfAgents(
|
||||
agents=agents, final_agent=final_agent, scp=scp
|
||||
)
|
||||
swarm.communication_protocol()
|
||||
for agent in agents:
|
||||
agent.long_term_memory.assert_called_once_with(scp)
|
||||
|
||||
|
||||
def test_agent_check():
|
||||
final_agent = Mock(spec=Agent)
|
||||
with pytest.raises(TypeError):
|
||||
MixtureOfAgents(agents="not a list", final_agent=final_agent)
|
||||
with pytest.raises(TypeError):
|
||||
MixtureOfAgents(agents=["not an agent"], final_agent=final_agent)
|
||||
|
||||
|
||||
def test_final_agent_check():
|
||||
agents = [Mock(spec=Agent)]
|
||||
with pytest.raises(TypeError):
|
||||
MixtureOfAgents(agents=agents, final_agent="not an agent")
|
||||
|
||||
|
||||
def test_swarm_initialization():
|
||||
with patch("swarms.structs.mixture_of_agents.logger") as mock_logger:
|
||||
agents = [Mock(spec=Agent)]
|
||||
final_agent = Mock(spec=Agent)
|
||||
swarm = MixtureOfAgents(agents=agents, final_agent=final_agent)
|
||||
swarm.swarm_initialization()
|
||||
assert mock_logger.info.call_count == 3
|
||||
|
||||
|
||||
def test_run():
|
||||
with patch("swarms.structs.mixture_of_agents.logger"), patch(
|
||||
"builtins.open", new_callable=Mock
|
||||
) as mock_open:
|
||||
agents = [Mock(spec=Agent)]
|
||||
final_agent = Mock(spec=Agent)
|
||||
swarm = MixtureOfAgents(agents=agents, final_agent=final_agent)
|
||||
swarm.run("task")
|
||||
for agent in agents:
|
||||
agent.run.assert_called_once()
|
||||
final_agent.run.assert_called_once()
|
||||
mock_open.assert_called_once_with(swarm.saved_file_name, "w")
|
Loading…
Reference in new issue