Files
llmrouter/config.json
T
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

192 lines
8.4 KiB
JSON

{
"_doku": "Versionierte Quelle des llmrouter. Secrets kommen NUR aus der Umgebung: OPENROUTER_API_KEY, MISTRAL_API_KEY, KIRA_REASONING_KEY, KIRA_STT_KEY, KIRA_TTS_KEY, ARTIFICIALANALYSIS_API_KEY, ADMIN_KEY; Client-Keys aus KEYS_FILE (token -> name), Rechte aus key-acls.json (name -> aliasse). Port 4010 (4001 im LXC von nginx belegt); Caddy zeigt llm.lan auf 4010, LiteLLM bleibt auf 4000 und bekommt alles, was hier unbekannt ist (fallback). MODEL_BLOCKLIST zeigt auf die Sperrliste (Host: /srv/llmrouter/model-blocklist.json).",
"port": 4010,
"logDir": "./log",
"refreshHours": 12,
"aaRefreshDays": 7,
"lasttest": true,
"upstreams": {
"openrouter": {
"base": "https://openrouter.ai/api/v1",
"keyEnv": "OPENROUTER_API_KEY"
},
"qwen": {
"base": "http://10.18.5.30:11507/v1",
"maxParallel": 1
},
"voice": {
"base": "http://10.18.5.30:8803/v1"
},
"ollama": {
"base": "http://10.18.5.30:11434/v1"
},
"mistral": {
"base": "https://api.mistral.ai/v1",
"keyEnv": "MISTRAL_API_KEY"
},
"kira-chat": {
"base": "http://10.6.42.111:8000/v1",
"keyEnv": "KIRA_REASONING_KEY"
},
"kira-stt": {
"base": "http://10.6.42.111:8001/v1",
"keyEnv": "KIRA_STT_KEY"
},
"kira-tts": {
"base": "http://10.6.42.111:8002/v1",
"keyEnv": "KIRA_TTS_KEY"
},
"litellm": {
"base": "http://127.0.0.1:4000/v1",
"clientKey": true
}
},
"aliases": {
"42i/marvin-2609:low": {
"art": "schwelle",
"index": 25,
"minContext": 256000
},
"42i/marvin-2609:medium": {
"art": "schwelle",
"index": 45,
"minContext": 256000
},
"42i/marvin-2609:high": {
"art": "schwelle",
"index": 49,
"minContext": 500000
},
"42i/marvin-2609:max": {
"art": "schwelle",
"index": 53,
"minContext": 500000
},
"42i/marvin-free": {
"art": "fest",
"upstream": "openrouter",
"model": "openrouter/free"
},
"42i/marvin-2609-core:none": {
"art": "fest",
"upstream": "qwen",
"model": "qwen36:35b",
"body": {
"chat_template_kwargs": {
"enable_thinking": false
}
}
},
"42i/marvin-2609-core:medium": {
"art": "fest",
"upstream": "qwen",
"model": "qwen36:35b",
"body": {
"chat_template_kwargs": {
"enable_thinking": true
}
}
},
"deizo/kira-reasoning": {
"art": "fest",
"upstream": "kira-chat",
"model": "kira-reasoning"
},
"deizo/kira-stt": {
"art": "fest",
"upstream": "kira-stt",
"model": "kira-stt"
},
"deizo/kira-tts": {
"art": "fest",
"upstream": "kira-tts",
"model": "kira-tts"
},
"42i/marvin-tts": {
"art": "fest",
"upstream": "voice",
"model": "tts-1"
},
"42i/marvin-stt": {
"art": "fest",
"upstream": "voice",
"model": "whisper-1"
},
"42i/marvin-tts-turbo": {
"art": "fest",
"upstream": "openrouter",
"model": "x-ai/grok-voice-tts-1.0",
"body": {
"voice": "ara"
},
"_doku": "Hörtest 2026-09-06 (Andreas): Grok Voice beste Stimme im OpenRouter-Katalog; Erstbyte 0,6 s, 32 s Audio in 5,8 s, $15/1M Zeichen. Fish S2.1 (Pro/free) klingt gut, liest aber Daten und Beträge falsch; MAI Voice 2 Flash (de-DE-Klaus) am schnellsten. Vorher Voxtral (keine deutsche Stimme). Stimme fest 'ara' (Andreas, Hörtest der fünf Stimmen), Grok kennt eve/ara/rex/sal/leo."
},
"42i/marvin-stt-turbo": {
"art": "fest",
"upstream": "openrouter",
"model": "mistralai/voxtral-small-24b-2507-stt",
"_doku": "STT-Vergleich 2026-09-06 über OpenRouter (20 Modelle, deutscher Testsatz mit Datum/Beträgen/PLZ/Telefon, Studio und simulierte Telefonstrecke): Voxtral Small 24B, gpt-4o(-mini)-transcribe und MAI Transcribe 1.5 fehlerfrei auch am Telefon; Whisper large-v3(-turbo) verliert am Telefon 3 von 10 Zahlenstellen (deckt sich mit Andreas' Eindruck von kira-stt). Voxtral Small $0,18/h, günstigstes fehlerfreies. Vorher: voxtral-mini-latest direkt bei Mistral (ohne Router-Kosten, außerhalb des ZDR-Guardrails)."
},
"42i/marvin-embedding": {
"art": "fest",
"upstream": "ollama",
"model": "bge-m3"
},
"42i/marvin-embedding-turbo": {
"art": "fest",
"upstream": "openrouter",
"model": "mistralai/mistral-embed-2312"
},
"42i/inka-qwen": {
"art": "fest",
"upstream": "openrouter",
"model": "qwen/qwen3.8-27b",
"body": {
"reasoning": {
"effort": "none"
},
"provider": {
"order": [
"AkashML",
"Parasail"
],
"allow_fallbacks": false
}
},
"_doku": "Test-Hirn fuer Inka (2026-09-06): Qwen 3.8 27B OHNE Denkstufe und mit festen Providern (fp8, Cache-Treffer $0,05/1M, Uptime >99,6 %), damit der Prompt-Cache ueber die Zuege traegt. Erster Qwen-Anruf ohne das: 5,2 s je Zug, 700 Reasoning-Token, Cache in 3 von 8 Zuegen."
}
},
"_stufen_doku": "Stufen als Index-Schwelle (Artificial-Analysis-Intelligence-Index, 0-100) mit Mindestkontext (Andreas 2026-09-05): low 25/256k, medium 45/256k, high 49/500k, max 53/500k. Die Art \"alternative\" mit Referenzmodell (z.B. anthropic/claude-opus-5:medium) bleibt möglich. Namen versioniert wie bei LiteLLM (2608): 42i/marvin-2609:*.",
"fallback": {
"upstream": "litellm",
"_doku": "Unbekannte Modellnamen (z.B. 42i/marvin-2608:*) gehen unverändert mit dem Client-Key an LiteLLM. Umstellung je Agent = Modellname 2608 -> 2609. Fällt weg, wenn LiteLLM abgeschaltet wird; dann kommen die 2608-Namen als altnamen zurück."
},
"_rollen_doku": "Rollen entkoppeln Agenten von Modellnamen: ein Agent ruft role/worker, welches Modell dahintersteht, stellt man HIER um -- aus der Ferne, ohne Container-Deploy. Ziele: 42i/*-Alias, openrouter/<id>[:effort] (1:1) oder alt/<id>[:effort] (guenstigste Alternative). Vorbelegung 2026-09-05 (Elton): Fuehrungsrollen high, Rest medium. Feinjustierung Andreas 2026-09-07: teamleader, lead UND xo auf medium (= leader:junior nach 42i/intern#1252). Der xo kam am selben Tag von Claude Code/Max-Abo auf opencode ueber den Router -- ausdruecklich als Versuch, hochstufen ist eine Zeile hier. Damit steht nur noch architect auf high (= allround:senior). role/inka (2026-09-06): Inkas Telefon-Hirn = Luna (Cloud-Optimum: 1,8 s/Zug, Cache greift). Getestet und verworfen: Qwen 3.8 27B via OpenRouter (mit Denken 5,2 s/Zug; ohne Denken 1,4 s, aber kein Cache-Treffer bei AkashML -> 3-4x Kosten) und lokales qwen36:35b auf der B70 (Prefill 7,5 s, Decode 19 s). Alias 42i/inka-qwen bleibt fuer weitere Tests.",
"rollen": {
"xo": "42i/marvin-2609:medium",
"architect": "42i/marvin-2609:high",
"teamleader": "42i/marvin-2609:medium",
"lead": "42i/marvin-2609:medium",
"worker": "42i/marvin-2609:medium",
"engineer": "42i/marvin-2609:medium",
"po": "42i/marvin-2609:medium",
"speaker": "42i/marvin-2609:medium",
"support": "42i/marvin-2609:medium",
"assistant": "42i/marvin-2609:medium",
"privacy": "42i/marvin-2609:medium",
"service": "42i/marvin-2609:medium",
"ops": "42i/marvin-2609:medium",
"marketing": "42i/marvin-2609:medium",
"qa": "42i/marvin-2609:medium",
"perf": "42i/marvin-2609:medium",
"i18n": "42i/marvin-2609:medium",
"docs": "42i/marvin-2609:medium",
"ar": "42i/marvin-2609:medium",
"archivist": "42i/marvin-2609:medium",
"inka": "openrouter/openai/gpt-5.6-luna"
},
"_namen_doku": "Namensraeume: 42i/* = konfigurierte Aliasse (aliases); deizo/* = Modelle im Prod-RZ deizo (kira, fest); openrouter/<id>[:effort] = 1:1 an OpenRouter, Effort als reasoning.effort; alt/<id>[:effort] = guenstigste Alternative derselben Klasse (Intelligence, Coding, Agentic je >= 95 % der Referenz, Kontext >= 90 %, billiger), aufgeloest bei der ersten Anfrage und im 12h-Takt erneuert, OHNE Last-Probe; role/<name> = Rolle (rollen). Alles andere -> fallback (LiteLLM).",
"anthropicModus": "alt",
"_anthropic_doku": "Claude Code/Desktop schicken nackte IDs (claude-sonnet-5, claude-opus-5-20260723, claude-sonnet-4-5[1m]). Der Router normalisiert sie und bildet sie je anthropicModus auf alt/anthropic/<id> (Standard) oder openrouter/anthropic/<id> ab; ein Client-Effort (output_config.effort) wird als Stufe angehaengt. Rechte: die ACL prueft den abgebildeten Namen, also alt/* bzw. openrouter/*."
}