modified: app.py
modified: background_data.json modified: templates/chat.html
This commit is contained in:
53
app.py
53
app.py
@@ -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)
|
||||
@@ -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)",
|
||||
|
||||
@@ -186,8 +186,16 @@
|
||||
<p>Erstellt von Simon Giehl – 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>
|
||||
Reference in New Issue
Block a user