AI_PROJECT / src /README.md
chenchenaoyang's picture
Deploy from Codex
f395b70 verified
# src
`src/` 现在承载两套运行时的源码:
- 本地模式
- 本地代理脚本
- 本地管理台后端 / 前端
- Hugging Face 模式
- 单进程远端安全服务
- OAuth 保护的 `/admin`
- 写入 private hf dataset 的加密池存储
## 当前目录结构
```text
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
├── 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
├── shared/
│ ├── pool-crypto.mjs
│ └── secret-sanitizer.mjs
├── ui-app/
│ ├── App.jsx
│ ├── components/
│ ├── main.jsx
│ ├── pages/
│ │ ├── ConfigSwitchPage.jsx
│ │ ├── PoolManagePage.jsx
│ │ ├── ProbePage.jsx
│ │ ├── ProxyPage.jsx
│ │ └── RemoteServicePage.jsx
│ ├── styles.css
│ └── view-helpers.js
└── ui-server/
├── api-pool-proxy-manager.mjs
├── api-pool-proxy-manager.test.mjs
├── config-switch-store.mjs
├── config-switch-store.test.mjs
├── dev.mjs
├── history-store.mjs
├── pool-store.mjs
├── pool-store.test.mjs
├── proxy-manager.mjs
├── run-manager.mjs
├── server.mjs
├── server.test.mjs
├── tool-registry.mjs
└── tool-registry.test.mjs
```
## 模块说明
### `proxy/`
- `proxy/codex-account-pool.mjs`
- 账号池核心模块
- 负责:
- 加载 `acc_pool/pool.json`
- 识别账号结构
- 预检账号完整性
- refresh token 刷新
- 上游探活
- 失败分类与冷却
- 当前账号切换
- 支持可注入的快照加载 / 持久化接口,供远端模式复用
- `proxy/codex-account-pool.test.mjs`
- 账号池核心测试
- 覆盖:
- 失败分类
- JWT 解析
- refresh token 必填规则
- `auth.json` 结构账号加载
- `pool.json` 数组加载
- `pool.json` 刷新持久化
- `proxy/api-endpoint-pool.mjs`
- API 节点池核心模块
- 负责:
- 加载 `api_pool/codex/pool.json``api_pool/claude-code/pool.json`
- 校验 `apiUrl + apiKey` 节点结构
- 支持数组格式和旧的单文件单节点格式
- 当目录里存在 `pool.json` 时优先只读取它
- 按 provider 过滤可用节点
- 探活、失败分类、冷却和顺序轮询切换
- 选择下一个用于主动定时轮换的健康节点
- 支持可注入快照源,供远端模式复用
- `proxy/api-endpoint-pool.test.mjs`
- API 节点池测试
### `scripts/`
- `scripts/codex-local-proxy.mjs`
- 本地 Codex 账号池代理入口
- 默认监听 `127.0.0.1:8787`
- 同时导出可复用的 `createProxyService` / `createProxyServer`
- `scripts/api-pool-proxy.mjs`
- 本地 API 池轮询代理入口
- 默认监听 `127.0.0.1:8789`
- 同时导出可复用的 `createApiPoolProxyService` / `createApiPoolProxyServer`
- 现在负责:
- 失败后切换
- 定时切活跃节点
- 在途请求计数和“忙时延后切换”
- 返回定时切换状态字段
- `scripts/migrate-codex-acc-pool.mjs`
- 把旧的 `acc_pool/*.json` 合并成 `acc_pool/pool.json`
- `scripts/probe-llm-endpoint.mjs`
- LLM 地址兼容性探测脚本
- `scripts/clean-codex-home.sh`
- 保守清理 `~/.codex`
### `shared/`
- `shared/secret-sanitizer.mjs`
- 敏感信息打码和日志脱敏
- 处理:
- `Authorization`
- `x-api-key`
- `access_token`
- `refresh_token`
- `apiKey`
- `OPENAI_API_KEY`
- `shared/pool-crypto.mjs`
- AES-GCM 加密 / 解密池文件
### `ui-server/`
- `ui-server/server.mjs`
- 本地脚本管理台后端入口
- 提供:
- `/api/tools`
- `/api/config-switch`
- `/api/pools`
- `/api/runs`
- `/api/history`
- `/api/proxy/*`
- `/api/api-pool/*`
- `/api/app-config`
- `ui-server/config-switch-store.mjs`
- 本地配置切换预设存储
- 负责:
- 读写 `.local-ui-data/config-switch.json`
- 维护 Codex / Claude Code 配置预设
- 判断当前预设是否 `已启用``已偏离``未启用`
- 启用时写入 `~/.codex` / `~/.claude` 本机配置文件
- `ui-server/tool-registry.mjs`
- 本地模式工具注册表
- `ui-server/proxy-manager.mjs`
- 本地 Codex 账号池代理子进程管理器
- `ui-server/api-pool-proxy-manager.mjs`
- 本地 API 池代理子进程管理器
- `ui-server/run-manager.mjs`
- 本地短时脚本执行和日志收集
- `ui-server/pool-store.mjs`
- 本地 `pool.json` 读写和校验
### `ui-app/`
- `ui-app/App.jsx`
- 管理台主入口
- 同时支持:
- 本地模式
- 远端 `/admin` 模式
- `ui-app/pages/PoolManagePage.jsx`
- 池管理页
- 远端模式下支持导入 JSON、保存加密池、显示只读提示
- `ui-app/pages/ProxyPage.jsx`
- 本地代理页
- `ui-app/pages/ConfigSwitchPage.jsx`
- 本地配置切换页
- 支持:
- `Codex 配置` / `Claude Code 配置` 双 tab
- 配置预设列表
- 新增、编辑、复制、删除、启用
- JSON 格式化和启用前二次确认
- `ui-app/pages/RemoteServicePage.jsx`
- Hugging Face 远端服务页
- 用于展示状态、日志、定时切换信息和 `Reload 配置`
- API 池远端页面支持直接修改定时切换开关与切换间隔,并保存后自动 reload 当前服务
- `ui-app/components/UiShared.jsx`
- 共享表格、编辑器、导入弹窗、日志卡片
### `hf-space/`
- `hf-space/server.mjs`
- Hugging Face 单进程远端服务入口
- 负责:
- `/healthz`
- `/admin`
- `/oauth/start`
- `/admin/api/*`
- `/proxy/codex-account/*`
- `/proxy/codex-api/*`
- `/proxy/claude-api/*`
- 远端 API 池同样会继承本地模式的定时切活跃逻辑
- 远端 API 池运行配置支持通过 `/admin/api/api-pool/config` 读写,并在保存后立即 reload 当前服务
- `hf-space/admin-auth.mjs`
- 管理员会话签名、OAuth state 处理、白名单检查
- 当前登录逻辑会先显示中转页,再要求用户在新标签页中完成 OAuth
- `hf-space/encrypted-pool-store.mjs`
- 远端池存储层
- 把池数据加密后写到 private hf dataset
- 路径:
- `pools/codex-accounts.enc`
- `pools/codex-api.enc`
- `pools/claude-code-api.enc`
- `config/api-pool-runtime.json`
- 如果 `HF_TOKEN``HF_DATASET_REPO` 缺失,会自动退化为只读
- `hf-space/*.test.mjs`
- 远端模式测试
- 覆盖:
- 管理员鉴权隔离
- 代理 Bearer Key 隔离
- 导入 / 保存加密池
- reload
- 公网隐藏 `/proxy/status`
## 常用命令
| 用途 | 命令 | 说明 |
| --- | --- | --- |
| 迁移 Codex 账号池 | `npm run migrate:codex-pool` | 生成 `acc_pool/pool.json` 并备份旧文件 |
| 启动本地 Codex 代理 | `npm run proxy:codex` | 默认监听 `127.0.0.1:8787` |
| 启动本地 API 池代理 | `npm run proxy:api-pool -- --provider=codex --pool-dir=api_pool/codex --port=8789` | 默认监听 `127.0.0.1:8789` |
| 启动本地脚本管理台 | `npm run ui:dev` | 启动本地 Web 管理台开发环境 |
| 构建管理台前端 | `npm run ui:build` | 构建 React 界面产物 |
| 启动 HF 远端服务 | `npm run hf:server` | 启动 Hugging Face 单进程安全代理和管理台 |
| 测试代理逻辑 | `npm run test:proxy` | 只跑 `src/proxy/*.test.mjs``src/scripts/*.test.mjs` |
| 运行全部测试 | `npm test` | 运行仓库内全部测试,包括 `src/hf-space/*.test.mjs` |
## 设计备注
- 本地模式和远端模式共享同一套池逻辑,不重复维护两份切换策略
- 远端模式不暴露本地 `start/stop` 风格接口,而是改成常驻托管服务 + 手动 `reload`
- 远端模式下的池数据永远以加密文件形式落到 private hf dataset
- 远端 API 池的定时切换参数可以在管理台里直接修改,并持久化到 `config/api-pool-runtime.json`
- 公开代理入口和管理员登录是两套完全独立的鉴权边界
- API 池默认每 `15 分钟` 尝试切换一次活跃节点;若存在在途请求,则延后到空闲窗口执行