Skip to main content
The Osmosis CLI uses TOML files for evaluation runs, training runs, and benchmark runs. Configs must live inside the workspace directory:
Required fields are shown un-commented. Optional fields are commented out in template files and can be omitted to use platform defaults.

Eval Config

Used by osmosis eval submit to submit an evaluation run. The platform clones the workspace repository identified by the origin remote and runs the rollout server-side against a platform dataset.
configs/eval/my-rollout.toml

[experiment]

Omit both branch and commit_sha to use the latest synced commit on the repository’s default branch. Branch submissions resolve the branch head once, so the run remains pinned to the resulting full commit SHA.

[evaluation]

All fields are optional. Omit values to use platform defaults.

[env] and [secrets] (evaluation)

Optional [env] variables and a required [secrets] table for the evaluation run container. Eval configs must include [secrets] — use required = [] only when the evaluation needs no secret refs. See [env] and [secrets] below for the full ruleset.

Benchmark Config

Used by osmosis benchmark submit to run a benchmark already added to the current workspace. Benchmark configs describe the task selection, agent harnesses and models, and execution settings. They do not reference workspace rollout code.
configs/benchmark/terminal-bench-smoke.toml

[experiment] (benchmark)

benchmark list shows both the key and the name; either one works here, as does the ID.

[tasks]

All fields are optional. Omit the section to run every task. task_names and categories are unioned when both are set. When task_set is set, its published sample is used instead of task_names or categories.
For HLE, we recommend task_set = "parity". Omit [tasks] only when you intend to submit the full HLE benchmark.

[[agents]] and [agents.model]

Each run requires one to eight agents. Harness availability depends on the selected benchmark. Across managed benchmarks, supported harness values are claude-code, codex, cursor-cli, gemini-cli, mini-swe-agent, openhands, opencode, and terminus-2. The Platform rejects a harness that is unavailable for the selected benchmark. Every agent needs its own [[agents]] entry regardless: a benchmark that runs only its official scaffold rejects every harness, and one that merely allows a harness runs its official scaffold when you omit the field. benchmark info reports which of the three applies. For provider and endpoint models, api_key_secret is the model’s Platform secret record name. harness_api_key_secret is separate and per-agent: it is required for cursor-cli and mini-swe-agent, and rejected for every other harness. Set it to CURSOR_API_KEY for cursor-cli and to MSWEA_API_KEY for mini-swe-agent. Those are the variables the harnesses read, and any other value is rejected at submit. Register the record with osmosis secret set, then reference its name in the agent. For example, a Cursor CLI agent can use:
To benchmark one of your own LoRA models instead of a provider model, use type = "hosted". Take both values from osmosis model list --type lora: base_model is the LoRA’s Base Model column and lora_model_name is its Name column.
Deploy the LoRA model with osmosis model deploy before submitting; a run against an undeployed one is rejected, as is a base_model that does not match what that LoRA model was trained on. Hosted agents need no api_key_secret, since Osmosis serves them.
Each agent’s effective environment combines top-level [env] with that agent’s [agents.env]. A provider or endpoint agent’s api_key_secret name cannot appear in that agent’s effective environment. Neither the judge_api_key_secret name nor any [verifier] secret name can appear in top-level [env] or any agent’s [agents.env].For a cursor-cli agent, do not also set CURSOR_API_KEY in either env table; for a mini-swe-agent agent, do not set MSWEA_API_KEY. The resolved harness secret owns that destination variable.Provider and endpoint api_key_secret fields also cannot reference runner-reserved names: DAYTONA_API_KEY, DAYTONA_API_URL, SKYPILOT_SERVICE_ACCOUNT_TOKEN, or SKYPILOT_API_SERVER_ENDPOINT. Those are Platform-managed sandbox plumbing, so store a model credential under a different record name.The platform reserves the _OSMOSIS_ prefix and rejects any key that starts with it in [env] or in any [agents.env].
All secret fields contain record names, never credential values. [agents.env] contains literal variables for one agent; top-level [env] applies to every agent, and agent-specific values override the same global key.

[execution]

A benchmark takes one of three shapes, shown in the LLM Judge row of benchmark info: Register the record with osmosis secret set.

[secrets]

A credential the run needs that no other field names — a registry dataset’s own API key, for instance. List the record name; the value is resolved at submit. The same section and resolution order apply to training and eval configs.
Resolution order per name, first hit wins:
  1. --secrets-file <path>, one NAME=value per line with # comment lines skipped; - reads stdin
  2. a variable of that name in the CLI process environment
  3. an existing personal or workspace secret, resolved server-side
  4. a hidden interactive prompt, only in a terminal and only for names still unresolved
Supplied locally (1, 2, or 4). The CLI reads the value and sends it with this submission’s TLS request. Osmosis records the name under the Run scope but does not add the value to the secret store or persistent run config, so you supply it again on every submit. Resolved server-side (3). The name is already a personal or workspace secret, so the platform looks the value up itself. Nothing to supply locally; a personal secret overrides a workspace secret with the same name. There is deliberately no --secret NAME=value flag: a value in argv lands in shell history, in ps output, and in any CI log running under set -x.
Stdin takes the same NAME=value lines a file does. Piping makes stdin non-interactive, so pass --yes to skip the submit confirmation. Outside a terminal, a name with no value fails immediately and lists every missing name at once, so CI reports the whole gap rather than one name per retry. Each --secrets-file line is dotenv-style NAME=value. The case-sensitive name must pass Python’s str.isidentifier() check. The CLI strips a leading export prefix and removes one matching pair of single or double quotes around the value. Blank lines and lines starting with # are ignored; inline comments, escape processing, and multiline values are not supported.
.env.run
A malformed line fails the submit. The CLI reports the source and line number only, and never echoes the line contents to stderr or the JSON error envelope, so a value cannot leak through CI logs.

[verifier]

Registry datasets declare credential templates the platform cannot enumerate, so a run names the Platform secret records supplying them here. Each record is delivered to the verifier under its own name, so name it for the variable the verifier reads. At most 16 names, each matching ^[A-Z][A-Z0-9_]*$.
Managed benchmarks model their credentials in the catalog and take none, so submit rejects this section for them. A secret named here cannot also appear as a literal key in top-level [env] or any [agents.env], for the same reason as judge_api_key_secret.
Never put secret values in [env], [agents.env], or extra_headers. Benchmark configs use Osmosis fields and are not Harbor configuration files.

Training Config

Used by osmosis train submit to submit a training run.
configs/training/my-rollout.toml
Git Sync is the source of truth for your rollout code. The CLI reads config values from the local TOML file you pass, but rollout code comes from the synced workspace repository. Commit and push before submitting code changes. Set branch to use a pushed branch or commit_sha for a specific pushed revision; omit both to use the default branch.

[experiment]

Omit both branch and commit_sha to use the latest synced commit on the repository’s default branch. Branch submissions resolve the branch head once, so the run remains pinned to the resulting full commit SHA.

[training]

[sampling]

[checkpoints]

The platform enforces these ranges at submission. It does not check values against the selected model or backend, so an unsupported combination can surface during provisioning or execution.

[advanced]

Backend-specific fields for accounts explicitly enabled by Osmosis. Standard accounts and standard configs must omit [advanced]; the platform rejects it when the account is not enabled.

[env] and [secrets]

Use these sections to inject environment variables into the rollout container during training runs or evaluation runs. The same shape applies to both training and evaluation configs.
Rules:
  • [env] keys must match ^[A-Z_][A-Z0-9_]*$; [secrets].required names must match ^[A-Z][A-Z0-9_]*$.
  • The same name cannot appear in both [env] and [secrets].required.
  • [env] keys starting with _OSMOSIS_ are reserved by the platform and cannot be used.
  • Existing personal or workspace secret records are resolved server-side, so their values do not appear in the local config or CLI request. Values supplied locally through --secrets-file, the process environment, or a hidden TTY prompt travel in that submission’s TLS request but are not added to the Osmosis secret store or persistent run config.
  • Eval configs must include [secrets]. Use required = [] only when the evaluation needs no secret refs.
  • Training configs may omit [secrets]. If you include the table, it must define required.
Secrets are scoped. A workspace secret is shared across the workspace; a personal secret is private to you and overrides the workspace secret of the same name at run time. Register secrets with osmosis secret set before submitting a run that references them.
Start with only [experiment] (plus [secrets] for eval configs) and let the platform use training defaults. Add optional fields only when you need to tune a run.
Last modified on August 10, 2026