feat: automatische Wort-Kategorisierung (Batches API + Sofort-Backfill)

Feste ~20er-Taxonomie geseedet (de/en/sv, published; bestehende
Kategorien werden wiederverwendet) + Tabelle category_batches.

src/lib/classifyWords.js: findet in Pairs verwendete Wörter ohne
Kategorie und klassifiziert sie per Haiku gegen die feste Liste.
- Stundenjob über die Message Batches API (asynchron, ~50% günstiger):
  submit/collect-Ticks, in index.js nach Boot + stündlich.
- Sofortiger synchroner One-Shot-Backfill (classifyWordsSync) für
  Live-Test ohne 24h-Verzug.
Beides materialisiert pair_categories via derivePairCategories.

POST /api/categories/auto-assign (admin): ?sync=true = Sofort-Backfill,
sonst ein Batch-Tick. Entkoppelt von generate-words und Publish.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 14:27:09 +02:00
parent 9738d3e35a
commit d66cff3f61
4 changed files with 365 additions and 0 deletions

View File

@@ -62,5 +62,13 @@ migrate()
// Hängengebliebene Pipeline-Läufe (z.B. nach Redeploy) wieder aufnehmen
require('./lib/pipeline').resumePending()
.catch(err => console.error('Pipeline-Resume fehlgeschlagen:', err));
// Automatische Wort-Kategorisierung (Message Batches API): kurz nach Boot + stündlich.
// Submit/Collect-Ticks, entkoppelt von generate-words und Publish.
const { runCategorizationTick } = require('./lib/classifyWords');
const HOUR = 60 * 60 * 1000;
const tick = () => runCategorizationTick().catch(err => console.error('Auto-Kategorisierung:', err.message));
setTimeout(tick, 30_000);
setInterval(tick, HOUR);
})
.catch(err => { console.error('Migration failed:', err); process.exit(1); });