Comprehensive checklist for deploying OpenEvidence clinical AI integrations to production healthcare environments.
Business Associate Agreement (BAA) signed
API Terms of Service accepted
Clinical use disclaimers in place
Liability and malpractice considerations reviewed
Data processing agreement documented
Production API keys generated
Key rotation schedule established
IP allowlist configured (if available)
TLS 1.2+ enforced
PHI sanitization implemented
openevidence-security-basics
Webhook signature verification active
Audit logging enabled
High availability configuration
// Multiple API endpoints for failover
const config = {
primaryEndpoint: 'https://api.openevidence.com',
fallbackEndpoint: 'https://api-fallback.openevidence.com',
timeout: 30000,
retries: 3,
};
Circuit breaker implemented
import CircuitBreaker from 'opossum';
const breaker = new CircuitBreaker(clinicalQuery, {
timeout: 30000,
errorThresholdPercentage: 50,
resetTimeout: 30000,
});
Rate limit handling configured
openevidence-rate-limits
Timeout configuration appropriate
Health check endpoint implemented
app.get('/health/openevidence', async (req, res) => {
try {
await client.health.check();
res.json({ status: 'healthy' });
} catch (error) {
res.status(503).json({ status: 'unhealthy', error: error.message });
}
});
Metrics collection active
openevidence-observability
Alert rules configured
| Alert | Threshold | Severity |
|---|---|---|
| Error rate > 5% | 5 min window | Warning |
| Error rate > 20% | 5 min window | Critical |
| P95 latency > 15s | 5 min window | Warning |
| Health check failed | 2 consecutive | Critical |
Dashboard created
Log aggregation configured
Graceful degradation implemented
async function clinicalQueryWithFallback(question: string) {
try {
return await openEvidenceQuery(question);
} catch (error) {
// Log error, alert, return cached or default response
await alertService.send('OpenEvidence unavailable');
return {
answer: 'Clinical evidence service temporarily unavailable. Please consult current guidelines directly.',
fallback: true,
};
}
}
Retry logic tested
Error classification implemented
openevidence-common-errors
Response caching strategy
Connection pooling configured
Query optimization reviewed
Load testing completed
Runbook created
openevidence-incident-runbook
On-call training completed
User documentation updated
Clinical staff training
Integration tests passing
End-to-end tests passing
Clinical validation completed
Performance benchmarks met
Blue-green or canary deployment planned
Rollback procedure documented
Feature flags configured
Database migrations completed
Monitoring dashboard reviewed daily (first week)
Error reports triaged immediately
User feedback collection active
Performance baseline established
// config/openevidence.production.ts
export const productionConfig = {
// Credentials from secret manager
credentials: {
source: 'secret-manager',
apiKeyPath: 'projects/prod/secrets/openevidence-api-key',
orgIdPath: 'projects/prod/secrets/openevidence-org-id',
},
// Endpoints
api: {
baseUrl: 'https://api.openevidence.com',
timeout: 30000,
retries: 3,
},
// Rate limiting
rateLimits: {
enabled: true,
maxConcurrent: 10,
requestsPerMinute: 100,
},
// Circuit breaker
circuitBreaker: {
enabled: true,
errorThreshold: 50,
resetTimeout: 30000,
},
// Caching
cache: {
enabled: true,
ttlSeconds: 3600,
maxEntries: 10000,
},
// Monitoring
monitoring: {
metricsEnabled: true,
tracingEnabled: true,
logLevel: 'info',
},
};
For version upgrades, see openevidence-upgrade-migration.