""" tool_forge.py — S-TOOL-SMITHING: Agentic Tool Evolution. Permette all'agente di creare, testare e registrare nuovi tool permanentemente. Trasforma l'agente da semplice utente a creatore di strumenti. """ import os import json import logging import importlib.util from typing import Dict, Any, Optional _logger = logging.getLogger("agente_ai.tool_forge") class ToolForge: def __init__(self, evolved_tools_dir: str = "backend/tools/evolved"): self.evolved_tools_dir = evolved_tools_dir os.makedirs(self.evolved_tools_dir, exist_ok=True) # Crea __init__.py se non esiste per rendere la cartella un package init_file = os.path.join(self.evolved_tools_dir, "__init__.py") if not os.path.exists(init_file): with open(init_file, "w") as f: f.write("# Evolved tools package\n") async def forge_tool(self, name: str, code: str, description: str) -> bool: """ Crea un nuovo tool, lo salva e tenta di caricarlo per verificarne la validità. """ file_path = os.path.join(self.evolved_tools_dir, f"{name}.py") # Struttura standard del tool evolved tool_template = f'"""\nAuto-generated tool: {name}\nDescription: {description}\n"""\n\n' tool_template += code tool_template += f'\n\n# Metadata per il registry\nTOOL_METADATA = {{\n "name": "{name}",\n "description": "{description}",\n "type": "evolved"\n}}\n' try: with open(file_path, "w") as f: f.write(tool_template) _logger.info(f"[ToolForge] Nuovo tool '{name}' forgiato con successo in {file_path}") return True except Exception as e: _logger.error(f"[ToolForge] Errore durante la creazione del tool {name}: {e}") return False def list_evolved_tools(self) -> Dict[str, str]: """Elenca tutti i tool evoluti creati dall'agente.""" tools = {} for f in os.listdir(self.evolved_tools_dir): if f.endswith(".py") and f != "__init__.py": name = f[:-3] tools[name] = os.path.join(self.evolved_tools_dir, f) return tools # Singleton per uso globale tool_forge = ToolForge()