47f7a85510
Die Ampel-Nachruestung deckte 317/337 vorbestehende ruff-Verstoesse im ganzen Repo auf. Aufgeraeumt: - ruff.toml: intentionale Muster als Projekt-Politik ausgenommen (BLE001 blind-except, S110/S112 try-except-pass/continue, PLW1510 subprocess-best-effort, B008 FastAPI- Depends/File-Idiom, EXE001 Shebang, + wenige Stil-Regeln). __init__.py-Re-Exports geschuetzt (F401). - ruff --fix: 128 mechanische (Import-Sortierung, PEP585/604-Annotationen, tote Imports, ueberfluessige noqa) auto-behoben. - 12 echte Reste von Hand: PERF402/102, PLC3002 (Lambda->walrus), ISC004 (String-Concat geklammert), F841/RUF059 (ungenutzte Vars), PIE810 (startswith-Tuple), UP031 (f-string), UP035 (veraltete typing-Imports). Ergebnis: 'ruff check .' = 0, 'compileall' grün. Kein Verhaltenswechsel (nur Stil/Modernisierung). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
"""Eigenleben-Endpoints — „Von allein“-Ansicht (Skills + Vorschlags-Bilanz), read-only."""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from services import eigenleben
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
class SkillItem(BaseModel):
|
|
id: str
|
|
name: str
|
|
kategorie: str | None
|
|
aktiv: bool | None
|
|
beschreibung: str
|
|
version: str
|
|
autor: str
|
|
herkunft: str
|
|
herkunft_label: str
|
|
genutzt: int
|
|
zuletzt_genutzt: str | None
|
|
erstellt: str | None
|
|
status: str
|
|
geaendert: float
|
|
|
|
|
|
class EigenlebenOverviewResponse(BaseModel):
|
|
available: bool
|
|
skills: list[SkillItem]
|
|
selbst_erstellt: int
|
|
bilanz: dict
|
|
|
|
|
|
class SkillTextResponse(BaseModel):
|
|
id: str
|
|
text: str
|
|
|
|
|
|
@router.get("/eigenleben", response_model=EigenlebenOverviewResponse)
|
|
def get_overview() -> dict:
|
|
return eigenleben.overview()
|
|
|
|
|
|
# :path — Kategorie-Skills haben einen Schrägstrich in der ID (autonomous-ai-agents/
|
|
# hermes-agent). Als normales {skill_id}-Segment matcht die Route dann nicht, der Request
|
|
# fällt in den SPA-Fallback (index.html, Status 200) und die UI zeigt „Konnte den
|
|
# Skill-Text nicht laden". Die Pfad-Validierung (max. eine Ebene, keine . /..) macht
|
|
# services.eigenleben.skill_text.
|
|
@router.get("/eigenleben/skill/{skill_id:path}", response_model=SkillTextResponse)
|
|
def get_skill(skill_id: str) -> dict:
|
|
text = eigenleben.skill_text(skill_id)
|
|
if text is None:
|
|
raise HTTPException(404, "Skill nicht gefunden.")
|
|
return {"id": skill_id, "text": text}
|