SkillOpt loads structured YAML, resolves _base_ inheritance, and flattens
the result for the trainer. Shipped defaults live in
configs/_base_/default.yaml; benchmark configs override them.
Use explicit optimizer and target backends when the two roles differ or when selecting the generic OpenAI-compatible backend.
| Backend | Optimizer | Target |
|---|---|---|
openai_chat |
✓ | ✓ |
openai_compatible |
✓ | ✓ |
claude_chat |
✓ | ✓ |
qwen_chat |
✓ | ✓ |
minimax_chat |
✓ | ✓ |
copilot_chat |
✓ | ✓ |
codex_exec |
✓ | ✓ |
claude_code_exec |
✓ | ✓ |
cursor_exec |
— | ✓ |
copilot_exec |
— | ✓ |
MiniMax currently has one shared deployment. model.minimax_model is applied
when MiniMax is the target; mixed-backend runs cannot independently choose a
MiniMax optimizer model and a different target model.
model.minimax_region selects the service region: global_en (default)
resolves to https://api.minimax.io/v1 and cn_zh resolves to
https://api.minimaxi.com/v1. model.minimax_base_url overrides it.
| Parameter | Type | Default | Description |
|---|---|---|---|
model.backend |
str | azure_openai |
Backward-compatible high-level run label |
model.optimizer |
str | gpt-5.5 |
Optimizer deployment/model |
model.target |
str | gpt-5.5 |
Target deployment/model |
model.optimizer_backend |
str | openai_chat |
Optimizer client path; chat backends plus codex_exec and claude_code_exec |
model.target_backend |
str | openai_chat |
Target client path; chat or exec backend |
model.reasoning_effort |
str | medium |
Shared reasoning effort |
model.rewrite_reasoning_effort |
str | empty | Optional full-rewrite effort override |
model.rewrite_max_completion_tokens |
int | 64000 |
Full-rewrite output cap |
openai_chat| Parameter | Default | Description |
|---|---|---|
model.azure_openai_endpoint |
empty | Shared Azure resource URL or compatibility-mode base URL |
model.azure_openai_api_version |
2024-12-01-preview |
Azure API version |
model.azure_openai_api_key |
empty | Key for api_key or compatibility auth |
model.azure_openai_auth_mode |
empty | Config value; empty falls back to env, whose default is azure_cli |
model.azure_openai_ad_scope |
Azure Cognitive Services scope | AAD token scope |
model.azure_openai_managed_identity_client_id |
empty | Optional user-assigned identity client ID |
Every shared key also has an optimizer_azure_openai_* and
target_azure_openai_* form.
claude_chatclaude_chat launches an installed, authenticated Claude Code CLI with
claude -p; it does not instantiate an Anthropic API client. The executable
defaults to claude and can be overridden with CLAUDE_CLI_BIN.
ANTHROPIC_API_KEY is one authentication option understood by the CLI.
qwen_chat speaks the OpenAI chat-completions protocol, so it reaches both
self-hosted servers (vLLM, SGLang) and hosted OpenAI-compatible gateways.
chat_template_kwargs is a vLLM/SGLang extension: OpenAI, Azure OpenAI, and
strict gateways reject the unknown body field with HTTP 400, and non-Qwen vLLM
models served with it may emit <think> output without an <answer> tag.
Because the correct wire policy therefore depends on the serving stack rather
than on a boolean preference, it is an explicit three-state setting:
thinking_mode |
On the wire |
|---|---|
server_default (default) |
chat_template_kwargs is not sent; the server’s chat template decides |
enabled |
sends chat_template_kwargs: {"enable_thinking": true} |
disabled |
sends chat_template_kwargs: {"enable_thinking": false} |
server_default is the portable default and works against any
OpenAI-compatible endpoint, but Qwen3 chat templates enable thinking by
default, so the outcome depends on the serving stack and template version. The
backend warns once per role when a request is sent under server_default. For
reproducible runs pin enabled or disabled; the resolved per-role mode is
recorded in the run’s config.json under resolved_qwen_thinking_modes.
The legacy model.qwen_chat_enable_thinking boolean keeps its historical
meaning exactly — true sends enable_thinking: true, false omits the field
(it never sent an explicit false) — so existing configs are unaffected.
Setting both keys to conflicting values raises an error rather than picking a
winner. Prefer thinking_mode; use disabled when you need the field sent.
| Parameter family | Description |
|---|---|
model.qwen_chat_* |
Shared base_url, api_key, temperature, timeout_seconds, max_tokens, thinking_mode, and the legacy enable_thinking |
model.qwen_chat_thinking_mode |
Wire policy for chat_template_kwargs.enable_thinking: server_default (default; omit the field), enabled, or disabled. See Qwen thinking mode |
model.optimizer_qwen_chat_* / model.target_qwen_chat_* |
Per-role Qwen overrides, including *_qwen_chat_thinking_mode |
model.minimax_* |
MiniMax region, base_url, api_key, shared minimax_model, temperature, max_tokens, and enable_thinking; minimax_model applies when MiniMax is the target |
model.codex_exec_* |
Codex path, sandbox, profile, SDK mode, reasoning, network/search, and approval policy; see compatibility notes below |
model.claude_code_exec_* |
Claude path, profile, SDK mode, effort, and thinking-token cap |
model.codex_trace_to_optimizer |
When true (default) and target is codex_exec, inject the agent’s codex trace steps into the reflection prompt |
model.claude_trace_to_optimizer |
When true (default) and target is claude_code_exec, inject the agent’s claude trace steps into the reflection prompt |
model.cursor_exec_path |
Cursor Agent executable path; default cursor-agent |
model.cursor_exec_sandbox |
Cursor sandbox mode: enabled (default) or disabled; file-edit rollouts require enabled |
model.copilot_exec_path |
GitHub Copilot CLI executable path; default copilot |
model.copilot_exec_home |
Optional COPILOT_HOME override isolating CLI config |
model.copilot_exec_allow_all_tools |
Optional opt-in to --allow-all-tools; unset by default so COPILOT_EXEC_ALLOW_ALL_TOOLS remains authoritative |
model.copilot_chat_optimizer_model / model.copilot_chat_target_model |
Optional per-role --model IDs for copilot_chat |
model.copilot_chat_timeout |
Per-call timeout in seconds for copilot_chat |
For compatibility, model.codex_bin, model.codex_cli_bin, and
model.codex_path are aliases for model.codex_exec_path;
model.codex_sandbox and model.sandbox are aliases for
model.codex_exec_sandbox. The canonical codex_exec_* name wins when both
forms occur in the same YAML layer. A child config or command-line override
still overrides its base config, whichever accepted spelling it uses.
The aliases may also be supplied without the model. prefix through
--cfg-options; with a structured config they are applied to the model
section.
model.codex_exec_full_auto and --codex_exec_full_auto remain accepted for
backward compatibility but are deprecated and ignored. Set
model.codex_exec_sandbox and model.codex_exec_approval_policy explicitly.
Blank or null Codex values in the shipped base config leave the corresponding
CODEX_EXEC_* environment variable in control. The effective precedence is an
explicit command-line/YAML value, then the environment, then the built-in safe
default (codex, workspace-write, and approval policy never).
model.codex_exec_network_access controls outbound network access only while
the Codex sandbox is workspace-write; it cannot restrict
danger-full-access. model.codex_exec_web_search independently selects live
web search when true and disables web search when false. These settings are
forwarded consistently to both SDK and CLI execution paths.
[!WARNING]
danger-full-accessgrants the Codex process unrestricted filesystem access. Use it only in an appropriately isolated environment, such as a disposable container. The same warning applies to environment aliases such asCODEX_SANDBOX_MODE=danger-full-access.
train)| Parameter | Type | Default | Description |
|---|---|---|---|
train.num_epochs |
int | 4 |
Training epochs |
train.train_size |
int | 0 |
0 derives the size from the dataset split |
train.steps_per_epoch |
int | derived | Runtime field recomputed from train size, batch size, and accumulation; configured values are overwritten |
train.batch_size |
int | 40 |
Tasks sampled per step |
train.accumulation |
int | 1 |
Accumulation rounds per step |
train.seed |
int | 42 |
Random seed |
gradient)| Parameter | Type | Default | Description |
|---|---|---|---|
gradient.minibatch_size |
int | 8 |
Reflect minibatch size |
gradient.merge_batch_size |
int | 8 |
Patch merge batch size |
gradient.analyst_workers |
int | 16 |
Parallel reflection workers |
gradient.failure_only |
bool | false |
Reflect only on failures |
optimizer)| Parameter | Type | Default | Description |
|---|---|---|---|
optimizer.learning_rate |
int | 4 |
Maximum edit patches per step |
optimizer.min_learning_rate |
int | 2 |
Floor for decaying schedules |
optimizer.lr_scheduler |
str | cosine |
constant, linear, cosine, or autonomous |
optimizer.lr_control_mode |
str | fixed |
fixed, autonomous, or none |
optimizer.skill_update_mode |
str | patch |
patch, rewrite_from_suggestions, or full_rewrite_minibatch |
optimizer.use_slow_update |
bool | true |
Epoch-boundary longitudinal update |
optimizer.slow_update_samples |
int | 20 |
Longitudinal evaluation samples |
optimizer.slow_update_gate_with_selection |
bool | false |
Gate slow-update guidance on the selection split |
optimizer.longitudinal_pair_policy |
str | mixed |
mixed, changed, or unchanged |
optimizer.use_meta_skill |
bool | true |
Cross-epoch optimizer memory |
optimizer.use_skill_aware_reflection |
bool | false |
Enable skill-defect vs execution-lapse routing |
optimizer.skill_aware_appendix_source |
str | both |
both or failure_only |
optimizer.skill_aware_consolidate_threshold |
int | 0 |
Appendix compaction threshold; 0 disables it |
evaluation)| Parameter | Type | Default | Description |
|---|---|---|---|
evaluation.use_gate |
bool | true |
Accept only improvements when enabled; false records validation but force-accepts each candidate |
evaluation.gate_metric |
str | hard |
hard, soft, or mixed |
evaluation.gate_mixed_weight |
float | 0.5 |
Soft-score weight for mixed |
evaluation.use_semantic_density |
bool | false |
Add the optional instruction-density bonus |
evaluation.semantic_density_weight |
float | 0.05 |
Density bonus weight |
evaluation.leading_words |
list/str | built in | Optional custom high-influence words |
evaluation.sel_env_num |
int | 0 |
Selection size; 0 uses the full split |
evaluation.test_env_num |
int | 0 |
Test size; 0 uses the full split |
evaluation.eval_test |
bool | true |
Run final test evaluation |
env)| Parameter | Type | Default | Description |
|---|---|---|---|
env.name |
str | empty | Benchmark name |
env.skill_init |
str | empty | Initial skill document |
env.split_mode |
str | ratio |
ratio or split_dir |
env.split_ratio |
str | benchmark/default | Train:validation:test ratio |
env.split_seed |
int | 42 |
Deterministic split seed |
env.split_dir |
str | empty | Materialized train/val/test directory |
env.data_path |
str | empty | Raw data path for ratio mode |
env.split_output_dir |
str | empty | Optional materialized split output |
env.exec_timeout |
int | 120 |
Per-task timeout in seconds |
env.out_root |
str | generated by the train/eval CLIs | Output directory |
Benchmark-specific env keys are passed through to the adapter.
env.search_mode selects how an OfficeQA rollout gathers evidence. The
default is unchanged: offline searches only the configured local document
corpus and makes no network search call.
| Setting | Behavior |
|---|---|
env.search_mode: offline (default) |
Keep search local to the configured document corpus. env.use_local_tools: false also disables local function tools in this mode. |
env.search_mode: custom_search |
Use the token-authenticated HTTP service. Set search_api_url, search_auth_env and search_provider for your service. |
env.search_mode: azure_search |
Use the model-provided Azure search path. |
env.search_mode: parallel |
Opt in to Parallel’s hosted Search MCP. Requires openai_chat or qwen_chat and the parallel extra. |
env.search_timeout_seconds |
Whole MCP discovery/search deadline in seconds (default 20). |
env.search_max_num_results |
Maximum number of Parallel evidence results per round (default 4). |
env.max_queries_per_turn / env.max_tool_turns |
Bound model-requested queries and model rounds. |
Parallel Search MCP
is never selected automatically. It is used only when you set
env.search_mode=parallel explicitly, for example with
--cfg-options env.search_mode=parallel. It also needs the optional MCP
client, installed with pip install 'skillopt[parallel]'; selecting the mode
without that extra raises an error naming the install command. Every other
mode, and every OfficeQA import, works without mcp installed.
Data boundary. When this mode is selected, each search round sends data
to Parallel’s hosted endpoint at https://search.parallel.ai/mcp: the
model’s generated <search_queries>, and the full text of the task
question as the MCP objective argument. Do not select this mode for
tasks whose question text cannot leave your environment. Requests are
anonymous — they carry no PARALLEL_API_KEY and no saved MCP credentials —
so they run on the anonymous, lower-rate free tier described in Parallel’s
documentation. That tier is rate-limited, not unmetered: expect throttling on
sustained runs, and use a keyed provider for large sweeps. Rate-limit and
other service errors fail
the rollout with a search diagnostic; an explicit provider never silently
falls back to another one.
Parallel search does not require a local OfficeQA document corpus; parsed source-page context is included when that corpus is available. This mode changes the evidence source, so its scores are not directly comparable to, and are not a reproduction of, the paper’s Google-backed search setting.
| Variable | Description |
|---|---|
AZURE_OPENAI_ENDPOINT |
Shared Azure endpoint or compatibility base URL |
AZURE_OPENAI_API_VERSION |
Azure API version |
AZURE_OPENAI_AUTH_MODE |
api_key, azure_cli, managed_identity, or openai_compatible |
AZURE_OPENAI_API_KEY |
Key for api_key or openai_compatible mode |
AZURE_OPENAI_AD_SCOPE |
Optional AAD scope |
AZURE_OPENAI_MANAGED_IDENTITY_CLIENT_ID |
Optional managed-identity client ID |
Use OPTIMIZER_AZURE_OPENAI_* and TARGET_AZURE_OPENAI_* for role-specific
overrides.
| Variable suffix | Shared / per-role forms |
|---|---|
BASE_URL |
OPENAI_COMPATIBLE_BASE_URL, OPTIMIZER_OPENAI_COMPATIBLE_BASE_URL, TARGET_OPENAI_COMPATIBLE_BASE_URL |
API_KEY |
Corresponding shared/optimizer/target *_API_KEY names |
MODEL |
Corresponding shared/optimizer/target *_MODEL names |
TEMPERATURE |
Corresponding shared/optimizer/target *_TEMPERATURE names |
MAX_TOKENS |
Corresponding shared/optimizer/target *_MAX_TOKENS names |
TIMEOUT_SECONDS |
Corresponding shared/optimizer/target *_TIMEOUT_SECONDS names |
The train/eval entry points set deployments from YAML model.optimizer and
model.target after backend initialization. For selected OpenAI-compatible or
Qwen roles, those values override the corresponding *_MODEL environment
variables; the environment model names mainly seed direct library use.
Other backend families use the authenticated Claude CLI (CLAUDE_CLI_BIN;
optionally ANTHROPIC_API_KEY), QWEN_CHAT_*, and MINIMAX_*.
SkillOpt-Sleep’s compatible endpoint uses AZURE_OPENAI_*, not the research
backend’s OPENAI_COMPATIBLE_*; see
the Sleep endpoint guide.