Merge pull request #557 from kyegomez/agentops

AGENTOPS FIX
structured_output
Kye Gomez 5 months ago committed by GitHub
commit 82681bee15
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,26 +1,85 @@
from swarms import Agent, OpenAIChat """
* WORKING
# Initialize the agent What this script does:
agent = Agent( Multi-Agent run to test AgentOps (https://www.agentops.ai/)
agent_name="Accounting Agent",
system_prompt="Generate a financial report for the company's quarterly earnings.", 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=(
"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,
agent_ops_on=True,
)
CFO = Agent(
agent_name="CFO",
system_prompt="Give your opinion on the financial performance of the company.",
agent_description=( agent_description=(
"Generate a financial report for the company's quarterly earnings." "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(), llm=OpenAIChat(),
max_loops=1, max_loops=1,
autosave=True,
dashboard=False,
streaming_on=True,
verbose=True,
stopping_token="<DONE>",
interactive=False,
state_save_file_type="json",
saved_state_path="accounting_agent.json",
agent_ops_on=True, agent_ops_on=True,
) )
# Run the Agent on a task swarm = AgentRearrange(
agent.run( agents=[Treasurer, CFO],
"Generate a financial report for the company's quarterly earnings!" 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"
) )

@ -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")

@ -14,6 +14,8 @@ from loguru import logger
from pydantic import BaseModel from pydantic import BaseModel
from termcolor import colored from termcolor import colored
import agentops
from swarms.memory.base_vectordb import BaseVectorDatabase from swarms.memory.base_vectordb import BaseVectorDatabase
from swarms.models.tiktoken_wrapper import TikTokenizer from swarms.models.tiktoken_wrapper import TikTokenizer
from swarms.prompts.agent_system_prompts import AGENT_SYSTEM_PROMPT_3 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] agent_output_type = Union[BaseModel, dict, str]
ToolUsageType = Union[BaseModel, Dict[str, Any]] ToolUsageType = Union[BaseModel, Dict[str, Any]]
# [FEAT][AGENT] # [FEAT][AGENT]
@agentops.track_agent()
class Agent(BaseStructure): class Agent(BaseStructure):
""" """
Agent is the backbone to connect LLMs with tools and long term memory. Agent also provides the ability to 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, self,
task: Optional[str] = None, task: Optional[str] = None,
img: Optional[str] = None, img: Optional[str] = None,
is_last: bool = True,
*args, *args,
**kwargs, **kwargs,
): ):
@ -910,7 +913,7 @@ class Agent(BaseStructure):
# print(f"Response after output model: {response}") # print(f"Response after output model: {response}")
# print(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() self.check_end_session_agentops()
# final_response = " ".join(all_responses) # 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." "Agent Ops Initializing, ensure that you have the agentops API key and the pip package installed."
) )
try_import_agentops() try_import_agentops()
self.agent_ops_agent_name = self.agent_name
logger.info("Agentops successfully activated!") logger.info("Agentops successfully activated!")
except ImportError: except ImportError:

@ -694,9 +694,6 @@ class BaseSwarm(ABC):
def __contains__(self, value): def __contains__(self, value):
return value in self.agents return value in self.agents
def __eq__(self, other):
return self.__dict__ == other.__dict__
def agent_error_handling_check(self): def agent_error_handling_check(self):
try: try:
if self.agents is None: if self.agents is None:

@ -194,6 +194,7 @@ class AgentRearrange(BaseSwarm):
loop_count = 0 loop_count = 0
while loop_count < self.max_loops: while loop_count < self.max_loops:
for task in tasks: for task in tasks:
is_last = task == tasks[-1]
agent_names = [ agent_names = [
name.strip() for name in task.split(",") name.strip() for name in task.split(",")
] ]
@ -222,7 +223,7 @@ class AgentRearrange(BaseSwarm):
else: else:
agent = self.agents[agent_name] agent = self.agents[agent_name]
result = agent.run( result = agent.run(
current_task, img, *args, **kwargs current_task, img, is_last, *args, **kwargs
) )
results.append(result) results.append(result)
@ -251,7 +252,7 @@ class AgentRearrange(BaseSwarm):
else: else:
agent = self.agents[agent_name] agent = self.agents[agent_name]
current_task = agent.run( current_task = agent.run(
current_task, img, *args, **kwargs current_task, img, is_last, *args, **kwargs
) )
loop_count += 1 loop_count += 1
@ -261,7 +262,7 @@ class AgentRearrange(BaseSwarm):
return e return e
def process_agent_or_swarm( 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) return self.run_sub_swarm(task, name, img, *args, **kwargs)
else: else:
agent = self.agents[name] 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: def human_intervention(self, task: str) -> str:
if self.human_in_the_loop and self.custom_human_in_the_loop: if self.human_in_the_loop and self.custom_human_in_the_loop:
@ -316,18 +317,19 @@ class AgentRearrange(BaseSwarm):
current_task = task current_task = task
for sub_task in sub_tasks: for sub_task in sub_tasks:
is_last = sub_task == sub_tasks[-1]
agent_names = [name.strip() for name in sub_task.split(",")] agent_names = [name.strip() for name in sub_task.split(",")]
if len(agent_names) > 1: if len(agent_names) > 1:
results = [] results = []
for agent_name in agent_names: for agent_name in agent_names:
result = self.process_agent_or_swarm( 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) results.append(result)
current_task = "; ".join(results) current_task = "; ".join(results)
else: else:
current_task = self.process_agent_or_swarm( 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 return current_task

@ -30,7 +30,7 @@ def parse_and_execute_json(
function_dict = {func.__name__: func for func in functions} function_dict = {func.__name__: func for func in functions}
data = json.loads(json_string) data = json.loads(json_string)
function_list = data.get("functions", []) function_list = data.get("functions", []) if data.get("functions") else [data.get("function", [])]
results = {} results = {}
for function_data in function_list: for function_data in function_list:

Loading…
Cancel
Save