triage-bot / app.py
Tortyfishguy's picture
Update app.py
3fe3d6e verified
raw
history blame
3.13 kB
import os
import threading
import uvicorn
from fastapi import FastAPI, Request, HTTPException, Header
from linebot.v3.messaging import LineBotApi
from linebot.v3.webhook import WebhookHandler
from linebot.v3.exceptions import InvalidSignatureError
from linebot.v3.webhooks import MessageEvent, TextMessage
from linebot.v3.messaging import TextSendMessage
from model import classify_esi # นำเข้าโมเดลสำหรับจัดอันดับ ESI
# Load environment variables
LINE_ACCESS_TOKEN = os.getenv("LINE_ACCESS_TOKEN")
LINE_CHANNEL_SECRET = os.getenv("LINE_CHANNEL_SECRET")
# Initialize FastAPI
app = FastAPI()
# Initialize LINE SDK
line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)
@app.get("/")
async def root():
return {"message": "Triage Bot is running for the ER of San Pa Tong Hospital!"}
@app.post("/webhook")
async def webhook(request: Request, x_line_signature: str = Header(None)):
if x_line_signature is None:
raise HTTPException(status_code=400, detail="Missing X-Line-Signature")
body = await request.body()
body_text = body.decode("utf-8")
try:
handler.handle(body_text, x_line_signature)
except InvalidSignatureError:
raise HTTPException(status_code=400, detail="Invalid signature")
return {"status": "OK"}
# Event handler for messages
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
user_message = event.message.text
esi_level = classify_esi(user_message) # ใช้โมเดล AI วิเคราะห์ ESI
# แปลงระดับ ESI เป็นคำแนะนำ
response_text = get_triage_response(esi_level)
# ใช้ threading เพื่อให้ bot ตอบกลับทันที
threading.Thread(target=reply_message, args=(event.reply_token, response_text)).start()
def reply_message(reply_token, message):
try:
line_bot_api.reply_message(reply_token, TextSendMessage(text=message))
except Exception as e:
print(f"Error sending reply: {e}")
def get_triage_response(esi_level):
"""
รับค่า ESI (1-5) และแปลงเป็นข้อความแนะนำให้ผู้ป่วย
"""
if esi_level in [1, 2]:
return "🚑 อาการของคุณรุนแรง ควรรีบไปห้องฉุกเฉินทันที!"
elif esi_level == 3:
return "🏥 คุณควรพบแพทย์เร็วที่สุดเพื่อตรวจสอบเพิ่มเติม"
elif esi_level in [4, 5]:
return "😊 อาการของคุณสามารถรอพบแพทย์ที่ OPD ในวันพรุ่งนี้เช้าได้"
else:
return "❓ ไม่สามารถประเมินได้ กรุณาลองอธิบายอาการให้ละเอียดขึ้น"
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)