统一 Claude Code 与 Codex 配置和会话的 Rust TUI、CLI 与桌面 GUI。
管理 Claude Code 与 Codex 的多个 API 供应商配置,支持一键切换、代理转发、会话历史浏览。Claude Code 支持本地/代理模式,Codex 直接维护自身配置文件。
- Claude 四模型配置:每个 Profile 独立配置 Opus、Sonnet、Haiku、Subagent
- 双应用顶栏:顶栏显示
Claude | Codex,Space 切换当前应用上下文 - Codex 第三方模型:Provider 可使用 Codex 内置目录,或维护多个 Responses API 模型并生成聚合 Catalog
- 一键切换:本地模式直接写入
~/.claude/settings.json,代理模式更新 SQLite - 会话历史:分别扫描 Claude Code 与 Codex 本地会话文件,支持搜索、过滤
- 代理服务:本地 HTTP 代理(端口 15721),自动模型名转换,支持 systemd / launchd / 计划任务后台运行
- Token 用量:按模型统计 Token 消耗,带缓存避免每帧查询
- 多语言:内置中文 / English 切换,设置持久化
- 桌面会话工作区:通过可选的本地后端,在一个 GUI 中运行和恢复 Claude Code / Codex 会话
- 认证远程后端:独立 Remote 监听器、逐设备凭证、60 秒配对、单次 WebSocket 票据和终端控制租约
Nix 安装直接使用 GitHub Release 中经过固定 SHA-256 校验的预编译包,不会在本机编译 Rust 或 WebUI。目前该安装方式仅支持 x86_64-linux。
在 home.nix 中:
{
inputs.akironMux.url = "github:pomeluce/akiron-mux";
homeConfigurations = {
your-user = home-manager.lib.homeManagerConfiguration {
modules = [
akironMux.homeModules.default
{
programs.akmux = {
enable = true;
gui = true; # 默认 false,只安装 TUI/CLI
# 由 sops-nix/agenix 等部署到 Nix store 外;内容如 OPENAI_API_KEY=sk-xxx
envVars = "%h/.config/akmux/env";
defaults = {
version = 1;
claude_providers = [
{
id = "deepseek";
name = "DeepSeek";
api_url = "https://api.deepseek.com/anthropic";
api_key = "env:DEEPSEEK_API_KEY";
profiles = [
{
id = "v4"; name = "V4";
opus = "deepseek-v4-pro[1m]";
sonnet = "deepseek-v4-pro[1m]";
haiku = "deepseek-v4-flash";
subagent = "deepseek-v4-flash";
default = true;
}
];
}
];
# 官方 Codex 套餐对应的 OpenAI Provider 已内建;这里的配置
# 额外保留按 API Key 计费的 OpenAI API Provider。
codex_providers = [
{
id = "openai-api";
name = "OpenAI API";
api_url = "https://api.openai.com/v1";
api_key = "env:OPENAI_API_KEY";
}
];
};
};
}
];
};
};
}Home Manager 会自动:
- 将
defaults写入~/.config/akmux/defaults.toml gui = false只安装akmuxTUI/CLI;gui = true同时安装桌面 GUI- 安装并启用
akmux-proxysystemd user service(通过envVars传入 Nix store 外的环境文件路径) - 让 CLI/TUI 从同一个
envVars文件解析env:VAR_NAME,无需将密钥导入当前 shell
注意:defaults 会进入 Nix store,api_key 应只写 env:VAR_NAME 引用,不要写明文密钥。
在 configuration.nix 中:
{
inputs.akironMux.url = "github:pomeluce/akiron-mux";
outputs = { nixpkgs, akironMux, ... }: {
nixosConfigurations.your-host = nixpkgs.lib.nixosSystem {
modules = [
akironMux.nixosModules.default
{
services.akmux = {
enable = true;
gui = false;
defaults = {
version = 1;
claude_providers = [ ... ];
# 官方 Codex 套餐对应的 OpenAI Provider 已内建;这里的配置
# 额外保留按 API Key 计费的 OpenAI API Provider。
codex_providers = [
{
id = "openai-api";
name = "OpenAI API";
api_url = "https://api.openai.com/v1";
api_key = "env:OPENAI_API_KEY";
}
];
};
};
}
];
};
};
}NixOS 模块将配置写入 /etc/akmux/defaults.toml,并安装二进制包。
# 临时启动
nix run github:pomeluce/akiron-mux
# 安装到 profile
nix profile install github:pomeluce/akiron-muxbrew tap pomeluce/ccswitch
brew install akiron-muxcargo install --git https://github.com/pomeluce/akiron-mux首次运行会自动创建 ~/.config/akmux/。如果存在旧的 ~/.config/akiron-mux/ 或 ~/.config/ccswitch/,缺失文件会被复制迁移,旧目录不会删除或覆盖新数据。
从 Releases 下载:
# Debian/Ubuntu
VERSION=1.15.4
curl -LO "https://github.com/pomeluce/akiron-mux/releases/download/v${VERSION}/AkironMux-${VERSION}-linux-x86_64-cli.deb"
sudo dpkg -i "AkironMux-${VERSION}-linux-x86_64-cli.deb"
# Fedora/RHEL
curl -LO "https://github.com/pomeluce/akiron-mux/releases/download/v${VERSION}/AkironMux-${VERSION}-linux-x86_64-cli.rpm"
sudo rpm -i "AkironMux-${VERSION}-linux-x86_64-cli.rpm"
# 通用 tar.gz
curl -LO "https://github.com/pomeluce/akiron-mux/releases/download/v${VERSION}/AkironMux-${VERSION}-linux-x86_64-cli.tar.gz"
tar -xzf "AkironMux-${VERSION}-linux-x86_64-cli.tar.gz"
sudo mv akmux akmux-sessiond /usr/local/bin/VERSION=1.15.4
curl -LO "https://github.com/pomeluce/akiron-mux/releases/download/v${VERSION}/AkironMux-${VERSION}-macos-arm64-cli.tar.gz"
tar -xzf "AkironMux-${VERSION}-macos-arm64-cli.tar.gz"
chmod +x akmux akmux-sessiond
sudo mv akmux akmux-sessiond /usr/local/bin/从 Releases 下载 CLI zip 或 AkironMux GUI 安装包;CLI zip 中的 akmux.exe 与 akmux-sessiond.exe 可加入 %PATH%。
也可以通过 Scoop 安装:
scoop bucket add ccswitch https://github.com/pomeluce/scoop-ccswitch.git
scoop install ccswitch安装后执行 akmux service install 注册 Windows 计划任务后台服务。
akmux # 无参数启动 TUI左侧栏 J/K 选择标签页,Tab / Shift+Tab 切换,Enter 确认。
# 模型切换
akmux switch deepseek/v4 # 切换到指定的 provider/profile
akmux list # 列出所有 provider 和 profile
# 配置管理(仅对用户配置生效,系统默认不可删除/编辑)
akmux add provider # 交互式添加供应商
akmux add profile <provider-id> # 添加模型配置
akmux edit <provider|profile> # 查看配置
akmux remove <provider|profile> # 删除用户配置
# 代理服务
akmux proxy start # 后台启动代理(自动检测 systemd)
akmux proxy stop # 停止代理
akmux proxy status # 查看代理状态
akmux proxy serve # 前台运行代理(调试用)
akmux service install # 安装后台服务(开机自启)
akmux service uninstall # 卸载后台服务
# 服务安装平台支持:
# Linux → systemd user service
# macOS → launchd agent
# Windows → 计划任务 (Schtasks)
# 远程会话后端(17322 是明文 HTTP 监听器,只绑定 loopback、LAN 或 Tailnet 地址)
akmux backend remote configure --bind 127.0.0.1:17322 --public-url https://akmux.example.com
akmux backend device create --name "Bootstrap" --show-token
akmux backend remote enable
akmux backend remote status
akmux backend diagnostics
akmux backend audit --limit 50
# 60 秒桌面端/移动端配对;客户端提交后再确认 pending ID
akmux backend pair create
akmux backend pair pending
akmux backend pair confirm <pairing-id>
akmux backend pair cancel <pairing-id>
# 设备管理(输出不包含凭证明文)
akmux backend device list
akmux backend device revoke <token-id>
# 用量与历史
akmux usage # Token 用量统计(默认本周)
akmux usage --day|--week|--month # 按日/周/月
akmux usage --profile <name> # 按模型过滤
akmux history # 会话历史
akmux history --project <name> # 按项目过滤
akmux history --search <keyword> # 搜索会话
# Shell 补全 & Man 文档
akmux completions <zsh|bash|fish> # 生成 Shell 补全脚本
akmux man # 输出 roff 格式 man page配置文件位置:
~/.config/akmux/akmux.db— SQLite 数据库(模型配置、用量、会话和后端开关)~/.config/akmux/defaults.toml— 系统默认配置(Home Manager / NixOS 生成)~/.local/share/akmux/akmux.log— TUI 运行日志~/.codex/config.toml— Codex Provider 配置~/.codex/auth.json— 当前生效的 Codex 登录凭证或第三方 API Key~/.codex/auth_openai.json— 切换第三方 Provider 时备份的官方 Codex 登录凭证~/.codex/auth_akmux.json— 切回官方 Provider 时备份的第三方 API Key
首次启动 akmux 时会先显示终端进度条导入 Claude Code 历史会话数据(从 ~/.claude/projects/ 扫描 JSONL 文件)。导入完成后自动进入 TUI。后续启动跳过导入直接进入。
用量数据在进入 TUI 后通过后台异步扫描。Claude 数据来自 ~/.claude/projects,Codex 数据来自 ~/.codex/sessions;会话与用量面板约每秒检测变化并实时刷新。Codex rename 后的会话标题从 ~/.codex/session_index.jsonl 同步。带 parent_thread_id 的 Codex 内部子会话不会单独显示,其消息数和用量会归并到父会话;通过 /fork 创建的会话仍作为独立会话显示。
Remote API 默认监听 127.0.0.1:17322,该端口只提供明文 HTTP,自身不终止 TLS。同机反向代理可以直接使用 http://127.0.0.1:17322 作为上游,但不能把公网 HTTPS/TCP 流量直接转发到 17322,也不能把 https://127.0.0.1:17322 配置成上游。客户端填写的地址和 --public-url 都应是反向代理对外提供的 HTTPS 根地址,例如 https://akmux.example.com,不包含 /api 路径。
设备 Token 等同于宿主机当前用户权限下的终端控制凭证,应分别为每台设备创建并及时撤销;Token 明文只显示一次,数据库仅保存 HMAC 摘要,~/.config/akmux/remote-auth.pepper 必须与数据库一同备份。GUI 的“配对链接”输入框不接收设备 Token,只接收 akmux backend pair create 生成的短时 akmux://pair?... 链接;长期 Token 由原生客户端在配对过程中领取并写入系统凭证存储。
推荐让 Caddy 在同一主机终止 TLS:
akmux.example.com {
reverse_proxy http://127.0.0.1:17322
}也可以使用 Tailscale Serve 将 loopback 服务发布到 Tailnet:
tailscale serve --bg https / http://127.0.0.1:17322随后将 --public-url 配置为实际的 HTTPS 地址。AkironMux 不会自动修改 DNS、防火墙、Caddy 或 Tailnet;不要把 17322 的明文 HTTP 监听器直接暴露到公网。仅配置 DNS、TCP 端口映射或四层转发不能替代 TLS 反向代理。Remote 默认拒绝 wildcard 和公网 IP 直绑,只允许 loopback、私网、link-local 和 Tailnet/共享地址。确实需要容器或多网卡环境中的 wildcard 监听时,必须显式传入 --allow-wildcard-bind,并先通过主机防火墙、Tailnet ACL 或同机 TLS 反向代理限制 17322;该开关不会允许绑定具体公网 IP。
首次启用并把桌面 GUI 配对到远程后端时,按以下顺序操作:
-
在服务器配置 Remote,并创建一个临时引导设备。当前版本要求至少存在一个活动设备才能启用监听;
device create输出的 Token 不要粘贴到 GUI。akmux backend remote configure \ --bind 127.0.0.1:17322 \ --public-url https://akmux.example.com akmux backend device create --name "Bootstrap" --show-token akmux backend remote enable
-
确认会话后端服务正在运行,并分别检查明文上游和公网 HTTPS。两次请求都应返回
200与{"status":"ok"}。curl -i -H 'Host: akmux.example.com' http://127.0.0.1:17322/healthz curl -i https://akmux.example.com/healthz akmux backend diagnostics -
生成新的 60 秒配对链接,把完整的
akmux://pair?...链接粘贴到 GUI 的“配对链接”,后端地址填写同一个https://akmux.example.com。新建 Remote Profile 尚无凭证时应直接点击“保存”;“测试连接”只适用于已经配对并保存凭证的 Profile。akmux backend pair create
-
GUI 发起配对请求后,在服务器确认对应的 pending ID。
akmux backend pair pending akmux backend pair confirm <pairing-id>
-
GUI 配对成功后,可以撤销不再使用的临时引导设备,但不要撤销刚刚配对生成的客户端设备。
akmux backend device list akmux backend device revoke <bootstrap-token-id>
Claude 与 Codex Provider 分别使用 claude_providers 和 codex_providers;旧的 providers 字段不再支持。
version = 1
[[claude_providers]]
id = "deepseek"
name = "DeepSeek"
api_url = "https://api.deepseek.com/anthropic"
api_key = "env:DEEPSEEK_API_KEY"
[[claude_providers.profiles]]
id = "v4"
name = "V4"
opus = "deepseek-v4-pro[1m]"
sonnet = "deepseek-v4-pro[1m]"
haiku = "deepseek-v4-flash"
subagent = "deepseek-v4-flash"
default = true
[[claude_providers]]
id = "openrouter"
name = "OpenRouter"
api_url = "https://openrouter.ai/api"
api_key = "env:OPENROUTER_API_KEY"
[[claude_providers.profiles]]
id = "claude"
name = "Claude"
opus = "anthropic/claude-opus-4"
sonnet = "anthropic/claude-sonnet-4"
haiku = "anthropic/claude-haiku-4"
subagent = "anthropic/claude-haiku-4"
[[codex_providers]]
id = "codex-proxy"
name = "Codex Proxy"
api_url = "https://api.example.com/v1"
api_key = "env:OPENAI_API_KEY"
codex_catalog = "custom"
[[codex_providers.models]]
slug = "third-party-coder"
display_name = "Third-party Coder"
description = "Agentic coding model"
context_window = 128000
max_context_window = 256000
effective_context_window_percent = 95
default_reasoning_effort = "high"
supported_reasoning_efforts = ["low", "high"]
input_modalities = ["text"]
supports_parallel_tool_calls = true
support_verbosity = true
default_verbosity = "low"
supports_search_tool = false
default = true| 格式 | 说明 |
|---|---|
env:VAR_NAME |
从进程环境、HM 的 envVars 文件或 ~/.config/akmux/env 读取,推荐 |
sk-xxx... |
直接文本(明文存储,不安全) |
| 空值 | Claude 使用 $CLAUDE_API_KEY;Codex 使用 $OPENAI_API_KEY |
| 键 | 功能 |
|---|---|
Tab / Shift+Tab |
切换侧边栏标签页 |
Space |
切换顶栏 Claude | Codex Tab |
Q / q |
退出 |
Claude Code 使用 Provider → Profile,Codex 使用 Provider → Model。Codex 内置目录 Provider 不需要维护模型;第三方 Provider 必须配置至少一个模型。
| 键 | 功能 |
|---|---|
J/K ↑/↓ |
Provider 列表导航 / Profile 导航 |
Enter |
进入 Profile 列表 / 切换模型 |
A |
添加 Provider / Profile |
E |
编辑 Provider / Profile |
D |
删除 Provider / Profile(需确认) |
Esc |
返回 Provider 列表 |
| 键 | 功能 |
|---|---|
J/K ↑/↓ |
上下导航(循环滚动) |
Enter |
打开会话(根据顶栏启动 Claude Code 或 Codex) |
D |
删除会话(弹窗确认) |
/ |
搜索(分词匹配标题 + 项目名) |
Esc |
退出搜索 / 关闭弹窗 |
| 键 | 功能 |
|---|---|
J/K ↑/↓ |
导航模型列表 |
T |
切换时间范围(天/周/月) |
/ |
搜索模型 |
PgUp/PgDn |
滚动右侧日用量图表 |
左侧显示选中模型的今日/本周/总计/请求数统计卡片及模型排名。右侧显示选中模型的近 7 天用量柱状图。首次启动时用量数据在后台异步扫描,右侧面板显示扫描进度条。
单面板居中布局,所有设置项垂直排列。
| 键 | 功能 |
|---|---|
J/K ↑/↓ |
选择设置项 |
H/L ←/→ |
切换选项值 |
设置面板由 Claude 与 Codex 共用,支持切换主题(7 种)、模式(local / proxy)、语言(中文 / English)及会话后端。会话后端默认关闭;启用后才启动 akmux-sessiond 并监听 127.0.0.1:17321,关闭时立即停止。模式设置只对 Claude 生效;Codex 不区分 local/proxy。
切换 profile 时写入 Claude Code 的 settings.json。
| 环境变量 | 值 |
|---|---|
ANTHROPIC_AUTH_TOKEN |
解析后的 API key |
ANTHROPIC_BASE_URL |
上游 API 地址 |
ANTHROPIC_MODEL |
sonnet |
ANTHROPIC_DEFAULT_OPUS_MODEL |
opus |
ANTHROPIC_DEFAULT_SONNET_MODEL |
sonnet |
ANTHROPIC_DEFAULT_HAIKU_MODEL |
haiku(去 [1m]) |
CLAUDE_CODE_SUBAGENT_MODEL |
subagent(去 [1m]) |
| 环境变量 | 值 |
|---|---|
ANTHROPIC_AUTH_TOKEN |
ccswitch-proxy(占位符) |
ANTHROPIC_BASE_URL |
http://127.0.0.1:15721 |
Opus/Sonnet/Haiku 变量不在 settings.json 中设置,由 proxy server 透明处理;Subagent 使用内部标记以便代理识别并映射。
Codex 不使用 Claude Profile,也不区分 local/proxy。TUI 内建不可编辑的 OpenAI Provider,用于恢复官方 Codex 套餐。第三方 Responses Provider 的所有模型会聚合写入 ~/.codex/akmux/models.json。官方套餐和第三方都统一使用 AkironMux 保留的 akmux Provider ID,避免覆盖 Codex 内建的 openai,并保证两种认证方式创建的历史会话互相兼容:
model_provider = "akmux"
model = "third-party-coder"
model_reasoning_effort = "high"
model_catalog_json = "/home/user/.codex/akmux/models.json"
[model_providers.akmux]
name = "Codex Proxy"
base_url = "https://api.example.com/v1"
wire_api = "responses"
requires_openai_auth = true
[akmux.last_switch]
source = "codex-proxy"
at = "2026-01-01 12:00:00"切换到第三方 Provider 时,当前官方 auth.json 会移动到 auth_openai.json,然后创建只包含第三方 Key 的 auth.json:
{
"OPENAI_API_KEY": "解析后的 provider API key"
}切回内建 OpenAI 时,第三方 auth.json 会备份为 auth_akmux.json,auth_openai.json 恢复为 auth.json,并将 model_providers.akmux 更新为 name = "OpenAI"、base_url = "https://chatgpt.com/backend-api/codex"。其他使用 codex_catalog = "built-in" 的第三方 Provider 同样通过 model_providers.akmux 工作;切换这类 Provider 时,AkironMux 只移除自己管理的 model_catalog_json 引用,不覆盖其他外部 Catalog 文件。
直接修改 ~/.claude/settings.json 的 env 字段,Claude Code 直接访问上游 API。
akmux service install安装后台服务(或akmux proxy start手动启动)- 代理监听
127.0.0.1:15721 settings.json的ANTHROPIC_BASE_URL指向代理,Claude Code 所有请求经过代理- 代理自动进行模型名转换:
- 请求体:Opus/Sonnet/Haiku/Subagent 分别映射到对应 Profile 字段,并去除
[1m] - 响应流:
message.model还原为原始名称,注入ccs_model/ccs_proxy标记
- 请求体:Opus/Sonnet/Haiku/Subagent 分别映射到对应 Profile 字段,并去除
- 切换 profile 无需重启代理,代理每次请求从 DB 读取最新配置
- 自动记录 Token 用量到 SQLite
nix develop # 进入开发环境(Rust 工具链)
cargo build # 构建
cargo test # 测试
cargo run --bin akmux # 启动 TUI
nix build .#tui # 封装 Release 中的 TUI/CLI
nix build .#gui # 封装 Release 中的 TUI/CLI + 桌面 GUIRelease 工作流分为两个阶段,以保证 Tag 中记录的 hash 与最终发布文件完全一致:
- 在 GitHub Actions 中以目标 Tag 名运行
prepare,下载生成的 release candidate,并将其中的nix/release-assets.nix提交到仓库。 - 在该提交上创建并推送 Tag,再以 prepare run ID 运行
publish。publish 只会发布第一阶段保存的原始文件。
已发布的同名资产不可覆盖;内容变化时必须升级版本并创建新 Tag。
GPL-3.0