# AgentForge
**Repository Path**: changluJava/AgentForge
## Basic Information
- **Project Name**: AgentForge
- **Description**: A Java-first framework for building, running, and evolving production-ready AI agents.
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-30
- **Last Updated**: 2026-09-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AgentForge
> **Forge Intelligence into Action.**
> **将智能锻造成行动。**
AgentForge 是一个面向 Java 开发者、从 **LLM 最底层能力开始构建** 的开源 Agent Framework。
它不会从一个已经高度封装的 Agent API 起步,而是先建立稳定、统一、可扩展的模型抽象,再逐层向上构造 Context、Memory、Tool、Skill、MCP、Reasoning、Agent Runtime 与 Multi-Agent 等能力。
**AgentForge 的目标不是提供一个固定形态的 Agent,而是提供一套可以持续“锻造”不同 Agent 的底层能力。**
---
## 1. 名称与立意
**AgentForge = Agent + Forge**。
`Agent` 代表能够理解目标、进行推理、调用工具并完成任务的智能体;`Forge` 原意是“锻造、熔炉、工坊”,强调把原始材料经过持续加工、塑形和强化,最终打造为真正可用的产品。
AgentForge 想表达的是:
> **大模型提供原始智能,AgentForge 将这些智能能力逐层工程化,最终锻造成能够真正执行任务的 Agent。**
从模型到智能体,中间并不是简单增加一个循环,而是一整套工程体系:
```text
LLM
↓
Message / Request / Response
↓
Context / Memory
↓
Tool / Skill / MCP
↓
Reasoning / Planning
↓
Agent Runtime
↓
Multi-Agent / Sandbox / Observability
↓
Real Action
```
因此 AgentForge 的核心 Slogan 是:
> **Forge Intelligence into Action.**
> **将智能锻造成行动。**
### 为什么从 LLM 层开始?
Agent 的上层能力最终都会落到模型调用上。如果最底层模型抽象不稳定,上层 Agent、Tool Calling、Memory、Context 乃至 Multi-Agent 都会被具体厂商协议绑住。
所以 AgentForge 选择 **Bottom-up** 的构建方式:
1. 先定义稳定、厂商无关的 `ChatModel` 核心接口;
2. 再实现 OpenAI、Anthropic 等 Provider Adapter;
3. 上层框架只依赖 AgentForge 自己的抽象,不直接依赖任何厂商 SDK;
4. 最终逐层构造完整 Agent Runtime。
这一设计思路参考了 LangChain4j 的“核心抽象 + Provider Integration”模块化方式,但 AgentForge 会从自己的 Agent Runtime 目标出发逐步演进 API。
---
## 2. 当前项目结构
`agentforge-llm` 已完成第一阶段模型抽象与 Provider Adapter;`agentforge-framework` 开始落地 Agent 基础层:
`agentforge-ai-core` 提供 ChatModel 工厂,`agentforge-ai-agent` 提供 ReAct Agent 运行时。
```text
AgentForge
├── agentforge-ai-parent
├── agentforge-ai-bom
├── agentforge-llm
│ ├── agentforge-llm-core
│ ├── agentforge-llm-openai
│ └── agentforge-llm-anthropic
│
├── agentforge-framework
│ ├── agentforge-ai-core
│ └── agentforge-ai-agent
│
├── agentforge-examples
│ └── agentforge-studio
│ ├── agentforge-studio-ui
│ └── agentforge-studio-web
│
├── pom.xml
└── README.md
```
### `agentforge-llm-core`
第一阶段最重要的底层模块,不依赖 OpenAI / Anthropic SDK,也不依赖第三方 JSON/HTTP 库。
当前提供:
- `ChatModel`:统一同步模型调用入口;
- `StreamingChatModel`:统一流式模型调用入口;
- `StreamingChatResponseHandler`:统一流式增量 / 完成 / 异常回调;
- `ChatRequest`:统一请求对象;
- `ChatRequestParameters`:统一模型参数抽象;
- `ChatMessage`:System / User / AI / ToolExecutionResult / Custom Message;
- `ChatResponse`:统一响应;
- `TokenUsage` / `FinishReason`:统一结果元信息;
- `HttpTransport`:可替换 HTTP Transport SPI,同时支持同步与流式扩展;
- `JdkHttpTransport`:基于 JDK `HttpURLConnection` 的零依赖默认实现,流式请求通过后台守护线程持续消费响应。
核心 API:
```java
public interface ChatModel {
ChatResponse chat(ChatRequest chatRequest);
default String chat(String userMessage) {
// convenience API
}
}
```
上层 Agent Framework 未来只面向 `ChatModel`,而不关心底层实际使用 OpenAI、Anthropic 或其它模型服务。
### `agentforge-llm-openai`
实现 OpenAI Chat Completions 协议,同时提供同步与流式模型:
```java
ChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
String answer = model.chat("Hello AgentForge");
```
流式调用:
```java
StreamingChatModel model = OpenAiStreamingChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
model.chat("Hello AgentForge", new StreamingChatResponseHandler() {
@Override
public void onPartialResponse(String partialResponse) {
System.out.print(partialResponse);
}
@Override
public void onCompleteResponse(ChatResponse completeResponse) {
System.out.println("\nfinishReason=" + completeResponse.finishReason());
}
@Override
public void onError(Throwable error) {
error.printStackTrace();
}
});
```
`OpenAiStreamingChatModel` 基于 OpenAI SSE Chat Completions 流式协议实现:请求固定开启 `stream=true`,同时请求 `stream_options.include_usage=true`,逐个转发 `delta.content`,并在流结束后聚合出统一 `ChatResponse`。这一接口设计参考 LangChain4j 的 `StreamingChatModel + StreamingChatResponseHandler` 分层思路,但保持 AgentForge 自己的 JDK 8 兼容 API 与 HTTP Transport 抽象。
`baseUrl` 可配置,因此也可以作为 OpenAI-compatible Provider 的基础适配器:
```java
ChatModel model = OpenAiChatModel.builder()
.baseUrl("https://your-openai-compatible-endpoint/v1")
.apiKey(System.getenv("MODEL_API_KEY"))
.modelName("your-model")
.build();
```
### `agentforge-llm-anthropic`
实现 Anthropic Messages API:
```java
ChatModel model = AnthropicChatModel.builder()
.apiKey(System.getenv("ANTHROPIC_API_KEY"))
.modelName("your-claude-model")
.maxTokens(1024)
.build();
String answer = model.chat("Hello AgentForge");
```
### `agentforge-ai-core`
框架层模型工厂,屏蔽 Provider Adapter 构建细节,只暴露一个配置对象:
```java
LlmBasicConfig config = LlmBasicConfig.builder()
.provider(LlmEnum.OPENAI.getCode())
.url("https://your-openai-compatible-endpoint/v1")
.apiKey(System.getenv("MODEL_API_KEY"))
.modelName("your-model")
.prop(LlmConstant.TEMPERATURE, "0.0")
.prop(LlmConstant.MAX_TOKENS, "1024")
.prop(LlmConstant.TIMEOUT, "120")
.build();
ChatModel chatModel = LlmFactory.buildChatModel(config);
StreamingChatModel streamingChatModel = LlmFactory.buildStreamChatModel(config);
```
- `LlmFactory`:按 `provider` 编码路由到对应 `IModel` 实现;
- `LlmBasicConfig`:provider / url / modelName / apiKey + `Properties` 扩展参数;
- `LlmConstant`:`timeout`(秒)/ `temperature` / `topP` / `maxTokens`;
- `OpenAiModel` / `AnthropicModel`:把公共参数映射到各 Provider Builder。
### `agentforge-ai-agent`
第一版 ReAct Agent 运行时,`agentforge-llm` 之上补齐 Context / Memory / Tool / Stream 与 Think-Act 主循环:
```java
ToolService toolService = new ToolService();
toolService.tools(new WeatherTools());
ReActAgent agent = ReActAgent.builder()
.agentName("weather-react-agent")
.systemPrompt("你是一个天气助手。")
.chatModel(chatModel)
.streamingChatModel(streamingChatModel)
.chatMemoryProvider(ChatMemoryProvider.windowChatMemoryProvider(50))
.toolService(toolService)
.agentSettings(AgentSettings.builder().maxSteps(5).build())
.build();
// 非流式:think -> act(工具) -> think
ChatResult result = agent.run(AgentRequest.builder()
.memoryId("demo")
.question("北京今天的天气怎么样?")
.build());
// 流式:同样的请求,返回可持续订阅的 TokenStream
TokenStream tokenStream = agent.runStream(AgentRequest.builder()
.memoryId("demo")
.question("北京今天的天气怎么样?")
.build());
// 中间件:像 AOP 一样横切 think-act 主循环
ReActAgent observedAgent = ReActAgent.builder()
.agentName("observed-agent")
.systemPrompt("你是一个天气助手。")
.chatModel(chatModel)
.chatMemoryProvider(ChatMemoryProvider.windowChatMemoryProvider(50))
.toolService(toolService)
.agentSettings(AgentSettings.builder().maxSteps(5).build())
.middleware(new LoggingIAgentMiddleware()) // 单个
.build();
```
- `IAgent` / `BaseAgent` / `Agent` / `BaseReActAgent` / `ReActAgent`:分层主循环,模型回答不再要求工具时
(finishReason = STOP)退出,并以 `SUCCESS` / `MODEL_CALL_ERROR` / `CANCEL` / `MAX_STEPS` 收敛运行态;
- `AgentChatContext`:单次运行上下文,由 `BaseAgent` 每次运行时构建,持有 `AgentRequest`、
`ChatMemory`、`ChatModel`,并自行维护 `extensions` 扩展业务字段;
- `ChatMemory` / `WindowChatMemory` / `ChatMemoryProvider`:会话窗口记忆;
- `AgentToolExecutor`:把 `agentforge-llm` 的 `ToolService` 接入工具调用回合;
- `TokenStream` / `ReActTokenStream`:模型文本 / 思考增量、中间响应(工具调用轮)、`[tool]` 事件与完成 / 异常回调。
- `AgentMiddlewareManager` / `IAgentMiddleware` / `IStreamingIAgentMiddleware`:横切 Agent 主循环的中间件,
覆盖初始化、每轮 begin-end、模型调用前后、流式文本 / 思考增量(DeepSeek `reasoning_content`、
Anthropic `thinking_delta`)、中间响应、工具执行前后、重试、停止与异常等触发点;
- `extend.middlewares.LoggingIAgentMiddleware`:内置的日志中间件示例,覆盖全部触发点。
---
## 3. ChatModel 设计
AgentForge 第一版不会急着实现完整 Agent,而是先把模型调用边界稳定下来。
### 统一请求
```java
ChatRequest request = ChatRequest.builder()
.message(SystemMessage.from("You are a helpful assistant."))
.message(UserMessage.from("What is AgentForge?"))
.parameters(DefaultChatRequestParameters.builder()
.temperature(0.2)
.maxTokens(1024)
.build())
.build();
ChatResponse response = model.chat(request);
```
### Provider 无关
业务与上层 Agent 只依赖:
```java
ChatModel
```
Provider 负责实现:
```text
ChatModel
├── OpenAiChatModel
└── AnthropicChatModel
```
未来可以继续扩展:
```text
ChatModel
├── OpenAiChatModel
├── AnthropicChatModel
├── DashScopeChatModel
├── OllamaChatModel
├── XinferenceChatModel
└── ...
```
### 请求级参数覆盖模型级默认参数
模型可以配置默认参数:
```java
OpenAiChatModel.builder()
.modelName("gpt-4o-mini")
.temperature(0.7)
.build();
```
单次请求也可以覆盖:
```java
ChatRequest request = ChatRequest.builder()
.message(UserMessage.from("Explain ReAct."))
.parameters(DefaultChatRequestParameters.builder()
.temperature(0.1)
.build())
.build();
```
这样可以保持核心接口稳定,同时给不同调用场景保留足够灵活性。
---
## 4. Java 版本策略
AgentForge 的版本策略是:
> **推荐 JDK 17,兼容 JDK 8。**
具体策略:
- 日常开发、CI 和新用户默认推荐 **JDK 17**;
- 第一阶段公共模块编译目标为 **Java 8 bytecode**;
- JDK 8 用户可以直接依赖和运行;
- JDK 17 用户无需额外配置,可以直接使用;
- Maven 编译级别固定为 `source/target 8`,并通过 JDK 8 / JDK 17 双版本 CI 持续验证兼容性;
- 核心 LLM 层当前不依赖 Spring,也不依赖高版本 JDK HTTP Client。
这意味着:
```text
JDK 8 ✅ Compatible
JDK 17 ✅ Recommended
```
构建:
```bash
mvn clean test
```
### 包名与 Maven 坐标约定
AgentForge 统一使用以下根包名:
```text
com.changlu.agentforge.xxx
```
例如:
```text
com.changlu.agentforge.llm.chat
com.changlu.agentforge.llm.openai
com.changlu.agentforge.llm.anthropic
com.changlu.agentforge.ai.core
com.changlu.agentforge.ai.agent
```
Maven `groupId` 同样统一为:
```text
com.changlu.agentforge
```
### 单元测试
当前五个实现模块均已补充单元测试:
```text
agentforge-llm-core -> Core API / Request / Parameters / JSON / HTTP
agentforge-llm-openai -> 请求映射 / 响应归一化 / 异常 / OpenAI-compatible
agentforge-llm-anthropic -> System Message / Messages API / 响应归一化 / 异常
agentforge-ai-core -> LlmFactory / LlmEnum / 参数映射 / 配置对象
agentforge-ai-agent -> ReAct 主循环 / 流式 / Memory / 取消 / maxSteps
```
单测默认不访问真实模型服务,而是通过可替换的 `HttpTransport` 使用 Fake/Capturing Transport、以及脚本化
`ChatModel` / `StreamingChatModel` 验证请求与响应,因此 CI 中无需配置任何 API Key。
`*LiveTest` 用于真实 endpoint 端到端验证:从 `src/test/resources/live-endpoint.properties`(已被 `.gitignore`
忽略)读取 `provider` / `baseUrl` / `modelName` / `apiKey`,未配置时自动跳过,可参考同目录下的
`live-endpoint.example.properties`。真实 Key 请勿写进 Java 源码,该文件会随仓库公开。
当前共包含 **140 个单元测试用例**,并持续通过 JDK 8 / JDK 17 CI 执行:
```bash
mvn clean test
```
---
## 5. Roadmap
AgentForge 将按照“从底层模型能力逐层锻造 Agent”的顺序演进。
### Phase 1 — LLM Foundation(已完成)
```text
agentforge-llm-core
agentforge-llm-openai
agentforge-llm-anthropic
```
目标:稳定 `ChatModel`、`StreamingChatModel`、Message、Request、Response、Provider Adapter 等最底层模型抽象。当前消息层已补齐 `ToolExecutionResultMessage` 与 `CustomMessage`。
当前 OpenAI Provider 已同时具备 `OpenAiChatModel` 与 `OpenAiStreamingChatModel`。
### Phase 2 — LLM Capability(进行中)
计划逐步增加:
```text
Anthropic StreamingChatModel
Tool Calling
Structured Output
Multimodal Message
Embedding Model
Image Model
Retry / Listener / Observability
More Providers
```
其中 `Anthropic StreamingChatModel` 与 `Tool Calling`(阻塞 + 流式,OpenAI / Anthropic 双协议)已落地。
### Phase 3 — Agent Foundation(当前)
开始实现:
```text
agentforge-ai-core
agentforge-ai-agent
```
已完成 `LlmFactory` ChatModel 工厂、ReAct 主循环(流式 / 非流式)、窗口记忆、工具调用回合与
Middleware 链路;Human-in-the-loop 审批与 Resume、External Tool / Stop-Tool 模式、子 Agent 与 Trace
仍待从设计参考中逐步补齐。
逐步加入:
```text
Context
Memory
Tool
Skill
MCP
Prompt
Reasoning
Planning
ReAct
Agent Runtime
```
### Phase 4 — Production Agent Runtime
最终目标:
```text
SubAgent
Multi-Agent
Sandbox
State / Snapshot
Human-in-the-loop
Tracing
Observability
Persistence
Production Runtime
```
---
## Design Principles
AgentForge 会长期坚持几个原则:
**1. Bottom-up**
先把 LLM、Message、Request、Response 等基础抽象做稳定,再构建 Agent。
**2. Provider-neutral**
上层框架不应该被某一家模型厂商协议绑定。
**3. Modular**
核心抽象与 Provider、Framework、Agent Runtime 分模块演进。
**4. Lightweight**
底层尽量减少不必要依赖,让 AgentForge 可以被 Spring Boot、普通 Java、桌面端甚至嵌入式 Java 工程复用。
**5. Production-oriented**
最终目标不是 Demo Agent,而是可以真正进入生产环境的 Agent Runtime。
---
## License
AgentForge is released under the [MIT License](LICENSE).
---
## AgentForge
> **Models provide intelligence. AgentForge turns intelligence into action.**
模型提供智能,AgentForge 负责将它一步步锻造成真正能够行动的 Agent。