别再手写工具调用流程了!用 Regnexe 9 行代码构建多工具 Re-Planning Agent 📅 2026/7/1 13:08:16 「Regnexe 实战系列」第 1 篇共 10 篇对应仓库ExampleReadme01MultiToolTest。上一篇00. 系列开篇。很多人做 Java Agent第一步都是让大模型调用工具。但我要先泼一盆冷水多工具调用只是开始不代表你已经做出了 Agent。如果只是把工具塞给模型让模型连续调几次这更像 ReAct / Function Calling Loop。它很有用但它解决的是“模型能不能连续调工具”。真正进入 Agent 层面以后还要多问一句这件事真的做完了吗 如果只完成了一半能不能继续规划下一步这篇就用一个很小的例子讲清楚Regnexe 如何用 Search → Plan → Execute → Reflect把两个工具接成一个会检查目标完成度的 Re-Planning Agent。痛点多工具任务最怕“看起来完成了”用户问Check todays weather and air quality in Beijing, then tell me if its good for outdoor running.很多项目第一反应是手写流程StringweathergetWeather(Beijing);StringairgetAirQuality(Beijing);Stringanswerllm.summarize(weather,air);这段代码没错但它是 workflow。调用顺序是程序员提前写死的不是 Agent 自己规划出来的。真实用户还可能只说北京今天适不适合户外跑步这里至少隐含两个信息需求天气和空气质量。如果只查天气就回答“适合”看起来像完成了任务实际上缺了空气质量这个关键依据。所以多工具 Agent 真正难的地方不是“能不能调用两个函数”而是能不能从目标里识别出缺哪些信息能不能选择合适工具能不能检查结果是否足够不够时能不能继续规划下一轮多步 ToolCall 能跑不代表 Agent 真的会做完拿j-langchain里的McpAgentExecutor举个参照。它可以把手写 Function Calling 循环封装掉让模型用很少代码完成多步工具调用。同样是天气 空气质量这个任务可以这样定义两个工具ToolweatherToolTool.builder().name(get_weather).description(Get todays weather for a city.).params(city: String).func(args-Beijing: sunny, 22 C.).build();ToolairQualityToolTool.builder().name(get_air_quality).description(Get todays air quality index (AQI) for a city.).params(city: String).func(args-Beijing: AQI 35, excellent air quality.).build();然后通过.tools(...)接入McpAgentExecutorMcpAgentExecutoragentMcpAgentExecutor.builder(chainActor).llm(ChatAliyun.builder().model(qwen3.6-plus).temperature(0f).build()).tools(weatherTool,airQualityTool).systemPrompt(你是一个户外运动助手可以调用天气和空气质量工具后回答用户问题。).maxIterations(5).onToolCall(tc-System.out.println( ToolCall: tc)).onObservation(obs-System.out.println( Observation: obs)).build();ChatGenerationresultagent.invoke(Check todays weather and air quality in Beijing, then tell me if its good for outdoor running.);正常情况下它可能跑出这样的链路 ToolCall: get_weather {city:Beijing} Observation: Beijing: sunny, 22 C. ToolCall: get_air_quality {city:Beijing} Observation: Beijing: AQI 35, excellent air quality. 最终答案 北京今天晴22°CAQI 35空气质量很好适合户外跑步。这类封装非常有价值它解决了 Function Calling 循环里的很多样板工作工具描述注册、ToolCall 解析、工具执行、Observation 写回、多轮调用控制。但注意它主要解决的是模型能不能连续调工具而 Re-Planning Agent 要解决的是模型调完之后知不知道任务是否真的完成如果模型只查了天气 ToolCall: get_weather {city:Beijing} Observation: Beijing: sunny, 22 C. 最终答案 北京今天晴22°C适合户外跑步。在 ToolCall 层面这可能是一次正常结束但在任务目标层面它少了空气质量判断。这就是普通多步工具调用和 Re-Planning Agent 的差别。Workflow、ReAct、Re-Planning Agent 怎么区分模式核心思路优点短板适合场景Workflow程序员写死流程模型只负责局部生成稳定、可控、好测试流程变化就要改代码不会自己补缺失步骤固定业务流程、审批流、明确 SOPReAct / Function Calling Loop模型在循环里决定下一次 ToolCall灵活能完成多步工具调用计划结构和完成度检查不够显式查询助手、MCP 工具助手、轻量多步调用Re-Planning AgentSearch → Plan → Execute → Reflect没完成就重新规划能力搜索、计划、执行、反思分层清楚框架更重需要清晰定义能力边界多工具、多能力、多轮任务结果必须被检查所以这三者不是谁替代谁而是抽象层级不同。任务固定用 workflow。只想让模型连续调工具用 ReAct / Function Calling Loop。如果你关心“目标有没有真的完成”“缺的信息能不能被发现”“没做完能不能继续规划”那就是 Re-Planning Agent 的场景。Regnexe 的做法Search → Plan → Execute → ReflectRegnexe 的执行链路是四步闭环Search 找能力从工具、Skill、Sub-Agent 中找到可能有用的能力 Plan 排计划决定这一轮调用哪些能力、怎么组合 Execute 执行真正调用工具并收集结果 Reflect 反思检查目标是否完成没完成就继续下一轮Reflect 是关键。如果目标里明确要求 weather and air quality但结果只有 weatherReflect 就不应该放行而应该触发下一轮规划。实战代码两个工具交给 Agent 自己规划仓库里的ExampleReadme01MultiToolTest注册两个工具ToolweatherToolTool.builder().name(get_weather).description(Get todays weather for a city.).params(city: String -- city name).func(city-Beijing: sunny, 22 C.).build();ToolairQualityToolTool.builder().name(get_air_quality).description(Get todays air quality index (AQI) for a city.).params(city: String -- city name).func(city-Beijing: AQI 35, excellent air quality.).build();然后把两个工具交给 RegnexeAgentResultresultregnexeAgentBuilder.withDefaultModel(Vendor.ALIYUN,deepseek-v4-flash).withTool(weatherTool,airQualityTool).withEventListener(newConsoleEventListener()).build().execute(Check todays weather and air quality in Beijing, then tell me if its good for outdoor running.);System.out.println(result.getFinalText());注意这里没有手写先调get_weather再调get_air_quality少了数据再补一次最后综合两个结果你只提供目标和能力剩下的交给 Agent 的执行闭环。运行日志不是黑盒接上ConsoleEventListener后可以看到完整链路[Agent Start ] R0 Goal: Check todays weather and air quality in Beijing... | maxRounds: 3 [Search Result ] R1 Found 2 capabilities: get_weather, get_air_quality [Plan Result ] R1 Selected: [get_weather, get_air_quality] | Strategy: SYNTHESIZE | ... [TOOL Call ] R1 get_weather {city: Beijing} [TOOL Result ] R1 get_weather - Beijing: sunny, 22 C. [TOOL Call ] R1 get_air_quality {city: Beijing} [TOOL Result ] R1 get_air_quality - Beijing: AQI 35, excellent air quality. [Execute Result] R1 SUCCESS | Sunny, 22°C, AQI 35 — great conditions for a run. [Reflect Result] R1 FINISH — both readings obtained and the goal is fully answered. [Agent Done ] R1 Status: FINISHED | Rounds: 1这里最重要的不是“调用了两个工具”而是Search 找到了相关能力Plan 选择本轮要用的工具Execute 执行并收集结果Reflect 检查“天气 空气质量”都齐了才允许结束这就是 Regnexe 和普通 ToolCall 循环的差别它把“完成度检查”放进了 Agent 主循环。一个实现细节params 不是注释Tool.builder()里的params会进入工具描述影响模型构造参数.params(city: String -- city name)建议统一成参数名: 类型 -- 说明工具越多描述越重要。Planner 要从工具名、描述、参数中判断“这个工具能不能用、参数怎么填、和其他工具怎么组合”。小结多工具调用只是开始。McpAgentExecutor / ReAct Loop解决的是“模型能不能连续调工具”。Regnexe / Re-Planning Agent解决的是“模型调完以后知不知道任务是否真的完成以及不完整时能不能重新规划”。如果你的 Agent 只是调完工具就回答它还停留在工具调用器阶段。如果它会检查目标完成度并在缺信息时继续规划它才开始接近真正的 Agent。你现在做的 Agent是 ToolCall 循环还是会反思和重新规划的 Re-Planning Agent欢迎评论区聊聊。 上一篇00. 系列开篇 下一篇02. Skill为什么它只能借工具不能占 项目地址https://github.com/flower-trees/regnexe-agent 欢迎 Star