|
3 | 3 | 把 **CodeBuddy** 与 **TRAE SOLO** 两个 coding agent 上游通道,统一封装为 OpenAI 兼容 API, |
4 | 4 | 并提供公共凭证池、统一调度与按人用量统计。 |
5 | 5 |
|
6 | | -## 状态 |
| 6 | +> [!WARNING] |
| 7 | +> 本项目接通的是第三方服务的逆向接口,仅供学习研究。未做安全审计,不建议直接暴露在公网; |
| 8 | +> 如确需公网访问,请置于反向代理之后并加鉴权与 IP 白名单。 |
| 9 | +
|
| 10 | +## 特性 |
| 11 | + |
| 12 | +- **OpenAI 兼容出口**:`/v1/chat/completions`(流式 + 非流式)、`/v1/models` |
| 13 | +- **双上游统一调度**:同一扁平模型名可按健康度自动选号,`model@provider` 可强制指定 |
| 14 | +- **三态健康度 + 三级冷却**:权益耗尽 12h / 限流 60s / 连续错误 10m / 会话失效硬禁用 |
| 15 | +- **公共凭证池**:管理员集中维护,全员共享;按人统计用量 |
| 16 | +- **凭证加密入库**:Fernet(AES-128-CBC + HMAC),密钥走 `APP_SECRET` |
| 17 | +- **脱敏统计**:不保存提示词、回答、请求头、Token、工具参数;明细 90 天、小时汇总永久 |
| 18 | +- **完整凭证运维**:OAuth 设备码登录、多账号切换、额度探测、每日签到、token 预刷新 |
| 19 | + |
| 20 | +## 快速开始 |
| 21 | + |
| 22 | +### 前置要求 |
| 23 | + |
| 24 | +- Python 3.12+ |
| 25 | +- [uv](https://docs.astral.sh/uv/) |
| 26 | +- Node.js 24+ 与 pnpm 10+(仅构建前端需要) |
| 27 | + |
| 28 | +### 本地运行 |
| 29 | + |
| 30 | +```bash |
| 31 | +# 1. 安装后端依赖 |
| 32 | +uv sync |
| 33 | + |
| 34 | +# 2. 创建管理台用户(交互输入密码) |
| 35 | +uv run python scripts/hash_password.py admin |
| 36 | + |
| 37 | +# 3. 构建前端 |
| 38 | +cd web && pnpm install && pnpm build && cd .. |
| 39 | + |
| 40 | +# 4. 启动 |
| 41 | +APP_SECRET="换成你自己的随机字符串" ADMIN_USERNAMES=admin uv run python -m uvicorn src.main:build_app --factory --port 8000 |
| 42 | +``` |
| 43 | + |
| 44 | +打开 <http://127.0.0.1:8000> 登录管理台。 |
| 45 | + |
| 46 | +### Docker |
| 47 | + |
| 48 | +```bash |
| 49 | +cat > .env <<'EOF' |
| 50 | +APP_SECRET=换成你自己的随机字符串 |
| 51 | +ADMIN_USERNAMES=admin |
| 52 | +EOF |
| 53 | + |
| 54 | +mkdir -p secrets |
| 55 | +docker run --rm -it -v "$PWD/secrets:/app/secrets" \ |
| 56 | + --entrypoint python coding2api:local scripts/hash_password.py admin |
| 57 | + |
| 58 | +docker compose up -d |
| 59 | +``` |
| 60 | + |
| 61 | +`APP_SECRET` 丢失会导致已存凭证全部无法解密,只能重新录入——请备份。 |
| 62 | + |
| 63 | +## 使用 |
| 64 | + |
| 65 | +### 1. 添加凭证 |
| 66 | + |
| 67 | +管理台「凭证管理」页: |
| 68 | + |
| 69 | +- **CodeBuddy**:点「登录 CodeBuddy」走设备码授权;也可手动粘贴 `{"token":"..."}` |
| 70 | +- **TRAE**:粘贴凭证 JSON(`accessToken` / `uid` / `refreshToken`)或回调链接 |
7 | 71 |
|
8 | | -早期开发中(M0 骨架)。当前进度见 `PROPOSAL.md` §9 里程碑。 |
| 72 | +### 2. 创建 API Key |
| 73 | + |
| 74 | +「API Key」页创建,明文只显示一次。 |
| 75 | + |
| 76 | +### 3. 调用 |
| 77 | + |
| 78 | +```bash |
| 79 | +curl http://127.0.0.1:8000/v1/chat/completions \ |
| 80 | + -H "Authorization: Bearer sk-你的key" \ |
| 81 | + -H "Content-Type: application/json" \ |
| 82 | + -d '{"model":"glm-5.2","messages":[{"role":"user","content":"你好"}]}' |
| 83 | +``` |
| 84 | + |
| 85 | +强制走某个上游: |
| 86 | + |
| 87 | +```bash |
| 88 | +-d '{"model":"glm-5.2@trae", ...}' # 只走 TRAE |
| 89 | +-d '{"model":"glm-5.2@codebuddy", ...}' # 只走 CodeBuddy |
| 90 | +``` |
| 91 | + |
| 92 | +### 4. 在客户端中使用 |
| 93 | + |
| 94 | +任何支持自定义 OpenAI 端点的客户端都可接入: |
| 95 | + |
| 96 | +- Base URL:`http://127.0.0.1:8000/v1` |
| 97 | +- API Key:上一步创建的 `sk-...` |
| 98 | +- 模型名:以 `GET /v1/models` 返回为准 |
| 99 | + |
| 100 | +## 配置 |
| 101 | + |
| 102 | +全部通过环境变量(见 `docker-compose.yml`)。完整清单参考 `TECHNICAL.md` §8。 |
| 103 | + |
| 104 | +| 变量 | 默认 | 说明 | |
| 105 | +|---|---|---| |
| 106 | +| `APP_SECRET` | **必填** | 凭证列加密密钥;丢失等于凭证全部作废 | |
| 107 | +| `ADMIN_USERNAMES` | 空 | 逗号分隔;空则所有用户只读 | |
| 108 | +| `USERS_FILE` | `secrets/users.txt` | 用户文件路径 | |
| 109 | +| `DATA_DIR` | `./data` | SQLite 与运行数据目录 | |
| 110 | +| `PUBLIC_BASE_URL` | `http://127.0.0.1:8000` | 浏览器可达地址;TRAE 登录回调依赖它 | |
| 111 | +| `CODEBUDDY_API_ENDPOINT` | 中国站 | 上游地址,只接受白名单内地址 | |
| 112 | +| `DEFAULT_MODEL` | `glm-5.2` | 模型为空或 `auto` 时的目标 | |
| 113 | +| `CHECKIN_HOUR` | `9` | 每日签到时刻(服务器本地时区) | |
| 114 | +| `QUOTA_PROBE_MINUTES` | `60` | 额度探测周期 | |
| 115 | + |
| 116 | +## 开发 |
| 117 | + |
| 118 | +```bash |
| 119 | +# 后端测试(行/分支覆盖门槛 100%) |
| 120 | +uv run pytest -q --cov=src --cov-report=term --cov-fail-under=100 |
| 121 | + |
| 122 | +# 代码检查 |
| 123 | +uv run ruff check src tests scripts |
| 124 | + |
| 125 | +# 前端 |
| 126 | +cd web |
| 127 | +pnpm exec tsc --noEmit |
| 128 | +pnpm exec vitest run |
| 129 | +pnpm build |
| 130 | +``` |
| 131 | + |
| 132 | +## 文档 |
9 | 133 |
|
10 | 134 | | 文档 | 内容 | |
11 | 135 | |---|---| |
12 | | -| [`PROPOSAL.md`](PROPOSAL.md) | 立项决策(Q1–Q30)、可行性核实、风险清单 | |
| 136 | +| [`PROPOSAL.md`](PROPOSAL.md) | 立项决策、目标与非目标、可行性核实、风险清单 | |
13 | 137 | | [`TECHNICAL.md`](TECHNICAL.md) | 技术栈、模块规格、Provider 协议、请求时序、测试策略 | |
14 | | -| [`diagrams/coding2api-architecture.html`](diagrams/coding2api-architecture.html) | 系统架构图(浏览器直接打开) | |
| 138 | +| [`diagrams/coding2api-architecture.html`](diagrams/coding2api-architecture.html) | 系统架构图(浏览器打开) | |
15 | 139 |
|
16 | | -## 开源协议 |
| 140 | +## 状态 |
17 | 141 |
|
18 | | -MIT,见 [LICENSE](LICENSE)。借鉴的上游项目署名见 [NOTICE](NOTICE)。 |
| 142 | +后端完成(M0–M1.5),前端完成(M2)。当前 `main` 分支可运行。 |
19 | 143 |
|
20 | | -> 本仓库接通的是第三方服务的逆向接口,仅供学习研究,请勿用于生产用途。 |
| 144 | +## 授权协议 |
| 145 | + |
| 146 | +MIT,见 [LICENSE](LICENSE)。借鉴的上游项目署名见 [NOTICE](NOTICE)。 |
0 commit comments