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>

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

FlagDescription
--id <id>Endpoint to update (required)
--team-id <id>Team that owns the endpoint (defaults to the active team)
--model-id <id>Model every deployment on the endpoint serves

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.

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.

--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 list price: what billing charges for the endpoint.

inf endpoint pricing <endpoint-id>

Alias: inf endpoint prices

FlagDescription
--team <id>Team ID (defaults to the active team)

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.
  • endpoint.alias_updated records { alias, priceMultiplierBps, adsEnabled }: the alias's settings after an update.
  • 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

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 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
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
--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>

How routing rules work

  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.
  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.

Rule 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

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.

On this page