多数 Agent 教程和 PoC 仍落在 Python 侧:迭代快、模型与数据科学生态密,做实验很顺手。真正要把 Agent 嵌进已有订单、风控、客服、审批链路时,问题往往不再是「怎么调一次 LLM」,而是类型约束、事务与权限边界、可观测与回归测试,以及和现有 Spring 服务怎么共生。
Embabel Agent Framework(发音 Em-BAY-bel,/ɛmˈbeɪbəl/)把叙事放在这条线上:在 JVM 上用强类型领域模型编排 Agent 流,混合 LLM 调用与普通业务代码,并尽量复用企业栈已经具备的注入、持久化与运维能力。官网 hub.embabel.com 的定位是「Agentic AI for the JVM」;仓库 README 写明它「seamlessly mix LLM-prompted interactions with code and domain models」,并支持面向目标的路径规划。Apache-2.0,Maven Central 稳定版 1.5.2。
本文聚焦「JVM 原生 Agent 框架选型与上手」,不展开持续学习或运行时沙箱权限等相邻话题。
项目名片
| 项 | 核实结果(截至 2026-09-29) |
|---|---|
| 定位 | JVM 上的 Agent 框架:用注解或 Kotlin DSL 编写 Action/Goal,由平台做目标导向规划与重规划,并与 Spring 企业能力集成 |
| 仓库 | https://github.com/embabel/embabel-agent |
| 社区热度 | GitHub 约 4,476 stars(页面实测) |
| 许可证 | Apache License 2.0(仓库根目录 LICENSE 全文) |
| 组织 / 作者 | Embabel;Maven POM 中组织为 Embabel Pty Ltd;示例代码版权头可见 Embabel Software, Inc. |
| 与 Rod Johnson | 官方表述:README 写「From the creator of Spring」;Hub 写「Alongside Spring Framework founder Rod Johnson and other alumni」。文档作者栏含 Rod Johnson、Arjen Poutsma、Jasper Blues 等 |
| 文档 | https://docs.embabel.com ;Hub:https://hub.embabel.com |
| 运行基线 | 官方文档要求 Java 21+;以 Spring Boot 应用方式集成 |
稳定二进制自 0.2.0 起发布在 Maven Central。当前 Central 上
embabel-agent-starter / embabel-agent-api / 各
provider starter 的 release 最新为
1.5.2(maven-metadata.xml 的
lastUpdated 为 2026-09-16)。主分支 POM 已是
1.5.3-SNAPSHOT,与文档站点上偶见的 SNAPSHOT 版本号不要和
Central 稳定版混用。
推荐起步坐标(稳定版):
<dependency>
<groupId>com.embabel.agent</groupId>
<artifactId>embabel-agent-starter</artifactId>
<version>1.5.2</version>
</dependency>
接 OpenAI 时再加
com.embabel.agent:embabel-agent-starter-openai:1.5.2;本地交互调试常用
embabel-agent-starter-shell。需要链路追踪时可用官方文档中的
embabel-agent-starter-observability:1.5.2(同样已在
Central)。
相对 Python 实验栈的定位差异
Hub 自己说得很直白:Python 适合机器学习实验,但从实验走向生产规模的 AI 时,更吃紧的是上下文、可靠性、类型安全、性能、可观测,以及与既有企业系统的集成;Java/Kotlin 在这些点上更对口。
Embabel 并不替代「直接调模型」或 Spring AI 的底层能力。README 用了一个类比:Spring AI 更接近 Servlet 层,Embabel 更接近 Spring MVC。多数业务应用应工作在更高层 API。规划步骤默认采用 Goal-Oriented Action Planning(GOAP),每步 Action 结束后按黑板(blackboard)上的类型化状态重规划,形成类似 OODA 的闭环。开发者通常不必手写完整状态机;方法签名上的输入输出类型会推断前置与后置条件。
这与「在 notebook 里串几段 prompt」不是同一类问题。若团队的主资产是 JVM 服务、领域对象和 Spring 组件,把 Agent 写进同一语言与同一容器,比另起一套 Python 编排再跨进程对接,更符合生产约束。
官方材料里的核心卖点
下列要点均可在 README 或 User Guide 中找到对应表述,本文不外推未写明的能力。
强类型与领域对象。 Action、Goal、Condition
由领域模型驱动;createObject(...) 把 LLM
输出绑到具体类型,而不是散落的 magic map。领域对象还可带
@Tool 方法,按需暴露给模型,未标注方法不会自动开放。
目标导向编排与可扩展复用。 默认 GOAP(也支持 Utility AI 等可插拔规划器)。动态规划意味着增加领域对象、Action、Goal、Condition 可以扩展能力,而不必改写既有 FSM 定义。执行模式包括 Focused(代码指定跑某个 Agent)、Closed(在已知 Agent 集合中选一个)与 Open(跨 Goal 组装路径;官方明确 Open 模式最强也最不确定)。
Spring 与 JVM 集成。 Agent 可被 Spring
注入与管理,可继续使用事务、持久化等企业能力。编程模型有两套:类似
Spring MVC
的注解模型(@Agent、@Action、@AchievesGoal、@Condition),以及
Kotlin DSL(agent { / action {)。框架本体用
Kotlin 编写,但对 Java 提供自然用法。
MCP。 文档称 Embabel 可消费外部 MCP Server
作为工具源,也可把自身 Agent 发布为 MCP Server(含
embabel-agent-starter-mcpserver)。@Export(remote = true)
等机制可把 Goal 暴露给 Claude Desktop 等 MCP 客户端。
可观测。
embabel-agent-starter-observability
在零业务改动前提下自动追踪 Agent 生命周期、Action、LLM
调用与工具调用,对接 OpenTelemetry 兼容后端(文档举例
Zipkin、Langfuse、LangSmith、Jaeger、Prometheus 等)。另有成本事件订阅与
Budget Guardrail 等与生产相关的配套能力。
可测试。 官方将单元测试与端到端 Agent
测试列为设计目标之一,并提供 embabel-agent-test
等模块(文档标注部分为 Incubating,选用时注意模块状态表)。
最小上手:依赖 + 一小段 Agent
前提:Java 21+、Maven Central、以及至少一个模型密钥(例如
OPENAI_API_KEY)。更快的路径是使用官方模板仓库 java-agent-template
或 kotlin-agent-template;注意模板
POM 里的版本号可能滞后于 Central,建议显式对齐到已核实的
1.5.2。
依赖示例(平台 + OpenAI + Shell):
<properties>
<embabel-agent.version>1.5.2</embabel-agent.version>
</properties>
<dependencies>
<dependency>
<groupId>com.embabel.agent</groupId>
<artifactId>embabel-agent-starter</artifactId>
<version>${embabel-agent.version}</version>
</dependency>
<dependency>
<groupId>com.embabel.agent</groupId>
<artifactId>embabel-agent-starter-openai</artifactId>
<version>${embabel-agent.version}</version>
</dependency>
<dependency>
<groupId>com.embabel.agent</groupId>
<artifactId>embabel-agent-starter-shell</artifactId>
<version>${embabel-agent.version}</version>
</dependency>
</dependencies>
应用仍是普通
@SpringBootApplication。下面是官方文档「Writing Your First
Agent」中的思路缩写(Java):用 @Action
产出中间领域对象,用 @AchievesGoal 标记达成目标的终态
Action。
@Agent(description = "Agent that writes and reviews stories")
public class WriteAndReviewAgent {
@Action
public Story writeStory(UserInput userInput, OperationContext context) {
return context.ai()
.withAutoLlm()
.createObject("""
You are a creative writer who aims to delight and surprise.
Write a story about %s
""".formatted(userInput.getContent()),
Story.class);
}
@AchievesGoal(description = "Review a story")
@Action
public ReviewedStory reviewStory(Story story, OperationContext context) {
return context.ai()
.withLlmByRole("reviewer")
.createObject("""
You are a meticulous editor.
Carefully review this story:
%s
""".formatted(story.text()),
ReviewedStory.class);
}
}
配置好密钥后启动 Shell,可用 execute / x
喂自然语言,例如文档示例:x "Tell me a story about a robot learning to paint"。框架会把输入包成
UserInput 放进黑板,再按类型依赖推断执行顺序。若只想在现有
Bean 里「掺一点 AI」,也可注入 Ai,调用
generateText /
createObject,不必一开始就上完整 Agent。
更完整的多步示例见官方 Examples 仓库中的
StarNewsFinder:抽取结构化人物、调用普通 Spring
服务取运势、带 Web 工具找新闻,最后生成 Markdown 文稿。同一 Agent 内混合
LLM 与非 LLM Action。
Java、Kotlin 与 Spring Boot 怎么接
- Java:
注解模型为主;模板与文档示例齐全。构造器注入业务服务即可,Agent 与普通
@Component/@Service共存。 - Kotlin: 同样支持注解;另有 idiomatic DSL。Hub
首页示例即是 Kotlin
@Action+createObjectIfPossible。 - Spring Boot: 加 starter 后由扫描注册
@Agent(默认embabel.agent.platform.scanning.annotation=true)。运行形态由你决定:Web、Shell、微服务,或 MCP Server starter。模型密钥可用环境变量或application.yml下的embabel.agent.platform.models.*。
把它当成「会规划的业务组件层」,而不是旁路脚本。
更适用的场景
- 已有 Java/Kotlin/Spring 资产,希望 Agent 与领域服务同进程、同类型系统落地。
- 需要多步编排、中间结果结构化、可对 Action 做单测与回归。
- 要在流程中混用大小模型、本地模型与云模型,并控制成本与隐私边界。
- 需要把能力以 MCP 形式对外暴露,或消费 Docker MCP 等外部工具目录。
- 生产侧关心 OpenTelemetry 链路、成本事件与 guardrail,而不是只看一次 demo 成功率。
以数据科学实验、训练与 notebook 探索为主且没有 JVM 集成诉求时,Python 生态通常更直接(这也是 Hub 对两侧分工的表述)。只想薄封装一次 Chat Completions,直接用 Spring AI 可能更轻。Open 模式官方写明最强但最不确定,生产上更常见 Focused / Closed。依赖文档中标为 Experimental / Incubating 的模块做硬承诺前,应对照模块状态表并接受可能的破坏性变更。默认 Context 仓储为内存实现,进程重启不保留;跨重启状态需自行对接持久化 SPI。
现在只需做一件事
从官方 Java/Kotlin 模板跑通 Shell,显式对齐
com.embabel.agent:embabel-agent-starter:1.5.2,再对照 User
Guide 里的 StarNewsFinder 与 MCP / Observability 章节。
延伸阅读:仓库 README、docs.embabel.com、embabel-agent-examples、示例应用 Tripper,以及 Hub 上的文档问答 Agent。
一起交流
分享你的思考,让讨论更进一步。