diff --git a/config.json b/config.json index 444babd..522e4a3 100644 --- a/config.json +++ b/config.json @@ -238,5 +238,28 @@ }, "_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/*." + "_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/*.", + "altnamen": { + "42i/marvin-2608:none": "42i/marvin-2609:low", + "42i/marvin-2608:low": "42i/marvin-2609:low", + "42i/marvin-2608:medium": "42i/marvin-2609:medium", + "42i/marvin-2608:high": "42i/marvin-2609:high", + "42i/marvin-2608:extra": "42i/marvin-2609:high", + "42i/marvin-2608:ultra": "42i/marvin-2609:max", + "42i/marvin-2608-core:none": "42i/marvin-2609-core:none", + "42i/marvin-2608-core:medium": "42i/marvin-2609-core:medium", + "42i/marvin-2608-auto": "auto/allround:junior", + "42i/marvin-2608-mass:none": "auto/mass:fast", + "42i/marvin-2608-mass:medium": "auto/mass:fast", + "42i/marvin-2608-mass": "auto/mass:fast", + "marvin-tts": "42i/marvin-tts", + "marvin-stt": "42i/marvin-stt", + "marvin-tts-turbo": "42i/marvin-tts-turbo", + "marvin-stt-turbo": "42i/marvin-stt-turbo", + "marvin-embedding": "42i/marvin-embedding", + "kira-reasoning": "deizo/kira-reasoning", + "kira-stt": "deizo/kira-stt", + "kira-tts": "deizo/kira-tts" + }, + "_altnamen_doku": "Alte Modellnamen (LiteLLM-Zeit) auf heutige Aliasse. Eine laufende opencode- oder Claude-Sitzung traegt ihren Modellnamen bis zum Ende mit; verschwindet er waehrend des Laufs aus der Config, stirbt sie beim naechsten Zug. Am 2026-09-07 hat das fuenf Teamlaeufe gekostet (Lehre im Kommentar zu 42i/intern#1251). Die Uebersetzung greift VOR ACL-Pruefung und Aufloesung. Eintraege koennen weg, wenn sicher ist, dass niemand den alten Namen mehr traegt." } diff --git a/src/server.ts b/src/server.ts index 711502f..5690d81 100644 --- a/src/server.ts +++ b/src/server.ts @@ -99,7 +99,15 @@ function eigenerName(name: string): boolean { } async function zielBestimmen(angefragtRoh: string, keyName: string, clientEffort: Effort | null = null): Promise { - const angefragt = anthropicName(angefragtRoh, clientEffort) ?? angefragtRoh; + // Altnamen zuerst: eine laufende Sitzung traegt ihren Modellnamen bis zum + // Ende mit. Verschwindet er waehrend des Laufs aus der Config, stirbt der + // Lauf beim naechsten Zug an "Unbekanntes Modell" -- am 2026-09-07 hat genau + // das fuenf Teamlaeufe gekostet (42i/intern#1251). Das Feld war deklariert, + // aber nie angewendet; die Uebersetzung passiert VOR ACL und Aufloesung, + // damit der alte Name sich in jeder Hinsicht wie der neue verhaelt. + const ausAltname = config.altnamen?.[angefragtRoh]; + const roh = ausAltname ?? angefragtRoh; + const angefragt = anthropicName(roh, clientEffort) ?? roh; if (!eigenerName(angefragt)) { if (config.fallback !== undefined) { const u = config.fallback.upstream;