feat: KI-Review-Schritt in der Pipeline (Korrekturlesen vor Audio)

Alle Pairs eines Bildes (de/en/sv) gehen zusammen mit dem Bild an Sonnet
zur Prüfung von Rechtschreibung, Übersetzungs-Konsistenz und Plausibilität.
Korrekturen werden vor der Audio-Erzeugung angewendet; vorhandene Audios
korrigierter Zellen werden invalidiert. Review-Fehler sind nicht fatal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 21:41:20 +02:00
parent 96ae76f295
commit ddbd879dab
3 changed files with 247 additions and 3 deletions

View File

@@ -1,10 +1,11 @@
// Automatische Content-Pipeline pro Bild: Pairs generieren → übersetzen → Audio → ready.
// Automatische Content-Pipeline pro Bild: Pairs generieren → übersetzen → KI-Review → Audio → ready.
// In-Process-Queue mit einem Worker (rate-limit-freundlich). Jeder Schritt ist idempotent,
// d.h. ein Resume nach Crash/Redeploy überspringt bereits Erledigtes.
const { query } = require('../db');
const { LANGS, fillMissingRow } = require('./translate');
const { translateWordGroup } = require('./pairContent');
const { generatePairsForObject, persistPair } = require('./generatePairs');
const { reviewPicturePairs } = require('./reviewPairs');
const { generateAndStore, describeError } = require('../routes/audios');
const queue = [];
@@ -153,6 +154,25 @@ async function runPicture(pictureId) {
await setStep(pictureId, 'translate', progress);
}
// ── Step 2.5: KI-Review — alle Pairs + Bild an Sonnet zum Korrekturlesen ────
// (Rechtschreibung, Übersetzungs-Konsistenz, Plausibilität zum Bild). Korrekturen
// landen vor der Audio-Erzeugung in der DB; Fehler sind wie beim Übersetzen nicht
// fatal — Audio läuft trotzdem, der Lauf wird nicht abgebrochen.
progress.reviewedPairs = 0;
progress.correctionsApplied = 0;
progress.reviewFailures = 0;
await setStep(pictureId, 'review', progress);
try {
await reviewPicturePairs({
pictureId, pictureUrl: picture.picture_link, pairs, progress,
onProgress: () => setStep(pictureId, 'review', progress),
});
} catch (err) {
progress.reviewFailures++;
console.error(`Review-Fehler bei Bild ${pictureId}:`, err.message);
}
await setStep(pictureId, 'review', progress);
// ── Step 3: Audio für alle Sätze + Wörter des Bildes in allen Sprachen ──────
try {
const units = await collectAudioUnits(pictureId, pairs);