Skip to main content
注意:LangChatPro内部已经集成了下列三个代码执行引擎的依赖,其中:
  1. GraalVM 引擎: 内部集成,通过基于Java的虚拟容器实现,但是只能执行基础类库代码,无法执行复杂代码
  2. Local 引擎: 集成了本地命令行,命令直接跑在本地操作系统
  3. OpenSandbox 引擎: 集成了云端服务,支持所有语言,但需要单独部署Opensandbox服务,请参考官网文档的安装教程:https://sandbox.agent-infra.com/zh/guide/start/introduction

LangChat 代码执行引擎 (Sandbox) 设计文档

一、模块定位

Sandbox 模块为 LangChat 平台提供安全的代码执行能力,支持在工作流节点中运行用户编写的 JavaScript、Python、Shell、Go、Java、TypeScript 代码。模块位于 langchat-common-aicn.langchat.common.ai.sandbox 包中,作为核心基础能力供上层业务(如工作流引擎)调用。

二、架构设计

2.1 分层架构

采用模板方法 + 工厂模式,将代码执行的调度层和执行层解耦。AbstractCodeExecutor 基类统一处理校验、计时和异常兜底,子类只关注实际执行逻辑。
调用方(WorkflowNode、API等)


CodeExecutorFactory                     ← 统一入口,根据语言路由到对应执行器

    ├── graalvm/GraalVmCodeExecutor     ← GraalVM 沙箱 (JS / Python)
    ├── local/LocalCodeExecutor         ← 本地命令行 (Shell)
    └── opensandbox/OpenSandboxCodeExecutor  ← 阿里 OpenSandbox (全语言)

                                        AbstractCodeExecutor ← 模板方法基类

2.2 目录结构

sandbox/
├── CodeLanguage.java              # 语言类型枚举 (JS/Python/Shell/Go/Java/TypeScript)
├── CodeExecutionException.java    # 结构化异常 (含 ErrorType 枚举)
├── CodeExecutionResult.java       # 执行结果 (成功/失败/耗时)
├── CodeExecutor.java              # 执行器接口
├── AbstractCodeExecutor.java      # 模板方法基类 (校验/计时/异常兜底)
├── CodeExecutorFactory.java       # 工厂门面,统一调度
├── graalvm/
│   └── GraalVmCodeExecutor.java   # GraalVM Polyglot 实现 (JS/Python)
├── local/
│   └── LocalCodeExecutor.java     # 本地命令行实现 (Shell)
├── opensandbox/
│   └── OpenSandboxCodeExecutor.java  # 阿里 OpenSandbox 实现 (全语言)
└── ARCHITECTURE.md                # 本文档

2.3 类层次关系

CodeExecutor (接口)
    └── AbstractCodeExecutor (抽象基类:模板方法)
            ├── GraalVmCodeExecutor   — 覆写 validate() 追加 main 函数检查
            ├── LocalCodeExecutor     — 覆写 getMaxCodeLength() 返回 50,000
            └── OpenSandboxCodeExecutor — 远程沙箱,全语言支持

2.4 核心接口

public interface CodeExecutor {
    CodeExecutionResult execute(String code, Map<String, Object> params,
                                CodeLanguage language, int timeoutSeconds);
    Set<CodeLanguage> supportedLanguages();
    String getName();
}

2.5 模板方法流程 (AbstractCodeExecutor)

execute(code, params, language, timeout)

    ├── 1. validate(code, language)         ← 可覆写:null/blank/长度 + 子类自定义校验
    │       └── 失败 → 返回 CodeExecutionResult.failure

    ├── 2. doExecute(code, params, ...)     ← 子类实现实际执行逻辑

    └── 3. catch Exception                  ← 兜底异常处理
            └── 返回 CodeExecutionResult.failure

2.6 使用示例

// 方式一:快捷调用(抛异常)
String result = CodeExecutorFactory.execute(code, params, "javascript");

// 方式二:获取结构化结果(不抛异常)
CodeExecutionResult result = CodeExecutorFactory.executeWithResult(
    code, params, CodeLanguage.PYTHON, 60);

// 方式三:注册 OpenSandbox(仅为 Go/Java/TypeScript 补充,不覆盖已有引擎)
CodeExecutorFactory.registerOpenSandbox("http://sandbox:8080", "api-key");

// 方式四:注册 OpenSandbox 为所有语言的执行器(覆盖 GraalVM 和 Local)
CodeExecutorFactory.registerOpenSandboxForAll("http://sandbox:8080", "api-key");

三、执行器对比

特性GraalVM PolyglotLocal CommandLineOpenSandbox
支持语言JavaScript, PythonShellJS, Python, Shell, Go, Java, TypeScript
隔离级别GraalVM 沙箱无隔离Docker 容器级
main 函数要求JS/Python 必须
第三方库支持仅标准库宿主机已安装的支持 pip/npm/go get 等
超时控制Future + TimeoutExceptionProcess.waitFor服务端控制
代码长度限制100,000 字符50,000 字符100,000 字符
网络请求不支持完全支持 (curl)取决于容器配置
部署依赖GraalVM SDK (JVM 内嵌)bash独立 OpenSandbox 服务

四、语言支持矩阵

语言枚举值标识/简称默认引擎OpenSandbox
JavaScriptJAVASCRIPTjavascript / jsGraalVM可选
PythonPYTHONpython / pyGraalVM可选
ShellSHELLshell / shLocal可选
GoGOgo / go必须
JavaJAVAjava / java必须
TypeScriptTYPESCRIPTtypescript / ts必须

五、核心依赖

5.1 GraalVM Polyglot 引擎

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-code-execution-engine-graalvm-polyglot</artifactId>
</dependency>

5.2 本地命令行引擎

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-community-code-execution-engine-local</artifactId>
</dependency>

5.3 阿里 OpenSandbox SDK

<dependency>
    <groupId>com.alibaba.opensandbox</groupId>
    <artifactId>code-interpreter</artifactId>
    <version>1.0.3</version>
</dependency>

六、已知限制

6.1 GraalVM 引擎

  • 不支持 C 扩展 Python 库(numpy、pandas 等)
  • 首次执行冷启动需 1-3 秒
  • 每个 Context 占用 50-100MB 内存

6.2 本地命令行

  • 无沙箱隔离,可执行任意系统命令
  • Shell 语法依赖宿主机平台

6.3 OpenSandbox

  • 需要独立部署 OpenSandbox 服务
  • 每次执行需创建/销毁容器,有额外延迟
  • 依赖网络连通性