diff --git a/app.py b/app.py index 8345fe5..23de0f1 100644 --- a/app.py +++ b/app.py @@ -3505,7 +3505,7 @@ def public_frontend(): const div = document.createElement('div'); div.className = 'chat-msg ' + role; - div.textContent = text; + div.innerHTML = text; wrapper.appendChild(div); if (role === 'assistant') { @@ -4104,7 +4104,7 @@ def api_chat(): try: for t in meaningful_terms: rows = db.execute( - "SELECT spiel_titel, content, halle, published_at FROM submissions " + "SELECT id, spiel_titel, content, halle, published_at FROM submissions " "WHERE status='published' AND deleted_at IS NULL " "AND category='ausverkauft' AND spiel_titel IS NOT NULL " "AND LOWER(spiel_titel) LIKE ? LIMIT 5", @@ -4122,7 +4122,7 @@ def api_chat(): halle = r['halle'] or '' snippet = (r['content'] or '').strip()[:120] context_parts.append( - f"[Ausverkauft-Meldung] {title}" + f"[Beitrag #{r['id']}] 🔴 AUSVERKAUFT: {title}" + (f" | {halle}" if halle else '') + (f" | {snippet}" if snippet else '') ) @@ -4142,12 +4142,10 @@ def api_chat(): "- [Aussteller]-Einträge enthalten Verlage/Shops mit Halle, Stand und Land.\n" "- [Neuheit]-Einträge enthalten Brettspiel-Neuheiten mit Verlag, Halle, Stand und Kategorien.\n" "- [Neuheit] mit 'AUSVERKAUFT' = am Stand vergriffen — erwähne das aktiv.\n" - "- [Ausverkauft-Meldung]-Einträge = Community-Berichte über vergriffene Spiele.\n" - "- Bei Fragen wie 'ist X noch da?' prüfe Ausverkauft-Status und warne.\n" - "- Wenn du einen Beitrag erwähnst, verlinke ihn IMMER mit der Beitrags-ID aus dem Kontext.\n" - " Format: [Kurzbeschreibung](/beitrag/ID)\n" - " Beispiel: 'Schau dir [diesen Erfahrungsbericht](/beitrag/53) an!'\n" - " Nutze die Nummer aus 'Beitrag #ID' im Kontext als Linkziel.\n\n" + "- [Beitrag #ID]-Einträge = Community-Beiträge und Ausverkauft-Meldungen.\n" + "- Verlinke Community-Beiträge IMMER so: [Kurzbeschreibung](/beitrag/ID)\n" + " Beispiel: 'Lies [diesen Erfahrungsbericht](/beitrag/53)!'\n" + " Nimm die ID aus dem [Beitrag #ID]-Tag im Kontext.\n\n" f"KONTEXT (veröffentlichte Community-Beiträge + SPIEL Essen Aussteller):\n{context[:10000]}" ) @@ -4183,6 +4181,20 @@ def api_chat(): if r.status_code != 200: return jsonify({'reply': 'Der BSN Assistent antwortet gerade nicht. Bitte versuch es später nochmal.'}) reply = r.json()["choices"][0]["message"]["content"].strip() + # Markdown-Links [text](url) → klickbare HTML-Links + reply = re.sub( + r'\[([^\]]+)\]\((https?://[^)]+)\)', + r'\1', + reply + ) + # Relative Links /beitrag/ID + reply = re.sub( + r'\[([^\]]+)\]\((/beitrag/\d+)\)', + r'\1', + reply + ) + # Zeilenumbrüche in
für innerHTML-Darstellung + reply = reply.replace('\n', '
') except Exception: return jsonify({'reply': 'Der BSN Assistent antwortet gerade nicht. Bitte versuch es später nochmal.'})