Composable safety primitives
Tuteliq isn’t a set of independent detectors — it’s a platform where detectors enrich each other. Thedetect_vulnerability_exploitation endpoint returns two fields, cross_endpoint_modifier and vulnerability_profile, that agents use to amplify risk verdicts from sibling detectors and route to vulnerability-appropriate intervention workflows.
This page explains the primitive and shows how to compose with it.
Why this matters
Most safety APIs return per-call classifications: is this content X? That’s enough if every harm is independent. But real harm rarely is. A grooming pattern targeting an emotionally vulnerable minor is structurally different from the same pattern targeting an emotionally stable adult — and an effective safety system has to weight signals by who the target is, not just what the content says. Tuteliq exposes that weighting as a primitive your agents compose, rather than burying it inside opaque score adjustments.The fields
cross_endpoint_modifier
A numeric multiplier (typical range 1.0–2.0) you apply to another endpoint’s risk_score when both endpoints detect a pattern in the same content.
A modifier of 1.6 means: “the vulnerability signals here amplify any concurrent grooming, scam, or coercion signal by 60%.”
vulnerability_profile
A four-dimensional decomposition of the target’s vulnerability, each scored 0.0–1.0:
| Dimension | Captures |
|---|---|
emotional_vulnerability | Loneliness, distress, recent loss, depressive language |
cognitive_vulnerability | Confusion, impairment, age-related capacity |
situational_vulnerability | Financial stress, isolation, dependency |
social_vulnerability | Minimal support network, marginalization |
emotional_vulnerability plus a romance_scam signal calls for a slower, gentler intervention; a high situational_vulnerability plus a financial_grooming signal might trigger an immediate transaction hold.
Example response
Composing with another detector
The intended pattern is: rundetect_vulnerability_exploitation in parallel with the harm-specific detector for the same content, then combine.
When to use this primitive
- You’re building an agent that takes graduated actions based on combined risk, not single-detector verdicts.
- You’re moderating populations where target vulnerability is highly variable — mixed-age platforms, fintech, dating apps, AI companion products.
- You want intervention workflows that adapt to the user, not just the content.
When not to use it
- You’re running a fixed-threshold per-message classifier and only need a single binary verdict —
recommended_actionfrom each endpoint is enough. - You’re moderating content at the corpus level (e.g. AI training data) rather than per-user signals — vulnerability doesn’t apply.
Notes on safe composition
- Cap the compound risk at 1.0 (
Math.min(scam.risk_score * modifier, 1.0)) so amplification never produces an out-of-band value downstream consumers don’t expect. - The modifier is only meaningful when both endpoints actually
detect— ifvuln.detected === false, treat the modifier as1.0. - Cache the profile per-conversation, not per-message — vulnerability is a property of the user, not the message. Refresh periodically or on user-context changes (e.g. a major life event surfaced in subsequent messages).
- Don’t expose the raw modifier to end users. It’s an integrator-level signal designed for routing logic, not for display. Surface the resulting route and the human-readable rationale instead.
Related
detect_vulnerability_exploitation— full endpoint referenceanalyse_multi— batch multi-endpoint analysis (applies modifier internally when both fire)- Sentinel reference agent — end-to-end example of an ADK agent composing primitives
- Building intervention workflows — UX patterns for vulnerability-aware moderation