fix: Übersetzungs-Retry + robuster Translate-Step + Nachhol-Endpoints
- callClaude: Retry mit Backoff bei Überlast/Rate-Limit/Netzfehler (429/500/503/529) — wahrscheinliche Ursache der fehlenden SV-Übersetzung - Translate-Step pro Pair gekapselt: ein Fehler reißt nicht mehr den ganzen Lauf ab, Fehlversuche werden gezählt (pipeline_progress.translateFailures) - translatePair als wiederverwendbarer Helfer extrahiert - POST /pipeline/picture/:id/translate-fill: fehlende Übersetzungen (Sätze + Antwort-Wörter) eines Bildes nachholen Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@ const router = require('express').Router();
|
||||
const { query } = require('../db');
|
||||
const { LANGS } = require('../lib/translate');
|
||||
const { loadPairContext, computeReadiness, loadPairContent } = require('../lib/pairContent');
|
||||
const { enqueue, loadPairs, collectAudioUnits, generateWithBackoff } = require('../lib/pipeline');
|
||||
const { enqueue, loadPairs, collectAudioUnits, generateWithBackoff, translatePair } = require('../lib/pipeline');
|
||||
const { PLACEHOLDER_RE } = require('../lib/placeholders');
|
||||
|
||||
// ── Objekt-Wort-Erkennung in Sätzen (für die manuelle Zuweisung beim Review) ──
|
||||
@@ -207,6 +207,21 @@ router.post('/assign-object', async (req, res, next) => {
|
||||
} catch (err) { next(err); }
|
||||
});
|
||||
|
||||
// POST /api/pipeline/picture/:id/translate-fill — fehlende Übersetzungen dieses Bildes nachholen
|
||||
// (z.B. wenn bei einem früheren Lauf eine Sprache durch einen API-Fehler weggebrochen ist)
|
||||
router.post('/picture/:id/translate-fill', async (req, res, next) => {
|
||||
try {
|
||||
const pairs = await loadPairs(req.params.id);
|
||||
if (!pairs.length) return res.status(400).json({ error: 'Bild hat keine Pairs' });
|
||||
const result = { translated: 0, failed: 0, errors: [] };
|
||||
for (const p of pairs) {
|
||||
try { await translatePair(p); result.translated++; }
|
||||
catch (err) { result.failed++; result.errors.push({ pair_id: p.id, error: err.message }); }
|
||||
}
|
||||
res.json(result);
|
||||
} catch (err) { next(err); }
|
||||
});
|
||||
|
||||
// POST /api/pipeline/picture/:id/audio-fill — fehlende Audios dieses Bildes nachgenerieren
|
||||
router.post('/picture/:id/audio-fill', async (req, res, next) => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user