Skip to content

[Bug]: qualityGate.algorithms 下按算法名配置质量门参数会误报 "Unknown keys" 警告 #329

Description

@cycle2zhou

Bug Description

acp.jsonc 里配置 qualityGate.algorithms.<算法名> 的各层参数时,启动会弹出 ACP: config warning — Unknown keys 警告,但该配置实际是合法且生效的。

配置写法:

{
  "qualityGate": {
    "enabled": true,
    "algorithm": "rouge-recall-v1",
    "algorithms": {
      "rouge-recall-v1": {
        "layer1MinChars": 200,
        "layer1MinRetentionPct": 2.5,
        "layer2MaxRougeF1": 0.05,
        "layer2MaxTop20Recall": 0.20
      }
    }
  }
}

被误报的未知键共 5 个:

qualityGate.algorithms.rouge-recall-v1
qualityGate.algorithms.rouge-recall-v1.layer1MinChars
qualityGate.algorithms.rouge-recall-v1.layer1MinRetentionPct
qualityGate.algorithms.rouge-recall-v1.layer2MaxRougeF1
qualityGate.algorithms.rouge-recall-v1.layer2MaxTop20Recall

根因与 #262 完全同类:lib/config-validation.ts 的校验器 getConfigKeyPaths 会递归展开用户配置的每一层键,再和白名单 VALID_CONFIG_KEYS 比对。但白名单里 qualityGate 相关只到 qualityGatequalityGate.enabledqualityGate.algorithmqualityGate.algorithms 四层,没有(也无法预先枚举)qualityGate.algorithms.<算法名> 这种动态键。

qualityGate.algorithms 本质是"按算法名索引的动态键映射"(schema 中也定义为 additionalProperties: true)。校验器对同类的 compress.modelMaxLimits / compress.modelMinLimits / messageFilters.filters 已做"命中即停止递归"的跳过,却漏了给 qualityGate.algorithms 加同样处理(#262 修复时同样漏掉了这个键,见 master 分支最新源码)。

附带确认:配置本身正确且生效——(qg.algorithms && qg.algorithms[algoName]) ?? {} 会读取该映射传入质量门评估,layer1MinRetentionPct 等参数确实在起作用。

Expected Behavior

按算法名配置质量门参数是合法配置,不应触发 Unknown keys 警告。期望:

  1. getConfigKeyPathsqualityGate.algorithms 增加动态键跳过(参照现有 compress.modelMaxLimits / compress.modelMinLimits / messageFilters.filters 的处理),使 qualityGate.algorithms.* 下任意算法名及其参数键都视为合法。
  2. (可选)顺带核对 dcp.schema.json 与运行时校验器的一致性——目前 schema 中 qualityGate.algorithms.rouge-recall-v1.layer1MinRetentionPct 的默认值写的是 1.0,与代码中的默认 5 不一致。

Debug Context Logs

此为配置校验期的 bug,与上下文剪枝 / compress 运行时无关,context 日志无对应记录。复现只需在 acp.jsonc 写入上面的配置并重启 opencode,即会弹出警告 toast。触发警告的代码路径:showConfigWarnings → getInvalidConfigKeys → getConfigKeyPaths / VALID_CONFIG_KEYS(lib/config-validation.ts)。
{ "note": "配置校验期问题,无 context 运行时日志。复现步骤见上。" }

Tool Call Details

不涉及工具调用。纯配置文件加载校验问题。

DCP Version

1.14.22

Opencode Version

1.18.19

Model

Other (deepseek-v4-flash)

Additional Context

本 issue 是 #262 的同类遗漏:修 #262 时只给 messageFilters.filters 加了递归跳过,qualityGate.algorithms 仍是漏网之鱼。我拉取 master 分支最新 lib/config-validation.ts 确认,跳过名单目前为:

if (
    fullKey === "compress.modelMaxLimits" ||
    fullKey === "compress.modelMinLimits" ||
    fullKey === "messageFilters.filters"
) {
    continue
}

qualityGate.algorithms 依然不在其中,即该误报在当前 master 与 npm latest(1.14.22)均存在。

该警告本身无害(showConfigWarnings 只弹一个 toast,无 return / throw,不影响配置加载),配置仍正确生效。仅为提示层面的误报。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions