martinbrahm commited on
Commit
eeb5b5c
·
verified ·
1 Parent(s): 8c05e4c

Upload main.py

Browse files
Files changed (1) hide show
  1. main.py +105 -26
main.py CHANGED
@@ -1,37 +1,71 @@
1
  from fastapi import FastAPI, Request
2
  import json
 
 
 
3
 
4
- # Wir laden SQL nur, wenn es da ist (um Abstuerze zu verhindern)
 
 
 
 
5
  try:
6
- from sqlalchemy import create_engine, text
7
- except ImportError:
8
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
- app = FastAPI()
11
 
12
  @app.get("/")
13
  def home():
14
- return {"status": "Bereit fuer Vapi!"}
 
 
 
15
 
16
  @app.post("/search")
17
  async def search_knowledge(request: Request):
18
- # 1. DATEN EMPFANGEN (Vapi-kompatibel)
19
  try:
20
  data = await request.json()
21
- print(f"📥 Vapi Log: {json.dumps(data)}")
22
  except:
23
  return {"result": "Fehler: Kein JSON."}
24
 
25
  query_text = ""
26
-
27
- # Wir fischen die Frage aus der verschachtelten Vapi-Struktur:
28
  if "query" in data and isinstance(data["query"], str):
29
  query_text = data["query"]
30
  elif "message" in data and "toolCalls" in data["message"]:
31
  try:
32
- # Wir holen uns die Argumente aus der Tool-Liste
33
  args = data["message"]["toolCalls"][0]["function"]["arguments"]
34
- # Manchmal ist es ein String, manchmal ein Dictionary
35
  if isinstance(args, str):
36
  query_text = json.loads(args).get("query", "")
37
  else:
@@ -48,19 +82,64 @@ async def search_knowledge(request: Request):
48
  except:
49
  pass
50
 
51
- print(f"🔎 Erkannte Frage: '{query_text}'")
52
-
53
- # 2. ANTWORT LOGIK (Hardcoded für deinen Test)
54
- query_lower = query_text.lower()
55
 
56
- if "umsätze" in query_lower or "händler" in query_lower:
57
- antwort = "Umsätze sprudeln für Händler, wenn sie genau an dem Ort präsent sind, wo auch ihre Kunden sind."
58
- elif "geo" in query_lower:
59
- antwort = "Geofencing ist eine Technologie, die Aktionen auslöst, wenn ein Gerät eine Zone betritt."
60
- else:
61
- antwort = "Dazu habe ich leider keine Informationen in der Datenbank."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
- # 3. RÜCKGABE
64
- return {
65
- "result": antwort
66
- }
 
1
  from fastapi import FastAPI, Request
2
  import json
3
+ import os
4
+ import firebase_admin
5
+ from firebase_admin import credentials, firestore
6
 
7
+ app = FastAPI()
8
+
9
+ # ------------------------------------------------------
10
+ # 1. VERBINDUNG ZU FIREBASE HERSTELLEN
11
+ # ------------------------------------------------------
12
  try:
13
+ # Wir holen den Schlüssel aus den Hugging Face Secrets
14
+ firebase_key_json = os.environ.get("FIREBASE_KEY")
15
+
16
+ if firebase_key_json:
17
+ # Den String wieder in ein echtes JSON-Objekt verwandeln
18
+ cred_dict = json.loads(firebase_key_json)
19
+ cred = credentials.Certificate(cred_dict)
20
+
21
+ # Prüfen, ob die App schon läuft, um Doppel-Start zu verhindern
22
+ if not firebase_admin._apps:
23
+ firebase_admin.initialize_app(cred)
24
+
25
+ db = firestore.client()
26
+ print("✅ Erfolgreich mit Firebase Firestore verbunden!")
27
+ else:
28
+ print("⚠️ WARNUNG: Kein FIREBASE_KEY in den Settings gefunden.")
29
+ db = None
30
+
31
+ except Exception as e:
32
+ print(f"❌ Kritischer Firebase Fehler: {e}")
33
+ db = None
34
+
35
+ # ------------------------------------------------------
36
+ # 2. KONFIGURATION
37
+ # ------------------------------------------------------
38
+
39
+ # Wie heißt deine Sammlung in Firebase?
40
+ # Laut deinem Pfad '/knowledge_base/...' wahrscheinlich so:
41
+ COLLECTION_NAME = "knowledge_base"
42
+ # Falls du die Fragen in einer 'inbox' sammeln willst:
43
+ INBOX_COLLECTION = "inbox"
44
 
 
45
 
46
  @app.get("/")
47
  def home():
48
+ if db:
49
+ return {"status": "Online & mit Firebase verbunden."}
50
+ else:
51
+ return {"status": "Online, aber KEINE Firebase-Verbindung (Key fehlt)."}
52
 
53
  @app.post("/search")
54
  async def search_knowledge(request: Request):
55
+ # --- A. DATEN EMPFANGEN (Vapi) ---
56
  try:
57
  data = await request.json()
58
+ print(f"📥 Vapi Anfrage: {json.dumps(data)}")
59
  except:
60
  return {"result": "Fehler: Kein JSON."}
61
 
62
  query_text = ""
63
+ # Parsing Logik
 
64
  if "query" in data and isinstance(data["query"], str):
65
  query_text = data["query"]
66
  elif "message" in data and "toolCalls" in data["message"]:
67
  try:
 
68
  args = data["message"]["toolCalls"][0]["function"]["arguments"]
 
69
  if isinstance(args, str):
70
  query_text = json.loads(args).get("query", "")
71
  else:
 
82
  except:
83
  pass
84
 
85
+ print(f"🔎 Suche in Firebase nach: '{query_text}'")
 
 
 
86
 
87
+ if not query_text:
88
+ return {"result": "Ich habe die Frage nicht verstanden."}
89
+
90
+ if not db:
91
+ return {"result": "Server-Fehler: Keine Datenbankverbindung."}
92
+
93
+ # --- B. SUCHE IN FIREBASE ---
94
+ antwort = "Dazu habe ich leider keine Informationen in meiner Datenbank. Ich habe die Frage für unser Team notiert."
95
+ treffer_gefunden = False
96
+
97
+ try:
98
+ # Wir laden alle Dokumente aus der Knowledge Base
99
+ # (Bei sehr vielen Daten > 1000 Einträge müsste man das optimieren, aber für jetzt reicht das)
100
+ docs = db.collection(COLLECTION_NAME).stream()
101
+
102
+ query_lower = query_text.lower()
103
+
104
+ # Einfache Suche: Wir schauen, ob Keywords aus der DB in der Frage vorkommen
105
+ # Oder ob die Frage in der DB der Frage des Users ähnelt.
106
+
107
+ for doc in docs:
108
+ doc_data = doc.to_dict()
109
+
110
+ # Wir gehen davon aus, dass deine Dokumente Felder wie 'question', 'answer' oder 'keywords' haben
111
+ db_answer = doc_data.get("answer") or doc_data.get("Antwort")
112
+
113
+ # Check 1: Keywords Suche (Falls du ein Feld 'keywords' hast)
114
+ keywords = doc_data.get("keywords") or []
115
+ if keywords and isinstance(keywords, list):
116
+ if any(k.lower() in query_lower for k in keywords):
117
+ antwort = db_answer
118
+ treffer_gefunden = True
119
+ break
120
+
121
+ # Check 2: Frage-Text Suche (Falls du ein Feld 'question' hast)
122
+ db_question = doc_data.get("question") or doc_data.get("Frage") or ""
123
+ if db_question and db_question.lower() in query_lower:
124
+ antwort = db_answer
125
+ treffer_gefunden = True
126
+ break
127
+
128
+ # --- C. LERN-MODUS (Inbox) ---
129
+ if not treffer_gefunden:
130
+ print(f"⚠️ Kein Treffer. Speichere '{query_text}' in {INBOX_COLLECTION}...")
131
+ try:
132
+ db.collection(INBOX_COLLECTION).add({
133
+ "question": query_text,
134
+ "status": "open",
135
+ "timestamp": firestore.SERVER_TIMESTAMP
136
+ })
137
+ print("📩 Erfolgreich gespeichert.")
138
+ except Exception as e:
139
+ print(f"Fehler beim Speichern in Inbox: {e}")
140
+
141
+ except Exception as e:
142
+ print(f"❌ Firebase Abfrage-Fehler: {e}")
143
+ return {"result": "Es gab ein Problem beim Lesen der Datenbank."}
144
 
145
+ return {"result": antwort}