-
Notifications
You must be signed in to change notification settings - Fork 4
Open
Description
问题概述
当使用 AIO (AllInOne) 类型的沙箱模板时,无法正常使用 CodeInterpreterToolSet 或 BrowserToolSet,导致:
- 每次工具调用都创建新的沙箱实例(无法复用)
- 工具调用实际上失败,返回空错误
{'error': ''}
环境信息
- agentrun-sdk 版本: 0.0.16
- Python 版本: 3.12
- 操作系统: Windows 10
问题复现
场景 1:覆盖 template_type 为 AIO
from agentrun.integration.builtin.sandbox import CodeInterpreterToolSet
from agentrun.sandbox import TemplateType
toolset = CodeInterpreterToolSet(
template_name="sandbox-nAtr2H", # AIO 类型模板
config=None,
sandbox_idle_timeout_seconds=600,
)
toolset.template_type = TemplateType.AIO # 覆盖为 AIO
# 调用工具
result = toolset.process_exec_cmd(command="echo 'Hello'")
print(result) # {'error': ''}结果:
- 返回
{'error': ''}(看似成功,实际失败) - 每次调用都创建新的沙箱 ID
根本原因:
CodeInterpreterToolSet 的每个方法内部都有类型检查:
# sandbox.py 第 193 行等
def inner(sb: Sandbox):
assert isinstance(sb, CodeInterpreterSandbox) # ← AioSandbox 不通过!
...当使用 AIO 模板时,Sandbox.create() 返回的是 AioSandbox,不是 CodeInterpreterSandbox,导致 AssertionError。
SDK 的 _run_in_sandbox() 方法捕获异常后会重置沙箱并重试:
def _run_in_sandbox(self, callback):
sb = self._ensure_sandbox()
try:
return callback(sb)
except Exception as e:
self.sandbox = None # ← 重置沙箱
sb = self._ensure_sandbox() # ← 创建新沙箱
return callback(sb) # ← 再次失败场景 2:使用默认 template_type
from agentrun.integration.builtin.sandbox import CodeInterpreterToolSet
toolset = CodeInterpreterToolSet(
template_name="sandbox-nAtr2H", # AIO 类型模板
config=None,
sandbox_idle_timeout_seconds=600,
)
# 不覆盖 template_type,使用默认值 CODE_INTERPRETER
result = toolset.process_exec_cmd(command="echo 'Hello'")结果:
ValueError: template_type of sandbox-nAtr2H is AllInOne, not TemplateType.CODE_INTERPRETER
原因:SDK 会检查模板的实际类型与请求的类型是否匹配。
期望行为
SDK 应该支持 AIO 类型的模板,提供以下任一解决方案:
方案 A:提供 AioToolSet
创建一个新的 AioToolSet 类,专门支持 AIO 类型模板:
class AioToolSet(SandboxToolSet):
def __init__(self, template_name, ...):
super().__init__(
template_name=template_name,
template_type=TemplateType.AIO, # 使用 AIO 类型
...
)
# 方法内部检查 AioSandbox 而不是 CodeInterpreterSandbox
def process_exec_cmd(self, ...):
def inner(sb: Sandbox):
assert isinstance(sb, AioSandbox) # 或者不做类型检查
...方案 B:放宽类型检查
修改现有 ToolSet 的类型检查逻辑,允许 AioSandbox:
def inner(sb: Sandbox):
assert isinstance(sb, (CodeInterpreterSandbox, AioSandbox))
...方案 C:使 AioSandbox 继承自 CodeInterpreterSandbox
如果 AioSandbox 继承自 CodeInterpreterSandbox(而不是直接继承 Sandbox),现有的 isinstance 检查就会通过。
相关代码位置
agentrun/integration/builtin/sandbox.py- 第 16-87 行:
SandboxToolSet基类 - 第 193 行等:
assert isinstance(sb, CodeInterpreterSandbox) - 第 69-87 行:
_run_in_sandbox()异常处理
- 第 16-87 行:
影响
- 用户无法使用 AIO 类型模板与 LangChain/LangGraph Agent 集成
- AIO 模板是最灵活的模板类型(同时支持代码执行和浏览器),但无法通过 SDK 的 ToolSet 使用
- 用户被迫为代码执行和浏览器分别创建不同类型的模板
临时解决方案
目前用户只能:
- 在 AgentRun 控制台创建
CODE_INTERPRETER类型的模板 - 使用
CodeInterpreterToolSet配合该模板 - 放弃使用 AIO 模板的灵活性
Metadata
Metadata
Assignees
Labels
No labels