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,
.envin the working directory,config/fleet.toml, then the built-in default. - Set
FLEET_CONFIGin the process environment to load a different TOML file. Fleet ignoresFLEET_CONFIGin.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_modeand the Root and Sub models. Fleet persists those selections per Session.
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:
timeout_secondsin the Turn request, when present. The terminal’s/timeoutcommand sends this field.turn_timeout_secondsfrom TOML,.env, or the environment, when you set it.- The default of
0, which means no Fleet deadline.
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 withUnsupported 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_attemptsandrlm.recursion_enabledno longer exist. DSPy owns provider retries throughnum_retries, and child agents are controlled byruntime.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.