已合并
fix(harness): support the creation, loading, and execution of templates and plugins #2558
fix(harness): support the creation, loading, and execution of templates and plugins #2558
已合并
zhangyao创建于 8 天前
zhangyao
8 天前

Paired: GitHub #1001GitCode !2558

What type of PR is this?

/kind bug

  • When DeepAgent loads, switches, or unloads an AgentTemplate, it writes an expert‑role‑switch attachment notification to the session.
  • The plugin manifest supports loading prompts routed from prompt_sections/*.md.
  • In case of skill conflicts within a package, extension skills take precedence over host skills; priority order: expert > plugin > user‑local skills.

Self-checklist:(请自检,在[ ]内打上x,我们将检视你的完成情况,否则会导致pr无法合入

Linked Closing Issues:

likedislike
Pull Request已成功合入, 合并人@openJiuwen-bot
(感谢 zhangyao 的贡献)
Zzhangyao
8 天前 关联了issue:[Feature]: add AgentTemplate and Plugin loading
atomgit-bot
atomgit-bot
8 天前 评论:

变更摘要

本 PR 属于 /kind bug 修复,核心是完善 DeepAgentAgentTemplate(模板)与插件(plugin)的创建、加载与执行支持。主要包含三方面:其一,DeepAgent 在加载、切换或卸载 AgentTemplate 时,通过 PromptAttachmentManager 向会话写入 expert_role 专家角色切换的模型可见通知(加载/卸载提示),并用 _active_agent_template 记录当前生效模板;其二,extension_binder 调整技能绑定顺序,使包内扩展技能优先于宿主同名技能(优先级:专家 > 插件 > 用户本地技能);其三,插件 manifest 支持通过 file 字段路由加载 prompt_sections/*.md 作为提示词片段。

主要改动

  • 专家角色加载/卸载通知同步:在 deep_agent.py 中新增 _sync_expert_role_attachment_expert_role_load_content_expert_role_unload_content 以及 _active_agent_template 状态记录,在 invoke/stream/run_one_round 的调用路径上同步 expert_role 会话附件(PromptAttachmentKind.RUNTIME),实现加载、切换、卸载时的角色提示写入。
  • 默认会话 ID 兜底:当 sessionconversation_id 均为空时,invoke_inputs.conversation_id 会填充为 _DEFAULT_CONVERSATION_ID = "default_session",保证内层 agent 与附件管理使用一致的会话标识。
  • 技能绑定优先级调整extension_binder._bind_skill 重排 skills_dir,将已绑定的包根目录置于宿主目录之前,使扩展(插件)包内的同名技能优先于宿主技能(SkillUseRail 保留先加载的名称)。
  • 插件提示片段文件路由extension_loader 新增 _build_prompt_section_specs,支持 manifest 中 prompt_sectionsfile 指向 prompt_sections/*.md 的方式加载(文件名作为 name,文件内容作为 content),同时校验文件必须位于 prompt_sections/ 目录且为 .md,并保留内联 name + content 写法及 priorityrender_params 透传。
  • 测试覆盖更新:新增 tests/unit_tests/harness/test_deep_agent_expert_role.py(覆盖加载/切换/卸载/失败回滚/多会话/任务循环等场景),并为插件提示片段路由、技能优先级、默认会话 ID 补充或更新了既有单测断言。
likedislike
atomgit-bot
atomgit-bot
8 天前 评论:

代码审查

✅ 未发现问题

likedislike
OopenJiuwen-bot成员
8 天前 将seanzhang_cn,xinyu-jiuwen设为审查人
atomgit-bot
atomgit-bot
8 天前 评论:

AtomGit AI 助手使用指南

在 PR 评论中使用命令即可触发。支持在普通评论和代码行评论中使用。

功能 命令 说明
代码审查 /ai review 检查代码质量、潜在问题、安全风险
PR 摘要 /ai summary 生成 PR 变更内容的结构化摘要
代码解释 /ai explain 解释代码变更的逻辑和意图
自由提问 @atomgit-bot <问题> 询问关于本 PR 的任何问题
帮助 /ai help 显示此帮助信息

免责声明

AI 助手可能存在误判,请结合自身判断。可以对评论点 👍 或 👎 帮助我们改进。

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:sig/sig-agent-core
openJiuwen-bot成员
8 天前 评论:

欢迎来到 openJiuwen 社区

Hey @zhangyaomaggie , 感谢你对社区的贡献.

机器人使用手册

有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。

联系指引

有疑问可以联系 SIG: sig-agent-core ,
维护者是: @seanzhang_cn, @xinyu-jiuwen ,
审核者是: @alan_cheng, @chenmaxqian, @cyz95, @deyang, @gcw_xJSJ32Ge, @iamcandiceguo, @xiaowenzihwl, @yangzequ, @zepinzhang .

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:openJiuwen-cla/yes
Oopenjiuwen-sync成员
8 天前 修改了pull request 的描述
Oopenjiuwen-sync成员
8 天前 修改了pull request 的描述
openJiuwen-bot成员
8 天前 评论:

The pipeline(pipeline number:2558) is running. Please wait a moment...

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:ci-running
OopenJiuwen-bot成员
8 天前 删除了label:ci-running
openJiuwen-bot成员
8 天前 评论:
任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 N/A N/A
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ❌FAILED 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
likedislike
OopenJiuwen-bot成员
8 天前 添加了label:ci-failed
Zzhangyao
8 天前 强制推送  1 个提交:777f06ce-fix(harness): support the creation, loading, and execution of templates and plugins
OopenJiuwen-bot成员
8 天前 删除了label:openJiuwen-cla/yes
OopenJiuwen-bot成员
8 天前 添加了label:openJiuwen-cla/yes
openJiuwen-bot成员
8 天前 评论:

The pipeline(pipeline number:2558) is running. Please wait a moment...

likedislike
OopenJiuwen-bot成员
8 天前 删除了label:ci-failed
OopenJiuwen-bot成员
8 天前 添加了label:ci-running
OopenJiuwen-bot成员
8 天前 删除了label:ci-running
openJiuwen-bot成员
8 天前 评论:
任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 N/A N/A
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
likedislike
OopenJiuwen-bot成员
8 天前 添加了label:ci-successful
lideyang成员
8 天前 评论:

/lgtm

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:lgtm-deyang
openJiuwen-bot成员
8 天前 评论:

Review Code Feedback

  • The label lgtm-deyang was added to this pull request. It means that deyang reviewed the code changes. 👋
Tips
  • If this pull request is not merged while all conditions are met, comment /check-pr to try again. 😄
likedislike
yangzequ成员
8 天前 评论:

检视意见:

实现质量高、测试充分(T-01~T-13 覆盖快照位置、幂等、切换、失败回退、插件隔离、子代理隔离)。三块改动各自独立成立。红线核查:生产代码无新增 URL;专家角色通知属 runtime attachment 功能设计,非篡改基础系统提示词。以下问题建议作者回应:

🟡 建议修改

N1 — 专家角色通知文案硬编码中文,无 i18n(deep_agent.py:261-272)
_expert_role_load_content / _expert_role_unload_content 固定输出中文,而 harness 提示体系是语言感知的(_render_identity_prompt(prompt_builder, language))。英文 locale 的 agent 会收到中文运行时通知。建议按 agent language 走双语模板。

N2 — 技能优先级静默反转,属破坏性行为变更(extension_binder.py:235-258)
旧语义(旧注释明确记载):workspace/skills 赢过同名 package skill;新语义:package 全面优先。测试同步改写说明是有意为之,但对依赖 workspace 覆盖同名插件技能的现有用户是静默破坏。建议在 PR 描述/CHANGELOG 显式声明此行为变更及动机。

N3 — invoke 无 session 时强制注入 conversation_id="default_session"(deep_agent.py:2796-2799)
_sync_expert_role_attachment 为拿到落点 session_id 直接改写 invoke_inputs.conversation_id,这是全部 invoke 路径的可见行为变更(test_deep_agent.py:518 断言改写证实)。可能影响下游按 conversation_id 路由的记忆/持久化行为。建议仅在确有 active template 时才补默认值,或换一种不修改调用方输入的落点推导方式。

🔵 信息

  • N4:_bind_skill 深入读取 agent._load_records 内部结构并逐条 resolve() 分类 package/host 目录——binder 层耦合 agent 内部状态,可在 LoadRecord 上预计算 package_root 消除
  • N5:_sync_expert_role_attachment 整体 except Exception 吞掉并 warning——"角色通知不得阻塞模型调用"取舍合理,但附件写失败时用户无感知丢失角色切换指令
  • N6:prompt_sections 以 md stem 作 section name,不同子目录同名 stem 会冲突(低风险)
  • N7:unload 通知写入后永久保留 unload 文案(不清 section)——T-09 证实同角色重载幂等,语义自洽

📡 KV-cache 命中率影响分析

结论:核心设计对 KV-cache 友好,稳态无额外失效;有三处一次性/边界成本需知晓。

✅ 对缓存友好的证据:

  1. 增量注入设计正确。expert_role 通知经 PromptAttachmentManager 以 SystemMessage 快照/增量形式追加到上下文历史尾部(T-01 断言 [snapshot, user_message];collect_for_session 仅被 sync_to_context 消费,不进每次请求的系统提示词)。尾部追加意味着 system prompt + 历史前缀不变,provider 侧前缀缓存(DeepSeek/GLM implicit cache、KVCacheAffinityConfig)仍然命中——角色切换只增加新 token,不作废前缀。
  2. 稳态幂等。同角色重复 invoke 时 add_section 内容确定性相同,state 无变化 → sync 返回 None(T-02 证实),不产生任何新消息,零缓存成本。
  3. conversation_id="default_session" 预填不改变 KV-cache 亲和键。核对 react_agent invoke 路径:session 为 None 时原本就走 session_id = conversation_id or "default_session",自动创建的 session id 在本 PR 之前就是 "default_session";resolve_lineagectx.context.session_id() 为 fallback,亲和键 (id(model), session_id) 前后一致。

⚠️ 需知晓的成本与边界:

  1. 切换/卸载轮次的一次性尾部追加:load/unload/A→B 各产生一条 SystemMessage 增量(自包含文案,T-03),纯增量、无前缀作废——成本可忽略。频繁切换场景下尾部会积累角色通知 token(与 N7 的永久保留叠加),长会话有轻微上下文膨胀。
  2. N2 的技能目录重排序会在 hot-load 绑定后改变 skills_dir 顺序 → 若技能列表渲染进系统提示词,绑定后的首个请求系统提示词内容变化 → 一次性全前缀失效。这不是新增的失效类别(绑定本来就会改 skills_dir),但重排使绑定前后差异更大,值得留意。
  3. 边界:agent 全局的 _active_agent_template 对多 session 实例意味着每个 session 在各自下一次 invoke 时尾部各追加一条通知——按 session 分别看仍是尾部追加、缓存安全;但同一实例服务多个无 session 调用方时,所有调用方共享 "default_session" 的附件状态,存在角色通知跨调用方污染的正确性风险(与 N3 相关,非缓存问题本身)。
  4. 压缩恢复路径已考虑:manager 在快照被 compaction 移除后会重渲染完整快照避免孤儿增量(docstring 明确),该重建同样是尾部追加。

综上:从 KV-cache 命中率角度本 PR 无回归风险;建议把第 6 点的多调用方共享 default_session 附件状态纳入 N3 一并考虑。

likedislike
Zzhangyao
8 天前 强制推送  1 个提交:f331dc13-fix(harness): support the creation, loading, and execution of templates and plugins
OopenJiuwen-bot成员
8 天前 删除了label:ci-successfullgtm-deyang
OopenJiuwen-bot成员
8 天前 删除了label:openJiuwen-cla/yes
openJiuwen-bot成员
8 天前 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): ci-successful, lgtm-deyang.

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:openJiuwen-cla/yes
openJiuwen-bot成员
8 天前 评论:

CLA 签署成功

zhangyaomaggie, 感谢您的代码贡献。 所有的代码贡献者都已完成了 CLA 签署。 👍

likedislike
openJiuwen-bot成员
8 天前 评论:

The pipeline(pipeline number:2558) is running. Please wait a moment...

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:ci-running
OopenJiuwen-bot成员
8 天前 删除了label:ci-running
openJiuwen-bot成员
8 天前 评论:
任务名称 结果 日志操作
静态检查 ✅SUCCESS 点此跳转
禁用词扫描 N/A N/A
防投毒检查 ✅SUCCESS 点此跳转
开源合规检查 ✅SUCCESS 点此跳转
UT测试 ✅SUCCESS 点此跳转
ST测试 N/A N/A
build 编译包 N/A N/A
ruff codecheck ✅SUCCESS N/A
likedislike
OopenJiuwen-bot成员
8 天前 添加了label:ci-successful
yangzequ成员
8 天前 评论:

/lgtm

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:lgtm-yangzequ
openJiuwen-bot成员
8 天前 评论:

Review Code Feedback

  • The label lgtm-yangzequ was added to this pull request. It means that yangzequ reviewed the code changes. 👋
Tips
  • If this pull request is not merged while all conditions are met, comment /check-pr to try again. 😄
likedislike
lideyang成员
8 天前 评论:

/approve
/lgtm

likedislike
OopenJiuwen-bot成员
8 天前 添加了label:approvedlgtm-deyang
openJiuwen-bot成员
8 天前 评论:

Review Code Feedback

  • The label approved, lgtm-deyang was added to this pull request. It means that deyang reviewed the code changes. 👋
Tips
  • If this pull request is not merged while all conditions are met, comment /check-pr to try again. 😄
likedislike
OopenJiuwen-bot成员
8 天前 合入了pull request