>- change the default model, add model definitions, and fix model-config failures — 401 "Invalid token", "No available channel / model not found", thinking-level rejections ("Thinking level X is not supported"), and config edits that don't take effect. Use whenever the user wants to switch/upgrade/rollback the OpenClaw model (切换模型/换模型/ 升级模型), or says the OpenClaw/龙虾 bot's model is misconfigured (模型配的错了), or the bot falls back / errors on LLM calls.
npx skills add https://github.com/daymade/claude-code-skills --skill openclaw-model-switch
Switch or repair an OpenClaw instance's model configuration by safely editing openclaw.json.
Diagnose before you edit. Model failures on OpenClaw are usually NOT the model id —
they are key routing (env hijack), provider-plugin restrictions, or endpoint/model mismatch.
Changing the model id without checking these first is how a 5-minute fix becomes a 2-hour
debugging session. The full trap catalog with discovery commands lives in
references/troubleshooting-model-config.md — read it
the moment anything errors.
Do NOT assume a hardcoded path. Candidate locations (check all, edit all that exist):
~/.openclaw/openclaw.json — the gateway's live config on most installs~/.kimi/kimi-claw/openclaw.json — Kimi Claw mirror, kept in sync on some installs~/.kimi_openclaw/openclaw.json — legacy desktop pathConfirm which one the gateway actually reads: openclaw gateway status prints
Config (service): <path>. If several exist, treat them as mirrors: **edit all of them
identically**, otherwise the next sync overwrites your fix.
Never trust a relay's model listing (GET /v1/models on new-api style relays is frequently
incomplete — a model can be absent from the list yet serve fine). The only authority is a
real completion probe from the host that will run the bot:
curl -sS -o /tmp/probe.json -w "HTTP %{http_code}\n" \
-X POST "<baseUrl>/v1/messages" \
-H "Authorization: Bearer <apiKey>" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{"model":"<model-id>","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'
Expected: HTTP 200 and a content array in the body. 401 Invalid token with a token you
just verified works elsewhere → the wire key is being hijacked (see trap #1 in the
troubleshooting reference). 503 No available channel → the model is not served for this
token/group from this network (trap #3) — pick a served model or fix the relay, don't
blind-switch.
python3 scripts/switch-model.py <model-id> --restart
# target a specific provider instead of the guessed one:
python3 scripts/switch-model.py k3 --provider kimi-relay --restart
# explicit config path (skips discovery):
python3 scripts/switch-model.py k3 --config ~/.openclaw/openclaw.json --restart
The script: discovers and backs up every candidate config to <config-dir>/config-backups/,
adds the model definition if known, sets agents.defaults.model.primary, syncs mirror
files, and restarts the gateway with --restart.
A restarted gateway proves nothing. Run one real agent turn and read the result metadata:
openclaw agent --local --json --agent main --session-id verify-$(date +%s) -m "ping"
Success looks like: "result": "success", "fallbackUsed": false, and the gateway log shows
agent model: <provider>/<model> (thinking=...). "result": "success" with
fallbackUsed: true means your target failed and a fallback saved the turn — the config is
still wrong.
| Symptom | Most likely trap |
|---|---|
| LLM error new_api_error: Invalid token, but the token works in curl | Trap #1 — env KIMI_API_KEY hijacks the provider's wire key |
| Thinking level "max" is not supported ... Use one of: off, on | Trap #2 — kimi-provider plugin hardcodes binary thinking; bypass with a custom provider |
| Thinking level ... Use one of: off, minimal, low, medium, high | Trap #2 variant — anthropic-messages base profile; unlock via params.canonicalModelId |
| 503 No available channel for model X under group default | Trap #3 — model not served for this group/network; listing ≠ availability |
| Edit saved + gateway restarted, nothing changed | Trap #5 — edited the wrong file / mirror not synced |
config-backups/ first)apiKey, headers, plugin configs, and env blocks — retype only the fields you mean to changepython3 -m json.tool openclaw.json > /dev/nullCreate new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
Access NCBI GEO for gene expression/genomics data. Search/download microarray and RNA-seq datasets (GSE, GSM, GPL), retrieve SOFT/Matrix files, for transcriptomics and expression analysis.
Bayesian modeling with PyMC. Build hierarchical models, MCMC (NUTS), variational inference, LOO/WAIC comparison, posterior checks, for probabilistic programming and inference.
Multi-objective optimization framework. NSGA-II, NSGA-III, MOEA/D, Pareto fronts, constraint handling, benchmarks (ZDT, DTLZ), for engineering design and optimization problems.
Statistical modeling toolkit. OLS, GLM, logistic, ARIMA, time series, hypothesis tests, diagnostics, AIC/BIC, for rigorous statistical inference and econometric analysis.
Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
Write docstrings for PyTorch functions and methods following PyTorch conventions. Use when writing or updating docstrings in PyTorch code.
Take daymade/openclaw-model-switch from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.