Spaces:
Sleeping
Sleeping
Update backend/chat_endpoint.py
Browse files- backend/chat_endpoint.py +76 -23
backend/chat_endpoint.py
CHANGED
|
@@ -9,33 +9,86 @@ def _headers():
|
|
| 9 |
tok = os.getenv("HF_API_TOKEN")
|
| 10 |
return {"Authorization": f"Bearer {tok}","Content-Type":"application/json"} if tok else {}
|
| 11 |
|
|
|
|
| 12 |
def chat(user_message: str, mode: str = "patient"):
|
| 13 |
url = active_chat_endpoint()
|
| 14 |
-
|
|
|
|
| 15 |
return "⚠ Add HF_API_TOKEN in Settings → Secrets."
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
payload = {
|
| 18 |
"inputs": [
|
| 19 |
-
{"role":"system","content": system},
|
| 20 |
-
{"role":"user","content": user_message}
|
| 21 |
],
|
| 22 |
-
"parameters": {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
}
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
tok = os.getenv("HF_API_TOKEN")
|
| 10 |
return {"Authorization": f"Bearer {tok}","Content-Type":"application/json"} if tok else {}
|
| 11 |
|
| 12 |
+
|
| 13 |
def chat(user_message: str, mode: str = "patient"):
|
| 14 |
url = active_chat_endpoint()
|
| 15 |
+
headers = _headers()
|
| 16 |
+
if not headers:
|
| 17 |
return "⚠ Add HF_API_TOKEN in Settings → Secrets."
|
| 18 |
+
|
| 19 |
+
system = AI_GYNO_PERSONA_V2 + (
|
| 20 |
+
"\nUse simple, reassuring language." if mode=="patient"
|
| 21 |
+
else "\nUse clinical language, differentials, and red flags."
|
| 22 |
+
)
|
| 23 |
+
|
| 24 |
payload = {
|
| 25 |
"inputs": [
|
| 26 |
+
{"role": "system", "content": system},
|
| 27 |
+
{"role": "user", "content": user_message}
|
| 28 |
],
|
| 29 |
+
"parameters": {
|
| 30 |
+
"max_new_tokens": 400,
|
| 31 |
+
"temperature": 0.2,
|
| 32 |
+
"return_full_text": False
|
| 33 |
+
}
|
| 34 |
}
|
| 35 |
+
|
| 36 |
+
try:
|
| 37 |
+
r = requests.post(url, headers=headers, json=payload, timeout=60)
|
| 38 |
+
except Exception as e:
|
| 39 |
+
return f"⚠ Network error: {str(e)}"
|
| 40 |
+
|
| 41 |
+
# --- SAFER PARSER ---
|
| 42 |
+
txt = r.text
|
| 43 |
+
|
| 44 |
+
# HTML → clear signal model is loading or wrong
|
| 45 |
+
if "<html" in txt.lower():
|
| 46 |
+
if "loading" in txt.lower():
|
| 47 |
+
return "⏳ Model is loading on HuggingFace… try again in 20–30 sec."
|
| 48 |
+
return f"⚠ Endpoint returned HTML instead of JSON:\n\n{txt[:500]}"
|
| 49 |
+
|
| 50 |
+
# Try normal JSON
|
| 51 |
+
try:
|
| 52 |
+
data = r.json()
|
| 53 |
+
except:
|
| 54 |
+
return f"⚠ Non-JSON content returned:\n\n{txt[:500]}"
|
| 55 |
+
|
| 56 |
+
# Standard HF generation
|
| 57 |
+
if isinstance(data, list) and len(data) and "generated_text" in data[0]:
|
| 58 |
+
return data[0]["generated_text"]
|
| 59 |
+
if isinstance(data, dict) and "generated_text" in data:
|
| 60 |
+
return data["generated_text"]
|
| 61 |
+
|
| 62 |
+
return f"⚠ Unexpected JSON:\n{json.dumps(data)[:800]}"
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
# def chat(user_message: str, mode: str = "patient"):
|
| 66 |
+
# url = active_chat_endpoint()
|
| 67 |
+
# if not _headers():
|
| 68 |
+
# return "⚠ Add HF_API_TOKEN in Settings → Secrets."
|
| 69 |
+
# system = AI_GYNO_PERSONA_V2 + ("\nPrefer plain-language for patients." if mode=='patient' else "\nProvide differentials, workup, and red flags.")
|
| 70 |
+
# payload = {
|
| 71 |
+
# "inputs": [
|
| 72 |
+
# {"role":"system","content": system},
|
| 73 |
+
# {"role":"user","content": user_message}
|
| 74 |
+
# ],
|
| 75 |
+
# "parameters": {"max_new_tokens": 400, "temperature": 0.2, "return_full_text": False}
|
| 76 |
+
# }
|
| 77 |
+
# for attempt in range(1, RETRIES_DEFAULT+1):
|
| 78 |
+
# try:
|
| 79 |
+
# r = requests.post(url, headers=_headers(), json=payload, timeout=REQUEST_TIMEOUT_SECONDS_DEFAULT)
|
| 80 |
+
# try:
|
| 81 |
+
# data = r.json()
|
| 82 |
+
# except Exception:
|
| 83 |
+
# txt = r.text
|
| 84 |
+
# if "loading" in txt.lower():
|
| 85 |
+
# time.sleep(BACKOFF_SECONDS_DEFAULT * attempt); continue
|
| 86 |
+
# return f"⚠ Non-JSON response:\n\n{txt[:1500]}"
|
| 87 |
+
# if isinstance(data, list) and data and "generated_text" in data[0]:
|
| 88 |
+
# return data[0]["generated_text"]
|
| 89 |
+
# if isinstance(data, dict) and "generated_text" in data:
|
| 90 |
+
# return data["generated_text"]
|
| 91 |
+
# return "⚠ Unexpected response:\n" + json.dumps(data)[:1200]
|
| 92 |
+
# except Exception as e:
|
| 93 |
+
# time.sleep(BACKOFF_SECONDS_DEFAULT * attempt)
|
| 94 |
+
# return "❌ Endpoint unavailable after retries."
|