feat(2.0): Phase 1 — Engine + Routing (Herzstueck)

Backend-Services: fit/caps/sources (portiert), discover (live HF + Fit +
Caps + ranked recommendation), llama-swap write/register + groups (Ko-
Residenz swap:false), LiteLLM-Gateway-Config + gateway-Service (model:auto +
Fallbacks). Router: discover/fit/register/groups/routing; health zeigt
gateway_reachable. Frontend: Modelle&Routing mit Caps-Chips, Fit-Badges,
Discover-Tab (live), Routing-View.

Lokal verifiziert: Backend-Smoke (alle Endpunkte) + Frontend-Build +
Browser (Shell, Discover, Caps/Fit). Box-Verifikation offen.

Docs: README + docs/STATUS.md (Phasen-Tracker + Resume-Guide).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-25 08:01:12 +02:00
parent 1b421e30f9
commit cff3f0b1a8
25 changed files with 1253 additions and 235 deletions
+27
View File
@@ -0,0 +1,27 @@
import type { Capabilities } from "@/lib/api"
function Chip({ children, tone = "muted" }: { children: React.ReactNode; tone?: "muted" | "primary" | "warn" }) {
const tones = {
muted: "bg-muted text-muted-foreground",
primary: "bg-primary/15 text-primary",
warn: "bg-amber-500/15 text-amber-500",
}
return (
<span className={`rounded px-1.5 py-0.5 text-[11px] font-medium ${tones[tone]}`}>{children}</span>
)
}
export function CapsChips({ caps }: { caps?: Capabilities }) {
if (!caps) return null
return (
<span className="inline-flex flex-wrap gap-1">
{caps.coder && <Chip>💻 Code</Chip>}
{caps.vision && <Chip>👁 Bild</Chip>}
{caps.reasoning && <Chip>🧠 Reason</Chip>}
{caps.moe && <Chip tone="primary">🧩 MoE{caps.active_b ? `·${caps.active_b}b` : ""}</Chip>}
{caps.tools === "yes" && <Chip tone="primary">🛠 Tools</Chip>}
{caps.tools === "likely" && <Chip tone="warn">🛠 Tools?</Chip>}
{caps.embedding && <Chip>🔢 Embed</Chip>}
</span>
)
}