Router: Namensraum auto/ mit acht Profilen auf drei Achsen (42i/intern#1252)

Der Preisfinder waehlte bisher ueber EINE Zahl. Ein Modell kann generalistisch
gut aussehen und agentisch durchfallen -- gemini-3.8-flash hat Coding 76,3 und
Agentic 41,2 und traegt den Werkzeug-Rundlauf nicht.

- openrouter-auswahl: billigsterUeberSchwelle reicht minCoding/minAgentic an
  klasseFiltern durch (nahm es bereits entgegen, wurde nur nie gefuettert)
- config: art "schwelle" hat jetzt index, coding und agentic, jede optional;
  "fest" kennt ausweich
- resolver: Beschreibung nennt die geforderten Achsen
- server: ein festes Ziel weicht bei Upstream-Ausfall EINMAL auf den
  konfigurierten Alias aus. Ohne das haengt mit dem lokalen Knoten jede
  Titelzeile jedes Agenten, weil auto/mass ueberall als small_model haengt.
- acht Profile, Rollen darauf umgehaengt, 42i/marvin-2609:* bleiben als Namen

Aufgeloest (ohne Last-Probe, alle Ziele laufen bereits ueber bestehende
Aliasse): coding:junior und leader:junior -> glm-5.3-flash, coding:senior ->
grok-4.6:high, leader:senior -> glm-5.3:max (15,66 statt 26 gewichtet -- die
Regel findet etwas Billigeres als die Schaetzung im Ticket), mass:fast -> ling.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 13:20:10 +02:00
committed by andreas
co-authored by Claude Opus 5
parent a95c525a2c
commit 7fea5c82c4
5 changed files with 137 additions and 32 deletions
+8 -2
View File
@@ -149,8 +149,14 @@ export async function aufloesen(c: Config, bisher: State, opts?: { dryRun?: bool
const { referenz, auswahl } = await guenstigereAlternative(def.referenz, d.alle, d.key, melden, d.gesperrt, o);
ziel = auswahl === null ? zuordnungAus(referenz, def.referenz, alt?.seit ?? neu.aktualisiert, true) : zuordnungAus(auswahl.candidate, def.referenz, alt?.seit ?? neu.aktualisiert, false);
} else {
const beschreibung = `Index>=${def.index}, Kontext>=${def.minContext}`;
const { auswahl } = await billigsterUeberSchwelle(def.index, def.minContext, d.alle, d.key, melden, d.gesperrt, o);
const teile = [
def.index !== undefined ? `Index>=${def.index}` : null,
def.coding !== undefined ? `Coding>=${def.coding}` : null,
def.agentic !== undefined ? `Agentic>=${def.agentic}` : null,
`Kontext>=${def.minContext}`,
].filter((t): t is string => t !== null);
const beschreibung = teile.join(", ");
const { auswahl } = await billigsterUeberSchwelle(def.index ?? 0, def.minContext, d.alle, d.key, melden, d.gesperrt, { ...o, minCoding: def.coding, minAgentic: def.agentic });
if (auswahl === null) throw new Error(`kein Modell erfuellt ${beschreibung}`);
ziel = zuordnungAus(auswahl.candidate, beschreibung, alt?.seit ?? neu.aktualisiert, false);
}