--- title: PDFMathTranslate Next emoji: 📄 colorFrom: blue colorTo: green sdk: docker pinned: false --- ## PDFMathTranslate-next on HuggingFace Spaces 这个仓库部署一个单体 FastAPI 服务,包含: 1. 用户登录(Session Cookie) 2. 中文 Web UI(上传 PDF、查看任务、下载结果) 3. 任务队列(单 worker)调用 `pdf2zh_next` Python API 4. 内部 OpenAI 兼容代理:`/internal/openai/v1/chat/completions`(按模型路由) 5. 按登录用户名计费(token + USD) ### 运行架构 1. 用户访问 `:7860` 登录并提交翻译任务 2. 后台 worker 调用 `pdf2zh_next`,并把 `chat/completions` 请求发到本机内部代理 3. 内部代理根据 `model` 路由上游: - `SiliconFlowFree` -> 作者维护的 `chatproxy` 接口 - 其他模型 -> OpenAI 风格上游(默认 OpenAI 官方) 4. 计费按 `username` 聚合,前端展示账单 ### 必需 Secret 在 HuggingFace Space 设置: - `BASIC_AUTH_USERS`(多行文本) `BASIC_AUTH_USERS` 格式: ```text alice:your_password_1 bob:your_password_2 ``` 规则: - 每行一个账号,格式 `username:password` - 空行和 `#` 开头行会被忽略 - 支持明文密码与 bcrypt 哈希 ### 可选环境变量 - `SESSION_SECRET`:Session 签名密钥 - `INTERNAL_KEY_SALT`:内部 key 生成盐(默认复用 `SESSION_SECRET`) - `DEFAULT_LANG_IN`:默认源语言(默认 `en`) - `DEFAULT_LANG_OUT`:默认目标语言(默认 `zh`) - `TRANSLATION_QPS`:翻译 QPS(默认 `4`) - `DATA_DIR`:数据目录(默认 `/data`) - `OPENAI_API_KEY`:仅当你希望代理“非 SiliconFlowFree 模型”时需要 - `OPENAI_UPSTREAM_CHAT_URL`:非 SiliconFlowFree 模型的 OpenAI 风格上游地址 ### 固定模型与路由表 - 前端不提供模型选择,任务模型固定为 `SiliconFlowFree` - 路由表在 `src/gateway.py` 的 `MODEL_ROUTE_TABLE` - 当前只维护一条:`SiliconFlowFree`,带两个 `chatproxy` 备用地址 ### 健康检查 `/healthz` 无需认证,返回 `200 ok`。 ### 本地构建示例 ```bash docker build -t pdf2zh-gated . docker run --rm -p 7860:7860 \ -e BASIC_AUTH_USERS=$'alice:pass1\nbob:pass2' \ pdf2zh-gated ``` ### CI 同步到 Spaces 的排除策略 - 本仓库可本地维护密码文件:`basic_auth_users.txt` - CNB `push` 分两个阶段: - 阶段 1:读取 `basic_auth_users.txt`,自动更新 Space Secret `BASIC_AUTH_USERS` - 阶段 2:删除排除文件后,强制推送代码到 HuggingFace Spaces - 推送前会删除以下文件: - `.cnb.yml` - `basic_auth_users.txt` - `src/scripts/` - 排除列表在 `.cnb.yml` 的 `HF_EXCLUDE_FILES` 中配置(空格分隔) - 密钥更新脚本:`src/scripts/update_space_secret.py`