https://gateway.omnia-voice.com/v1. Request bodies on this surface
are camelCase (promptCount, rewardBudgetUsd); responses are snake_case
like the rest of the management API.
Start a run
201 with {"trigger_run_id": "..."}; the run itself appears at the
top of GET /v1/grpo/runs immediately.
The reward is validated before anything spends: it must reference a
calibrated, non-drift-flagged judge, and an unvalidated judge is refused
with 400. A reward you can’t trust trains a model you can’t trust, so there
is no override. mode: "compositional" combines several judges
(criterionIds) and optional deterministic assertions into one reward.
Budgets are hard, server-side, and ledger-true:
rewardBudgetUsdcaps judge/reward spend. The reward server refuses the run’s next scoring call once the ledger crosses the ceiling; the run endsOVERBUDGET. The trainer never self-reports spend.gpuHourBudgetcaps wall clock on the training side.
List runs
{"runs": [...], "candidates_waiting": n, "auto_provision_available": bool},
newest first (max 50). candidates_waiting is the depth of the candidate
queue, the strongest signal for when a run is worth its cost.
Each run carries status (ACTIVE, COMPLETED, OVERBUDGET, STOPPED, or
FAILED: the trainer gave up, as opposed to STOPPED, an external
termination), plus three separate ledger-true meters: spent_usd (reward,
counted against the budget), gpu_spent_usd, and env_spent_usd (sandbox
execution). While a platform GPU is attached, gpu_rate_usd_per_hour is the
live burn rate.
Terminal runs include an outcome when the training box produced its
artifact: steps, the reward trend (first_half_mean_reward vs
second_half_mean_reward), stopped_by_tripwire (the reward-hacking
tripwire), and a bakeoff card with the held-out verdict, delta, and
delta_ci95. A missing outcome on a FAILED run is honest, not a bug.
Get, stop
ACTIVE runs can be stopped (anything else is 404).
Download the trained adapter
{"files": [{"name", "size_bytes", "url", "expires_at"}], "partial": ...}).
partial: true means the run didn’t complete cleanly and the files are a
checkpoint, not the finished adapter. An empty list comes with an
empty_reason; links expire, so re-request fresh ones. This is the same
own-your-weights story as SFT.
Agent tools: the consent surface
Agentic runs may only call tools you’ve declared:DELETE /v1/env/tools/{id} is
consent withdrawal. The list response also carries
egress_verification_secret, an HMAC key your endpoint can use to verify
that a call really came from a training run (signature over
"<timestamp>.<raw body>" in the X-Omnia-Signature header).
RAFT rounds, read-only
GET /v1/raft/rounds lists the offline self-training rounds that feed the
candidate queue: per round, the judge used, winners kept, give-ups, the SFT
job a completed round produced (produced_job_id), and ledger-true spend
against its budget. Rounds start from the dashboard today; the API surface is
observability parity.
Run creation is rate-limited per workspace (default 20/min) as an abuse
guard; a
429 carries Retry-After. All endpoints here require an
owner/admin key, reads included.