Skip to content
This repository was archived by the owner on Jan 5, 2026. It is now read-only.

Commit c29b871

Browse files
authored
refactor agent system (#84)
1 parent 3785a85 commit c29b871

9 files changed

Lines changed: 119 additions & 101 deletions

File tree

examples/atomic/IOAgent.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
from litemultiagent.core.agent_manager import AgentManager
2-
31
import logging
4-
52
from litemultiagent.core.agent_system import AgentSystem
3+
import uuid
64

75
# Configure logging
86
logging.basicConfig(
@@ -26,8 +24,10 @@ def main():
2624
"agent_description": "Read or write content from/to a file, or generate and save an image using text input",
2725
"parameter_description": "The task description detailing what to read, write, or generate. This can include file operations or image generation requests."
2826
}
27+
2928
system_config = {
30-
"meta_task_id": "io_subtask",
29+
"system_name": "io_agent_system",
30+
"system_runtime_id": str(uuid.uuid4()),
3131
"save_to": "csv",
3232
"log_dir": "log",
3333
"model_name": "gpt-4o-mini",

examples/composite/MasterAgent.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from litemultiagent.core.agent_manager import AgentManager
22
from litemultiagent.core.agent_system import AgentSystem
33
from litemultiagent.tools.registry import ToolRegistry, Tool
4+
import uuid
45
import logging
56

67
# Configure logging
@@ -101,7 +102,8 @@ def main():
101102
}
102103

103104
system_config = {
104-
"meta_task_id": "master_agent_task",
105+
"system_name": "master_agent_system",
106+
"system_runtime_id": str(uuid.uuid4()),
105107
"save_to": "csv",
106108
"log_dir": "log",
107109
"model_name": "gpt-4o-mini",

examples/new_tool/add_function_example.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from litemultiagent.core.agent_manager import AgentManager
1+
from litemultiagent.core.agent_system import AgentSystem
2+
import uuid
23

34
import logging
45

@@ -15,7 +16,6 @@
1516
# Create a logger
1617
logger = logging.getLogger(__name__)
1718
def main():
18-
agent_manager = AgentManager()
1919
from litemultiagent.tools.registry import Tool
2020
from dotenv import load_dotenv
2121
_ = load_dotenv()
@@ -48,29 +48,30 @@ def calculate(operation, num1, num2):
4848
"name": "test_agent",
4949
"type": "atomic",
5050
"agent_class": "FunctionCallingAgent",
51-
"meta_data":
52-
{
53-
"meta_task_id": "io_subtask",
54-
"task_id": 1,
55-
"save_to": "supabase",
56-
"log": "log",
57-
"model_name": "gpt-4o-mini",
58-
"tool_choice": "auto"
59-
},
51+
"meta_data": {},
6052
"tool_names": ["read_file", "write_to_file", "generate_and_download_image"],
6153
"self_defined_tools": [new_tool],
6254
"agent_description": "test ai agent",
6355
"parameter_description": "test ai agent"
6456
}
65-
test_agent = agent_manager.get_agent(test_agent_config)
57+
58+
system_config = {
59+
"system_name": "test_agent_system",
60+
"system_runtime_id": str(uuid.uuid4()),
61+
"save_to": "csv",
62+
"log_dir": "log",
63+
"model_name": "gpt-4o-mini",
64+
"tool_choice": "auto"
65+
}
66+
agent_system = AgentSystem(test_agent_config, system_config)
6667

6768
# Example usage
6869
task = "calculate 3+4"
69-
result = test_agent.execute(task)
70+
result = agent_system.execute(task)
7071
print("Test Agent Result:", result)
7172

7273
task = "calculate 3 times 4"
73-
result = test_agent.execute(task)
74+
result = agent_system.execute(task)
7475
print("Test Agent Result:", result)
7576

7677

examples/new_tool/add_llm_generated_function_example.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import traceback
44
from dotenv import load_dotenv
55
from litemultiagent.tools.tool_creation_agent import ToolCreationAgent
6+
from litemultiagent.core.agent_system import AgentSystem
7+
from litemultiagent.tools.registry import Tool
8+
import uuid
69

710
# Configure logging
811
logging.basicConfig(
@@ -48,38 +51,35 @@ def main():
4851
# Cleanup resources
4952
tool_creation_agent.cleanup_cache()
5053

51-
# Set up agent manager and tools
52-
from litemultiagent.core.agent_manager import AgentManager
53-
from litemultiagent.tools.registry import Tool
5454

55-
agent_manager = AgentManager()
5655
new_tools = [
5756
Tool(name, func, description, parameters)
5857
for spec in mapping
5958
for name, func, description, parameters in [mapping[spec]]
6059
]
6160

62-
# Configure test agent
61+
6362
test_agent_config = {
6463
"name": "test_agent",
6564
"type": "atomic",
6665
"agent_class": "FunctionCallingAgent",
67-
"meta_data": {
68-
"meta_task_id": "io_subtask",
69-
"task_id": 1,
70-
"save_to": "supabase",
71-
"log": "log",
72-
"model_name": "gpt-4o-mini",
73-
"tool_choice": "auto"
74-
},
66+
"meta_data": {},
7567
"tool_names": ["read_file", "write_to_file", "generate_and_download_image"],
7668
"self_defined_tools": new_tools,
7769
"agent_description": "test ai agent",
7870
"parameter_description": "test ai agent"
7971
}
8072

81-
# Initialize and test the agent
82-
test_agent = agent_manager.get_agent(test_agent_config)
73+
system_config = {
74+
"system_name": "test_agent_system",
75+
"system_runtime_id": str(uuid.uuid4()),
76+
"save_to": "csv",
77+
"log_dir": "log",
78+
"model_name": "gpt-4o-mini",
79+
"tool_choice": "auto"
80+
}
81+
agent_system = AgentSystem(test_agent_config, system_config)
82+
8383

8484
# Test calculator functionality
8585
test_cases = [
@@ -88,7 +88,7 @@ def main():
8888
]
8989

9090
for task, description in test_cases:
91-
result = test_agent.execute(task)
91+
result = agent_system.execute(task)
9292
print(f"{description} - Task: {task}")
9393
print(f"Result: {result}")
9494

litemultiagent/agents/agent_class/base.py

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
from dotenv import load_dotenv
88
from litellm import completion
99
from datetime import datetime
10-
11-
from litemultiagent.core.agent_system import AgentSystem
10+
from supabase import create_client, Client
11+
import os
12+
import csv
1213

1314
_ = load_dotenv()
1415

@@ -39,6 +40,16 @@
3940
},
4041
}
4142

43+
# Initialize Supabase client
44+
url = os.getenv("SUPABASE_URL")
45+
key = os.getenv("SUPABASE_ANON_KEY")
46+
supabase: Optional[Client] = None
47+
if url and key:
48+
try:
49+
supabase = create_client(url, key)
50+
except Exception as e:
51+
logger.error(f"Failed to initialize Supabase client: {e}")
52+
4253
class BaseAgent:
4354
def __init__(self, agent_name: str, agent_description, parameter_description, tools: List[Dict[str, Any]],
4455
available_tools: Dict[str, callable],
@@ -82,10 +93,10 @@ def send_prompt(self, goal: str) -> str:
8293
self.goal = goal
8394
return self._send_completion_request(plan=goal, depth=0)
8495

85-
def set_system(self, system: AgentSystem):
86-
self.system = system
87-
self.model_name = self.model_name or self.system.model_name
88-
self.tool_choice = self.tool_choice or self.system.tool_choice
96+
def set_shared_config(self, shared_config):
97+
self.shared_config = shared_config
98+
self.model_name = self.model_name or self.shared_config["model_name"]
99+
self.tool_choice = self.tool_choice or self.shared_config["tool_choice"]
89100

90101
def _send_completion_request(self, plan, depth: int = 0) -> str:
91102
pass
@@ -129,16 +140,17 @@ def _log_response(self, response, depth):
129140
logger.info(f'Agent: {self.agent_name}, depth: {depth}, response: {response}')
130141

131142
def _save_response(self, response, depth):
132-
if self.system.save_to == "supabase":
143+
if self.shared_config["save_to"] == "supabase":
133144
self._save_to_supabase(response, depth)
134-
if self.system.save_to == "csv":
145+
if self.shared_config["save_to"] == "csv":
135146
self._save_to_csv(response, depth)
136147

137148
def _save_to_csv(self, response, depth):
138149
usage_dict = self._extract_cost(response)
139150
data = {
140-
"meta_task_id": self.system.meta_task_id,
141-
"task_id": self.system.task_id,
151+
"system_name": self.shared_config["system_name"],
152+
"system_runtime_id": self.shared_config["system_runtime_id"],
153+
"task_id": self.shared_config["task_id"],
142154
"agent": self.agent_name,
143155
"depth": depth,
144156
"role": "assistant",
@@ -151,13 +163,34 @@ def _save_to_csv(self, response, depth):
151163
"model_name": self.model_name,
152164
"timestamp": datetime.now().isoformat()
153165
}
154-
self.system.save_to_csv(data)
166+
filename = os.path.join(self.shared_config["log_dir"], f"multiagent_data_{datetime.now().strftime('%Y%m%d')}.csv")
167+
file_exists = os.path.isfile(filename)
168+
169+
# Ensure the directory exists
170+
os.makedirs(os.path.dirname(filename), exist_ok=True)
171+
172+
# If file doesn't exist, create it with header
173+
if not file_exists:
174+
with open(filename, 'w', newline='') as csvfile:
175+
fieldnames = list(data.keys())
176+
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
177+
writer.writeheader()
178+
logger.info(f"Created new CSV file with header: {filename}")
179+
180+
# Append data to the file
181+
with open(filename, 'a', newline='') as csvfile:
182+
fieldnames = list(data.keys())
183+
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
184+
writer.writerow(data)
185+
186+
logger.info(f"Data saved to CSV: {filename}")
155187

156188
def _save_to_supabase(self, response, depth):
157189
usage_dict = self._extract_cost(response)
158190
data = {
159-
"meta_task_id": self.system.meta_task_id,
160-
"task_id": self.system.task_id,
191+
"system_name": self.shared_config["system_name"],
192+
"system_runtime_id": self.shared_config["system_runtime_id"],
193+
"task_id": self.shared_config["task_id"],
161194
"agent": self.agent_name,
162195
"depth": depth,
163196
"role": "assistant",
@@ -169,7 +202,13 @@ def _save_to_supabase(self, response, depth):
169202
"total_cost": usage_dict["total_cost"],
170203
"model_name": self.model_name,
171204
}
172-
self.system.save_to_csv(data)
205+
if supabase is None:
206+
logger.warning("Supabase client is not initialized. Skipping database save.")
207+
return
208+
try:
209+
supabase.table("multiagent").insert(data).execute()
210+
except Exception as e:
211+
logger.error(f"Failed to save data to Supabase: {e}")
173212

174213
def _extract_cost(self, response):
175214
prompt_tokens = response.usage.prompt_tokens

litemultiagent/agents/agent_type/atomic.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from typing import List, Dict, Any, Type
22
from litemultiagent.agents.agent_class.base import BaseAgent
3-
from litemultiagent.core.agent_system import AgentSystem
43
from litemultiagent.tools.registry import ToolRegistry
54

65

@@ -24,8 +23,8 @@ def __init__(self, agent_name: str, agent_description: str, parameter_descriptio
2423
def execute(self, task: str) -> str:
2524
return self.agent.send_prompt(task)
2625

27-
def set_system(self, system: AgentSystem):
28-
self.agent.set_system(system)
26+
def set_shared_config(self, shared_config):
27+
self.agent.set_shared_config(shared_config)
2928

3029
def __getattr__(self, name):
3130
return getattr(self.agent, name)

litemultiagent/agents/agent_type/composite.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from typing import List, Dict, Any, Type
22
from litemultiagent.agents.agent_class.base import BaseAgent
3-
from litemultiagent.core.agent_system import AgentSystem
43
from litemultiagent.tools.registry import ToolRegistry, Tool
54

65
class CompositeAgent:
@@ -24,10 +23,10 @@ def __init__(self, agent_name: str, agent_description: str, parameter_descriptio
2423
self.agent = agent_class(agent_name, agent_description, parameter_description,
2524
self.tools, self.available_tools, meta_data)
2625

27-
def set_system(self, system: AgentSystem):
28-
self.agent.set_system(system)
26+
def set_shared_config(self, shared_config):
27+
self.agent.set_shared_config(shared_config)
2928
for sub_agent in self.sub_agents:
30-
sub_agent.set_system(system)
29+
sub_agent.set_shared_config(shared_config)
3130

3231
def _build_sub_agents(self, sub_agent_configs: List[Dict[str, Any]]) -> List[BaseAgent]:
3332
from litemultiagent.core.agent_factory import AgentFactory

0 commit comments

Comments
 (0)