File size: 3,383 Bytes
a8f12f6 56edde7 a8f12f6 56edde7 a8f12f6 56edde7 a8f12f6 56edde7 a8f12f6 56edde7 a8f12f6 56edde7 a8f12f6 56edde7 a8f12f6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
from fastapi import APIRouter, HTTPException, UploadFile, File
from models.request_models import ProviderNotesRequest, FileUploadResponse
from models.response_models import CodingResponse
from services.groq_service import groq_service
from services.file_service import file_service
import logging
router = APIRouter()
logger = logging.getLogger(__name__)
# EXISTING ENDPOINT - DO NOT CHANGE
@router.post("/coding", response_model=CodingResponse)
async def analyze_provider_notes(request: ProviderNotesRequest):
"""
Analyze provider notes and extract ICD-10 and CPT codes
This endpoint accepts provider notes as text input.
"""
try:
logger.info("Received coding request")
# Get provider notes from request
provider_notes = request.provider_notes
if not provider_notes or len(provider_notes.strip()) < 10:
raise HTTPException(
status_code=400,
detail="Provider notes must be at least 10 characters long"
)
# Process through Groq service
result = await groq_service.analyze_notes(provider_notes)
logger.info("Successfully processed coding request")
return result
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in analyze_provider_notes: {str(e)}")
raise HTTPException(
status_code=500,
detail=f"Error processing request: {str(e)}"
)
# NEW ENDPOINT - File Upload
@router.post("/upload-file", response_model=FileUploadResponse)
async def upload_provider_notes_file(file: UploadFile = File(...)):
"""
Upload a TXT file containing provider notes and extract ICD-10 and CPT codes
This endpoint accepts a TXT file, extracts the text, and processes it through the LLM.
Args:
file: TXT file containing provider notes
Returns:
FileUploadResponse with extracted codes and explanations
"""
try:
logger.info(f"Received file upload request: {file.filename}")
# Step 1: Extract text from uploaded file
extraction_result = await file_service.extract_text_from_file(file)
extracted_text = extraction_result["text"]
filename = extraction_result["filename"]
text_length = extraction_result["text_length"]
logger.info(f"Extracted {text_length} characters from {filename}")
# Step 2: Process extracted text through Groq LLM
coding_result = await groq_service.analyze_notes(extracted_text)
logger.info(f"Successfully processed file: {filename}")
# Step 3: Return combined response
return FileUploadResponse(
success=True,
filename=filename,
extracted_text_length=text_length,
cpt_codes=coding_result.cpt_codes,
cpt_explanation=coding_result.cpt_explanation,
icd_codes=coding_result.icd_codes,
icd_explanation=coding_result.icd_explanation
)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in upload_provider_notes_file: {str(e)}")
raise HTTPException(
status_code=500,
detail=f"Error processing uploaded file: {str(e)}"
) |