Concepts

Transactions

Why the unit of account is a business job, not a tool call.

Cost per call is a number every tool reports and nobody can act on. “You made 190,000 model calls” tells a finance team nothing. “Resolving one support ticket costs $0.41” tells them everything — whether it is worth doing, whether it got worse this month, and what to compare it against.

So the unit of account in Navige is the transaction: one business job, made of however many model calls, tool calls and retries it took.

Opening one

Correlation is opt-in and additive. Send nothing and everything behaves exactly as it would have; send one of these and the calls group themselves.

  • x-navige-workflow — the stable name for this kind of job, such as support.ticket.triage. Baselines and per-job costs key on this.
  • x-navige-transaction — your own id for this specific run, used to make retries idempotent rather than counting them twice.
  • traceparent — a standard W3C trace header. If your stack already emits one, you get correlation with no Navige-specific configuration at all.
bash
curl https://api.navige.ai/proxy/openai/v1/chat/completions \
  -H "x-navige-key: $NAVIGE_KEY" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "x-navige-workflow: support.ticket.triage" \
  -H "x-navige-transaction: ticket-88412" \
  -d @request.json

Both are bounded at 200 characters and rejected rather than truncated if longer — two different 5,000 character names that share a prefix would otherwise register as one job.

Status and outcome are different questions

This trips people up, so it is worth being explicit.

  • Status is lifecycle: is this job open, closed, abandoned. Navige knows this on its own.
  • Outcome is judgement: did the job actually achieve what it was for. Navige cannot know this, and does not guess.

An unjudged transaction has no outcome — null, which is not the same as failed. Tell us how it went and the cost-per-successful-job figures become real:

bash
curl -X POST https://api.navige.ai/v1/transactions/$TX_ID/outcome \
  -H "x-navige-key: $NAVIGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"succeeded": true}'
Why we will not infer it
A job whose last model call returned HTTP 200 can still have produced a wrong answer, refunded the wrong customer, or closed a ticket that then reopened. Treating 200 as success would make every success rate in the product optimistic by an unknown amount.

What you get from it

  • Cost per job, and the spread across runs of the same job.
  • The most expensive workflow you run, which is rarely the one people guess.
  • Cost per successful job, once outcomes are reported.
  • A baseline, so a change that doubles the cost of a job shows up as a change rather than noise.
Something here wrong or missing? Tell us — a person reads it.