Skip to main content

Ocular Beta

Behavioral risk assessment for human–AI conversations. Returns a verdict, eight user-risk axes, four AI-concern axes, fiction strength, authenticity, and optional per-turn trajectory.

Beta endpoint. Response shape may evolve. Rate-limited under the standard /v1/* limiter. See dashboard.nope.net/ocular for per-call analytics.

What Ocular is

Ocular is a probe-based behavioral classifier. Instead of producing a single severity rating like Evaluate, it returns axis-level signals so you can route differently for, say, harm to others vs self-neglect, or for AI-side concerns like manipulation or safeguarding failure.

Ocular is fiction-aware. A roleplay scene that mentions self-harm without genuine distress will score high fiction and the verdict will reflect that. Use it on the full conversation (assistant + user turns) rather than single messages — the trajectory and AI-concern signals require both sides.

Quickstart

curl -X POST https://api.nope.net/v1/ocular \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user", "content": "I feel really hopeless lately"},
      {"role": "assistant", "content": "I hear you. That sounds really painful."}
    ]
  }'

Response

verdict is the headline decision surface (clear / watch / danger). For finer routing, key off risks.<axis>.level and ai_concerns.<axis>.level.

{
  "verdict": "watch",
  "subject": "self",
  "imminence": { "level": "subacute", "score": 0.42 },
  "fiction": 0.08,
  "authenticity": 0.81,
  "risks": {
    "suicide":          { "level": "moderate", "score": 0.55 },
    "self_harm":        { "level": "low",      "score": 0.21 },
    "harm_to_others":   { "level": "minimal",  "score": 0.02 },
    "abuse":            { "level": "minimal",  "score": 0.01 },
    "sexual_violence":  { "level": "minimal",  "score": 0.00 },
    "exploitation":     { "level": "minimal",  "score": 0.00 },
    "stalking":         { "level": "minimal",  "score": 0.00 },
    "self_neglect":     { "level": "low",      "score": 0.18 }
  },
  "ai_concerns": {
    "harm_provision":       { "level": "minimal", "score": 0.03 },
    "emotional_failure":    { "level": "minimal", "score": 0.07 },
    "manipulation":         { "level": "minimal", "score": 0.01 },
    "safeguarding_failure": { "level": "minimal", "score": 0.05 }
  },
  "effort": 1,
  "stability": null,
  "meta": {
    "version": "H_c49_1_hybridseeds_v1_vllm",
    "inference_ms": 175
  }
}

Fields

FieldDescription
verdictclear | watch | danger — the authoritative decision. Key off this field for routing logic.
subjectself (speaker themselves) | other (third party) | unknown.
imminence{ level, score } — how soon (not_applicable, chronic, subacute, urgent, emergency).
fiction0..1 — how strongly the message reads as fiction / roleplay. High fiction modulates verdict thresholds upward.
authenticity0..1 — how strongly the message reads as genuine first-person disclosure.
risksEight user-risk axes, each { level, score }: suicide, self_harm, harm_to_others, abuse, sexual_violence, exploitation, stalking, self_neglect.
ai_concernsFour AI-concern axes, each { level, score }: harm_provision, emotional_failure, manipulation, safeguarding_failure.
effortInference effort tier (1–3). Higher tiers run perturbation analysis for stability scoring.
stabilityPer-axis robustness scores when effort > 1. null at default effort.
trajectoryPer-turn array [{role, turn, verdict}] when per_turn=true is requested. Capped at 200 turns.
meta{ version, inference_ms }. The model version is opaque — pin or alert on changes if your scoring is calibrated to a specific release.

Level values

Both risks and ai_concerns levels are drawn from a fixed ladder: minimal, low, moderate, high, critical. Calibrate your routing thresholds against the level value rather than raw score — the level mapping has been tuned against clinical and red-team fixtures.

Identity fields (optional)

Three opaque string fields let you tie calls back to your own analytics in the dashboard:

  • user_id — your identifier for the end-user
  • session_id — your identifier for the conversation
  • agent_id — your identifier for the AI agent / persona

Each is optional, 1–256 characters. We do not parse, hash, or interpret these values — they're stored alongside the call metadata so the dashboard can show per-user and per-agent breakdowns.

Privacy: identity values stay on the NOPE side. They are not forwarded to the underlying classifier model and are never shared between customers. To rotate, change the identifier — old rows retain the prior value.

Pricing

$0.0001 per call. Deducted from prepaid balance like every other /v1/* endpoint. The X-Cost and X-Balance response headers report the cost and remaining balance.

What Ocular is not

  • Not predictive or diagnostic. Ocular is a measurement layer, not a clinical tool. Verdicts indicate signal, not prognosis.
  • Not a moderation pipeline. Use Ocular signals to decide which conversations deserve human attention, not as automated takedowns.
  • Not a replacement for Evaluate. Evaluate returns clinically-grounded severity + features (C-SSRS, HCR-20, DASH). Ocular returns axis signals from a behavioral embedding classifier. They're complementary.

Next steps