Skip to content

为读取器拆分供应商配置并原子处理密钥切换 - #1007

Draft
Fonna wants to merge 2 commits into
deeplethe:devfrom
Fonna:feat/ark-agent-plan-readers
Draft

Fonna wants to merge 2 commits into
deeplethe:devfrom
Fonna:feat/ark-agent-plan-readers

Conversation

@Fonna

@Fonna Fonna commented Sep 29, 2026 •

Copy link
Copy Markdown

原 PR 把供应商配置、方舟 OCR、WebSocket 转写及全局任务保护放在一起,评审后按可独立运行的顺序拆开。本 PR 现在只提供配置基础:现有 MinerU/OpenAI 用户保持原协议,切换供应商时不会沿用另一供应商的密钥。

关联提案:#1006。保留预留迁移 0101 和 ADR 0065。

  • 新增 ocr_provider、ocr_model、transcribe_provider,既有行默认 mineru / openai;不提前存储转写资源 ID。
  • 在单条 SQL 内决定供应商和密钥:同供应商空密钥保留,切换供应商空密钥清除;省略供应商保留数据库当前值,避免先读后写竞态。旧接口和请求保持兼容。
  • 数据库预留 ark,API 和读取器仍只接受已实现的 MinerU/OpenAI;界面暂不开放方舟,配置阶段可单独合并。
  • 不修改摄入管道、工作队列、Docker、工具链或依赖;原图识别及恢复机制放到后续 OCR 草稿 PR。

方舟语音转写延期:官方套餐文档提供 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 草稿会标明依赖关系。

@WaylandYang WaylandYang left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

谢谢 @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. 拆分。 请按这个顺序提,每个都能独立合并:

  1. 迁移、供应商列、设置路由和清密钥
  2. 方舟 OCR(图片和 PDF)
  3. 方舟转写(非流式,如果接口可用)

拆开后还有两处请一并处理:

  • OCR 某一页失败时,请保留已完成页的检查点,不要让重试从第 1 页重新付费。限流和超时应当可以重试,不应直接判为永久失败。
  • 设置页切换供应商再切回来时,表单填的是默认地址,但已保存的密钥还在。直接保存会把原来的密钥和默认地址配在一起。

迁移 0101 和 ADR 0065 的编号留给你。ADR 请按收窄后的范围改写。

再次感谢。拆开之后每个 PR 都会小很多,我们会尽快逐个看。

@Fonna

Fonna commented Sep 29, 2026

Copy link
Copy Markdown
Author

好的,第一次给这个项目做提交,不清楚你们的设计思路,我回头调整一下

Signed-off-by: Fonna <jiangpeng274@outlook.com>
@Fonna
Fonna force-pushed the feat/ark-agent-plan-readers branch from c7218da to 1db31c8 Compare September 29, 2026 06:21
@Fonna Fonna changed the title 为 OCR 和录音转写新增火山方舟 Agent Plan 供应商 为读取器拆分供应商配置并原子处理密钥切换 Sep 29, 2026

@WaylandYang WaylandYang left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

谢谢 @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,和你报的数一致。前端没有在本地跑。

两件小事:

  1. 请把 PR 从草稿改成可评审。
  2. docs/decisions/README.md 里 0065 那一行请放到 0054 之后,表是按编号排的。

方舟转写延期的理由成立:没有依据证明套餐支持普通 HTTP 接口之前,不做是对的。

CI 恢复并通过后就合。下一刀(方舟 OCR)可以基于这个分支开始。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants