llmrouter: Alias-Art schwelle (Index + Mindestkontext), Stufen 25/40/47/50

billigsterUeberSchwelle in openrouter-auswahl, gemeinsamer klasseFiltern
mit dem Referenzmodus. Stufen jetzt als Schwelle: low 25/256k, medium
40/256k, high 47/500k, max 50/500k (Andreas 2026-09-05).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 07:27:34 +02:00
co-authored by Claude Fable 5.1
parent d8cc9b5dbb
commit 3b9ad85825
4 changed files with 36 additions and 18 deletions
+17 -9
View File
@@ -12,7 +12,7 @@
*/
import { readFileSync, writeFileSync, appendFileSync, mkdirSync, existsSync, statSync } from "fs";
import {
apiKeyHolen, aaKeyHolen, listenHolen, kandidatenBauen, sperrliste, guenstigereAlternative,
apiKeyHolen, aaKeyHolen, listenHolen, kandidatenBauen, sperrliste, guenstigereAlternative, billigsterUeberSchwelle,
variantenHolen, referenzParsen, referenzFormat, type Variante, type Effort,
} from "../../llmlite/openrouter-auswahl.ts";
import { configLaden, type Config } from "./config.ts";
@@ -74,20 +74,28 @@ export async function aufloesen(c: Config, bisher: State, opts?: { dryRun?: bool
const neu: State = { aktualisiert: new Date().toISOString(), zuordnung: { ...bisher.zuordnung } };
for (const [alias, def] of Object.entries(c.aliases)) {
if (def.art !== "alternative") continue;
if (def.art === "fest") continue;
const alt = bisher.zuordnung[alias];
try {
const abgelehnt: string[] = [];
const { referenz, auswahl } = await guenstigereAlternative(def.referenz, alle, key,
(id, grund) => abgelehnt.push(`${id}: ${grund}`), gesperrt,
{ varianten, lasttest: c.lasttest, bestand: alt?.model });
const ziel: Zuordnung = auswahl === null
? { model: referenz.id, effort: referenz.effort ?? null, index: referenz.index, weighted: referenz.weighted, referenz: def.referenz, seit: alt?.seit ?? neu.aktualisiert, istReferenz: true }
: { model: auswahl.candidate.id, effort: auswahl.candidate.effort ?? null, index: auswahl.candidate.index, weighted: auswahl.candidate.weighted, referenz: def.referenz, seit: alt?.seit ?? neu.aktualisiert, istReferenz: false };
const melden = (id: string, grund: string) => abgelehnt.push(`${id}: ${grund}`);
const o = { varianten, lasttest: c.lasttest, bestand: alt?.model };
let ziel: Zuordnung;
if (def.art === "alternative") {
const { referenz, auswahl } = await guenstigereAlternative(def.referenz, alle, key, melden, gesperrt, o);
ziel = auswahl === null
? { model: referenz.id, effort: referenz.effort ?? null, index: referenz.index, weighted: referenz.weighted, referenz: def.referenz, seit: alt?.seit ?? neu.aktualisiert, istReferenz: true }
: { model: auswahl.candidate.id, effort: auswahl.candidate.effort ?? null, index: auswahl.candidate.index, weighted: auswahl.candidate.weighted, referenz: def.referenz, seit: alt?.seit ?? neu.aktualisiert, istReferenz: false };
} else {
const beschreibung = `Index>=${def.index}, Kontext>=${def.minContext}`;
const { auswahl } = await billigsterUeberSchwelle(def.index, def.minContext, alle, key, melden, gesperrt, o);
if (auswahl === null) throw new Error(`kein Modell erfuellt ${beschreibung}`);
ziel = { model: auswahl.candidate.id, effort: auswahl.candidate.effort ?? null, index: auswahl.candidate.index, weighted: auswahl.candidate.weighted, referenz: beschreibung, seit: alt?.seit ?? neu.aktualisiert, istReferenz: false };
}
const gleich = alt !== undefined && alt.model === ziel.model && alt.effort === ziel.effort;
if (!gleich) {
ziel.seit = neu.aktualisiert;
const zeile = `${neu.aktualisiert} ${alias}: ${alt ? referenzFormat(alt.model, alt.effort) : "(neu)"} -> ${referenzFormat(ziel.model, ziel.effort)} (Index ${ziel.index.toFixed(1)}, ${ziel.weighted.toFixed(2)} $/1M gewichtet, Referenz ${def.referenz}${ziel.istReferenz ? ", = Referenz" : ""})`;
const zeile = `${neu.aktualisiert} ${alias}: ${alt ? referenzFormat(alt.model, alt.effort) : "(neu)"} -> ${referenzFormat(ziel.model, ziel.effort)} (Index ${ziel.index.toFixed(1)}, ${ziel.weighted.toFixed(2)} $/1M gewichtet, ${ziel.referenz}${ziel.istReferenz ? ", = Referenz" : ""})`;
log(zeile);
if (!opts?.dryRun) { mkdirSync(c.logDir, { recursive: true }); appendFileSync(`${c.logDir}/changes.log`, zeile + "\n"); }
}