根因定位(开发侧已确认)
与 #151/#153 同根因家族:default_model 引用变化经 config_sync 下发后属 A 类变更(deploy_ver
变化)→ 老代 Pod 日落;0.0.27s 无排空窗口,日落判定只看版本不看会话——有流量/无流量 Pod 同批
即刻回收(与贵方同事手工观察一致);Pod 被收触发 notify_pod_dead,该 Pod 上全部会话绑定被
原子清除(session 哈希四处同删)→ /visualization/session 404。404 = 绑定随 Pod 被连带清除,
非会话数据丢失。
修复:日落优雅排空窗口(与 #151 同批交付)
对本单场景(session_ttl=600):变更后 600s 排空窗口内,原 Pod、原绑定、原模型 A 配置全程保留
(404 → 200,旧会话可继续原上下文);新 session 即刻部署新 Pod 并消费模型 B;无有效会话的空闲
Pod 在窗口截止即回收(与贵单"不要求空闲 Pod 等到 TTL"的口径一致)。窗口后旧会话若仍活跃,下一
条消息重放置到新 Pod(模型 B)——有界优雅的设计边界。
复验请断言:① 变更后旧 session 绑定查询 200 且 Pod/模型不变(窗口内多点采样);② 新 session 用
B;③ 窗口截止后空闲 Pod 回收、活跃旧会话 rebind。#4391(补位失败)由 surge 余量单独覆盖,如仍
复现请单独反馈。


0.0.31s 回归通过,按本单“Agent 模板 default_model 引用变化后,有效旧 session 绑定及业务连续性”范围关闭。
环境:swarm123 / test,PostgreSQL;执行日期:2026-09-20。用例:TC-SDS-GATEWAY-AGENT-REF-025,run_id:sds-14e353db0d88。真实模型,无 mock。
验证步骤与结果:
- Agent 初始引用模型 A(Qwen3.7-Plus-no-thinking),旧 session 完成真实聊天并记录 Pod、模型与上下文。
- PATCH Agent 的
template_ref.default_model为模型 B(Qwen3.7-Plus)。变更后立即及后续回访旧 session,绑定仍可查询,保持原 Pod、模型 A 与上下文,聊天成功,未再出现本单的绑定 404。 - 新 session 使用新 Pod 和模型 B,实际模型调用日志与回复、历史检查通过。
旧 session:web_1a0bda88c2f_80a6408ba210;原 Pod:jiuwenclaw-agentserver-v8tg6v39od-nnztp。新 session:web_1a0bda94189_f9a86abb3696。关联请求包括 sds-14e353db0d88-chat-1、sds-14e353db0d88-chat-2、sds-14e353db0d88-model-patch-followup-old-session。报告状态 passed,证据完整性检查通过,清理错误为空。
覆盖边界:本次验证排空窗口内的有效旧会话与新会话行为;未执行窗口截止后的自然回收/rebind,也未执行生成中并发 PATCH,不将这些扩展场景计为通过;相关生命周期问题继续单独回归。
SHA256:a1ba543cb6c6f0f3fa21340423997a26a20bfab2e285371ffc2fe76cdfe535f6,已实际下载校验一致。


测试意图与接口范围
接口测试:修改 Agent 模板的模型引用后,新会话应使用新模型;尚未到期的旧 session 应继续保留原 Pod、原模型配置及上下文。本单验证的是 Agent 的
template_ref.default_model引用变化,不是直接修改模型模板内的model_id。通过 Gateway HTTP 配置和聊天接口、Runtime 公开只读视图验证;没有通过前端页面操作,没有直接调用内部 route/touch,没有修改服务开发代码。
环境与测试数据
test_agent_reference_update,用例IDTC-SDS-GATEWAY-AGENT-REF-025。sds-264ac21ed899。Qwen3.7-Plus-no-thinking;模型B:Qwen3.7-Plus。分别创建模型模板,Agent先引用A再改为B。case-01/report.json中CONFIG_PLAN;复现配置样例、模型模板及Agent引用见附件。真实模型凭据已移除,需替换为开发环境可用凭据。复现步骤
POST /api/v1/model-templates创建可用模型A/B模板;通过POST /api/v1/agent-templates创建Agent模板,让template_ref.default_model初始引用A模板ID;建立允许测试身份的Agent资源和实例池。保存环境原配置供恢复。POST /api/v1/sessions创建旧session,再调用POST /api/v1/chat/completions完成普通聊天。记录原session、实际模型A和服务Pod ID。此步骤证明配置变更前业务可用。PATCH /api/v1/agent-templates/{agent_id},仅将template_ref.default_model改为B模板ID,保留其余引用。业务目的:后续新session使用B,而有效旧session仍沿用A。GET /visualization/session?session_id=<旧session_id>得到404。随后新session聊天成功,模型日志验证实际使用B。具体先后时刻见附件http_timings、timeline及服务日志。实际结果
旧session:
web_1a0a98a5442_84caeea8f479;原Pod:jiuwenclaw-agentserver-1hu22atfqs-e0bjs。报告
transition_old_sessions保存原绑定后,记录:GET /visualization/session: HTTP 404,关联请求标记sds-264ac21ed899-model-patch-old-session。报告最终错误为old-session continuity failed; see transition_old_sessions。新session:
web_1a0a98abedf_c6307a752684;新Pod:jiuwenclaw-agentserver-aw60705u7p-mk32o。新会话业务与实际模型B消费检查成功。HTTP相对时间:旧会话首轮从0.623秒开始、耗时7.515秒;修改后的新会话约27.664秒创建,第二轮约42.991秒开始、耗时12.700秒。完整配置TTL及绑定检查上下文在附件,失败观测发生在测试清理之前。
预期结果
Agent模型引用更新可触发Pod日落和新Pod创建,但应保留仍有效的旧session绑定,由原Pod继续承接旧配置业务;新session使用新Pod和模型B。没有有效会话的空闲Pod可以回收,本单不要求空闲Pod必须等到TTL才删除。
证据边界与开发定位建议
日志与复现数据附件
下载完整脱敏复现数据及关联日志(agent-model-reference-evidence.zip)
SHA256:
39f229860fdbd72de0b3995540d0f847e52ecf7b4752c34b2ee73944faba14e7。附件已实际下载校验一致。