Files
elton 000b244541 Doku: Einstiegs-README, technische Referenz, Betriebsstand
README als Einstieg mit Docker-Schnellstart; die bisherige README lebt als
docs/referenz.md weiter, der Betriebsstand ist aus info nach docs/betrieb.md
portiert.
2026-09-08 09:48:13 +02:00

2.3 KiB

llmrouter

Leichtgewichtiger OpenAI-kompatibler Reverse-Proxy in Bun/TypeScript, der vor den Upstreams sitzt und llm.lan bedient (seit 2026-09-05, Nachfolger des LiteLLM-Gateways). Er kennt vier Eingriffe je Anfrage: Client-Key prüfen, Alias auf ein Modell auflösen, Usage und Kosten aus der Antwort mitlesen, eine Log-Zeile schreiben. Keine Format-Übersetzung, keine Datenbank, kein Admin-UI — alle Upstreams sprechen OpenAI-Format.

Seit 2026-09-08 lebt das Projekt hier in spine/llmrouter (vorher Unterverzeichnis llmrouter/ im Repo 42i/agents).

Dokumentation

  • docs/referenz.md — Namensräume, Auflösung, Claude-Code- Anschluss, Keys, Sprechtext-Normalisierung, Log-Wege: die technische Referenz.
  • docs/betrieb.md — wo der Router läuft (LXC 185020, llm.lan), Deploy-Runbook, Störungstabelle, Verlauf.

Schnellstart (Docker)

cp config.json key-acls.json data/
cp .env.example .env          # Upstream-Keys eintragen (Quelle: OpenBao)
docker compose up -d
curl -s http://localhost:4010/health

Alle Caches und Einstellungen liegen unter ./data (siehe data/README.md); das Image selbst enthält nur Code und die Demo-Konfiguration. Ohne Keys startet der Router trotzdem — /health ist bedienbar, das Auffrischen der Modelllisten scheitert dann graceful.

Entwicklung

bun install                     # keine Dependencies, nur für Konvention
bun test                        # Tests (u. a. Sprechtext-Normalisierung)
bun run start                   # Router lokal starten
bun run src/resolver.ts --force # Auflösung jetzt fahren, Tabelle zeigen
bun run build                   # statisches Linux-Binary nach dist/

Für lokale Läufe ohne Last-Probe (spart ~210k Token je Wechsel): LLMROUTER_LASTTEST=0 bun run src/resolver.ts --force.

Der Router liest config.json aus dem Repo-Verzeichnis, wenn LLMROUTER_CONFIG nicht gesetzt ist; Logs landen relativ dazu unter log/.

CI

.gitea/workflows/ci.yml nach dem Muster der live-Workflows: bun test und Build je Push/PR, und jeder Push nach main published git.42i.org/spine/llmrouter:latest (plus sha-<kurz>-Tag) in die Registry und verifiziert den Pull per /health. Tags: latest und sha-<kurz>, nur linux/amd64.