test_fda_agent.py•8.17 kB
#!/usr/bin/env python3
"""
Test script for the FDA Verification Agent
"""
import asyncio
import json
import sys
import os
from pathlib import Path
# Add parent directory to path
sys.path.append(str(Path(__file__).parent))
from agents.fda_verification_agent import FDAVerificationAgent, PADecision
# Test scenarios
TEST_SCENARIOS = [
{
"name": "Jabra Enhance Plus with K-number",
"description": "Device with explicit FDA 510(k) number",
"device_request": {
"resourceType": "DeviceRequest",
"status": "active",
"intent": "order",
"codeCodeableConcept": {
"text": "Jabra Enhance Plus hearing aid",
"coding": [{
"system": "http://snomed.info/sct",
"code": "706230002",
"display": "Hearing aid"
}]
},
"note": [{
"text": "Patient requires OTC hearing aid for moderate hearing loss. FDA 510(k) number K213424"
}],
"performer": {
"display": "GN Hearing A/S"
},
"subject": {
"reference": "Patient/123",
"display": "John Doe"
},
"authoredOn": "2025-09-22",
"reasonCode": [{
"text": "Bilateral moderate sensorineural hearing loss"
}]
}
},
{
"name": "Generic hearing aid request",
"description": "Vague device request without specific model",
"device_request": {
"resourceType": "DeviceRequest",
"status": "active",
"intent": "order",
"codeCodeableConcept": {
"text": "Hearing aid device",
"coding": [{
"system": "http://snomed.info/sct",
"code": "706230002",
"display": "Hearing aid"
}]
},
"subject": {
"reference": "Patient/456",
"display": "Jane Smith"
},
"authoredOn": "2025-09-22",
"reasonCode": [{
"text": "Hearing loss"
}]
}
},
{
"name": "Bose hearing aid by brand name",
"description": "Device identified by consumer brand name",
"device_request": {
"resourceType": "DeviceRequest",
"status": "active",
"intent": "order",
"codeCodeableConcept": {
"text": "Lexie B2 hearing aid powered by Bose",
"coding": [{
"system": "http://snomed.info/sct",
"code": "706230002",
"display": "Hearing aid"
}]
},
"note": [{
"text": "Patient prefers Bose/Lexie brand OTC hearing aid"
}],
"subject": {
"reference": "Patient/789",
"display": "Bob Johnson"
},
"authoredOn": "2025-09-22"
}
},
{
"name": "Non-FDA device",
"description": "Device that likely doesn't have FDA clearance",
"device_request": {
"resourceType": "DeviceRequest",
"status": "active",
"intent": "order",
"codeCodeableConcept": {
"text": "Generic amplification device from unknown manufacturer",
"coding": [{
"system": "http://snomed.info/sct",
"code": "706230002",
"display": "Hearing aid"
}]
},
"note": [{
"text": "Patient found this device online, no brand information available"
}],
"subject": {
"reference": "Patient/999",
"display": "Alice Brown"
},
"authoredOn": "2025-09-22"
}
},
{
"name": "High-end prescription device",
"description": "Professional-grade hearing aid requiring prescription",
"device_request": {
"resourceType": "DeviceRequest",
"status": "active",
"intent": "order",
"codeCodeableConcept": {
"text": "Phonak Audeo Paradise P90 hearing aid system",
"coding": [{
"system": "http://snomed.info/sct",
"code": "706230002",
"display": "Hearing aid"
}]
},
"note": [{
"text": "Bilateral severe hearing loss, requires professional fitting and programming"
}],
"performer": {
"display": "Sonova AG"
},
"subject": {
"reference": "Patient/555",
"display": "Charlie Wilson"
},
"authoredOn": "2025-09-22",
"reasonCode": [{
"text": "Severe bilateral sensorineural hearing loss"
}]
}
}
]
async def test_agent():
"""Test the FDA Verification Agent with various scenarios."""
# Get credentials from environment or use defaults
api_key = os.getenv("LLAMA_API_KEY", "af78aa99d7ae5bb58f19380ee007277c")
base_url = os.getenv("LLAMA_BASE_URL",
"https://llama-4-scout-17b-16e-w4a16-maas-apicast-production.apps.prod.rhoai.rh-aiservices-bu.com:443/v1")
mcp_url = os.getenv("FDA_MCP_URL", "http://localhost:8090/mcp/")
print("=" * 80)
print("FDA Verification Agent Test Suite")
print("=" * 80)
print(f"MCP Server: {mcp_url}")
print(f"LLM Model: llama-4-scout-17b-16e-w4a16")
print("=" * 80)
# Initialize agent
agent = FDAVerificationAgent(
mcp_url=mcp_url,
api_key=api_key,
base_url=base_url
)
# Run test scenarios
for i, scenario in enumerate(TEST_SCENARIOS, 1):
print(f"\nTest {i}: {scenario['name']}")
print("-" * 60)
print(f"Description: {scenario['description']}")
try:
# Run the agent
result = await agent.analyze_device_request(scenario["device_request"])
# Display results
print(f"\n📊 PA Decision: {result.decision.value.upper()}")
print(f"💭 Reasoning: {result.reasoning}")
if result.fda_verification:
fda = result.fda_verification
print(f"\n🔍 FDA Verification:")
print(f" Device: {fda.device_name}")
print(f" FDA Status: {fda.fda_status}")
print(f" FDA Approved: {'✅' if fda.is_fda_approved else '❌'}")
if fda.fda_number:
print(f" FDA Number: {fda.fda_number}")
if fda.manufacturer:
print(f" Manufacturer: {fda.manufacturer}")
print(f" Confidence: {fda.confidence:.0%}")
print(f" Method: {fda.verification_method}")
if fda.is_otc:
print(f" OTC Status: ✅ Over-the-counter")
if result.requirements_met:
print(f"\n✓ Requirements Met:")
for req, met in result.requirements_met.items():
status = "✅" if met else "❌"
print(f" {status} {req}")
if result.missing_information:
print(f"\n⚠️ Missing Information:")
for info in result.missing_information:
print(f" • {info}")
if result.recommendations:
print(f"\n💡 Recommendations:")
for rec in result.recommendations:
print(f" • {rec}")
print(f"\n🎯 Confidence: {result.confidence:.0%}")
print(f"⏰ Timestamp: {result.timestamp}")
except Exception as e:
print(f"\n❌ Error: {e}")
import traceback
traceback.print_exc()
print("\n" + "=" * 80)
print("\n✅ All tests completed!")
if __name__ == "__main__":
asyncio.run(test_agent())