File size: 2,262 Bytes
03e5649
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""
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()