AI_PROJECT / README.md
chenchenaoyang's picture
Deploy from Codex
f395b70 verified
|
Raw
History Blame Contribute Delete
12 kB
---
title: AI Project Secure Proxy
emoji: 🛡️
colorFrom: green
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
hf_oauth: true
---
# AI_PROJECT
这个仓库现在维护两套运行形态:
- 本地模式:`Codex 账号池 + API 池 + 本地管理台`
- Hugging Face 模式:`单个 Docker Space + OAuth 保护的管理台 + private dataset 持久化`
核心目标:
- 从 `acc_pool/` 加载多个 Codex ChatGPT 登录态账号
-`api_pool/` 加载 Claude Code / Codex 的 `apiUrl + apiKey` 节点池
- 校验账号可用性并管理 refresh / cooldown / 切换
- 提供本地和远端两种 OpenAI / Anthropic 兼容代理入口
- 用同一套管理台维护池配置、状态和日志
- 让 API 池节点按周期轮换,避免长期只有单个节点承接真实流量
## 当前目录结构
```text
AI_PROJECT/
├── .local-ui-data/
│ └── config-switch.json
├── acc_pool/
│ ├── _backup/
│ └── pool.json
├── api_pool/
│ ├── claude-code/
│ │ └── pool.json
│ └── codex/
│ └── pool.json
├── dist/
│ └── ui/
├── reports/
│ ├── architecture/
│ └── llm-probe/
├── src/
│ ├── README.md
│ ├── hf-space/
│ │ ├── admin-auth.mjs
│ │ ├── encrypted-pool-store.mjs
│ │ ├── encrypted-pool-store.test.mjs
│ │ ├── server.mjs
│ │ └── server.test.mjs
│ ├── proxy/
│ │ ├── api-endpoint-pool.mjs
│ │ ├── api-endpoint-pool.test.mjs
│ │ ├── codex-account-pool.mjs
│ │ └── codex-account-pool.test.mjs
│ ├── shared/
│ │ ├── pool-crypto.mjs
│ │ └── secret-sanitizer.mjs
│ ├── scripts/
│ │ ├── api-pool-proxy.mjs
│ │ ├── check-symlink-skills.sh
│ │ ├── clean-codex-home.sh
│ │ ├── codex-local-proxy.mjs
│ │ ├── migrate-codex-acc-pool.mjs
│ │ ├── probe-llm-endpoint.mjs
│ │ └── run-hf-local.sh
│ ├── ui-app/
│ └── ui-server/
├── .dockerignore
├── Dockerfile
├── package.json
├── package-lock.json
└── README.md
```
## 模块说明
- `src/proxy/`
- 账号池和 API 节点池核心逻辑
- 负责:
- 账号 / 节点加载
- 预检与探活
- refresh / cooldown / 故障切换
- 当前活跃账号 / 节点切换
- API 池定时切活跃节点
- `src/scripts/`
- 本地模式脚本入口
- 包含:
- 本地代理启动
- API 池代理启动
- 账号池迁移
- LLM 探测
- `~/.codex` 保守清理
- `src/ui-server/` + `src/ui-app/`
- 本地模式管理台
- 支持池管理、代理启停、日志查看、LLM 探测和配置切换
- `src/hf-space/`
- Hugging Face 远端运行时
- 负责:
- `/admin` 管理台登录和 OAuth 中转
- `/proxy/codex-account`
- `/proxy/codex-api`
- `/proxy/claude-api`
- 把池数据加密后写入 private hf dataset
- 隔离管理员会话和代理 Bearer Key
- `src/shared/`
- 本地 / 远端共用的底层能力
- 目前包含:
- 敏感信息打码
- AES-GCM 池文件加密 / 解密
## 常用命令
| 用途 | 命令 | 说明 |
| --- | --- | --- |
| 安装依赖 | `npm install` | 安装项目依赖 |
| 迁移 Codex 账号池到 `pool.json` | `npm run migrate:codex-pool` | 合并 `acc_pool/*.json``acc_pool/pool.json` 并备份旧文件 |
| 启动本地 Codex 账号池代理 | `npm run proxy:codex` | 启动本地 OpenAI 兼容代理 |
| 启动本地 API 池代理 | `npm run proxy:api-pool -- --provider=codex --pool-dir=api_pool/codex --port=8789` | 轮询 `apiUrl + apiKey` 节点池 |
| 启动本地脚本管理台 | `npm run ui:dev` | 同时启动本地 Node 后端和 React 前端 |
| 构建管理台前端 | `npm run ui:build` | 构建到 `dist/ui` |
| 启动 HF 远端安全服务 | `npm run hf:server` | 运行 Hugging Face 单进程安全代理和管理台 |
| 单独测试代理逻辑 | `npm run test:proxy` | 只运行账号池 / API 池相关测试 |
| 运行全部测试 | `npm test` | 运行仓库内全部测试 |
| 探测某个 LLM 地址 | `npm run probe:llm -- --baseUrl=https://example.com --key=sk-xxx` | 输出兼容性探测结果 |
| 保守清理 `~/.codex` | `npm run clean:codex-home` | 清理缓存、临时文件和 shell 快照 |
## 本地模式
本地模式下,管理台是一个减少重复手敲命令的 Web 界面。
支持的页面:
| 页面 | 能力 |
| --- | --- |
| 池管理 | 编辑 `acc_pool/pool.json``api_pool/codex/pool.json``api_pool/claude-code/pool.json` |
| API 池代理 | 启动 / 停止 Claude Code 或 Codex 的 API 池代理 |
| Codex 账号池代理 | 启动 / 停止 Codex 账号池代理 |
| LLM 探测 | 探测目标地址兼容性并查看报告 |
| 配置切换 | 管理 Codex / Claude Code 本机配置预设,并一键启用到 `~/.codex``~/.claude` |
开发时启动:
```bash
npm run ui:dev
```
构建静态前端:
```bash
npm run ui:build
```
### 配置切换预设
`配置切换` 页面只在本地模式出现,用来管理两类本机配置:
- `Codex 配置`
- 编辑并启用 `~/.codex/auth.json`
- 编辑并启用 `~/.codex/config.toml`
- `Claude Code 配置`
- 编辑并启用 `~/.claude/settings.json`
行为说明:
- 预设内容会持久化到 `.local-ui-data/config-switch.json`
- 预设支持 `新增 / 编辑 / 删除 / 复制 / 启用`
- 列表操作是立即保存,不需要额外点“保存”
- 点击“启用”时会二次确认
- “已启用”状态不是只看最后一次点击,而是会对比当前本机文件内容;如果本机文件被外部改过,会显示为“已偏离”
## 池文件格式
Codex 账号池推荐使用单个 `acc_pool/pool.json`
```json
[
{
"type": "codex",
"disabled": false,
"email": "user@example.com",
"last_refresh": "2026-04-05T10:00:00.000Z",
"tokens": {
"access_token": "eyJ...",
"account_id": "acc-123",
"id_token": "eyJ...",
"refresh_token": "rt_123"
}
}
]
```
API 池推荐使用单个 `pool.json` 文件:
```json
[
{
"name": "codex-main-1",
"type": "codex",
"baseUrl": "https://example.com/v1",
"apiKey": "sk-xxx",
"model": "gpt-5.4",
"disabled": false
},
{
"name": "codex-backup-1",
"type": "codex",
"baseUrl": "https://backup.example.com/v1",
"apiKey": "sk-yyy",
"model": "gpt-5.4",
"disabled": false
}
]
```
Claude Code 节点只需要把 `type` 改成 `claude-code`,目录放到 `api_pool/claude-code/pool.json`
## API 池定时切换
API 池现在不再只在“失败时切换”。
默认行为:
- 默认开启定时切换
- 默认每 `15 分钟` 尝试把当前活跃节点切到下一个健康节点
- 如果当前存在在途请求,则先延后,等空闲窗口再切
- 切换前会先对候选节点做轻量探活
- 如果没有可切换的健康节点,则保持当前活跃节点不变
这样做的目的,是让所有 API 节点都能周期性承接真实业务流量,避免某些节点长期轮不到。
本地模式可配置项:
- `enableScheduledSwitch`
- `scheduledSwitchIntervalMs`
Hugging Face 模式环境变量:
- `API_POOL_SCHEDULED_SWITCH_ENABLED`
- `API_POOL_SCHEDULED_SWITCH_INTERVAL_MS`
Hugging Face 远端管理台可配置项:
- `API 池代理` 页面支持直接修改 `启用定时切换``定时切换间隔(毫秒)`
- 保存后会把远端运行配置写入 private hf dataset 的 `config/api-pool-runtime.json`
- 保存完成后会自动 reload 当前选中的远端 API 池服务
- 这份配置独立于池条目本身,主要控制远端常驻代理的运行参数
## Hugging Face 安全部署
这个仓库支持部署成单个 Docker Space。
### 必需的 Secrets
- `ADMIN_HF_USERNAMES`
- `ADMIN_SESSION_SECRET`
- `POOL_CRYPTO_KEY`
- `HF_TOKEN`
- `CODEX_ACCOUNT_PROXY_KEY`
- `CODEX_API_PROXY_KEY`
- `CLAUDE_API_PROXY_KEY`
### 平台配置
- 在 README frontmatter 里保持 `hf_oauth: true`
- 配置 `HF_DATASET_REPO=<user-or-org>/<private-dataset-name>`
- 可选:配置 `HF_DATASET_BRANCH`,默认 `main`
- 可选:配置 `POOL_STORAGE_BACKEND=hf-dataset`;如果设置了 `HF_DATASET_REPO`,服务会默认走 dataset 后端
- `DATA_DIR` 现在只作为本地缓存目录使用,默认会在其中维护 `.hf-dataset-cache`
### 可直接上线的环境变量清单
Secrets:
- `HF_TOKEN`:用于读写 private Space repo 和 private dataset
- `HF_DATASET_REPO`:格式为 `<user-or-org>/<private-dataset-name>`
- `POOL_CRYPTO_KEY`:用于加密 `pools/*.enc`
- `ADMIN_SESSION_SECRET`:管理员登录态签名密钥
- `ADMIN_HF_USERNAMES`:允许进入 `/admin` 的 HF 用户名,多个用逗号分隔
- `CODEX_ACCOUNT_PROXY_KEY``/proxy/codex-account` 的 Bearer Key
- `CODEX_API_PROXY_KEY``/proxy/codex-api` 的 Bearer Key
- `CLAUDE_API_PROXY_KEY``/proxy/claude-api` 的 Bearer Key
Variables:
- `POOL_STORAGE_BACKEND=hf-dataset`
- `HF_DATASET_BRANCH=main`
- `DATA_DIR=/tmp/hf-space-data`
- `PORT=7860`
可选 Variables:
- `CODEX_PROXY_UPSTREAM_BASE`
- `CODEX_PROXY_REFRESH_ENDPOINT`
- `CODEX_PROXY_PROBE_URL`
- `CODEX_PROXY_MAX_SWITCH_ATTEMPTS`
- `CODEX_PROXY_REQUEST_TIMEOUT_MS`
- `CODEX_PROXY_UPSTREAM_PROXY`
- `CODEX_PROXY_CLIENT_VERSION`
- `API_POOL_MAX_SWITCH_ATTEMPTS`
- `API_POOL_REQUEST_TIMEOUT_MS`
- `API_POOL_SCHEDULED_SWITCH_ENABLED`
- `API_POOL_SCHEDULED_SWITCH_INTERVAL_MS`
- `API_POOL_PROXY_URL`
说明:
- `OAUTH_CLIENT_ID`
- `OAUTH_CLIENT_SECRET`
- `OPENID_PROVIDER_URL`
这些变量在 `hf_oauth: true` 打开后会由 Hugging Face 自动注入,不需要你手动填写。
### 远端路由
- 管理台:`/admin`
- Codex 账号池代理:`/proxy/codex-account`
- Codex API 池代理:`/proxy/codex-api`
- Claude API 池代理:`/proxy/claude-api`
### 远端模式注意事项
- 不要把 `acc_pool/``api_pool/``.local-ui-data/` 上传到 Space 仓库
- 池数据会加密后写入 private hf dataset 里的 `pools/*.enc`
- 代理 Bearer Key 和管理员会话是两套独立鉴权,不能混用
- 未登录访问 `/admin` 时,会先显示一个登录中转页;请在新标签页完成 OAuth
- 如果 `HF_TOKEN``HF_DATASET_REPO` 缺失,远端池管理会自动退化为只读
- API 池的定时切换在远端模式下同样默认开启
- 远端模式下可以在管理台直接调整 API 池定时切换开关和间隔;配置会持久化到 private hf dataset 的 `config/api-pool-runtime.json`
### 远端模式推荐使用流程
1. 打开 `https://<space>.hf.space/admin`
2. 在登录中转页点击“在新标签页登录”
3. 登录后进入池管理
4. 导入账号池或 API 池 JSON
5. 如需调整远端 API 池轮换策略,进入 `API 池代理` 页面修改定时切换开关或间隔,并点击“保存并重载当前服务”
6. 如果只改了池文件内容,再点击 `Reload 配置`
7. 再把本地客户端指向对应 `/proxy/*` 路由
### 本地客户端固定接入形态
- Codex 账号池:`https://<space>.hf.space/proxy/codex-account`
- Codex API 池:`https://<space>.hf.space/proxy/codex-api`
- Claude API 池:`https://<space>.hf.space/proxy/claude-api`
## 接手建议
如果你是第一次接手这个仓库,建议阅读顺序:
1. 先看本文件,了解仓库的本地 / 远端两种运行方式
2. 再看 [src/README.md](/Users/chenchaoyang/my-project/AI_PROJECT/src/README.md),了解脚本入口和池格式
3. 看 [server.mjs](/Users/chenchaoyang/my-project/AI_PROJECT/src/hf-space/server.mjs),了解远端安全代理和管理台入口
4. 最后看 [codex-account-pool.mjs](/Users/chenchaoyang/my-project/AI_PROJECT/src/proxy/codex-account-pool.mjs),理解账号池和切换逻辑