Claude Code 多窗口配置:每个窗口使用不同的 API Key

前言

用 Claude Code 写代码的时候,你可能遇到过这些场景:

  • 手上有多个 API Key(不同提供商、不同额度),想同时用起来
  • 一个窗口跑主力项目,另一个窗口做实验,互不干扰
  • 某个 API 节点挂了,想快速切到备用节点继续干活

Claude Code 默认读取全局配置,所有窗口共享同一套环境变量。但其实它提供了一个 --settings 参数,可以在启动时注入自定义配置,覆盖默认的环境变量。利用这个机制,我们可以为每个窗口写一个独立的启动脚本,各自配置不同的 API Key、Base URL 和模型。

本文就来聊聊怎么实现这个方案。

核心原理

Claude Code 的 --settings 参数接受一个 JSON 字符串,其中 env 字段可以设置环境变量。这些环境变量会覆盖系统默认值,仅在当前会话中生效。

关键的环境变量有:

变量名 作用
ANTHROPIC_AUTH_TOKEN API 密钥
ANTHROPIC_BASE_URL API 端点地址
ANTHROPIC_MODEL 默认使用的模型
ANTHROPIC_DEFAULT_SONNET_MODEL Sonnet 模型 ID
ANTHROPIC_DEFAULT_OPUS_MODEL Opus 模型 ID
ANTHROPIC_DEFAULT_HAIKU_MODEL Haiku 模型 ID
ANTHROPIC_REASONING_MODEL 推理模型 ID

每个启动脚本通过 claude --settings '{...}' 传入不同的配置,就能实现窗口级别的隔离。

实现步骤

1. 创建脚本目录

先找个地方放启动脚本:

1
2
mkdir -p ~/claude-scripts
cd ~/claude-scripts

2. 编写启动脚本

每个脚本对应一套独立的 API 配置。以下是三个示例脚本的模板:

脚本一:主力配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# claude-main.sh - 主力账号,日常开发使用

claude --settings '{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-your-main-api-key-here",
"ANTHROPIC_BASE_URL": "https://your-main-api-endpoint.com",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4.5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4.6",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4.5",
"ANTHROPIC_MODEL": "claude-opus-4.6",
"ANTHROPIC_REASONING_MODEL": "claude-opus-4.6"
}
}'

脚本二:备用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# claude-backup.sh - 备用账号,备用开发环境

claude --settings '{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-your-backup-api-key-here",
"ANTHROPIC_BASE_URL": "https://your-backup-endpoint.com/claude",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4.5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4.6",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4.5",
"ANTHROPIC_MODEL": "claude-opus-4.6",
"ANTHROPIC_REASONING_MODEL": "claude-opus-4.6"
}
}'

脚本三:测试配置(精简模式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# claude-test.sh - 测试账号,实验性功能

claude --settings '{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-your-test-api-key-here",
"ANTHROPIC_BASE_URL": "https://your-test-endpoint.com",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5-20251001",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-5-20251101",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4.6",
"ANTHROPIC_MODEL": "claude-opus-4-5-20251101",
"ANTHROPIC_REASONING_MODEL": "claude-opus-4-5-20251101",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
}
}'

测试脚本中额外设置了 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC1,这会禁用非必要的网络请求(如遥测数据),适合在不稳定的网络环境下使用。

3. 赋予执行权限

1
chmod +x ~/claude-scripts/claude-*.sh

4. 在不同终端窗口中启动

1
2
3
4
5
6
7
8
# 终端窗口 1 - 主力配置
~/claude-scripts/claude-main.sh

# 终端窗口 2 - 备用配置
~/claude-scripts/claude-backup.sh

# 终端窗口 3 - 测试配置
~/claude-scripts/claude-test.sh

每个窗口都是独立的 Claude Code 会话,使用各自的 API Key 和端点,互不影响。

进阶:配置 Shell 别名

每次输入完整路径太麻烦,可以在 ~/.zshrc(或 ~/.bashrc)中添加别名:

1
2
3
4
# Claude Code 多窗口别名
alias cm='~/claude-scripts/claude-main.sh'
alias cb='~/claude-scripts/claude-backup.sh'
alias ct='~/claude-scripts/claude-test.sh'

保存后执行 source ~/.zshrc,之后只需要输入 cmcbct 就能快速启动对应配置。

如果你想让别名启动后自动进入某个项目目录,可以这样写:

1
2
alias cm='cd ~/projects/main-project && ~/claude-scripts/claude-main.sh'
alias cb='cd ~/projects/side-project && ~/claude-scripts/claude-backup.sh'

进阶:快速扩展新配置

拿到新的 API Key 了?复制一份脚本改改就行:

1
cp ~/claude-scripts/claude-main.sh ~/claude-scripts/claude-new.sh

然后编辑 claude-new.sh,替换 ANTHROPIC_AUTH_TOKENANTHROPIC_BASE_URL 即可。

进阶:使用 tmux 统一管理多窗口

为什么需要 tmux?

开 3 个配置来回切;终端误关全掉;SSH 断线丢现场;重启后要重开一堆窗口。

下面默认你已经装好 tmux,并且 ~/claude-scripts/ 里放着可执行的启动脚本(例如 claude-main.shclaude-backup.shclaude-test.sh)。

tmux 基础操作

目的 命令/快捷键
创建会话 tmux new -s session-name
创建窗口 Ctrl+b c
切换窗口 Ctrl+b 0/1/2Ctrl+b n(下一个)、Ctrl+b p(上一个)
窗口列表 Ctrl+b w
分离会话 Ctrl+b d
附加会话 tmux attach -t session-name
列出会话 tmux ls

方案一:手动在 tmux 窗口中启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
# 步骤 1:创建 tmux 会话
tmux new -s claude-work

# 步骤 2:在窗口 0 启动主力配置
~/claude-scripts/claude-main.sh

# 步骤 3:创建新窗口(Ctrl+b c)并启动备用配置
~/claude-scripts/claude-backup.sh

# 步骤 4:再创建一个窗口启动测试配置
~/claude-scripts/claude-test.sh

# 切换窗口:Ctrl+b 0/1/2

这种方式适合临时使用:灵活、随开随用;但每次都要手动建窗口和逐个启动。

方案二:tmux 自动化启动脚本

创建一个完整的自动化脚本 ~/claude-scripts/start-claude-tmux.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env bash
# start-claude-tmux.sh - 一键启动 Claude Code 多窗口工作环境

SESSION_NAME="claude-multi"

# 检查会话是否已存在:存在就直接附加
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
echo "会话 $SESSION_NAME 已存在,直接附加..."
tmux attach-session -t "$SESSION_NAME"
exit 0
fi

# 创建新会话并启动第一个窗口(主力配置)
tmux new-session -d -s "$SESSION_NAME" -n "主力"
tmux send-keys -t "$SESSION_NAME:0" "~/claude-scripts/claude-main.sh" C-m

# 创建第二个窗口(备用配置)
tmux new-window -t "$SESSION_NAME:1" -n "备用"
tmux send-keys -t "$SESSION_NAME:1" "~/claude-scripts/claude-backup.sh" C-m

# 创建第三个窗口(测试配置)
tmux new-window -t "$SESSION_NAME:2" -n "测试"
tmux send-keys -t "$SESSION_NAME:2" "~/claude-scripts/claude-test.sh" C-m

# 选择第一个窗口
tmux select-window -t "$SESSION_NAME:0"

# 附加到会话
tmux attach-session -t "$SESSION_NAME"

赋予执行权限:

1
chmod +x ~/claude-scripts/start-claude-tmux.sh

使用方式:

1
~/claude-scripts/start-claude-tmux.sh

说明:

  • 自动检查会话是否存在,避免重复创建
  • 为每个窗口命名,方便识别
  • 一键启动完整工作环境
  • 适合日常使用

tmux 窗口命名和组织

  • 启动脚本里用 -n 命名窗口(如"主力/备用/测试"),一眼就知道哪个在跑哪套配置。
  • 运行中要改名:在 tmux 里按 Ctrl+b , 重命名。
  • 快速定位:Ctrl+b w 打开窗口列表,用方向键选中即可切过去。

会话持久化的优势

  • 关闭终端窗口,tmux 会话仍在后台运行
  • 随时 tmux attach 恢复工作状态
  • 适合长时间运行的任务(如大型项目重构)
  • SSH 断开也不影响会话

注意:tmux 会话在系统重启后会丢失。只有在不关机的情况下(关闭终端、SSH 断开等),会话才能保持。

示例场景:

1
2
3
4
5
6
7
8
9
10
# 早上启动工作环境
~/claude-scripts/start-claude-tmux.sh

# 临时需要关闭终端,分离会话
# (在 tmux 里按)Ctrl+b d

# 稍后重新附加
tmux attach -t claude-multi

# 所有对话历史和上下文都还在

不同模型版本的配置说明

--settings 中可以分别指定不同场景使用的模型版本:

  • ANTHROPIC_MODEL:默认模型,Claude Code 主要交互使用
  • ANTHROPIC_DEFAULT_SONNET_MODEL:当你用 /model sonnet 切换时使用的模型
  • ANTHROPIC_DEFAULT_OPUS_MODEL:当你用 /model opus 切换时使用的模型
  • ANTHROPIC_DEFAULT_HAIKU_MODEL:Haiku 模型,用于轻量级任务(如子代理)
  • ANTHROPIC_REASONING_MODEL:推理模型,用于需要深度思考的场景

你可以根据不同 API 提供商支持的模型来灵活配置。比如某个提供商只支持到 Sonnet 4.5,那就把 Opus 相关的也指向 Sonnet。

常见问题

Q: 多个窗口会共享对话历史吗?

不会。每个 claude --settings 启动的会话都是完全独立的,对话历史、上下文互不干扰。

Q: 能不能在同一个终端里切换配置?

不能直接切换。--settings 是启动时传入的,运行中无法修改。需要退出当前会话,用另一个脚本重新启动。

Q: API Key 放在脚本里安全吗?

脚本文件存在本地,只要你不把它提交到公开仓库就没问题。建议:

  • 将脚本目录加入全局 .gitignore
  • 设置文件权限为仅自己可读:chmod 600 ~/claude-scripts/claude-*.sh
  • 如果需要更高安全性,可以从环境变量或密钥管理工具中读取

Q: 不同窗口可以用不同的 Base URL 吗?

可以,这正是这个方案的优势之一。每个脚本可以指向完全不同的 API 端点,比如一个用官方 API,一个用第三方代理。

Q: tmux 和普通多终端窗口有什么区别?

简要对比:

  • 会话持久化:关闭终端不影响 tmux 会话(但系统重启会丢失)
  • 统一管理:一个命令启动所有窗口
  • 快捷键切换:Ctrl+b 0/1/2Alt+Tab 更精确
  • 远程友好:SSH 断开可以重新附加

Q: tmux 会话会共享环境变量吗?

默认不会"自动同步"。每个窗口在启动时继承当时的环境,之后各跑各的;你通过 tmux send-keys 在不同窗口里运行不同启动脚本,每个窗口各自加载自己的 API Key/配置,互不影响。

Q: 如何在 tmux 中快速切换窗口?

  • Ctrl+b 0/1/2/...:切换到指定编号的窗口
  • Ctrl+b n:下一个窗口
  • Ctrl+b p:上一个窗口
  • Ctrl+b w:显示窗口列表,用方向键选择
  • Ctrl+b l:切换到上一次使用的窗口
  • Ctrl+b & # 关闭当前窗口,需要确认

Q: tmux 会话意外断开怎么办?

tmux 会话在后台持续运行,即使终端关闭或 SSH 断开。重新连接的方法:

1
2
3
4
5
6
7
8
# 查看所有会话
tmux ls

# 附加到指定会话
tmux attach -t claude-multi

# 如果只有一个会话,可以简写
tmux attach

一般情况下,窗口里正在运行的 Claude Code 进程还在,工作状态也会保留。

Q: 可以同时使用 tmux 和 iTerm2/Windows Terminal 的多标签吗?

可以,但没必要。tmux 的窗口管理已经足够强大,而且有会话持久化的优势;建议选一种为主,避免"标签里套窗口"导致层级过多、越管越乱。

总结

Claude Code 的 --settings 参数是实现多窗口隔离的关键。通过为每个窗口编写独立的启动脚本,你可以:

  • 同时使用多个 API Key,充分利用不同账号的额度
  • 为不同项目配置不同的模型和端点
  • 某个节点出问题时快速切换到备用配置

如果你需要更高效的多窗口管理,tmux 是理想的搭档:

  • 一键启动完整工作环境,无需手动打开多个终端
  • 会话持久化,关闭终端也不丢失工作状态
  • 快捷键切换,比鼠标点击更快
  • 适合长时间运行的开发任务

两种方案可以结合使用:--settings 负责配置隔离,tmux 负责窗口统一管理。整个方案就是几个 shell 脚本的事,简单直接,没有额外依赖。