Skip to content

Repository files navigation

msw

npm | GitHub

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)"

Shell 配置

推荐在 ~/.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

示例:

{
  "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",
    },
  },
}

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 exports

OpenCode 需要先 sync 再 switch:

msw sync opencode
msw switch opencode openrouter

Agent 行为

Claude Code:

  • msw switch claude <provider> 更新 ~/.msw/config.jsoncactive.claude
  • 同时清理 ~/.claude/settings.jsonenv 字段的 ANTHROPIC_*,避免 settings 覆盖 shell env。
  • Claude Code 不支持在 settings.jsonenv 中展开 $VAR,所以运行时变量由 msw env claude 直接导出。

Claude 模型覆盖

Claude Code 有三个内置模型槽位 — haikusonnetopus — 分别对应 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.jsoncactive.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_providermodel[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>

恢复查找顺序:

  1. 优先使用 agent 配置同目录下的固定 bak 文件。
  2. 如果同目录 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

About

统一管理 Claude Code、Codex、OpenCode 的 provider 配置。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages