Reference / How it works · look things up, do not read through
How it works.
What a policy is, what one call sends and returns, what a session costs, and what has to match on your robot. Each section opens with its one figure; the full text is one click further.
The model behind every agi.diy call, in the words the product uses. Each diagram is generated at build time from the deployment files, the Worker constants and one recorded session (web/scripts/concepts.mjs); the numbers are labelled with where they came from.
Everything below is explained in its own section; this is the scan. Every row is generated from the same source its section quotes, so this table cannot disagree with the page.
This table is also data: /concepts/numbers.json carries the same ten rows with the section that explains each, generated from the same sources.
/v1/models returns action_horizon, fps, cameras, slots_free, slots_total and units for everything served right now — except that the custom row carries no horizon (a custom checkpoint's comes from the checkpoint), and a model whose slots are all busy still reports its descriptor, because the catalog fills each field from the first runner that has one, newest generation first, instead of from whichever slot happened to be enumerated first; /v1/stats returns tokens, calls, models_online and last_call_at; the glossary returns this vocabulary as data, including semantics_label_by_surface — which surface reports which units label, and which one is right.
A policy is a trained model that turns what a robot sees and feels into what it should do next. agi.diy serves policies over an API: you send an observation, it returns actions. Your robot, your control loop and your safety checks stay on your side.
The two default-tier policies. Drawn from runtime/deployments/*.yaml (cameras, fps, training note) · runtime/CAPACITY.md (horizon, checkpoint size, policy time)
The robot ↔ cloud loop. Drawn from runtime/deployments/*.yaml (cameras, horizon, fps) · act round trip: recorded probe ses_fxA3qHVEJekI5JH3TleZUf
One call is one observation in and one chunk out. The robot starts playing the chunk while it already sends the next observation, so the network round trip hides inside the motion the previous chunk bought. Two transports carry the same call:
Session lifecycle. Drawn from worker/src/runners.ts (states, end reasons) · worker/src/util.ts (ttl, connect_by)
POST /v1/sessionsleases one warm slot — a policy process already loaded on the GPU — and returns a session: its id, the deployment name, the endpoint, the features the model expects, the horizon and the fps. Nobody else can use that slot until the session ends.
GET /v1/models (public, no key) reports each model's state and its free slots, summed across whichever runners serve it; GET /v1/health lists the runners and their roles. The fleet is four runners; one broker on the demo Jetson keeps 2 ACT slots and 3 SmolVLA slots warm, and the live totals come from the same payload.
A slot serves one client at a time, so two arms means two sessions and the pool is the ceiling. Measured on 2026-10-25: 2 agi-wfm/so101 slots, 3 agi-act/so101, 4 agi-smolvla/so101, 2 stock-act/so101, 3 stock-smolvla/so101 and 2 for custom checkpoints, across 4 runners (Availability) — a snapshot, since the fleet grows; curl -s https://api.agi.diy/v1/models is the live answer. …
One returned chunk. Drawn from call 1 of recorded session ses_6VvrpGKfCWlUDyAgNYgGfD (smolvla/so101, 2026-10-25T00:05:10Z) — simulated cameras, live policy output
A chunk is the sequence of actions one call returns: n rows × 6 joints, float32. Each row is one action — six target joint values for one tick of the control loop. The horizon is n: 100 for ACT, 50 for SmolVLA, fixed when the session is leased.
One returned action is one token, and one token costs $0.0001. A call is billed for every row in its chunk, whether or not your robot plays all of them:
Both live checkpoints were trained on LeRobot's normalized motor positions (use_degrees=false, the default when their datasets were recorded): the five arm joints run from −100 to 100 across each joint's calibrated range, the gripper from 0 to 100. The values are not degrees, and the semantics label is not the way to find that out — units is. …
Normalized units. Drawn from web/lib/sim/so101-units.ts · marks: first observation of ses_6VvrpGKfCWlUDyAgNYgGfD
Where the time goes in one call. Drawn from recorded probe ses_fxA3qHVEJekI5JH3TleZUf (2026-10-25T05:36:27Z) — trace server_ms.policy + rtt_ms, client ms from the agi CLI
The robot plays chunks from a local queue, so a network drop does not stop the arm at once — and it does not let it run on forever either. The figure shows the worst case; the four steps under it are the same paragraph /docs carries, generated from one source (web/lib/linkdrop.mjs).
When the link drops mid-run. Drawn from sdk/python/agi/rollout.py (starvation grace, timeouts) · LeRobot @d3793b7e remote engine (refill at the SDK's REFILL_S left, hold, starvation fault) + rollout teardown (move to start pose, disconnect torque) · horizon / fps from the deployment files
Every session is recorded by default as a trace: each observation the policy saw (joint state, task, camera frames) and each chunk it returned, with timing.
What a trace holds. Drawn from recorded probe ses_fxA3qHVEJekI5JH3TleZUf — GET /v1/sessions/:id/trace event times, sizes and timings (docs/TRACE.md)
Nothing in the API answers that. A session tells you the policy answered — a chunk came back, in this many milliseconds, for this many tokens — and how the run ended (end_reason, see Sessions). There is no success, reward or score field in a session, a trace event or any other response: whether the orange ended up on the plate is your measurement, in your workspace, against your task.
What a run answers, and what you have to measure. Drawn from recorded probe ses_fxA3qHVEJekI5JH3TleZUf (2026-10-25T05:36:27Z) — calls, time on the runner, tokens and end reason from its trace · replay rules from docs/CONTRACT.md (409 incompatible_features) and the deployment cameras
/play is an SO-101 simulated in your browser — MuJoCo physics and rendered cameras — driven by real calls to the live policies. Simulated inputs, live policy output. Two views exist there: the camera images sent to the policy are rendered from the simulation's geometry, and the photographic room behind the arm is a human view only — a policy never sees it. …
Simulated inputs, live policy output. Drawn from web/lib/sim (MuJoCo, rendered policy cameras, splat backdrop) · the live service for everything else
The product's 44 words — chunk, token, lease, slot, held-out error, artefact, spread and the rest — are defined once, together, on the glossary. Every link on this site that names a term points straight at its row there, and the same list is data at /reference/concepts/glossary.json.