81 lines
2.3 KiB
Python
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
|