56 Commits
Author SHA1 Message Date
elton 789d8c187e betrieb.md: Deploy-Verlauf des Output-Gates ergaenzt 2026-09-09 17:13:14 +02:00
elton 7c6e747145 minOutput je Profil senkbar, neue Rolle coder
llmrouter CI / bun test + build (push) Successful in 4s
llmrouter CI / Build and publish image (push) Successful in 21s
Das 64K-Output-Gate war global und trieb auto/mass:fast auf solar-pro4
(0,42 statt 0,27 $/1M), weil ling-3.0-flash mit 32768 Output-Token
durchfiel. Gemessen 09.09.: 1.415 Masse-Requests, 1.146 davon unter 100
Completion-Token — das Gate verfehlte dort seinen Zweck. Jetzt kann je
Schwelle-Profil minOutput gesetzt werden (Default 65536);
auto/mass:fast laeuft mit 32768, max_output unbekannt bleibt abgelehnt.

Dazu role/coder -> auto/coding:junior (ACL fuer persona-spark), damit
Code-Arbeit nicht ueber role/worker in die Masse faellt; der
engineer-Agent der Mac-opencode.json wechselt auf role/coder.

Refs #1283
2026-09-09 17:03:51 +02:00
elton d509d975e4 Betrieb: Umstieg aufs Image vollzogen, Binary-Weg eingestellt 2026-09-09 07:41:21 +02:00
elton e14403420d ACL: turbo-STT/TTS fuer die Container-Personas freigeben (Agenten-Sprachkanal auf Voxtral/Grok umgestellt)
llmrouter CI / bun test + build (push) Successful in 4s
llmrouter CI / Build and publish image (push) Successful in 19s
2026-09-09 06:58:15 +02:00
elton 538e01a239 llmrouter-Auswahl: Gate 65536 Output-Token für Arbeitsmodelle (42i/intern#1283)
llmrouter CI / bun test + build (push) Successful in 3s
llmrouter CI / Build and publish image (push) Successful in 21s
Port aus 42i/agents llmlite/ (Merge 78c3c57, Ursprung 5730cfd) — der
Router lebt seit dem 2026-09-08 in diesem Repo. Arbeitsmodelle (nicht
TTS) brauchen mindestens 65536 Output-Token; inclusionai/ling-3.0-flash
(hart 32768) fällt damit aus der Auswahl. Geprüfte Kette: Rot-Beweis
(Produktion wählte ling für low + haiku, state.json 06:44), Nachher
(Ablehnung "max_output < 65536 (32768)"), Gegenprobe (beschädigtes Gate
quittiert die Testsuite rot mit benanntem Schaden).

Refs 42i/intern#1283
2026-09-08 20:40:28 +02:00
elton 42f4226831 Rolle leader anlegen, persona-jessie auf role/leader umgestellt
llmrouter CI / bun test + build (push) Successful in 3s
llmrouter CI / Build and publish image (push) Successful in 17s
Andreas setzt Jessie fuer die Show-Unterstuetzung (17.9., Kassel) bis auf
Weiteres auf role/leader. auto/coding:junior ergaenzt, damit die
auto/mass-Ausweichkette (mass -> mass:fast -> coding:junior) durch die
ACL-Pruefung kommt, statt im letzten Glied still 403 zu laufen.
Ausgerollt auf llm.lan mit Backup *.bak-show, Router-Neustart, geprueft:
role/leader loest mit persona-jessie auf glm-5.3-flash auf.
2026-09-08 16:27:43 +02:00
elton 3bbe0ffb17 Doku: Umstiegsrezept aufs Hausmuster ./data:/data umgestellt 2026-09-08 11:30:23 +02:00
elton fb3e37b208 Doku: Umstieg aufs Image geprueft, Rezept und Fallstricke ergaenzt 2026-09-08 11:12:07 +02:00
elton 99e90669f3 CI: Login-Kommentar berichtigen (401-Ursache waren vertauschte Secret-Werte)
llmrouter CI / bun test + build (push) Successful in 3s
llmrouter CI / Build and publish image (push) Successful in 36s
2026-09-08 10:22:28 +02:00
elton dcbcfc665b CI: Login mit Retry
llmrouter CI / bun test + build (push) Successful in 3s
llmrouter CI / Build and publish image (push) Failing after 14s
Beobachtet am 2026-09-08: Registry-Login ging durch, eine Minute später
401 vom selben Server (Anmelde-Stand unverändert, per Hand mit demselben
Konto verifizierbar). Drei Versuche mit 5s Abstand.
2026-09-08 09:53:47 +02:00
elton 32a2cc7d9c CI: SHA-Kürzung POSIX-sicher
llmrouter CI / bun test + build (push) Successful in 2s
llmrouter CI / Build and publish image (push) Failing after 3s
Die Job-Shell ist sh -e; ${GITHUB_SHA:0:7} ist bash-Expansion und bricht
mit Bad substitution. printf '%.7s' statt Slice.
2026-09-08 09:49:16 +02:00
elton 53dbcf65bb Gitea-Actions-CI nach live-Muster
llmrouter CI / bun test + build (push) Successful in 3s
llmrouter CI / Build and publish image (push) Failing after 17s
bun test + Build je Push/PR; Push nach main published
git.42i.org/spine/llmrouter:latest (+sha-Tag) und verifiziert den Pull per
/health im Container. Muster: dev-image.yml aus 42i/live (buildx, eigener
Builder, --privileged, DOCKER_API_VERSION 1.43, Verify-Pull).
2026-09-08 09:48:13 +02:00
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
elton 1f99b73161 Docker-Image, Compose-Demo mit ./data-Mount
Alle Laufzeitdateien (config, ACLs, keys, state, aa-cache, log) gehen über
den Mount ./data:/data, weil logDir und ACLs relativ zum CONFIG_PATH
aufgelöst werden. Ohne Keys startet der Router trotzdem, /health bleibt
bedienbar.
2026-09-08 09:48:13 +02:00
elton 3c0a8ead85 openrouter-auswahl.ts vendored, Importpfade umgestellt
Der Router verlaesst 42i/agents: die gemeinsame Modellauswahl wandert als
eigenstaendige Kopie nach src/ (die llmlite-Fassung bleibt dort fuer den
Tier-Updater). Referenz-Stellen zu LiteLLM-Durchreiche und Parallelbetrieb
korrigiert (entfallen mit der Abschaltung 2026-09-07).
2026-09-08 09:48:13 +02:00
elton bf7bc2c0b9 Ausweich auch für Schwelle-Aliasse und bei 429/5xx
auto/mass:fast war als Endstation ohne Rückfall: ling-3.0-flash fiel
am 2026-09-07 nachts aus (5x 502 nach ~270 s hängendem Upstream,
117x 429), und der bisherige Ausweich griff nur bei fetch-Fehlern und
nur für fest-Ziele. Jetzt darf auch ein Schwelle-Alias ausweichen,
und der Ausweich löst bei 429/5xx aus — bevor das erste Byte an den
Client geht, also gefahrlos wiederholbar, weiterhin nur einmal.

auto/mass:fast weicht auf auto/coding:junior aus (ling erfüllt deren
Schwellen strukturell nie, der Rückfall landet also garantiert auf
einem tauglichen Modell). Die Container-Personas bekommen die
Kettenziele in die ACL — ohne sie schlägt der Fallback in
zielBestimmen still fehl und der ursprüngliche Fehler geht durch.

Verifiziert im lokalen End-to-End-Test gegen Schein-Upstreams:
Ausweich bei 429 (200 vom Ersatzmodell, Log-Zeile alias->ausweich),
Durchreichung von 429 ohne ACL-Freigabe, fetch-catch-Pfad unverändert
funktionierend.

Refs 42i/intern#1252
2026-09-08 09:07:34 +02:00
eltonandClaude Opus 5 16a6b98c51 Ticketnummer bis ins Router-Log durchreichen (42i/intern#1291)
Der Log wusste bisher WER gerufen hat (Key, Rolle), aber nicht WORAN gearbeitet
wurde. Damit liess sich "was kostet ein Vorgang" gar nicht bilden -- die
Voraussetzung fuer die Frage, ob die teuren Tickets die sind, die ein Mensch
wollte.

- server.ts liest den Header x-42i-ticket und legt ihn in den Log-Eintrag
- log.ts: Feld `ticket` in JSONL und SQLite; die Spalte wird per ALTER
  nachgezogen (Bestandstabellen haben sie nicht), dazu ein Index darauf.
  Das INSERT nennt jetzt Spaltennamen statt Positionen -- sonst haette die
  neue Spalte die Reihenfolge zerschossen.
- opencode.json und der Container-Entrypoint schicken den Header aus
  {env:AGENT_TICKET}; job.sh exportiert die Variable ohnehin seit 2026-09-02.

Wer keines mitschickt (Chat, Handbetrieb), steht als null im Log -- auch das
ist eine Auskunft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 22:22:19 +02:00
eltonandClaude Opus 5 2355981c67 VERSUCH: role/worker auf ling (auto/mass:fast)
Andreas 2026-09-07: 'stellen wir die worker mal auf ling um und schauen was
passiert.' Bewusst gegen meine Empfehlung aus #1252 (ling Coding 50,6 /
Agentic 21,1 gegen glm 71,5 / 51,5) -- und bewusst als Versuch: der Rueckweg
ist diese eine Zeile.

Nur role/worker. engineer, qa und perf bleiben auf auto/coding:junior, damit
der Vergleich sauber bleibt.

Zu beobachten ist nicht der Preis (der faellt sicher), sondern ob die
Ergebnisse die Abnahme des Teamleiters bestehen -- und wie oft er neu
delegieren muss. Ein Worker, der in Schleifen haengt, braucht am Ende mehr
Zuege als er spart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 20:27:13 +02:00
eltonandClaude Opus 5 948ab84afe llmrouter: Slot an das Verbindungssignal binden (cancel feuert nicht)
Gegenprobe am Produktivrouter nach dem ersten Fix: Ein abgebrochener Stream
gab den Slot WEITERHIN nicht frei -- cancel() im TransformStream wird von Bun
beim Verbindungsabbruch nicht aufgerufen. Immerhin griff die zweite Haerte:
statt zwei Stunden Stille gab es nach 30 s ein 503 mit Grund.

Jetzt haengt der Slot an req.signal, das beim Abbruch zuverlaessig feuert, plus
einem Sicherheitsnetz von 660 s (laenger als der Upstream-Timeout darf kein
Slot gehalten werden). Die Freigabe ist gegen Doppelaufruf gesichert, ein
spaeteres flush() schadet also nicht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 20:23:36 +02:00
eltonandClaude Opus 5 ff62e751ed llmrouter: Slot-Leak beheben (42i/intern#1283)
Ein abgebrochener Streaming-Aufruf gegen das lokale Qwen (maxParallel 1) hat
den einzigen Slot dauerhaft gefressen: die Freigabe hing allein im flush() des
TransformStreams, und der laeuft bei cancel() nie. Danach reihte sich jeder
weitere Aufruf UNBEGRENZT in die Warteschlange ein, statt zu scheitern --
auto/mass, role/ops (Buzz) und das small_model aller Container-Personas hingen
zwei Stunden, ohne dass irgendwo etwas rot wurde. Diagnose von Elton im
Selbstheilungslauf, dreimal in Folge belegt.

Drei Haerten:
- Die Freigabe ist gegen Doppelaufruf gesichert (Flag). Erst dadurch darf sie
  an mehreren Stellen stehen, ohne Slots zu erfinden.
- cancel() gibt jetzt frei, nicht nur flush(). Das ist der eigentliche Fehler:
  bricht der Client ab, laeuft flush() nie.
- Wer laenger als 30 s auf einen Slot wartet, bekommt 503 mit Grund. Ein
  Fehler, an dem der Aufrufer etwas aendern kann, ist besser als Stille.

Ausgeloest habe ich den Fall selbst: zwei eigene Testaufrufe gegen role/ops
liefen gegen 18:05 ins Timeout und wurden abgebrochen -- genau die Handlung,
die den Slot frisst. Der Fehler im Code ist aelter, der Ausloeser war meiner.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 20:20:56 +02:00
eltonandClaude Opus 5 ae0c4ca4a6 Korrektur: Qwen MIT Denkstufe holt den Skill selbst -- Einbacken fuer buzz unnoetig
Andreas fragte nach ("bist du dir sicher? so ganz sicher?" / "versuch sonst mal
qwen mit reasoning") -- zu Recht. Ich hatte die Aussage "Qwen laedt den Skill
nicht" aus der Doku uebernommen, statt sie zu messen.

Gemessen 2026-09-07 an agent-buzz auf auto/mass (qwen36:35b, enable_thinking):
Er ruft context_get_context von selbst und nennt seinen Arbeitsweg korrekt
(Runbooks und geschlossene Tickets zuerst, Wissen sichern, Routinen woertlich).

Der alte Befund (klara 0/9, live/live#1171) galt fuer 42i/marvin-core:none --
Qwen OHNE Denkstufe. Der Unterschied ist die Denkstufe, nicht das Modell.
AGENT_SKILL_EINBACKEN bleibt als Notnagel im Entrypoint, ist fuer buzz aber
nicht gesetzt.

Belastbarkeit: ein Lauf, kein Dutzend. Fuer eine Regel reicht das nicht -- fuer
die Entscheidung, den Vorspann nicht vorsorglich zu verdoppeln, schon.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 17:41:09 +02:00
eltonandClaude Opus 5 6c3d73584d buzz auf das lokale Qwen (role/ops -> auto/mass), Skill fuer ihn eingebacken
Andreas 2026-09-07: "lass buzz auf 42i/mass laufen. Der macht nicht so viel,
das muss ein qwen koennen." Buzz ist der einzige ops-Agent, deshalb bleibt die
Rolle der richtige Ort statt eines Modellnamens im Container.

Dazu gehoert zwingend AGENT_SKILL_EINBACKEN=1 fuer buzz: Qwen holt den
Persona-Skill nicht von selbst (klara 0/9 Laeufe, live/live#1171) -- genau der
Fall, fuer den der Schalter heute gebaut wurde. Der Vorspann steigt fuer ihn
also wieder, dafuer kostet sein Modell nichts.

Ausserdem: start-buzz-web.sh haengt den Werkzeug-Hinweis nach seinem
`cat > AGENTS.md` wieder an. Buzz war der einzige Container ohne den Hinweis --
sein warmer Web-Server ueberschreibt die Datei, die der Entrypoint schreibt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 17:37:47 +02:00
eltonandClaude Opus 5 0ecf90e152 Altnamen wirksam machen und die XO-Runde drosseln
ALTNAMEN (Schadensbehebung): Bei der Umstellung heute Mittag starben fuenf
laufende Teamlaeufe, weil sie ihren Modellnamen aus der Session mittrugen und
der Router ihn nicht mehr kannte (Aktennotiz des XO an 42i/intern#1251). Das
Feld "altnamen" war seit jeher deklariert und validiert, aber im Server NIE
angewendet. Jetzt uebersetzt der Router alte Namen VOR ACL-Pruefung und
Aufloesung; 20 Eintraege fuer die 2608-Reihe und die praefixlosen LiteLLM-Namen.

DROSSELUNG der Runde (Andreas: Verbrauch senken). Gemessen am 07.09.: 32 Runden,
75-220 Zuege je Runde, 82k Kontext je Zug, 208 Mio. Token an einem Tag.
- Ereignis-Paket 4 -> 2: der Aufwand waechst quadratisch mit der Zuglaenge,
  zwei Runden mit je 110 Zuegen kosten rund ein Viertel einer mit 220. Keine
  Zeitgrenze, nichts wird abgebrochen (Andreas 2026-09-03).
- Prompt: die Rueckgabeformate von tool.sh stehen jetzt als Tabelle im Prompt --
  mehrere Zuege gingen dafuer drauf, sie zu erraten. Dazu die Regel, Kommandos
  zu buendeln (214 der 1359 Bash-Aufrufe waren reine cd) und keine breiten
  Verzeichnis-Dumps (groesstes Ergebnis des Tages: ein ls -la mit 14k Zeichen).

Nicht umgesetzt: die Vermutung, der XO fuehre delegierbare Arbeit selbst aus.
Die Messung widerlegt sie -- die Bash-Aufrufe sind ueberwiegend tool.sh-Aufrufe
(Tickets lesen, kommentieren, CI pruefen), also seine eigentliche Aufgabe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 14:05:35 +02:00
eltonandClaude Opus 5 32c54439c8 llmrouter: Messwerkzeug fuer Telefon-Latenz (Erstbyte mit Inkas Zuschnitt)
Anbieterstatistiken messen den Erstbyte ueber alle Nutzer und Prompts. Am
Telefon zaehlt die Zeit bis zum ersten gesprochenen Wort, mit unserem grossen
Systemprompt und ueber mehrere Zuege -- ein Modell mit Zwangs-Reasoning verliert
dort Sekunden, die in keiner Statistik stehen (42i/intern#1252).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:35:30 +02:00
elton 77c29266c9 llmrouter-README: Namensraum auto/ und die Rollen-Vorbelegung nachgezogen 2026-09-07 13:24:24 +02:00
eltonandClaude Opus 5 1513ca63d6 key-acls aufgeraeumt: nightjob und persona-inka-mx entfernt
nightjob hatte kein Token, keinen Konsumenten und keine Nutzung in den letzten
14 Tagen -- der Name stand nur noch in den ACL-Dateien. persona-inka-mx war ein
LiteLLM-key_alias; beide Inka-Tokens (Shim und Telefon-Front-End) laufen im
Router unter persona-inka. Der Alias in OpenBao (agents/inka/litellm) ist
mitkorrigiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:23:50 +02:00
eltonandClaude Opus 5 7fea5c82c4 Router: Namensraum auto/ mit acht Profilen auf drei Achsen (42i/intern#1252)
Der Preisfinder waehlte bisher ueber EINE Zahl. Ein Modell kann generalistisch
gut aussehen und agentisch durchfallen -- gemini-3.8-flash hat Coding 76,3 und
Agentic 41,2 und traegt den Werkzeug-Rundlauf nicht.

- openrouter-auswahl: billigsterUeberSchwelle reicht minCoding/minAgentic an
  klasseFiltern durch (nahm es bereits entgegen, wurde nur nie gefuettert)
- config: art "schwelle" hat jetzt index, coding und agentic, jede optional;
  "fest" kennt ausweich
- resolver: Beschreibung nennt die geforderten Achsen
- server: ein festes Ziel weicht bei Upstream-Ausfall EINMAL auf den
  konfigurierten Alias aus. Ohne das haengt mit dem lokalen Knoten jede
  Titelzeile jedes Agenten, weil auto/mass ueberall als small_model haengt.
- acht Profile, Rollen darauf umgehaengt, 42i/marvin-2609:* bleiben als Namen

Aufgeloest (ohne Last-Probe, alle Ziele laufen bereits ueber bestehende
Aliasse): coding:junior und leader:junior -> glm-5.3-flash, coding:senior ->
grok-4.6:high, leader:senior -> glm-5.3:max (15,66 statt 26 gewichtet -- die
Regel findet etwas Billigeres als die Schaetzung im Ticket), mass:fast -> ling.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:20:10 +02:00
eltonandClaude Opus 5 a95c525a2c LiteLLM-Abschaltung: Fallback raus, alter Port 4000 zeigt auf den Router
- config.json: fallback und der litellm-Upstream entfernt. Unbekannte Namen
  sind ab jetzt ein Fehler statt einer stillen Weiterleitung -- mit totem
  LiteLLM waere daraus ein Timeout ohne Hinweis geworden, und mit Caddy auf
  :4000 sogar eine Schleife auf den Router selbst.
- Caddyfile: :4000 -> localhost:4010. Der Port war ueberall hart verdrahtet
  (Container-Images, spark-desktop, aeltere Skripte); ihn umzubiegen ist
  sicherer, als jeden Aufrufer einzeln zu finden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:06:38 +02:00
eltonandClaude Opus 5 f5eae167f4 Container: Persona fragt ihre Rolle, small_model auf das lokale Qwen, Port 4010
- entrypoint: Zuordnung Persona -> Rolle (spark engineer, buzz ops, jessie
  assistant, klara service); AGENT_MODEL bleibt als Ueberschreibung
- small_model getrennt von model (AGENT_SMALL_MODEL, Default lokales Qwen) --
  Titel und Zusammenfassungen muessen nichts kosten (42i/intern#1252)
- baseURL 4000 -> 4010: die Container sprachen bisher LiteLLM direkt an, am
  Router und am Caddy vorbei
- key-acls: core:none fuer spark/buzz/klara, sonst laeuft small_model in 401
- compose: AGENT_MODEL bei klara entfernt, die Rolle kommt aus dem Entrypoint

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:04:38 +02:00
eltonandClaude Opus 5 a023deb1be Leiter komplett auf Rollen: architect guenstig, alle opencode-Agenten, logbuch weg von Claude
Andreas 2026-09-07: das Max-Abo laeuft aus, es wird direkt umgestellt statt am
Mittwoch. Damit steht KEINE Rolle mehr auf der teuren Stufe.

- llmrouter: architect von :high auf :medium (= allround:junior)
- opencode.json: baseURL auf 4010 (Router statt LiteLLM), alle zehn Agenten auf
  role/*, model und small_model ebenso; Modelldeklarationen sind jetzt die
  Rollen statt der 2608-Namen
- engines.json: xo-chat und logbuch von engine=claude auf opencode; masse von
  42i/marvin-2608-mass:medium (kein Router-Gegenstueck) auf :low
- logbuch-eintrag.sh: opencode-Zweig, Entwurf aus dem JSONL-Strom; der
  claude-Zweig bleibt als Rueckweg erhalten

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:03:49 +02:00
eltonandClaude Opus 5 087dd91ad7 xo: von Claude Code aufs opencode-Gespann, Modell role/xo statt Max-Abo
Der XO war der letzte grosse Posten ausserhalb des Routers: engine=claude mit
claude-opus-5 ueber das Abo, damit ohne Kostenzeile und ohne Metering. Er laeuft
jetzt wie die Teams auf opencode und fragt die Rolle role/xo.

role/xo zeigt dazu auf 42i/marvin-2609:medium (= leader:junior nach
42i/intern#1252, heute glm-5.3-flash) statt :high. Ausdruecklich als Versuch
(Andreas): reicht das Urteil nicht, ist Hochstufen eine Zeile in config.json.
Der Gegenpol bleibt notiert - der Hinweis vom 2026-08-20 (Fall t1678) steht.

Kontextgrenze der Modelldeklaration bewusst auf 262144, die garantierte
Mindestschwelle der medium-Stufe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 12:56:57 +02:00
eltonandClaude Opus 5 da47c1b3ed router: teamleader und lead auf die guenstige Stufe (Andreas 2026-09-07)
Beide standen auf 42i/marvin-2609:high (= grok-4.6 fuer 26 $/1M gewichtet).
Nach 42i/intern#1252 entspricht das leader:junior; damit bleibt nur xo auf der
teuren Stufe, architect ueber allround:senior.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 12:50:49 +02:00
eltonandClaude Opus 5 707a60bc0d Clients auf Router-Namen ziehen: matrix-MCP und Paperless-Verschlagwortung
Beide riefen ueber Port 4000 (LiteLLM) und mit LiteLLM-eigenen Modellnamen
(marvin-tts, marvin-stt, standard, 42i/marvin-2608-core:none). Der Router kennt
diese Namen nicht und reicht sie heute still an LiteLLM durch - mit dessen
Abschaltung waeren sie tot (42i/intern#1252).

- matrix-MCP: TTS/STT auf llm.lan:4010 und 42i/marvin-tts bzw. 42i/marvin-stt
- Paperless: llm.lan:4010, Modell 42i/marvin-2609-core:none statt "standard"
  bzw. dem 2608-Namen; nach #1252 gehoert diese Massenarbeit auf auto/mass
- key-acls: persona-jessie darf das lokale Qwen (fuer genau diese Laeufe)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 12:45:12 +02:00
eltonandClaude Opus 5 c0c0cda907 gateway: Caddy aus dem LiteLLM-Stack loesen, eigener oci-Dienst
Caddy terminiert TLS fuer llm.lan und zeigt auf den llmrouter (:4010). Solange
er im llmlite-Compose steckte, haette das Abschalten von LiteLLM ihn mitgenommen
- der Router laeuft dann zwar weiter, ist aber von aussen nicht erreichbar.

Neue Quelle llmrouter/caddy/{compose.yml,Caddyfile}; agents-pull spiegelt sie
nach /srv/caddy und startet den Dienst bei Aenderung neu.

Vorarbeit zur Abschaltung von LiteLLM (42i/intern#1252).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 12:40:50 +02:00
eltonandClaude Fable 5.1 a8ef31fe20 llmrouter: role/inka zurück auf Luna; Qwen-Tests (Cloud, lokal) dokumentiert
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 10:02:50 +02:00
eltonandClaude Fable 5.1 6ea2601d1e llmrouter: 42i/inka-qwen (Qwen 3.8 27B, reasoning none, Provider AkashML/Parasail fest), role/inka darauf
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 10:02:50 +02:00
eltonandClaude Fable 5.1 106eb633c5 llmrouter: role/inka -> openrouter/qwen/qwen3.8-27b (Test, Andreas 2026-09-06); Inka-Keys dürfen die Rolle
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 10:02:50 +02:00
eltonandClaude Fable 5.1 eb1dcdd28e llmrouter: marvin-stt-turbo -> mistralai/voxtral-small-24b-2507-stt über OpenRouter
STT-Vergleich 2026-09-06 (Studio + simulierte Telefonstrecke) dokumentiert;
Whisper verliert am Telefon Zahlenstellen, Voxtral Small nicht (Andreas).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:28:19 +02:00
eltonandClaude Fable 5.1 bf5d3a179c llmrouter: marvin-tts-turbo Stimme ara (Andreas, Hörtest 2026-09-06)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:28:19 +02:00
eltonandClaude Fable 5.1 3014d1cadf llmrouter: marvin-tts-turbo -> x-ai/grok-voice-tts-1.0 (Stimme eve), Hörtest-Befunde dokumentiert
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:28:19 +02:00
eltonandClaude Fable 5.1 dfc85a4829 llmrouter: Sprechtext-Normalisierung vor TTS — Postleitzahl als Ziffernfolge mit Pause
"Bergstraße 7, 83646 Bad Tölz" -> "Bergstraße 7; Postleitzahl 8 3 6 4 6, Bad Tölz"
(Andreas 2026-09-06, Variante 4 nach Hörtest mit Fish S2 Pro). Betraege, Daten,
Einheiten und Bindestrich-Nummern bleiben unberuehrt; 10 Tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:28:19 +02:00
eltonandClaude Opus 5 d07bef5e10 llmrouter: kira-tts als deizo/kira-tts aufnehmen
Upstream kira-tts (10.6.42.111:8002, KIRA_TTS_KEY) und Alias deizo/kira-tts,
dazu das Recht in allen 12 Schluesseln ergaenzt, die deizo/kira-stt schon
hatten.

Anders als LiteLLM reicht der Router den Audio-Stream durch: Nicht-JSON-
Antworten gehen als Body weiter, statt ausgepuffert zu werden. Gemessen ueber
den Router: erster Ton nach 22 ms gestreamt gegen 5,70 s ungestreamt. Der
LiteLLM-Weg puffert und kommt auf 9,17 s (bekannter Upstream-Bug
BerriAI/litellm#14891).

Inka nutzt darueber jetzt STT und TTS; das LLM blieb vorerst auf dem alten
Weg (Tool-Schema-Grammatik, s. 42i/intern#1201).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 08:28:19 +02:00
eltonandClaude Fable 5.1 dcdfb1bc9e llmrouter README: die vier Wege ins Log (stats, zuordnung, jsonl/changes/sqlite, Journal)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 16:23:26 +02:00
eltonandClaude Fable 5.1 91e68d9ea9 llmrouter: Claude Code/Desktop — nackte claude-IDs -> alt/anthropic/<id>[:effort]
- anthropicModus (alt|openrouter), Normalisierung der IDs (Datum, [1m], Punkte),
  Client-Effort aus output_config.effort als Stufe, HEAD /api/hello -> 200
- Auswahl: nicht gemessene Stufe faellt auf die naechste gemessene darunter
  (sonst darueber, sonst Modellzahl) -- Sonnet 5 hat nur max/none
- /models: alt/ nur bei bestimmbarer Klasse; opencode-normalize nimmt
  openrouter/+alt/ genau dann (GLM 5.3 Flash war weggefallen)
- README: Abschnitt Claude Code und Claude Desktop
Verifiziert per claude -p mit claude-sonnet-5, claude-opus-5, claude-haiku-4-5-20251001.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 16:23:26 +02:00
eltonandClaude Fable 5.1 0d971b81dc llmrouter: Anthropic-Messages-Pfad (/messages, count_tokens) für Claude Code
Weiterleitung an OpenRouters Messages-Endpunkt (x-api-key, anthropic-version,
anthropic-beta), Effort als reasoning.effort, Usage in Anthropic-Form gelesen
(auch im Stream aus message_start/message_delta). Nur openrouter-Ziele; lokale
llama-server sprechen kein Messages-Format. Verifiziert: claude -p über
http://llm.lan:4010 mit alt/anthropic/claude-sonnet-5 -> glm-5.3-flash.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 16:23:26 +02:00
eltonandClaude Fable 5.1 9d0bd7e1a3 llmrouter: TTS/STT/Embedding/free als 42i/marvin-*
Alte Namen ohne Präfix laufen über die Durchreiche bei LiteLLM weiter (Andreas 2026-09-05).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 09:47:22 +02:00
eltonandClaude Fable 5.1 1d145b6259 llmrouter: Kira-Modelle als deizo/kira-reasoning, deizo/kira-stt
Alte Namen kira-* laufen über die Durchreiche weiter bei LiteLLM (Andreas 2026-09-05).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 09:47:22 +02:00
eltonandClaude Fable 5.1 c377791007 llmrouter: ACL nur für eigene Namen, Durchreiche prüft LiteLLM
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 09:47:22 +02:00
eltonandClaude Fable 5.1 34d6c08a3d llmrouter: Namensräume openrouter/, alt/, role/; Klasse über drei Indexe relativ
- openrouter/<id>[:effort] 1:1, alt/<id>[:effort] günstigste Alternative auf
  Abruf (ohne Last-Probe, im Takt erneuert), role/<name> aus config.rollen
- Klasse: Intelligence, Coding, Agentic je >= 95 % der Referenz (relativ statt
  3 Punkte), Kontext >= 90 %, billiger; Kandidaten auch ohne OpenRouter-Index,
  wenn AA Stufen kennt (OpenRouter führt Intelligence nur für 53 Modelle)
- ACL-Muster mit *, /models mit allen Konto-Modellen je Namensraum und Stufe
- Rollen aus der LiteLLM-Zeit übernommen (Führung high, Rest medium)
Andreas 2026-09-05.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 09:47:22 +02:00
eltonandClaude Fable 5.1 e13baaab28 llmrouter vor LiteLLM: Caddy llm.lan -> :4010, /models mischt LiteLLM-Liste dazu
Seit 2026-09-05 06:11 läuft llm.lan über den Router; 2608-Namen und role/*
gehen per Durchreiche an LiteLLM (:4000). Caddyfile-Falle: Datei-Bind-Mount,
mv tauscht den Inode -> podman restart llmlite-caddy statt caddy reload.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 08:12:31 +02:00
eltonandClaude Fable 5.1 81ab596897 llmrouter: Namen 42i/marvin-2609:*, Durchreiche unbekannter Namen an LiteLLM
Caddy zeigt llm.lan künftig auf den Router; alles Unbekannte (2608, role/*)
geht unverändert mit dem Client-Key an LiteLLM :4000. Umstellung je Agent =
Modellname, kein base_url-Wechsel (Andreas 2026-09-05). altnamen entfällt,
bis LiteLLM abgeschaltet wird.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 08:09:46 +02:00
eltonandClaude Fable 5.1 4b11a869e6 llmrouter: Schwellen medium 45, high 49, max 53 (Andreas 2026-09-05)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 07:47:01 +02:00
eltonandClaude Fable 5.1 3b9ad85825 llmrouter: Alias-Art schwelle (Index + Mindestkontext), Stufen 25/40/47/50
billigsterUeberSchwelle in openrouter-auswahl, gemeinsamer klasseFiltern
mit dem Referenzmodus. Stufen jetzt als Schwelle: low 25/256k, medium
40/256k, high 47/500k, max 50/500k (Andreas 2026-09-05).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 07:27:34 +02:00
eltonandClaude Fable 5.1 d8cc9b5dbb llmrouter: Deploy-Stand — Port 4010, Kira-Keys, MODEL_BLOCKLIST, max auf fable-5.1:high
Läuft seit 2026-09-05 als systemd-Unit llmrouter im LXC 185020 unter
/srv/llmrouter, parallel zu LiteLLM (:4000). 4001 war von nginx belegt.
Admin-Key in OpenBao jessie/llmrouter. Token für inka-mx, nightjob, lab-xo,
team-copilot fehlen (nur Hash in LiteLLM).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 07:18:31 +02:00
eltonandClaude Fable 5.1 804383d157 llmrouter: Stufen low/medium/high/max auf Haiku 4.5 / Sonnet 5 / Opus 5 medium / Fable 5.1 medium
none, extra, ultra und marvin-mass abgeschafft (Andreas 2026-09-05); Altnamen
und Key-Rechte entsprechend umgeschrieben.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 07:13:19 +02:00
eltonandClaude Fable 5.1 7897fa9651 llmrouter: leichtgewichtiger Gateway-Ersatz mit Alternativ-Auflösung
OpenAI-kompatibler Reverse-Proxy in Bun: Client-Key -> ACL, Alias ->
Modell (alternative: günstigstes Modell derselben Klasse über
llmlite/openrouter-auswahl inkl. Effort-Achse; fest: lokale Upstreams,
TTS/STT, Embeddings), Usage/Kosten aus der OpenRouter-Antwort (auch im
Stream), JSONL + SQLite-Log, Tagesstatistik je Key. Altnamen der
LiteLLM-Zeit werden übersetzt. Kein 3456/stdcmpt, kein role/*, kein -auto
(Andreas 2026-09-05). Lokal verifiziert: Chat, Stream, ACL, Altname,
Kosten im Log. Parallelbetrieb auf :4001 geplant.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 07:03:12 +02:00