homelab-brain/homelab-ai-bot/tool_loader.py

81 lines
2.3 KiB
Python

"""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