Spaces:
Sleeping
Sleeping
from fastapi import FastAPI, HTTPException | |
from fastapi import FastAPI | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.responses import FileResponse | |
import requests | |
from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer | |
import torch | |
from pydantic import BaseModel | |
app = FastAPI() | |
# Load model directly from Hugging Face Hub | |
model_name = "SandboxBhh/sentiment-thai-text-model" | |
try: | |
device = 0 if torch.cuda.is_available() else -1 # Check if GPU is available | |
# Ensure correct indentation here | |
reloaded_pipe = pipeline( | |
"text-classification", | |
model=model_name, | |
tokenizer=model_name, | |
device=device, | |
) | |
except Exception as e: | |
print(f"Error loading model: {e}") | |
reloaded_pipe = None | |
class TextInput(BaseModel): | |
text: str | |
def send_line_notification(message, line_token): | |
url = "https://notify-api.line.me/api/notify" | |
headers = {"Authorization": f"Bearer {line_token}"} | |
data = {"message": message} | |
response = requests.post(url, headers=headers, data=data) | |
return response.status_code | |
def split_message(message, max_length=1000): | |
return [message[i:i+max_length] for i in range(0, len(message), max_length)] | |
# Use environment variable for LINE token | |
line_token = "C9r65PpEvIvOJSK2xMhgl53WvmOhhnKEOuQq7DsiVJT" | |
async def classify_text(input: TextInput): | |
if reloaded_pipe is None: | |
raise HTTPException(status_code=500, detail="Model not loaded") | |
try: | |
result = reloaded_pipe(input.text) | |
sentiment = result[0]['label'].lower() | |
score = result[0]['score'] | |
if sentiment == 'neg': | |
message = f"[แจ้งเตือน CSI]: ความพึงพอใจของผู้ป่วย \n ข้อความ: {input.text} \n csi score: {score:.2f}" | |
message_parts = split_message(message) | |
for i, part in enumerate(message_parts): | |
status = send_line_notification(part, line_token) | |
if status == 200: | |
print(f"ส่งการแจ้งเตือนส่วนที่ {i+1}/{len(message_parts)} ผ่าน LINE สำเร็จ") | |
else: | |
print(f"การส่งการแจ้งเตือนส่วนที่ {i+1}/{len(message_parts)} ผ่าน LINE ล้มเหลว") | |
return { | |
"result": result, | |
"message": f"Negative sentiment detected and notification sent to LINE. \n{message}", | |
"formatted_message": message | |
} | |
else: | |
message = f"[Sentiment Info]: ข้อความ: {input.text} \n csi score: {score:.2f}" | |
return { | |
"result": result, | |
"message": "Sentiment is not negative. No notification sent.", | |
"formatted_message": message | |
} | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
app.mount("/", StaticFiles(directory="static", html=True), name="static") | |
def index() -> FileResponse: | |
return FileResponse(path="/app/static/index.html", media_type="text/html") | |