From f0ef9c57d42767de0947bd5e744c509eda59d327 Mon Sep 17 00:00:00 2001 From: Benjamin Sutter Date: Sun, 30 Aug 2026 19:28:04 +0200 Subject: [PATCH] feat(livia): das verwendete Modell steht im Ergebnis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Modellwahl läuft über eine Umgebungsvariable im Hosting-Dashboard. Damit sah man nirgends in der Anwendung, welches Modell gerade urteilt — und eine Einstellung, die man nur im Dashboard prüfen kann, prüft niemand. Der Refresh gibt das Modell jetzt zurück, die Kopfzeile zeigt es neben dem Zeitstempel. Wer wissen will, ob die Umstellung angekommen ist, sieht es dort, wo er ohnehin hinschaut. Co-Authored-By: Claude Opus 5 (1M context) --- api/_lib/researchAnalysis.ts | 2 +- api/livia/research/refresh.ts | 3 ++- src/components/research/ResearchWorkspace.tsx | 1 + src/domain/researchLead.ts | 8 ++++++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/api/_lib/researchAnalysis.ts b/api/_lib/researchAnalysis.ts index 8b9ef93..f2eca53 100644 --- a/api/_lib/researchAnalysis.ts +++ b/api/_lib/researchAnalysis.ts @@ -102,7 +102,7 @@ const BATCH_SIZE = 5 * claude-sonnet-5 ≈ 0.20 USD * claude-haiku-4-5 ≈ 0.08 USD für eine Ja/Nein-Einordnung meist ausreichend */ -const MODEL = process.env.LIVIA_RESEARCH_MODEL ?? 'claude-opus-5' +export const MODEL = process.env.LIVIA_RESEARCH_MODEL ?? 'claude-opus-5' /** * Wie viel Artikeltext das Modell zu lesen bekommt. diff --git a/api/livia/research/refresh.ts b/api/livia/research/refresh.ts index 8140bcd..1dcfdc0 100644 --- a/api/livia/research/refresh.ts +++ b/api/livia/research/refresh.ts @@ -21,7 +21,7 @@ import { fetchZefixResearch, } from '../../_lib/researchSources.js' import type { ResearchItem } from '../../_lib/researchSources.js' -import { analyzeResearchItems } from '../../_lib/researchAnalysis.js' +import { MODEL, analyzeResearchItems } from '../../_lib/researchAnalysis.js' import type { ResearchRefreshResult, ResearchSourceResult } from '../../../src/domain/researchLead.js' interface Quelle { @@ -80,6 +80,7 @@ export default async function handler(req: IncomingMessage, res: ServerResponse) watchlist: 0, leads: [], refreshedAt: new Date().toISOString(), + model: MODEL, } if (items.length === 0) { diff --git a/src/components/research/ResearchWorkspace.tsx b/src/components/research/ResearchWorkspace.tsx index cbd4f03..608fbd6 100644 --- a/src/components/research/ResearchWorkspace.tsx +++ b/src/components/research/ResearchWorkspace.tsx @@ -80,6 +80,7 @@ export function ResearchWorkspace() { {`${ergebnis.watchlist} Watchlist · `} {`${ergebnis.leads.length} ${ergebnis.leads.length === 1 ? 'relevante Entwicklung' : 'relevante Entwicklungen'}`} {` · Stand ${new Date(ergebnis.refreshedAt).toLocaleTimeString('de-CH', { hour: '2-digit', minute: '2-digit' })}`} + {ergebnis.model && ` · Modell ${ergebnis.model}`} )} diff --git a/src/domain/researchLead.ts b/src/domain/researchLead.ts index 8e2aa06..8e49143 100644 --- a/src/domain/researchLead.ts +++ b/src/domain/researchLead.ts @@ -72,6 +72,14 @@ export interface ResearchRefreshResult { leads: ResearchLead[] /** Zeitpunkt des Laufs, ISO. */ refreshedAt: string + /** + * Welches Modell die Einordnung vorgenommen hat. + * + * Wird angezeigt, weil die Modellwahl über eine Umgebungsvariable läuft und + * man sonst nirgends in der Anwendung sähe, welche gerade gilt — eine + * Einstellung, die man nur im Hosting-Dashboard prüfen kann, prüft niemand. + */ + model: string /** * Gesetzt, wenn die Analyse nicht laufen konnte — etwa weil serverseitig * kein Schlüssel hinterlegt ist. Die Oberfläche sagt das dann offen, statt