为读取器拆分供应商配置并原子处理密钥切换 - #1007
为读取器拆分供应商配置并原子处理密钥切换#1007Fonna wants to merge 2 commits into
Conversation
WaylandYang
left a comment
There was a problem hiding this comment.
谢谢 @Fonna,欢迎!提案先行,ADR 和测试都带上了,这对第一个 PR 来说很难得。
方向我们接受:读取器按供应商选协议,结果仍是同一个 Reading。安全方面做得很扎实:子进程不经 shell,大小上限齐全,密钥只进请求头,切换供应商清密钥是在 SQL 里强制的,写入保护在单个事务里完成。
但这一版我们合不了。它一次带进来的东西太多,后面都要由我们维护。请按下面几点收窄。(审的是 c7218da。)
1. 不使用流式接口。
我们不打算引入 WebSocket 和 tokio-tungstenite,也不想维护一套私有的二进制帧协议。转写请改用普通 HTTP 的录音文件识别接口(提交任务、轮询结果),走项目现有的 HTTP 客户端,这样代理和 TLS 配置都是现成的。如果 Agent Plan 套餐下没有这样的接口,转写这部分请先撤掉,这个 PR 只做 OCR。
2. 不引入 image。
我们不在服务端解码图片。图片请原样发送并标明格式,格式和宽高从文件头读取,超过上限的直接拒绝。PDF 页面已经由 pdftoppm -scale-to 限制了尺寸,不需要再处理。这样也避免了 JPEG 重新编码成 PNG 后超出大小上限的问题。
3. 不改动现有读取器的行为。
这个 PR 重写了所有文档的失败和归属路径,现有的 MinerU 和 OpenAI 用户会受影响:
- 设置版本号取的是
llm_settings.updated_at。管理员改一下对话模型,进行中的 MinerU 任务就会被重新提交,快完成的转写会被丢弃重跑。 failed_read把错误信息又包了一层,用户看到的失败原因变成了 "X: X"。- worker 崩溃后,现有路径要等标记过期(最长 35 分钟)才能重试,以前是立即重试。
请把归属保护限定在新供应商自己的路径上。现有读取器要不要加同样的保护,是另一个决定,需要的话请单独开 issue 讨论。
4. 精简。
- 设置页里和供应商无关的重构(约一半改动)请去掉。
- README 里的供应商表格和限制说明请移到文档目录,README 只留一句话。
- URL 校验写了三份,子进程封装写了两份,请各合并成一份。
- Rust 要求从 1.85 提到 1.88,请说明是哪个依赖需要。去掉上面两个依赖后如果不再需要,请改回去。
5. 拆分。 请按这个顺序提,每个都能独立合并:
- 迁移、供应商列、设置路由和清密钥
- 方舟 OCR(图片和 PDF)
- 方舟转写(非流式,如果接口可用)
拆开后还有两处请一并处理:
- OCR 某一页失败时,请保留已完成页的检查点,不要让重试从第 1 页重新付费。限流和超时应当可以重试,不应直接判为永久失败。
- 设置页切换供应商再切回来时,表单填的是默认地址,但已保存的密钥还在。直接保存会把原来的密钥和默认地址配在一起。
迁移 0101 和 ADR 0065 的编号留给你。ADR 请按收窄后的范围改写。
再次感谢。拆开之后每个 PR 都会小很多,我们会尽快逐个看。
|
好的,第一次给这个项目做提交,不清楚你们的设计思路,我回头调整一下 |
Signed-off-by: Fonna <jiangpeng274@outlook.com>
c7218da to
1db31c8
Compare
WaylandYang
left a comment
There was a problem hiding this comment.
谢谢 @Fonna,这一版正是我们想要的第一刀,可以合。
审的是 1db31c8。核对过的几点:
- 现有用户无感。 旧行默认
mineru/openai,旧请求不带provider时保留数据库里的值,重新排队的条件对现有供应商与原来等价。 - 密钥规则在一条 SQL 里。 同供应商留空保留,换供应商留空清除,没有先读后写。
- 预留值不等于可用。
ark只在数据库的 CHECK 里,接口拒绝,读取器也拒绝,设置页不显示。 - 没有新依赖,没有动摄入管道、队列和 Docker。
- ADR 0065 按收窄后的范围重写了,修订也记下了。
这个 PR 上 CI 没有运行(仓库的 CI 工作流目前没有登记,我们在查),所以我在本地照 backend 的步骤跑了这个提交:cargo fmt --check、clippy(-D warnings)干净,迁移跑两遍通过,连库的 cargo test --workspace 1308 passed / 0 failed,和你报的数一致。前端没有在本地跑。
两件小事:
- 请把 PR 从草稿改成可评审。
docs/decisions/README.md里 0065 那一行请放到 0054 之后,表是按编号排的。
方舟转写延期的理由成立:没有依据证明套餐支持普通 HTTP 接口之前,不做是对的。
CI 恢复并通过后就合。下一刀(方舟 OCR)可以基于这个分支开始。
原 PR 把供应商配置、方舟 OCR、WebSocket 转写及全局任务保护放在一起,评审后按可独立运行的顺序拆开。本 PR 现在只提供配置基础:现有 MinerU/OpenAI 用户保持原协议,切换供应商时不会沿用另一供应商的密钥。
关联提案:#1006。保留预留迁移
0101和 ADR0065。ocr_provider、ocr_model、transcribe_provider,既有行默认mineru/openai;不提前存储转写资源 ID。ark,API 和读取器仍只接受已实现的 MinerU/OpenAI;界面暂不开放方舟,配置阶段可单独合并。方舟语音转写延期:官方套餐文档提供 WebSocket ASR,尚无依据证明套餐密钥和权益支持普通 HTTP 文件识别。相关帧协议、
tokio-tungstenite、FFmpeg 和全局时间租约已从本 PR 移除。验证均通过:Rust 格式检查、clippy(告警视为错误)、完整 workspace 测试(1308 passed / 0 failed / 5 ignored)、workspace 构建;隔离 PostgreSQL 首次迁移及再次执行(92 条成功记录,最大版本 101),旧行升级、认证路由、密钥封印和并发保存测试;前端冻结锁文件安装、211 项测试、样式检查、TypeScript/Vite 构建。数据库和 PDF 工具测试使用强制标志,未访问用户部署或付费模型。
按评审顺序,先审核并合并这份配置基础,再合并方舟 OCR。OCR 草稿会标明依赖关系。