
Java开发者如何快速构建企业级AI Agent应用
最近这段时间,AI Agent(智能体)这个概念火得一塌糊涂。从OpenClaw到Claude Code,从Manus到各种Agent框架,仿佛一夜之间,“让AI自己干活”成了技术圈最热门的话题。
但很多Java开发者在尝试入局的时候,发现了一个尴尬的问题——市面上主流的Agent框架,绝大多数是Python生态的。
LangChain?Python的。
AutoGen?Python的。
CrewAI?还是Python的。
“三哥,我们团队都是Java技术栈,难道要为了做Agent专门去学Python吗?”
当然不用。
阿里巴巴开源的AgentScope-Java,就是专为Java开发者打造的智能体开发框架。
星链4SAPI今天这篇文章就专门跟大家一起聊聊AgentScope-Java,希望对你会有所帮助。
AgentScope-Java是阿里巴巴开源的一个面向智能体(Agent)编程的Java框架,用于构建基于大语言模型(LLM)的智能体应用。
它的核心目标很明确——让Java开发者用自己熟悉的语言和工具链,快速构建生产级的AI Agent应用。
在AgentScope出现之前,Java开发者想做Agent应用,基本只有两条路:
第一条路:用Python框架。
学新语言、搭新环境、维护两套技术栈,团队分裂。
第二条路:自己从零造轮子。
写ReAct循环、做工具调用、管理对话记忆、处理多Agent协作……每一项都是大工程。
AgentScope做的事情就是:把Agent开发需要的所有基础设施——ReAct推理循环、工具调用、记忆管理、多智能体协作、分布式部署——全部封装成一个Java框架,开箱即用。
很多小伙伴可能会问:“三哥,阿里巴巴不是有Spring AI Alibaba吗?跟这个有什么区别?”
这是一个非常好的问题。两者定位完全不同:
两者不是竞争关系,而是可以配合使用的关系。AgentScope负责Agent的“大脑”(推理、决策、行动),Spring AI Alibaba负责“感官”(接入各种AI能力)。
AgentScope-Java 2.0的核心设计思路非常清晰——提供两种Agent,覆盖从简单到复杂的所有场景。
ReActAgent是AgentScope最基础的Agent实现,它实现了完整的ReAct(Reasoning + Acting)推理循环。
所谓ReAct,就是让LLM在“思考→行动→观察→再思考”的循环中自主完成任务:

ReActAgent适合轻量级、单次对话、不需要持久化状态的场景。
HarnessAgent是AgentScope 2.0推荐的生产级入口。
它在ReActAgent的基础上,额外封装了一套工程化能力:
工程能力 | 说明 |
|---|---|
工作区(Workspace) | Agent的人格、知识、技能、记忆统一沉淀在结构化工作区中 |
长期记忆(Memory) | 跨会话的记忆持久化和语义检索 |
会话持久化(Session) | 对话状态自动保存,重启后无缝恢复 |
子Agent编排 | 主Agent可以委派任务给多个子Agent |
沙箱隔离(Sandbox) | 工具执行在隔离环境中运行,保证安全 |
上下文压缩(Compaction) | 长对话自动压缩,防止上下文溢出 |
核心区别:ReActAgent解决的是“这一次对话怎么跑”,HarnessAgent解决的是“长期运行的Agent怎么稳定、安全、可扩展”。

我的建议:大部分场景直接用HarnessAgent。
虽然看起来多了一些配置,但这些工程能力在生产环境中几乎是必需的。
AgentScope-Java 2.0需要JDK 17或更高版本,推荐使用Maven 3.9+。
检查你的Java版本:
代码语言:javascript
AI代码解释
java -version
# 需要输出 17 或更高AgentScope的依赖设计很清晰——核心模块和模型扩展分离。
第一步:添加核心依赖
代码语言:javascript
AI代码解释
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-harness</artifactId>
<version>2.0.0</version>
</dependency>agentscope-harness会自动引入agentscope-core,包含了ReActAgent和HarnessAgent的核心实现。
第二步:添加模型扩展
根据你要用的模型,添加对应的扩展依赖。以通义千问(DashScope)为例:
代码语言:javascript
AI代码解释
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-extensions-model-dashscope</artifactId>
<version>2.0.0</version>
</dependency>AgentScope通过环境变量读取API Key。以DashScope为例:
代码语言:javascript
AI代码解释
export DASHSCOPE_API_KEY="sk-你的API密钥"如果你用的是DeepSeek或OpenAI兼容的服务:
代码语言:javascript
AI代码解释
export OPENAI_API_KEY="sk-你的API密钥"下面这段代码是AgentScope-Java的“Hello World”——创建一个能对话的Agent。
代码语言:javascript
AI代码解释
package com.example;
import io.agentscope.core.ReActAgent;
import io.agentscope.core.agent.RuntimeContext;
import io.agentscope.core.formatter.openai.OpenAIChatFormatter;
import io.agentscope.core.message.UserMessage;
import io.agentscope.core.model.GenerateOptions;
import io.agentscope.core.model.OpenAIChatModel;
import io.agentscope.core.tool.Toolkit;
import io.agentscope.harness.HarnessAgent;
import java.nio.file.Path;
public class FirstAgent {
public static void main(String[] args) {
// 1. 创建Model(以DeepSeek为例)
String apiKey = System.getenv("DEEPSEEK_API_KEY");
OpenAIChatModel model = OpenAIChatModel.builder()
.apiKey(apiKey)
.modelName("deepseek-chat")
.baseUrl("https://4sapi.com")
.stream(true) // 启用流式输出
.enableThinking(true) // 启用思考模式
.formatter(new OpenAIChatFormatter())
.defaultOptions(GenerateOptions.builder()
.thinkingBudget(1024) // 思考token预算
.build())
.build();
// 2. 创建Agent
HarnessAgent agent = HarnessAgent.builder()
.name("Assistant")
.sysPrompt("你是一个乐于助人的AI助手,请友好简洁地回答问题。")
.model(model)
.workspace(Path.of("./workspace"))
.build();
// 3. 发送消息并获取回复
UserMessage userMsg = new UserMessage("你好,请介绍一下自己");
String reply = agent.call(userMsg, RuntimeContext.empty())
.block()
.getTextContent();
System.out.println(reply);
}
}代码拆解:
OpenAIChatModel,配置API地址、模型名称、是否流式输出、是否启用思考模式HarnessAgent.builder()创建Agent,指定名称、系统提示词、模型和工作区目录UserMessage,调用agent.call()获取回复运行后,你会看到Agent的回复。整个过程不到10行核心代码,一个能对话的AI Agent就跑起来了。
有些小伙伴可能会说:“Agent光会聊天有什么用?我要的是它能调用工具、执行操作!”
别急。AgentScope的工具系统就是干这个的。
没有工具的Agent只能“纸上谈兵”。AgentScope通过@Tool注解,让开发者可以把任意Java方法注册为Agent可调用的工具。
用@Tool和@ToolParam注解定义工具:
代码语言:javascript
AI代码解释
import io.agentscope.core.tool.Tool;
import io.agentscope.core.tool.ToolParam;
public class WeatherTools {
@Tool(name = "get_weather", description = "获取指定城市的当前天气")
public String getWeather(
@ToolParam(name = "city", description = "城市名称,例如'北京'")
String city
) {
// 这里可以调用真实的天气API
return city + "今天晴,温度25°C";
}
@Tool(name = "calculate", description = "执行数学计算")
public double calculate(
@ToolParam(name = "expression", description = "数学表达式")
String expression
) {
// 这里可以集成表达式计算引擎
return 42.0;
}
}关键点:
@Tool的name是工具的唯一标识,Agent调用时使用此名称@Tool的description描述工具功能,Agent根据此描述决定何时调用@ToolParam标注在方法参数上,描述参数的含义创建Toolkit实例,将工具注册进去:
代码语言:javascript
AI代码解释
// 创建工具集
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new WeatherTools());
// 将工具集传给Agent
HarnessAgent agent = HarnessAgent.builder()
.name("Assistant")
.sysPrompt("你是一个可以使用工具的助手。")
.model(model)
.toolkit(toolkit) // 注册工具
.workspace(Path.of("./workspace"))
.build();代码语言:javascript
AI代码解释
public class ToolCallingExample {
public static void main(String[] args) {
// 创建Model
OpenAIChatModel model = ...;
// 创建工具集
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new WeatherTools());
// 创建Agent并注册工具
HarnessAgent agent = HarnessAgent.builder()
.name("Assistant")
.sysPrompt("你是一个可以使用工具的助手。当用户问天气时,调用get_weather工具。")
.model(model)
.toolkit(toolkit)
.build();
// 用户提问,Agent会自动决定是否调用工具
UserMessage userMsg = new UserMessage("北京今天天气怎么样?");
String reply = agent.call(userMsg, RuntimeContext.empty())
.block()
.getTextContent();
System.out.println(reply);
// 输出:北京今天晴,温度25°C
}
}关键理解:Agent在ReAct循环中会自主决定是否调用工具、调用哪个工具、何时调用。开发者只需要定义工具,Agent自己会判断“什么时候该用”。
有些小伙伴可能会问:“一个Agent不够用怎么办?复杂任务需要多个Agent协作怎么搞?”
AgentScope 2.0提供了orchestrator + workers模式来实现多Agent协作。
2.0版本的核心理念是:主Agent扮演“主持人”,子Agent扮演“参与者”。
主Agent负责接收用户任务、拆解任务、委派给子Agent、汇总结果。

子Agent可以通过文件驱动的方式定义——在workspace/subagents/目录下创建.md文件:
workspace/subagents/weather.md:
代码语言:javascript
AI代码解释
id: weather
description: 查城市天气。输入:城市名 + 日期。输出:温度区间、是否下雨。
sysPrompt: |
你是一个气象助理。用户给你一个城市和日期,你返回:
- 温度(高/低)
- 是否下雨
- 是否需要带伞
严格三行,不超过60字。workspace/subagents/flight.md:
代码语言:javascript
AI代码解释
id: flight
description: 查航班信息。输入:出发城市 + 到达城市 + 日期。
sysPrompt: |
你是一个航班查询助理。根据用户输入给出一个mock航班号和起降时间。如果子Agent需要调用Java端的工具(比如真实的天气API),可以在Java端再注册一份:
代码语言:javascript
AI代码解释
import io.agentscope.harness.agent.subagent.SubagentDeclaration;
// Java端补强weather子Agent
SubagentDeclaration weather = SubagentDeclaration.builder()
.name("weather")
.description("查城市天气;输入城市+日期,返回温度区间和是否带伞")
.inlineAgentsBody("你是一个气象助理,会调用工具查询真实天气")
.build();
// 在HarnessAgent中注册子Agent
HarnessAgent agent = HarnessAgent.builder()
.name("TravelAssistant")
.model(model)
.subagent(weather) // 注册子Agent
.workspace(Path.of("./workspace"))
.build();主Agent会自己决定:是否需要调用子Agent、调用哪些子Agent、调用顺序是什么。
AgentScope-Java采用经典的分层架构设计:

AgentScope的整体架构可以清晰分为四层:
当一个用户消息进入Agent时,ReAct循环的执行流程如下:

HarnessAgent在ReAct循环的关键时机插入了Hook,实现了工作区加载、记忆读写、会话持久化等功能。
AgentScope 2.0最核心的升级之一,就是原生支持分布式部署。
在单机开发阶段,状态默认落到本地workspace目录。
进入生产部署后,只需把状态后端切换为分布式存储:

同一份业务代码,只需切换存储后端,就能从单机模式切换到分布式模式。
任意副本都能恢复任意用户的完整上下文。
有些小伙伴可能会说:“单个Agent我跑通了,但真实业务需要多个Agent协作,怎么办?”
AgentScope 2.0提供了文件驱动的Subagent机制。你只需要在workspace/subagents/目录下放几个.md文件,主Agent就会自己决定“什么时候该叫谁”。
我们来看一个完整的实战——旅行助手。用户问:“我明天从北京飞杭州,落地后去西湖,要带伞吗?”
1.x时代,你需要写代码串三个Agent(天气→航班→景点)。
2.0时代,主Agent自己决定先查天气还是航班,三个Subagent并行启动。
代码语言:javascript
AI代码解释
travel-assistant/
├── pom.xml
└── workspace/
├── MEMORY.md
├── subagents/
│ ├── weather.md
│ ├── flight.md
│ └── attraction.md
└── state/
└── session-*.json # JsonFileAgentStateStore自动生成workspace/subagents/weather.md:
代码语言:javascript
AI代码解释
id: weather
description: |
查城市天气。
输入:城市名 + 日期(YYYY-MM-DD)。
输出:温度区间、是否下雨、是否需要带伞。
sysPrompt: |
你是一个气象助理。
用户给你一个城市和日期,你返回:
- 温度(高/低,摄氏度)
- 是否下雨
- 是否需要带伞
严格三行,不超过60字。workspace/subagents/flight.md:
代码语言:javascript
AI代码解释
id: flight
description: |
查航班信息(mock)。
输入:出发城市 + 到达城市 + 日期。
输出:航班号、起飞时间、到达时间。
sysPrompt: |
你是一个航班查询助理。
根据用户输入给出一个mock航班号和起降时间。
注意:测试环境,无需真查询,给出合理mock即可。workspace/subagents/attraction.md:
代码语言:javascript
AI代码解释
id: attraction
description: |
景点信息助理(mock)。
输入:城市 + 景点名。
输出:开放时间、是否需要预约、周边交通。
sysPrompt: |
你是一个导游助理。
根据用户输入给出景点的实用信息。这三份描述对主Agent来说是路由表——主Agent全靠description决定要不要spawn它们。
如果某个Subagent需要调用Java端的真实工具(比如weather.md背后要接真的天气API),可以在Java端再注册一份——HarnessAgent会把文件+Java声明合并:
代码语言:javascript
AI代码解释
import io.agentscope.core.model.DashScopeChatModel;
import io.agentscope.core.tool.Toolkit;
import io.agentscope.harness.HarnessAgent;
import io.agentscope.harness.agent.subagent.SubagentDeclaration;
import java.nio.file.Path;
public class TravelAssistant {
public static void main(String[] args) {
// 1. 创建Model
DashScopeChatModel model = DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen-plus")
.build();
// 2. 创建Toolkit并注册天气查询工具
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new WeatherLookupTool()); // 真实的天气API工具
// 3. Java端补强weather subagent——tools白名单过滤继承自父agent的工具
SubagentDeclaration weather = SubagentDeclaration.builder()
.name("weather")
.description("查城市天气;输入城市+日期,返回温度区间和是否带伞")
.inlineAgentsBody("你是一个气象助理,会调用工具查询真实天气")
.build();
// 4. 创建HarnessAgent,注册subagent
HarnessAgent agent = HarnessAgent.builder()
.name("TravelAssistant")
.model(model)
.toolkit(toolkit)
.workspace(Path.of("./workspace"))
.subagent(weather) // Java端补强的subagent
.build();
// 5. 运行
UserMessage userMsg = new UserMessage(
"我明天从北京飞杭州,落地后去西湖,要带伞吗?"
);
String reply = agent.call(userMsg, RuntimeContext.empty())
.block()
.getTextContent();
System.out.println(reply);
}
}关键理解:主Agent在推理过程中会自主决定是否需要调用Subagent、调用哪些Subagent、调用的顺序是什么。
整个“编排”过程由LLM完成,不需要你写死Pipeline。
有些小伙伴可能会说:“工具调用要自己写Java类,如果要接入GitHub、数据库、Slack这些外部服务,难道每个都要自己封装?”
不用。
AgentScope 2.0支持MCP(Model Context Protocol)协议,你只需要在workspace/tools.json里一行声明一个MCP server,Agent启动时自动发现并注册工具。
MCP是Anthropic在2024年推出的开放协议,让LLM应用以统一方式发现并调用外部工具。
AgentScope 2.0把MCP server作为Agent工具的一种“来源”——你在tools.json里声明一个MCP server,Agent启动时通过stdio或sse协议连上它,自动把server暴露的工具当作Agent自己的tool。
workspace/tools.json:
代码语言:javascript
AI代码解释
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
}
}
}
}HarnessAgent.builder().workspace(path) 启动时会自动扫描workspace/tools.json的mcpServers段、连接每个server、把工具注册到Agent——不需要额外开关:
代码语言:javascript
AI代码解释
HarnessAgent agent = HarnessAgent.builder()
.name("GitHubAssistant")
.model(model)
.workspace(Path.of("./workspace")) // 自动加载tools.json
.build();跑起来后,Agent就能调用GitHub MCP server暴露的create_issue、list_repos、search_code等工具了。
MCP支持三种传输协议:
协议 | 适用场景 | 声明方式 |
|---|---|---|
stdio | 本地进程,最常见 | command + args |
sse | 远程HTTP SSE server | url + headers |
ws | 双向WebSocket | url + headers |
stdio示例(接入本地文件系统):
代码语言:javascript
AI代码解释
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
}
}
}sse示例(接入远程知识库):
代码语言:javascript
AI代码解释
{
"mcpServers": {
"remote-knowledge": {
"url": "https://mcp.example.com/sse",
"headers": {
"Authorization": "Bearer ${env:MCP_TOKEN}"
}
}
}
}有时候你想在代码里动态拼参数——比如token从环境变量读、超时按环境切换。
这时候可以直接在Java代码里配:
代码语言:javascript
AI代码解释
import io.agentscope.harness.agent.tools.McpServerConfig;
import io.agentscope.harness.agent.tools.ToolsConfig;
ToolsConfig cfg = new ToolsConfig();
Map<String, McpServerConfig> servers = new LinkedHashMap<>();
McpServerConfig github = new McpServerConfig();
github.setTransport("stdio");
github.setCommand("npx");
github.setArgs(List.of("-y", "@modelcontextprotocol/server-github"));
github.setEnv(Map.of("GITHUB_PERSONAL_ACCESS_TOKEN", System.getenv("GITHUB_TOKEN")));
servers.put("github", github);
cfg.setMcpServers(servers);
// 然后通过HarnessAgent的toolsConfig()方法传入效果和tools.json完全一样。
MCP Server | 用途 | 安装命令 |
|---|---|---|
server-github | GitHub操作(创建Issue、搜索代码等) | npx -y @modelcontextprotocol/server-github |
server-filesystem | 本地文件系统读写 | npx -y @modelcontextprotocol/server-filesystem |
server-postgres | PostgreSQL数据库查询 | npx -y @modelcontextprotocol/server-postgres |
server-slack | Slack消息发送 | npx -y @modelcontextprotocol/server-slack |
server-puppeteer | 浏览器自动化(网页抓取、截图) | npx -y @modelcontextprotocol/server-puppeteer |
接入MCP生态后,AgentScope的Agent能力边界被极大地扩展了——只要能通过MCP暴露的工具,Agent都能调用。
1. Java生态无缝集成AgentScope完美兼容Spring Boot、Spring Cloud、Maven等Java主流技术栈。对于Java团队来说,学习曲线非常平缓。
2. 双Agent架构,覆盖全场景ReActAgent满足轻量级需求,HarnessAgent覆盖生产级工程需求。从原型到生产,一套框架全搞定。
3. 完善的工具系统通过@Tool注解即可将任意Java方法注册为Agent工具,Agent在ReAct循环中自主决定调用时机。
4. 原生多Agent协作内置orchestrator + workers模式,主Agent可以委派任务给多个子Agent,支持同步和异步两种模式。
5. 生产级工程能力工作区、长期记忆、会话持久化、上下文压缩、沙箱隔离——HarnessAgent把企业级Agent需要的工程能力全部打包。
6. 分布式部署原生支持支持Redis、MySQL、PostgreSQL等多种状态存储后端,支持Kubernetes水平扩展。
7. 多模型支持内置OpenAI协议(DeepSeek、GLM、Ollama等)、DashScope(通义千问)、Anthropic Claude、Google Gemini。
8. MCP/A2A协议支持支持Model Context Protocol和Agent-to-Agent协议,可以接入MCP生态的工具和服务。
1. 相对较新AgentScope-Java 1.0于2025年12月发布,2.0于2026年7月GA。相比Spring AI等成熟框架,社区积累较少。
2. 学习曲线HarnessAgent的工程化概念(工作区、记忆、子Agent等)需要一定的学习成本。
3. 生态不如Spring AI丰富目前第三方集成和扩展的数量不如Spring AI Alibaba。
4. 文档偏英文虽然官方提供了中文文档,但部分深度内容仍以英文为主。
场景 | 推荐程度 | 理由 |
|---|---|---|
智能客服系统 | 强烈推荐 | 多Agent协作+知识库RAG |
运维诊断Agent | 强烈推荐 | 自主推理+工具调用+日志分析 |
金融分析Agent | 强烈推荐 | 结构化输出+多步推理 |
代码辅助Agent | 推荐 | 工具调用+代码执行沙箱 |
企业内部知识助手 | 推荐 | RAG+长期记忆 |
简单聊天机器人 | 可能过度设计 | 用Spring AI Alibaba即可 |
已有Spring AI生态 | 需评估 | 两者可以配合使用 |
回到最初的问题:Java开发者怎么做AI Agent?
AgentScope-Java给出了一个非常完整的答案。
它不是“把Python框架翻译成Java”的简单移植,而是从Java生态的实际情况出发,专门为Java开发者设计的Agent框架。
ReActAgent让你快速跑通Agent原型,HarnessAgent让你把原型变成生产级应用。
@Tool注解让工具定义像写普通Java方法一样自然,子Agent系统让多Agent协作变得清晰可控。
最关键的是——它让Java开发者不需要为了做Agent去学Python。
开源地址
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。