Skip to main content

SkillOpt Quickstart

This page covers the shortest path to run SkillOpt. For internals, see Architecture. For task execution details, see the Benchmark docs.

Prerequisites​

  1. Install Python dependencies from the repo root:

    uv sync --project skillopt
    uv sync --project benchmark
  2. Configure an optimizer and judge API key:

    export OPENROUTER_API_KEY=...
  3. Make sure the skill exists:

    src/agent/config/skills/device-operator/SKILL.md
  4. For MobileGym or bridge-backed runs, start or select an environment bridge.

WebUI​

Start the SkillOpt WebUI from the repo root:

uv run --project skillopt python -m skillopt webui --host 127.0.0.1 --port 8766

Open http://127.0.0.1:8766.

Recommended WebUI flow:

  1. Select a target from the Targets table.
  2. Save an agent config with a non-empty model API key.
  3. Start or select a MobileGym environment.
  4. Set judge model, max iterations, max edits per iteration, and min_delta.
  5. Run the job and open the Report link when it appears.

The WebUI stores jobs under skillopt/runs/webui/<job_id>/. While a job runs, the progress area follows SkillOpt's own phase records, including the active phase, task counts, failed task IDs, best score, and whether the top-level report is available. Historical and failed jobs only show a report link when report.html exists.

MobileGym CLI Run​

Start a MobileGym bridge from the benchmark project:

cd benchmark
uv run python -m runner start-mobilegym-env --envs 5 --bridge-port 19090

In another shell from the repo root, run SkillOpt through the benchmark runner backend:

uv run --project skillopt python -m skillopt \
--skill device-operator \
--backend mobilegym \
--environment-url http://127.0.0.1:19090 \
--train-suite skillopt/device-operator/device_operator_train \
--validation-suite skillopt/device-operator/device_operator_verification \
--budget 3 \
--edit-budget 2 \
--min-delta 0.03 \
--no-build-daemon-image \
--output /tmp/device-operator-best.md

MobileGym runs use isolated benchmark daemon workers and route each task through the environment bridge with a stable benchmark-task-id. The CLI logs Max iterations, Max edits / iteration, and min_delta before launching the optimization loop.

Existing Device Daemon Run​

If an Aiden agent daemon is already running, SkillOpt can use it directly:

uv run --project skillopt python -m skillopt \
--skill device-operator \
--backend device \
--agent-url http://127.0.0.1:8080 \
--train-suite skillopt/device-operator/device_operator_train \
--validation-suite skillopt/device-operator/device_operator_verification \
--budget 3 \
--output /tmp/device-operator-best.md

This mode temporarily overrides the target skill during rollout and reloads the agent skill registry. Use bridge-backed runs when you need pre/post screenshots, isolated daemon workers, or MobileGym concurrency.

Bridge-Backed Physical Device Run​

For physical devices exposed through an environment bridge, keep --backend device but provide --environment-url:

uv run --project skillopt python -m skillopt \
--skill device-operator \
--backend device \
--environment-url http://127.0.0.1:19090 \
--train-suite skillopt/device-operator/device_operator_train \
--validation-suite skillopt/device-operator/device_operator_verification \
--budget 3 \
--output /tmp/device-operator-best.md

When --environment-url is set, SkillOpt uses the benchmark runner backend even for --backend device.

Dry Run And Review​

Print the proposed diff without writing the output file or web artifacts:

uv run --project skillopt python -m skillopt \
--skill device-operator \
--backend device \
--agent-url http://127.0.0.1:8080 \
--train-suite skillopt/device-operator/device_operator_train \
--validation-suite skillopt/device-operator/device_operator_verification \
--budget 1 \
--dry-run

After a normal run, review before applying:

diff src/agent/config/skills/device-operator/SKILL.md /tmp/device-operator-best.md

To inspect artifacts:

open skillopt/runs/<run_id>/report.html

The top-level SkillOpt report is separate from child benchmark reports. Use the SkillOpt report to see the optimization timeline, accepted/rejected candidates, best score, failure reason, artifacts, and diff. Use each phase's report drilldown for task-level benchmark evidence.

Common Options​

OptionMeaning
--skillSkill directory name under src/agent/config/skills.
--suiteOne suite to split 70/30 into train and selection tasks.
--train-suiteExplicit train suite label.
--validation-suiteExplicit held-out validation suite label.
--budgetMaximum optimization iterations.
--edit-budgetMaximum skill edits proposed per optimization iteration.
--min-deltaRequired hard-score improvement to accept a candidate.
--optimizer-modelOpenRouter model for reflection and patch generation.
--judge-modelOpenRouter model for benchmark rubric judge.
--no-judgeSkip LLM judge and use hard assertions only.
--environment-urlEnvironment bridge endpoint for benchmark-backed rollouts.
--agent-configAgent config passed to benchmark daemon workers.
--artifact-rootRoot directory for SkillOpt run artifacts.
--run-idStable run id, useful for reproducible scripts.

Troubleshooting​

mobilegym backend requires environment_url

Start a MobileGym bridge or pass the endpoint from the WebUI environment table.

missing env var OPENROUTER_API_KEY

Set OPENROUTER_API_KEY or provide an agent config whose model API key can be resolved by the shared runner config helpers.

skill not found

SkillOpt looks under AIDEN_SKILLS_DIR, then src/agent/config/skills/<skill>/SKILL.md, then skills/<skill>/SKILL.md.

Judge model returns HTTP 403 or region errors

Change --judge-model to a model available in the current OpenRouter account and region. A judge error does not mean the task executed incorrectly.

Validation looks too good with --no-judge

--no-judge only runs hard assertions. It is useful for trace collection, but it can produce false positives for rubric-heavy UI tasks.