Skip to content

Commit 0e577fc

Browse files
committed
refactor: add agent refactoring
1 parent 3b999f9 commit 0e577fc

File tree

11 files changed

+2004
-0
lines changed

11 files changed

+2004
-0
lines changed

agent_manager/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import agent

agent_manager/agent.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import uuid
2+
import re
3+
import asyncio
4+
from dotenv import load_dotenv
5+
6+
from google.adk.runners import Runner
7+
from google.adk.agents import Agent
8+
from google.adk.models.lite_llm import LiteLlm
9+
from google.adk.sessions import DatabaseSessionService
10+
from google.genai import types
11+
12+
from .sub_agents.detector.agent import detector_agent
13+
from .sub_agents.planner.agent import planner_agent
14+
from .sub_agents.fixer.agent import fixer_agent
15+
from .sub_agents.notifier.agent import notifier_agent
16+
from .sub_agents.action_recommender.agent import action_recommender_agent
17+
from .config import MODEL, APP_NAME
18+
19+
# --- Constants ---
20+
AZURE_OPENAI_MODEL_PATTERN = r"\bazure\S*"
21+
GEMINI_MODEL_PATTERN = r"\bgemini\S*"
22+
USER_ID = "chaospilot_user"
23+
SESSION_ID = str(uuid.uuid4())
24+
DB_URL = "sqlite:///./agent_Manager_data.db"
25+
26+
# --- Model Selection ---
27+
if re.findall(AZURE_OPENAI_MODEL_PATTERN, MODEL):
28+
model_instance = LiteLlm(model="azure/gpt-4o")
29+
elif re.findall(GEMINI_MODEL_PATTERN, MODEL):
30+
model_instance = MODEL # MODEL is assumed to be a valid Gemini string
31+
else:
32+
raise ValueError(f"Unsupported model format: {MODEL}")
33+
34+
# --- Root Agent Definition ---
35+
root_agent = Agent(
36+
name="agent_manager",
37+
model=model_instance,
38+
description="Orchestration layer for the chaos engineering system.",
39+
sub_agents=[
40+
detector_agent,
41+
planner_agent,
42+
action_recommender_agent,
43+
fixer_agent,
44+
notifier_agent,
45+
],
46+
)
47+
48+
# --- Session Service ---
49+
session_service = DatabaseSessionService(db_url=DB_URL)
50+
51+
52+
# --- Main Runner ---
53+
async def run():
54+
session = await session_service.create_session(
55+
app_name=APP_NAME,
56+
user_id=USER_ID,
57+
session_id=SESSION_ID,
58+
state={"initialized_at_startup": True},
59+
)
60+
61+
runner = Runner(
62+
agent=root_agent, app_name=APP_NAME, session_service=session_service
63+
)
64+
65+
new_message = types.Content(
66+
role="user",
67+
parts=[
68+
types.Part(
69+
text="Use the detector agent to: Analyze the latest logs for anomalies"
70+
)
71+
],
72+
)
73+
74+
async for event in runner.run_async(
75+
user_id=USER_ID, session_id=SESSION_ID, new_message=new_message
76+
):
77+
if event.is_final_response():
78+
print("Final Response:", event.content.parts[0].text)
79+
80+
print("=========FINAL SESSION STATE==============")
81+

agent_manager/config.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# agent.py
2+
3+
import os
4+
import re
5+
from dotenv import load_dotenv
6+
from toolbox_core import ToolboxSyncClient
7+
8+
# Load .env file
9+
load_dotenv()
10+
11+
# --- App Configuration ---
12+
APP_NAME = os.getenv("APP_NAME", "agent_manager")
13+
VERSION = os.getenv("VERSION", "0.1.0")
14+
MODEL = os.getenv("MODEL")
15+
TOOLBOX_URL = os.getenv("TOOLBOX_URL", "http:localhost:5000")
16+
17+
# --- Model Patterns ---
18+
GEMINI_MODEL_PATTERN = r"\bgemini-[\w-]+"
19+
AZURE_OPENAI_MODEL_PATTERN = r"\bazure\w*"
20+
21+
# --- Keys/Secrets (optional until model matches) ---
22+
AZURE_API_KEY = None
23+
AZURE_API_BASE = None
24+
AZURE_API_VERSION = None
25+
GOOGLE_API_KEY = None
26+
27+
toolbox = None
28+
29+
toolbox = ToolboxSyncClient(TOOLBOX_URL)
30+
31+
# --- Load API Keys based on model pattern ---
32+
if re.findall(GEMINI_MODEL_PATTERN, MODEL):
33+
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
34+
35+
elif re.findall(AZURE_OPENAI_MODEL_PATTERN, MODEL):
36+
AZURE_API_KEY = os.getenv("AZURE_API_KEY")
37+
AZURE_API_BASE = os.getenv("AZURE_API_BASE")
38+
AZURE_API_VERSION = os.getenv("AZURE_API_VERSION")

agent_manager/models.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from sqlalchemy import Column, Integer, String, DateTime, Text, JSON
2+
from sqlalchemy.ext.declarative import declarative_base
3+
import datetime
4+
5+
Base = declarative_base()
6+
7+
8+
class Feedback(Base):
9+
__tablename__ = "feedback"
10+
id = Column(Integer, primary_key=True)
11+
agent_name = Column(String)
12+
output_id = Column(String)
13+
user_id = Column(String)
14+
timestamp = Column(DateTime, default=datetime.datetime.utcnow)
15+
feedback_type = Column(String) # e.g., 'clarity', 'effectiveness'
16+
feedback_text = Column(Text)
17+
effectiveness_score = Column(Integer) # 1-5 scale
18+
context_json = Column(JSON)
19+
tools_used = Column(JSON) # List of tool names
20+
21+
22+
class AgentRegistry(Base):
23+
__tablename__ = "agent_registry"
24+
id = Column(Integer, primary_key=True)
25+
name = Column(String, unique=True)
26+
description = Column(Text)
27+
default_toolset = Column(JSON)
28+
capabilities = Column(JSON)
29+
created_at = Column(DateTime, default=datetime.datetime.utcnow)
30+
31+
32+
class AuditLog(Base):
33+
__tablename__ = "audit_log"
34+
id = Column(Integer, primary_key=True)
35+
event_type = Column(String) # e.g., 'agent_invocation', 'tool_call', 'feedback'
36+
agent_name = Column(String)
37+
tool_name = Column(String, nullable=True)
38+
user_id = Column(String, nullable=True)
39+
details = Column(JSON)
40+
timestamp = Column(DateTime, default=datetime.datetime.utcnow)
41+
42+
43+
class IncidentHistory(Base):
44+
__tablename__ = "incident_history"
45+
id = Column(Integer, primary_key=True)
46+
incident_id = Column(String, unique=True)
47+
summary_json = Column(JSON)
48+
resolution_json = Column(JSON)
49+
agent_outputs_json = Column(JSON)
50+
created_at = Column(DateTime, default=datetime.datetime.utcnow)

agent_manager/sub_agents/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)