"""Auto-Discovery Plugin-Loader fuer Hausmeister-Bot Tools. Laedt alle tools/*.py Dateien und sammelt: - TOOLS: Tool-Definitionen fuer das LLM - HANDLERS / get_handlers(): Handler-Funktionen - SYSTEM_PROMPT_EXTRA: Zusaetzliche Prompt-Abschnitte """ import importlib import os import glob import logging log = logging.getLogger("tool_loader") _cache = {"tools": None, "prompt": None, "modules": None} def _discover_modules(): if _cache["modules"] is not None: return _cache["modules"] tools_dir = os.path.join(os.path.dirname(__file__), "tools") modules = [] for path in sorted(glob.glob(os.path.join(tools_dir, "*.py"))): name = os.path.basename(path)[:-3] if name.startswith("_"): continue try: mod = importlib.import_module(f"tools.{name}") modules.append(mod) log.debug("Geladen: tools/%s (%d Tools)", name, len(getattr(mod, "TOOLS", []))) except Exception as e: log.error("Fehler beim Laden von tools/%s: %s", name, e) _cache["modules"] = modules log.info("%d Tool-Module geladen", len(modules)) return modules def get_tools() -> list: """Alle Tool-Definitionen fuer das LLM.""" if _cache["tools"] is not None: return _cache["tools"] all_tools = [] for mod in _discover_modules(): all_tools.extend(getattr(mod, "TOOLS", [])) _cache["tools"] = all_tools return all_tools def get_extra_prompt() -> str: """Alle SYSTEM_PROMPT_EXTRA Abschnitte zusammengefuegt.""" if _cache["prompt"] is not None: return _cache["prompt"] parts = [] for mod in _discover_modules(): extra = getattr(mod, "SYSTEM_PROMPT_EXTRA", "") if extra: parts.append(extra.strip()) _cache["prompt"] = "\n\n".join(parts) return _cache["prompt"] def get_handlers(session_id: str = None) -> dict: """Alle Handler-Funktionen. Wird pro Request aufgerufen (session_id kann variieren).""" all_handlers = {} for mod in _discover_modules(): factory = getattr(mod, "get_handlers", None) if factory: all_handlers.update(factory(session_id=session_id)) else: all_handlers.update(getattr(mod, "HANDLERS", {})) return all_handlers