feat(topic-filter): jeden verworfenen Artikel einzeln loggen + Pre-Topic-Content auf 500 Zeichen erhöhen
Beim Aktualisieren von Lage 96 (Verfassungsänderung Japan) ist der Topic-Filter in den letzten Refreshes auf 2/15, 4/26 bzw. 7/23 zurückgefallen. Die jp-RSS- Treffer aus Asahi-Politik, NHK-Politik und Mainichi werden offenbar verworfen, aber ohne Detail-Log lässt sich nicht beurteilen, ob das gerechtfertigt ist. - analyzer.filter_relevant_articles: pro verworfenem Artikel eine INFO-Zeile mit laufendem Index, Quelle, Original-Headline und (falls vorhanden) der englischen Pre-Topic-Übersetzung. Ohne zusätzlichen Claude-Call, nur Logging des bereits vorhandenen Materials. - translator._TOPIC_TRANSLATE_CONTENT_MAX von 240 auf 500 erhöht. Bei dichten Kanji- oder kyrillischen Headlines reichten 240 Zeichen oft nicht aus, um dem nachgelagerten Topic-Filter den thematischen Kontext zu vermitteln. Mehrkosten pro Refresh: vernachlässigbar (Haiku, einmal pro Refresh). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -566,7 +566,10 @@ class AnalyzerAgent:
|
|||||||
}
|
}
|
||||||
filtered = [a for i, a in enumerate(articles, 1) if i in relevant_set]
|
filtered = [a for i, a in enumerate(articles, 1) if i in relevant_set]
|
||||||
|
|
||||||
rejected = len(articles) - len(filtered)
|
rejected_articles = [
|
||||||
|
(idx, a) for idx, a in enumerate(articles, 1) if idx not in relevant_set
|
||||||
|
]
|
||||||
|
rejected = len(rejected_articles)
|
||||||
if not filtered and articles:
|
if not filtered and articles:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f"Topic-Filter hat ALLE {len(articles)} Artikel verworfen — "
|
f"Topic-Filter hat ALLE {len(articles)} Artikel verworfen — "
|
||||||
@@ -578,6 +581,14 @@ class AnalyzerAgent:
|
|||||||
f"Topic-Filter: {len(filtered)}/{len(articles)} Artikel thematisch relevant "
|
f"Topic-Filter: {len(filtered)}/{len(articles)} Artikel thematisch relevant "
|
||||||
f"({rejected} verworfen)"
|
f"({rejected} verworfen)"
|
||||||
)
|
)
|
||||||
|
for idx, a in rejected_articles:
|
||||||
|
src = a.get("source", "Unbekannt")
|
||||||
|
hl = (a.get("headline_de") or a.get("headline") or "").strip()
|
||||||
|
hl_en = (a.get("headline_en_for_topic") or "").strip()
|
||||||
|
if hl_en and hl_en.lower() != hl.lower():
|
||||||
|
logger.info("Topic-Filter REJECT [%d] %s | %s | EN: %s", idx, src, hl[:120], hl_en[:120])
|
||||||
|
else:
|
||||||
|
logger.info("Topic-Filter REJECT [%d] %s | %s", idx, src, hl[:120])
|
||||||
return filtered, usage
|
return filtered, usage
|
||||||
|
|
||||||
async def generate_latest_developments(
|
async def generate_latest_developments(
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ async def translate_articles_batch(
|
|||||||
# sie wird auch dann gemacht, wenn der nachgelagerte Volltext-Translator
|
# sie wird auch dann gemacht, wenn der nachgelagerte Volltext-Translator
|
||||||
# deaktiviert ist (Pflicht für korrektes Topic-Filtering, sehr kleine Kosten).
|
# deaktiviert ist (Pflicht für korrektes Topic-Filtering, sehr kleine Kosten).
|
||||||
|
|
||||||
_TOPIC_TRANSLATE_CONTENT_MAX = 240
|
_TOPIC_TRANSLATE_CONTENT_MAX = 500
|
||||||
|
|
||||||
|
|
||||||
def _needs_pretopic_translate(article: dict) -> bool:
|
def _needs_pretopic_translate(article: dict) -> bool:
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren