开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐

开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐

我把做 LLM 应用最常踩的坑——多厂商接入、会话记忆、工具调用、多智能体编排——做成了一套开箱即用的 Java 框架,已发布 Maven Central。核心模块零 Spring 依赖,JDK 17 开箱即用。

前言

用 Java 做 LLM 应用开发,你会发现一个尴尬的现状:Python 生态里 LangChain、LlamaIndex 卷得飞起,Java 这边却基本只有 Spring AI 一条路——绑定 Spring 全家桶,想在自己已有的工程里嵌一个 Agent 循环,或者不用 Spring,选择就很有限。

所以我写了Baton(指挥棒/接力棒):单智能体的 ReAct 循环是“接力”,多智能体的工作流编排是“指挥”。它不是 Spring AI 的替代品,而是一套核心纯 Java、按需组合的积木——你可以只拿一个对话循环嵌进任何工程,也可以一个依赖拉起带 HTTP/SSE/WebSocket/gRPC 的完整服务。

已经发布 Maven Central,欢迎体验:

xml

<dependency> <groupId>io.github.lookfukc</groupId> <artifactId>baton-all</artifactId> <version>1.0.0</version> </dependency>

GitHub:GitHub - Lookfukc/baton: Baton is a Java library for building LLM/Tool/Memory pipelines. · GitHub

一、它能干什么

能力说明
多厂商接入一套 API 适配 OpenAI / Anthropic / Gemini 三种协议,DeepSeek、GLM 等 OpenAI 兼容厂商开箱即用,带 per-model 定价与成本核算
ReAct Agent 循环有状态/无状态双模式,流式输出、迭代熔断、dangling tool-call 自动修复
工具调用工具注册表 + 内置工具(安全计算器/时钟/SSRF 防护的 HTTP 抓取)+ 完整 MCP 客户端(stdio/HTTP)
会话记忆文件 / SQLite / PostgreSQL / Redis 四后端,TTL 过期、摘要压缩、快照回滚、AES-256-GCM 加密
长期记忆pgvector 向量+关键词混合召回、LLM 事实抽取
多智能体编排顺序 / Router / Supervisor / 人工 Checkpoint,运行状态落盘、断点续跑
可观测性Micrometer 指标、trace、事件总线、HMAC 签名 webhook
中间件链重试 / 限流 / 主备切换 / 响应缓存,流式与非流式全覆盖

二、3 分钟跑起第一个 Agent

注册厂商 → 组装 → 跑循环,就这么点代码:

java

// 1. 注册厂商(密钥永远走环境变量) Registry registry = new Registry(); registry.register(ProviderConfig.builder() .id("deepseek").protocol("openai") .baseURL("https://api.deepseek.com/v1") .apiKeyEnv("DEEPSEEK_API_KEY") .defaultModel("deepseek-chat") .addModel(ModelConfig.builder().id("deepseek-chat") .capabilities(ModelCapabilities.builder() .streaming(true).toolCalls(true).contextWindow(64_000).build()) .inputPricePerMtok(0.28).outputPricePerMtok(1.10) .build()) .build()); registry.mustGet("deepseek").loadApiKeyFromEnv(); // 2. 组装 + 中间件(日志→重试→流式重试) LLM llm = Adapters.newLLM(registry.mustGet("deepseek")); LLM wrapped = Pipeline.streamRetry( Pipeline.of(llm, Pipeline.logging(null), Pipeline.retry(3)), 3); // 3. Agent 循环 Loop loop = new Loop(wrapped, new ToolRegistry(), PersistentMemory.open("./sessions", null), Loop.Config.builder() .model("deepseek-chat") .systemPrompt("你是一个简洁的助手") .maxIterations(16) // 熔断,防失控 .tokenBudget(32_000) // 预算内自动截断历史 .onEvent(e -> { // 流式回调 if (e.type() == LoopEvent.Type.DELTA_TEXT) System.out.print(e.text()); }) .build()); Loop.RunOutcome out = loop.run("user-42", "帮我查下明天天气并总结"); System.out.printf("tokens: in=%d out=%d%n", out.usage().inputTokens(), out.usage().outputTokens());

自定义工具也只要几行:

java

tools.register(Tool.of("weather", "查询城市天气", Json.parse(""" {"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}"""), args -> ToolResult.of(Json.parse(args).get("city").asText() + ":晴,23°C")));

三、两个我特别想聊的设计

1. 有状态 / 无状态,一个 API 讲清楚

框架最常被问的问题:历史由谁保管?Baton 两种都给,内部循环逻辑完全一致:

  • 有状态:loop.run(sessionId, input)——只传会话 ID,记忆、截断、工具配对全由框架管。适合服务端聊天应用。
  • 无状态:loop.runWithHistory(history, input)——框架零存储,跑完把本轮新增消息newMessages()还给你自己存库。适合 Serverless、已有用户表、数据合规严格的场景,水平扩展天然不需要共享存储。

2. 多智能体编排,带人工审批点

java

Orchestrator orch = new Orchestrator(FileRunStore.open("./runs")); orch.registerAgent("writer", writerLoop); orch.registerAgent("reviewer", reviewerLoop); orch.registerWorkflow(new Workflow("review", List.of( new AgentStep("", "writer", "$input"), new CheckpointStep("approve", "审核草稿"), // 人工审批点 new AgentStep("", "reviewer", "$prev")))); try { orch.run("review", "写一首关于秋天的诗"); } catch (Orchestrator.CheckpointException cp) { // 暂停在审批点;人工批复后跨进程、跨重启续跑 orch.resume(cp.state.id, "通过,发表它"); }

Router 步骤(分类器选路由)、Supervisor 步骤(监督者循环委派 worker)也都内置了。

四、模块化:要什么拿什么

核心链路(core→agent→orchestrator)零 Spring 依赖,不想挑模块就baton-all一个依赖全家桶:

引入用途
baton-agent只跑对话循环(自动带 core/tools)
baton-provider连真实 LLM(OpenAI/Anthropic/Gemini 协议)
baton-memory会话记忆(四后端可选)
baton-orchestrator多智能体
baton-ltmpgvector 长期记忆
baton-server直接起 HTTP/SSE/WS/gRPC 服务

五、质量怎么保证

  • 349 个测试用例,覆盖协议适配流式语义、Agent 并发、记忆原子组截断、编排断点续跑、SSRF/限流/重试回归
  • GitHub Actions CI 里跑真实 Redis / PostgreSQL+pgvector 服务容器,外部存储联调用例全量激活,不是摆设
  • 开发过程抓出并修复过若干有意思的 bug:JDK 线程中断污染 BlockingQueue 导致流式事件静默丢失、Lettuce 单连接上 MULTI..EXEC 被并发读穿透、pgvector 占位符风格不兼容 PgJDBC 等——每个都有对应回归用例钉死

总结

如果你在用 Java 做 LLM 应用,想要一套不绑框架、按需组合、API 朴素直白的 Agent 工具箱,可以试试 Baton:

操作上手指引:Baton 完整上手教程-CSDN博客

  • GitHub:GitHub - Lookfukc/baton: Baton is a Java library for building LLM/Tool/Memory pipelines. · GitHub (中英双语文档,点个 ⭐ 是对开源人最大的鼓励)
  • Maven Central:io.github.lookfukc:baton-all:1.0.0
  • 许可:MIT,随便用

欢迎 issue / PR 交流。

相关新闻

Claude Code接入Qwen3实战:环境变量配置与Agent联调全指南

Claude Code接入Qwen3实战:环境变量配置与Agent联调全指南

先说结论&#xff1a;把 Claude Code 的命令行 Agent 能力交给 Qwen3 的模型来跑&#xff0c;完全可行&#xff0c;而且比我预想的要稳定得多。最近我在折腾编码助手方案&#xff0c;翻遍了社区里的各种教程&#xff0c;发现大多数人都在讲怎么用 Claude Code 的默认官方模型&a…

2026/10/20 11:48:45 阅读更多 →
Python+Django+Vue服装品类趋势与消费者洞察可视化系统实战

Python+Django+Vue服装品类趋势与消费者洞察可视化系统实战

每年一到毕设季&#xff0c;就有一批人被选题折磨到失眠。选个管理系统吧&#xff0c;满屏都是“学生信息管理”“图书借阅系统”&#xff0c;答辩老师看一眼标题就失去兴趣&#xff1b;选个算法题吧&#xff0c;又怕模型调不出来&#xff0c;最后代码跑不通直接翻车。我这些年…

2026/10/20 11:48:45 阅读更多 →
RAGFlow部署实战:企业级RAG的文档解析与混合检索调优

RAGFlow部署实战:企业级RAG的文档解析与混合检索调优

1. 项目价值与选型思路1.1 为什么需要 RAGFlow 这类重载级 RAG 引擎先说说标题里这两个词&#xff1a;RAG 是检索增强生成&#xff0c;Flow 强调的是“流程”。把两者拼起来&#xff0c;RAGFlow 的核心定位就很清楚了——它不只给你一个接口调用的检索组件&#xff0c;而是把文…

2026/10/20 11:47:44 阅读更多 →

最新新闻

Spring Boot社区在线问诊系统实战:从需求到部署的完整技术拆解

Spring Boot社区在线问诊系统实战:从需求到部署的完整技术拆解

最近后台经常有人问社区家庭医生在线问诊系统怎么做&#xff0c;正好我前阵子完整跟过一个类似项目&#xff0c;从需求梳理到部署上线走了不少弯路。我干脆把这套系统的技术拆解和踩坑记录整理成一篇长文&#xff0c;一方面给自己做个复盘&#xff0c;另一方面给正在做毕业设计…

2026/10/20 13:09:01 阅读更多 →
Git克隆Demo代码仓库实战:从地址到跑通全流程

Git克隆Demo代码仓库实战:从地址到跑通全流程

1. 拿到仓库地址后&#xff0c;先别急着敲命令很多同学第一次接触代码仓库时&#xff0c;最容易犯的毛病就是&#xff1a;复制了地址&#xff0c;打开终端&#xff0c;直接输入git clone&#xff0c;回车&#xff0c;然后开始疯狂刷新浏览器看着进度条发呆。如果仓库小&#xf…

2026/10/20 13:09:01 阅读更多 →
OpenHarmony设备上Flutter淡出过渡动画移植实战与性能优化

OpenHarmony设备上Flutter淡出过渡动画移植实战与性能优化

上个月我把一个原本跑在标准Flutter环境里的页面过渡动画方案移植到OpenHarmony设备上&#xff0c;遇到的第一个问题倒不是动画本身&#xff0c;而是animations 这个官方维护的三方动画库直接编译不过。项目里本来打算用它实现页面切换时的淡出过渡效果&#xff0c;想着省一笔自…

2026/10/20 13:09:01 阅读更多 →
轻量级技能管理方案:从零搭建可量化可组合的技能表

轻量级技能管理方案:从零搭建可量化可组合的技能表

1. 从“skills”这个词说起&#xff1a;它到底指什么“skills”这个词看起来简单&#xff0c;但放在不同语境里&#xff0c;指向完全不同。做招聘的人看到它&#xff0c;想到的是岗位能力模型&#xff1b;做在线教育的人看到它&#xff0c;想到的是课程标签体系&#xff1b;做开…

2026/10/20 13:09:01 阅读更多 →
企业级RAG问答系统实战:知识库、检索链路与大模型应用的完整落地指南

企业级RAG问答系统实战:知识库、检索链路与大模型应用的完整落地指南

做了将近半年的基于大模型的智能问答系统&#xff0c;上线之后我最大的感受是&#xff1a;**决定这套系统好不好用的&#xff0c;往往不是大模型本身&#xff0c;而是知识库和检索链路。**模型答得再聪明&#xff0c;检索不到对的资料&#xff0c;它也只能一本正经地编。我们做…

2026/10/20 13:09:01 阅读更多 →
GraphRAG工程实践:知识图谱如何补足向量检索的推理短板

GraphRAG工程实践:知识图谱如何补足向量检索的推理短板

向量检索失效的那一刻&#xff0c;我才决定认真搞GraphRAG年初做过一个企业内部制度问答系统&#xff0c;刚开始用的是经典的向量库RAG方案&#xff1a;文档切块、embedding、top-k召回、拼prompt喂给大模型。原型阶段跑得很顺&#xff0c;演示的时候领导问了一个问题——"…

2026/10/20 13:08:00 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →