fix(models): Modell-Liste kommt jetzt von Anthropic — und feste Versionen greifen wirklich

Zwei Fehler. Der zweite war der schlimmere.

1) Die Liste war handgepflegt und damit garantiert veraltet.
   Sie kannte "Opus (aktuell: Opus 5)" — waehrend es laengst Opus 5.5,
   Sonnet 5.5 und Fable 5.1 gab. Der Knopf "↻ Aktualisieren" las nur eine
   lokale Datei neu und aktualisierte damit gar nichts.

   Jetzt kommt die Liste aus Anthropics eigenem Modell-Katalog
   (downloads.claude.ai/model-catalog/v1/catalog.json, Surface 'cc') —
   dieselbe Quelle, aus der sich Claude Code selbst bedient. Oeffentlich,
   ohne API-Key (die Models-API braucht einen; mit dem Max-Abo gibt es keinen).
   6h-Cache plus Datei-Cache, der auch offline und bei abgelaufenem TTL
   einspringt: eine etwas alte echte Liste ist besser als keine.

   Die Tier-Aliase (opus/sonnet/haiku/fable) bleiben vorne und bleiben die
   Empfehlung — sie folgen automatisch der neuesten Version. Darunter die
   exakten Versionen, aeltere ausdruecklich als solche markiert.

2) Eine feste Version liess sich faktisch nicht waehlen.
   extractModel() hatte eine MODEL_MAP und fiel fuer alles Unbekannte STILL
   auf "opus" zurueck. Wer "claude-opus-5-5" setzte, bekam ohne jede Meldung
   das Tier-Default. Schlimmer noch: claude-opus-5 und claude-fable-5 standen
   selbst in der Map und wurden auf ihr Tier eingeschmolzen — eine bewusst
   gewaehlte aeltere Version wurde also durch die neueste ersetzt.

   Volle Modellnamen gehen jetzt unveraendert an die CLI. Die versteht sie
   ("--model: an alias for the latest model or a model's full name") und
   meldet sich selbst klar, wenn sie einen Namen nicht kennt — ehrlicher als
   ein stilles Downgrade. Nur echter Muell faellt noch auf "opus", und das
   wird geloggt.

Nachgewiesen gegen den LIVE-Katalog und die echte CLI im Proxy-Container:
20 Pruefungen gruen, u.a. dass alle 12 gelieferten exakten Versionen den Proxy
unveraendert passieren. `claude --print --model claude-opus-5-5` antwortet.
Stefans aktive Einstellung ist der Alias "opus" — am laufenden Betrieb aendert
sich dadurch nichts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-03 10:47:34 +02:00
co-authored by Claude Opus 5
parent 4c0d8ce3fe
commit 09d06011d5
4 changed files with 218 additions and 29 deletions
+29 -11
View File
@@ -15,29 +15,47 @@
* (siehe docker-compose.yml proxy-Block).
*/
// NUR echte Tier-Aliase. Die CLI loest sie selbst auf die aktuelle Version des
// Tiers auf.
//
// Hier standen frueher auch volle Versionen (claude-opus-5 → "opus",
// claude-fable-5 → "fable", ...). Das war falsch: wer bewusst eine BESTIMMTE
// Version waehlte, bekam still das Tier-Default — also unter Umstaenden ein
// ganz anderes Modell als ausgewaehlt. Volle Namen gehen jetzt unveraendert an
// die CLI (siehe extractModel), die versteht sie.
const MODEL_MAP = {
"claude-opus-4": "opus",
"claude-sonnet-4": "sonnet",
"claude-haiku-4": "haiku",
"claude-code-cli/claude-opus-4": "opus",
"claude-code-cli/claude-sonnet-4": "sonnet",
"claude-code-cli/claude-haiku-4": "haiku",
"opus": "opus",
"sonnet": "sonnet",
"haiku": "haiku",
"fable": "fable",
"claude-fable-5": "fable",
"claude-code-cli/opus": "opus",
"claude-code-cli/sonnet": "sonnet",
"claude-code-cli/haiku": "haiku",
"claude-code-cli/fable": "fable",
// Volle aktuelle IDs (falls die App/Diagnostic sie mal direkt setzt)
"claude-opus-5": "opus",
"claude-sonnet-5": "sonnet",
"claude-haiku-4-5": "haiku",
};
// Echte Claude-Modellnamen: claude-<familie>-<zahlen/suffixe>.
// Die CLI nimmt laut `claude --help` "an alias for the latest model (e.g.
// 'fable', 'opus', or 'sonnet') or a model's full name" — exakte Versionen
// darf man also direkt durchreichen.
const FULL_MODEL_RE = /^claude-[a-z]+-[0-9][0-9a-z.-]*$/;
export function extractModel(model) {
if (MODEL_MAP[model]) return MODEL_MAP[model];
const stripped = (model || "").replace(/^claude-code-cli\//, "");
if (MODEL_MAP[stripped]) return MODEL_MAP[stripped];
// Exakte Version durchreichen statt sie auf einen Tier einzuschmelzen.
//
// Vorher landete JEDER unbekannte Name still auf "opus". Damit war eine
// neuere Version faktisch nicht waehlbar: wer "claude-opus-5-5" setzte,
// bekam ohne jede Meldung das Tier-Default — die Einstellung sah gesetzt
// aus und tat nichts. Kennt die CLI den Namen nicht, sagt SIE das deutlich
// ("isn't described by this version's model catalog"), und das ist die
// ehrlichere Antwort als ein stilles Downgrade.
if (FULL_MODEL_RE.test(stripped)) return stripped;
if (stripped) {
console.error(`[aria-model] Unbekannter Modellname ${JSON.stringify(stripped)} — nutze 'opus'`);
}
return "opus";
}