diff --git a/playground/agents/monitoring/agent_ops.py b/playground/agents/monitoring/agent_ops.py index f2dd1489..0d1431d8 100644 --- a/playground/agents/monitoring/agent_ops.py +++ b/playground/agents/monitoring/agent_ops.py @@ -1,26 +1,85 @@ -from swarms import Agent, OpenAIChat +""" +* WORKING -# Initialize the agent -agent = Agent( - agent_name="Accounting Agent", - system_prompt="Generate a financial report for the company's quarterly earnings.", +What this script does: +Multi-Agent run to test AgentOps (https://www.agentops.ai/) + +Requirements: +1. Create an account on https://www.agentops.ai/ and run pip install agentops +2. Add the folowing API key(s) in your .env file: + - OPENAI_API_KEY + - AGENTOPS_API_KEY +3. Go to your agentops dashboard to observe your activity + +""" + +################ Adding project root to PYTHONPATH ################################ +# If you are running playground examples in the project files directly, use this: + +import sys +import os + +sys.path.insert(0, os.getcwd()) + +################ Adding project root to PYTHONPATH ################################ + +from swarms import Agent, OpenAIChat, AgentRearrange + +Treasurer = Agent( + agent_name="Treasurer", + system_prompt="Give your opinion on the cash management.", agent_description=( - "Generate a financial report for the company's quarterly earnings." + "responsible for managing an organization's financial assets and liquidity. They oversee cash management, " + "investment strategies, and financial risk. Key duties include monitoring cash flow, managing bank relationships, " + "ensuring sufficient funds for operations, and optimizing returns on short-term investments. Treasurers also often " + "handle debt management and may be involved in capital raising activities." ), llm=OpenAIChat(), max_loops=1, - autosave=True, - dashboard=False, - streaming_on=True, - verbose=True, - stopping_token="", - interactive=False, - state_save_file_type="json", - saved_state_path="accounting_agent.json", agent_ops_on=True, ) -# Run the Agent on a task -agent.run( - "Generate a financial report for the company's quarterly earnings!" + +CFO = Agent( + agent_name="CFO", + system_prompt="Give your opinion on the financial performance of the company.", + agent_description=( + "the top financial executive in an organization, overseeing all financial operations and strategy. Their role is broader than a treasurer's and includes:\n" + "Financial planning and analysis\n" + "Accounting and financial reporting\n" + "Budgeting and forecasting\n" + "Strategic financial decision-making\n" + "Compliance and risk management\n" + "Investor relations (in public companies)\n" + "Overseeing the finance and accounting departments" + ), + llm=OpenAIChat(), + max_loops=1, + agent_ops_on=True, +) + +swarm = AgentRearrange( + agents=[Treasurer, CFO], + flow="Treasurer -> CFO", ) + +results = swarm.run("Date,Revenue,Expenses,Profit,Cash_Flow,Inventory,Customer_Acquisition_Cost,Customer_Retention_Rate,Marketing_Spend,R&D_Spend,Debt,Assets\n" + "2023-01-01,1000000,800000,200000,150000,500000,100,0.85,50000,100000,2000000,5000000\n" + "2023-02-01,1050000,820000,230000,180000,520000,95,0.87,55000,110000,1950000,5100000\n" + "2023-03-01,1100000,850000,250000,200000,530000,90,0.88,60000,120000,1900000,5200000\n" + "2023-04-01,1200000,900000,300000,250000,550000,85,0.90,70000,130000,1850000,5400000\n" + "2023-05-01,1300000,950000,350000,300000,580000,80,0.92,80000,140000,1800000,5600000\n" + "2023-06-01,1400000,1000000,400000,350000,600000,75,0.93,90000,150000,1750000,5800000\n" + "2023-07-01,1450000,1050000,400000,320000,620000,78,0.91,95000,160000,1700000,5900000\n" + "2023-08-01,1500000,1100000,400000,300000,650000,80,0.90,100000,170000,1650000,6000000\n" + "2023-09-01,1550000,1150000,400000,280000,680000,82,0.89,105000,180000,1600000,6100000\n" + "2023-10-01,1600000,1200000,400000,260000,700000,85,0.88,110000,190000,1550000,6200000\n" + "2023-11-01,1650000,1250000,400000,240000,720000,88,0.87,115000,200000,1500000,6300000\n" + "2023-12-01,1700000,1300000,400000,220000,750000,90,0.86,120000,210000,1450000,6400000\n" + "2024-01-01,1500000,1200000,300000,180000,780000,95,0.84,100000,180000,1500000,6300000\n" + "2024-02-01,1550000,1220000,330000,200000,760000,92,0.85,105000,185000,1480000,6350000\n" + "2024-03-01,1600000,1240000,360000,220000,740000,89,0.86,110000,190000,1460000,6400000\n" + "2024-04-01,1650000,1260000,390000,240000,720000,86,0.87,115000,195000,1440000,6450000\n" + "2024-05-01,1700000,1280000,420000,260000,700000,83,0.88,120000,200000,1420000,6500000\n" + "2024-06-01,1750000,1300000,450000,280000,680000,80,0.89,125000,205000,1400000,6550000" + ) \ No newline at end of file diff --git a/playground/agents/monitoring/agent_ops_tools.py b/playground/agents/monitoring/agent_ops_tools.py new file mode 100644 index 00000000..05345b54 --- /dev/null +++ b/playground/agents/monitoring/agent_ops_tools.py @@ -0,0 +1,58 @@ +""" +* WORKING + +What this script does: +Simple agent run to test AgentOps to record tool actions (https://www.agentops.ai/) + +Requirements: +1. Create an account on https://www.agentops.ai/ and run pip install agentops +2. Add the folowing API key(s) in your .env file: + - OPENAI_API_KEY + - AGENTOPS_API_KEY +3. Go to your agentops dashboard to observe your activity + +""" + +################ Adding project root to PYTHONPATH ################################ +# If you are running playground examples in the project files directly, use this: + +import sys +import os + +sys.path.insert(0, os.getcwd()) + +################ Adding project root to PYTHONPATH ################################ + + +from swarms import Agent, OpenAIChat +from agentops import record_function + +# Add agentops decorator on your tools +@record_function("length_checker") +def length_checker(string: str) -> int: + """ + For a given string it returns the length of the string. + + Args: + string (str): string to check the length of + + Returns: + int: length of the string + """ + return len(string) + +agent1 = Agent( + agent_name="lengther", + system_prompt="return the length of the string", + agent_description=( + "For a given string it calls the function length_checker to return the length of the string." + ), + llm=OpenAIChat(), + max_loops=1, + agent_ops_on=True, + tools=[length_checker], + execute_tool=True, +) + + +agent1.run("hello") \ No newline at end of file diff --git a/swarms/structs/agent.py b/swarms/structs/agent.py index 97e0cafb..fccfef2d 100644 --- a/swarms/structs/agent.py +++ b/swarms/structs/agent.py @@ -14,6 +14,8 @@ from loguru import logger from pydantic import BaseModel from termcolor import colored +import agentops + from swarms.memory.base_vectordb import BaseVectorDatabase from swarms.models.tiktoken_wrapper import TikTokenizer from swarms.prompts.agent_system_prompts import AGENT_SYSTEM_PROMPT_3 @@ -89,8 +91,8 @@ def step_id(): agent_output_type = Union[BaseModel, dict, str] ToolUsageType = Union[BaseModel, Dict[str, Any]] - # [FEAT][AGENT] +@agentops.track_agent() class Agent(BaseStructure): """ Agent is the backbone to connect LLMs with tools and long term memory. Agent also provides the ability to @@ -720,6 +722,7 @@ class Agent(BaseStructure): self, task: Optional[str] = None, img: Optional[str] = None, + is_last: bool = True, *args, **kwargs, ): @@ -910,7 +913,7 @@ class Agent(BaseStructure): # print(f"Response after output model: {response}") # print(response) - if self.agent_ops_on is True: + if self.agent_ops_on is True and is_last is True: self.check_end_session_agentops() # final_response = " ".join(all_responses) @@ -2021,6 +2024,7 @@ class Agent(BaseStructure): "Agent Ops Initializing, ensure that you have the agentops API key and the pip package installed." ) try_import_agentops() + self.agent_ops_agent_name = self.agent_name logger.info("Agentops successfully activated!") except ImportError: diff --git a/swarms/structs/base_swarm.py b/swarms/structs/base_swarm.py index 8a688b06..42134ca6 100644 --- a/swarms/structs/base_swarm.py +++ b/swarms/structs/base_swarm.py @@ -694,9 +694,6 @@ class BaseSwarm(ABC): def __contains__(self, value): return value in self.agents - def __eq__(self, other): - return self.__dict__ == other.__dict__ - def agent_error_handling_check(self): try: if self.agents is None: diff --git a/swarms/structs/rearrange.py b/swarms/structs/rearrange.py index 810537fd..34a68842 100644 --- a/swarms/structs/rearrange.py +++ b/swarms/structs/rearrange.py @@ -194,6 +194,7 @@ class AgentRearrange(BaseSwarm): loop_count = 0 while loop_count < self.max_loops: for task in tasks: + is_last = task == tasks[-1] agent_names = [ name.strip() for name in task.split(",") ] @@ -222,7 +223,7 @@ class AgentRearrange(BaseSwarm): else: agent = self.agents[agent_name] result = agent.run( - current_task, img, *args, **kwargs + current_task, img, is_last, *args, **kwargs ) results.append(result) @@ -251,7 +252,7 @@ class AgentRearrange(BaseSwarm): else: agent = self.agents[agent_name] current_task = agent.run( - current_task, img, *args, **kwargs + current_task, img, is_last, *args, **kwargs ) loop_count += 1 @@ -261,7 +262,7 @@ class AgentRearrange(BaseSwarm): return e def process_agent_or_swarm( - self, name: str, task: str, img: str, *args, **kwargs + self, name: str, task: str, img: str, is_last, *args, **kwargs ): """ @@ -284,7 +285,7 @@ class AgentRearrange(BaseSwarm): return self.run_sub_swarm(task, name, img, *args, **kwargs) else: agent = self.agents[name] - return agent.run(task, *args, **kwargs) + return agent.run(task, img, is_last, *args, **kwargs) def human_intervention(self, task: str) -> str: if self.human_in_the_loop and self.custom_human_in_the_loop: @@ -316,18 +317,19 @@ class AgentRearrange(BaseSwarm): current_task = task for sub_task in sub_tasks: + is_last = sub_task == sub_tasks[-1] agent_names = [name.strip() for name in sub_task.split(",")] if len(agent_names) > 1: results = [] for agent_name in agent_names: result = self.process_agent_or_swarm( - agent_name, current_task, img, *args, **kwargs + agent_name, current_task, img, is_last*args, **kwargs ) results.append(result) current_task = "; ".join(results) else: current_task = self.process_agent_or_swarm( - agent_names[0], current_task, img, *args, **kwargs + agent_names[0], current_task, is_last, img, *args, **kwargs ) return current_task diff --git a/swarms/tools/tool_parse_exec.py b/swarms/tools/tool_parse_exec.py index 50b78e42..25169939 100644 --- a/swarms/tools/tool_parse_exec.py +++ b/swarms/tools/tool_parse_exec.py @@ -30,8 +30,8 @@ def parse_and_execute_json( function_dict = {func.__name__: func for func in functions} data = json.loads(json_string) - function_list = data.get("functions", []) - + function_list = data.get("functions", []) if data.get("functions") else [data.get("function", [])] + results = {} for function_data in function_list: function_name = function_data.get("name")