Files
codex-helper/README.md
T
wuxu 8997886eef
Frontend / quality (push) Canceled after 0s
feat: migrate account usage to CLIProxyAPI
2026-09-08 09:56:08 +08:00

250 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Codex Helper
一个单容器运行的 Codex 账户用量仪表盘。通过 CLIProxyAPI(CPA)Management API 读取已托管 Codex 凭据对应的 ChatGPT 账户、套餐、限额窗口、重置时间和每日 Token 历史,并支持 Telegram 与 SMTP 重置提醒。
## 功能
- 支持在同一总览页查看多个 Codex 账号或工作区(包括同一邮箱的个人订阅与 Team 工作区)
- 展示 Codex 账户、套餐、剩余额度和下次重置时间
- 展示当前重置周期 Token 合计、本周期单日峰值及每日 Token 趋势
- 有可用重置卡时展示卡片数量和到期时间
- 在本地 SQLite 中保留历史用量和限额快照
- 在限额重置前、重置后发送 Telegram 或邮件提醒
- 通过 Telegram 菜单查询当前用量、重置时间、历史概览和账户信息
- 初始化后无需登录即可查看公开只读账号总览;只有登录管理员后才能添加账号、同步用量和修改运行期配置
- 前端适配 320px 起的手机浏览器,支持移动底部导航、iOS 安全区与深浅主题
- React 前端、Go 后端和 SQLite 运行在同一个容器中;Codex OAuth 凭据统一由外部 CLIProxyAPI 管理
## 运行要求
- Docker Engine
- Docker Compose v2(使用 `docker compose` 命令)
- 已运行并启用 Management API 的 CLIProxyAPI 实例
- CLIProxyAPI 中至少一个可用的 Codex OAuth 凭据及其 `auth_index`
- Codex Helper 容器能够访问 CLIProxyAPI;CLIProxyAPI 能够访问 ChatGPT Codex 服务
项目不需要单独准备 OpenAI API Key,也不在本地执行 Codex 登录。Codex OAuth 登录、Token 保存和刷新全部由 CLIProxyAPI 负责;Codex Helper 只保存 CPA `authIndex`,并通过受 management key 保护的服务端请求读取数据。
## 安装
```bash
git clone git@github.com:zhoujun0601/codex-helper.git
cd codex-helper
cp .env.example .env
# 编辑 .env,填写 CLIProxyAPI Management API 地址和 management key
docker compose up -d --build
```
`.env` 至少包含:
```dotenv
CLIPROXY_API_BASE_URL=http://host.docker.internal:8317
CLIPROXY_API_MANAGEMENT_KEY=replace-with-management-key
```
如果 CLIProxyAPI 位于另一个容器网络,请把两个服务加入同一网络,并将 `CLIPROXY_API_BASE_URL` 改为对应服务名。Codex Helper 从另一个容器访问 CPA Management API 时,CPA 的 `remote-management.allow-remote` 必须允许该来源,且 `remote-management.secret-key` 必须已配置。
查看运行状态:
```bash
docker compose ps
docker compose logs -f codex-helper
```
容器健康后访问:
```text
http://服务器地址:8180
```
首次打开页面时创建管理员账号,并设置所在时区。用户名至少 3 位,密码至少 10 位。
初始化完成后,首页会显示已勾选“公开显示到未登录总览”的账号;点击“登录后配置”并使用管理员账号登录,才能进入设置中心添加账号、同步数据、修改账号公开状态或配置提醒。未勾选公开的账号只会在登录后的总览中显示。
> 首次初始化没有额外安装码。创建管理员之前,不要将端口直接暴露到不可信网络。公网部署应使用 HTTPS 反向代理,并限制初始化阶段的访问来源。
## 连接 Codex 账户
1. 先在 CLIProxyAPI 中完成 Codex OAuth 登录,确认凭据状态可用。
2. 从 CPA `GET /v0/management/auth-files` 或其管理面板取得该凭据的 `auth_index`。
3. 使用管理员账号登录 Codex Helper。
4. 打开“设置中心” → “Codex”。
5. 输入 CPA `authIndex`,选择预期的个人订阅或 Team / Business 类型,并点击“添加账号”。
6. Codex Helper 会先验证该索引唯一指向未禁用的 Codex 凭据,再读取账号信息和用量;成功后立即显示,之后固定每 5 分钟同步一次。
每条本地账号记录只保存一个 CPA `authIndex` 及显示配置,不保存 access token、refresh token 或 CPA management key。删除账号只删除 Codex Helper 中的绑定、历史快照和提醒记录,**不会删除 CLIProxyAPI 中的凭据**。
同一邮箱下的个人订阅与 Team 工作区应在 CPA 中保留为不同凭据,并分别使用各自的 `auth_index` 添加。Codex Helper 使用 CPA 返回的 ID token claims 和 `/wham/usage` 的真实套餐进行校验;未知新套餐会安全显示为 unknown,不会自动猜测类型。
## 通用设置与提醒时间
进入“设置中心” → “通用”,可设置:
- 时区:用于初始化配置;界面时间按浏览器本地时区显示
- 自动同步:服务器固定每 5 分钟同步全部账号
- 历史保留时间:30、60、90、180 或 365 天
- 提前提醒时间:重置前 1–1440 分钟
- 是否发送重置前提醒和重置后确认;重置后确认也会通过额度百分比回落识别并提醒官方活动、临时补发等提前重置
提醒只会针对通过 CLIProxyAPI 读取到的 Codex 限额窗口发送。发送失败的提醒会在计划时间后的六小时内自动重试。
## 配置 Telegram
1. 在 Telegram 中联系 [@BotFather](https://t.me/BotFather),使用 `/newbot` 创建 Bot,并取得 Bot Token。
2. 打开“设置中心” → “Telegram”。
3. 填写 Bot Token。
4. 点击“验证并保存”。
5. 点击“生成绑定码”。
6. 在 Telegram 中打开刚创建的 Bot,发送页面显示的命令,例如:
```text
/bind 123456
```
7. 收到“绑定成功”后,返回页面点击“发送测试”。
绑定码十分钟内有效,一个实例只绑定一个 Telegram 会话。绑定成功后会自动启用额度提醒和查询菜单,可使用以下按钮或命令。`/account` 会向已绑定会话显示账号的完整邮箱,因此只应绑定受信任的私有会话。
- 当前用量(包含所有已添加连接)
- 重置时间 / `/reset`
- 历史概览 / `/usage`
- 账户信息 / `/account`
- 立即刷新 / `/refresh`
服务器必须能够访问 `https://api.telegram.org`。
点击“解除绑定”会删除当前 Bot Token、Chat ID 和未使用的绑定码。该操作不可恢复,之后需要重新填写 Token 并绑定。
## 配置 SMTP 邮件
进入“设置中心” → “SMTP 邮件”,填写:
- SMTP 服务器和端口
- 用户名和密码或应用专用密码
- 加密方式:STARTTLS、隐式 TLS 或无加密
- 发件名称、发件地址和收件地址
- “启用邮件提醒”开关
保存后点击“发送测试邮件”。常见组合为 STARTTLS/587 或隐式 TLS/465,具体值以邮件服务商文档为准。密码使用 `/data/secret.key` 加密后存入 SQLite,不会由设置接口返回明文。
## 日常操作
更新项目:
```bash
git pull --ff-only
docker compose up -d --build
```
停止和重新启动:
```bash
docker compose stop
docker compose start
```
查看日志:
```bash
docker compose logs --tail=200 codex-helper
```
健康检查:
```bash
curl http://localhost:8180/health/live
curl http://localhost:8180/health/ready
```
## 数据、备份与恢复
所有持久数据位于 Docker 卷的 `/data`:
- `codex-helper.db`:管理员、设置、历史用量和通知记录
- `secret.key`:用于解密 SMTP 密码和 Telegram Token
Codex OAuth 凭据不在该数据卷中,而是保存在 CLIProxyAPI 自己的凭据存储中。
登录管理页面后,可直接在浏览器访问以下地址下载一致性 SQLite 快照:
```text
http://服务器地址:8180/api/v1/maintenance/backup
```
SQLite 快照不包含 `secret.key`。恢复 Codex Helper 本身必须同时备份整个 `/data` 数据卷;CLIProxyAPI 的配置与 OAuth 凭据需要按照 CPA 自身的备份方式单独保护。恢复时先停止容器,再恢复全部内容,并确保文件所有者仍可被容器中的 UID `10001` 读取。
不要使用 `docker compose down -v`,该命令会删除持久数据卷。
## 数据边界
Codex Helper 通过 CLIProxyAPI 代请求 ChatGPT 的内部 Codex 接口。当前使用的数据源包括 `/wham/usage`、`/wham/profiles/me` 和可选的 `/wham/rate-limit-reset-credits`,提供:
- ChatGPT/Codex 账户和套餐类型
- 限额窗口使用百分比、窗口长度和重置时间
- 当前重置周期 Token 合计、本周期单日峰值等摘要
- 每日总 Token 桶
当前总览的 Token 合计按最长有效限额窗口汇总 `/wham/profiles/me` 返回的每日 Token bucket,通常对应周窗口;周期边界所在日期按整日统计。系统不根据 Token 推算 Credits、美元价值或订阅价格。额度与 Profile Token 活动来自不同的上游聚合链路,刷新时间可能不一致;缺失数据会显示为“暂无”。这些 `/wham/*` 路径属于 ChatGPT/Codex 内部接口,上游可能调整字段或访问规则。
## 常见问题
### 页面显示“CLIProxyAPI 未配置或不可用”
先核对 `.env` 中的 `CLIPROXY_API_BASE_URL` 和 `CLIPROXY_API_MANAGEMENT_KEY`,然后查看日志:
```bash
docker compose logs --tail=200 codex-helper
docker compose restart codex-helper
```
确认 CPA Management API 已启用、management key 匹配、远程访问策略允许 Codex Helper 容器,并检查两个容器之间的网络连通性。日志和 API 错误不会输出 management key 或 OAuth Token。
### 添加 authIndex 后仍显示“尚未连接”
- 确认该索引来自当前配置的 CLIProxyAPI 实例。
- 确认对应凭据的 provider/type 是 `codex` 且未 disabled;额度耗尽时 CPA 可能暂时标记 unavailable,这不会阻止 Codex Helper 尝试读取重置时间。
- 在 CPA 中检查 OAuth Token 刷新是否成功。
- 点击账号的“立即同步”,并检查 `docker compose logs -f codex-helper` 中的非敏感错误信息。
### Telegram 无法绑定
- 必须先“验证并保存”Bot Token,再生成绑定码。
- 将完整的 `/bind 数字` 命令发送给对应 Bot,而不是 BotFather。
- 绑定码只有十分钟有效,过期后重新生成。
- 确认服务器能够访问 Telegram Bot API。
### SMTP 测试失败
- 核对端口和加密方式是否匹配。
- 部分服务商要求使用应用专用密码,而不是网页登录密码。
- 检查云服务商是否封禁 SMTP 出站端口。
- 确认发件地址符合 SMTP 账号或服务商的代发规则。
## 本地开发
前端与后端分别位于 `frontend/` 和 `backend/`。
维护项目或使用编码代理前,请先阅读 [AGENTS.md](AGENTS.md) 和[维护者文档中心](docs/README.md);修改 HTTP 接口时同时核对[后端 API 契约](backend/CONTRACT.md)。维护者的可复现验证基线统一使用 Docker,下面的宿主机命令仅用于人工本地开发。
启动前端开发服务器:
```bash
cd frontend
npm install
npm run dev
```
前端提交前检查(格式、lint、类型、生产构建、bundle 门禁和 Vitest)使用 `npm run check`;浏览器回归测试使用 `npm run test:e2e`。维护者应按开发指南在固定版本容器中执行这些命令。
启动后端:
```bash
cd backend
export DATA_DIR=/tmp/codex-helper-data
export CLIPROXY_API_BASE_URL=http://127.0.0.1:8317
export CLIPROXY_API_MANAGEMENT_KEY=replace-with-management-key
go run ./cmd/server
```
本地开发需要 Go、Node.js 和 npm,并需要一个可访问的 CLIProxyAPI 实例。Vite 默认将 `/api` 和 `/health` 代理到 `http://localhost:8080`。