Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 15 additions & 7 deletions app/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
from .logger import log_action

class MiniAgent:
def __init__(self, registry: ToolRegistry):
def __init__(self, registry: ToolRegistry, model: str = "gpt-4o-mini"):
self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
self.registry = registry
self.model = model

def run(self, prompt: str):

def run(self, prompt: str) -> str:
system_prompt = f"""
Sei un assistente intelligente. Hai accesso a questi tool:
{self.registry.list_tools()}
Expand All @@ -23,7 +25,7 @@ def run(self, prompt: str):
"""

response = self.client.chat.completions.create(
model="gpt-4o-mini",
model=self.model,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": prompt}
Expand All @@ -38,10 +40,16 @@ def run(self, prompt: str):

# Se l'LLM ha scelto un tool valido
if tool_name and self.registry.get_tool(tool_name):
func = self.registry.get_tool(tool_name)["func"]
result = func(**params)
log_action(tool_name, prompt, result)
return f"[TOOL {tool_name}] {result}"
try:
func = self.registry.get_tool(tool_name)["func"]
Comment thread
Impesud marked this conversation as resolved.
result = func(**params)
log_action(tool_name, prompt, result)
return f"[TOOL {tool_name}] {result}"
except Exception as e:
error_msg = f"Error executing tool {tool_name}: {str(e)}"
log_action(tool_name, prompt, error_msg)
return f"[ERROR] {error_msg}"


# Fallback: Risposta diretta dell'LLM
return direct_answer
12 changes: 7 additions & 5 deletions app/registry.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from typing import Callable, Dict, Any, Optional

class ToolRegistry:
def __init__(self):
self.tools = {}
self.tools: Dict[str, Dict[str, Any]] = {}

def register(self, name, func, description):
def register(self, name: str, func: Callable, description: str) -> None:
self.tools[name] = {"func": func, "description": description}

def get_tool(self, name):
def get_tool(self, name: str) -> Optional[Dict[str, Any]]:
return self.tools.get(name)

def list_tools(self):
return "\n".join([f"- {name}: {info['description']}" for name, info in self.tools.items()])
def list_tools(self) -> str:
return "\n".join([f"- {name}: {info['description']}" for name, info in self.tools.items()])
9 changes: 8 additions & 1 deletion app/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,11 @@ def get_current_time(timezone: str = "UTC") -> str:
Ritorna l'ora esatta nel formato HH:MM:SS.
"""
now = datetime.datetime.now()
return f"L'orario attuale ({timezone}) è {now.strftime('%H:%M:%S')}."
return f"L'orario attuale ({timezone}) è {now.strftime('%H:%M:%S')}."

def get_system_info() -> str:
"""
Ritorna informazioni di base sul sistema operativo.
"""
import platform
return f"Sistema: {platform.system()} {platform.release()}, Python: {platform.python_version()}"
8 changes: 6 additions & 2 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
from dotenv import load_dotenv
from app.registry import ToolRegistry
from app.agent import MiniAgent
from app.tools import get_weather, calculate_discount, count_words, get_current_time
from app.tools import get_weather, calculate_discount, count_words, get_current_time, get_system_info


# 1. Caricamento variabili d'ambiente (.env)
load_dotenv()
Expand All @@ -16,15 +17,18 @@ def main():
registry.register("calculate_discount", calculate_discount, "Calcola il prezzo scontato (params: price, discount)")
registry.register("count_words", count_words, "Conta tutte le parole presenti dopo il comando (param: text)")
registry.register("get_current_time", get_current_time, "Ritorna l'ora attuale (param: timezone)")
registry.register("get_system_info", get_system_info, "Ritorna info sul sistema (No params)")


# 3. Controllo presenza API Key
if not os.getenv("OPENAI_API_KEY"):
print("❌ ERRORE: Chiave OPENAI_API_KEY non trovata nel file .env")
return

# 4. Inizializzazione dell'AI Agent
# 4. Inizializzazione dell'AI Agent (Configurabile)
agent = MiniAgent(registry)


# 5. Casi di test per la demo (Golden Set)
test_prompts = [
"Che tempo fa a Roma?", # Tool: get_weather
Expand Down