fix(livia): effort-Schalter nur an Modelle, die ihn kennen

Nach der Umstellung auf Haiku 4.5 scheiterte jeder Beurteilungsaufruf mit
«This model does not support the effort parameter». Der Schalter war für Opus
gesetzt und wurde bedingungslos mitgeschickt — bei einem Modell, das über eine
Umgebungsvariable frei wählbar ist, darf das nicht sein. Eine
Kostenoptimierung, die die Funktion zur Laufzeit kaputtmacht, ist keine.

Der Schalter geht jetzt nur noch an Modelle, die ihn kennen. Bewusst als
Erlaubnisliste: ein unbekanntes Modell läuft ohne ihn — das kostet etwas mehr,
funktioniert aber. Die umgekehrte Voreinstellung würde raten und scheitern.

Ergebnis des ersten vollständigen Haiku-Laufs auf Produktion: 49 Einträge, 38
verworfen, 2 Watchlist, 9 Leads, davon 5 mit hoher Relevanz — mehr als Opus 5
im Vergleichslauf am selben Bestand fand, bei einem Zehntel der Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin SutterandClaude Opus 5 committed 2026-08-30 20:12:28 +02:00
1 parent f0ef9c57d4
commit f2926d6bcb
1 file changed
+21 -2
+21 -2
View File
@@ -113,6 +113,24 @@ export const MODEL = process.env.LIVIA_RESEARCH_MODEL ?? 'claude-opus-5'
*/ */
const TEXT_LIMIT = Number(process.env.LIVIA_RESEARCH_TEXT_LIMIT ?? 2000) const TEXT_LIMIT = Number(process.env.LIVIA_RESEARCH_TEXT_LIMIT ?? 2000)
/**
* Welche Modelle den `effort`-Schalter kennen.
*
* Nicht alle tun das: Haiku 4.5 weist die Anfrage mit «This model does not
* support the effort parameter» ab. Da das Modell über eine Umgebungsvariable
* frei wählbar ist, darf der Schalter nicht bedingungslos mitgeschickt werden —
* sonst macht eine Kostenoptimierung die Funktion kaputt, und zwar erst zur
* Laufzeit.
*
* Bewusst als Erlaubnisliste: Ein unbekanntes Modell läuft dann ohne den
* Schalter. Das kostet etwas mehr, funktioniert aber — die umgekehrte
* Voreinstellung würde raten und scheitern.
*/
const EFFORT_MODELS = /^claude-(fable|mythos|opus|sonnet)-/
function supportsEffort(model: string): boolean {
return EFFORT_MODELS.test(model)
}
/** /**
* Wie viele Teilstapel gleichzeitig beurteilt werden. * Wie viele Teilstapel gleichzeitig beurteilt werden.
* *
@@ -148,8 +166,9 @@ async function analyzeBatch(
max_tokens: 8000, max_tokens: 8000,
system: SYSTEM_PROMPT, system: SYSTEM_PROMPT,
// Einordnen ist bei fünf Einträgen eine Routineaufgabe — die niedrige Stufe // Einordnen ist bei fünf Einträgen eine Routineaufgabe — die niedrige Stufe
// spart Zeit und Kosten, ohne das Modell zu wechseln. // spart Zeit und Kosten. Nur die grossen Modelle kennen den Schalter; bei
output_config: { effort: 'low' }, // den kleineren wird die Anfrage sonst abgewiesen (siehe SUPPORTS_EFFORT).
...(supportsEffort(MODEL) ? { output_config: { effort: 'low' as const } } : {}),
messages: [{ role: 'user', content: eingabe }], messages: [{ role: 'user', content: eingabe }],
}) })