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>
This commit is contained in:
2026-09-05 09:47:22 +02:00
committed by andreas
co-authored by Claude Fable 5.1
parent e13baaab28
commit 34d6c08a3d
6 changed files with 299 additions and 127 deletions
+32 -27
View File
@@ -9,37 +9,42 @@ Keine Format-Übersetzung, keine Datenbank, kein Admin-UI. Alle Upstreams
sprechen OpenAI-Format (OpenRouter, llama-server, Ollama, Mistral), deshalb
reicht Durchreichen. Entscheidung Andreas, 2026-09-05.
## Aliasse (config.json)
## Namensräume
Zwei Arten:
| Name | Bedeutung |
|---|---|
| `42i/marvin-2609:low\|medium\|high\|max` | konfigurierte Stufen (`aliases`, Art `schwelle`: Index ≥ 25/45/49/53, Kontext ≥ 256k/256k/500k/500k) |
| `42i/marvin-2609-core:none\|medium` | lokales Qwen, fest |
| `openrouter/<id>[:effort]` | 1:1 an OpenRouter, Effort als `reasoning.effort` |
| `alt/<id>[:effort]` | **günstigste Alternative derselben Klasse** wie `<id>` auf dieser Stufe |
| `role/<name>` | Rolle aus `rollen`, zeigt auf einen der obigen Namen |
| alles andere | Durchreiche an LiteLLM (`fallback`), unverändert mit Client-Key |
- **`alternative`** — der Alias nennt ein Referenzmodell mit optionaler
Effort-Stufe (`openai/gpt-5.6-luna:low`, `anthropic/claude-opus-5:medium`).
Gerufen wird das **günstigste OpenRouter-Modell derselben Klasse**, nach der
Regel in `../llmlite/openrouter-auswahl.ts` (Intelligence-Index je Stufe von
Artificial Analysis, Kontext, Tool-Calls, Sperrliste, Live-Probe, Last-Probe
bei Wechsel). Findet sich nichts Billigeres, wird die Referenz selbst gerufen.
Die Effort-Stufe des Ziels wird als `reasoning.effort` gesetzt; ein vom
Client mitgeschicktes `reasoning_effort` wird verworfen, die Klasse gehört
zum Alias.
- **`schwelle`** — Index-Schwelle (0100) plus Mindestkontext, ohne Referenzmodell:
das günstigste Modell, das beides erfüllt, mit der niedrigsten ausreichenden
Effort-Stufe. Stand 2026-09-05: low 25/256k, medium 40/256k, high 47/500k,
max 50/500k. Stabiler als eine Referenz, sagt aber weniger über die Bedeutung.
- **`fest`** — Upstream und Modell stehen fest (lokales Qwen, TTS/STT,
Embeddings, kira auf deizo). Optional ein `body`-Patch, etwa
`chat_template_kwargs.enable_thinking` für die Qwen-Stufen.
**Klasse** (`alt/`): Intelligence-, Coding- und Agentic-Index jeweils mindestens
95 % der Referenz, Kontext mindestens 90 %, gewichtet billiger. Intelligence und
Coding kommen je Effort-Stufe von Artificial Analysis, Agentic nur je Modell (AA
misst ihn nicht je Stufe). Hat die Referenz einen Wert, den ein Kandidat nicht
hat, fällt der Kandidat raus. Je Kandidat zählt die niedrigste Stufe, die die
Klasse erreicht; die Stufe des Ziels wird als `reasoning.effort` gesetzt, ein
vom Client mitgeschicktes `reasoning_effort` verworfen. Findet sich nichts
Billigeres, wird die Referenz selbst gerufen.
Die Namen sind versioniert wie bei LiteLLM: `42i/marvin-2609:low``:max`,
`42i/marvin-2609-core:none|medium`. **Unbekannte Namen** (alles aus der
LiteLLM-Zeit, `42i/marvin-2608:*`) reicht der Router unverändert mit dem
Client-Key an LiteLLM auf :4000 durch (`fallback`). Caddy zeigt `llm.lan`
auf den Router; ein Agent wechselt also per Modellname 2608 → 2609, nicht
per base_url, und rollt per Umbenennen zurück. Durchgereichte Anfragen stehen
im Log mit Upstream `litellm`, ohne Kosten (die kennt nur LiteLLM).
`alt/` wird **bei der ersten Anfrage** aufgelöst (Latenz- und Live-Probe, keine
Last-Probe) und dann im 12-h-Takt mit erneuert. Die konfigurierten `42i/*`-Stufen
fahren bei einem Wechsel zusätzlich die Last-Probe (78k Kontext, dreimal).
Wird LiteLLM abgeschaltet, entfällt `fallback`, und `altnamen` (Übersetzung
2608 → 2609) übernimmt, damit auch Nachzügler nicht brechen.
**Rollen** entkoppeln Agenten von Modellnamen: ein Agent ruft `role/worker`,
welches Modell dahintersteht, stellt man in `config.json` um, ohne Container.
Vorbelegung: xo/architect/teamleader/lead → `42i/marvin-2609:high`, alle
anderen → `:medium`.
**Rechte** (`key-acls.json`): Name → erlaubte Namen, `*` am Ende ist ein
Präfix-Muster (`openrouter/*`, `alt/*`, `role/*`); `[]` = alles. Geprüft wird
der angefragte Name, vor der Rollenauflösung.
`/v1/models` zeigt je Key alles Erlaubte: Aliasse, Rollen, alle OpenRouter-
Modelle des Kontos als `openrouter/…` und `alt/…`, jeweils auch mit den bei AA
gemessenen Effort-Stufen, plus die LiteLLM-Liste im Parallelbetrieb.
## Auflösung und Takt