Skip to content
Observability

Make the decision explainable

Which model ran is the easy question. What an audit actually asks is which instruction text and which rule caused it. The decision trace holds that — including the rules that matched and lost.

  • A decision digest under 512 bytes in the response header
  • The full trace by requestId
  • Rules that matched and lost are recorded too

< 512Bdecision digest header

An audit trail should say why, not just what

Logging the model and the rule name is easy. What an auditor asks is: what was the instruction text that produced this answer, which rule won, which rules matched and lost, and which signals the decision looked at. The decision trace keeps all four together; a system that keeps two of them is no use in an audit.

What it does

Decision digest header

Every response carries a summary under 512 bytes in the Modelion-Decision header, so your application never has to query the decision separately.

The full trace

Fetched by requestId: signals, the layers evaluated, the winning and losing rules, the obligations enforced.

Cost breakdown

Tokens, latency and cost, sliceable by virtual key, model, prompt version and combo.

Conversation logs

End-to-end conversations are retained and can be reviewed across the team through a shareable link.

Divergence report

Decisions produced in shadow mode are compared against current behaviour; the agreement rate and the diverging requests are listed.

Standard telemetry

OpenTelemetry traces, Grafana dashboards, Tempo and Loki. It flows into your own observability stack.

Observability

The answer to "why did this model produce this answer?"

A decision trace keeps not only the winning rule but the ones that matched and lost. In an audit, that is the actual question.

Requests this month

4.8M

sliceable by virtual key
p99 latency

812 ms

policy + routing + provider
Cache hit rate

31.4%

semantic, org-scoped
Estimated cost

$6,240

token-based, live

Request volume and p99 latency

Last 24 hours

Live
Request volumep99 latency

Model mix

  • gpt-4o-mini42%
  • llama-3.3-70b27%
  • claude-sonnet-419%
  • gpt-4o12%

Decision traces

TimeWinning ruleEffectModelLatencyCost
14:22:07kvkk-pii-route-residentroutegpt-4o-mini812 ms$0.0021
14:22:07default-allow-with-cachecache hit41 ms$0.0000
14:22:06free-tier-constrainconstrainllama-3.3-70b394 ms$0.0003
14:22:05regulatory-data-denydeny6 ms$0.0000
14:22:04long-context-upgraderouteclaude-sonnet-41 284 ms$0.0184

The Modelion-Decision header

Every response carries a decision digest under 512 bytes. The full trace is fetched by requestId.

The demo on this page runs in your browser; no real gateway call is made.

How it works

The recording path is not on the request's critical path; telemetry is written asynchronously.

  1. 1

    The decision is produced

    The evaluation result is collected in memory along with the winning and losing rules.

    PDP output
  2. 2

    The digest is written to the header

    The sub-512-byte digest returned with the response lets the client see the decision immediately.

    Modelion-Decision
  3. 3

    The full trace is stored

    Written asynchronously to the analytical store; queryable, with retention set per organization.

    decision_traces
  4. 4

    Billing and budget are fed

    The usage record is processed consistently with the double-entry ledger; estimate and invoice stay separate.

    ledger · usage

Technical summary

Decision digest
Modelion-Decision response header, < 512 bytes
Full trace
Fetched by requestId
Recorded fields
Signals · layers · winning rule · losing rules · obligations
Cost breakdown
Virtual key · model · prompt version · combo
Telemetry
OpenTelemetry · Grafana · Tempo · Loki
Analytical store
Columnar, queryable
Conversation logs
Shareable-link support
Divergence report
Agreement rate and diverging requests in shadow mode

What it costs to keep the losing rules

Logging only the winning rule takes less space and less time. But in an audit, "why was this request not refused" comes up at least as often as "why was it refused", and the answer lives only in the list of rules that matched and lost. So the trace keeps the decision along with the alternatives that came close to being it.

The rest of the control plane

This capability works on its own, but most of its value comes from sharing one decision contract with the others.

See it on your own traffic

In a 30-minute session we run your own rule set in shadow mode.