已开启
_retry_tool_execution 重试时 sandbox ContextVar 遗失 #47
henry创建于  7月17日
henry成员
7月17日 创建

问题

_retry_tool_executiondataagent/core/flex/nodes/executor.py:739)在工具执行失败后重试时,直接调 _invoke_manager_tool_async 而不经过 _setup_tool_call_execution,导致:

  1. sandbox ContextVar 未设置:首次调用在工具返回后 _reset_context 清除了 set_current_sandbox 设置的 ContextVar,重试时 bash()get_current_sandbox()RuntimeError: No sandbox bound to current tool call context
  2. bash 工具崩溃:LLM 看不到 sqlite3 的错误 stderr,无法自恢复

根因

_retry_tool_execution 由初始代码(13cf292,2026-05-30)引入,从未调用 _setup_tool_call_execution / set_current_sandbox

该 bug 自初始代码起一直潜伏,因 upstream/main 的 local.py 变更使 bash 失败变为可重试(新增 retriable / max_retries policy)后暴露。

三层独立问题叠加

从何时起 单独看 组合后
get_current_sandbox() 抛异常 初始代码(13cf292 合理的防御式设计
_retry_tool_execution 不设 sandbox 初始代码(13cf292 潜在 bug 只要 retry 被触发就必崩
bash 从不可重试 → 可重试 upstream/main local.py 新增 retriable/max_retries 合理改进 激活了上层潜在 bug

曾尝试的修复(已回退)

_retry_tool_execution 重试前手动 set_current_sandbox(runtime.sandbox)

回退原因

该修复逻辑上会回到上一个工具调用的 sandbox 状态,而非退回到原始(无 sandbox)状态。如果两次工具调用之间存在其他需要 sandbox 的场景,可能导致 ContextVar 状态不一致。

正确修复方向

_retry_tool_execution 应完整复用 _setup_tool_call_execution 的流程(设置 sandbox + subagent context + file inspect workspace 等),而非仅手动设置 sandbox。

环境

  • 分支: skill-plan-hook(基于 upstream/main 7fe84bb
  • 回退前 commit: 09ea763
  • 影响文件: dataagent/core/flex/nodes/executor.py
  • 影响函数: _retry_tool_execution (line 739+)
likedislike
henry成员
7月17日 评论:

环境信息

a3498313670af57fd0796af04ef736a7ec91b058 format tests/e2e/bio_lab/test_performance.py
dataagent/core/flex/nodes/executor.py | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
M dataagent/core/flex/nodes/executor.py

完整日志见附件。

likedislike
xsmqxsmq成员
7月20日 关联了看板:@hwxsmq的看板 20260720