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>
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""Routing-Endpoints: Lane-Summary (chat/coding) + UI-editierbare Policy (hot-reload)."""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from services import gateway
|
|
from services.routing_policy import policy_meta, save_policy
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
@router.get("/routing")
|
|
def routing() -> dict:
|
|
return {**gateway.routing_summary(), "gateway_reachable": gateway.gateway_reachable()}
|
|
|
|
|
|
@router.get("/routing/policy")
|
|
def get_policy() -> dict:
|
|
"""Aktuelle Policy + Defaults (für „Zurücksetzen“) + Feld-Spezifikation für den Editor."""
|
|
return policy_meta()
|
|
|
|
|
|
class PolicyPatch(BaseModel):
|
|
fast: str | None = None
|
|
heavy: str | None = None
|
|
coder: str | None = None
|
|
coder_lite: str | None = None
|
|
heavy_chars: int | None = None
|
|
coding_escalate_chars: int | None = None
|
|
fast_no_think: bool | None = None
|
|
|
|
|
|
@router.put("/routing/policy")
|
|
def put_policy(patch: PolicyPatch) -> dict:
|
|
"""Teil-Update der Routing-Policy. Validiert, persistiert atomar, sofort wirksam (hot-reload)."""
|
|
fields = {k: v for k, v in patch.model_dump().items() if v is not None}
|
|
if not fields:
|
|
raise HTTPException(status_code=400, detail="Keine Felder zum Aktualisieren.")
|
|
try:
|
|
new_policy = save_policy(fields)
|
|
except (ValueError, TypeError) as e:
|
|
raise HTTPException(status_code=400, detail=f"Ungültige Policy: {e}")
|
|
return {"policy": new_policy}
|