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)}"
        )