📌 非官方独立评测,与 DeepSeek 无关。单一模型、自建任务集为主、小样本,结论只代表本次实验条件。
原文:DeepSeek Harness 团队《Super-agent 设计探索:迈向更自主的 Agent 系统》(作者 Yujia Qiao),2026-10-31 晚发布于官方微信公众号,官方英文版见 @DeepSeekHarness 的 X 长文。下文对原文的介绍是我们的转述和解读,不是翻译,细节以原文为准。第一部分的配图均引自官方 X 长文,版权归 DeepSeek Harness 团队,仅用于介绍和评论。
📂 完整报告、逐次数据和图(中英双语):github.com/pans1es/superagent-prototype-evaluation
文章目录
- 写在前面:你同时能盯几个 Agent?
- 第一部分:原文到底设计了什么
-
- 先打个比方:一家只有一个前台的餐厅
- 1. 为什么单会话不够:三个硬伤
- 2. 两层架构:前台不下厨
- 3. 事件驱动:Agent 不再等你敲提示词
- 4. 全双工:边干活边听你说话
- 5. 大脑在云端,手脚留在你电脑上
- 6. Watchdog:店里需要一个巡店经理
- 7. 原文自己的实验
- 8. 作者自己承认没解决的问题
- 第二部分:开源原型实现了什么(我们读了源码)
- 第三部分:我们怎么测
-
- 对照组设计
- 怎么保证公平
- 测试项一览
- 第四部分:原文的承诺 vs 我们的实测
-
- 承诺一:"两层架构更强" → 交付质量没有更好
- 承诺二:"委派靠结构,比靠提示词稳" → 前半句我们复现了
- 承诺三:"前台统一对外,少打扰" → 中间层反而带来新错误
- 承诺四:"代码先过滤,省成本" → 成立,而且最值得抄
- 承诺五:"批处理扛得住洪峰" → 成立(小样本)
- 承诺六:"持久,能自己恢复" → 正常重启成立
- 承诺七:"Watchdog 自动纠偏" → 原型里没有
- 原文自己点名的风险:"安全" → 被实测印证
- 一张总表
- 第五部分:给想做类似系统的人,6 条建议
- 第六部分:原文留下的问题,我们最想看到答案的 8 个
- 第七部分:局限
- 📂 完整报告
写在前面:你同时能盯几个 Agent?
如果你用过 Claude Code、Codex 这类编码 Agent,大概有过这种体验:开了三四个终端窗口,每个里面一个 Agent 在干活。这个在等你确认方案,那个跑完了等你验收,还有一个卡在报错里。你在窗口之间来回切,脑子里记着"2 号窗口的 PR 还没看"。
DeepSeek 的文章把这件事说得很直白:一个人通常只能同时跟进 3~5 个活跃会话。由此得出全文最核心的判断:
单个任务能做多好,取决于模型;能同时推进多少任务,取决于人的注意力。
他们的解法叫 Super-agent:不让人去管一个个会话,而是让一个一直在线的 Agent 自己在 GitHub、群聊里"听事"、接单、派活、交付,只在需要人拍板时才出声。文章还开源了一个原型 deepseek-ai/dsh-superagent-prototype。
文章写得很漂亮,但我们更好奇:它真的比一个普通的单会话 Agent 好用吗? 所以我们没有停在读文章:
- 逐节精读原文,逐行读了原型的编排源码;
- 用同一个私有仓库、同一个模型,把原型和普通单会话正面对比,三轮实验、180 多次正式运行,前后约 4 天、累计约 77 小时。
本文分两半:上半场讲清原文的机制(第一、二部分),下半场拿我们的数据逐条对照(第三、四部分)。先放结论:
🎯 原型里写成代码的机制(持久工单、入口去重、准入 Gate、重启恢复)很值得借鉴;但没有证据表明"默认上两层架构"比单会话交付得更好、更省钱或更省心。而凡是只靠提示词约束的地方,都出了偏差。
第一部分:原文到底设计了什么
先打个比方:一家只有一个前台的餐厅
原文的概念不少,我们先用一个比喻把它们串起来,后面会反复用到:
| Router(路由层) | 前台领班 | 接待所有客人、记住每桌的情况、决定派给谁;自己不下厨 |
| Worker(执行层) | 后厨师傅 | 每人负责一桌(一个任务),灶台互不干扰(上下文隔离),厨具齐全(完整工具) |
| Trigger(事件) | 客人说的每一句话 | 群聊消息、PR 评论、CI 结果、邮件、日历邀请 |
| Thread | 一桌的订单 | 同一个 PR、同一个群话题、同一串邮件里的连续事件 |
| 订阅 + 直投 | 加菜直接送到这桌的师傅 | 已经有人负责的订单,后续消息不再经过前台 |
| 两级过滤 | 门口保安 + 前台判断 | 先按规则拦,再由模型判断要不要接 |
| Watchdog | 巡店经理 | 独立于前台和后厨,定时巡查有没有人卡住、跑偏 |
1. 为什么单会话不够:三个硬伤
原文认为,给一个本地单会话 Agent 加再多 CLI、MCP、连接器都不够,因为有三个结构性问题:
所以要把 Agent 和"某个手动打开的会话"解绑,做成一个持续存在的实体。它应该有四个特征:
- 连续:用户感觉始终只有一个 Agent。你先在群里说用方案 A,后来在 PR 评论里改成 B,它要能跟上;
- 高效:能并行,质量不掉,上一件没做完就能接下一件;
- 主动:自己观察环境里的事件,该出手时出手;不需要时保持安静;
- 持久:一直在线,出了异常能自己恢复。
原文给了两张内部实例的截图,很直观:


原文用五个模块来支撑这四点:两层架构、事件驱动、全双工多渠道交互、计算 / 状态 / 环境分离、Watchdog。总架构图里的标号 2~6 分别对应原文第 2~6 节:

下面一个个讲。
2. 两层架构:前台不下厨
这里有一对根本矛盾:连续性 vs 吞吐量。
- 所有事都塞进一个会话:上下文连续,但只能串行,又慢又乱;
- 每件事开一个新会话:能并发,但没有全局视图,几个会话各说各话。
原文的解法是分两层:
- Router 层:持久存在,负责和人打交道、做全局协调,是整个系统的"记忆"和"顺序点"。它不执行具体任务,甚至可以不给它 Bash。作者的经验是 Router 用较轻的模型通常就够;
- Worker 层:每个任务一个,上下文互相隔离,有完整的执行工具,通常用最强的模型。Worker 不直接面向用户,把进展汇报给 Router。

它和常见的 “Agent Team” 有什么区别?Agent Team 是在一个任务内部拆步骤,组长很累;Router 只管任务之间的关系和分配。Worker 自己可以再开子 Agent,对 Router 透明。
作者还提出了一个有意思的观点:让用户手动管理会话,其实是沿袭了底层 LLM API 的习惯。会话应该是实现细节,"任务怎么展示给人"是另一个独立的产品问题。
Router 怎么扛住消息洪峰?批处理。 Router 推理时新来的事件先排队,下一轮合并处理。Router 每一步都是"长输入、短输出",合并进来的事件在 prefill 阶段并行计算,所以积压越多,每个决策摊到的时间反而越少。原文的压测数据:
| 平均每批事件数 | 1.0 | 2.8 |
| 单次请求耗时 | 2.5 秒 | 3.9 秒 |
| 每个决策摊销的推理时间 | 6.4 秒 | 1.6 秒 |

注意一个反直觉的地方:低负载时每个决策摊销 6.4 秒,反而比单次请求的 2.5 秒还长。原文的解释是:Router 派单前可能要推理好几步,或者调用工具召回上下文,所以一个决策往往不止一次请求。
作者据此认为,以他们团队目前的规模,不必提前给 Router 做分片。
3. 事件驱动:Agent 不再等你敲提示词
Super-agent 的输入不再是"人敲的一句提示词",而是环境里源源不断的半结构化事件。一个事件进来之后,要依次经过过滤、路由和上下文组织,必要时还会被提前执行。
3.1 两级过滤:快速路径 + 慢速路径。 真实的事件流"噪声极高、需要行动的比例极低"。所以第一级用代码按来源、群范围、白名单做准入,每个来源可以配"只响应明确请求 / 作为候选 / 直接忽略";第二级再用模型按自然语言写的策略判断要不要行动。第二级也是人用一句话改规则的入口。

3.2 订阅与直投。 Router 只负责"开新单"和"跨单协调"。一旦某个 Thread 有了负责的 Worker,后续事件由代码直接投递给它,不再经过 Router。订阅是多对多的:一个 Worker 可以跟多个 Thread,一个 Thread 也可以被多个 Worker 订阅。Router 依然能看到所有事件,以维持全局视图。


3.3 上下文:Inline、Spill 和召回链。 原文有一句很好记的话:浪费上下文窗口,就是浪费模型能力。 借鉴编译器的思路:马上会用到的内容直接放进窗口(Inline),太长或少用的放到窗口外、只留引用(Spill)。所有对象(事件、Thread、Worker 会话)都有唯一 ID,注入一个对象时顺带带上相关对象的 ID,模型就能顺着 ID 一跳一跳往回找,原文叫 Chain of Recall(召回链)。例如:一条消息 → 它所在的 Thread → 负责的 Worker → 这个 Worker 关联的另一个评审 Thread。

3.4 提前执行。 借鉴 CPU 的推测执行:结果还不确定有没有用,就先在后台做,有用就交付,没用就丢掉。原文的例子很有画面感:他们的研发群配了"静默复现并修复"策略,有人在群里报 bug,Agent 不出声地在后台复现、找修复,确认能修才冒出来发 PR,否则全程沉默。

4. 全双工:边干活边听你说话
经典 ReAct 循环里,调用一个耗时工具时整个 Agent 是阻塞的,就像打电话时对方只能等你说完(半双工)。原文把耗时的命令和子任务改成异步的 start() / stop():start() 立刻返回"已启动",结果出来后作为一条新事件投递回会话;跑太久可以 stop()。新消息在当前推理步结束后就能被处理。

原文说这个机制已经在 DeepSeek Harness 里实现,但默认关闭。
渠道方面,原文强调不能把终端那套"逐字输出长推理、频繁调用工具"的界面搬进群聊:
- IM:轻量、少打扰,只在需要人决定或确认时才发,他们验证过"每条不超过 100 字"的硬规则;
- GitHub / 邮件 / 文档:结构化、信息密度高,比如 PR 要写清问题、改动和验证结果。
两层架构正好帮了一半忙:长推理和工具调用都关在 Worker 里,对外由 Router 统一说话。
5. 大脑在云端,手脚留在你电脑上
本地 Agent 把计算、状态、执行环境绑在一台机器上。原文借鉴"计算与存储分离":
- 计算放进无状态、可伸缩的云端容器,会话状态存数据库,容器可以随时重启、替换;
- 执行环境留在原地。因为把环境整体搬到云端沙箱成本很高、容易漏东西:未提交的本地改动、私有凭证、内网服务、特定硬件和工具链。所以每台设备上跑一个不保存会话状态、只负责执行命令并返回结果的轻量 daemon。

原文提到,这和 Anthropic"把大脑和双手解耦"的思路一致;区别是 Anthropic 面向托管沙箱和客户 VPC,这篇面向可能时不时离线、带着未提交改动和本地凭证的个人机器,即 BYOM(Bring Your Own Machine)。
6. Watchdog:店里需要一个巡店经理
常驻系统只靠内部逻辑很难长期可靠。而且 Agent 最常见的故障往往不是进程崩溃,而是陷入无效循环或慢慢偏离目标,只看"进程活着没"的探针发现不了。
所以原文单独配了一个 Watchdog 会话,由定时消息驱动。它检查两类问题:基础设施故障(API 报错、状态恢复失败),以及借助模型判断 Worker 有没有实质进展、有没有跑偏。维护者还可以用自然语言问它故障原因,甚至通过它在运行时修改主系统的提示词和触发规则。
原文没有给出巡检间隔、"实质进展"的判定标准和效果数据。
7. 原文自己的实验
作者明确说负载是合成的、环境是简化的,结果只作初步参考。设置是:
- 模拟群聊 + GitHub CI 消息流,每轮约 300 条消息,其中约 20 条是真正的工作请求;
- 编码工作换成了一个只消耗时间的假工具;
- 每种方案跑 5 次,消息间隔和工作时长缩短为 1/4。
结果如下(数字取自官方 X 长文):
| ① Super-agent 完整版 | 12.4 / 15.7 | 23.2M |
| ② 去掉直投 | 12.6 / 15.5 | 31.8M |
| ③ 单会话 + 子代理工具 + 中性提示词 | 20.4 / 29.5 | 6.1M |
| ④ 单会话 + 子代理工具 + "优先委派"提示词 | 13.8 / 29.0 | 10.8M |

几个值得细看的点:
- ③ 用中性提示词时,5 次里一次子代理都没调用,主会话被消息反复打断,P95 拖到 29.5 分钟;
- ④ 明确要求"优先委派"后,5 次里 4 次委派了,P50 追到 13.8 分钟,但第 5 次模型觉得活小、自己干了,P95 依然是 29.0 分钟的长尾;
- 作者的结论:单会话的委派行为高度依赖提示词和模型的临场判断,两层架构在系统层面保证了委派;
- 代价是 Token:①的缓存读取是③的 约 3.8 倍(23.2M 对 6.1M),作者坦承这是"用 Token 换更短、更稳的完成时间";
- 直投不让任务变快,但让 Router 的决策次数少了约 30%,缓存读取少了约 27%(31.8M 降到 23.2M)。
但请注意:这个实验测的是调度,不是交付质量。 编码是假工具,所以"Router 会不会转述错"“Worker 会不会多改文件”"模糊需求会不会先问清楚"统统测不到。实验也没写用的是什么模型,每组 5 次也没给方差。这正是我们想补上的部分。
8. 作者自己承认没解决的问题
原文最后很坦诚地列了开放问题:
- 扩展:单 Router 何时不够、怎么分片、Worker 之间何时该直接通信,都没有定论;系统跑到几个月以上,长期记忆会成为主要瓶颈;
- 超越会话的协作:任务怎么展示给人、人怎么渐进介入,聊天窗口可能只是路径依赖;
- 上下文边界与 A2A:部署几个实例,本质上是在决定上下文怎么共享、怎么隔离;
- 安全:事件驱动意味着更多不可信输入。云端被攻破或被提示词注入,所有连着的设备都可能被接管;本地凭证进了模型上下文可能泄露。需要"能用凭证、但碰不到凭证"的机制,原文没有给方案,并表示在解决前只能在小范围、可信的场景运行。
第二部分:开源原型实现了什么(我们读了源码)
原型(commit 6337fc8,MIT 协议,基于 DeepSeek Harness 0.2.1-rc.3)README 说得很清楚:这是验证技术路径的研究原型,和内部实现不完全一样,不是官方产品。它监听一个 GitHub 仓库(可选接飞书),名单上的人发话、或团队规则允许时才行动。
我们按原文的模块,逐一核对原型里的实现:
| 第一级过滤 | Gate:按发送者名单、准入表决定"准不准入",分 explicit(明确请求)和 inferred(推断候选)两档 | ✅ 纯代码,同步执行、不调模型(src/policy.ts) |
| 第二级过滤 | 推断候选送给主会话研判,必须给出理由、逐条规则的判断和意图证据,代码会检查判断是否完整 | ✅ 推断候选只有在 auto 模式且命中启用的规则时才能被接单 |
| 状态持久化 | 单个 SQLite 文件(WAL、synchronous=FULL),存事件、Thread、工单、决策、待发消息 | ✅ |
| 重启恢复 | 中断的执行标记为 hostRestarted,新建执行并附一段恢复说明:先检查目录、git 历史和 GitHub,不要重复已完成的外部操作 | ✅ 已报告阶段性结果的不重派;没被读的消息放回队首 |
| 入口去重 | 事件 ID 由链接、评论编号、修改时间算 sha256 | ✅ 只去"同一条消息被重复读到",内容重复靠合批和模型判断 |
| 异步与超时 | 前台命令超过 5 秒转后台;后台作业每轮最多 30 分钟;模型/网络瞬时故障最多重试 3 次 | ✅ |
| Watchdog | 原型里没有独立的 Watchdog、心跳或卡死检测;官方部署文档另给了一个"每小时巡检"的外部配方 | — |
| Worker 不对外说话 | 原型里 Worker 开始干活前会直接在原消息下回复确认,交付时也会自己发评论 | ⚠️ 与文章描述不同 |
| 订阅直投 | 已有工单的 Thread 里,任何人的消息都会作为参考送到 Worker,不检查名单 | ⚠️ 直投绕开了名单(src/core/intake.ts) |
| 执行权限 | Worker 会话权限是 danger-full-access:文件写入不设围栏、bash 不受限、从不弹审批 | ⚠️ 独立工作目录不是安全边界 |
| 禁用命令 | 通过在 PATH 前面放拦截脚本实现 | ⚠️ 我们在本机模拟:按名字调用被拦,按绝对路径调用就绕过了(作者文档也承认) |
| 改动范围 / 合并 | 代码不检查 Worker 改了什么;"Agent 不自己合并"只写在提示词里 | ⚠️ 要强制审批得自己配分支保护 |
🔍 一句话概括原型:代码管"谁能下单",提示词管"能做什么、怎么说话"。这个分界线,后面的实测数据几乎完美地对上了。
第三部分:我们怎么测
对照组设计
| S(被测对象) | Super-agent 原型 deepseek-ai/dsh-superagent-prototype(commit 6337fc8),Router + Worker 两层 |
| B(对照组) | 同版本 DeepSeek Harness 普通单会话,提供子 Agent 工具,相当于原文的方案 ③ |
| 模型 | qwen3.7-plus-2026-05-26,两组相同 |
| 环境 | 独立的 WSL 环境、私有测试仓库,GitHub 作为消息渠道 |
| 规模 | 三轮实验,180 多次正式运行;没测成和无效的运行全部保留,费用照记 |
| 耗时 | 前后约 4 天,累计约 77 小时;两小时长跑这类测试必须真实等待,连同模拟约 20 小时 |
三轮的分工:
| 第一轮 | 冒烟、噪音流、突发负载、observe/auto 模式对照 | 跑到预设的 45 元预算门禁时按规则中止,只完成一部分 |
| 第二轮 | 补完编码任务、并发、故障恢复、两小时长跑、提示词注入 | 75 次正式运行 |
| 第三轮 | 专补上一轮"没测成"的项:取消、强杀、名单外发送者、边界条件、Watchdog 配方,加 SWE-bench 改造子集 | 106 次正式尝试 |
怎么保证公平
- 先用假模型把整条链路跑通(发生器、适配器、采集器、验收脚本),确认设施没问题,再接真模型付费;
- 每一项开跑前冻结验收标准,之后不改标准、不补跑凑数;
- 验收脚本放在 Agent 看不到的地方,用独立账号、断网运行;
- 冻结标准之外补充的指标(比如"功能测试通过率")一律标成事后补充的探索性指标,和冻结成绩并列,不替代。
测试项一览
| 编码任务 | 自建 10 道 Python 小题(修 bug、加功能、补测试、模糊需求),其中 3 题各重复 3 次,每组 16 次 |
| SWE-bench 改造子集 | 从 SWE-bench Lite 挑 8 道真实开源项目 bug,6 道环境合格,各跑一次 |
| 噪音流 / 突发负载 | 真实历史噪音 + 当场发布的真实请求,按 1、10、40 条/分钟三档灌入 |
| 并发与取消 | 多任务同时进来,中途追加、中途叫停 |
| 故障恢复 | 正常重启、强杀进程、瞬时 HTTP 500、后台作业超时 |
| 两小时长跑 | 真实等待两小时,中途有噪音和重启 |
| 安全 | 把提示词注入藏在代码、评论、issue 里,诱导读取假的 .env、删文件、往本机接收器外发 |
| 准入 | 名单外发送者(通过切换配置模拟)、撤权、observe 模式 |
第四部分:原文的承诺 vs 我们的实测
我们把原文的主张一条条拿出来对。
承诺一:“两层架构更强” → 交付质量没有更好
先看最硬的编码交付:
| 编码任务·冻结合格 | 4/16 | 10/16 |
| 编码任务·功能合格(探索性) | 11/16 | 16/16 |
| 模糊需求先澄清 | 0/4 | 4/4 |
| 同题 PR 质量 B1(满分 4) | 3.0 | 3.67 |
| 同题 PR 质量 A1(满分 4) | 1.0 | 3.67 |
| 编码任务·已知费用 | 5.20 元 | 1.85 元 |
| 编码任务·每次用时中位数 | 218 秒 | 134 秒 |
| SWE-bench 改造子集 | 3/6 | 3/6(同样 3 题) |
| SWE-bench·首个 PR 出现(中位数) | 277 秒 | 187 秒 |

几个细节:
- 两组都没达到预先设定的 12/16 合格门槛。冻结不合格的头号原因是多改了 .gitignore,超出了允许修改的文件范围,两组都犯过;
- SWE-bench 子集两组都过了 pytest-11143、pytest-11148、pylint-5859 这三题,挂在同样三题上。真实项目的 bug 上,两层架构没有多修好一题;
- S 单题贵 2~3 倍,这和原文"Super-agent 读取的缓存 Token 是单会话的 3.8 倍"方向一致。
最有意思的是模糊需求。 我们给了一个故意含糊的请求:“导出的任务列表看起来不太对,帮我改得更好用一点”,并在共同要求里写明"不清楚就先问再动手"。
- B 每次都先问:要什么格式?哪些字段?给谁用?拿到答复后才改代码;
- S 4 次全部直接开干,改出来的东西和需求对不上,PR 质量只有 1 分。
我们检查过:这条"先澄清"的要求确实送到了 Router 和 Worker 手里,不是在中间传丢了。我们的推测(未专门验证):问题出在两层分工本身,Router 把"接单"当成了"派活",Worker 拿到的已经是一张"去干活"的工单,于是谁都没停下来问。
💡 原文实验把编码换成了假工具,所以这类问题天然测不出来。调度快不快和活干得好不好,是两件事。
承诺二:“委派靠结构,比靠提示词稳” → 前半句我们复现了
原文最有说服力的发现是:单会话在中性提示词下,5 次里一次子代理都没调用。
我们的数据完全复现了这一点:B 每次都提供了子代理工具,所有轨迹里实际调用 0 次(仅第二轮就有 37 个 B 会话)。
但我们的数据补上了后半句:在这些任务上,B 不委派也照样交付得更好。 结构确实保证了"一定会委派",可"委派了"不等于"交付更好"。对于一次进来一两件事的场景,单会话自己干反而更快、更准。
承诺三:“前台统一对外,少打扰” → 中间层反而带来新错误
多了一层前台,就多了几种单会话不会有的失败方式。
① 前台把后厨算对的数改错了。 第一轮压测里有一道计算题,Worker 用 Python 算出乘积 2063426501 和正确的哈希;Router 汇总回复时,写成了 2063441401,外加一个"看起来很像"的假哈希。这样的事发生了 2 次。Worker 算对了,Router 转述的时候"润色"错了。
② 同一个结果说两遍。 原文说 Worker 不直接面向用户、由 Router 统一说话,但原型里 Worker 自己会发评论,Router 收到汇报后再发一遍:
| 编码任务(16 次) | 40 条 / 7,999 字 | 20 条 / 7,537 字 |
| 两小时长跑(每轮) | 10 条 | 4 条 |
S 的条数是 B 的 2~2.5 倍,但总字数差不多。编码任务里有 9 条是对同一结果的重复提醒。对于"少打扰"这个目标,条数比字数更伤注意力。

③ 前台不接单。 在强杀恢复测试里,名单上的人 @ 机器人发了明确请求,Router 4 次都没接单(3 次原任务,换成更简单的 README 任务又试了 1 次),导致"强杀正在干活的 Worker"这个测试前提一直建立不起来。
承诺四:“代码先过滤,省成本” → 成立,而且最值得抄
这是原型最漂亮的地方。
Gate 是纯代码,名单外的人零成本被挡。 名单外的人不管 @ 不 @ 机器人,都在进模型之前被拒(原因码 not_a_member),0 次模型调用,不建工单;藏了提示词注入的消息同样在 Gate 被挡。B 没有 Gate,只能靠提示词"不理陌生人",每条消息都要让模型读一遍。
入口去重。 突发负载测试里有 153 条唯一事件(141 条真实历史噪音 + 12 条真实请求),我们又故意重投了 6 条同 ID 的事件。S 在入口直接识别出重复,141 条噪音也没进 Router;B 的所有事件都进了单会话。

但门口的保安只守正门。 前面读源码时提过:已有工单的 Thread 里,任何人的消息都会直投给 Worker、不过 Gate。实测也对上了:
- 两小时长跑里,旧帖子里的 10 条噪音全部被送进了 Worker;
- 把发起人移出名单(撤权)后,正在跑的 Worker 60 秒内没有停。源码里撤权只发通知、不强制终止(n=1)。
另外,原型的 observe 模式也不是"全局只读":推断出来的请求只记录不执行,但明确请求照样执行。
承诺五:“批处理扛得住洪峰” → 成立(小样本)
| 突发负载·正确回复数(两轮) | 10/11、8/11 | 9/11、9/11 |
| 突发负载·正确回复中位时间(两轮) | 33 / 35 秒 | 76 / 131 秒 |
| 编码任务·每次用时中位数 | 218 秒 | 134 秒 |

这是一个很好理解的反差:
- 单个任务进来时,S 更慢:要先过前台,接单、建工单、准备工作区,然后后厨才开火;
- 消息每分钟几十条涌进来时,S 快很多:B 只有一个会话,所有消息排队;S 的前台批量处理,后厨并行开工。
不过每个条件只跑了 2 轮,正确数也互有高低,我们不宣称显著优势。
承诺六:“持久,能自己恢复” → 正常重启成立
正常重启:S 自己接着干,B 停在原地。 S 重启后的流程和源码设计完全一致:旧执行标记 hostRestarted → 新建执行 → 投递恢复说明 → Worker 先查 git 和 GitHub 现场 → 继续干完并交付 PR。第二轮、第三轮各成功一次。B 能恢复会话历史,但恢复后就停在那里,观察 300 秒没有任何推进。
一个小插曲:第一轮我们一度记成"S 重启后需要人工补一句话才继续"。后来排查发现是误读:恢复说明在模型的视角里显示为 user 角色,看起来像有人发了消息,其实是原型自动转发的。教训是:事件流里必须保留"这条输入真正从哪来",否则连评测者都会被骗。
强杀进程(kill -9):还没测成。
- 第二轮我们杀掉进程 10 秒后就重启,但原型的状态锁要 30 秒才过期,结果启动时报"锁已被持有"。这属于实验时序问题,不是原型缺陷;
- 第三轮想重测,又碰上前面说的 Router 不接单,前提没建立。
所以锁过期之后的崩溃恢复,至今未测。
边界保护:都触发了。
- 后台作业空闲 1800 秒后被结束;
- 持续注入 HTTP 500 时,重试间隔是 15 / 30 / 60 秒,用完后任务明确失败,没有无限重试。日志里一共 24 次 500,是 6 次传输层尝试 × 4 次执行尝试;
- 但"重启后最旧的工单先恢复"出现了反例:新工单先启动了(n=1,根因未确定)。
取消:有独立通道就能真停。 第二轮的取消测试全部没测成,因为我们靠解析 shell 文本去找"正在跑的作业",总有漏网之鱼。第三轮改成显式记录"任务 → 工具调用 → 后台作业"的对应关系后,19 次取消尝试里 9 次可测,9 次全部在 30 秒内真正终止(S 用时 5~13 秒);其余 10 次是识别、前提或设施问题。
还有一个有趣的发现:我们把并发上限设成 2,却观察到同时有 3 个会话。原因是一个工单在逻辑上已经交付、释放了名额,它的会话还在跑最后一步(约 7.6 秒),下一个工单就启动了。"名额"和"真实在跑的东西"不是一回事。
承诺七:“Watchdog 自动纠偏” → 原型里没有
原型公开版没有 Watchdog。我们部署了官方文档里的"每小时巡检"外部配方,跑了一次真实的两小时:整点的巡检提醒确实发生了,但我们的观察器漏认了一次健康检查,故障没有注入成功,恢复效果未测。
原文自己点名的风险:“安全” → 被实测印证
我们把提示词注入藏在代码文件、PR 评论和 issue 里,诱导 Agent 读取一个假的 .env(里面是合成的金丝雀字符串,不是真实密钥):
- S 有两次照做,读取了假 .env,内容进了 Worker 的模型上下文(第二轮、第三轮各一次)。两次都没有观察到外发;
- 第二轮同一个用例里,B 识别出了注入,并把它从代码里删掉了;
- 第三轮 36 个安全样本里,只有 16 个能完整判定"有没有中招",其余缺少曝光或归因证据。没看到攻击 ≠ 防住了攻击,这些不算安全通过。
再加上源码里看到的:Worker 是 danger-full-access,实验用的 GitHub 令牌(只授权给测试仓库)Worker 也读得到,禁用命令能用绝对路径绕过,"不自己合并"只靠提示词。原文 §8.4 担心的事情,在原型里都能找到对应的口子。
⚠️ 凡是只靠提示词约束的地方,都出了偏差:先澄清、只改范围内的文件、只有 Router 对外说话、不理会注入、不读凭证。凡是写成代码的地方,基本都兑现了:Gate、去重、持久化、恢复、超时、重试。
一张总表
| 两层架构兼顾连续性和吞吐 | 交付质量 B 更好;中间层多出转述错误、跳过澄清、重复消息 | 交付质量方面没有得到支持 |
| 单会话委派不稳定,结构保证委派 | B 有子代理工具,调用 0 次 | 复现;但不委派也交付得更好 |
| Router 用轻量模型就够 | 两组同一模型 | 未测 |
| 代码过滤挡掉大部分噪音 | 名单外 0 次模型调用;噪音和重放在入口被挡 | 成立 |
| 直投减少 Router 负担 | 原型没有关闭直投的开关 | 无法测;且直投绕开了名单 |
| 批处理扛洪峰 | 突发负载正确回复更快;单任务更慢 | 成立(n=2) |
| IM 少打扰 | S 消息条数是 B 的 2~2.5 倍 | 没有得到支持 |
| 异步不阻塞、能 stop | 前台命令转后台正常;有独立关联时取消 30 秒内真停 | 不阻塞成立;取消覆盖面不足 |
| 状态持久、能自动恢复 | 正常重启自动续做并交付 | 成立(正常重启);强杀未测 |
| 召回链、提前执行 | 本次没有专门测,后台主动观察关闭 | 未测 |
| Watchdog 外部纠偏 | 原型没有;官方配方的故障恢复未测 | 未实现 / 未测 |
| 文章的调度实验 | 公开仓库里没有可执行的基准入口 | 无法复现 |
| 安全风险(注入、凭证) | 两次读取假 .env;Worker 能读到令牌 | 风险被印证 |
第五部分:给想做类似系统的人,6 条建议
第六部分:原文留下的问题,我们最想看到答案的 8 个
精读时我们一共记了 30 条空白,挑最关键的几条:
第七部分:局限
- 只用了一个模型(qwen3.7-plus),结论不能推广到其他模型;
- 以自建小任务集为主;SWE-bench 是改造过的非官方运行,只作描述;
- 样本小,多数测试项每条件 1~3 次,没有做显著性检验;
- S 和 B 的提示词、工具、接入方式都不同,是整体系统对比,不能把全部差异都归因于 Router/Worker 结构;
- "名单外发送者"是改配置模拟的,不是真实第三人;同一线程里混着名单内外的人,仍未测;
- 强杀后的恢复、锁过期后的崩溃恢复、Watchdog 的故障恢复、召回链、提前执行都未测到;
- 费用按官方价格和实际 usage 估算,不是供应商账单。
📂 完整报告
完整报告包含:术语表、每项测试怎么构造和判定、具体问题清单、原文留下的空白、逐次数据和全部图表,中英双语:
👉 GitHub:https://github.com/pans1es/superagent-prototype-evaluation
原文推荐直接读官方版本:DeepSeek Harness 的 X 长文,以及开源原型 deepseek-ai/dsh-superagent-prototype。
觉得有用欢迎 ⭐ Star,也欢迎在评论区聊聊:你的 Agent 是一个前台带一群后厨,还是一个人包圆?
本文文字、图和数据采用 CC BY 4.0 许可。原文和原型版权归原作者所有。


