Transform every conversation turn into calibrated signals — so teams can steer sessions in-flight, tune operations, and manage production risk.
Not tooling gaps — missing primitives. A conversation is a per-turn time series; reading it takes a calibrated inference head, session state, and an in-request decision path. Most generation APIs don’t expose these as first-class outputs — they’re built for producing turns, not measuring them.
Generation and measurement share one forward pass. A decoder tuned for fluency emits tokens, not calibrated signals — its logits were never trained as session measurements, leaving little to threshold, trend, or export downstream.
Most sentiment tooling scores one message at a time. A session is a trajectory — attention decays, frustration compounds — and without session state, per-message scores struggle to capture the slopes that matter.
Batch dashboards typically land well after the conversation ends — usually without a same-request verdict, a trace id, or deterministic replay. Useful for reading trends; harder to act on, tune, or audit in the loop.
Viora runs a fine-tuned open-weight language model paired with a dedicated classifier head, GPU-hosted for low-latency scoring. Text and interaction telemetry are fused on GPU in real time, so perception isn't limited to what's typed. The perception layer is decoupled from the conversational layer, so it stays deterministic, auditable, and fast enough to act inside a live conversation.
Latency and throughput figures are pre-launch design targets, not independently benchmarked results.
Signal inference runs on a small purpose-trained model, not a prompt wrapped around a general-purpose LLM. That means fixed weights, a fixed label set, and calibrated per-label probabilities — so a threshold moves along a measured precision–recall curve, not a vibe. Here is the target spec and what it emits.
Model card fields describe the reporting template design partners receive each release; figures are populated from the evaluation set at that release, not asserted here.
General-purpose model APIs optimise for generation, and anything they report about a conversation is a by-product of the same weights doing the talking. Viora runs a second, smaller inference path with its own weights, its own state and its own operating point.
PII spans are detected and tokenised before GPU inference, then redacted again before storage or export — no shared third-party inference, no training on conversation data.
Verdicts come from an ensemble — LLM contextual understanding, a dedicated classifier head, and a rules engine — instead of one model's single best guess.
Labels come from a dual-rated, expert-adjudicated corpus with arbitration on disagreement — not statistical pattern-matching over scraped text.
Interaction telemetry — response latency, turn cadence, tool-call traces — is fused with text on GPU, catching signals a text-only pipeline would miss.
Viora sits between your app and your model: one call per turn, a full signal profile back inside the same request, and no change to how your model generates. Run it inline to act on the profile, or in shadow mode to observe traffic without touching the loop.
01from viora import PerceptionEngine
02
03engine = PerceptionEngine(api_key=VIORA_KEY, mode="inline") # "shadow" = observe only
04
05def on_user_turn(session_id, text, telemetry=None):
06 profile = engine.infer(
07 session_id=session_id,
08 text=text,
09 telemetry=telemetry, # optional; fused when present
10 )
11
12 if profile.action.type == "escalate":
13 return handoff(profile.action.route, profile.trace_id)
14
15 reply = llm.chat(text) # your model, untouched
16 return engine.postcheck(session_id, reply) # completion + tool hops 01{
02 "session_id": "s_9f3c1a",
03 "turn": 14,
04 "context_window": {
05 "turns": "14 / 20",
06 "tokens": "3847 / 8192",
07 "modalities": ["text", "telemetry"]
08 },
09 "signals": {
10 "attention": {"p":0.88,"ci":[0.83,0.92],"slope":-0.04},
11 "resolution_confidence": {"p":0.79,"ci":[0.71,0.85],"slope":+0.09},
12 "frustration": {"p":0.41,"ci":[0.35,0.48],"slope":+0.12},
13 "escalation_likelihood": {"p":0.26,"ci":[0.19,0.31],"slope":+0.03}
14 },
15 "state_update": { "prior": "turn_13",
16 "evidence": ["lexical","semantic","timing"] },
17 "action": {
18 "type": "steer", "route": "resolution_assist",
19 "trigger": "frustration.slope > 0.10", "confidence": 0.83
20 },
21 "policy": "cx.v3:tau=0.65", "model": "viora-signal-1.4b",
22 "latency_ms": 41, "trace_id": "01JBQ7B4RF"
23} Stage timings are design targets for a single screened turn, not independently benchmarked results.
The API surface is identical across deployments. What changes is session length, traffic shape and which taxonomy tiers you wire to a blocking action.
Long-lived sessions, high turn counts, tool calls in the loop. Frustration and resolution signals route straight into supervisor queues and review tooling.
Multi-tenant, SSO-bound identities, retention limits
High QPS, short sessions, batch plus streaming
Design-partner access to the inference layer: pinned model build, per-tenant thresholds, and direct access to the engineers running it.
No spam. We'll reach out when your spot is ready.