Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -26,7 +26,7 @@ handler = WebhookHandler(LINE_CHANNEL_SECRET)
|
|
26 |
|
27 |
@app.get("/")
|
28 |
async def root():
|
29 |
-
return {"message": "Triage Bot
|
30 |
|
31 |
@app.post("/webhook")
|
32 |
async def webhook(request: Request, x_line_signature: str = Header(None)):
|
@@ -65,33 +65,24 @@ def reply_message(reply_token, message):
|
|
65 |
except Exception as e:
|
66 |
logger.error(f"Send reply error: {e}")
|
67 |
|
68 |
-
# ------------------ Emergency Keywords ------------------
|
|
|
|
|
|
|
69 |
|
70 |
EMERGENCY_SYMPTOMS = {
|
71 |
-
"หมดสติ / ไม่รู้สึกตัว": ["หมดสติ", "ไม่รู้สึกตัว", "
|
72 |
-
|
73 |
-
"
|
74 |
-
|
75 |
-
"
|
76 |
-
|
77 |
-
"
|
78 |
-
|
79 |
-
"
|
80 |
-
|
81 |
-
"
|
82 |
-
|
83 |
-
"กระดูกหัก": ["กระดูกหัก", "แขนหัก", "ขาหัก", "นิ้วหัก", "บวมผิดรูป",
|
84 |
-
"ขางอผิดรูป", "ขาใช้การไม่ได้", "ขยับแล้วเจ็บมาก", "ปูด", "โค้งผิดปกติ"],
|
85 |
-
"อุบัติเหตุรุนแรง": ["รถชน", "รถล้ม", "ตกจากที่สูง", "หัวฟาด", "อุบัติเหตุแรง",
|
86 |
-
"รถคว่ำ", "ล้มแรง", "โดนกระแทกแรง", "ลื่นหัวฟาด", "โดนรถชน"],
|
87 |
-
"เด็กมีไข้ / ชัก": ["ไข้สูง", "เด็กชัก", "ลูกชัก", "ชักตอนมีไข้", "ตัวร้อนจัด",
|
88 |
-
"ไข้ขึ้นสูง", "ตาค้าง", "เด็กไม่ตอบสนอง", "มือแข็ง", "สั่นทั้งตัว"],
|
89 |
-
"ภาวะช็อก / หัวใจเต้นผิดจังหวะ": ["ช็อก", "ความดันต่ำ", "ใจสั่น", "หัวใจเต้นผิดจังหวะ", "ชีพจรเร็ว",
|
90 |
-
"หมดแรงกะทันหัน", "ตัวเย็น", "เหงื่อแตก", "ใจเต้นแรง", "แน่นท้องหายใจไม่ออก"],
|
91 |
-
"ได้รับสารพิษ / ยาเกินขนาด / สัตว์มีพิษกัด": ["สารพิษ", "กินยาเกิน", "ยาเกินขนาด", "พิษ", "ถูกงูกัด",
|
92 |
-
"แมงป่องต่อย", "แมลงกัด", "แพ้ยา", "แพ้อาหารรุนแรง", "คลื่นไส้อาเจียนมาก"],
|
93 |
-
"ผู้ป่วยตั้งครรภ์ใกล้คลอด": ["ตั้งครรภ์", "เจ็บท้องคลอด", "น้ำเดิน", "มูกเลือด", "ปวดท้องใกล้คลอด",
|
94 |
-
"ท้องแข็ง", "มดลูกบีบ", "ปวดหน่วง", "เจ็บท้องถี่", "ลูกดิ้นแรงผิดปกติ"]
|
95 |
}
|
96 |
|
97 |
EMERGENCY_LEVELS = {
|
@@ -114,6 +105,11 @@ FUZZY_THRESHOLD = 85
|
|
114 |
def check_emergency(message):
|
115 |
tokens = word_tokenize(message.lower(), engine="newmm")
|
116 |
logger.info(f"Tokenized: {tokens}")
|
|
|
|
|
|
|
|
|
|
|
117 |
for label, keywords in EMERGENCY_SYMPTOMS.items():
|
118 |
for token in tokens:
|
119 |
for keyword in keywords:
|
@@ -124,9 +120,10 @@ def check_emergency(message):
|
|
124 |
return f"🚨 อาการของคุณเข้าข่ายฉุกเฉินระดับ **1 (ด่วนมาก)**: {label}\nกรุณารีบไปห้องฉุกเฉินทันที!"
|
125 |
elif level == 2:
|
126 |
return f"⚠️ อาการของคุณเข้าข่ายฉุกเฉิน���ะดับ **2 (เร่งด่วน)**: {label}\nควรไปโรงพยาบาลโดยเร็วที่สุด"
|
|
|
127 |
return "🟢 อาการของคุณไม่เข้าข่ายฉุกเฉิน สามารถเข้ารับบริการที่ห้องตรวจทั่วไปในวันถัดไปได้"
|
128 |
|
129 |
-
#
|
130 |
|
131 |
if __name__ == "__main__":
|
132 |
uvicorn.run(app, host="0.0.0.0", port=7860)
|
|
|
26 |
|
27 |
@app.get("/")
|
28 |
async def root():
|
29 |
+
return {"message": "Triage Bot with improved matching and response."}
|
30 |
|
31 |
@app.post("/webhook")
|
32 |
async def webhook(request: Request, x_line_signature: str = Header(None)):
|
|
|
65 |
except Exception as e:
|
66 |
logger.error(f"Send reply error: {e}")
|
67 |
|
68 |
+
# ------------------ Emergency Keywords & Levels ------------------
|
69 |
+
|
70 |
+
# คำที่สั้นเกินไป / ไม่ชัดเจน
|
71 |
+
UNCLEAR_TOKENS = ["เจ็บ", "เวียน", "หน้ามืด", "ปวด", "ใจสั่น", "ตึง", "แน่น", "เมื่อย", "มึน"]
|
72 |
|
73 |
EMERGENCY_SYMPTOMS = {
|
74 |
+
"หมดสติ / ไม่รู้สึกตัว": ["หมดสติ", "ไม่รู้สึกตัว", "สลบ", "วูบ", "หน้ามืด", "ไม่ตอบสนอง", "ล้มแล้วไม่รู้ตัว"],
|
75 |
+
"หายใจผิดปกติ": ["หายใจไม่ออก", "หายใจไม่ทัน", "หายใจลำบาก", "หอบ", "แน่นหน้าอก", "เหนื่อยหอบ", "หายใจติดขัด"],
|
76 |
+
"เจ็บหน้าอก": ["เจ็บหน้าอก", "แน่นในอก", "จุกกลางอก", "เจ็บร้าวไปหลัง", "ปวดหน้าอก", "แน่นจุก"],
|
77 |
+
"ชัก / หยุดหายใจ": ["ชัก", "เกร็ง", "กระตุก", "หยุดหายใจ", "ดิ้น", "ตาค้าง", "หมดลม"],
|
78 |
+
"อัมพฤกษ์ / พูดไม่ชัด": ["อัมพฤกษ์", "หน้าเบี้ยว", "พูดไม่ได้", "พูดไม่รู้เรื่อง", "แขนขาไม่มีแรง", "ยิ้มไม่เท่ากัน", "เดินเซ"],
|
79 |
+
"เลือดออก / บาดแผล": ["เลือดออก", "เลือดไม่หยุด", "แผลลึก", "แผลฉกรรจ์", "เลือดพุ่ง", "แผลเปิด", "เลือดซึม"],
|
80 |
+
"กระดูกหัก": ["หัก", "กระดูกหัก", "บวมผิดรูป", "งอผิดรูป", "ขยับไม่ได้", "ปูด", "ผิดรูป"],
|
81 |
+
"อุบัติเหตุรุนแรง": ["รถชน", "รถล้ม", "ตกจากที่สูง", "หัวฟาด", "โดนรถชน", "แรงกระแทก", "อุบัติเหตุรุนแรง"],
|
82 |
+
"เด็กมีไข้ / ชัก": ["ไข้สูง", "เด็กชัก", "ตัวร้อนจัด", "ไข้แล้วชัก", "ลูกชัก", "ไข้ขึ้น", "ตาค้าง", "เด็กไม่ตอบสนอง"],
|
83 |
+
"ภาวะช็อก / หัวใจเต้นผิดจังหวะ": ["ช็อก", "ใจสั่น", "ชีพจรเร็ว", "เหงื่อแตก", "ตัวเย็น", "หมดแรงกะทันหัน"],
|
84 |
+
"ได้รับสารพิษ / ยาเกินขนาด / สัตว์มีพิษกัด": ["กินยาเกิน", "ยาเกินขนาด", "โดนงูกัด", "แพ้รุนแรง", "โดนพิษ", "แมงป่องต่อย", "คลื่นไส้อาเจียนมาก"],
|
85 |
+
"ผู้ป่วยตั้งครรภ์ใกล้คลอด": ["น้ำเดิน", "มูกเลือด", "ปวดท้องคลอด", "ท้องแข็ง", "ใกล้คลอด", "เจ็บท้องถี่"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
}
|
87 |
|
88 |
EMERGENCY_LEVELS = {
|
|
|
105 |
def check_emergency(message):
|
106 |
tokens = word_tokenize(message.lower(), engine="newmm")
|
107 |
logger.info(f"Tokenized: {tokens}")
|
108 |
+
|
109 |
+
# ตรวจว่าข้อความอาจไม่ชัดเจนหรือสั้นเกินไป
|
110 |
+
if len(tokens) <= 2 or all(t in UNCLEAR_TOKENS for t in tokens):
|
111 |
+
return "❗ อาการของคุณยังไม่ชัดเจน กรุณาพิมพ์รายละเอียดเพิ่มเติม เช่น ตำแหน่ง ความรุนแรง หรืออาการร่วม"
|
112 |
+
|
113 |
for label, keywords in EMERGENCY_SYMPTOMS.items():
|
114 |
for token in tokens:
|
115 |
for keyword in keywords:
|
|
|
120 |
return f"🚨 อาการของคุณเข้าข่ายฉุกเฉินระดับ **1 (ด่วนมาก)**: {label}\nกรุณารีบไปห้องฉุกเฉินทันที!"
|
121 |
elif level == 2:
|
122 |
return f"⚠️ อาการของคุณเข้าข่ายฉุกเฉิน���ะดับ **2 (เร่งด่วน)**: {label}\nควรไปโรงพยาบาลโดยเร็วที่สุด"
|
123 |
+
|
124 |
return "🟢 อาการของคุณไม่เข้าข่ายฉุกเฉิน สามารถเข้ารับบริการที่ห้องตรวจทั่วไปในวันถัดไปได้"
|
125 |
|
126 |
+
# ------------------------------------------------------------
|
127 |
|
128 |
if __name__ == "__main__":
|
129 |
uvicorn.run(app, host="0.0.0.0", port=7860)
|