From f2926d6bcb3cff72704251078f464edaeccf61cf Mon Sep 17 00:00:00 2001 From: Benjamin Sutter Date: Sun, 30 Aug 2026 20:12:28 +0200 Subject: [PATCH] fix(livia): effort-Schalter nur an Modelle, die ihn kennen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- api/_lib/researchAnalysis.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/api/_lib/researchAnalysis.ts b/api/_lib/researchAnalysis.ts index f2eca53..b4f6711 100644 --- a/api/_lib/researchAnalysis.ts +++ b/api/_lib/researchAnalysis.ts @@ -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) +/** + * 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. * @@ -148,8 +166,9 @@ async function analyzeBatch( max_tokens: 8000, system: SYSTEM_PROMPT, // Einordnen ist bei fünf Einträgen eine Routineaufgabe — die niedrige Stufe - // spart Zeit und Kosten, ohne das Modell zu wechseln. - output_config: { effort: 'low' }, + // spart Zeit und Kosten. Nur die grossen Modelle kennen den Schalter; bei + // den kleineren wird die Anfrage sonst abgewiesen (siehe SUPPORTS_EFFORT). + ...(supportsEffort(MODEL) ? { output_config: { effort: 'low' as const } } : {}), messages: [{ role: 'user', content: eingabe }], })