Concepts
Proactive Triggers
A raw LLM is reactive — it only speaks when spoken to. Humane's Proactive Engine watches behavioral state and reaches out when thresholds are crossed. Mood crashes, silent users, trust milestones — your product can act without the user initiating.
Built-in triggers
Five ship with the engine:
| Trigger | Fires when | Default cooldown |
|---|---|---|
| proactive.mood_drop | mood < 0.3 | 60m |
| proactive.energy_low | energy < 0.25 | 120m |
| proactive.trust_milestone | trust > 0.7 & interactions > 10 | 1440m |
| proactive.user_inactive | last_seen > 48h | 1440m |
| proactive.engagement_drop | compound (interactions, familiarity, last_seen, mood) | 720m |
What happens when a trigger fires
- A webhook of type
proactive.{trigger_name}is dispatched to your endpoints (HMAC-signed). - If you have a Slack / Discord integration, the rich message lands in your channel with an "Open patient session" deep-link.
- A row is written to
proactive_triggerswith the timestamp — powers cooldowns, survives restarts. - The event is returned inline on the SDK response as
response.proactive.
Event payload
json
{
"event": "proactive.mood_drop",
"timestamp": "2026-04-17T14:22:10Z",
"data": {
"trigger": "mood_drop",
"description": "User mood dropped below critical threshold",
"suggested_action": "Send empathetic check-in message",
"end_user_id": "patient_42",
"user_state": {
"mood": 0.18,
"energy": 0.42,
"trust": 0.55,
"interaction_count": 7,
"last_seen": "2026-04-17T14:19:40Z"
},
"timestamp": "2026-04-17T14:22:10Z"
}
}Cooldowns (persisted)
Each (end_user, trigger) pair has an explicit cooldown window. The tableproactive_triggers keyed by these two columns storeslast_fired_at. Until the cooldown elapses, the trigger won't re-fire for that user — even across backend restarts or multiple worker processes.
Policy-driven triggers are first-class
Any policy with a
fire_event action becomes a trigger. The cooldown is configured per-rule in the YAML. See Policy Engine .Delivery channels
Any active webhook subscribed to the event type receives it. That includes:
- Your custom HTTPS endpoint (via
/api/webhooks) - Slack / Discord Incoming Webhooks (via
/api/integrations) - The tenant's Signals page (live SSE stream)