Provider Setup
August 11, 2026 · View on GitHub
Use this page after you finish the Quickstart and want the
generated project to run multiple real providers. By then,
you have initialized .crewplane/, validated the generated workflow, run the
mock workflow, and inspected the local run record.
Provider setup is where you leave mock mode. Real provider runs start the
external CLI commands configured in .crewplane/config.yml, and those tools keep
their own filesystem, network, credential, approval, and sandbox settings.
Crewplane coordinates the workflow and writes the run record; it does not
sandbox provider CLIs.
Crewplane also does not install provider CLIs, manage provider credentials, restrict provider network access, or guarantee that provider-generated content is safe to execute.
If you want a quick setup for one real provider, start with the
crewplane onboarding command in the
quickstart onboarding step.
Connect One Provider Manually
Manual setup connects the workflow to provider profiles, then chooses the invoker:
.crewplane/config.ymldefines named provider profiles underagents.- The workflow lists those same agent names under each node's
providers. settings.integrations.invoker.implementationdecides whether those names use mock output or real CLI calls.
The names must match exactly. Setting the invoker implementation to cli is the
point where crewplane run can start the external provider commands listed
under agents.
![Provider setup diagram showing that agents.codex in .crewplane/config.yml must match providers: ["codex"] in the workflow, then the invoker changes from mock to cli before validation and execution.](../images/providers/provider-setup-two-files.png)
First, confirm the provider CLI works outside Crewplane:
codex --version
Then add or uncomment one real provider profile in .crewplane/config.yml and
switch the invoker to cli. A minimal Codex setup looks like this:
version: "1.0"
agents:
codex:
cli_cmd: ["codex", "exec"]
provider_kind: "codex"
prompt_transport: "stdin"
prompt_transport_arg: "-"
settings:
integrations:
invoker:
implementation: "cli"
options: {}
Replace the generated mock invoker options with options: {}. The cli
invoker does not accept the mock-only options generated for the first run.
Next, point the workflow node at the same agent name:
nodes:
- id: review.project
mode: parallel
providers: ["codex"]
Validate before you run:
crewplane validate
crewplane run
You are leaving mock mode when you make this edit. From this point on,
crewplane runcan start the external provider commands configured underagents. Review provider CLI permissions, approval mode, sandbox settings, credentials, and network behavior before running.
How Agent Names Work
In Crewplane, an agent is a named provider CLI configuration. It is not a
Python object or a long-running service. Workflow nodes reference agents by
name:
agents:
codex:
cli_cmd: ["codex", "exec"]
provider_kind: "codex"
default_model: "gpt-5.5"
prompt_transport: "stdin"
prompt_transport_arg: "-"
extra_args:
- "--skip-git-repo-check"
nodes:
- id: implement
mode: parallel
providers: ["codex"]
The provider name in a workflow must exist under agents. Crewplane uses that
name to find the provider profile for each node.
Turn Mock Mode On/Off
The generated mock agent is only for the quickstart and onboarding demo. You
can remove it once your workflows no longer reference providers: ["mock"]; it
is not what makes a run use mock output.
Mock mode is controlled by the invoker implementation:
settings:
integrations:
invoker:
implementation: "mock"
options:
output_mode: "lorem"
seed: 42
delay_seconds: 0.25
observation_delay_seconds: 5
With implementation: "mock", Crewplane writes deterministic mock output and
does not start provider CLIs. The options keys here belong to the mock
invoker.
To run real provider CLIs, switch the same setting to cli and remove those
mock-only options:
settings:
integrations:
invoker:
implementation: "cli"
options: {}
With implementation: "cli", crewplane run starts the external commands
configured under agents. Keep options: {} unless your chosen CLI invoker
configuration specifically needs additional options.
Choose A Provider Kind
provider_kind tells the built-in CLI invoker which provider-aware behavior to
use at the invoker boundary. It can affect output extraction, quota parsing, log
formatting, and usage parsing. It does not install or authenticate the provider
tool.
Supported values:
claudecodexcopilotgeminikilogeneric
Confirm provider commands directly before running Crewplane with the cli
invoker:
claude --version
codex --version
gemini --version
copilot version
Choose A Model
default_model is optional. If you omit it, the provider CLI chooses its
configured default.
To override the model for one workflow node, use a provider object:
providers:
- provider: codex
model: gpt-5.3
When a workflow node supplies model, Crewplane passes that value to the
provider CLI. With the built-in cli invoker, built-in provider kinds do not
need model_arg; if you set it, Crewplane ignores it and warns you to remove
it. For
provider_kind: generic, use model_arg to choose the flag; it defaults to
--model. Set model_arg: null if your generic CLI should not receive a model
flag.
Choose Reasoning
Provider objects can request a provider-native reasoning value when the
built-in cli invoker uses provider_kind: codex or provider_kind: claude:
providers:
- provider: codex
model: gpt-5.6-sol
reasoning: xhigh
Crewplane passes Codex requests through
--config model_reasoning_effort="..." and Claude requests through
--effort .... The value is provider-native and may be model-dependent;
Crewplane records the request but does not claim that it was applied
unchanged. Omit reasoning to leave the provider's current defaults and user
configuration unmanaged.
Do not configure a second reasoning authority in cli_cmd or extra_args.
For Claude, a non-empty inherited CLAUDE_CODE_EFFORT_LEVEL also conflicts.
Explicit --settings JSON or files may contain unrelated settings, but
effortLevel or env.CLAUDE_CODE_EFFORT_LEVEL conflicts with the workflow
field. When reasoning is requested, Crewplane must be able to read and parse
each explicit Claude settings source so crewplane validate can report
conflicts before launch. An env wrapper cannot use --chdir or -C with a
workflow reasoning request because it would change relative settings resolution.
Choose Prompt Transport
Crewplane can send the rendered prompt to a provider CLI in two ways:
stdin: pass the rendered prompt through standard input.argv: pass the rendered prompt as an argument afterprompt_transport_arg.
Use stdin when the provider CLI supports it. It keeps long prompts out of the
command line and is the generated default for supported providers.
agents:
stdin_agent:
cli_cmd: ["provider-cli"]
prompt_transport: "stdin"
argv_agent:
cli_cmd: ["provider-cli"]
prompt_transport: "argv"
prompt_transport_arg: "--prompt"
In stdin mode, Crewplane sends the prompt on standard input. If
prompt_transport_arg is set, that token is appended by itself; this is useful
for CLIs that require a stdin sentinel such as -.
When prompt_transport: "argv" is used, prompt_transport_arg is required and
Crewplane appends both the flag and the rendered prompt. Preflight emits a
warning because argv prompts can be visible in process lists or shell histories
depending on the platform and tooling.
Tune Retries, Quota, And Timeouts
Per-agent retry and quota behavior is configured under agents.<name>:
agents:
claude:
cli_cmd: ["claude"]
max_retries: 2
retry_delay_seconds: 300
retry_on_exit_codes: [1]
retry_on_stderr_contains:
- "temporarily unavailable"
quota_reached_on_contains:
- "usage limit reached"
quota_reached_retry_delay_seconds: 300
quota_reset_sleep_floor_seconds: 5
invocation_timeout_seconds: null
invocation_idle_timeout_seconds: 1800
Generic retries and quota retries are separate:
- Generic retries use
retry_on_exit_codes,retry_on_stderr_contains, andretry_on_output_contains. They only run whenmax_retriesis greater than0; each retry waitsretry_delay_seconds. - Quota retries start when provider output matches built-in quota detection or
one of your
quota_reached_on_containsstrings. They are not limited bymax_retries; Crewplane retries quota hits inside a five-hour guard window. - If Crewplane can parse a provider reset time, it waits until that reset plus
quota_reset_sleep_floor_seconds, but never less thanquota_reached_retry_delay_seconds. - Crewplane does not sleep past the five-hour guard.
- It stops immediately when a provider reports a reset more than five hours away.
- If earlier quota waits have already used part of the window, Crewplane also stops when the next wait would bring the same quota-retry sequence to five hours or more.
⚠️ Wall-clock timeout is a hard kill switch. Leave
invocation_timeout_secondsasnullunless you explicitly want Crewplane to terminate a provider CLI after a fixed amount of elapsed time. For quiet or stalled processes, preferinvocation_idle_timeout_seconds; it cancels only after the provider stops producing output for that interval. Gemini's machine-readable JSON response is emitted only after completion, so Crewplane cannot enforce an output-idle timeout for Gemini invocations. Useinvocation_timeout_secondswhen those invocations need a hard limit.
See the configuration reference for every config field.
Next
After provider setup, start the real provider run:
crewplane run
crewplane run performs preflight validation before execution, so it stops
before starting provider CLIs if the workflow or config is invalid.
Continue to Running workflows to run the configured provider workflow and understand preflight, resume, duplicate skips, and reruns.
Or browse the Guides.