Skip to content

fix(R07-5): Agent实例缓存按会话隔离,修复跨会话状态串线及日志规范问题 - #184

Open
openjiuwen-sync-bot[bot] wants to merge 5 commits into
openJiuwen-ai:studio-2.0-devfrom
openjiuwenai:sync/pr-1768
Open

fix(R07-5): Agent实例缓存按会话隔离,修复跨会话状态串线及日志规范问题#184
openjiuwen-sync-bot[bot] wants to merge 5 commits into
openJiuwen-ai:studio-2.0-devfrom
openjiuwenai:sync/pr-1768

Conversation

@openjiuwen-sync-bot

@openjiuwen-sync-bot openjiuwen-sync-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

Paired: GitHub #184GitCode !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)
开关关闭时执行路径与原版一致,无功能影响
开关开启时修复生效,实现跨会话隔离

- Agent实例缓存key从ir_path改为conversation_id:ir_path,实现会话级隔离
- conversation_id为空时强制关闭实例缓存,防止跨会话泄漏
- 新增L1/L2缓存命中审计日志,替代原f-string日志
- 修复codecheck规范问题(simple_log双模式日志)
- StandaloneRunner/HierarchicalAgentGroup透传conversation_id
- 新增R07单元测试10个用例
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


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.

@openjiuwen-collaboration-bot

openjiuwen-collaboration-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

head_sha: 999696ec5ffb55f8d1161dda5d601d5f96dc8063

变更摘要

此 PR 修复了 AGENT_CACHE_ENABLE=true 时 Agent 实例缓存因 key 仅含 ir_path 导致的跨会话状态串线问题(R07)。核心改动是将一级实例缓存的 key 从 ir_path 改为 f"{conversation_id}:{ir_path}",实现会话级隔离;同时新增二级 cache_agent_config 配置缓存层(key=ir_path),保留跨会话共享配置的收益。此外,沿 HierarchicalAgentGroupStandaloneRunnerMemberInstanceManager 链路透传 conversation_id,并在 conversation_id 为空时强制关闭实例缓存作为防御。日志方面将大量审计日志从 info 降级为 debug,减少生产噪音。

主要改动

  • L1 实例缓存按会话隔离: MemberInstanceManager._lazy_load_member()IRConverter.create_or_restore_agent() 中将 cache_agent_queue 的读写 key 从 config.ir_path 改为 f"{self._conversation_id}:{config.ir_path}",确保不同会话的 Agent 实例互不命中,从结构上消除跨会话串线。
  • 新增 L2 配置缓存层: 在 open_utils.py 中新增 cache_agent_configCacheUtils 实例,key=ir_path),MemberInstanceManagerIRConverter 在获取 Agent 实例前先通过该层缓存/复用 AgentConfig,避免重复 IR 解析和工具/插件构造,跨会话共享配置引用。
  • conversation_id 链路透传: HierarchicalAgentGroup.__init__() 新增 conversation_id 参数并传递给 StandaloneRunnerStandaloneRunner.__init__() 新增 conversation_id 参数并传递给 MemberInstanceManagerIRConverter 在创建 HierarchicalAgentGroup 时传入 conversation_id,形成完整透传链路。
  • 空会话防御: 在 MemberInstanceManager._lazy_load_member()IRConverter.create_or_restore_agent() 中增加检查:当 conversation_id 为空字符串且缓存开关开启时,强制将 cache_enabled 设为 False 并输出 warning 日志,防止退化为按 ir_path 共享的原始 bug。
  • 日志级别降级与细化: CacheUtilsagetaput_update_memory_cache_get_from_memory_cache 等方法中大量 logger.info 改为 logger.debug,并增加带 simple_log 参数的审计日志(L1_HITL1_MEM_HITL2_HIT 等),便于问题排查的同时控制生产日志量。

@openjiuwen-collaboration-bot

openjiuwen-collaboration-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

head_sha: 999696ec5ffb55f8d1161dda5d601d5f96dc8063

代码审查

我已经完成了对全部 6 个变更文件的审查。以下是我的发现和总结。


审查结果

共发现 1 个问题

优先级 数量
P0 0
P1 0
P2 1
P3 0

问题详情

P2agent-runtime/jiuwen/serve/controllers/execution/open_utils.py:137:同步 put() 方法的 except 块中错误日志写成了 "cache pop error",应为 "cache put error"。这是从同文件 pop() 方法(第 223 行)复制粘贴导致的错误,会误导排障。


各文件审查确认

文件 审查结论
agent-runtime/jiuwen/multi_agent/agent_group/hierarchical_group/agent_group.py ✅ 无问题 — conversation_id 通过 __init__StandaloneRunner 链路正确透传
agent-runtime/jiuwen/multi_agent/core/member_instance_manager.py ✅ 无问题 — L1/L2 双层缓存逻辑正确,空 conversation_id 防御生效,session key 正确隔离
agent-runtime/jiuwen/multi_agent/core/runner/standalone_runner.py ✅ 无问题 — conversation_id 正确透传给 MemberInstanceManager
agent-runtime/jiuwen/serve/controllers/execution/ir_converter.py ✅ 无问题 — HierarchicalAgentGroupcreate_or_restore_agent 均正确传入 conversation_id,空会话防御一致
agent-runtime/jiuwen/serve/controllers/execution/open_utils.py ⚠️ 1 个问题 — put() 方法异常日志复制粘贴错误(见上)
agent-runtime/tests/unit_tests/cache/test_r07_agent_cache_isolation.py ✅ 无问题 — 测试覆盖全面,覆盖跨会话隔离、同会话复用、空会话防御、缓存关闭、Config 单例等场景

整体风险评估

低风险。核心改动——按 conversation_id 隔离 Agent 实例缓存——设计合理、实现完整,调用链路 HierarchicalAgentGroup → StandaloneRunner → MemberInstanceManagerconversation_id 透传一致,空会话防御覆盖了 _lazy_load_membercreate_or_restore_agent 两条缓存路径。唯一的缺陷是 open_utils.pyput() 方法的一个错误日志字符串,不影响运行时行为,仅影响排障效率。

类型 数量
🔴 阻塞 0
🟡 建议 4

💬 仅评论

@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: 999696ec5ffb55f8d1161dda5d601d5f96dc8063

TASK STATUS DETAILS
CodeCheck ✅SUCCESS Click here
AntiPoison ✅SUCCESS Click here
Software Composition Analysis ✅SUCCESS Click here
Npm Build ✅SUCCESS See CHECK tab
Ruff Check ✅SUCCESS See CHECK tab
UT测试 ✅SUCCESS 点此跳转

Comment thread agent-runtime/jiuwen/serve/controllers/execution/open_utils.py Outdated
chenmingjie100 added 2 commits August 3, 2026 21:13
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 对齐。
@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: ead279bdfd48475f6f1020f25db657758332e9f4

TASK STATUS DETAILS
CodeCheck ✅SUCCESS Click here
AntiPoison ✅SUCCESS Click here
Software Composition Analysis ✅SUCCESS Click here
Npm Build ✅SUCCESS See CHECK tab
Ruff Check ✅SUCCESS See CHECK tab
UT测试 ✅SUCCESS 点此跳转

@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: ead279bdfd48475f6f1020f25db657758332e9f4

TASK STATUS DETAILS
CodeCheck ✅SUCCESS Click here
AntiPoison ✅SUCCESS Click here
Software Composition Analysis ✅SUCCESS Click here
Npm Build ✅SUCCESS See CHECK tab
Ruff Check ✅SUCCESS See CHECK tab
UT测试 ✅SUCCESS 点此跳转

- open_utils.py: 6 处 simple_log 占位符补齐 + put() 错误日志修正

- member_instance_manager.py: 2 处 simple_log 占位符补齐

- ir_converter.py: create_agent_config 补充 ir_path/is_published 字段
@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: f24c1f8e5999ab3394be098f363574e4fecf7501

TASK STATUS DETAILS
CodeCheck ✅SUCCESS Click here
AntiPoison ✅SUCCESS Click here
Software Composition Analysis ✅SUCCESS Click here
Npm Build ✅SUCCESS See CHECK tab
Ruff Check ✅SUCCESS See CHECK tab
UT测试 ✅SUCCESS 点此跳转

@openjiuwen-collaboration-bot

Copy link
Copy Markdown

head_sha: a773111b9ce3df4de726f77710ea2c8a1d368099

TASK STATUS DETAILS
CodeCheck ✅SUCCESS Click here
AntiPoison ✅SUCCESS Click here
Software Composition Analysis ✅SUCCESS Click here
Npm Build ✅SUCCESS See CHECK tab
Ruff Check ✅SUCCESS See CHECK tab
UT测试 ✅SUCCESS 点此跳转

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant