PDF / README.md
BirkhoffLee's picture
feat: 基本上搞定了翻译的页面
90423c7 unverified
---
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`