Weco LogoWeco Docs
CLI

CLI Reference

Reference for the Weco CLI commands and options

This reference provides detailed information about the Weco CLI commands and their options. If ever in doubt, you can use weco --help to get a list of all the commands. Use weco <command> --help to get more information about a specific command (e.g. weco run --help).

For answers to common questions about command usage and troubleshooting, see our FAQ.

Running Optimizations

This is the primary command for starting the optimization process. It takes several arguments to configure how Weco should optimize your code.

weco directly modifies the file(s) specified by --source (or --sources) during the optimization process. It is strongly recommended to use version control (like Git) to track changes and revert if needed. Alternatively, ensure you have a backup of your original file(s) before running the command. During optimization, the source file(s) will be temporarily modified while running the evaluation command.

Upon completion, you will be prompted with the option to update your file(s) with the best-performing version of the code found during the run. Alternatively, you can provide the --apply-change flag to the run and resume command to update the file(s) automatically.

Command Arguments

Required:

ArgumentDescriptionExample
-s, --sourcePath to a single source code file that will be optimized. Use exactly one of --source or --sources.-s model.py
--sourcesPaths to multiple source code files to be optimized together (up to 10 files, 200KB per file, 500KB total). Weco can make coordinated changes across file boundaries.--sources model.py utils.py config.py
-c, --eval-commandCommand to run for evaluating the code in your source file(s). This command should print the target --metric and its value to the terminal (stdout/stderr). See note below. Required for the default shell eval backend; omit when using --eval-backend langsmith or langfuse.-c "python eval.py"
-m, --metricThe name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name does not need to match what's printed by your --eval-command exactly (e.g., it's okay to use "speedup" instead of "Speedup:").-m speedup
-g, --goalmaximize/max to maximize the --metric or minimize/min to minimize it.-g maximize

Optional:

ArgumentDescriptionDefaultExample
-n, --stepsNumber of optimization steps (LLM iterations) to run.100-n 50
-M, --modelModel identifier for the LLM to use (e.g., gpt-5.2, claude-opus-4-5, gemini-3.1-pro-preview). See Supported Models for the complete list of available models.gemini-3-flash-preview (with --api-key: your key's provider default)-M gpt-5.2
-i, --additional-instructionsNatural language description of specific instructions or path to a file containing detailed instructions to guide the LLM. Supported file formats include .txt, .md, and .rst.None-i instructions.md or -i "Optimize the model for faster inference"
-l, --log-dirPath to the directory to log intermediate steps and final optimization result..runs/-l ./logs/
--save-logsSave execution output for each step to .runs/<run-id>/outputs/step_<n>.out.txt with a JSONL index file for tracking.False--save-logs
--eval-timeoutTimeout in seconds for each evaluation step. If the timeout is reached, the evaluation step fails and the optimization proceeds to the next step. No timeout by default.None--eval-timeout 3600
--apply-changeAutomatically apply the best solution to the source file(s) without prompting.False--apply-change
--require-reviewRequire manual review and approval of each proposed change before it is evaluated. See Review Mode.False--require-review
--eval-backendEvaluation backend. shell (default) runs --eval-command directly; langsmith and langfuse evaluate against datasets — see LangSmith and LangFuse.shell--eval-backend langsmith
--outputOutput mode: rich for the interactive terminal UI, plain for machine-readable output suitable for LLM agents.rich--output plain
--no-auto-resumeDisable automatic reconnection/resume on transient network errors.False--no-auto-resume
--auto-resume-max-attemptsMaximum auto-resume attempts before giving up and printing the manual resume command.5--auto-resume-max-attempts 10
--api-keyAPI keys for LLM providers in the format provider=key. You can specify multiple providers by separating them with spaces. Only available to authenticated users.None--api-key openai=your-openai-key gemini=your-gemini-key

Evaluation Requirements

The command specified by --eval-command is crucial for the optimization process. It must:

  1. Execute the modified code from your source file(s)
  2. Assess its performance
  3. Print the metric you specified with --metric along with its numerical value to the terminal

For example, if you set --metric speedup, your evaluation script should output a line like:

speedup: 1.5

Weco will parse this output to extract the numerical value (1.5 in this case) associated with the metric name ('speedup').

For detailed guidance on creating effective evaluation scripts, see Writing Good Evaluation Scripts.

Resuming Interrupted Runs

If your optimization run is interrupted (network issues, restart, etc.), resume from the most recent node:

# Resume an interrupted run
weco resume <run_id>

# For example
weco resume 0002e071-1b67-411f-a514-36947f0c4b31

# Automatically apply the best solution without prompting
weco resume <run_id> --apply-change

# Resume with custom API keys
weco resume <run_id> --api-key openai=your-openai-key gemini=your-gemini-key

Resume Command Options

ArgumentDescriptionDefault
run_idThe UUID of the run to resume (required).-
--apply-changeAutomatically apply the best solution to the source file without prompting.False
--api-keyAPI keys for LLM providers in the format provider=key. You can specify multiple providers by separating them with spaces. Only available to authenticated users.None

Deriving Runs

A derived run branches off an existing run at a specific step. The code and metric value from that step become the baseline (step 0) of the new run — no re-evaluation, no wasted compute — and a fresh optimization loop continues from there with new LLM context.

Use this to steer the optimizer in a new direction (e.g. "now focus on memory, not speed"), add constraints partway through, explore an alternative branch from a known-good solution, or extend a completed run with more steps. The parent run is stopped by default so you don't pay for two loops at once.

All runs created by derive share a lineage with their parent — the original (non-derived) run is the lineage root, and every derive from it (or from any of its descendants) belongs to the same lineage. The dashboard shows the full tree.

# Derive from the best step seen anywhere in the lineage (default)
weco run derive <run_id>

# Derive from the best step in the specified run only
weco run derive <run_id> --from-step run-best

# Derive from a specific step number
weco run derive <run_id> --from-step 7

# Add steering instructions
weco run derive <run_id> -i "Focus on memory efficiency instead of speed"

# Override the step budget for the derived run
weco run derive <run_id> -n 50

Derive Command Options

ArgumentDescriptionDefault
run_idUUID of the parent run to derive from (required).-
--from-stepWhere to branch from: best (lineage-best), run-best (best in this run), a step number, or a node UUID.best
-n, --stepsOverride the step count for the derived run. If omitted, the parent's step count is inherited.None
-i, --additional-instructionsSteering instructions for the derived run (inline text or path to a .txt/.md/.rst file). If omitted, the parent run's instructions are inherited.None
--api-keyAPI keys for LLM providers in the format provider=key. Separate multiple providers with spaces.None
--outputOutput mode: rich for the interactive UI, plain for machine-readable JSON output (useful for LLM agents).rich

Keep the source files in your working directory consistent with the parent run before deriving. The derived loop uses your local files as the baseline if they exist — any local edits will override the inherited code from the source step. In rich mode you'll be prompted to confirm before the loop starts.

Inspecting and Managing Runs

Inspect progress, results, and code for any run from another terminal — useful for scripting and for LLM agents driving Weco headlessly. Commands print JSON unless noted otherwise.

# Show run status and progress
weco run status <run_id>

# Show all results sorted by metric
weco run results <run_id> --top 5

# Show details for a specific step ('best' or a step number)
weco run show <run_id> --step best

# Show a code diff between steps
weco run diff <run_id> --step best --against baseline

# Update additional instructions for an active run
weco run instruct <run_id> "Focus on memory efficiency instead of speed"

# Terminate a running optimization
weco run stop <run_id>
CommandDescriptionKey options
weco run statusRun status and progress: current step, best metric and step, model, and any pending nodes.
weco run resultsAll results sorted by metric.--top N, --format json|table|csv, --plot (ASCII metric trajectory), --include-code
weco run showDetails for one step: plan, code, metric, and status.--step <N|best> (required)
weco run diffPer-file unified code diff between two steps.--step <N|best> (required), --against <baseline|parent|N> (default baseline)
weco run instructUpdate the additional instructions of an active run.
weco run stopTerminate a running optimization. The solution tree is preserved, so you can pick it up again with weco resume.

Review Mode

Pass --require-review to weco run to approve every proposed change before it is evaluated. Each candidate solution waits in a pending-approval state until you (or your agent) inspect it, optionally rewrite it, and submit it for evaluation — only then does the optimizer propose the next step.

# Start a run that waits for your approval at each step
weco run --source model.py \
     --eval-command "python eval.py" \
     --metric accuracy \
     --goal maximize \
     --require-review

# From another terminal: list nodes awaiting approval (includes the proposed code)
weco run review <run_id>

# Optionally replace a pending node's code with your own edit
weco run revise <run_id> --node <node_id> --source model.py

# Approve: evaluate the pending node and unlock the next proposal
weco run submit <run_id> --node <node_id>
CommandDescriptionKey options
weco run reviewList nodes awaiting action (pending approval or evaluation), including their plan and proposed code.
weco run reviseReplace a pending node's code with your own revision before it is evaluated.--node <id> (required), --source <file> or --sources <files...>
weco run submitSubmit a pending node: the evaluation runs locally and the result unlocks the optimizer's next proposal.--node <id> (required), --source/--sources (optional — creates a revision first), -c, --eval-command (override the stored eval command)

weco run status shows the same pending list without code, and weco run diff is handy for inspecting a pending change against the baseline.

Observing External Runs

Track experiments from your own optimization loop (LLM agents, custom scripts, manual experiments) in the Weco dashboard.

# Initialize a run (prints run ID to stdout)
WECO_RUN_ID=$(weco observe init --name "my-experiment" --metric val_bpb --goal min --source train.py)

# Log experiment results
weco observe log --run-id "$WECO_RUN_ID" --step 0 --description "baseline" --metrics '{"val_bpb": 2.36}' --source train.py
weco observe log --run-id "$WECO_RUN_ID" --step 1 --description "increase batch size" --metrics '{"val_bpb": 2.26}' --source train.py
weco observe log --run-id "$WECO_RUN_ID" --step 2 --status failed --description "OOM" --metrics '{"val_bpb": 0.0}' --source train.py

All observe commands are fire-and-forget — they always exit 0 and never crash your agent's loop. For full documentation, see Weco Observe.

Sharing Runs

Create a public share link for a run — anyone with the link can view the run's optimization progress and results in the dashboard.

weco share <run_id>

# Machine-readable output (prints the bare URL only)
weco share <run_id> --output plain

The link looks like https://dashboard.weco.ai/share/<share_id>.

Sharing requires CLI sharing to be enabled in your account settings on the dashboard. To revoke a share link, use the dashboard.

Setting Up Skills

Install the Weco skill into AI coding assistants so they can drive Weco for you (see the Skills guide):

# Interactive picker (defaults to all supported tools)
weco setup

# Or target a specific tool
weco setup claude-code
weco setup cursor
weco setup codex
weco setup openclaw

# Install for every supported tool at once
weco setup all

The skill is installed into the tool's skills folder in your home directory (e.g. ~/.claude/skills/weco for Claude Code). Use --local <path> to install from a local weco-skill checkout instead of downloading (for development).

Credit Management

Weco provides several commands to manage your credit balance and billing.

Check Credit Balance

View your current credit balance:

weco credits balance

Purchase Additional Credits

Buy more credits with flexible amount options:

weco credits topup 25

Specify any amount greater than 2 credits (defaults to 10 if omitted).

Configure Automatic Top-up

Set up automatic credit purchases when your balance gets low:

# Enable automatic top-up
weco credits autotopup --enable

# Disable automatic top-up  
weco credits autotopup --disable

Logging In

Authenticate the CLI with your Weco account:

weco login

This starts a device authorization flow: Weco prints a verification link (and opens it in your browser), you approve the login on the web, and the CLI saves your credentials locally. If you run an authenticated command while logged out, Weco offers to start this flow automatically.

Setting the WECO_API_KEY environment variable takes precedence over saved credentials — useful for CI and headless agents.

Logging Out

This command logs you out of your Weco account and removes saved authentication credentials.

weco logout

After logging out, you'll need to authenticate again the next time you run Weco.

On this page