Skip to content

@objectstack/knowledge-ragflow must read source.adapterConfig.datasetId — the declared key (ruled: batch #160 item 2, letter A; README moves with it) #18973

Description

@os-try-charles

domain:devx 执行席在复核 #18915(已发布 README 示例编译,PR #18968)时,从施工席的 open_questions 接出。⛔ 未分级。

⚠️ 这是 #18915 执行过程中冒出来的余项,⛔ 不是那张卡的派发问题 —— 按 H52 的处置,⛔ 不把 needs-user-decision 重新挂回 #18915,而是另立本卡并链回去。

冲突,两边都由本席在 PR head a8b75f978 上实读

适配器读 source.options.datasetId(packages/plugins/knowledge-ragflow/src/index.ts):

:60  function extractRagflowOptions(source: KnowledgeSource): RagflowSourceOptions {
:66    `RAGFlow adapter requires source.options.datasetId on source '${source.id}'`,
:108   const { datasetId } = extractRagflowOptions(ctx.source);

而 schema 声明的是 adapterConfig(packages/spec/src/ai/knowledge-source.zod.ts):

:124  export const KnowledgeSourceSchema = lazySchema(() => z.object({
:137    adapterConfig: z.record(z.string(), z.unknown()).default({}).optional(),

要害在 z.object 三个字:它没有 .passthrough(),所以任何一条真的调用 KnowledgeSourceSchema.parse 的路径,都会把适配器赖以工作的那个 options 键悄悄剥掉。⇒ 今天它之所以能用,是因为没有人在那条路上 parse

后果之一已经量到:packages/plugins/knowledge-ragflow/README.md 记的是 options,因此编译不过,而它正是 #18915 的 44 个已发布错块里唯一没被修的那一个 —— 因为把文档改成 adapterConfig 会让它编译通过但停止工作

为什么必须由人裁,⛔ 执行席不自答

两种收法都是运行时改动,而本卡的来源是一张文档卡。改文档只会二选一地把错误从一处搬到另一处。

做什么 成本 风险
A 规格为准:改适配器(和 README)读 source.adapterConfig 一处运行时改动,在 knowledge-ragflow 内;⛔ 不动 spec 任何已经在写 options 的宿主会坏 —— ⚠️ 但它们本来在任何 parse 路径上就会被剥掉
B 适配器为准:把 options 声明进 KnowledgeSourceSchema(或按 ADR-0087 做一次 optionsadapterConfig 转换) 改 spec,外加它带动的生成物 把一个「只因为没人 parse 才没出事」的拼写正式册封
C 两边都留,什么都不改 ⛔ 施工席已按 Prime Directive #10「声明了却不执行」否掉

建议 A,退路 B。 理由:adapterConfig被声明的那个键;extractRagflowOptions 里那个 cast 正是 Prime Directive #12 禁止的消费侧宽容;而 B 册封的拼写今天能用只是因为无人 parse。

⚠️ 本席的置信缺口,明写:① 本席⛔ 没有测过今天有没有真实宿主在写 options(有的话 A 的迁移成本就不是零);② 本席⛔ 没有测KnowledgeSourceSchema.parse 今天到底在哪些路径上被调用 —— 「没人 parse」是读代码形状推出来的,不是量出来的。⛔ 这两项该在裁决前补测,不该由建议代替。

去重

REST /search/issues 对本席回 403,改用全量枚举:2026-09-18T08:57Z 枚举全部 open 非 PR issue 523 条。adapterConfig / datasetId / KnowledgeSourceSchema / extractRagflowOptions0 命中;ragflow 5 条(#10572 #8249 #7849 #4606 #4311)—— 逐条读过标题,都是包清单里顺带提到,非本卡。同总体阳性对照:README 13 条、driver-memory 20 条 ⇒ 读法有反应,这些零不是空读。

去重词:knowledge source options adapterConfig · ragflow datasetId undeclared key · KnowledgeSourceSchema strips unknown keys · adapter config spelling drift

os-decision-facets

  • ① 项目长远合理性 —— 一个已发布适配器读的键,和它所属 schema 声明的键不是同一个,而 schema 会剥掉前者。这不是命名口味:它意味着协议面上有一处今天靠「没人执行」维持的默契
  • ② 实际业务拉动 —— 直接受害者已量到一个:knowledge-ragflow已发布 README 记着一个类型系统拒绝的键,照抄即错。⚠️ 有多少宿主在写 options,本席未测
  • ③ 防 AI 犯错 —— 决定性。一个 agent 读已发布 README 照抄 options,类型检查会拒绝它;若它转而"修正"成 adapterConfig,运行时会静默不工作。⇒ 两条路都把它送进坑里,而且第二条没有任何声音。
  • ④ 创业阶段不扩散 —— A 是一处包内运行时改动、不动 spec;B 要改 spec 并带动生成物。⛔ 两者都超出文档卡的面,所以本卡只呈报,不执行。

Prior rulings read: objectstack,knowledge-ragflow,reads,source,options,datasetid,knowledgesourceschema,declares,adapterconfig,strips,unknown,keys (+2 more) → 135 hits; ADR-0021 D1, ADR-0056 D5, ADR-0068 D1, ADR-0076 D1, ADR-0076 D10, ADR-0087 D1, ADR-0087 D5, ADR-0090 D6 —— ⚠️ 八条都读过。最近的是 ADR-0087(metadata-protocol-upgrade-contract,Accepted;D1「Enforce the protocol handshake, with machine-readable refusal」、D5「The consumer's verify loop is the acceptance test」),它提供 B 所需的转换机制,但⛔ 没有裁过哪个拼写是契约。其余几条命中的是 source / options / keys 这类通用词,主题分别是分析维度、权限落地校验、元数据面,均不裁本问。⇒ 本卡是决策,⛔ 不是执行。

读数时刻 2026-09-18T08:58Z


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions