File size: 4,311 Bytes
a8f12f6
 
56edde7
 
a8f12f6
 
 
 
 
56edde7
 
a8f12f6
 
56edde7
 
a8f12f6
56edde7
a8f12f6
56edde7
 
a8f12f6
 
 
 
 
 
 
 
 
 
 
fd20bd2
3cbb4d9
a8f12f6
 
3cbb4d9
 
 
 
 
 
 
 
a8f12f6
 
 
56edde7
a8f12f6
 
 
 
 
 
56edde7
fd20bd2
a8f12f6
 
 
 
 
fd20bd2
 
 
 
 
a8f12f6
 
 
 
 
fd20bd2
a8f12f6
 
fd20bd2
a8f12f6
fd20bd2
 
 
 
 
a8f12f6
 
 
 
fd20bd2
 
 
a8f12f6
fd20bd2
 
a8f12f6
fd20bd2
3cbb4d9
a8f12f6
fd20bd2
a8f12f6
fd20bd2
a8f12f6
 
 
 
fd20bd2
 
3cbb4d9
 
 
 
a8f12f6
 
 
 
 
fd20bd2
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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_provider_notes(provider_notes)
        
        logger.info("Successfully processed coding request")
        
        # Return response matching CodingResponse model
        return CodingResponse(
            cpt_codes=result.get("CPT", []),
            cpt_explanation=result.get("CPT_explanation", ""),
            icd_codes=result.get("ICD", []),
            icd_explanation=result.get("ICD_explanation", "")
        )
        
    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)}"
        )


# UPDATED ENDPOINT - File Upload with PII Removal
@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:
    1. Extracts text from uploaded TXT file
    2. Automatically detects and removes patient personal information (PII)
    3. Processes sanitized text through LLM
    4. Returns ICD-10 and CPT codes
    
    Args:
        file: TXT file containing provider notes
        
    Returns:
        FileUploadResponse with codes, explanations, and PII removal info
    """
    try:
        logger.info(f"📁 Received file upload request: {file.filename}")
        
        # Step 1: Extract text from file with automatic PII removal
        extraction_result = await file_service.extract_text_from_file(
            file=file,
            remove_pii=True  # Always remove PII for safety
        )
        
        extracted_text = extraction_result["text"]
        filename = extraction_result["filename"]
        text_length = extraction_result["text_length"]
        pii_info = extraction_result["pii_info"]
        
        logger.info(f"✅ Extracted {text_length} characters from {filename}")
        
        if pii_info["pii_removed"]:
            logger.info(f"🔒 Removed {pii_info['pii_count']} PII entities before processing")
        
        # Step 2: Process sanitized text through Groq LLM
        coding_result = await groq_service.analyze_provider_notes(extracted_text)
        
        logger.info(f"✅ Successfully processed file: {filename}")
        
        # Step 3: Return combined response with PII info
        return FileUploadResponse(
            success=True,
            filename=filename,
            extracted_text_length=text_length,
            pii_removed=pii_info["pii_removed"],
            pii_count=pii_info["pii_count"],
            cpt_codes=coding_result.get("CPT", []),
            cpt_explanation=coding_result.get("CPT_explanation", ""),
            icd_codes=coding_result.get("ICD", []),
            icd_explanation=coding_result.get("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)}"
        )