LangChain4j 本地命令执行引擎:用自然语言驱动桌面自动化与计算机使用 Agent
【免费下载链接】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
本篇文章围绕 LangChain4j 的CommandLineExecutionEngine本地代码执行方案展开,讲解如何借助CommandLineTool与LocalScriptExecutionTool两个内置工具,让 LLM 直接操作本地计算机(文件管理、应用控制、系统命令等),并完整演示在AiServices中装配这些工具、让 Agent 通过自然语言"控制电脑"的实战写法。读完本文,你将掌握本地代码执行引擎的 API 组成、Maven 接入方式、工具注册与调用链路,以及在生产环境中必须警惕的安全边界。
什么是本地代码执行引擎
LangChain4j 在核心模块中抽象了代码执行能力,其入口是 CodeExecutionEngine 接口:
public interface CodeExecutionEngine { String execute(String code); }该接口只约定一个行为:给定一段代码(字符串),返回执行结果(字符串)。围绕这个契约,LangChain4j 提供了多种落地实现,例如基于 GraalVM Polyglot 的 JavaScript/Python 沙箱引擎、基于 Judge0 的在线评测引擎,以及本文要讲的本地命令执行引擎(langchain4j-community-code-execution-engine-local)。
"本地"的含义非常直白:CommandLineExecutionEngine直接使用本地计算机环境来执行提供的命令行代码,而不是在隔离的沙箱或远程服务中运行。这意味着它拥有与当前登录用户几乎相同的系统权限,可以读写文件、调用系统命令、控制已安装的应用,因此天然适合Desktop Automation(桌面自动化)与Computer-Use(计算机使用)Agent这类场景。
官方文档给出了几个典型的自然语言指令示例:
set my mac output volume 50(将 Mac 的输出音量设为 50)list all running applications in my mac(列出 Mac 上所有正在运行的应用程序)tell a story and then read it out loud(讲个故事并朗读出来)tell a story about moon and save it into a text file(讲一个关于月亮的故事并保存到文本文件)
这些指令的共同点是:模型不需要理解图形界面,只需要生成对应的命令行代码,再由本地引擎代为执行,从而把"看懂电脑"转化为"操作电脑"。
Maven 依赖
在项目中引入本地代码执行引擎,需要在pom.xml中添加如下依赖:
<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-community-code-execution-engine-local</artifactId> <version>${latest version here}</version> </dependency>需要注意两点:
- 该模块属于community(社区)系列模块,版本号请以实际发布的最新版本为准(在 pom 中通常以
${latest version here}占位,实际使用时替换为具体版本号)。 - 该模块本身位于 langchain4j-community 仓库,并不在当前主仓库的 code-execution-engines 目录内。当前主仓库中可以看到的是同族模块 langchain4j-code-execution-engine-graalvm-polyglot、langchain4j-code-execution-engine-judge0 与 langchain4j-code-execution-engine-azure-acads,它们共同实现了
CodeExecutionEngine契约,可供对照理解本地引擎在整个家族中的定位。
提供的 API
本地代码执行引擎对外暴露三个核心类型:
| 类型 | 职责 |
|---|---|
CommandLineExecutionEngine | 实现CodeExecutionEngine接口,在本地命令行环境中执行传入的命令行代码,是底层执行器 |
CommandLineTool | 一个@Tool注解的工具类,把命令行执行能力包装成 LLM 可调用的工具,供通用 Agent 使用 |
LocalScriptExecutionTool | 另一个@Tool注解的工具类,侧重于本地脚本(如保存文件、读取文件、系统控制等脚本级操作)的执行 |
从当前仓库的源码模式可以印证这种"引擎 + 工具"的两层设计:例如 GraalVmPythonExecutionTool 内部持有GraalVmPythonExecutionEngine实例,并通过@Tool注解暴露给模型:
@Tool("MUST be used for accurate calculations: math, sorting, filtering, aggregating, string processing, etc") public String executePythonCode( @P("Python code to execute, result MUST be returned or printed by the code") String code) { return engine.execute(code); }本地模块的CommandLineTool与LocalScriptExecutionTool遵循完全相同的模式:工具方法内部调用CommandLineExecutionEngine.execute(...),@Tool注解提供对模型的工具描述,@P注解描述参数含义,帮助模型正确生成命令行参数。
关于@Tool注解的语义,可以参考 Tool.java 的官方 Javadoc:被注解的 Java 方法会被视为 LLM 可以调用执行的工具/函数;当与AiServices配合使用时,框架会自动根据方法签名(方法名、参数名与类型、@Tool与@P注解等)生成ToolSpecification并发送给 LLM;若 LLM 决定调用该工具,参数会被解析并自动触发方法调用,返回值(String类型会原样返回,void返回 "Success",其他类型序列化为 JSON)会回传给 LLM 继续推理。这正是"自然语言 → 命令执行 → 结果回传"闭环的底层机制。
实战示例:在 AiServices 中注册本地工具
下面是官方文档给出的最小可运行示例,演示如何把LocalScriptExecutionTool注册到 AI 服务中,让用户以自然语言发出指令:
LocalScriptExecutionTool tool = new LocalScriptExecutionTool(); Assistant assistant = AiServices.builder(Assistant.class) .chatModel(model) .tools(tool) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build(); String answer = assistant.chat("list all running applications in my mac"); System.out.println(answer);拆解这段代码,每一步都对应一个关键机制:
- 实例化工具:
new LocalScriptExecutionTool()创建本地脚本执行工具,其内部封装了CommandLineExecutionEngine,负责真正在本地环境跑命令。 - 构建 AI 服务:
AiServices.builder(Assistant.class)基于接口构建 AI 服务,其中:chatModel(model)注入对话模型(例如 OpenAI、本地 Ollama 等任何实现ChatModel接口的模型);tools(tool)把工具注册进服务,框架据此生成工具规格描述并随请求发送给模型;chatMemory(MessageWindowChatMemory.withMaxMessages(10))配置滑动窗口消息记忆,保留最近 10 条消息,使 Agent 具备多轮上下文能力(例如先让模型"记住"要讲的故事主题,再要求保存文件)。
- 发起对话:
assistant.chat("list all running applications in my mac")将用户指令交给模型,模型判断需要调用本地工具时,自动执行对应命令行代码,最终把执行结果整理成自然语言答案返回。
同样的写法也适用于CommandLineTool——只需将new LocalScriptExecutionTool()替换为new CommandLineTool()。二者的区别在于工具描述与面向的场景侧重:CommandLineTool面向通用命令行操作,LocalScriptExecutionTool面向脚本级操作(如写文件、编排多条命令),实际使用时可根据 Agent 的任务类型选择或同时注册。
底层调用链与工具机制
当用户输入tell a story about moon and save it into a text file时,完整的调用链路可以描述为:
AiServices将对话消息与工具规格(由@Tool注解与方法签名自动生成)一起发送给 LLM;- LLM 判定需要调用
LocalScriptExecutionTool,返回结构化的工具调用请求(如生成一段echo ... > story.txt或 Python 脚本); - 框架解析参数并调用工具方法;
- 工具方法把代码字符串交给
CommandLineExecutionEngine.execute(...); - 引擎在本地进程(如
ProcessBuilder)中执行命令,捕获标准输出/错误,返回执行结果; - 结果作为工具响应回传给 LLM,LLM 生成最终的自然语言回复(如"故事已保存到 story.txt")。
从当前仓库源码可以进一步确认这种"引擎 + 工具"分层的一致性:CodeExecutionEngine接口位于 langchain4j-core,是所有代码执行实现(本地、GraalVM、Judge0、Azure ACADS)共同的契约;工具层则统一通过@Tool/@P注解暴露,如 GraalVM 模块的 GraalVmJavaScriptExecutionTool 与 GraalVmPythonExecutionTool,模式与本地模块一一对应。
安全警告:切勿在生产环境使用
这是本地代码执行引擎最重要的注意事项,官方文档以醒目方式给出了High-Risk Code Execution(高风险代码执行)警告:
⚠️ 在生产在线服务环境中执行代码可能是危险的。如果用于在线服务,必须通过安全沙箱环境执行。切勿在生产环境中使用!
具体而言,需要理解以下几点:
- 权限等同本地用户:本地引擎以当前进程的运行身份执行命令,没有权限隔离,
rm -rf、格式化磁盘、访问私钥等操作都可能被触发。 - 模型输出不可控:LLM 生成的命令行代码并非总是符合预期,恶意提示注入或模型幻觉可能导致危险命令被执行。
- 适用边界:该引擎面向的是本地桌面自动化、个人开发机上的 Computer-Use Agent等受控场景;一旦涉及多用户在线服务,必须替换为隔离方案——例如使用 GraalVM Polyglot 沙箱、Judge0 在线执行 或 Azure ACADS 会话隔离 等具备隔离能力的实现。
此外,即便在本地使用,也建议配合最小权限账户运行、限制可执行命令范围、对工具调用增加人工确认等防护措施,不要把该引擎直接暴露给不可信来源的输入。
验证与测试
该模块的官方测试用例覆盖了引擎与工具两个层面(测试位于 langchain4j-community 仓库的对应模块下):
CommandLineExecutionEngineTest:验证底层命令执行引擎的常规行为;CommandLineToolTest/CommandLineToolIT:单元测试与集成测试,验证命令行工具在 Agent 调用链中的行为;LocalScriptExecutionToolTest/LocalScriptExecutionToolIT:验证本地脚本执行工具,包括脚本型指令(如写文件、系统控制)在真实环境中的执行效果。
其中IT后缀(Integration Test)通常需要真实模型与真实本地环境,适合在本机开发时手动验证;Test后缀则适合 CI 中快速回归。参考同类模块(如 GraalVmPythonExecutionEngineTest),测试的一般模式是:构造引擎/工具 → 传入样例代码 → 断言执行结果与预期输出一致,从而验证从"模型生成命令"到"命令真实执行"的整条链路。
总结
CommandLineExecutionEngine把 LangChain4j 的代码执行抽象落地到本地环境,配合CommandLineTool与LocalScriptExecutionTool两个工具封装,让开发者可以用极少的代码构建出"用自然语言控制电脑"的桌面自动化与 Computer-Use Agent。其核心要点可以归纳为:
- 分层设计:
CodeExecutionEngine接口(引擎层)与@Tool注解(工具层)解耦,同一契约支撑本地、沙箱、远程多种实现; - 接入简单:一条 Maven 依赖 + 一个工具实例 +
AiServices三行装配即可运行; - 边界清晰:本地执行是强能力也是高风险能力,只适合受控的本地场景,在线服务必须切换到沙箱或远程隔离方案。
【免费下载链接】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),仅供参考