User guide

AI Across the Platform — Operator Guide

Looking for what it does rather than how to use it? Read the AI across the platform overview .

This guide covers the credit model, the model routing policy, the guard model, and how to operate it.


Concepts

ConceptWhat it means
OperationA named AI action (categorization, sol_chat, invoice_extraction, …) with a credit price.
Credit gateThe pre-check that charges and, if over limit, refuses — before the model runs.
PayerThe account a request is billed to: the acting account, or an opted-in managed client’s.
Feature groupThe org-facing bundle a credit grant is expressed in (TICKET_AI, INVOICE_AI, SOL_ASSISTANT, KNOWLEDGE_AI, CHANGE_AI).
Routing matrixThe single table mapping each operation to model, token budget, reasoning depth and caching.
Model usageThe per-request dollar cost record: model, tokens, cache reads/writes.

The credit model

Prices are declared once, in AI_OPERATION_CREDITS:

OperationCredits
categorization1
sol_tool_execution1
summaries2
rag3
sol_chat3
change_analysis4
invoice_extraction5
sol_vision5
sol_tool_use5
brand_palette5

The gate runs as the first statement of a route, before validation or business logic, and refuses with:

CodeStatusMeaning
AI_CREDIT_LIMIT_EXCEEDED402The payer is out of credits for the period.
AI_ACCOUNT_CONTEXT_REQUIRED402No billable account. Only platform admins may run without one.
AI_FEATURE_NOT_ON_PLAN403The plan lacks the capability; carries an upgrade offer.
AI_METERING_UNAVAILABLE503Metering itself is down — refused rather than run free.

The gate fails closed. An unresolvable plan degrades to a bounded free-tier floor, never to unlimited.

Who pays

resolveAiPayer picks the bucket: the acting account by default, or an opted-in managed client’s account when an MSP acts on that client.


Model routing

Every operation declares its configuration in one place rather than at the call site:

Reasoning is off for routine operations, so an operation’s token budget is spent on its answer rather than on thinking. The assistant’s turns are the exception: they enable adaptive reasoning with a summary shown in the stream.

Two constraints the router enforces for you:

  • Haiku does not accept the effort parameter, so it is never sent there.
  • Disabling reasoning cannot be combined with the top two effort levels on the Opus 5 line — the pair is rejected by the API — so effort is clamped instead.

Adding a model means adding a rate row to MODEL_COST_RATES; without one, requests are costed at the tier’s prefix-match fallback.


Guards

Every router carries a role floor or documents why it is deliberately open. Remember the hierarchy:

platform administrator > MSP administrator > MSP technician > organization administrator > power user > CUSTOMER

MSP technician ranks above organization administrator, so a MSP technician floor removes a feature from the org portal entirely.

Deliberately unfloored, with the reason recorded in each file:

Rank is only half of it. A floor answers “what rank”, never “whose data”. Routes that take an entity id from the path also verify the caller may reach that entity, and return 404 rather than 403 so existence is not disclosed.


Degraded behaviour

The house rule is that a degraded AI path never invents a figure.

  • An outage returns 200 with analysis fields null, fallback: true, and a human-readable fallbackReason. A score that was not computed is null, not a plausible default — a defaulted “LOW” risk would turn an outage into a fleet-wide silent downgrade.
  • These are the quick-check, quick-assess and quick-assessment family.
  • Model refusals and truncations raise distinct errors rather than surfacing as “failed to parse AI response”.

Troubleshooting

SymptomCause
Everything AI returns 503 on startupA required key is unset. In production the service refuses to start and says which.
One tenant sees 402 everywhereIts allowance is exhausted for the period. Check usage/summary.
An MSP gets 403 acting on a clientThe client has not granted access to the MSP’s credit pool for that feature group.
Cost summary looks lower than expectedCheck the operation is going through the shared client; a service constructing its own model client must record usage explicitly.
A route 404s for a record the user can seeThe caller does not service that record’s account.

Limits and known behaviour

  • Batch processing is not mounted. The router exists but is disabled pending an ownership record, credit gating and cost attribution.
  • A number of client hooks exist without a UI caller; they are reachable over the API but not from the product.

Questions this guide did not answer?

Ask us. You will get a reply from someone who uses the product every day.

Book a demo Contact us

A 30-minute walkthrough against your own workflow. No slides.