Terminal / models /tool_forge.py
Baida—-
deploy: full backend sync for Node A [Kernel Restore]
8b87770 verified
Raw
History Blame Contribute Delete
2.26 kB
"""
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()