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,不影响配置加载),配置仍正确生效。仅为提示层面的误报。

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

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions