
LangChain4j 集成 Judge0为 Java LLM 应用接入 JavaScript 代码执行引擎【免费下载链接】langchain4jLangChain4j is an idiomatic, open-source Java library for building LLM-powered applications on the JVM. It offers a unified API over popular LLM providers and vector stores, and makes implementing tool calling (including MCP support), agents and RAG easy. It integrates seamlessly with enterprise Java frameworks like Quarkus and Spring Boot.项目地址: https://gitcode.com/GitHub_Trending/la/langchain4jJudge0 是一个开源的在线代码执行服务Judge0 CELangChain4j 通过langchain4j-code-execution-engine-judge0模块将其封装为统一的CodeExecutionEngine实现与 AI 工具Tool使运行在 JVM 上的 LLM 应用可以直接让大模型生成 JavaScript 代码并安全地在远程沙箱中执行从而完成数学计算、数据处理、排序聚合等只有真实运行才能保证正确的任务。阅读本文后你将掌握该模块的 Maven 引入方式、两个核心 API 的完整用法、底层执行链路与重试/错误处理机制以及如何把代码执行能力接入到 AI Service 的 Tool Calling 流程中。Judge0 集成概览Judge0官网项目 集成家族中的一员与 Azure ACA 动态会话、GraalVM Polyglot 等方案并列。该模块对外暴露两个核心 APIJudge0JavaScriptEngine实现 LangChain4j 核心的CodeExecutionEngine接口负责与 Judge0 API 通信、提交代码、轮询/等待结果并解析 stdoutJudge0JavaScriptExecutionTool标注了Tool注解的工具类可直接交给 LLM 调用内部委托给Judge0JavaScriptEngine执行并默认开启自动修复代码能力。两者的核心源码均位于 code-execution-engines/langchain4j-code-execution-engine-judge0/src/main/java/dev/langchain4j/code/judge0/。引入 Maven 依赖在pom.xml中添加以下依赖即可使用文档给出的版本为1.20.0-beta30实际使用时可替换为当前发布的最新版本dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-code-execution-engine-judge0/artifactId version1.20.0-beta30/version /dependency从该模块的 pom.xml 可以看出其运行期依赖为langchain4j-core提供CodeExecutionEngine接口、Tool/P注解等基础抽象langchain4j-http-clientHTTP 客户端抽象层langchain4j-http-client-jdk基于 JDKHttpClient的默认实现runtime作用域。也就是说你不需要额外引入任何 HTTP 客户端依赖开箱即用。底层执行链路Judge0JavaScriptEngine 源码剖析Judge0JavaScriptEngine位于 Judge0JavaScriptEngine.java是标准的CodeExecutionEngine实现。核心接口定义在 langchain4j-core/src/main/java/dev/langchain4j/code/CodeExecutionEngine.java只有一个方法public interface CodeExecutionEngine { String execute(String code); }提交请求的构造execute(String code)的执行流程如下源码参考空代码校验null或空白代码直接返回错误信息将代码按 UTF-8 编码后用Base64编码因为 API 启用了base64_encodedtrue封装为Submission请求体字段为language_id与source_code通过HttpRequest.builder()构造 POST 请求目标地址为https://judge0-ce.p.rapidapi.com/submissions?base64_encodedtruewaittruefields*请求头固定携带x-rapidapi-host: judge0-ce.p.rapidapi.comx-rapidapi-key: 你的 RapidAPI KeyContent-Type: application/json注意 URL 中的waittrue参数Judge0 将同步阻塞等待提交执行完成并一次性返回结果因此不需要二次轮询提交状态fields*表示返回全部字段包括stdout、status、compile_output等。内置重试机制引擎内置了最多 3 次的重试逻辑源码参考每次重试前等待 1000msRETRY_DELAY_MS仅对抛出RuntimeException如网络超时、连接失败的请求进行重试若请求被中断会恢复中断标记并返回提示信息所有重试仍失败时返回Failed after 3 attempts: ...。错误码与状态码处理对于 HTTP 层错误引擎通过HttpException.statusCode()将状态码映射为人类可读的错误信息源码参考HTTP 状态码返回信息含义429Rate limit exceeded. Please try again later.超出免费套餐调用限额403Access forbidden. Please check your API key.API Key 无效或无权限404Resource not found. Please check the endpoint URL.端点地址有误500Internal server error. Please try again later.服务端内部错误503Service unavailable. Please try again later.服务暂不可用其他Unexpected error code code: message未预期的错误执行结果的判定依据 Judge0 的状态码STATUS_ACCEPTED 3表示执行成功源码参考。成功时对stdout做 Base64MIME decoder解码并返回去掉首尾空白的文本如果stdout为null则返回No result: nothing was printed out to the console这正对应了结果必须打印到控制台这一使用前提。非成功状态如编译错误则返回status.description并附加解码后的compile_output编译输出。把代码执行变成 AI 工具Judge0JavaScriptExecutionToolJudge0JavaScriptExecutionTool源码是面向 LLM 的入口。它的核心方法带有Tool注解与描述LLM 会根据描述在需要精确计算时自动调用Tool(MUST be used for accurate calculations: math, sorting, filtering, aggregating, string processing, etc) public String executeJavaScriptCode( P(JavaScript code to execute, result MUST be printed to console) String javaScriptCode)工具描述明确要求JavaScript 代码的结果必须打印到控制台console.log因为 Judge0 只能从 stdout 中获取执行结果。构造方式工具内置常量JAVASCRIPT 102即 Judge0 中 JavaScript 的language_id。提供 4 个重载构造器与一个 Builder// 最简形式默认开启代码修复超时 10 秒 Judge0JavaScriptExecutionTool tool new Judge0JavaScriptExecutionTool(YOUR_RAPID_API_KEY); // 自定义超时 Judge0JavaScriptExecutionTool tool new Judge0JavaScriptExecutionTool(YOUR_RAPID_API_KEY, Duration.ofSeconds(30)); // 关闭自动代码修复 Judge0JavaScriptExecutionTool tool new Judge0JavaScriptExecutionTool(YOUR_RAPID_API_KEY, false); // 完全自定义推荐语义清晰 Judge0JavaScriptExecutionTool tool new Judge0JavaScriptExecutionTool(YOUR_RAPID_API_KEY, true, Duration.ofSeconds(30)); // 或使用 Builder 风格 Judge0JavaScriptExecutionTool tool Judge0JavaScriptExecutionTool.builder() .apiKey(YOUR_RAPID_API_KEY) .fixCodeIfNeeded(true) .timeout(Duration.ofSeconds(30)) .build();各参数含义参数默认值说明apiKey无必填RapidAPI 上 Judge0 CE 订阅的 API Key为空时抛出IllegalArgumentExceptionfixCodeIfNeededtrue是否在代码未打印结果时自动修复追加console.logtimeout10s调用 Judge0 的超时时间为null时抛出NullPointerExceptionapiKey需要在 RapidAPI 平台订阅 Judge0 CE 服务后获得其免费档Basic即可满足日常开发与测试。该 Key 最终被透传给Judge0JavaScriptEngine用于构造x-rapidapi-key请求头。接入 AI Service在 LangChain4j 中Judge0JavaScriptExecutionTool是一个标准的 Tool可配合AiServices动态工具机制注册给 Agent。参考仓库中langchain4j-agentic的 Tool Calling 模式典型用法是Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .tools(new Judge0JavaScriptExecutionTool(YOUR_RAPID_API_KEY)) .build(); String answer assistant.chat(计算 12345 * 67890 的结果);LLM 会生成类似console.log(12345 * 67890);的代码交给工具在 Judge0 沙箱中执行再把 stdout 中的真实计算结果回传给模型组织答案。自动代码修复JavaScriptCodeFixer 的实现原理fixCodeIfNeeded能力的底层由包内私有的 JavaScriptCodeFixer.java 实现。由于 Judge0 只返回 stdout如果模型生成的代码没有显式console.log执行结果将为空。修复器解决的就是这个问题它会区分两种场景多行代码检查最后一行是否以console.log开头如果不是则把最后一行去掉分号后包装为console.log(最后一行);单行代码以最后一个分号为界把分号后的表达式包装为console.log(表达式);如果最后没有有效语句或已是console.log则保持原样。单元测试 JavaScriptCodeFixerTest.java 覆盖了上述全部场景例如Math.sqrt(49506838032859)→console.log(Math.sqrt(49506838032859));const a 2; const b 3; a b→const a 2; const b 3; console.log(a b);多行代码以result结尾 → 末行被替换为console.log(result);这意味着即使模型只返回裸表达式工具也能自动补全输出语句显著提高执行成功率。集成测试与实战验证模块的集成测试 Judge0JavaScriptEngineIT.java 展示了真实调用场景。测试类标注了EnabledIfEnvironmentVariable(named RAPID_API_KEY, matches .)即只有在设置了RAPID_API_KEY环境变量时才会运行避免在 CI 中因缺少密钥而失败export RAPID_API_KEYyour_rapid_api_key测试覆盖两个典型场景简单输出执行console.log(hello world);断言返回hello world数学计算执行复利计算公式calculateCompoundInterest(1000, 0.05, 5, 12)断言结果包含principal:1000、amount:1283.3586785035118、interest:283.3586785035118等精确数值。第二个用例正是该工具的核心价值LLM 直接计算浮点金融公式容易出错而通过 Judge0 真实运行 JavaScript 可以得到精确结果测试中对金额数值做了严格断言验证了远程执行的准确性。此外该模块的pom.xml还定义了jackson3profile可在测试类路径中加入langchain4j-core-jackson3用于验证 DTO 在 Jackson 2 与 Jackson 3 两种 JSON 编解码器下均可正常序列化/反序列化请求体与响应体的 JSON 编解码由 Json.java 统一封装。使用注意事项与限制综合源码与测试实际接入时有以下几点需要留意必须联网且依赖 RapidAPI该模块通过公网调用judge0-ce.p.rapidapi.com与本地执行的 GraalVM Polyglot 引擎不同离线环境不可用请确认应用运行环境可访问该域名API Key 是硬前提构造引擎或工具时 Key 为空会直接抛异常429 状态码表示额度耗尽需要注意免费套餐的调用频率限制结果必须打印到控制台Judge0 只返回 stdoutconsole.log是获取结果的唯一通道建议保持fixCodeIfNeeded默认开启以兜底模型漏写日志的情况适合一次性、无状态的代码片段引擎每次提交都是独立的远程沙箱执行不保留上次执行的变量状态因此适合公式计算、数据清洗、排序聚合等自包含任务默认超时 10 秒复杂计算请通过构造器或 Builder 适当调大timeout避免请求被过早中断。结合 Code Execution Engines 集成文档与 code-execution-engines 目录下的其他实现如 GraalVM Polyglot 本地引擎你可以在本地零依赖执行与远程沙箱隔离执行之间按安全与精度需求灵活选择。【免费下载链接】langchain4jLangChain4j is an idiomatic, open-source Java library for building LLM-powered applications on the JVM. It offers a unified API over popular LLM providers and vector stores, and makes implementing tool calling (including MCP support), agents and RAG easy. It integrates seamlessly with enterprise Java frameworks like Quarkus and Spring Boot.项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考