JetBrains 出了个 Java AI 框架,和 Spring AI 不是一个赛道

发布时间:2026-03-25 21:51  浏览量:1

做 IntelliJ IDEA 的 JetBrains,最近干了一件让我有点意外的事。

3 月 17 日,他们正式发布了 Koog for Java——一个 AI Agent 框架,专门给 Java 开发者做了一套原生 API。不是 Kotlin 的附属品,是正儿八经的 Java Builder 风格 API。

你可能会想:又一个 AI 框架?Spring AI 和 LangChain4j 还不够用吗?

我一开始也这么想。但看了一圈之后发现,Koog 干的事跟它们还真不太一样。Spring AI 和 LangChain4j 解决的是"怎么跟大模型对话",Koog 解决的是"怎么让 Agent 靠谱地干活"。

先说来历。Koog 不是 JetBrains 拍脑袋做的项目。

JetBrains 内部在开发 AI Assistant 和 Junie(他们的 AI 编程助手)时,最初跟大多数公司一样,AI 相关的活儿交给 Python 团队干。原型阶段没问题,但 Agent 系统越来越复杂,多步骤任务、工具调用链、中间状态管理全搅在一起,Python 工作流开始扛不住了。

JetBrains 最后决定:不折腾外部 Python 服务了,直接在 JVM 栈上自己搞一套。Koog 就这么被逼出来了。

早期 Koog 只有 Kotlin API,Kotlin 开发者用着很顺手,Java 开发者就有点别扭了。今年 3 月的 0.7.2 版本补上了这块,完整的 Java 原生 API,Builder 风格、注解驱动、线程池管理,都是 Java 开发者熟悉的写法。

写个基础 Agent 有多简单

先看最基础的用法。Koog 的套路很直接:给你的 Java 方法加个 @Tool 注解,它就变成了 Agent 能调用的工具。

public class BankingTools implements ToolSet { @Tool @LLMDescription("向指定收款人转账") public Boolean sendMoney( @LLMDescription("收款人的唯一标识") String recipientId, @LLMDescription("转账金额,单位:元") Integer amount ) { return true; // 你的转账逻辑 } @Tool @LLMDescription("查询用户的账户余额,返回余额金额") public Integer getAccountBalance( @LLMDescription("用户ID") String userId ) { return 1000000; // 你的余额查询逻辑 }}

工具定义好了,用 Builder API 把 Agent 组装起来:

// 配置 LLM 供应商MultiLLMPromptExecutor promptExecutor = new MultiLLMPromptExecutor( new OPENAILLMClient("OPENAI_API_KEY"));// 组装 AgentAIAgent bankingAgent = AIAgent.builder .promptExecutor(promptExecutor) .llmModel(OpenAIModels.Chat.GPT5_4) .systemPrompt("你是一个银行转账助手,帮用户查询余额和转账") .toolRegistry( ToolRegistry.builder .tools(new BankingTools) .build ) .build;// 跑起来bankingAgent.run("帮我看看余额够不够,够的话给老王(wang_0056)转 500 块");

跑起来之后,Agent 会自己判断逻辑:先调 getAccountBalance 查余额,发现够了,再调 sendMoney 完成转账。整个决策过程由 LLM 根据工具描述自主完成,你不需要写 if-else。

Koog 调用流程图

实战:写一个电商客服 Agent

光看银行转账的例子可能有点远,来个贴近日常的。假设你在做一个电商平台,需要一个智能客服 Agent,能帮用户查订单、查库存、下单。

先定义工具。三个方法,对应客服的三个核心能力:

ai.koogkoog-agents-jvm0.7.2public class ECommerceTools implements ToolSet { @Tool @LLMDescription("根据订单号查询订单状态,返回订单详情") public String queryOrder( @LLMDescription("用户的订单号,例如 ORD-20260325-001") String orderId) { // 实际项目里这里查数据库 return "订单 " + orderId + " 状态:已发货,预计明天送达"; } @Tool @LLMDescription("根据商品名称查询库存数量") public String checkInventory( @LLMDescription("商品名称,例如:机械键盘") String productName) { // 实际项目里这里查库存系统 return productName + " 当前库存:128 件"; } @Tool @LLMDescription("为用户创建新订单") public String createOrder( @LLMDescription("用户ID") String userId, @LLMDescription("商品名称") String productName, @LLMDescription("购买数量") Integer quantity) { // 实际项目里这里调下单接口 String orderId = "ORD-" + System.currentTimeMillis; return "下单成功,订单号:" + orderId + ",商品:" + productName + " x " + quantity; }}

然后组装 Agent。注意 systemPrompt 用中文写,Agent 就会用中文跟用户交流:

MultiLLMPromptExecutor promptExecutor = new MultiLLMPromptExecutor( new OpenAILLMClient("OPENAI_API_KEY"));AIAgent customerServiceAgent = AIAgent.builder .promptExecutor(promptExecutor) .llmModel("deepseek-chat") .systemPrompt("你是一个电商平台的智能客服。用简洁友好的中文回答用户问题。" + "你可以帮用户查订单、查库存、下单。" + "如果用户的问题超出你的能力范围,礼貌地建议用户联系人工客服。") .toolRegistry( ToolRegistry.builder .tools(new ECommerceTools) .build ) .build;// 用户来了customerServiceAgent.run("帮我看看订单 ORD-20260325-001 到哪了");

这段代码跑起来后,Agent 会自动调用 queryOrder 方法,拿到结果后用中文回复用户。

如果用户说"我想买两个机械键盘",Agent 会先调 checkInventory 看看有没有货,有货的话再调 createOrder 下单。这个判断过程不需要你写 if-else,LLM 自己会根据 systemPrompt 和工具描述来决策。

再进一步,如果你不放心 Agent 自由决策,可以用函数式策略把流程锁死:

AIAgent strictAgent = AIAgent.builder .promptExecutor(promptExecutor) .functionalStrategy("strict-order-flow", (ctx, userInput) -> { // 第一步:先理解用户意图 String intent = ctx .subtask("判断用户意图,只返回:查订单、查库存、下单、其他。用户说:" + userInput) .withOutput(String.class) .run; // 第二步:根据意图执行对应操作 String result = ctx .subtask("根据用户意图执行操作:" + intent + ",原始输入:" + userInput) .withOutput(String.class) .withTools(new ECommerceTools) .run; return result; }) .build;

先让 Agent 判断意图(这一步不给任何工具,只做理解),确认意图后再给工具去执行。两步之间有明确的边界,你知道 Agent 在每个阶段干了什么。

Java 的 AI Agent 生态在 2026 年挺热闹的。Spring AI 把基础设施打好了,LangChain4j 把 API 统一了,Koog 现在把 Agent 编排这块补上了。

JetBrains 做开发工具做了二十多年,这次做 AI 框架,骨子里还是那个思路,让开发者用着顺手、调试方便、出了问题能排查。就冲这个,值得看一看。