Ampel / ampel (push) Failing after 21s
Suche aus Merkliste (deploy/radar-watchlist.json) und Hugging-Face-Entdeckung; nur Kandidaten mit Bild-Projektor, die neben das Warm-Set passen (<= 115 GB inkl. KV-Cache). Nachtlauf mc2-radar.timer 00:30, Tests nur bis 02:30 (um 03:00 kommt NerdQuiz), hoechstens ein neuer Kandidat pro Woche, Notbremse 02:35, RuntimeMaxSec als letzte Sicherung. Pruefstand als Modul (deploy/bench/pruefstand.py): Tempo, Werkzeuge, Deutsch/JSON bzw. Programmieraufgaben und Bild-Probe gegen das heutige Modell der Rolle. Durchgefallene werden geloescht, Bestandene gemeldet und erst nach "Uebernehmen" getauscht. Beim Uebernehmen wandern die Zweitrollen mit (fast beim Hirn, heavy beim Coder), und das Warm-Set des Stewards wird selbst umgestellt statt als Handgriff zu bleiben. Modell-Code im Pruefstand darf keine Prozesse starten (RLIMIT_NPROC=0). Radar steht im Flugplan und unter Waechter-Aufsicht; deploy.sh spielt seine Units ein. Oberflaeche: Vergleichswerte je Kandidat, Rueckfrage vor Uebernehmen und Verwerfen, Status auf Deutsch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""
|
|
Modell-Radar-Schnittstellen (Box-Wart, Umbau 09/2026).
|
|
|
|
GET /api/radar Nächster und letzter Test, Kandidaten, Test-Verlauf
|
|
POST /api/radar/suche Jetzt suchen (Merkliste + Hugging-Face-Entdeckung)
|
|
POST /api/radar/{id}/uebernehmen Bestandenen Kandidaten in Betrieb nehmen (Modell-Tausch)
|
|
POST /api/radar/{id}/verwerfen Kandidaten verwerfen (Dateien weg, nie wieder testen)
|
|
|
|
Dünn: die Logik liegt in services/radar.py. Getestet wird nur nachts (backend/radar_lauf.py).
|
|
"""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from services import radar
|
|
|
|
router = APIRouter(prefix="/api", tags=["radar"])
|
|
|
|
|
|
def _antwort(ergebnis: dict) -> dict:
|
|
if not ergebnis.get("ok"):
|
|
raise HTTPException(status_code=int(ergebnis.get("status") or 409),
|
|
detail=ergebnis.get("detail") or "Das ging nicht.")
|
|
return ergebnis
|
|
|
|
|
|
@router.get("/radar")
|
|
def radar_stand() -> dict:
|
|
return radar.uebersicht()
|
|
|
|
|
|
@router.post("/radar/suche")
|
|
def radar_suche() -> dict:
|
|
"""Sucht sofort (Netz: Hugging Face) und liefert danach den neuen Stand."""
|
|
ergebnis = radar.suche()
|
|
return {**radar.uebersicht(), "suche": ergebnis}
|
|
|
|
|
|
@router.post("/radar/{kandidat_id}/uebernehmen")
|
|
def radar_uebernehmen(kandidat_id: str) -> dict:
|
|
return _antwort(radar.uebernehmen(kandidat_id))
|
|
|
|
|
|
@router.post("/radar/{kandidat_id}/verwerfen")
|
|
def radar_verwerfen(kandidat_id: str) -> dict:
|
|
return _antwort(radar.verwerfen(kandidat_id))
|