Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apm development revamp #707

Merged
merged 88 commits into from
Jul 13, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
f6dcae3
ui changes
jedan2506 Jun 27, 2023
9d3ea3b
Merge branch 'dev' of github.com:TransformerOptimus/SuperAGI into apm…
jedan2506 Jun 27, 2023
db5bfcb
ui changes
jedan2506 Jun 28, 2023
47729ab
ui changes
jedan2506 Jul 2, 2023
b2df5d4
ui changes
jedan2506 Jul 3, 2023
0899377
ui changes
jedan2506 Jul 3, 2023
ca495af
ui changes
jedan2506 Jul 3, 2023
2f95e73
ui changes
jedan2506 Jul 3, 2023
25d6dae
ui changes
jedan2506 Jul 3, 2023
d884287
ui changes
jedan2506 Jul 3, 2023
0dc0a9d
ui changes
jedan2506 Jul 4, 2023
744cf22
ui changes
jedan2506 Jul 4, 2023
7d3ff99
ui changes
jedan2506 Jul 4, 2023
22467d4
ui changes
jedan2506 Jul 4, 2023
c9124fe
ui changes
jedan2506 Jul 4, 2023
72bdb4f
ui changes
jedan2506 Jul 4, 2023
d41358d
ui changes
jedan2506 Jul 4, 2023
b56ee20
ui changes
jedan2506 Jul 4, 2023
c962884
ui changes
jedan2506 Jul 4, 2023
b8a7f32
ui changes
jedan2506 Jul 4, 2023
3f66a32
ui changes
jedan2506 Jul 4, 2023
372aae0
ui changes
jedan2506 Jul 4, 2023
18984da
ui changes
jedan2506 Jul 5, 2023
4d41f3e
ui changes
jedan2506 Jul 5, 2023
172fd6c
ui changes
jedan2506 Jul 5, 2023
a6b27d4
ui changes
jedan2506 Jul 5, 2023
dc9eb01
ui changes
jedan2506 Jul 5, 2023
4489164
ui changes
jedan2506 Jul 5, 2023
69089d5
ui changes
jedan2506 Jul 5, 2023
fd4d361
ui changes
jedan2506 Jul 5, 2023
e904c2e
ui changes
jedan2506 Jul 5, 2023
32a36f9
ui changes
jedan2506 Jul 5, 2023
cebf126
ui changes
jedan2506 Jul 5, 2023
75e7bec
ui changes
jedan2506 Jul 5, 2023
ec3aca5
ui changes
jedan2506 Jul 5, 2023
7a4cc06
ui changes
jedan2506 Jul 5, 2023
796c958
ui changes
jedan2506 Jul 5, 2023
aca83e4
ui changes
jedan2506 Jul 5, 2023
626553e
ui changes
jedan2506 Jul 6, 2023
f9a464a
ui changes
jedan2506 Jul 6, 2023
f72df61
ui changes
jedan2506 Jul 6, 2023
229f40f
ui changes
jedan2506 Jul 6, 2023
49b0f15
ui changes
jedan2506 Jul 6, 2023
a0cef7b
ui changes
jedan2506 Jul 6, 2023
65c7626
ui changes
jedan2506 Jul 6, 2023
e3d6f6c
path fix
Fluder-Paradyne Jul 6, 2023
6f59cd6
ui changes
jedan2506 Jul 6, 2023
e5177cf
ui changes
jedan2506 Jul 6, 2023
445e108
ui changes
jedan2506 Jul 6, 2023
51b703b
ui changes
jedan2506 Jul 6, 2023
55b5dd5
ui changes
jedan2506 Jul 6, 2023
fec3620
ui changes
jedan2506 Jul 6, 2023
3d749cb
Merge branch 'dev' of github.com:TransformerOptimus/SuperAGI into apm…
jedan2506 Jul 6, 2023
154a6a9
ui changes
jedan2506 Jul 6, 2023
eac838b
ui changes
jedan2506 Jul 7, 2023
0846e21
Merge branch 'dev' of github.com:TransformerOptimus/SuperAGI into apm…
jedan2506 Jul 7, 2023
f87f503
ui changes
jedan2506 Jul 7, 2023
8db6549
ui changes
jedan2506 Jul 10, 2023
ed99d87
ui changes
jedan2506 Jul 10, 2023
dc22e65
ui changes
jedan2506 Jul 10, 2023
c2ba5d4
ui changes
jedan2506 Jul 10, 2023
f6eafca
ui changes
jedan2506 Jul 10, 2023
fec921c
ui changes
jedan2506 Jul 11, 2023
66d5fd6
ui changes
jedan2506 Jul 11, 2023
78e9b3b
ui changes
jedan2506 Jul 12, 2023
59f59f0
ui changes
jedan2506 Jul 12, 2023
ca68f84
ui changes
jedan2506 Jul 13, 2023
608768a
ui changes
jedan2506 Jul 13, 2023
4dc5cfc
ui changes
jedan2506 Jul 13, 2023
b280653
ui changes
jedan2506 Jul 13, 2023
0a7645b
ui changes
jedan2506 Jul 13, 2023
201d627
ui changes
jedan2506 Jul 13, 2023
2132af9
ui changes
jedan2506 Jul 13, 2023
b55d362
ui changes
jedan2506 Jul 13, 2023
dcb8989
ui changes
jedan2506 Jul 13, 2023
5906eca
ui changes
jedan2506 Jul 13, 2023
164bcfd
ui changes
jedan2506 Jul 13, 2023
f67569c
ui changes
jedan2506 Jul 13, 2023
aa865dd
ui changes
jedan2506 Jul 13, 2023
bdc27f9
ui changes
jedan2506 Jul 13, 2023
75890ff
ui changes
jedan2506 Jul 13, 2023
307177c
ui changes
jedan2506 Jul 13, 2023
61ef1f8
ui changes
jedan2506 Jul 13, 2023
b48f463
ui changes
jedan2506 Jul 13, 2023
0d497fb
ui changes
jedan2506 Jul 13, 2023
98e4d49
ui changes
jedan2506 Jul 13, 2023
8db4654
Merge branch 'dev' of github.com:TransformerOptimus/SuperAGI into apm…
jedan2506 Jul 13, 2023
d8f3c2a
ui changes
jedan2506 Jul 13, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
ui changes
  • Loading branch information
jedan2506 committed Jul 4, 2023
commit 0dc0a9df3540056e74674674f6a2973563b76142
2 changes: 0 additions & 2 deletions gui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,13 @@
"dependencies": {
"axios": "^1.4.0",
"bootstrap": "^5.2.3",
"d3": "^7.8.5",
"date-fns": "^2.30.0",
"echarts": "^5.4.2",
"eslint": "8.40.0",
"eslint-config-next": "13.4.2",
"mitt": "^3.0.0",
"next": "13.4.2",
"react": "18.2.0",
"react-apexcharts": "^1.4.0",
"react-dom": "18.2.0",
"react-markdown": "^8.0.7",
"react-toastify": "^9.1.3"
Expand Down
36 changes: 36 additions & 0 deletions migrations/versions/e39295ec089c_creating_events.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""creating events

Revision ID: e39295ec089c
Revises: 7a3e336c0fba
Create Date: 2023-06-30 12:23:12.269999

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = 'e39295ec089c'
down_revision = '7a3e336c0fba'
branch_labels = None
depends_on = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('events',
sa.Column('created_at', sa.DateTime(), nullable=True),
sa.Column('updated_at', sa.DateTime(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('event_name', sa.String(), nullable=False),
sa.Column('event_value', sa.Integer(), nullable=False),
sa.Column('json_property', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
sa.Column('agent_id', sa.Integer(), nullable=True),
sa.Column('org_id', sa.Integer(), nullable=True),
sa.PrimaryKeyConstraint('id')
)


def downgrade() -> None:
op.drop_table('events')
# ### end Alembic commands ###
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"dependencies": {
"axios": "^1.4.0",
"echarts": "^5.4.2",
"react-toastify": "^9.1.3"
}
}
4 changes: 2 additions & 2 deletions superagi/agent/super_agi.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,11 +241,11 @@ def handle_tool_response(self, assistant_reply):
if action.name.lower() == FINISH or action.name == "":
logger.info("\nTask Finished :) \n")
output = {"result": "COMPLETE", "retry": False}
AnalyticsHelper.create_event(session, 'tool_used', 0, {'tool_name':action.name}, self.agent_config["agent_id"], 0),
AnalyticsHelper(session=session).create_event('tool_used', 0, {'tool_name':action.name}, self.agent_config["agent_id"], 0),
return output
if action.name.lower() in tools:
tool = tools[action.name.lower()]
AnalyticsHelper.create_event(session, 'tool_used', 0, {'tool_name':action.name}, self.agent_config["agent_id"], 0),
AnalyticsHelper(session=session).create_event('tool_used', 0, {'tool_name':action.name}, self.agent_config["agent_id"], 0),
try:
observation = tool.execute(action.args)
logger.info("Tool Observation : ")
Expand Down
4 changes: 2 additions & 2 deletions superagi/controllers/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ def create_agent_with_config(agent_with_config: AgentWithConfig,
db.session.add(execution)
db.session.commit()

AnalyticsHelper.create_event(db.session, 'run_created', 0, {'run_id': execution.id,'name':execution.name}, db_agent.id, 0),
AnalyticsHelper.create_event(db.session, 'agent_created', 1, {'name': agent_with_config.name, 'model': agent_with_config.model}, agent_id, 0)
AnalyticsHelper(session=db.session).create_event('run_created', 0, {'run_id': execution.id,'name':execution.name}, agent_id, 0),
AnalyticsHelper(session=db.session).create_event('agent_created', 1, {'name': agent_with_config.name, 'model': agent_with_config.model}, agent_id, 0)

execute_agent.delay(execution.id, datetime.now())

Expand Down
2 changes: 1 addition & 1 deletion superagi/controllers/agent_execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def create_agent_execution(agent_execution: sqlalchemy_to_pydantic(AgentExecutio
db.session.add(db_agent_execution)
db.session.commit()

AnalyticsHelper.create_event(db.session, 'run_created', 0, {'run_id': db_agent_execution.id,'name':db_agent_execution.name},
AnalyticsHelper(session=db.session).create_event('run_created', 0, {'run_id': db_agent_execution.id,'name':db_agent_execution.name},
agent_execution.agent_id, 0)

if db_agent_execution.status == "RUNNING":
Expand Down
10 changes: 5 additions & 5 deletions superagi/controllers/analytics.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,38 +16,38 @@ def get_metrics(Authorize: AuthJWT = Depends(check_auth)):

"""
try:
return AnalyticsHelper.calculate_run_completed_metrics(db.session)
return AnalyticsHelper(session=db.session).calculate_run_completed_metrics()
except:
raise HTTPException(status_code=500, detail="Internal Server Error")


@router.get("/agents/all", status_code=200)
def get_agents(Authorize: AuthJWT = Depends(check_auth)):
try:
return AnalyticsHelper.fetch_agent_data(db.session)
return AnalyticsHelper(session=db.session).fetch_agent_data()
except:
raise HTTPException(status_code=500, detail="Internal Server Error")


@router.get("/agents/{agent_id}", status_code=200)
def get_agent_runs(agent_id: int, Authorize: AuthJWT = Depends(check_auth)):
try:
return AnalyticsHelper.fetch_agent_runs(agent_id,db.session)
return AnalyticsHelper(session=db.session).fetch_agent_runs(agent_id)
except:
raise HTTPException(status_code=500, detail=str(e))


@router.get("/runs/active", status_code=200)
def get_active_runs(Authorize: AuthJWT = Depends(check_auth)):
try:
return AnalyticsHelper.get_active_runs(db.session)
return AnalyticsHelper(session=db.session).get_active_runs()
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))


@router.get("/tools/used", status_code=200)
def get_tools_used(Authorize: AuthJWT = Depends(check_auth)):
try:
return AnalyticsHelper.calculate_tool_usage(db.session)
return AnalyticsHelper(session=db.session).calculate_tool_usage()
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
54 changes: 26 additions & 28 deletions superagi/helper/analytics_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@


class AnalyticsHelper:
@classmethod
def create_event(cls, session: Session, event_name: str, event_value: int,

def __init__(self,session):
self.session = session

def create_event(self, event_name: str, event_value: int,
json_property: dict, agent_id: int, org_id: int) -> Event:
event = Event(
event_name=event_name,
Expand All @@ -17,16 +20,15 @@ def create_event(cls, session: Session, event_name: str, event_value: int,
agent_id=agent_id,
org_id=org_id,
)
session.add(event)
session.commit()
self.session.add(event)
self.session.commit()
return event

@classmethod
def calculate_run_completed_metrics(cls, session: Session) -> dict:
def calculate_run_completed_metrics(self) -> dict:
result = {'total_tokens': 0, 'total_calls': 0, 'runs_completed': 0}

try:
query_result = session.query(Event).filter_by(event_name="run_completed").all()
query_result = self.session.query(Event).filter_by(event_name="run_completed").all()

for res in query_result:
if 'tokens_consumed' in res.json_property:
Expand All @@ -36,20 +38,19 @@ def calculate_run_completed_metrics(cls, session: Session) -> dict:

result['runs_completed'] += 1

session.close()
self.session.close()

except SQLAlchemyError as e:
print(str(e))

return result

@classmethod
def fetch_agent_data(cls, session: Session) -> dict:
def fetch_agent_data(self) -> dict:
agent_details_dict = {}
models_used_dict = {}

try:
agent_created_events = session.query(Event).filter_by(event_name="agent_created").all()
agent_created_events = self.session.query(Event).filter_by(event_name="agent_created").all()

for event in agent_created_events:
agent_id = event.agent_id
Expand All @@ -70,7 +71,7 @@ def fetch_agent_data(cls, session: Session) -> dict:
else:
models_used_dict[model_type] = 1 # first time seeing this model, initialize with 1

run_completed_events = session.query(Event).filter_by(event_name="run_completed").all()
run_completed_events = self.session.query(Event).filter_by(event_name="run_completed").all()

for event in run_completed_events:
agent_id = event.agent_id
Expand All @@ -84,7 +85,7 @@ def fetch_agent_data(cls, session: Session) -> dict:
if 'calls' in event.json_property:
agent_details_dict[agent_id]['total_calls'] += event.json_property['calls']

session.close()
self.session.close()

except SQLAlchemyError as e:
print(str(e))
Expand All @@ -94,12 +95,11 @@ def fetch_agent_data(cls, session: Session) -> dict:

return {'agent_details':agent_details, 'model_info':models_used}

@classmethod
def fetch_agent_runs(cls, agent_id: int, session: Session) -> list:
def fetch_agent_runs(self, agent_id: int) -> list:
agent_runs = []
try:
query_result_completed = session.query(Event).filter_by(event_name="run_completed", agent_id=agent_id).all()
query_result_created = session.query(Event).filter_by(event_name="run_created", agent_id=agent_id).all()
query_result_completed = self.session.query(Event).filter_by(event_name="run_completed", agent_id=agent_id).all()
query_result_created = self.session.query(Event).filter_by(event_name="run_created", agent_id=agent_id).all()

# create a dictionary of created_at times for run_created events
created_dict = {run.json_property['run_id']: run.created_at for run in query_result_created}
Expand All @@ -121,22 +121,21 @@ def fetch_agent_runs(cls, agent_id: int, session: Session) -> list:
except SQLAlchemyError as e:
print(str(e))

session.close()
self.session.close()

return agent_runs

@classmethod
def get_active_runs(cls, session: Session) -> list:
def get_active_runs(self) -> list:
running_executions = []
try:
start_events = session.query(Event).filter_by(event_name="run_created").all()
completed_events = session.query(Event).filter_by(event_name="run_completed").all()
start_events = self.session.query(Event).filter_by(event_name="run_created").all()
completed_events = self.session.query(Event).filter_by(event_name="run_completed").all()

completed_run_ids = [event.json_property['run_id'] for event in completed_events]

for event in start_events:
if event.json_property['run_id'] not in completed_run_ids:
agent_event = session.query(Event).filter_by(agent_id=event.agent_id, event_name="agent_created").first()
agent_event = self.session.query(Event).filter_by(agent_id=event.agent_id, event_name="agent_created").first()
agent_name = agent_event.json_property['name'] if agent_event else 'Unknown'
execution_data = {
'name': event.json_property['name'],
Expand All @@ -149,16 +148,15 @@ def get_active_runs(cls, session: Session) -> list:
print(str(e))
return {"error": str(e)}
finally:
session.close()
self.session.close()

return running_executions

@classmethod
def calculate_tool_usage(cls, session: Session) -> list:
def calculate_tool_usage(self) -> list:
tool_usage_dict = {}

try:
tool_used_events = session.query(Event).filter_by(event_name="tool_used").all()
tool_used_events = self.session.query(Event).filter_by(event_name="tool_used").all()

for event in tool_used_events:
tool_name = event.json_property['tool_name']
Expand All @@ -173,7 +171,7 @@ def calculate_tool_usage(cls, session: Session) -> list:
tool_usage_dict[tool_name]["unique_agents"].add(agent_id)
tool_usage_dict[tool_name]["total_usage"] += 1

session.close()
self.session.close()

except SQLAlchemyError as e:
print(str(e))
Expand Down
2 changes: 1 addition & 1 deletion superagi/jobs/agent_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ def execute_next_action(self, agent_execution_id):
db_agent_execution = session.query(AgentExecution).filter(AgentExecution.id == agent_execution_id).first()
db_agent_execution.status = "COMPLETED"
session.commit()
AnalyticsHelper.create_event(session, 'run_completed', 1, {'run_id':db_agent_execution.id,'name': db_agent_execution.name,'tokens_consumed':db_agent_execution.num_of_tokens,"calls":db_agent_execution.num_of_calls}, db_agent_execution.agent_id, organisation.id)
AnalyticsHelper(session=session).create_event('run_completed', 1, {'run_id':db_agent_execution.id,'name': db_agent_execution.name,'tokens_consumed':db_agent_execution.num_of_tokens,"calls":db_agent_execution.num_of_calls}, db_agent_execution.agent_id, organisation.id)
elif response["result"] == "WAITING_FOR_PERMISSION":
db_agent_execution = session.query(AgentExecution).filter(AgentExecution.id == agent_execution_id).first()
db_agent_execution.status = "WAITING_FOR_PERMISSION"
Expand Down