Alibrown commited on
Commit
08eae70
·
verified ·
1 Parent(s): a4dc5b1

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +185 -0
app.py ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # =============================================================================
2
+ # DON'T STEAL THE FREE CODE OF DEVS! Use it for free an do not touch credits!
3
+ # If you steal this code, in the future you will pay for apps like this!
4
+ # A bit of respect goes a long way – all rights reserved under German law.
5
+ # Copyright Volkan Kücükbudak https://github.com/volkansah
6
+ # Repo URL: https://github.com/AiCodeCraft
7
+ # =============================================================================
8
+
9
+ import streamlit as st
10
+ import os
11
+ import json
12
+ import datetime
13
+ import openai
14
+ from datetime import timedelta
15
+ import logging
16
+ from datasets import load_dataset, Dataset, concatenate_datasets
17
+
18
+ # ------------------ Logging konfigurieren ------------------
19
+ logging.basicConfig(
20
+ level=logging.INFO,
21
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
22
+ )
23
+ logger = logging.getLogger(__name__)
24
+
25
+ # ------------------ Initialisierung ------------------
26
+ def main():
27
+ logger.info("App-Initialisierung gestartet...")
28
+
29
+ # ------------------ Hugging Face Token ------------------
30
+ try:
31
+ # Versuche zuerst aus Umgebungsvariablen zu laden
32
+ HF_TOKEN_MEMORY = os.getenv("HF_TOKEN_MEMORY", "")
33
+
34
+ # Wenn nicht vorhanden, versuche aus st.secrets zu laden
35
+ if not HF_TOKEN_MEMORY:
36
+ try:
37
+ HF_TOKEN_MEMORY = st.secrets["HF_TOKEN_MEMORY"]
38
+ logger.info("Token aus Streamlit Secrets geladen")
39
+ except Exception as e:
40
+ logger.warning(f"Token nicht in Streamlit Secrets gefunden: {str(e)}")
41
+ except Exception as e:
42
+ logger.warning(f"Fehler beim Laden des Tokens: {str(e)}")
43
+ HF_TOKEN_MEMORY = ""
44
+
45
+ # Debug-Ausgabe (nur während der Entwicklung, später entfernen)
46
+ if HF_TOKEN_MEMORY:
47
+ # Nicht den vollständigen Token loggen!
48
+ token_preview = HF_TOKEN_MEMORY[:4] + "..." if len(HF_TOKEN_MEMORY) > 4 else "Ungültig"
49
+ logger.info(f"HF Token gefunden. Startet mit: {token_preview}")
50
+ else:
51
+ logger.warning("Kein HF Token gefunden!")
52
+ st.warning("⚠️ Hugging Face Token fehlt. Dataset-Funktionen werden nicht verfügbar sein.")
53
+
54
+ # ------------------ Streamlit UI ------------------
55
+ st.title("AI Customer Support Agent with Memory 🛒")
56
+ st.caption("Chat with an assistant who remembers past interactions")
57
+
58
+ # OpenAI Key Eingabe
59
+ openai_api_key = st.text_input("Enter OpenAI API Key", type="password", key="openai_key")
60
+ if not openai_api_key:
61
+ st.warning("⚠️ API-Key benötigt")
62
+ st.stop()
63
+
64
+ openai.api_key = openai_api_key
65
+
66
+ # ------------------ Dataset Funktionen ------------------
67
+ # Korrekter Repository-Name
68
+ DATASET_REPO = "AiCodeCraft/customer_memory" # Korrigiert von "AiCodeCarft"
69
+
70
+ @st.cache_resource
71
+ def load_memory_dataset():
72
+ """
73
+ Versucht, das Memory-Dataset vom HF Hub zu laden.
74
+ Falls nicht vorhanden, wird ein leeres Dataset erstellt und gepusht.
75
+ """
76
+ if not HF_TOKEN_MEMORY:
77
+ logger.warning("Kein HF Token vorhanden, verwende lokales Dataset")
78
+ # Einfaches lokales Dataset zurückgeben
79
+ return Dataset.from_dict({"user_id": [], "query": [], "response": [], "timestamp": []})
80
+
81
+ try:
82
+ # Mit Token versuchen
83
+ logger.info(f"Versuche Dataset {DATASET_REPO} zu laden...")
84
+ ds = load_dataset(DATASET_REPO, split="train", token=HF_TOKEN_MEMORY)
85
+ logger.info(f"Dataset erfolgreich geladen mit {len(ds)} Einträgen.")
86
+ return ds
87
+ except Exception as e:
88
+ logger.warning(f"Fehler beim Laden des Datasets: {str(e)}")
89
+
90
+ # Neues Dataset erstellen
91
+ logger.info("Erstelle neues Dataset...")
92
+ data = {"user_id": [], "query": [], "response": [], "timestamp": []}
93
+ ds = Dataset.from_dict(data)
94
+
95
+ try:
96
+ # Dataset pushen
97
+ ds.push_to_hub(DATASET_REPO, token=HF_TOKEN_MEMORY)
98
+ logger.info("Neues Dataset erfolgreich erstellt und gepusht.")
99
+ return ds
100
+ except Exception as push_error:
101
+ logger.error(f"Fehler beim Pushen des Datasets: {str(push_error)}")
102
+ st.error("Konnte kein Dataset erstellen. Bitte überprüfe deine Berechtigungen.")
103
+ # Lokales Dataset zurückgeben
104
+ return ds
105
+
106
+ # ------------------ AI Agent Klasse ------------------
107
+ class CustomerSupportAIAgent:
108
+ def __init__(self):
109
+ self.memory = load_memory_dataset()
110
+
111
+ def handle_query(self, query, user_id):
112
+ # Memory abrufen
113
+ user_history = self.memory.filter(lambda x: x["user_id"] == user_id)
114
+
115
+ # Kontext erstellen
116
+ context = "Previous interactions:\n" + "\n".join(
117
+ [f"Q: {h['query']}\nA: {h['response']}"
118
+ for h in user_history]
119
+ ) if len(user_history) > 0 else "No previous interactions"
120
+
121
+ # API-Anfrage
122
+ response = openai.ChatCompletion.create(
123
+ model="gpt-3.5-turbo",
124
+ messages=[
125
+ {"role": "system", "content": f"You are a support agent. Context:\n{context}"},
126
+ {"role": "user", "content": query}
127
+ ]
128
+ )
129
+
130
+ # Antwort verarbeiten
131
+ answer = response.choices[0].message.content
132
+
133
+ # Memory aktualisieren mit Timestamp
134
+ current_time = datetime.datetime.now().isoformat()
135
+ new_entry = Dataset.from_dict({
136
+ "user_id": [user_id],
137
+ "query": [query],
138
+ "response": [answer],
139
+ "timestamp": [current_time]
140
+ })
141
+
142
+ self.memory = concatenate_datasets([self.memory, new_entry])
143
+
144
+ # Nur pushen, wenn Token vorhanden
145
+ if HF_TOKEN_MEMORY:
146
+ try:
147
+ self.memory.push_to_hub(DATASET_REPO, token=HF_TOKEN_MEMORY)
148
+ logger.info(f"Memory aktualisiert für User {user_id}")
149
+ except Exception as e:
150
+ logger.error(f"Fehler beim Aktualisieren des Datasets: {str(e)}")
151
+ st.warning("Konnte Conversation History nicht speichern, aber Antwort ist verfügbar.")
152
+
153
+ return answer
154
+
155
+ # ------------------ App-Logik ------------------
156
+ support_agent = CustomerSupportAIAgent()
157
+
158
+ # Customer ID Handling
159
+ customer_id = st.sidebar.text_input("Customer ID", key="cust_id")
160
+ if not customer_id:
161
+ st.sidebar.error("Bitte Customer ID eingeben")
162
+ st.stop()
163
+
164
+ # Chat-History
165
+ if "messages" not in st.session_state:
166
+ st.session_state.messages = []
167
+
168
+ # Nachrichten anzeigen
169
+ for msg in st.session_state.messages:
170
+ st.chat_message(msg["role"]).write(msg["content"])
171
+
172
+ # Eingabe verarbeiten
173
+ if prompt := st.chat_input("Your question"):
174
+ st.session_state.messages.append({"role": "user", "content": prompt})
175
+ st.chat_message("user").write(prompt)
176
+
177
+ with st.spinner("Denke nach..."):
178
+ response = support_agent.handle_query(prompt, customer_id)
179
+
180
+ st.session_state.messages.append({"role": "assistant", "content": response})
181
+ st.chat_message("assistant").write(response)
182
+
183
+ # ------------------ Hauptausführung ------------------
184
+ if __name__ == "__main__":
185
+ main()