1212from src .models .clinical_bundle import ClinicalBundle
1313from src .models .pa_form import PAFormResponse
1414from src .parsers .pdf_parser import parse_pdf
15- from src .policies .example_policy import EXAMPLE_POLICY
15+ from src .policies .registry import registry
1616from src .reasoning .evidence_extractor import extract_evidence
1717from src .reasoning .form_generator import generate_form_data
1818
1919router = APIRouter ()
2020
21- # Supported procedure codes (MRI Lumbar Spine)
22- SUPPORTED_PROCEDURE_CODES = {"72148" , "72149" , "72158" }
23-
2421
2522class AnalyzeRequest (BaseModel ):
2623 """Request payload for analysis endpoint."""
@@ -36,14 +33,8 @@ async def analyze(request: AnalyzeRequest) -> PAFormResponse:
3633 Analyze clinical data and generate PA form response.
3734
3835 Uses LLM to extract evidence from clinical data and generate PA form.
36+ Resolves policy from registry; unknown CPT codes fall back to generic policy.
3937 """
40- # Check if procedure is supported
41- if request .procedure_code not in SUPPORTED_PROCEDURE_CODES :
42- raise HTTPException (
43- status_code = 400 ,
44- detail = f"Procedure code { request .procedure_code } not supported" ,
45- )
46-
4738 # Parse clinical data into structured format
4839 bundle = ClinicalBundle .from_dict (request .patient_id , request .clinical_data )
4940
@@ -55,8 +46,8 @@ async def analyze(request: AnalyzeRequest) -> PAFormResponse:
5546 detail = "patient.birth_date is required" ,
5647 )
5748
58- # Load policy with requested procedure code
59- policy = { ** EXAMPLE_POLICY , "procedure_codes" : [ request .procedure_code ]}
49+ # Resolve policy from registry (no more 400 rejection for unsupported CPTs)
50+ policy = registry . resolve ( request .procedure_code )
6051
6152 # Extract evidence using LLM
6253 evidence = await extract_evidence (bundle , policy )
@@ -87,21 +78,11 @@ async def analyze_with_documents(
8778 except json .JSONDecodeError as e :
8879 raise HTTPException (status_code = 400 , detail = f"Invalid clinical data JSON: { e } " )
8980
90- # Check if procedure is supported
91- if procedure_code not in SUPPORTED_PROCEDURE_CODES :
92- raise HTTPException (
93- status_code = 400 ,
94- detail = f"Procedure code { procedure_code } not supported" ,
95- )
96-
97- # Parse clinical data into structured format
9881 bundle = ClinicalBundle .from_dict (patient_id , clinical_data_dict )
9982
10083 # Read all document bytes, then parse PDFs in parallel
10184 pdf_bytes_list = [await doc .read () for doc in documents ]
102-
10385 document_texts = list (await asyncio .gather (* [parse_pdf (b ) for b in pdf_bytes_list ]))
104-
10586 bundle .document_texts = document_texts
10687
10788 # Validate required patient data
@@ -112,8 +93,8 @@ async def analyze_with_documents(
11293 detail = "patient.birth_date is required" ,
11394 )
11495
115- # Load policy with requested procedure code
116- policy = { ** EXAMPLE_POLICY , "procedure_codes" : [ procedure_code ]}
96+ # Resolve policy from registry
97+ policy = registry . resolve ( procedure_code )
11798
11899 # Extract evidence using LLM
119100 evidence = await extract_evidence (bundle , policy )
@@ -122,30 +103,3 @@ async def analyze_with_documents(
122103 form_response = await generate_form_data (bundle , evidence , policy )
123104
124105 return form_response
125-
126-
127- def _build_field_mappings (bundle : ClinicalBundle , procedure_code : str ) -> dict [str , str ]:
128- """Build PDF field mappings from clinical bundle."""
129- patient_name = bundle .patient .name if bundle .patient else "Unknown"
130- patient_dob = (
131- bundle .patient .birth_date .isoformat ()
132- if bundle .patient and bundle .patient .birth_date
133- else "Unknown"
134- )
135- member_id = (
136- bundle .patient .member_id
137- if bundle .patient and bundle .patient .member_id
138- else "Unknown"
139- )
140- diagnosis_codes = ", " .join (c .code for c in bundle .conditions ) if bundle .conditions else ""
141-
142- return {
143- "PatientName" : patient_name ,
144- "PatientDOB" : patient_dob ,
145- "MemberID" : member_id ,
146- "DiagnosisCodes" : diagnosis_codes ,
147- "ProcedureCode" : procedure_code ,
148- "ClinicalSummary" : "Awaiting production configuration" ,
149- "ProviderSignature" : "" ,
150- "Date" : "" ,
151- }
0 commit comments