From e986e9f27428b4490b9ab731da5bd37570d283e9 Mon Sep 17 00:00:00 2001 From: Benjamin Sutter Date: Sun, 30 Aug 2026 19:14:36 +0200 Subject: [PATCH] fix(livia): ein Totalausfall der Beurteilung wird nicht mehr verschwiegen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim Messen des Tokenverbrauchs fiel auf, dass ein Lauf «49 Informationen analysiert · 0 nicht relevant · 0 Watchlist · 0 relevante Entwicklungen» meldete — was wie ein sauberer Lauf ohne Treffer aussieht. Tatsächlich war jeder einzelne Beurteilungsaufruf mit «Your credit balance is too low» gescheitert. Der `catch` um den Teilstapel fing den Fehler ab, damit ein Ausfall nicht die übrigen mitreisst, und verlor dabei den Grund. Scheitern alle Teilstapel, ist das kein leeres Ergebnis, sondern ein Ausfall. Der Grund wird jetzt weitergereicht und erscheint als Warnung über der Liste. Scheitern nur einzelne, bleibt es beim bisherigen Verhalten: die übrigen Leads werden gezeigt. Das ist die unangenehmste Fehlerklasse überhaupt — eine, die wie ein Ergebnis aussieht. In einer Präsentation hätte niemand gemerkt, dass Livia gar nicht gearbeitet hat. Geprüft: tsc 0 Fehler, eslint 0 Fehler/0 Warnungen; der Lauf meldet den Fehler jetzt sichtbar statt eine leere Liste. Co-Authored-By: Claude Opus 5 (1M context) --- api/_lib/researchAnalysis.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/api/_lib/researchAnalysis.ts b/api/_lib/researchAnalysis.ts index 8ff6b4e..a900792 100644 --- a/api/_lib/researchAnalysis.ts +++ b/api/_lib/researchAnalysis.ts @@ -162,15 +162,18 @@ export async function analyzeResearchItems(items: ResearchItem[]): Promise>[] = new Array(teilstapel.length) + const fehler: string[] = [] let next = 0 const worker = async (): Promise => { for (;;) { const i = next++ if (i >= teilstapel.length) return - // Ein gescheiterter Teilstapel darf die übrigen nicht mitreissen. + // Ein gescheiterter Teilstapel darf die übrigen nicht mitreissen — aber + // sein Grund darf auch nicht verlorengehen, siehe unten. try { ergebnisse[i] = await analyzeBatch(client, teilstapel[i]) - } catch { + } catch (err) { + fehler.push(err instanceof Error ? err.message : String(err)) ergebnisse[i] = [] } } @@ -178,6 +181,18 @@ export async function analyzeResearchItems(items: ResearchItem[]): Promise