msw 用来统一管理 Claude Code、Codex、OpenCode 的 provider 配置。
Provider 保存在 ~/.msw/config.jsonc。API key 只保存在这个文件里;写入各 agent 配置时只写环境变量名或引用,不写明文 key。
安装:
pnpm install -g @jackgreen/msw添加 provider:
msw add openrouter \
--base-url https://openrouter.ai/api/v1 \
--api-key sk-... \
--model openai/gpt-4o \
--name OpenRouter切换 agent:
msw switch codex openrouter
msw switch claude openrouter
msw sync opencode
msw switch opencode openrouter注入环境变量到当前 shell:
eval "$(msw env claude)"
eval "$(msw env codex)"
# 或一次性注入所有 active agent 的环境变量
eval "$(msw env --all)"推荐在 ~/.zshrc 中添加以下内容,新 shell 自动加载环境变量,且 msw switch 后无需执行 eval 环境变量:
# --- msw runtime env ---
msw() {
command msw "$@"
local ret=$?
if [[ $ret -eq 0 && "$1" == "switch" ]]; then
eval "$(command msw env --all)"
fi
return $ret
}
eval "$(command msw env --all)"
# --- msw runtime env ---修改后重启 shell:
exec zsh| 环境变量 | agent |
|---|---|
ANTHROPIC_BASE_URL |
claude |
ANTHROPIC_AUTH_TOKEN |
claude |
ANTHROPIC_MODEL |
claude |
ANTHROPIC_DEFAULT_SONNET_MODEL |
claude |
ANTHROPIC_DEFAULT_OPUS_MODEL |
claude |
ANTHROPIC_DEFAULT_HAIKU_MODEL |
claude |
MSW_CODEX_API_KEY |
codex |
MSW_OPENCODE_<PROVIDER_ID>_API_KEY |
opencode |
主配置文件:
~/.msw/config.jsonc
示例:
Provider 可为不同 agent 设置不同 baseURL,例如 Claude 使用 Anthropic-compatible 端点,Codex/OpenCode 使用 OpenAI-compatible 端点:
{
"baseURL": "https://openrouter.ai/api/v1",
"baseURLs": {
"claude": "https://openrouter.ai/api/anthropic",
},
}Model 可配置 limit.context 指定上下文窗口大小。msw env claude 会导出带有 [1M] 标记的 model,Claude Code 据此判断是否启用长上下文:
{
"defaultModel": "mimo-v2.5-pro",
"models": {
"mimo-v2.5-pro": {
"name": "mimo-v2.5-pro",
"limit": {
"context": 1048576
}
}
}
}Claude 支持为 sonnet/opus/haiku 分别指定不同模型:
msw switch claude mimo-cn --haiku mimo-v2.5配置文件中对应:
{
"active": {
"claude": {
"provider": "mimo-cn",
"model": "mimo-v2.5-pro",
"modelOverrides": {
"haiku": "mimo-v2.5"
}
}
}
}msw list # 查看 providers 和 active 状态
msw status # 查看配置文件路径和 active 状态
msw add <id> --base-url ... --api-key ... --model ... [--name ...] # 添加 provider
msw delete <id> [--force] # 删除 provider
msw switch <agent> <provider> # 切换 agent 的 provider
msw switch <agent> <provider> --model <model> # 临时指定模型
msw switch claude <provider> --model <model> --haiku # 覆盖 haiku 槽位
msw switch claude <provider> --model <model> --sonnet # 覆盖 sonnet 槽位
msw switch claude <provider> --model <model> --opus # 覆盖 opus 槽位
msw sync opencode # 同步所有 provider 到 OpenCode
msw env <agent> [provider] [--model <model>] # 打印 shell exports(无 active provider 时静默退出)
msw env --all # 打印所有 active agent 的 shell exportsOpenCode 需要先 sync 再 switch:
msw sync opencode
msw switch opencode openrouterClaude Code:
msw switch claude <provider>更新~/.msw/config.jsonc的active.claude。- 同时清理
~/.claude/settings.json中env字段的ANTHROPIC_*,避免 settings 覆盖 shell env。 - Claude Code 不支持在
settings.json的env中展开$VAR,所以运行时变量由msw env claude直接导出。
Claude Code 有三个内置模型槽位 — haiku、sonnet、opus — 分别对应 ANTHROPIC_DEFAULT_*_MODEL 环境变量。msw 支持单独覆盖每个槽位:
# haiku 请求使用 gpt-mini(后台任务、低成本调用)
msw switch claude openai --model gpt-4o --haiku
# 单独覆盖 sonnet 和 opus
msw switch claude deepseek --model deepseek-chat --sonnet
msw switch claude deepseek --model deepseek-reasoner --opus--haiku、--sonnet、--opus 标志需要配合 --model 使用,指定的模型仅应用于对应槽位。基础模型(不带标志)用于 ANTHROPIC_MODEL。未设置的槽位回退到基础模型。
| 标志 | 设置的环境变量 |
|---|---|
--haiku |
ANTHROPIC_DEFAULT_HAIKU_MODEL |
--sonnet |
ANTHROPIC_DEFAULT_SONNET_MODEL |
--opus |
ANTHROPIC_DEFAULT_OPUS_MODEL |
模型覆盖会持久保存在 ~/.msw/config.jsonc 的 active.claude.modelOverrides 中,切换到同一 provider 时保留。切换到不同 provider 会替换覆盖配置。
上下文窗口标记: 如果模型的 context 限制 ≥ 1M tokens,msw 会自动在模型名后追加 [1m](如 claude-haiku-3-5[1m]),Claude Code 据此启用长上下文路径。
Codex:
msw switch codex <provider>更新~/.codex/config.toml。- 写入
model_provider、model和[model_providers.<id>]。 - 写入
env_key = "MSW_CODEX_API_KEY",不写 API key 明文。
OpenCode:
msw sync opencode把~/.msw/config.jsonc中所有 provider 同步到~/.config/opencode/opencode.json。msw switch opencode <provider>只更新 OpenCode 当前 active model,例如"model": "openrouter/openai/gpt-4o"。- provider key 使用
{env:MSW_OPENCODE_<PROVIDER_ID>_API_KEY}。
恢复某个 agent 到第一次被 msw 修改前的配置:
msw switch codex origin
msw switch claude origin
msw switch opencode origin恢复后,msw 会清理 ~/.msw/config.jsonc 中对应的 active.<agent>。
恢复查找顺序:
- 优先使用 agent 配置同目录下的固定 bak 文件。
- 如果同目录 bak 不存在,再使用
~/.msw/backups/<agent>/下的固定 bak 文件。
固定 bak 路径:
~/.codex/config.msw-bak.toml
~/.msw/backups/codex/config.msw-bak.toml
~/.claude/settings.msw-bak.json
~/.msw/backups/claude/settings.msw-bak.json
~/.config/opencode/opencode.msw-bak.json
~/.msw/backups/opencode/opencode.msw-bak.json
第一次修改某个 agent 配置前,msw 会按上面的路径保存原始配置。后续普通备份仍会写入带时间戳的文件,但不会覆盖固定 bak。
恢复 origin 后,当前 shell 中旧的环境变量不会自动消失。使用了上面的 msw 函数包装,switch 到 origin 时会自动 unset。如需手动清理,exec zsh 即可。
pnpm install
pnpm dev -- --help本地全局使用:
pnpm install
pnpm build
pnpm link --global
msw --help开发检查:
pnpm check
pnpm test
pnpm build
{ "version": 1, "providers": { "openrouter": { "name": "OpenRouter", "baseURL": "https://openrouter.ai/api/v1", "apiKey": "sk-...", "defaultModel": "openai/gpt-4o", "models": { "openai/gpt-4o": { "name": "openai/gpt-4o", }, }, }, }, "active": { "codex": { "provider": "openrouter", "model": "openai/gpt-4o", }, }, }