modified: app.py

modified:   background_data.json
	modified:   templates/chat.html
This commit is contained in:
SimolZimol
2025-06-19 14:09:20 +02:00
parent 4c355f70bf
commit dab0a99e7b
3 changed files with 107 additions and 4 deletions

53
app.py
View File

@@ -2,8 +2,10 @@ import os
import json
import requests
import re
from flask import Flask, render_template, request, jsonify, Response
from flask import Flask, render_template, request, jsonify, Response, send_file
from dotenv import load_dotenv
import io
import csv
load_dotenv()
@@ -138,5 +140,54 @@ def ask_stream():
continue
return Response(generate(), mimetype="text/plain; charset=utf-8")
@app.route("/export", methods=["POST"])
def export():
user_message = request.json.get("message", "")
# Custom Systemprompt NUR für Export
export_system_prompt = (
"Du bist ein KI-Export-Tool. "
"Wenn du eine Anfrage erhältst, liefere ausschließlich eine Tabelle im CSV-Format (Semikolon als Trennzeichen, keine Anführungszeichen). "
"Die erste Zeile muss die Spaltenüberschriften enthalten. "
"Jede weitere Zeile enthält die Daten. "
"Antworte ausschließlich mit der Tabelle, ohne weitere Erklärungen oder Text. "
"Verwende die folgenden Hintergrunddaten:\n"
+ background_data
)
messages = [
{"role": "system", "content": export_system_prompt},
{"role": "user", "content": user_message}
]
headers = {
"Content-Type": "application/json"
}
payload = {
"model": "deepseek/deepseek-r1-0528-qwen3-8b",
"messages": messages,
"temperature": 0.0,
"max_tokens": 1500
}
url = OPENAI_BASE_URL.rstrip("/") + "/v1/chat/completions"
try:
response = requests.post(url, headers=headers, json=payload)
data = response.json()
csv_text = data["choices"][0]["message"]["content"].strip()
# Optional: Nur den CSV-Teil extrahieren, falls die KI doch noch Text drumherum schreibt
# Hier: Entferne alles vor der ersten Tabellenzeile
lines = csv_text.splitlines()
csv_lines = [line for line in lines if ";" in line]
csv_clean = "\n".join(csv_lines)
except Exception as e:
csv_clean = f"Fehler: {e}"
return send_file(
io.BytesIO(csv_clean.encode("utf-8")),
mimetype="text/csv",
as_attachment=True,
download_name="export.csv"
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)

View File

@@ -1,7 +1,17 @@
[
"Erklärung: Die folgenden Informationen stammen aus den täglichen Berichten eines Außendienstmitarbeiters der Firma Nicolaisen Casing GmbH & Co. KG. Sie enthalten Kundenkontakte, Notizen zu Gesprächen, Aufträgen und Besonderheiten. Die Daten werden regelmäßig gepflegt und spiegeln den aktuellen Stand im Außendienst wider.",
"Firmeninfo: Nicolaisen Casing GmbH & Co. KG (https://www.nicolaisen-casing.de/) ist ein führender Anbieter von Natur- und Kunstdärmen für die Lebensmittelindustrie. Das Unternehmen mit Sitz in Deutschland bietet hochwertige Produkte und umfassenden Service für Metzgereien, Fleischwarenhersteller und die Lebensmittelbranche. Nicolaisen Casing steht für Qualität, Zuverlässigkeit und langjährige Erfahrung im Bereich Därme und Wursthüllen. Kontakt: info@nicolaisen-casing.de | Telefon: +49 123 456789",
"Entwickler: Dieses KI-System wurde von Simon Giehl (Softwareentwickler, KI-Experte) entwickelt. Bei technischen Fragen oder Anregungen wenden Sie sich bitte an simon@projekt-senegal.de.",
"Beispiel-Frage: Wer hat dieses KI-System entwickelt?\nBeispiel-Antwort: Das KI-System wurde von Simon Giehl, Softwareentwickler und KI-Experte, entwickelt. Er ist Ansprechpartner für technische Fragen und Weiterentwicklung.",
"Beispiel-Frage: Wer ist Ansprechpartner für dieses System?\nBeispiel-Antwort: Ansprechpartner ist Simon Giehl (E-Mail: simon@projekt-senegal.de).",
"Beispiel-Frage: Was ist Nicolaisen Casing?\nBeispiel-Antwort: Nicolaisen Casing GmbH & Co. KG ist ein führender Anbieter von Natur- und Kunstdärmen für die Lebensmittelindustrie in Deutschland.",
"Beispiel-Frage: Woher stammen die Kundendaten?\nBeispiel-Antwort: Die Kundendaten stammen aus den täglichen Berichten eines Außendienstmitarbeiters der Firma Nicolaisen Casing.",
"Meta: Entwickler = Simon Giehl | Ansprechpartner = Simon Giehl | Kontakt = simon@projekt-senegal.de | System = AI Vertriebsassistent",
"Meta: Firma = Nicolaisen Casing GmbH & Co. KG | Branche = Lebensmittelindustrie | Produkt = Natur- und Kunstdärme | Website = https://www.nicolaisen-casing.de/",
"Meta: Datenquelle = Außendienstberichte | Datenpflege = täglich | Dateninhalt = Kundenkontakte, Notizen, Aufträge, Besonderheiten",
"Erklärung: Die folgenden Einträge bestehen aus dem Kundennamen, den gesammelten Infos (durch | getrennt) und dem Datum (Jahr, Monat, Tag). Beispiel: 'Kunde: Info1 | Info2 (Jahr: 2024, Monat: 06, Tag: 13)'. Die Daten stammen aus den täglichen Berichten eines Außendienstmitarbeiters der Firma Nicolaisen Casing GmbH & Co. KG.",
"Dieses KI-System wurde von Simon Giehl entwickelt.",
"Simon Giehl ist der Entwickler und Ansprechpartner für dieses System.",
"Das System wurde programmiert und betreut von Simon Giehl.",
"Nicolaisen Casing GmbH & Co. KG ist ein deutsches Unternehmen für Därme und Wursthüllen.",
"Die Daten stammen aus dem Außendienst von Nicolaisen Casing.",
"Kupfer: Herr Meyer sucht immer noch nach einem rauchdurchlässigen Darm in Kaliber | 58. Ich rufe nächste Woche an. (Jahr: 2024, Monat: 06, Tag: 13)",
"Schneider: Herr Frank hat unsere Aromi getestet, Kaliber ist etwas zu klein! (Jahr: 2024, Monat: 06, Tag: 13)",
"BraTido: Böttcher-Gohr wird Faser 50 weiter abnehmen, wenn wir Ihr mit dem Preis | etwas entgegenkommen (Jahr: 2024, Monat: 06, Tag: 13)",

View File

@@ -186,8 +186,16 @@
<p>Erstellt von Simon Giehl &ndash; Ihr smarter KI-Partner für Kunden- und Vertriebsinfos</p>
</div>
<div style="display:flex; justify-content:flex-end; padding: 0 24px;">
<button id="tools-btn" onclick="showExportDialog()">Tools</button>
<button id="clear-btn" onclick="clearChat()">Kontext löschen</button>
</div>
<div id="export-dialog" style="display:none; background:#23272f; border:1px solid #00aaff; border-radius:8px; padding:18px; margin:18px 24px;">
<b>Export/Tabellen-Tool</b><br>
<input id="export-query" type="text" placeholder="z.B. alle Kunden mit Kaliber 58" style="width:70%;margin:8px 0;">
<button onclick="exportTable()">Exportieren als CSV</button>
<button onclick="hideExportDialog()">Schließen</button>
<div id="export-result" style="margin-top:10px;"></div>
</div>
<div id="chat"></div>
<div id="input-area">
<input id="input" type="text" placeholder="Nachricht eingeben..." autocomplete="off">
@@ -355,6 +363,40 @@
// Beim Laden: Chatverlauf wiederherstellen
window.onload = loadChatHistory;
function showExportDialog() {
document.getElementById('export-dialog').style.display = 'block';
}
function hideExportDialog() {
document.getElementById('export-dialog').style.display = 'none';
document.getElementById('export-result').innerHTML = '';
}
function exportTable() {
const query = document.getElementById('export-query').value;
fetch('/export', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: query})
})
.then(response => {
if (response.ok) {
return response.blob();
}
throw new Error('Export fehlgeschlagen');
})
.then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = "export.csv";
a.textContent = "CSV herunterladen";
document.getElementById('export-result').innerHTML = '';
document.getElementById('export-result').appendChild(a);
})
.catch(err => {
document.getElementById('export-result').textContent = err.message;
});
}
</script>
</body>
</html>