ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

在 agent-sandbox 沙箱中执行 Python 代码:Jupyter 会话、Shell 安装与结果读取实战

在 agent-sandbox 沙箱中执行 Python 代码:Jupyter 会话、Shell 安装与结果读取实战 AI Agent后端MCP 服务浏览器控制Agent 评测【免费下载链接】sandboxAll-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container.项目地址https://gitcode.com/gh_mirrors/sandbox103/sandbox点击查看免费下载本篇技术指南以仓库 examples/code-execute 示例为骨架讲解如何通过 agent-sandbox Python SDK 在 All-in-One AI Agent 沙箱内完成「创建 Jupyter 会话 → 执行代码 → 用 Shell 安装依赖 → 二次执行验证」的完整代码执行链路并深入解读 SDK 中 Jupyter、Shell 与统一代码运行时 API 的参数含义与底层行为。读完本文你将能独立编写一套可复用的沙箱代码执行流程并理解会话状态、内核选择与执行结果的解析方式。示例定位与运行准备这个示例解决什么问题code-execute 示例演示的是 agent-sandbox 最核心的能力之一在隔离沙箱中执行代码并取回结果。它覆盖了三条关键通道client.jupyter.*通过 Jupyter 内核执行 Python 代码支持会话状态保持client.shell.*通过 Shell 会话执行任意命令如安装依赖client.sandbox.*查询沙箱环境上下文get_context验证安装是否生效。说明该目录下的 README.md 标题沿用了文件操作模板示例的旧名称Basic File Operations其正文与目录定位code-execute及 main.py 实际演示的代码执行能力不一致本文以目录名、examples/README.md 的定位说明及 main.py 的真实实现为准。前置条件根据 README.md 与 examples/README.md运行该示例需要条件说明运行中的沙箱实例默认地址http://localhost:8080可通过SANDBOX_BASE_URL环境变量覆盖Python 版本3.11SDK 与示例项目均要求3.11见 pyproject.toml包管理器uv示例统一通过uv run执行沙箱实例可通过仓库根目录的 docker-compose.yaml 一键启动容器将沙箱服务暴露在宿主机的8080端口Jupyter Lab 内部端口为8888JUPYTER_LAB_PORT并可通过DISABLE_JUPYTER环境变量开关 Jupyter 能力。项目结构与依赖示例工程由三个文件组成入口脚本 main.py、依赖声明 pyproject.toml 与说明文档 README.md。其依赖只有两项dependencies [ agent-sandbox, python-dotenv1.0.0, ] [tool.uv.sources] agent-sandbox { path ../../sdk/python, editable true }值得注意[tool.uv.sources]将agent-sandbox指向仓库内sdk/python目录并以editable可编辑模式安装因此在本地开发 SDK 时可以即时生效无需重新打包。运行示例在 examples/code-execute 目录下直接执行uv run main.pymain.py启动时会调用load_dotenv()加载.env文件main.py并从环境变量读取沙箱地址默认回退到http://localhost:8080main.pysandbox_url os.getenv(SANDBOX_BASE_URL, http://localhost:8080) client Sandbox(base_urlsandbox_url)预期输出包含两次代码执行的结果文本例如Code execution result: 1以及沙箱上下文信息get_context返回的字典内容。示例逐步拆解一次完整的「执行-安装-再执行」流程main.py 的流程可以拆成五个步骤覆盖了沙箱代码执行的典型闭环。步骤 1创建 Jupyter 会话session client.jupyter.create_session( kernel_namepython3, )create_session会创建一个持久的 Jupyter 内核会话返回的session.data.session_id是后续保持状态的关键标识。如果不传session_id服务端会自动生成。步骤 2执行第一段代码并写入变量client.jupyter.execute_code( codefoo1, kernel_namepython3, session_idsession.data.session_id )注意这里同时传了kernel_name与session_idkernel_name用于指定内核新会话session_id用于把本次执行路由到已创建的内核上。步骤 3在同会话中读取变量验证状态保持result client.jupyter.execute_code( codeprint(foo), session_idsession.data.session_id, kernel_namepython3, ) print(Code execution result:, result.data.outputs[0].text)第二次执行没有重新定义foo却能成功print(foo)并输出1这正是Jupyter 会话状态保持的体现只要session_id相同变量、导入的模块都会在内核中持续存在。这是 agent-sandbox 区别于「一次性执行」的关键能力。步骤 4通过 Shell 安装 Python 包client.shell.exec_command(commandpip3.12 install agent-sandbox)代码执行与 Shell 命令在同一个沙箱容器内共享文件系统与运行时环境因此可以在 Jupyter 内核之外用 Shell 安装依赖随后在代码执行中直接使用。步骤 5在指定内核中验证安装结果result client.jupyter.execute_code( codefrom agent_sandbox import Sandbox sandbox Sandbox(base_urlhttp://localhost:8080) context sandbox.sandbox.get_context() print(context) , kernel_namepython3.12, ) print(After installed code result:, result.data.outputs[0].text)这里换用python3.12内核执行——因为上一步pip3.12 install装进的是 Python 3.12 环境。代码段在沙箱内部再次实例化Sandbox客户端并调用sandbox.get_context()读取沙箱环境信息形成「沙箱内调用沙箱 API」的自引用验证。Jupyter 代码执行 API 深度解析client.jupyter由 sdk/python/agent_sandbox/jupyter/client.py 提供核心方法及其行为如下。execute_code 参数参数类型说明codestr必填要执行的 Python 代码timeoutint执行超时秒数kernel_namestr内核名python3、python3.10、python3.11、python3.12省略时使用运行时PYTHON_VERSION解析出的默认版本session_idstr会话 ID用于跨请求保持内核变量状态cwdstr内核的当前工作目录根据 client.py 的文档注释会话在闲置 30 分钟后会自动过期因此长时间不活动的会话会被服务端回收。会话生命周期管理create_session(session_id?, kernel_name?, cwd?)创建会话不传session_id时自动生成get_info()查询沙箱内可用内核信息list_sessions()列出所有活跃会话delete_session(session_id)手动清理指定会话delete_sessions()清理全部活跃会话。建议在 Agent 任务结束时显式调用delete_session避免会话占用沙箱资源直至 30 分钟自然过期。执行结果模型execute_code返回JupyterExecuteResponse定义见 sdk/python/agent_sandbox/types/jupyter_execute_response.py字段说明kernel_name实际使用的内核名session_id本次执行的会话 IDstatus执行状态ok、error或timeoutexecution_count内核执行计数outputs输出列表JupyterOutput数组code回显的被执行代码msg_idJupyter 内核消息 ID每个输出元素是JupyterOutputsdk/python/agent_sandbox/types/jupyter_output.py关键字段output_typestream、execute_result、display_data或errorname流名称stdout/stderrtext流输出的文本内容dataexecute_result/display_data的结构化数据ename/evalue/traceback错误输出时的异常名、异常值与堆栈。示例中的result.data.outputs[0].text正是取第一条输出的文本内容——对print类输出就是内核 stdout 的文本。Shell 通道与统一代码运行时shell.exec_command示例用exec_command安装依赖SDK 端签名见 sdk/python/agent_sandbox/shell/client.py。除了command必填外还有一组值得掌握的控制参数参数说明id目标 Shell 会话 ID不传时自动创建exec_dir命令工作目录绝对路径async_mode是否异步执行默认同步timeout等待命令完成的最大秒数超时返回 running 状态strict工作目录严格校验True时目录不存在直接报错否则静默回退到会话工作目录no_change_timeout无新输出超时在该时间内输出无变化则返回NO_CHANGE_TIMEOUT状态hard_timeout硬超时到达后强制终止命令并返回HARD_TIMEOUT与timeout仅影响 HTTP 响应时机不同truncate输出超过 30000 字符时是否截断默认True同时exec_command支持在Accept头携带text/event-stream时以 SSE 流式返回输出适合长任务实时观察。统一代码运行时 code.execute_code除 Jupyter 与 Shell 外SDK 还提供面向 Agent 的统一代码执行入口client.code.execute_codesdk/python/agent_sandbox/code/client.pyclient.code.execute_code( languagepython, # Language 类型按需分发给 Python / Node.js 等执行器 code..., timeout30, cwd/home/gem, statefulTrue, # 开启有状态执行基于 Jupyter 内核 session_id..., # statefulTrue 时用于跨请求保持状态 )它的设计意图是屏蔽底层执行器差异language决定分发给 Python、Node.js 还是未来的语言执行器statefulTrue时基于 Jupyter 内核保存变量状态session_id跨请求复用。仓库中 examples/openai-integration/main.py 展示了类似的 Agent 集成范式把jupyter.execute_code/nodejs.execute_code封装成 function calling 工具由大模型动态生成代码并执行。实战扩展与最佳实践稳健地读取与判定执行结果不要直接假设outputs[0]一定是文本建议按output_type分支处理resp client.jupyter.execute_code(code11).data if resp.status ok: for out in resp.outputs: if out.output_type stream and out.text: print(out.text) elif out.output_type in (execute_result, display_data): print(out.data) else: print(resp.status, [o.evalue for o in resp.outputs if o.output_type error])status字段ok/error/timeout是判断执行成败的第一依据error输出中的ename、evalue、traceback可用于定位问题。利用会话状态组织多步任务对于「写变量 → 依赖上一步结果继续计算」的多步任务始终复用同一个session_id避免重复初始化开销。注意 30 分钟闲置过期与显式清理session client.jupyter.create_session(kernel_namepython3.12).data sid session.session_id # ... 多次 execute_code(session_idsid) ... client.jupyter.delete_session(session_idsid)异步场景SDK 同时提供异步客户端AsyncSandboxsdk/python/agent_sandbox/client.pyAPI 与同步版一一对应适合在 asyncio 驱动的 Agent 框架中使用。客户端构造时支持自定义timeout默认 60 秒、headers与httpx_clientsdk/python/agent_sandbox/client.py可满足鉴权头注入、超时调优等需求。小结agent-sandbox 的代码执行能力由三组 API 协同构成jupyter.*负责有状态 Python 执行与结果解析shell.*负责容器内任意命令含依赖安装、SSE 流式输出code.execute_code则提供面向 Agent 的统一运行时分发。示例 examples/code-execute/main.py 展示的「创建会话 → 执行 → 安装依赖 → 换内核验证」闭环是构建代码生成、数据分析、自动安装等 Agent 能力的直接范本可在此基础上结合 examples/openai-integration/main.py 的 function calling 模式接入任意大模型。赞分享AI Agent后端MCP 服务浏览器控制Agent 评测【免费下载链接】sandboxAll-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container.项目地址https://gitcode.com/gh_mirrors/sandbox103/sandbox点击查看免费下载相关推荐Node.js Best Practices 6.18 实战在沙箱Sandbox中安全执行不受信任的代码Node.js Best Practices 6.18 实战在沙箱Sandbox中安全执行不受信任的代码 导读 Node.js 应用通常只需运行自己编写的文档教程后端ruflo 的 flow-nexus-sandbox Agent 实战基于 E2B 的隔离代码执行沙箱创建与编排ruflo 的 flow nexus sandbox Agent 实战基于 E2B 的隔离代码执行沙箱创建与编排 ruflo 的 Flow Nexus 插件体人工智能AI Agent多智能体Agent 编排Agent 记忆工具调用代码智能体MCP 服务AI 评测免费开源音乐播放器完全手册5分钟精通LX Music桌面版免费开源音乐播放器完全手册5分钟精通LX Music桌面版 你是否厌倦了各种付费音乐平台的订阅费用和广告干扰想要一款真正免费、功能强大且支持多平台的音乐播放桌面应用音视频前端上一篇SuperRDP技术架构深度解析Windows远程桌面服务解锁实现原理下一篇Adobe GenP 3.0技术深度解析如何实现Adobe全家桶的智能激活方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进