agentscope-ai / agentscope-ai/QwenPaw

[Bug]: spawn subAgent

Offen
#7,678 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug
Vorherrschende Sprache
Python
Sterne
34.9k
Forks
3.1k
Ø Merge
1 T. 15 Std.
Gemergte PRs (30 T.)
225

Beschreibung

## 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_batch` 内 `maxstep=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.log` 抓 `spawn_subagent` 真实耗时),下次再 timeout 30 秒定位到根因。

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.