使用deepseek harness 设计插件安装评审师agent时,出现了死循环 #2690
Replies: 3 comments
|
评审师这个方向好,死循环的坑也可以绕:生成/评审阶段放在进程级沙盒实例里跑(独立 DSH_HOME / 端口),agent 死循环或写坏文件,最坏炸掉沙盒进程,本体照常;评审通过再合回/安装到本体。我们 dsh-sandbox-tester 的合回门禁(语法校验 + bundle 校验 + 备份回滚)正好是「评审通过才放行」的机器实现:https://github.com/Sutera-Diffusus/dsh-sandbox-tester |
|
您好: 您的邮件已收到,我会尽快处理,谢谢! 孙玉圣
|
|
你这份复盘的质量很高(尤其是把"前因/症状/跳出方法"分开写)。补一条机制层面的解释——你的复盘里把根因归到"误读了机制",但那个机制本身其实有个具体的、可以指认的原因,而且它不是你的错。 为什么"注册工具 → 下一步就能调"不成立我们(做 DSH 上的兼容层)为了让插件注册的工具能被模型看到,实测核证过这条链路,结论是: 模型这一轮能看到哪些工具,取决于 也就是说:
这也解释了为什么你的跳出方法有效:你抛弃"注册工具 → 调用工具"这条链,改成让插件在激活时直接干活——绕开了那个快照。 (顺带说:这个快照时点是可以被官方 waterfall 收口的—— 这条最该被修的地方是那句技能文案你复盘里引的是:
如果实际条件是"下一次装配"而不是"下一步",那这句话就是让模型走进死循环的直接原因。 模型完全按文档行事:文档说下一步会出现,那就走一步看看;没出现,那就再走一步——这个行为是文档教出来的,不是模型胡来。 我觉得这条值得单独提给维护者,因为它便宜且收益明确:把那句改成准确的条件(例如"注册的工具将在下一次系统提示装配时进入模型的函数列表;本轮内不可调用"),下一个照着这个技能做事的 agent 就不会再烧那几十轮。 (这属于这个社区里一类反复出现的问题——给模型的反馈不足以让它纠正行为:工具参数解析失败退化成空对象、模型原样重发 17 次;MCP 会话过期被当成普通工具错误、模型重新规划 61 次。你这条是同族里唯一一个源头在文档而不是代码的,所以也是最好修的。) 关于"没有跳出机制"那条你写的:
这一条其实不该由模型自己负责。#3489 那边讨论的正是这件事——确定性错误重复出现时,重试不会有不同结果,所以该有一个不依赖理解错误含义的熔断(同一个 (工具, 错误指纹) 在一轮里重复 N 次就停)。你这次是"同样的 no-op 数十轮",指纹重复得再明显不过。如果那条熔断存在,你不需要两次强制中断。 关于你的评审师本身@Sutera-Diffusus 建议把生成/评审放进独立 DSH_HOME 的沙盒实例跑、通过再合回本体——方向是对的(隔离是真边界,不像"再叫一个模型判断安不安全"那种)。补两条实操上的坑,因为你的评审师最终要落到"装插件"这个动作上:
边界与利益相关我们不修 DSH 自家组件——工具注册链路、agent loop、技能文档都在 DSH 里。第一节那个快照机制是我们在真 DSH 组合上实测核证的;但我没有读过你用的那份技能的原文,第二节建立在你复盘里的引用上。引用的 #1697 / #2917 / #3489 都是别人的报告。 利益相关:我维护 pi2dsh(Pi 生态兼容层)。这条不推销——你在做的是 DSH 原生的预设与评审流程,装什么插件都不改变那个快照时点。 |
Uh oh!
There was an error while loading. Please reload this page.
基于以上三个隐患,我需要一个插件安装评审师的Agent,主要流程是:用户提出要安装/更新/升级某个插件 -> Agent从多个角度进行评审和建议 -> 等待用户确认是否安装 -> 如果确认,则安装; 如果不确认,则停止安装。
输入设定,让deepseek harness在创造模式下生成agent,权限给的Workspace Wright,生成过程突然出现死循环,一直在打印同样的内容,而没有自动纠偏,在我的两次强制中断提醒后才恢复
以下是deepseek harness自己的复盘:
插件安装评审师预设制作复盘(含死循环记录)
背景与目标
用户诉求:DSH 插件来源多样,安装前需要一位「插件安装评审师」Agent 从三个维度把关:
约定流程:用户提出安装/更新/升级 → Agent 多角度评审并给建议 → 等待用户确认 → 确认才安装,否则停止。
产物路径:
~/.dsh/.agent-presets/plugin-reviewer/(agent.cordis.yml+preset.yml)。正常流程(可复用套路)
editing-cordis-compositions技能,明确预设属于 AGENT-PLANE,服务行必须进isolaterealm。agentPresets服务:copy('standard', 'plugin-reviewer', '名称')复制标准预设作为起点(复制是唯一授权写入方式,且不触发沙箱)。
preset.yml的 name/description。agent.cordis.yml:agentPresets.standingKeyFor(id)挂载验证(失败会点名错误行)。死循环复盘
症状
为调用
agentPresets服务,我定义了一个动态插件注册preset_admin工具,然后:反复执行 内容几乎相同的 no-op bash 调用(
echo xxx数十轮),期待"下一步工具就出现在可调用列表里",结果工具始终不可直接调用,白白消耗轮次与 token。
前因(为什么会这样)
但动态插件通过
cordis_run注册的工具没有进入当前 Agent 的函数 schema——cordis_inspect_query(Tool.listTools)显示它"注册且对请求 Agent 可见",但模型侧函数列表(system prompt 固定的那批)并没有它,所以我根本无法以函数调用形式触发它。
而没有检查权威证据(工具目录查询结果其实已经返回了)。
跳出方法(决定性的一步)
完全抛弃"注册工具 → 调用工具"链路,改为让插件在激活时直接执行操作:
bash/read直接验证文件系统产物(~/.dsh/.agent-presets/plugin-reviewer/出现即成功);standingKeyFor,把结果写到工作区文件再读回,拿到明确证据(
MOUNT_OK+ roster 含plugin-reviewer:user)。教训(可复用)
cordis_inspect_query的返回,而不是反复调用一个不相干的工具去"等它出现"。
"repeated tool call detected"。
agentPresets等)不一定需要"注册模型工具"才能用;"激活时执行 + 文件系统证据" 是绕过模型函数列表限制的通用套路。
copy()+standingKeyFor()是技能明示的正规写法,我一开始绕去自定义工具链路,属于自找复杂度。
审查结论(第二次 review,2026-08-17)
对成品预设复查:
删除 plan/goal/delegation 与"评审→确认→安装"的有界交互匹配,不引入结构性风险。
补充了"安装命令写 profile 目录会触发沙箱审批(第二道确认门)"的预期说明。
standingKeyFor复验通过,无不可修复问题。信誉调研(web search)、确认交互(ask-user)与安装执行(bash + 沙箱审批)的全部能力。
相关链接
All reactions