Command Reference
Endpoints
List, inspect, and update endpoints and their routing, and see how they changed over time.
An endpoint is the public model identifier callers use. One or more deployments serve it. The endpoint owns the model, the serverless pricing, the request-routing settings, the aliases, and the allowlist of extra teams, so these change on the endpoint and apply to every deployment serving it. A deployment's endpointId (from inf deployment get) names its endpoint.
Alias: inf endpoints
inf endpoint get
Get an endpoint's settings and allowed teams.
inf endpoint get --id <endpoint-id>inf endpoint update
Update an endpoint's settings. Omitted flags leave a setting unchanged; pass null to restore a nullable setting's inherited default.
# Switch the model every deployment on the endpoint serves
inf endpoint update --id <endpoint-id> --model-id <model-id>
# Disable queueing and cap the whole request at 10 minutes (super-admin)
inf endpoint update --id <endpoint-id> \
--queue-timeout-ms -1 \
--max-queue-size -1 \
--total-req-timeout-ms 600000Changing the model rolls every deployment on the endpoint. It resets each deployment's model-config pin, parallelism, and shard overrides.
| Flag | Access | Description |
|---|---|---|
--id <id> | All | Endpoint to update (required) |
--team-id <id> | All | Team that owns the endpoint (defaults to the active team) |
--model-id <id> | All | Model every deployment on the endpoint serves |
--public-model-identifier <id> | Super-admin | Rename the identifier callers use |
--allowed-team-ids <ids> | Super-admin | Replace the extra teams allowed to call the endpoint |
--is-serverless <bool> | Super-admin | Expose as a public serverless endpoint; going dedicated makes every active deployment's GPU hours billable |
--serverless-cost-per-million-in <cents> | Super-admin | Input price, cents per 1M tokens |
--serverless-cost-per-million-cached-in <cents> | Super-admin | Cached-input price, cents per 1M tokens; empty or 0 bills at the input price |
--serverless-cost-per-million-out <cents> | Super-admin | Output price, cents per 1M tokens |
--queue-timeout-ms <n> | Super-admin | Max wait for a free slot before a 429; -1 disables queueing |
--max-queue-size <n> | Super-admin | Waiting requests before a 429; -1 disables queueing |
--total-req-timeout-ms <n> | Super-admin | Wall-clock cap on the whole stream (1–3600000); every shutdown drain is derived from it |
--time-to-next-token-timeout-ms <n> | Super-admin | Max gap between stream events |
--chunk-buffer-timeout-ms <n> | Super-admin | Engine wait for an out-of-order chunk (1000–60000) |
--missing-chunk-cache-ttl-ms <n> | Super-admin | Worker chunk retention after a generation ends (5000–300000) |
--replay-buffer-max-chunks <n> | Super-admin | Recent chunks the worker can replay (50–5000) |
--enable-sticky-routing <bool> | Super-admin | Route repeat conversations to the instance holding their KV cache |
--enable-sticky-block-keys <bool> | Super-admin | Also key sticky routing on 64 KiB blocks of the last message, so a conversation that grows one long message keeps its instance (default false) |
--enable-sticky-session-balance <bool> | Super-admin | When a request matches only by its client session id and its conversation was never seen before, keep it on the session's instance only while that instance is about as free as the most-free instance; otherwise place it by load (default false) |
--enable-routing-overflow <bool> | Super-admin | When every deployment a request's routing rules allow is full, try the endpoint's other running deployments once. Each must have a context-length or max-model-len flag no smaller than the allowed deployments' flags or the counted prompt. Parked deployments (rule false) are skipped (default false) |
--enforce-overflow-rules <bool> | Super-admin | Apply each deployment's overflow rule (inf endpoint routing set --overflow-rule). Off: the engine only counts overflow placements a rule would reject. On: a rejected request never overflows there, and with no free slot it gets an immediate 429 with Retry-After: 1 instead of the queue (default false) |
--sticky-routing-precedence <prefix_first|session_first> | Super-admin | Which instance wins when the conversation prefix and the client session id point at different ones (default prefix_first) |
--sticky-routing-spill-free-pct <n> | Super-admin | Send sticky traffic to other instances when its instance has fewer free slots than this percent (1–99); the hinted instance stays the last resort. New endpoints default to 30; null never spills |
--enable-incremental-usage-billing <bool> | Super-admin | Bill cancelled generations for tokens generated before the disconnect |
--tokenizer-kind <kind> | Super-admin | How the engine counts prompt tokens: Estimate (default), HuggingFaceTokenizers, or Toks (the same tokenizer.json counted by toks, faster) |
--tokenizer-options <json> | Super-admin | Options for the kind, or null for defaults. Estimate: chars_per_token, per_message_overhead. HuggingFaceTokenizers and Toks: repo (required), revision (pin a commit SHA), hf_token for gated repos, per_message_overhead |
Reads and endpoint events return a stored hf_token as ********. Sending ******** back in --tokenizer-options keeps the stored token; leaving hf_token out removes it.
inf endpoint update --id <endpoint-id> \
--tokenizer-kind HuggingFaceTokenizers \
--tokenizer-options '{"repo":"Qwen/Qwen3-8B","revision":"<commit-sha>"}'inf endpoint list
List the team's endpoints. Each row shows the endpoint's deployments with their rank and rule, the default deployment, and how many deployments are running. The list is built from deployments, so an endpoint whose deployments are all archived does not appear.
inf endpoint list
inf endpoint list --project <project-id> --stopped| Flag | Description |
|---|---|
--team <id> | Team ID (defaults to the active team) |
--project <id> | Only endpoints in this project |
--stopped | Include endpoints whose deployments are all stopped |
--model <text> | Only endpoints whose model identifier or name contains this text (case-insensitive) |
inf endpoint describe
Show the endpoint's settings and resolved list price, its routingVersion, then every deployment in routing order (p<priority>, * marks the default). Each deployment row shows its rule as CEL, engine and config version, flag overrides, GPUs, instance counts, and live routing load. Pricing rules, what each team scope pays now, and aliases need super-admin.
inf endpoint describe <endpoint-id>
inf --json endpoint describe <endpoint-id> | jq '.deployments[] | {priority, name, ruleText}'
inf endpoint describe <endpoint-id> --status Active,Degraded| Flag | Description |
|---|---|
--team <id> | Team ID (defaults to the active team) |
--status <statuses> | Only deployments in these statuses: Pending, Active, Degraded, Updating, Stopped, Unschedulable |
inf endpoint instances
Show every deployment on the endpoint and its instances, grouped by the exact engine config frozen onto each instance when it was created. For each group the command shows:
- the config id and version, engine, parallelism, and L3 KV backend
- the launch command the worker builds, with flags in the order the worker passes them. Values that only the pod knows (the weights snapshot path, the served model name, the Mooncake client config) are
<placeholders>marked# worker. - the env vars (secrets masked)
- each instance's ID, status,
configHash, and whether it is on the deployment's desired config
The last section diffs each deployment's desired config, and each instance group, against the default deployment's desired config: flags and env added, removed, or changed. By default the command skips Stopped deployments and shows only live instances. Archived deployments never appear.
inf endpoint instances <endpoint-id>
inf endpoint instances <endpoint-id> --stopped --terminated
inf --json endpoint instances <endpoint-id> | jq '.diffs[] | select(.identical | not)'| Flag | Description |
|---|---|
--team <id> | Team ID (defaults to the active team) |
--stopped | Include Stopped deployments |
--terminated | Include terminated instances |
--instance-status <statuses> | Only instances in these statuses |
--max-instances <n> | Read the frozen config of at most this many newest instances per deployment (default 200) |
inf endpoint history
Show how the endpoint and all its current deployments changed:
routingEras: every deployment's priority and rule over time. Each era names who started it (startedBy: user,clientTag,reason,routingVersion) and the deployments it changed (changes: priority and rule before and after).configEras: each deployment's config hash over time.timeline: one list of endpoint and deployment events.pricingHistory: list-price and pricing-rule changes. This needs super-admin.
--at shows the endpoint and every deployment as they were at that moment. It takes --team, --since, --until, --at, --type, --actor, and --max-events, with the same meanings as in inf deployment history. For --instance, --instance-configs, or --no-endpoint-events, run inf deployment history on one deployment.
inf endpoint history <endpoint-id> --since 3d
inf --json endpoint history <endpoint-id> --at 2026-10-01T14:05:00Z | jq '.stateAt'inf endpoint pricing
Show the endpoint's pricing:
- The list price: what billing charges when no pricing rule applies.
- The current pricing rules.
- What each team scope pays now. Team
nullis every team without its own rule. - Every list-price and rule change in the window.
- With
--at, the list price and the rule each team paid at that moment.
Rules, current prices per scope, and history need super-admin. Other callers see only the list price.
inf endpoint pricing <endpoint-id>
inf endpoint pricing <endpoint-id> --since 30d --for-team <team-id>
inf --json endpoint pricing <endpoint-id> --at 2026-10-01T14:05:00Z | jq '.history.pricesAt'Alias: inf endpoint prices
| Flag | Description |
|---|---|
--team <id> | Team ID (defaults to the active team) |
--since <time> / --until <time> | Window for price changes: ISO time or an age (24h, 7d, 2w). Defaults: 30 days ago to now |
--at <time> | Also show the prices in force at this moment. pricesAt.listPrice.known is false when the moment is earlier than the price history |
--for-team <team-id> | Only this team's rules and the rules for every team |
--status <statuses> | Only current rules in these statuses: in_effect, superseded, scheduled, disabled |
inf endpoint events
Read one page of the endpoint's raw events, newest first:
endpoint.changedrecords{ changed, before, after }for settings and list price.endpoint.routing_changedrecords every deployment's{ deploymentId, rank, rule }before and after (rankis the priority), plusoperation(replace,set,clear),fromVersion/toVersion,reason,clientTagandapiKeyId. Events from before 2026-10-07 have onlybeforeandafter.- The other event types are
endpoint.created,endpoint.deployment_added,endpoint.alias_added, andendpoint.alias_removed.
The same read is available as REST POST /endpoints/{endpointId}/events and the MCP tool deployment_get_endpoint_events.
inf endpoint events --endpoint-id <endpoint-id> --event-type endpoint.routing_changed --since 2026-10-01T00:00:00Z| Flag | Description |
|---|---|
--endpoint-id <id> | The endpoint (required) |
--event-type <type> / --actor-type <type> | Exact-match filters |
--since <time> / --until <time> | Bound createdAt: since is inclusive, until exclusive |
--page-size <n> | 1–100, default 50 |
--cursor <json> | nextCursor from the previous page. Reset it when you change a filter |
Super-admin commands
inf admin endpoints adds admin conveniences over the same settings:
# Serverless pricing in dollars per 1M tokens, and the allowlist
inf admin endpoints update <endpoint-id> \
--serverless \
--serverless-cost-input 1.30 \
--serverless-cost-output 4.40 \
--allowed-team <team-id>
# Make the endpoint dedicated again (clears its serverless rates)
inf admin endpoints update <endpoint-id> --privateIt also owns the endpoint's aliases (generated add-alias, remove-alias, aliases, and alias-availability) and its pricing rules.
Routing: priorities, versions, and safe concurrent edits
Each deployment on an endpoint has a routing priority (routingRank on deployment reads) and an optional rule.
- Priority: an integer; lower wins. Priorities are unique within an endpoint. The engine evaluates deployments in priority order. The default is the deployment with the lowest priority.
null= no priority; when every deployment has none, the routing is off. - Gaps: a full-list save assigns
10, 20, 30, …, so you can move one deployment between two others (e.g.15) without renumbering. Endpoints saved before gaps existed keep1, 2, 3, …until their next full-list save. routingVersion:inf endpoint describeandinf endpoint getshow it. Every write names the version it read. If the routing changed since, the write fails withCONFLICT, saves nothing, and the error shows the current routing and version. Re-read, re-apply your change, retry.- Audit: every write records who made it, the version before and after, and your optional
--reasonand--client-tag(script name, agent session) on theendpoint.routing_changedevent.inf endpoint historyshows the per-deployment diff.
inf endpoint routing set
Changes one deployment's rule, overflow rule and/or priority. Every other deployment keeps its own, so two people editing different deployments never overwrite each other.
inf endpoint routing set <endpoint-id> --deployment <dpl> \
--rule 'request.input_token_count + request.num_images * 2000 > 150000' \
--reason 'long-prompt pool' --client-tag 'agent kimi-canary'
inf endpoint routing set <endpoint-id> --deployment <dpl> --priority 15
inf endpoint routing set <endpoint-id> --deployment <dpl> --rule false # park it
inf endpoint routing set <endpoint-id> --deployment <dpl> --rule any # no rule
inf endpoint routing set <endpoint-id> --deployment <dpl> \
--overflow-rule 'request.is_openrouter || target.free_slot_pct >= 30'| Flag | Description |
|---|---|
--deployment <id> | The deployment to change (required) |
--rule <cel> | The new rule as CEL; false parks the deployment; any removes the rule. Omit to keep the rule. May not read target.* variables |
--overflow-rule <cel> | Which requests may overflow onto this deployment when their own deployments are full (--enable-routing-overflow). Same CEL as --rule, plus target.free_slot_pct: this deployment's free slots in percent when the request is admitted, read again once before an enforced rule sheds it. any accepts every request (the default). Applied only with --enforce-overflow-rules true; until then the engine only counts what it would reject. Omit to keep it |
--priority <n> | The new priority (lower wins). Omit to keep it. Taking a priority another deployment holds is refused. A deployment with no priority that gets none is placed 10 after the last |
--expect-version <v> | Refuse the write unless the routing is still at this routingVersion (from the read you decided on). Default: the version read just before writing |
--reason <text> / --client-tag <tag> | Recorded on the routing event. --client-tag defaults to inf-cli/<version> |
The same write is REST POST /endpoints/set-deployment-routing and generated inf admin endpoints set-deployment-routing.
inf admin endpoints update-routing
Replaces the whole order: a priority per deployment, an optional rule per deployment, and the default. Use it to reorder many deployments at once; use inf endpoint routing set for one.
- A deployment is eligible when its rule is
true. Anullrule is always eligible. A rule isfalsewhen it divides or takes a modulo by zero, or reads a variable the engine can't see for that request (see below). A deployment with no running instances is never eligible. - The request may use every eligible deployment and takes any free capacity among them, whatever their priority. When all of them are full, it queues (or gets a
429); it never uses an ineligible deployment, unless the endpoint sets--enable-routing-overflow true(seeinf endpoint update). - When no deployment is eligible, the default (lowest priority) serves it, whatever its rule says.
- Engines reload routing at most every 5 minutes, so a save takes effect within 5 minutes. An endpoint whose routing was never saved spreads requests across its deployments by free capacity.
| Flag | Description |
|---|---|
--endpoint-id <id> | The endpoint |
--expected-routing-version <v> | Required. The endpoint's routingVersion from the read you built the list from |
--deployments <json> | JSON array of { "deploymentId", "rule" } in priority order. They get priorities 10, 20, 30, … and the first becomes the default. Deployments you leave out keep their rules and follow the listed ones, in their current order |
--reason <text> / --client-tag <tag> | Optional; recorded on the routing event |
A rule is JSON, not CEL: { "version": 1, "expr": <BoolExpr> }.
- BoolExpr:
bool(value),bool_var(name),str_in(name,values: 1 to 32 strings; true when the variable equals one),eq/neq/lt/lte/gt/gte(left,right: NumExpr),and/or(args: one or more BoolExpr),not(arg). - NumExpr:
num(value),var(name),add/sub/mul/div/mod(left,right). - Variables:
| Variable | Type | Value | Unknown when |
|---|---|---|---|
request.input_token_count | number | Prompt tokens, counted with the endpoint's tokenizer | Presigned request |
request.max_output_tokens | number | max_completion_tokens, else max_tokens, else max_output_tokens; 0 when the request sets none (the engine sizes the output to the context left) | Presigned request, or only non-integer values set |
request.num_images | number | Image parts across the messages or input | Presigned request |
request.stream | boolean | The request streams | Presigned request |
request.has_tools | boolean | The request lists at least one tool | Presigned request |
request.us_geo_required | boolean | Sent to a US-only API hostname | Never |
request.is_openrouter | boolean | The request came from OpenRouter | Never |
request.prefix_family | string | Client family: 12 uppercase hex characters hashed from the tools and first 4 messages; "" with fewer than 4 messages, or for presigned and Responses-API requests. CEL: == "B58F1D182419" or in ["…", "…"] | Never |
request.tools_family | string | Tool-set family: 12 uppercase hex characters hashed from the tool definitions alone, the same across a client's conversations; "" with no tools, or for presigned requests. CEL: == "1DE7BDB78E18" or in ["…", "…"] | Never |
target.free_slot_pct | number | Overflow rules only: the overflow target's free slots in percent (0-100) when the request is admitted, read again once before an enforced rule sheds it | Always in a routing rule (a routing-rule write that reads it is refused); in an overflow rule, when the target's slots are unknown |
Requests above the size limit for inline bodies reach the engine as a presigned URL, so any rule that reads a body-derived variable is false for them and they fall back to the default.
- Limits: 200 nodes, 20 levels of nesting.
# Prompts up to 256k tokens may use either deployment; larger ones only dep_large
inf admin endpoints update-routing --endpoint-id <endpoint-id> \
--expected-routing-version "$(inf --json endpoint get --id <endpoint-id> | jq -r .routingVersion)" \
--deployments '[
{"deploymentId": "dep_small", "rule": {"version": 1, "expr": {
"op": "lte",
"left": {"op": "var", "name": "request.input_token_count"},
"right": {"op": "num", "value": 262144}}}},
{"deploymentId": "dep_large", "rule": null}
]'The dashboard's endpoint page shows and edits the same rules as CEL, e.g. request.input_token_count <= 262144.
inf admin endpoints clear-routing
Turns an endpoint's routing off: clears every priority, rule and the default, so requests spread across all its deployments by free capacity again (within 5 minutes). The endpoint page's "Reset routing" button does the same.
inf admin endpoints clear-routing --endpoint-id <endpoint-id> --expected-routing-version <routingVersion>Related commands
inf deployment create --endpoint-id <id>adds another deployment to an endpoint.inf deployment updatechanges one deployment's own settings: name, GPUs, instances, engine overrides.