qwendr / app.py
Prajith04's picture
Upload 12 files
cbc783a verified
raw
history blame
2.39 kB
from fastapi import FastAPI, Query, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from utils.vector_search import get_similar_symptoms
from utils.sql_queries import get_diseases_by_symptoms, get_related_symptoms
import sqlite3
app = FastAPI()
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allow all origins
allow_credentials=True,
allow_methods=["*"], # Allow all methods
allow_headers=["*"], # Allow all headers
)
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
def index(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
# Helper function to check if a symptom exists in the database
def is_valid_symptom(symptom):
conn = sqlite3.connect("disease.db")
cur = conn.cursor()
cur.execute("SELECT COUNT(*) FROM symptom WHERE name = ?", (symptom,))
count = cur.fetchone()[0]
conn.close()
return count > 0
@app.get("/search")
def search(symptom: str, selected: list[str] = Query([])):
# Get similar symptoms from vector search
similar = get_similar_symptoms(symptom)
# Check if the exact symptom exists in our database
if is_valid_symptom(symptom):
# Use the exact symptom if it exists
search_symptoms = [symptom] + selected
else:
# Otherwise, try to use the first similar symptom that exists in our database
valid_symptom_found = False
for sim in similar:
if is_valid_symptom(sim):
search_symptoms = [sim] + selected
valid_symptom_found = True
break
# If no valid symptom found, just use all similar symptoms
if not valid_symptom_found:
search_symptoms = similar + selected
# Get diseases that have ALL the selected search symptoms
diseases = get_diseases_by_symptoms(search_symptoms)
# Get related symptoms from the matching diseases, excluding already selected symptoms
suggestions = get_related_symptoms(diseases, exclude=search_symptoms)
return {
"matching_diseases": diseases,
"related_symptoms": suggestions,
"semantic_matches": similar
}