Skip to content

[Bug]: 指定模型不存在时回退默认模型未记录 WARN 日志(不可诊断) #340

Description

[Bug]: 指定模型不存在时回退默认模型未记录 WARN 日志(不可诊断)

目标仓库 openJiuwen/agent-core-java;提交前需按 gitcode-issue-quality-scoring 自评并获用户授权。
基线说明:本轮基线为 core 开发指定的转测基线 930(419688f58/头 20b1090e,制品 agent-core-java:0.1.16);复现证据即在该基线上取得。该内容另经 squash 进入 develop(0.1.17),只读源码复核同样成立;结论不自动适用于 0.1.17。

① 场景

  • 测试场景:调用方在 A2A 请求 metadata 中指定一个未登记的模型名 → 运行时把该标识写入请求上下文 → agent-core 解析失败 → 回退默认模型完成请求
  • 模块:agent-core-java
  • 特性:FEAT-050-CORE:动态模型配置(agent-core)
  • 目标仓库:openJiuwen/agent-core-java
  • 关联用例:dmc.route.fallback / DynamicModelCandidateReproTest#cand01FallbackLogsWarn
  • 正式基线:930@419688f58(core 开发指定的转测基线);制品 com.openjiuwen:agent-core-java:0.1.16
  • 需求依据:FEAT-050-CORE §2「模型解析 优先级链」、§5.1.5 异常表、§4 SC-CORE-04

② 问题概述

请求指定了不存在的模型时,实现按契约回退到默认模型并正常完成(这部分正确);但设计同时要求记录 WARN 日志(内容形如"指定模型 X 不存在,回退默认模型 Y"),实测该回退分支没有任何日志输出。影响:回退是静默的,运维无法从日志发现"调用方写错了模型名"或"模型未登记",只能看到请求成功。

③ 问题分析

3.1 判据

  • 权威来源:FEAT-050-CORE(docs main de5e8baa)§2、§5.1.5、SC-CORE-04
  • 原文保真摘要:「❶ 未命中(modelId 不在列表中):降级到 ❷❸ 级,记录 WARN 日志("指定模型 X 不存在,回退默认模型 Y"),请求正常完成。」(MUST 级,未改写)
  • 缺陷判定:实际行为完成了"回退 + 成功",但缺少 MUST 要求的 WARN 记录 → 属"可诊断性"要求未落地,不是范围外能力。

3.2 执行与观察证据

  • 执行状态:executed;用例结论:FAIL(该用例按设计断言"必须出现 WARN",故 FAIL 即"未落地"的复现证据)
  • 精确 selector:DynamicModelCandidateReproTest#cand01FallbackLogsWarn
  • 结果计数:Tests run: 3, Failures: 3(同批候选复现组,其中本条 FAIL);执行时间 2026-09-22,WSL Ubuntu / JDK 21
观察项 预期 实际 证据
回退分支的 WARN 日志行数(本次请求时间窗) ≥1 且含请求的模型名 0 ErrorEvidence: …回退实现所在分段落日志行数=0
请求最终落点 默认模型端点 默认模型端点(正确) 端点收单记录 + 响应 canary

关键证据:

设计要求:指定模型不存在时回退默认并记录 WARN(FEAT-050 §2/§5.1.5/SC-CORE-04)。
本次请求 model_name=ghost-462037857703,回退实现所在分段落日志行数=0

(本项以 SIT FAIL 发现;XML 见本轮证据目录 target/dmc-evidence/all/。)

3.3 现象、定位与推断

  • 已观察事实:请求成功、落默认模型;同一时间窗内其它 WARN 可被采集到,采集通道本身有效
  • 已排除项:夹具日志采集范围(同时采 run.log 与 stdout.log 全量追加行)、环境、制品版本、请求通道
  • 静态分析:ModelMgr.resolveModel(dynamicModelId, …) 在"dynamic 未命中"分支直接 fall through,无 logger 调用;ReActAgent 侧亦无
  • 待开发确认的推断:日志应输出的层与关键字(设计未规定载体)

3.4 Pre-flight 与历史关系

  • 全字段扫描:本项不涉及字段级差异;同类"可诊断性"要求仅此一处
  • 交叉通道验证:换成"未指定模型名"的请求不产生日志属正常(不是本条);两条对照说明差异只来自"是否命中 ❶"
  • 客户端可见契约核对:设计未定义日志载体,故本条只能证明"无任何日志",不能指定关键字
  • 历史 ISSUE 关系:未发现同族历史单

④ 复现条件

  • 前置:载体登记模型 {A, B} 且默认 A;A 端点与 B 端点可区分
  • 可执行命令:mvn -o -Dtest.env=openjiuwen -Dtest=DynamicModelCandidateReproTest#cand01FallbackLogsWarn test
  • 预期失败信号:断言"WARN 行数 ≥1"失败
  • 复现产物位置:target/feature-acceptance-testing/dmc-cand01-evidence.json、本组 XML

⑤ 问题代码分析

  • core/src/main/java/com/openjiuwen/core/runner/resourcemanager/ModelMgr.java → resolveModel(String dynamicModelId, ModelClientConfig, ModelRequestConfig) 的"dynamic 未命中"分支(无日志)
  • core/src/main/java/com/openjiuwen/core/singleagent/agents/ReActAgent.java → getLlm(AgentCallbackContext)(取模型路径,无日志)

⑥ 问题影响

  • 影响面:所有"调用方传错/传了未登记模型名"的请求;现象是"静默降级",与设计"不静默成功"的 DFX 目标相反
  • 风险:排障成本高;错误配置长期不被发现(模型分流失效但无告警)

⑦ 建议修复方案

  • 在回退分支输出 WARN,包含请求的 modelId 与实际回退目标;载体与关键字建议由 L2 明确(当前 L2 缺失)
  • 修复验证清单:cand01FallbackLogsWarn 转 PASS;dmc.route.fallback 仍 PASS(回退语义不被破坏)

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions