"""
Improved FDA Device Verification Agent with better prompt engineering
"""
# ... (keeping the same imports and class structure as before)
# Just showing the improved _make_pa_decision method
async def _make_pa_decision_improved(
self,
device_request: Dict[str, Any],
fda_result: FDAVerificationResult
) -> PARecommendation:
"""
Make PA decision based on FDA status using improved prompt.
"""
# Build context for LLM decision
context = {
"device_request_summary": self._summarize_device_request(device_request),
"fda_verification": asdict(fda_result),
"policy_requirements": {
"mandatory": {
"fda_clearance_required": True,
"device_class_2_or_lower": True
},
"preferred": {
"otc_device": True
}
}
}
# IMPROVED PROMPT with clearer decision logic
prompt = f"""You are a Prior Authorization specialist reviewing a medical device request.
Your job is to APPROVE devices that meet all MANDATORY requirements.
Device Request Summary:
{json.dumps(context['device_request_summary'], indent=2)}
FDA Verification Results:
{json.dumps(context['fda_verification'], indent=2)}
Policy Requirements:
{json.dumps(context['policy_requirements'], indent=2)}
DECISION RULES:
1. APPROVE if ALL mandatory requirements are met:
- Device has FDA clearance or approval (status = "cleared" or "approved")
- Device is Class 2 or lower (device_class = "1" or "2")
- Documentation is complete (confidence_score >= 0.5)
2. DENY if ANY mandatory requirement is NOT met
3. PENDING_INFORMATION if verification confidence is low (< 0.5)
4. MANUAL_REVIEW only for exceptional cases
IMPORTANT:
- OTC status is PREFERRED but NOT required for approval
- If a device meets all mandatory requirements, it MUST be approved
- The presence of "is_otc": true is a bonus, not a requirement
- Focus on FDA clearance/approval as the primary criterion
Based on the FDA verification results above, make your decision.
The device "{context['fda_verification']['device_name']}" has:
- FDA Status: {context['fda_verification']['fda_status']}
- Device Class: {context['fda_verification']['device_class']}
- Is OTC: {context['fda_verification']['is_otc']}
- Confidence: {context['fda_verification']['confidence']}
Return a JSON object with:
{{
"decision": "approved|denied|pending_information|manual_review",
"reasoning": "detailed explanation focusing on mandatory requirements",
"requirements_met": {{
"fda_clearance": true/false,
"device_class_acceptable": true/false,
"documentation_complete": true/false
}},
"missing_information": ["list of missing items if any"],
"recommendations": ["list of recommendations"],
"confidence": 0.0-1.0
}}
Return ONLY the JSON object.
"""
try:
response = await self.llm.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": "You are a Prior Authorization specialist. Your primary goal is to APPROVE devices that meet mandatory FDA requirements. OTC status is a preference, not a requirement."},
{"role": "user", "content": prompt}
],
temperature=0.1,
max_tokens=800
)
content = response.choices[0].message.content.strip()
if "```json" in content:
content = content.split("```json")[1].split("```")[0].strip()
elif "```" in content:
content = content.split("```")[1].split("```")[0].strip()
decision_data = json.loads(content)
return PARecommendation(
decision=PADecision(decision_data["decision"]),
fda_verification=fda_result,
reasoning=decision_data["reasoning"],
requirements_met=decision_data.get("requirements_met", {}),
missing_information=decision_data.get("missing_information", []),
recommendations=decision_data.get("recommendations", []),
confidence=decision_data.get("confidence", 0.5),
timestamp=datetime.now().isoformat()
)
except Exception as e:
logger.error(f"Error in LLM decision making: {e}")
# Fallback to rule-based decision
return self._rule_based_decision(fda_result)