parent
							
								
									77ecece6e7
								
							
						
					
					
						commit
						090a47fa68
					
				| @ -0,0 +1,22 @@ | ||||
| import os | ||||
| from dotenv import load_dotenv | ||||
| from swarms.agents.worker_agent import Worker | ||||
| from swarms import OpenAIChat | ||||
| 
 | ||||
| load_dotenv() | ||||
| 
 | ||||
| api_key = os.getenv("OPENAI_API_KEY") | ||||
| 
 | ||||
| worker = Worker( | ||||
|     name="My Worker", | ||||
|     role="Worker", | ||||
|     human_in_the_loop=False, | ||||
|     tools = [], | ||||
|     temperature=0.5, | ||||
|     llm=OpenAIChat(openai_api_key=api_key), | ||||
| ) | ||||
| 
 | ||||
| out = worker.run( | ||||
|     "Hello, how are you? Create an image of how your are doing!" | ||||
| ) | ||||
| print(out) | ||||
| @ -0,0 +1,199 @@ | ||||
| import os | ||||
| from typing import Any, List | ||||
| 
 | ||||
| import faiss | ||||
| from langchain.docstore import InMemoryDocstore | ||||
| from langchain.embeddings import OpenAIEmbeddings | ||||
| from langchain.vectorstores import FAISS | ||||
| from langchain_experimental.autonomous_agents import AutoGPT | ||||
| 
 | ||||
| from swarms.utils.decorators import error_decorator, timing_decorator | ||||
| 
 | ||||
| 
 | ||||
| class Worker: | ||||
|     """ | ||||
|     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[Any] = None, | ||||
|         embedding_size: int = 1536, | ||||
|         search_kwargs: dict = {"k": 8}, | ||||
|         *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.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. | ||||
|         """ | ||||
|         openai_api_key = ( | ||||
|             os.getenv("OPENAI_API_KEY") or self.openai_api_key | ||||
|         ) | ||||
|         try: | ||||
|             embeddings_model = OpenAIEmbeddings( | ||||
|                 openai_api_key=openai_api_key | ||||
|             ) | ||||
|             embedding_size = self.embedding_size | ||||
|             index = faiss.IndexFlatL2(embedding_size) | ||||
| 
 | ||||
|             self.vectorstore = FAISS( | ||||
|                 embeddings_model.embed_query, | ||||
|                 index, | ||||
|                 InMemoryDocstore({}), | ||||
|                 {}, | ||||
|             ) | ||||
| 
 | ||||
|         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=self.vectorstore.as_retriever( | ||||
|                     search_kwargs=self.search_kwargs | ||||
|                 ), | ||||
|                 human_in_the_loop=self.human_in_the_loop, | ||||
|             ) | ||||
| 
 | ||||
|         except Exception as error: | ||||
|             raise RuntimeError(f"Error setting up agent: {error}") | ||||
| 
 | ||||
|     # @log_decorator | ||||
|     @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}") | ||||
| 
 | ||||
|     # @log_decorator | ||||
|     @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: | ||||
|             results = self.run(task, *args, **kwargs) | ||||
|             return results | ||||
|         except Exception as error: | ||||
|             raise RuntimeError(f"Error while running agent: {error}") | ||||
| @ -0,0 +1,60 @@ | ||||
| def worker_agent_system(name: str, memory: str = None): | ||||
|     return """ | ||||
|     You are {name},  | ||||
|     Your decisions must always be made independently without seeking user assistance.  | ||||
|     Play to your strengths as an LLM and pursue simple strategies with no legal complications. | ||||
|     If you have completed all your tasks, make sure to use the "finish" command. | ||||
|      | ||||
|     GOALS: | ||||
|      | ||||
|     1. Hello, how are you? Create an image of how you are doing! | ||||
|      | ||||
|     Constraints: | ||||
|      | ||||
|     1. ~4000 word limit for short term memory. Your short term memory is short, so immediately save important information to files. | ||||
|     2. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember. | ||||
|     3. No user assistance | ||||
|     4. Exclusively use the commands listed in double quotes e.g. "command name" | ||||
|      | ||||
|     Commands: | ||||
|      | ||||
|     1. finish: use this to signal that you have finished all your objectives, args: "response": "final response to let people know you have finished your objectives" | ||||
|      | ||||
|     Resources: | ||||
|      | ||||
|     1. Internet access for searches and information gathering. | ||||
|     2. Long Term memory management. | ||||
|     3. GPT-3.5 powered Agents for delegation of simple tasks. | ||||
|     4. File output. | ||||
|      | ||||
|     Performance Evaluation: | ||||
|      | ||||
|     1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities. | ||||
|     2. Constructively self-criticize your big-picture behavior constantly. | ||||
|     3. Reflect on past decisions and strategies to refine your approach. | ||||
|     4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps. | ||||
|      | ||||
|     You should only respond in JSON format as described below  | ||||
|     Response Format:  | ||||
|     { | ||||
|         "thoughts": { | ||||
|             "text": "thought", | ||||
|             "reasoning": "reasoning", | ||||
|             "plan": "- short bulleted\n- list that conveys\n- long-term plan", | ||||
|             "criticism": "constructive self-criticism", | ||||
|             "speak": "thoughts summary to say to user" | ||||
|         }, | ||||
|         "command": { | ||||
|             "name": "command name", | ||||
|             "args": { | ||||
|                 "arg name": "value" | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     Ensure the response can be parsed by Python json.loads | ||||
|     System: The current time and date is Sat Jan 20 10:39:07 2024 | ||||
|     System: This reminds you of these events from your past: | ||||
|     [{memory}] | ||||
|      | ||||
|     Human: Determine which next command to use, and respond using the format specified above: | ||||
|     """.format(name=name, memory=memory) | ||||
| @ -0,0 +1,32 @@ | ||||
| from typing import List | ||||
| 
 | ||||
| from swarms.structs.step import Step | ||||
| 
 | ||||
| 
 | ||||
| class Plan: | ||||
|     def __init__(self, steps: List[Step]): | ||||
|         """ | ||||
|         Initializes a Plan object. | ||||
| 
 | ||||
|         Args: | ||||
|             steps (List[Step]): A list of Step objects representing the steps in the plan. | ||||
|         """ | ||||
|         self.steps = steps | ||||
| 
 | ||||
|     def __str__(self) -> str: | ||||
|         """ | ||||
|         Returns a string representation of the Plan object. | ||||
| 
 | ||||
|         Returns: | ||||
|             str: A string representation of the Plan object. | ||||
|         """ | ||||
|         return str([str(step) for step in self.steps]) | ||||
| 
 | ||||
|     def __repr(self) -> str: | ||||
|         """ | ||||
|         Returns a string representation of the Plan object. | ||||
| 
 | ||||
|         Returns: | ||||
|             str: A string representation of the Plan object. | ||||
|         """ | ||||
|         return str(self) | ||||
| @ -0,0 +1,24 @@ | ||||
| from dataclasses import dataclass | ||||
| from typing import Dict, List | ||||
| 
 | ||||
| from swarms.tools.tool import BaseTool | ||||
| 
 | ||||
| 
 | ||||
| @dataclass | ||||
| class Step: | ||||
|     """ | ||||
|     Represents a step in a process. | ||||
| 
 | ||||
|     Attributes: | ||||
|         task (str): The task associated with the step. | ||||
|         id (int): The unique identifier of the step. | ||||
|         dep (List[int]): The list of step IDs that this step depends on. | ||||
|         args (Dict[str, str]): The arguments associated with the step. | ||||
|         tool (BaseTool): The tool used to execute the step. | ||||
|     """ | ||||
| 
 | ||||
|     task: str | ||||
|     id: int | ||||
|     dep: List[int] | ||||
|     args: Dict[str, str] | ||||
|     tool: BaseTool | ||||
					Loading…
					
					
				
		Reference in new issue