Skip to main content
Fleet RLM reads non-secret defaults from config/fleet.toml. Copy config/fleet.toml.example to start one. The file is optional, but when it exists it must start with a [config] table that sets schema_version = 5.
  • Fleet resolves each setting from the first source that sets it: explicit overrides (such as CLI flags), the process environment, .env in the working directory, config/fleet.toml, then the built-in default.
  • Set FLEET_CONFIG in the process environment to load a different TOML file. Fleet ignores FLEET_CONFIG in .env.
  • Fleet reads the file once at startup. Restart after every change.
  • Fleet rejects unknown tables, unknown keys, and values of the wrong type. Credentials are environment-only, so setting one in the TOML file is also an error.
  • An invalid configuration stops the CLI with fleet: error: invalid configuration: … before any server, sandbox, or model call starts.
  • A Session can override execution_mode and the Root and Sub models. Fleet persists those selections per Session.
The Shipped column lists the value in config/fleet.toml.example. When the file omits a key, the built-in default applies.

[config]

[runtime]

Turn deadlines

turn_timeout_seconds must be an integer: exactly 0, or 10 to 3600. Fleet rejects booleans, floats, and other values before a Session runs. The environment variable also accepts integer text. Fleet resolves each Turn’s deadline once, when the Turn starts:
  1. timeout_seconds in the Turn request, when present. The terminal’s /timeout command sends this field.
  2. turn_timeout_seconds from TOML, .env, or the environment, when you set it.
  3. The default of 0, which means no Fleet deadline.
Without a Fleet deadline, a Turn runs until it finishes, fails, is cancelled, or uses up its model-call budget. 0 turns off only the Fleet deadline. Daytona’s own sandbox lifetime and idle auto-stop bounds still apply. Fleet records the deadline source (request, configuration, or default) and the effective seconds on the stored Turn, the outcome event, and the fleet_turn trace span.

[llm]

One shared model connection serves every role: Root, Sub, Reflection, and the DSPy correctness Judge. Any DSPy model route works. Set the key itself in FLEET_LLM_API_KEY. It’s a credential, so Fleet reads it only from .env or the process environment. Without an explicit key, DSPy’s native provider authentication reads the provider’s own variables from the process environment, such as OPENAI_API_KEY. Fleet resolves api_key_env references from the process environment, then .env, when it loads settings. Restart Fleet to pick up a changed credential. Fleet rejects the unprefixed LLM_BASE_URL and LLM_API_KEY variables with Use FLEET_LLM_MODEL, FLEET_LLM_BASE_URL, and FLEET_LLM_API_KEY. Rename them with the FLEET_ prefix.

Default models

When you don’t set a shared model in [llm] or FLEET_LLM_MODEL, Root and Sub default to openai/system.ai.deepseek-v4-1-flash-1017, and Reflection and Judge use the built-in openai/gpt-4o-mini. An explicit shared model overrides every role that doesn’t set its own model.

[llm.root], [llm.sub], [llm.reflection], and [llm.judge]

Role tables are optional overrides. Root runs the Turn program. Sub answers semantic calls from sandbox code and runs child agents. Reflection rewrites instructions during GEPA optimization. Judge is the DSPy correctness judge in fleet eval run and GEPA. A role without its own model inherits the shared [llm] model, endpoint, and key. A role with its own model starts an independent connection that uses native provider authentication, unless the role also sets api_base or api_key_env. A role value overrides the shared [llm] value. When neither sets a generation key, the role default in this table applies. The Root max_tokens = 16384 cap bounds runaway reasoning. When a capped reply is missing its output fields, DSPy’s native JSON recovery retries once with the same metered model, so the retry counts toward max_llm_calls_per_turn. Fleet doesn’t send its own corrective re-ask. Role generation settings have environment variables named FLEET_<ROLE>_<KEY>, for example FLEET_ROOT_MODEL, FLEET_SUB_MAX_TOKENS, FLEET_ROOT_ADAPTER, or FLEET_SUB_RESPONSE_FORMAT. FLEET_JUDGE_MODEL is an exception: it sets the MLflow judge in [evaluation], not the Judge role model. See Configure models.

[gateway]

Configuration URLs can’t contain credentials, query strings, or fragments.

[decision]

[daytona]

shared_notes_subpath must be relative. It can’t contain .. or //, or end with /. See Shared learned notes.

[storage]

With lakebase_endpoint set, FLEET_DATABASE_URL must include a host, a user, and sslmode=require, and must not embed a password.

[mlflow], [mlflow.local], and [mlflow.databricks]

Fleet keeps two separate MLflow destinations. [mlflow] mode sets the default backend: "local" (shipped and built-in default) or "databricks". The command can override it: fleet cli databricks selects Databricks, and every command accepts --mlflow local|databricks. Fleet never borrows a value from the other destination. Each key has an environment variable named FLEET_MLFLOW_LOCAL_<KEY> or FLEET_MLFLOW_DATABRICKS_<KEY>. With Databricks selected, every trace storage key must be set. Fleet rejects the retired variables FLEET_MLFLOW_MODE, MLFLOW_TRACKING_URI, MLFLOW_EXPERIMENT_NAME, and unprefixed FLEET_MLFLOW_<KEY> names. Move their values to the FLEET_MLFLOW_LOCAL_* or FLEET_MLFLOW_DATABRICKS_* names, and select the backend with [mlflow] mode or on the command line.

[evaluation]

[server]

Credentials

Set credentials in .env or the process environment. Fleet never reads them from config/fleet.toml and never includes them in the configuration view.

Retired settings

Schema version 5 accepts only the tables above. Fleet rejects any other table with Unsupported Fleet TOML table. The [models] and [connections] tables fail with [models] and [connections] were removed; configure [llm] directly, and [gateway].base_url is gone. The old [application], [logging], and [capture] tables, per-role base_url_env and timeout_seconds, and the old Daytona lease and child-snapshot settings are gone. Fleet RLM 0.8.1 also removed daytona.snapshot and FLEET_DAYTONA_SNAPSHOT. Fleet rejects a snapshot key in [daytona] and ignores the environment variable. Every Sandbox now starts from the snapshot that Fleet pins. See Snapshots. Removing the setting changes the configuration digest, so revalidate any GEPA approval evidence recorded under the old digest.

[rlm]

The [rlm] table is retired. Fleet doesn’t map its keys silently.
  • The shared model-call limit moved to runtime.max_llm_calls_per_turn.
  • rlm.max_provider_attempts and rlm.recursion_enabled no longer exist. DSPy owns provider retries through num_retries, and child agents are controlled by runtime.max_agent_depth.
  • Iteration, wrap-up, finalization, output, and memory knobs are retired. The remaining limits are listed in Turn budgets.

[posthog]

The [posthog] table is retired. Fleet has no PostHog configuration.
Last modified on November 9, 2026