底层模型配置切换器 for pi(cc-switch 风格)
pi-switch 是一个基于 Tauri 2 的桌面应用,用于管理 pi 编程助手的「底层模型配置」—— 把 provider / model / 认证凭证打包成一个个 profile,一键切换写入 pi 的实时配置文件, 免去手动编辑 JSON 的麻烦。
- Profile 管理:新建 / 编辑 / 复制 / 删除多套模型配置
- 一键切换:把选中 profile 的 provider、auth、默认模型写入 pi 的实时配置
- 从当前配置导入:抓取 pi 当前的
settings.json/models.json/auth.json存为新 profile - 模型列表拉取:调用 OpenAI 兼容的
/models端点,点选模型;支持版本段 URL、 Anthropic 兼容子路径等多种 baseURL 格式 - 拖拽排序:手动模式下卡片可拖拽,顺序持久化
- 漂移检测:当 live 配置与当前 profile 不一致(可能被外部修改)时显示警告徽章
- 系统托盘:常驻托盘,关闭主窗口改为隐藏;托盘菜单可直接切换 profile
- 单实例:二次启动时聚焦已有窗口
- 暗色 / 亮色主题,窗口位置与尺寸跨启动持久化
- 导入 / 导出:整个 profile 库备份为 JSON
- 快捷键:
/聚焦搜索、Ctrl/Cmd+N新建、Ctrl/Cmd+S保存编辑、Esc关闭模态
- 前端:React 18 + TypeScript + Vite 5
- 后端:Rust + Tauri 2
- HTTP:reqwest (rustls)
- 跨平台:Windows / macOS / Linux
pi-switch/
├── src/ # 前端
│ ├── App.tsx # 主界面与状态编排
│ ├── api.ts # Tauri invoke 封装
│ ├── types.ts # 前后端共享类型
│ ├── hooks.ts # 主题 / 窗口状态
│ ├── components/ # ProviderCard / ProfileEditor / 等组件
│ └── styles.css
└── src-tauri/
├── src/
│ ├── main.rs # Tauri Builder、单实例、托盘、窗口事件
│ ├── commands.rs # 暴露给前端的 #[tauri::command]
│ ├── config.rs # 路径解析 + 原子 JSON 读写
│ ├── profile.rs # Profile / Store + 写入 live 配置
│ ├── model_fetch.rs # 拉取 /models 端点
│ └── tray.rs # 系统托盘菜单
├── Cargo.toml
└── tauri.conf.json
所有配置位于 ~/.pi/agent/(Windows 下为 C:\Users\<你>\.pi\agent\):
| 文件 | 说明 |
|---|---|
pi-switch.json |
pi-switch 自身状态(profiles / current / order) |
settings.json |
pi 设置 — 切换时写入 defaultProvider / defaultModel / defaultThinkingLevel |
models.json |
pi 模型定义 — 切换时 upsert providers.<name> |
auth.json |
pi 凭证 — 切换时 upsert <authKey> |
写入采用原子操作(先写临时文件再 rename),避免中途崩溃损坏配置。
- Node.js ≥ 18
- Rust (stable)
- Tauri 2 前置依赖
npm install
npm run tauri devnpm run tauri build产物位于 src-tauri/target/release/bundle/。
切换一个 profile 时,pi-switch 会:
- 把
providerConfig浅合并写入models.json的providers.<provider> - 把
authCredential写入auth.json的<authKey> - 在
settings.json设置defaultProvider/defaultModel/defaultThinkingLevel - 在
pi-switch.json记录current指向该 profile,并刷新托盘菜单
若 profile 的 providerConfig.baseUrl 为空,则视为使用 pi 内置 provider(仅写默认模型,
不写入自定义 provider 定义)。