syn / api.py
theaniketgiri's picture
Completed
7271401
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List, Optional, Dict, Any
import uvicorn
import sys
import os
from pathlib import Path
from fastapi.responses import FileResponse
# Add src directory to Python path
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
# Import the medical generator and data analyzer
from src.generation.medical_generator import MedicalTextGenerator, DEFAULT_GEMINI_API_KEY
from analyze_data_quality import DataQualityAnalyzer
app = FastAPI(
title="Synthex Medical Text Generator API",
description="API for generating synthetic medical records and analyzing data quality",
version="1.0.0"
)
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Allows all origins
allow_credentials=True,
allow_methods=["*"], # Allows all methods
allow_headers=["*"], # Allows all headers
)
# Initialize the generator and analyzer
generator = None
analyzer = None
class GenerationRequest(BaseModel):
record_type: str
quantity: int = 1
use_gemini: bool = False
gemini_api_key: Optional[str] = None
include_metadata: bool = True
class GenerationResponse(BaseModel):
records: List[dict]
total_generated: int
class AnalysisResponse(BaseModel):
summary: Dict[str, Any]
datasets: Dict[str, Dict[str, Any]]
plots_available: List[str]
@app.on_event("startup")
async def startup_event():
global generator, analyzer
try:
generator = MedicalTextGenerator()
analyzer = DataQualityAnalyzer()
except Exception as e:
print(f"Error initializing services: {str(e)}")
@app.get("/")
async def root():
return {"message": "Welcome to Synthex Medical Text Generator API"}
@app.post("/generate", response_model=GenerationResponse)
async def generate_records(request: GenerationRequest):
global generator
if generator is None:
try:
generator = MedicalTextGenerator(gemini_api_key=request.gemini_api_key)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to initialize generator: {str(e)}")
try:
generated_records = []
for _ in range(request.quantity):
record = generator.generate_record(
request.record_type,
use_gemini=request.use_gemini
)
generated_records.append(record)
return GenerationResponse(
records=generated_records,
total_generated=len(generated_records)
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Generation failed: {str(e)}")
@app.get("/record-types")
async def get_record_types():
return {
"record_types": [
"clinical_note",
"discharge_summary",
"lab_report",
"prescription",
"patient_intake"
]
}
@app.post("/analyze", response_model=AnalysisResponse)
async def analyze_data():
global analyzer
if analyzer is None:
try:
analyzer = DataQualityAnalyzer()
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to initialize analyzer: {str(e)}")
try:
# Run analysis
analyzer.analyze_all_datasets()
report = analyzer.generate_report()
analyzer.plot_metrics()
# Get list of generated plots
plots_dir = analyzer.data_dir.parent / "reports" / "plots"
plots_available = [f.name for f in plots_dir.glob("*.png")]
return AnalysisResponse(
summary=report["summary"],
datasets=report["datasets"],
plots_available=plots_available
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Analysis failed: {str(e)}")
@app.get("/analysis/plots/{plot_name}")
async def get_plot(plot_name: str):
plots_dir = Path("data/reports/plots")
plot_path = plots_dir / plot_name
if not plot_path.exists():
raise HTTPException(status_code=404, detail=f"Plot {plot_name} not found")
return FileResponse(plot_path)
if __name__ == "__main__":
uvicorn.run("api:app", host="0.0.0.0", port=8000, reload=True)