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 }