Fix candle layout, relax AI moderation, fix ReadableStream error

- Candles: clean grid layout with consistent sizing, no overlapping
- AI moderation: much more lenient prompt - short descriptions,
  dates, locations are all valid memorial content
- Fix ReadableStream error by clearing abort timeout after response

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
denshooter
2026-02-21 20:37:14 +01:00
parent c184f5c679
commit 6e2ef55cee
3 changed files with 58 additions and 48 deletions
+20 -5
View File
@@ -51,19 +51,32 @@ async function moderateWithAI(contributionId: number, content: string) {
console.log(`[AI-Mod] No bad words, asking AI...`)
try {
const prompt = `Ist dieser Text angemessen für eine Gedenkseite einer verstorbenen Großmutter?
const prompt = `Du prüfst Beiträge für eine Gedenkseite einer verstorbenen Großmutter (Maria Malejka).
"${content}"
Text: "${content}"
ERLAUBT: Liebe, Vermissen, Trauer, Erinnerungen, persönliche Geschichten, Beileidsbekundungen
VERBOTEN: Beleidigungen, Spam, Hassrede, Werbung, völlig zusammenhanglose oder sinnlose Texte ohne Bezug
WICHTIG: Sei SEHR großzügig! Die meisten Beiträge sind von Familienmitgliedern und Freunden.
ERLAUBT (immer appropriate=true):
- Kurze Beschreibungen wie "Hochzeit", "Geburtstag", "Urlaub in..." - das sind Erinnerungen!
- Namen, Orte, Daten - das sind Zeitstrahl-Einträge
- Alles was eine Erinnerung, ein Ereignis oder ein Lebensmoment sein könnte
- Persönliche Geschichten, Beileidsbekundungen, Liebe, Vermissen, Trauer
- Auch sehr kurze Texte oder einzelne Wörter sind OK wenn sie ein Ereignis beschreiben
NUR VERBOTEN (appropriate=false):
- Beleidigungen, Hassrede, Schimpfwörter
- Offensichtlicher Spam oder Werbung mit Links
- Komplett sinnloser Text (zufällige Buchstaben, Tastatur-Spam)
Im Zweifel: appropriate=true
Antworte NUR mit JSON:
{"appropriate": true} oder {"appropriate": false, "reason": "kurze Begründung"}
JSON:`
const controller = new AbortController()
setTimeout(() => controller.abort(), 15000)
const timeout = setTimeout(() => controller.abort(), 15000)
const ollamaUrl = process.env.OLLAMA_URL || 'http://localhost:11434'
const res = await fetch(`${ollamaUrl}/api/generate`, {
@@ -83,11 +96,13 @@ JSON:`
})
if (!res.ok) {
clearTimeout(timeout)
console.warn(`[AI-Mod] Ollama error: ${res.status}`)
return
}
const data = await res.json()
clearTimeout(timeout)
const responseText = (data.response || '').trim()
console.log(`[AI-Mod] Response: "${responseText}"`)