{ "_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" } }, "_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/[:effort] (1:1) oder alt/[:effort] (guenstigste Alternative). Vorbelegung 2026-09-05 (Elton): Fuehrungsrollen high, Rest medium -- Andreas' Feinjustierung ausstehend.", "rollen": { "xo": "42i/marvin-2609:high", "architect": "42i/marvin-2609:high", "teamleader": "42i/marvin-2609:high", "lead": "42i/marvin-2609:high", "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" }, "_namen_doku": "Namensraeume: 42i/* = konfigurierte Aliasse (aliases); deizo/* = Modelle im Prod-RZ deizo (kira, fest); openrouter/[:effort] = 1:1 an OpenRouter, Effort als reasoning.effort; alt/[: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/ = 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/ (Standard) oder openrouter/anthropic/ ab; ein Client-Effort (output_config.effort) wird als Stufe angehaengt. Rechte: die ACL prueft den abgebildeten Namen, also alt/* bzw. openrouter/*." }