Skip to content

trpc-agent-go:基于 Cube Sandbox 的安全代码执行后端

业务背景

trpc-agent-go 是腾讯开源的 Go 语言 Agent 开发框架,提供从模型调用、工具编排、记忆管理到代码执行(Code Interpreter)的完整能力。在真实业务中,Agent 经常需要执行 LLM 生成的 Python / JavaScript / Bash 代码,例如:

  • 数据分析与可视化(pandas、matplotlib);
  • 业务报表生成(PDF、Excel、SVG 图表);
  • 动态脚本与一次性任务(爬虫、清洗、转换);
  • Agentic RL / Tool-Use 场景下的多轮代码执行与反馈闭环。

为此 trpc-agent-go 在 codeexecutor/e2b 包中实现了与 E2B 协议兼容的 CodeExecutor,支持把 Agent 生成的代码直接送入沙箱执行,并把 stdout / stderr、富媒体结果(PNG、PDF、SVG、HTML、Markdown)和工作区产物回流给上层 Agent。

核心痛点

直接在 Agent 进程或宿主容器里跑 LLM 生成的代码,会遇到几个生产级问题:

  • 安全性:模型生成的代码不可信,可能读敏感文件、发起任意网络请求、消耗主机资源,必须有强隔离边界。
  • 依赖与污染:Python 数据科学栈、Node 工具链、字体、临时文件相互影响,长生命周期进程易出现状态污染。
  • 冷启动与并发:Agent 应用流量呈"突发 + 多会话"特征,传统容器秒级冷启动和较高内存占用难以扛住高并发短任务。
  • 多轮一致性:多轮 Agent 经常需要"上一步生成的中间文件,下一步继续读",纯 Function 化执行难以保留工作区状态。
  • 海外 SaaS 依赖:直接接入 E2B 公有云会带来跨境网络、合规、计费等问题;自建一套兼容方案的成本不低。

基于 Cube Sandbox 的方案

Cube Sandbox 兼容 E2B 沙箱协议,因此 trpc-agent-go 的 e2b.CodeExecutor 可以零代码改动接入自建的 Cube Sandbox 集群,仅通过 Option 切换后端:

go
import (
    "context"
    "time"

    "trpc.group/trpc-go/trpc-agent-go/codeexecutor/e2b"
)

ce, err := e2b.New(
    // 把 E2B 客户端指向自建的 Cube Sandbox 控制面
    e2b.WithAPIURL("https://cube-sandbox.your-domain.internal"),
    e2b.WithAPIKey("<token-issued-by-cube>"),

    // 选择已经在 Cube 中构建好的 code-interpreter 模板
    e2b.WithTemplate("code-interpreter-v1"),

    // 沙箱级与执行级超时
    e2b.WithSandboxTimeout(10*time.Minute),
    e2b.WithExecutionTimeout(60*time.Second),

    // 多轮 Agent 推荐开启会话级工作区,跨 turn 复用文件
    e2b.WithWorkspacePersistence(e2b.WorkspacePersistencePerSession),
)
if err != nil {
    panic(err)
}
defer ce.Close()

接入后,整体调用链如下:

LLM ──► Agent (trpc-agent-go)

            │  CodeExecutor.ExecuteCode / Engine

      E2B 协议 (HTTP + envd)


   Cube Sandbox 控制面 ──► KVM 微虚机(per session / per turn)
                              ├─ Python / Node / Bash 内核
                              ├─ 工作区目录 /tmp/run/<execID>
                              └─ stdout / stderr / 文件产物 回流

trpc-agent-go 在这套链路上额外提供:

  • 多语言适配pickLanguage 自动把模型输出的 ```python```ts```bash 等转成 Cube Sandbox 内核可识别的语言标识。
  • 富结果还原:把沙箱返回的 PNG / JPEG / PDF / SVG / LaTeX 等结果,自动解码成 codeexecutor.File 交给上层 Agent,作为多模态消息或附件回到对话流。
  • 工作区抽象CreateWorkspacePutFilesStageDirectoryCollect 等接口将文件 staging、收集产物的能力封装在沙箱内部进行,配合 WorkspacePersistencePerSession 让多轮对话天然共享中间文件。
  • 生命周期可控:通过 WithSandboxID 复用已存在的 Cube 沙箱,或由 CodeExecutor 自己负责创建/销毁,便于实现"会话池"。

效果与收益

将 Agent 代码执行后端从公共 SaaS / 容器方案迁移到自建 Cube Sandbox 后,可以同时拿到几方面收益:

  • 更强的安全边界:每次会话/每个 turn 一台独立 KVM 微虚机,硬件级隔离 + 网络策略,远好于共享内核的容器方案,可放心执行不可信代码。
  • 更低的执行延迟与成本:Cube Sandbox 单实例 100ms 级交付、< 5MB 额外内存开销、单机百并发,让"Agent 一次思考一次开沙箱"成为可行的默认实践,避免长驻容器的资源浪费。
  • 零侵入的私有化能力:得益于 E2B 协议兼容,trpc-agent-go 上层业务代码无需改动,只需切换 WithAPIURL / WithTemplate 即可在公有云 E2B 与私有化 Cube Sandbox 之间自由切换,满足合规与跨境网络要求。
  • 更顺畅的多轮 Agent 体验:会话级工作区让"画一张图—基于这张图再回答—再导出 PDF"这类任务无需手动搬运中间文件,对 Agentic RL、Deep Research、数据分析助手等场景尤其友好。
  • 可演进的模板治理:Cube Sandbox 的模板体系(如 code-interpreter-v1)让算法/平台团队可以在统一镜像中管理 Python 包、字体、JDK 等依赖,业务侧只需挑选模板即可。

参考资料