Spaces:
Sleeping
src
src/ 现在承载两套运行时的源码:
- 本地模式
- 本地代理脚本
- 本地管理台后端 / 前端
- Hugging Face 模式
- 单进程远端安全服务
- OAuth 保护的
/admin - 写入 private hf dataset 的加密池存储
当前目录结构
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- 敏感信息打码和日志脱敏
- 处理:
Authorizationx-api-keyaccess_tokenrefresh_tokenapiKeyOPENAI_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.encpools/codex-api.encpools/claude-code-api.encconfig/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 分钟尝试切换一次活跃节点;若存在在途请求,则延后到空闲窗口执行