一个 macOS 菜单栏常驻的小工具,把你在多个 AI 服务(DeepSeek 官方、OpenAI/ChatGPT、Claude、GLM 智谱、通义 Qwen,以及各种 New API / One API 中转站)的预付费余额聚到一个图标里。
不再登录各个平台来回切,只看菜单栏就够了。
截图:当前配置名(带真实品牌 logo)、余额、运行状态、显示开关、所有配置(打勾切换当前配置)、添加/编辑/删除配置。
- 原生 macOS 菜单栏 app:纯 Swift + AppKit,只依赖 Xcode Command Line Tools(无需完整 Xcode),用 Swift Package Manager + Makefile 一键构建。
- 单图标 + 三段信息:
▶ 状态 | 白色 logo | ¥余额,用白色竖线分隔,三段垂直居中,整体深色菜单栏上一致。 - 真实品牌 logo:OpenAI/ChatGPT、DeepSeek、Claude、GLM 智谱、Qwen 通义。菜单栏用白色版(暗底可读),下拉菜单用品牌色版,hover 高亮时图标跟随文字变白。
- 自动探测余额接口:填 Base URL 和 API Key 后自动尝试识别(DeepSeek 官方、OpenAI 风格、New API / One API 通用、未知域名候选探测),失败兜底常见路径;401/403 时给出"中转站余额接口可能需要用户令牌而非 API Key"的提示。
- URL 规范化:直接粘 Agent 里的完整 endpoint(如
https://x.com/v1/chat/completions)也行,自动剥路径只留 scheme+host。 - 多配置 + 快速切换:下拉菜单列出所有配置,当前配置打勾,点击切换;菜单栏图标实时跟随切换。
- 添加 / 编辑 / 删除配置:用原生 NSWindow 表单(名称、Base URL、API Key、低余额阈值、模型/提供商),保存时自动探测;删除有原生 NSAlert 确认。
- 低余额提醒:定时刷新(默认 5 分钟)后余额低于阈值时发 macOS 系统通知。
- 本地存储:所有配置保存在
~/Library/Application Support/TokenBoard/config.json,纯本地,不联网。
- macOS 14+
- Apple Silicon (arm64)
- Xcode Command Line Tools(
xcode-select --install)即可编译,无需完整 Xcode。
# 直接构建 .app
make app
# 构建并打包 DMG(可用于分发)
make dmg产物:TokenBoard.app、TokenBoard.dmg。.app 已用 codesign --force --deep --sign - 自签名(仅本机信任);DMG 可直接分发给同架构用户。
open TokenBoard.app首次启动:
- 点击菜单栏图标(默认空状态显示 OpenAI 图标)。
- 选择「添加配置…」。
- 填写:名称 / Base URL(支持完整 endpoint)/ API Key / 低余额阈值 / 模型提供商。
- 保存 → app 自动探测余额接口路径。
- 添加成功后菜单栏立即开始显示该渠道的余额、状态。
⚠️ 中转站余额查询如果失败(HTTP 401/403),大多数情况是该中转站需要用户访问令牌(在网页面板登录后获取),而不是聊天用的sk-...key。
| 提供方 | 接口 | 解析字段 |
|---|---|---|
| DeepSeek 官方 | GET /user/balance |
balance_infos[0].total_balance |
| OpenAI 兼容(dashboard) | GET /dashboard/billing/credit_grants |
total_available_credits |
| New API / One API | GET /api/user/info |
data.balance 或 data.quota |
| 未知域名探测 | 依次尝试 user/balance、v1/usage、api/user/info、dashboard/billing/credit_grants 等 |
balance / quota / credit / total_available_credits 等启发式 |
| 自定义 | 任意路径 + JSON 路径 | 你填什么就解析什么 |
token-board/
├── Sources/main.swift # 全部源码(单文件)
├── Package.swift # SPM 配置
├── Makefile # 构建 / 打包
├── Info.plist # app 元数据
├── AppIcon.icns + icon_*.png # app 图标(含生成脚本 gen_icon.py)
├── logos/ # 品牌 logo SVG(彩色版 + 白色版各 5 个)
│ ├── openai.svg openai_w.svg
│ ├── deepseek.svg deepseek_w.svg
│ ├── claude.svg claude_w.svg
│ ├── glm.svg glm_w.svg
│ └── qwen.svg qwen_w.svg
├── docs/screenshot.png # README 截图
├── .gitignore
└── README.md
- 单图标 + 当前配置:用菜单列出所有配置、打勾切换当前。比"每服务一个菜单栏图标"更符合"切换"的直觉。
- 状态用形状而非颜色:播放▶ / 暂停⏸ 都用白色(与菜单栏文字一致),用形状区分正常/异常,避免深色菜单栏上彩色突兀。
- 品牌色 vs 白色 logo:菜单栏暗底 → 白色版;下拉菜单明亮 / hover → 品牌色版;hover 高亮时通过
NSMenuDelegate.menu(_:willHighlight:)动态切到白色,保持与文字同步。
MIT
