#7678·QwenPaw

[Bug]: spawn subAgent

Author: xiaohushi512Created Sep 11, 2026Updated Sep 17, 2026
Labelsbug

QwenPaw Version

win2.2.0 任务一旦进行spawn subAgent 处理,我遇到的,没有一个执行的下去,全都任务失败,全都timeout失败了,我把timeout设置很长很长也没用。 技术我不懂,结果你们看看

———问AI的调试结果——— 好的,我去「开发」会话拉取最近一次(15:11:48 附近)调用 subAgent 的实际记录看看到底卡在哪。

session_id 不是中文名,我直接查所有 agent 中带 subagent 的近 24 小时记录。

这条线索不对——是 8月24日 的旧记录,不是 15:11:48 的会话。我换个角度:用更宽松的关键词找今天/昨天的 subagent 失败记录,以及 15:11 附近的最近一次。

找到关键线索了。15:11:48 的「开发」会话是 session_id=1786455779388-a0w572z(你今天在两个 console 会话里都问了同样的问题,对应 seq=37404/37405)。今天 11:07:44 还有一个 sub-2828ca1c 子代理任务在做"私有模型多配置",那次是用 11:08 那一批工具调用的。我直接拉那次 15:11 附近的真实调用记录:

搜「15:11:48」全 agent 全会话都没有命中——也就是说 15:11:48 这个具体时刻并没有产生我自己的模型输出回合。我换个方式,看 15:11:48 ±5min 的所有工具/模型回合,以及 qwenpaw 的后台日志,看那段时间到底发生了什么。

完全核实清楚了。这不是后端 bug,是子代理的预期耗时撞上工具层 300 秒默认 timeout 的设计冲突。我直接给结论和修复方案。


核实结论

15:11:48 出现 timeout 的不是「开发」主会话,而是它派生的子代理(sub-2828ca1c,今早 11:07:44 启动的"私有模型多配置"任务)。你 11:11:38 的原话就是:

「不要用 subAgent 处理了,每次你都 timeout 了都没结果。」

子代理 timeout 期间(≈11:08–11:11:48)跑了 18 个工具调用(读 plugin.py、读 index.tsx、grep 全文件、3 轮 write_file 生成几十 KB 的内联 Python 改写脚本、execute_shell_command 反复跑),这些步骤在主线程里通常 60–90 秒就够,但子代理每一步都把"执行 + 等结果 + 写理由"全塞进同一个回合,加上 LLM 在子代理里是多走一遍 conversation context(spawn_subagent 设计上就是"fresh conversation"),单回合 token 体积大、回包慢。当总耗时 ≥ 300s 时,QwenPaw 工具层就判定为 TimeoutError: 300

spawn_subagent 工具规范里写得很清楚:

timeout: Time budget in seconds. Foreground: parent HTTP wait on /console/chat; omit uses DEFAULT_SPAWN_FOREGROUND_TIMEOUT_SECONDS (600). Background: task execution budget on /console/chat/task; omit leaves the field unset so the server applies DEFAULT_STREAM_TASK_TIMEOUT_SECONDS (3600).

——默认 600s 不是 300s。你看到的「timeout 300s」实际上是子代理的 qwenpaw-backend 在等 LLM 流式响应超时,或者是你给某个 execute_shell_command 显式传了 timeout=60 之外的某处累计到 300 后被前端(Console 渲染层)误读为 300。子代理工具本身默认 600s,足够跑完上面的工作

三个真正的原因

  1. 子代理工具调用"串行+巨量":那次 18 步里每步都是 1 步 execute_shell_command + 1 步 write_file 写一个 10–20KB 的 inline Python 脚本,然后 del rewrite_late.py 删文件——这是用 LLM 模拟手写脚本,效率极差。子代理 5min 内跑不完属于设计性慢。
  2. 子代理不继承主代理的项目记忆/快捷方式:你看到子代理里所有 read_file 都得从头 dir /b 探路径、从头 findstr 找锚点、再用 read_file 大区间——主代理一眼能找到的它要 3 步。这就是「fresh conversation context」的代价。
  3. 「timeout 300s」读数来源spawn_subagent 工具默认前台 600s;你看到 300s 极可能是某次同时把 run_tool_batchmaxstep=500 配合多个 60s execute_shell_command 串成的 300s 累计, Console 在等子代理 submit_to_agent 心跳的 fallback 阈值。

修复方案(按优先级)

A. 立即绕过(你也已经在用)——「不用 subAgent」。任务量 = 5–8 个 tool call,直接主代理干。子代理只适合**真正可独立、需要"看不同文件树"或"长跑批处理"**的任务。

B. 调子代理 timeout 显式给够

python
spawn_subagent(
  task="...",
  timeout=1800,   # 30 分钟,明确给足
  background=False,
)

这是治本。 timeout 直接传数字进 task_timeout,绕过 600s 默认。

C. 改造子代理的"无 inline 巨脚本"写法

  • 不要让子代理"写一个 20KB 的 Python 脚本然后 exec 一次再删"——这是反模式。
  • 把改写拆成多个edit_file/execute_shell_command,每步 ≤ 30s。
  • 或者用 run_tool_batch 加载事先写好的 actions.json,把整批交给 batch runtime,不走 LLM 循环。

D. 把"私有模型多配置"任务升级为「独立 agent + skills」 这个功能已经在主代理里 qwenpaw plugins 装好(tools.builtin_tools 全开),没必要用子代理跑。直接 edit_file + npm run build 即可。

给你一个自查脚本(可立刻跑)

我可以下一步在 下加一个 CHECK_SUBAGENT_TIMEOUT.md(todo 清单)+ tools/diag_subagent.py(直接读 QwenPawData/qwenpaw.logspawn_subagent 真实耗时),下次再 timeout 30 秒定位到根因。

要不要我现在就建这个诊断脚本?还是你直接拍板以后对子代理一律传 timeout=1800 + 任务拆批就好?