crisis-detection-intervention-ai
Crisis Detection & Intervention AI
Expert in detecting mental health crises and implementing safe, ethical intervention protocols.
⚠️ ETHICAL DISCLAIMER
This skill assists with crisis detection, NOT crisis response.
✅ Appropriate uses:
- Flagging concerning content for human review
- Connecting users to professional resources
- Escalating to crisis counselors
- Providing immediate hotline information
❌ NOT a substitute for:
- Licensed therapists
- Emergency services (911)
- Medical diagnosis
- Professional mental health treatment
Always provide crisis hotlines: National Suicide Prevention Lifeline: 988
When to Use
✅ Use for:
- Mental health journaling apps
- Recovery community platforms
- Support group monitoring
- Online therapy platforms
- Crisis text line integration
❌ NOT for:
- General sentiment analysis (use standard tools)
- Medical diagnosis (not qualified)
- Automated responses without human review
- Replacing professional crisis counselors
Quick Decision Tree
Detected concerning content?
├── Immediate danger? → Escalate to crisis counselor + show 988
├── Suicidal ideation? → Flag for review + show resources
├── Substance relapse? → Connect to sponsor + resources
├── Self-harm mention? → Gentle check-in + resources
└── General distress? → Supportive response + resources
Technology Selection
NLP Models for Mental Health (2024)
| Model | Best For | Accuracy | Latency |
|---|---|---|---|
| MentalBERT | Mental health text | 89% | 50ms |
| GPT-4 + Few-shot | Crisis detection | 92% | 200ms |
| RoBERTa-Mental | Depression detection | 87% | 40ms |
| Custom Fine-tuned BERT | Domain-specific | 90%+ | 60ms |
Timeline:
- 2019: BERT fine-tuned for mental health
- 2021: MentalBERT released
- 2023: GPT-4 shows strong zero-shot crisis detection
- 2024: Specialized models for specific conditions
Common Anti-Patterns
Anti-Pattern 1: Using Generic Sentiment Analysis
Novice thinking: "Negative sentiment = crisis"
Problem: Mental health language is nuanced, context-dependent.
Wrong approach:
// ❌ Generic sentiment misses mental health signals
const sentiment = analyzeSentiment(text);
if (sentiment.score < -0.5) {
alertCrisis(); // Too broad!
}
Why wrong: "I'm tired" vs "I'm tired of living" - different meanings, same sentiment.
Correct approach:
// ✅ Mental health-specific model
import { pipeline } from '@huggingface/transformers';
const detector = await pipeline('text-classification', 'mental/bert-base-uncased');
const result = await detector(text, {
labels: ['suicidal_ideation', 'self_harm', 'substance_relapse', 'safe']
});
if (result[0].label === 'suicidal_ideation' && result[0].score > 0.8) {
await escalateToCrisisCounselor({
text,
confidence: result[0].score,
timestamp: Date.now()
});
// IMMEDIATELY show crisis resources
showCrisisResources({
phone: '988',
text: 'Text "HELLO" to 741741',
chat: 'https://988lifeline.org/chat'
});
}
Timeline context:
- 2015: Rule-based keyword matching
- 2020: BERT fine-tuning for mental health
- 2024: Multi-label models with context understanding
Anti-Pattern 2: Automated Responses Without Human Review
Problem: AI cannot replace empathy, may escalate distress.
Wrong approach:
// ❌ AI auto-responds to crisis
if (isCrisis(text)) {
await sendMessage(userId, "I'm concerned about you. Are you okay?");
}
Why wrong:
- Feels robotic, invalidating
- May increase distress
- No human judgment
Correct approach:
// ✅ Flag for human review, show resources
if (isCrisis(text)) {
// 1. Flag for counselor review
await flagForReview({
userId,
text,
severity: 'high',
detectedAt: Date.now(),
requiresImmediate: true
});
// 2. Notify on-call counselor
await notifyOnCallCounselor({
userId,
summary: 'Suicidal ideation detected',
urgency: 'immediate'
});
// 3. Show resources (no AI message)
await showInAppResources({
type: 'crisis_support',
resources: [
{ name: '988 Suicide & Crisis Lifeline', link: 'tel:988' },
{ name: 'Crisis Text Line', link: 'sms:741741' },
{ name: 'Chat Now', link: 'https://988lifeline.org/chat' }
]
});
// 4. DO NOT send automated "are you okay" message
}
Human review flow:
AI Detection → Flag → On-call counselor notified → Human reaches out
Anti-Pattern 3: Not Providing Immediate Resources
Problem: User in crisis needs help NOW, not later.
Wrong approach:
// ❌ Just flags, no immediate help
if (isCrisis(text)) {
await logCrisisEvent(userId, text);
// User left with no resources
}
Correct approach:
// ✅ Immediate resources + escalation
if (isCrisis(text)) {
// Show resources IMMEDIATELY (blocking modal)
await showCrisisModal({
title: 'Resources Available',
resources: [
{
name: '988 Suicide & Crisis Lifeline',
description: 'Free, confidential support 24/7',
action: 'tel:988',
type: 'phone'
},
{
name: 'Crisis Text Line',
description: 'Text support with trained counselor',
action: 'sms:741741',
message: 'HELLO',
type: 'text'
},
{
name: 'Chat with counselor',
description: 'Online chat support',
action: 'https://988lifeline.org/chat',
type: 'web'
}
],
dismissible: true, // User can close, but resources shown first
analytics: { event: 'crisis_resources_shown', source: 'ai_detection' }
});
// Then flag for follow-up
await flagForReview({ userId, text, severity: 'high' });
}
Anti-Pattern 4: Storing Crisis Data Insecurely
Problem: Crisis content is extremely sensitive PHI.
Wrong approach:
// ❌ Plain text storage
await db.logs.insert({
userId: user.id,
type: 'crisis',
content: text, // Stored in plain text!
timestamp: Date.now()
});
Why wrong: Data breach exposes most vulnerable moments.
Correct approach:
// ✅ Encrypted, access-logged, auto-deleted
import { encrypt, decrypt } from './encryption';
await db.crisisEvents.insert({
id: generateId(),
userId: hashUserId(user.id), // Hash, not plain ID
contentHash: hashContent(text), // For deduplication only
encryptedContent: encrypt(text, process.env.CRISIS_DATA_KEY),
detectedAt: Date.now(),
reviewedAt: null,
reviewedBy: null,
autoDeleteAt: Date.now() + (30 * 24 * 60 * 60 * 1000), // 30 days
accessLog: []
});
// Log all access
await logAccess({
eventId: crisisEvent.id,
accessedBy: counselorId,
accessedAt: Date.now(),
reason: 'Review for follow-up',
ipAddress: hashedIp
});
// Auto-delete after retention period
schedule.daily(() => {
db.crisisEvents.deleteMany({
autoDeleteAt: { $lt: Date.now() }
});
});
HIPAA Requirements:
- Encryption at rest and in transit
- Access logging
- Auto-deletion after retention period
- Minimum necessary access
Anti-Pattern 5: No Escalation Protocol
Problem: No clear path from detection to human intervention.
Wrong approach:
// ❌ Flags crisis but no escalation process
if (isCrisis(text)) {
await db.flags.insert({ userId, text, flaggedAt: Date.now() });
// Now what? Who responds?
}
Correct approach:
// ✅ Clear escalation protocol
enum CrisisSeverity {
LOW = 'low', // Distress, no immediate danger
MEDIUM = 'medium', // Self-harm thoughts, no plan
HIGH = 'high', // Suicidal ideation with plan
IMMEDIATE = 'immediate' // Imminent danger
}
async function escalateCrisis(detection: CrisisDetection): Promise<void> {
const severity = assessSeverity(detection);
switch (severity) {
case CrisisSeverity.IMMEDIATE:
// Notify on-call counselor (push notification)
await notifyOnCall({
userId: detection.userId,
severity,
requiresResponse: 'immediate',
text: detection.text
});
// Send SMS to backup on-call if no response in 5 min
setTimeout(async () => {
if (!await hasResponded(detection.id)) {
await notifyBackupOnCall(detection);
}
}, 5 * 60 * 1000);
// Show 988 modal (blocking)
await show988Modal(detection.userId);
break;
case CrisisSeverity.HIGH:
// Notify on-call counselor (email + push)
await notifyOnCall({ severity, requiresResponse: '1 hour' });
// Show crisis resources
await showCrisisResources(detection.userId);
break;
case CrisisSeverity.MEDIUM:
// Add to review queue for next business day
await addToReviewQueue({ priority: 'high' });
// Suggest self-help resources
await suggestResources(detection.userId, 'coping_strategies');
break;
case CrisisSeverity.LOW:
// Add to review queue
await addToReviewQueue({ priority: 'normal' });
break;
}
// Always log for audit
await logEscalation({
detectionId: detection.id,
severity,
actions: ['notified_on_call', 'showed_resources'],
timestamp: Date.now()
});
}
Implementation Patterns
Pattern 1: Multi-Signal Detection
interface CrisisSignal {
type: 'suicidal_ideation' | 'self_harm' | 'substance_relapse' | 'severe_distress';
confidence: number;
evidence: string[];
}
async function detectCrisisSignals(text: string): Promise<CrisisSignal[]> {
const signals: CrisisSignal[] = [];
// Signal 1: NLP model
const nlpResult = await mentalHealthNLP(text);
if (nlpResult.score > 0.75) {
signals.push({
type: nlpResult.label,
confidence: nlpResult.score,
evidence: ['NLP model detection']
});
}
// Signal 2: Keyword matching (backup)
const keywords = detectKeywords(text);
if (keywords.length > 0) {
signals.push({
type: 'suicidal_ideation',
confidence: 0.6,
evidence: keywords
});
}
// Signal 3: Sentiment + context
const sentiment = await sentimentAnalysis(text);
const hasHopelessness = /no (hope|point|reason|future)/i.test(text);
if (sentiment.score < -0.8 && hasHopelessness) {
signals.push({
type: 'severe_distress',
confidence: 0.7,
evidence: ['Extreme negative sentiment + hopelessness language']
});
}
return signals;
}
Pattern 2: Safe Keyword Matching
const CRISIS_KEYWORDS = {
suicidal_ideation: [
/\b(kill|end|take)\s+(my|own)\s+life\b/i,
/\bsuicide\b/i,
/\bdon'?t\s+want\s+to\s+(live|be here|exist)\b/i,
/\bbetter off dead\b/i
],
self_harm: [
/\b(cut|cutting|hurt)\s+(myself|me)\b/i,
/\bself[- ]harm\b/i
],
substance_relapse: [
/\b(relapsed|used|drank)\s+(again|today)\b/i,
/\bback on\s+(drugs|alcohol)\b/i
]
};
function detectKeywords(text: string): string[] {
const matches: string[] = [];
for (const [type, patterns] of Object.entries(CRISIS_KEYWORDS)) {
for (const pattern of patterns) {
if (pattern.test(text)) {
matches.push(type);
}
}
}
return [...new Set(matches)]; // Deduplicate
}
Pattern 3: GPT-4 Few-Shot Detection
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
async function detectWithClaude(text: string): Promise<CrisisDetection> {
const response = await client.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 200,
messages: [{
role: 'user',
content: `You are a mental health crisis detection system. Analyze this text for crisis signals.
Text: "${text}"
Respond in JSON:
{
"is_crisis": boolean,
"severity": "none" | "low" | "medium" | "high" | "immediate",
"signals": ["suicidal_ideation" | "self_harm" | "substance_relapse"],
"confidence": 0.0-1.0,
"reasoning": "brief explanation"
}
Examples:
- "I'm thinking about ending it all" → { "is_crisis": true, "severity": "high", "signals": ["suicidal_ideation"], "confidence": 0.95 }
- "I relapsed today, feeling ashamed" → { "is_crisis": true, "severity": "medium", "signals": ["substance_relapse"], "confidence": 0.9 }
- "Had a tough day at work" → { "is_crisis": false, "severity": "none", "signals": [], "confidence": 0.95 }`
}]
});
const result = JSON.parse(response.content[0].text);
return result;
}
Production Checklist
□ Mental health-specific NLP model (not generic sentiment)
□ Human review required before automated action
□ Crisis resources shown IMMEDIATELY (988, text line)
□ Clear escalation protocol (severity-based)
□ Encrypted storage of crisis content
□ Access logging for all crisis data access
□ Auto-deletion after retention period (30 days)
□ On-call counselor notification system
□ Backup notification if no response
□ False positive tracking (improve model)
□ Regular model evaluation with experts
□ Ethics review board approval
When to Use vs Avoid
| Scenario | Appropriate? |
|---|---|
| Journaling app for recovery | ✅ Yes - monitor for relapses |
| Support group chat | ✅ Yes - flag concerning posts |
| Therapy platform messages | ✅ Yes - assist therapists |
| Public social media | ❌ No - privacy concerns |
| Replace human counselors | ❌ Never - AI assists, doesn't replace |
| Medical diagnosis | ❌ Never - not qualified |
References
/references/mental-health-nlp.md- NLP models for mental health/references/intervention-protocols.md- Evidence-based intervention strategies/references/crisis-resources.md- Hotlines, text lines, and support services
Scripts
scripts/crisis_detector.ts- Real-time crisis detection systemscripts/model_evaluator.ts- Evaluate detection accuracy with test cases
This skill guides: Crisis detection | Mental health NLP | Intervention protocols | Suicide prevention | HIPAA compliance | Ethical AI