<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ReActAgent on WY 的技术博客</title><link>https://zhouwy.top/tags/reactagent/</link><description>Recent content in ReActAgent on WY 的技术博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 22 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://zhouwy.top/tags/reactagent/index.xml" rel="self" type="application/rss+xml"/><item><title>ReActAgent 源码分析</title><link>https://zhouwy.top/posts/reactagent-source/reactagent-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://zhouwy.top/posts/reactagent-source/reactagent-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;ReActAgent 是 AgentScope Java 的核心推理引擎，位于 &lt;code&gt;agentscope-core&lt;/code&gt; 模块。它实现了 &lt;strong&gt;ReAct (Reasoning and Acting)&lt;/strong&gt; 设计模式——在推理（想下一步做什么）和执行（调工具）之间交替循环。&lt;/p&gt;
&lt;p&gt;源码位置：&lt;code&gt;agentscope-core/src/main/java/io/agentscope/core/ReActAgent.java&lt;/code&gt;（1925 行）&lt;/p&gt;
&lt;h2 id="核心依赖"&gt;核心依赖&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ReActAgent&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; StructuredOutputCapableAgent {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Memory memory; &lt;span style="color:#75715e"&gt;// 对话历史（InMemoryMemory）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; String sysPrompt; &lt;span style="color:#75715e"&gt;// 系统提示词&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Model model; &lt;span style="color:#75715e"&gt;// LLM 模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; maxIters; &lt;span style="color:#75715e"&gt;// 最大迭代次数（默认 10）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; Toolkit toolkit; &lt;span style="color:#75715e"&gt;// 可用工具集&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; PlanNotebook planNotebook; &lt;span style="color:#75715e"&gt;// 计划本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; StatePersistence statePersistence; &lt;span style="color:#75715e"&gt;// 状态持久化策略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="核心循环reason--act--reason--act--"&gt;核心循环：reason → act → reason → act → &amp;hellip;&lt;/h2&gt;
&lt;p&gt;整个 ReAct 循环的入口：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; Mono&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;Msg&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;executeIteration&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; iter) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; reasoning(iter, &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 先推理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="reasoning-阶段第-560-650-行"&gt;reasoning 阶段（第 560-650 行）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;① 检查 maxIters → 超限则走 summarizing()
② notifyPreReasoningEvent() ← Hook 注入点：CompactionHook、SubagentsHook、WorkspaceContextHook
③ model.stream(messages + tool schemas) ← 调 LLM
④ 逐 chunk 处理 + notifyReasoningChunk() ← 流式输出
⑤ notifyPostReasoning() ← Hook 注入点
⑥ 判断：
- stopRequested → 返回（HITL 打断）
- gotoReasoning → 继续推理（结构化输出重试）
- isFinished(msg) → 没有 tool call → 返回结果
- 有 tool call → going to acting(iter)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;关键判断 &lt;code&gt;isFinished&lt;/code&gt;（第 969 行）：&lt;/p&gt;</description></item></channel></rss>