edtech-api / app.py
yashasvi-01-02's picture
>
e7835c8
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
from transformers import pipeline
import re
app = FastAPI(title="🩺 MediAgent AI API (No CSV Version)")
# =========================
# LOAD MODEL
# =========================
data = joblib.load("diseases.pkl")
model = data["model"]
encoder = data["encoder"]
symptoms_list = data["symptoms"]
# =========================
# NORMALIZATION
# =========================
def normalize(text):
text = str(text).lower()
text = re.sub(r"\(.*?\)", "", text)
text = re.sub(r"[^a-z0-9\s]", " ", text)
return " ".join(text.split())
# =========================
# LANGUAGE (HINGLISH SUPPORT)
# =========================
def hinglish_to_english(text):
mapping = {
"bukhar": "fever",
"khansi": "cough",
"sar dard": "headache",
"saans": "breathing",
"dard": "pain"
}
for h, e in mapping.items():
text = text.lower().replace(h, e)
return text.lower()
# =========================
# NLP MODEL (LAZY LOAD)
# =========================
classifier = None
def get_classifier():
global classifier
if classifier is None:
classifier = pipeline(
"zero-shot-classification",
model="typeform/distilbert-base-uncased-mnli"
)
return classifier
labels = ["fever", "cough", "headache", "vomiting", "chest pain", "breathlessness"]
label_map = {
"fever": "fever",
"cough": "cough",
"headache": "headache",
"vomiting": "vomiting",
"chest pain": "chest_pain",
"breathlessness": "breathlessness"
}
# =========================
# SYMPTOM EXTRACTION
# =========================
def extract_symptoms(text):
clf = get_classifier()
result = clf(text, labels)
symptoms = []
for label, score in zip(result["labels"], result["scores"]):
if score > 0.4:
symptoms.append(label_map[label])
text = text.lower()
if "breath" in text:
symptoms.append("breathlessness")
if "chest" in text and "pain" in text:
symptoms.append("chest_pain")
if "fever" in text:
symptoms.append("fever")
if "cough" in text:
symptoms.append("cough")
if "vomit" in text:
symptoms.append("vomiting")
if "head" in text and "pain" in text:
symptoms.append("headache")
return list(set(symptoms))
# =========================
# SEVERITY (NO CSV VERSION)
# =========================
def get_severity(symptoms):
score = len(symptoms)
if score >= 4:
return "Critical"
elif score == 3:
return "High"
elif score == 2:
return "Moderate"
return "Low"
# =========================
# DISEASE PREDICTION
# =========================
def predict_disease(symptoms):
vec = [1 if s in symptoms else 0 for s in symptoms_list]
pred = model.predict([vec])[0]
return encoder.inverse_transform([pred])[0]
# =========================
# DESCRIPTION GENERATOR
# =========================
def generate_description(disease):
return f"{disease} is a medical condition that requires proper diagnosis and treatment. Consult a healthcare professional for detailed evaluation."
# =========================
# PRECAUTION GENERATOR (FULL COVERAGE)
# =========================
def generate_precautions(disease):
d = normalize(disease)
# INFECTIOUS
if any(x in d for x in ["infection", "fever", "virus", "bacteria", "abscess", "tuberculosis", "dengue", "malaria"]):
return [
"Maintain personal hygiene",
"Wash hands frequently",
"Avoid contact with infected individuals",
"Use clean water and food",
"Follow vaccination guidelines"
]
# RESPIRATORY
elif any(x in d for x in ["lung", "asthma", "bronch", "respiratory", "pneumonia"]):
return [
"Avoid smoking and pollution",
"Use masks in dusty environments",
"Avoid allergens",
"Practice breathing exercises",
"Take prescribed medication"
]
# HEART
elif any(x in d for x in ["heart", "cardio", "hypertension", "artery"]):
return [
"Eat low-salt, low-fat diet",
"Exercise regularly",
"Avoid smoking",
"Manage stress",
"Monitor blood pressure"
]
# METABOLIC
elif any(x in d for x in ["diabetes", "thyroid", "obesity"]):
return [
"Maintain balanced diet",
"Exercise regularly",
"Monitor sugar levels",
"Avoid processed food",
"Follow medication plan"
]
# MENTAL
elif any(x in d for x in ["depression", "anxiety", "mental", "psych"]):
return [
"Maintain sleep schedule",
"Practice relaxation techniques",
"Seek counseling",
"Avoid alcohol",
"Stay socially active"
]
# SKIN
elif any(x in d for x in ["skin", "acne", "eczema", "dermatitis", "fungal"]):
return [
"Maintain hygiene",
"Avoid irritants",
"Keep skin dry",
"Use prescribed creams",
"Avoid sharing personal items"
]
# INJURY / BONES
elif any(x in d for x in ["fracture", "injury", "arthritis", "joint", "bone"]):
return [
"Avoid heavy strain",
"Use protective gear",
"Ensure calcium intake",
"Follow physiotherapy",
"Take rest"
]
# CANCER
elif "cancer" in d:
return [
"Avoid smoking",
"Eat healthy diet",
"Regular screening",
"Avoid harmful chemicals",
"Consult doctor early"
]
# DEFAULT
else:
return [
"Maintain healthy lifestyle",
"Eat balanced diet",
"Exercise regularly",
"Avoid smoking and alcohol",
"Consult doctor if symptoms worsen"
]
# =========================
# REQUEST MODEL
# =========================
class InputData(BaseModel):
text: str
# =========================
# ROUTES
# =========================
@app.get("/")
def home():
return {"message": "MediAgent API running (No CSV) 🚀"}
@app.post("/predict")
def predict_api(input: InputData):
text = input.text
if not text:
return {"error": "No input provided"}
original = text
text = hinglish_to_english(text)
symptoms = extract_symptoms(text)
if "सांस" in original:
symptoms.append("breathlessness")
symptoms = list(set(symptoms))
if not symptoms:
return {"error": "No symptoms detected"}
disease = predict_disease(symptoms)
description = generate_description(disease)
precautions = generate_precautions(disease)
severity = get_severity(symptoms)
return {
"symptoms": symptoms,
"disease": disease,
"severity": severity,
"description": description,
"precautions": precautions
}