fix(livia): Beurteilung in Fünferstapeln statt einem Zwanzigerstapel
Der erste Live-Lauf mit Schlüssel deckte auf, dass ein einziger Aufruf über alle zwanzig Einträge das Urteil verwässert. Eine Meldung über eine zweistellige Millioneninvestition in eine neue Brauerei samt Arealentwicklung fiel als «nicht relevant» durch; derselbe Prompt, dasselbe Modell und dieselbe Meldung ergaben in einem Stapel von drei «Investition, hohe Relevanz, 0.85». Eine höhere Effort-Stufe half nicht, sie machte es messbar schlechter. Der Hebel ist die Stapelgrösse. Die Teilstapel laufen parallel — die Laufzeit ist damit die des langsamsten und nicht deren Summe: 48 Sekunden vorher, 16 danach. Das ist zugleich die Voraussetzung fürs Deployment: die serverlose Funktion hat voreingestellt 10 Sekunden Zeit. `vercel.json` hebt das Limit nun ausdrücklich auf 60 Sekunden an, was auch bei einer langsamen Quelle reicht. Ausserdem: Der Linktext der Handelskammer trägt das Publikationsdatum vorneweg und ein »-Zeichen hinten. Beides stand bisher im Titel, den das Modell zu lesen bekam, und gehört dort nicht hin. Geprüft: tsc 0 Fehler, eslint 0 Fehler/0 Warnungen, Live-Lauf 20 Einträge aus 3/3 Quellen in 17 Sekunden. Die Urteile sind stichprobenweise gegen die Originalartikel geprüft und tragfähig — eine Bäckereieröffnung in Westaustralien und eine Übernahme in Thailand werden zutreffend als ohne Schweizer Flächenbezug verworfen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
2a0ba287f6
commit
93ecc852e3
3 files changed
+70
-20
No files matched your search
@@ -94,6 +94,18 @@ function extractArticleText(html: string): string {
|
||||
return sammle('p').join('\n').slice(0, 2500)
|
||||
}
|
||||
|
||||
/**
|
||||
* Der Linktext trägt bei der Handelskammer das Publikationsdatum vorneweg
|
||||
* («28. August 2026 Bystronic übernimmt …») und hinten ein »-Zeichen. Beides
|
||||
* gehört nicht in den Titel, den das Modell zu lesen bekommt.
|
||||
*/
|
||||
function cleanTitle(raw: string): string {
|
||||
return raw
|
||||
.replace(/^\d{1,2}\.\s*\p{L}+\s+\d{4}\s*/u, '')
|
||||
.replace(/\s*[»›>]\s*$/, '')
|
||||
.trim()
|
||||
}
|
||||
|
||||
function absolute(href: string, base: string): string {
|
||||
try {
|
||||
return new URL(href, base).toString()
|
||||
@@ -125,7 +137,7 @@ export async function fetchZhkResearch(): Promise<ResearchItem[]> {
|
||||
try {
|
||||
const html = await getText(l.url)
|
||||
const $a = cheerio.load(html)
|
||||
const title = l.title || $a('h1').first().text().replace(/\s+/g, ' ').trim()
|
||||
const title = cleanTitle(l.title) || $a('h1').first().text().replace(/\s+/g, ' ').trim()
|
||||
const published =
|
||||
$a('time').first().attr('datetime') ||
|
||||
$a('meta[property="article:published_time"]').attr('content') ||
|
||||
@@ -166,7 +178,7 @@ export async function fetchGreaterZurichResearch(): Promise<ResearchItem[]> {
|
||||
try {
|
||||
const html = await getText(l.url)
|
||||
const $a = cheerio.load(html)
|
||||
const title = l.title || $a('h1').first().text().replace(/\s+/g, ' ').trim()
|
||||
const title = cleanTitle(l.title) || $a('h1').first().text().replace(/\s+/g, ' ').trim()
|
||||
items.push({
|
||||
source: SOURCES.GZA.name,
|
||||
title,
|
||||
|
||||
Reference in new issue
Block a user