Check out the newest way to compare different models for a task/agent harness: AutoEvals

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 600000

Changing the model rolls every deployment on the endpoint. It resets each deployment's model-config pin, parallelism, and shard overrides.

FlagAccessDescription
--id <id>AllEndpoint to update (required)
--team-id <id>AllTeam that owns the endpoint (defaults to the active team)
--model-id <id>AllModel every deployment on the endpoint serves
--public-model-identifier <id>Super-adminRename the identifier callers use
--allowed-team-ids <ids>Super-adminReplace the extra teams allowed to call the endpoint
--is-serverless <bool>Super-adminExpose as a public serverless endpoint; going dedicated makes every active deployment's GPU hours billable
--serverless-cost-per-million-in <cents>Super-adminInput price, cents per 1M tokens
--serverless-cost-per-million-cached-in <cents>Super-adminCached-input price, cents per 1M tokens; empty or 0 bills at the input price
--serverless-cost-per-million-out <cents>Super-adminOutput price, cents per 1M tokens
--queue-timeout-ms <n>Super-adminMax wait for a free slot before a 429; -1 disables queueing
--max-queue-size <n>Super-adminWaiting requests before a 429; -1 disables queueing
--total-req-timeout-ms <n>Super-adminWall-clock cap on the whole stream (1–3600000); every shutdown drain is derived from it
--time-to-next-token-timeout-ms <n>Super-adminMax gap between stream events
--chunk-buffer-timeout-ms <n>Super-adminEngine wait for an out-of-order chunk (1000–60000)
--missing-chunk-cache-ttl-ms <n>Super-adminWorker chunk retention after a generation ends (5000–300000)
--replay-buffer-max-chunks <n>Super-adminRecent chunks the worker can replay (50–5000)
--enable-sticky-routing <bool>Super-adminRoute repeat conversations to the instance holding their KV cache
--enable-sticky-block-keys <bool>Super-adminAlso 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-adminWhen 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-adminWhen 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-adminApply 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-adminWhich 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-adminSend 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-adminBill cancelled generations for tokens generated before the disconnect
--tokenizer-kind <kind>Super-adminHow the engine counts prompt tokens: Estimate (default), HuggingFaceTokenizers, or Toks (the same tokenizer.json counted by toks, faster)
--tokenizer-options <json>Super-adminOptions 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
FlagDescription
--team <id>Team ID (defaults to the active team)
--project <id>Only endpoints in this project
--stoppedInclude 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
FlagDescription
--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)'
FlagDescription
--team <id>Team ID (defaults to the active team)
--stoppedInclude Stopped deployments
--terminatedInclude 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 null is 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

FlagDescription
--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.changed records { changed, before, after } for settings and list price.
  • endpoint.routing_changed records every deployment's { deploymentId, rank, rule } before and after (rank is the priority), plus operation (replace, set, clear), fromVersion / toVersion, reason, clientTag and apiKeyId. Events from before 2026-10-07 have only before and after.
  • The other event types are endpoint.created, endpoint.deployment_added, endpoint.alias_added, and endpoint.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
FlagDescription
--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> --private

It 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 keep 1, 2, 3, … until their next full-list save.
  • routingVersion: inf endpoint describe and inf endpoint get show it. Every write names the version it read. If the routing changed since, the write fails with CONFLICT, 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 --reason and --client-tag (script name, agent session) on the endpoint.routing_changed event. inf endpoint history shows 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'
FlagDescription
--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.

  1. A deployment is eligible when its rule is true. A null rule is always eligible. A rule is false when 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.
  2. 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 (see inf endpoint update).
  3. When no deployment is eligible, the default (lowest priority) serves it, whatever its rule says.
  4. 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.
FlagDescription
--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:
VariableTypeValueUnknown when
request.input_token_countnumberPrompt tokens, counted with the endpoint's tokenizerPresigned request
request.max_output_tokensnumbermax_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_imagesnumberImage parts across the messages or inputPresigned request
request.streambooleanThe request streamsPresigned request
request.has_toolsbooleanThe request lists at least one toolPresigned request
request.us_geo_requiredbooleanSent to a US-only API hostnameNever
request.is_openrouterbooleanThe request came from OpenRouterNever
request.prefix_familystringClient 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_familystringTool-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_pctnumberOverflow 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 itAlways 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>

On this page