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.'})