fix(R07-5): Agent实例缓存按会话隔离,修复跨会话状态串线及日志规范问题 - #184
fix(R07-5): Agent实例缓存按会话隔离,修复跨会话状态串线及日志规范问题#184openjiuwen-sync-bot[bot] wants to merge 5 commits into
Conversation
- Agent实例缓存key从ir_path改为conversation_id:ir_path,实现会话级隔离 - conversation_id为空时强制关闭实例缓存,防止跨会话泄漏 - 新增L1/L2缓存命中审计日志,替代原f-string日志 - 修复codecheck规范问题(simple_log双模式日志) - StandaloneRunner/HierarchicalAgentGroup透传conversation_id - 新增R07单元测试10个用例
|
chenmingjie100 seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
|
head_sha: 变更摘要此 PR 修复了 主要改动
|
|
head_sha: 代码审查我已经完成了对全部 6 个变更文件的审查。以下是我的发现和总结。 审查结果共发现 1 个问题:
问题详情P2 — 各文件审查确认
整体风险评估低风险。核心改动——按
💬 仅评论 |
|
head_sha:
|
verbose_log 有 7 个 %s 占位符(env=%s=%s),但 simple_log 只有 6 个 (env=%s 少了一个),而 *args 传入 7 个实参。生产环境 LOG_VERBOSE=false 下 LogRouter 用 simple_log 替换格式串,导致 % 格式化时抛 TypeError。 将 simple_log 的 env=%s 恢复为 env=%s=%s,与 verbose_log 和 args 对齐。
与 member_instance_manager.py 同类问题:verbose_log 有 env=%s=%s(6个占位符), simple_log 只有 env=%s(5个),args 传入 6 个实参。生产环境 LOG_VERBOSE=false 下会抛 TypeError,导致 debug 日志写入失败。 将 simple_log 的 env=%s 恢复为 env=%s=%s,与 verbose_log 和 args 对齐。
|
head_sha:
|
|
head_sha:
|
- open_utils.py: 6 处 simple_log 占位符补齐 + put() 错误日志修正 - member_instance_manager.py: 2 处 simple_log 占位符补齐 - ir_converter.py: create_agent_config 补充 ir_path/is_published 字段
|
head_sha:
|
|
head_sha:
|
Paired: GitHub #184 ↔ GitCode !1768
修复:R07 Agent 实例缓存跨会话串线
问题背景
AGENT_CACHE_ENABLE=true 时,Agent 实例缓存按 ir_path 做 key,不含 conversation_id,导致不同会话共享同一可变 Agent 对象,出现状态串线(会话 A 的对话历史泄漏给会话 B)。
根因
cache_agent_queue 的 key 只含 ir_path,不含 conversation_id
CacheUtils.aget 返回引用不拷贝
Agent 实例的 context_manager、history、_memory_message 被多会话共享
修复方案
L1 实例缓存隔离:cache_agent_queue key 从 ir_path 改为 f"{conversation_id}:{ir_path}",结构性隔离跨会话
L2 配置缓存共享:新增 cache_agent_config 单例层(key=ir_path),保留跨会话配置缓存收益(省去 IR 解析、工具/插件/工作流构造)
链路透传:HierarchicalAgentGroup → StandaloneRunner → MemberInstanceManager 透传 conversation_id
空会话防御:conversation_id 为空时强制关闭实例缓存,避免退化为原 bug
日志降级:审计日志从 info 降为 debug,减少生产日志噪音
隔离边界(三层兜底)
session_key 含 conversation_id → 跨会话结构性不可能命中
in-memory LRU 进程级隔离 → 跨 worker 不共享
pickle broken(_thread.lock 不可序列化)→ Redis 永不写入 → 跨 worker 不命中
改动文件
agent-runtime/jiuwen/multi_agent/agent_group/hierarchical_group/agent_group.py
agent-runtime/jiuwen/multi_agent/core/member_instance_manager.py
agent-runtime/jiuwen/multi_agent/core/runner/standalone_runner.py
agent-runtime/jiuwen/serve/controllers/execution/ir_converter.py
agent-runtime/jiuwen/serve/controllers/execution/open_utils.py
agent-runtime/tests/unit_tests/cache/test_r07_agent_cache_isolation.py(新增)
测试
新增 10 个单元测试,覆盖以下场景:
跨会话缓存隔离(不同 conversation_id 的 cache key 不同、实例不同)
同会话缓存复用(相同 conversation_id 命中缓存)
空 conversation_id 防御(空时强制关闭缓存)
开关关闭时不走缓存(AGENT_CACHE_ENABLE=false)
AgentConfig 单例共享(L2 跨会话共享同一 config)
注意事项
本次为预防性改动,AGENT_CACHE_ENABLE 维持关闭(默认 false)
开关关闭时执行路径与原版一致,无功能影响
开关开启时修复生效,实现跨会话隔离