core: Registry, Skills, Router, Executor, Verifier, Runner mit Tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 00:36:21 +02:00
co-authored by Claude Opus 5.5
parent fef930d176
commit f79e2a8556
24 changed files with 2581 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
"""Konfiguration aus Umgebungsvariablen."""
from __future__ import annotations
import os
from dataclasses import dataclass, field
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[3]
def _bool(value: str | None, default: bool) -> bool:
if value is None:
return default
return value.strip().lower() in {"1", "true", "yes", "ja", "on"}
@dataclass
class Settings:
api_token: str = ""
db_url: str = "sqlite:///data/knaster.db"
site_dir: Path = field(default_factory=lambda: REPO_ROOT / "sites" / "knaster")
skills_dir: Path = field(default_factory=lambda: REPO_ROOT / "skills")
config_dir: Path = field(default_factory=lambda: REPO_ROOT / "config")
dry_run: bool = True
litellm_base_url: str = "http://litellm:4000"
litellm_api_key: str = ""
embed_model: str = "embed-default"
rerank_url: str = ""
rerank_model: str = "rerank-default"
portainer_host: str = ""
portainer_key: str = ""
proxmox_url: str = ""
proxmox_token_id: str = ""
proxmox_token_secret: str = ""
notify_webhook_url: str = ""
job_webhook_url: str = ""
request_timeout: float = 120.0
@classmethod
def from_env(cls) -> Settings:
env = os.environ
base = cls()
return cls(
api_token=env.get("KNASTER_API_TOKEN", base.api_token),
db_url=env.get("KNASTER_DB_URL", base.db_url),
site_dir=Path(env.get("KNASTER_SITE_DIR", base.site_dir)),
skills_dir=Path(env.get("KNASTER_SKILLS_DIR", base.skills_dir)),
config_dir=Path(env.get("KNASTER_CONFIG_DIR", base.config_dir)),
dry_run=_bool(env.get("KNASTER_DRY_RUN"), True),
litellm_base_url=env.get("LITELLM_BASE_URL", base.litellm_base_url),
litellm_api_key=env.get("LITELLM_API_KEY", base.litellm_api_key),
embed_model=env.get("KNASTER_EMBED_MODEL", base.embed_model),
rerank_url=env.get("RERANK_URL", base.rerank_url),
rerank_model=env.get("KNASTER_RERANK_MODEL", base.rerank_model),
portainer_host=env.get("PORTAINER_HOST", ""),
portainer_key=env.get("PORTAINER_KEY", ""),
proxmox_url=env.get("PROXMOX_URL", ""),
proxmox_token_id=env.get("PROXMOX_TOKEN_ID", ""),
proxmox_token_secret=env.get("PROXMOX_TOKEN_SECRET", ""),
notify_webhook_url=env.get("NOTIFY_WEBHOOK_URL", ""),
job_webhook_url=env.get("KNASTER_JOB_WEBHOOK_URL", ""),
request_timeout=float(env.get("KNASTER_REQUEST_TIMEOUT", base.request_timeout)),
)