<?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>Java on WY 的技术博客</title><link>https://zhouwy.top/tags/java/</link><description>Recent content in Java 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/java/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><item><title>把你的Java后端经验重新编译一次：当Netty/Epoll/JVM映射到AI Infra</title><link>https://zhouwy.top/posts/java%E5%90%8E%E7%AB%AF%E5%88%B0ai-infra-hpc-%E5%AE%8C%E6%95%B4%E8%BD%AC%E5%9E%8B%E6%8C%87%E5%8D%97/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://zhouwy.top/posts/java%E5%90%8E%E7%AB%AF%E5%88%B0ai-infra-hpc-%E5%AE%8C%E6%95%B4%E8%BD%AC%E5%9E%8B%E6%8C%87%E5%8D%97/</guid><description>用10年Java后端工程师听得懂的语言，把AI Infra/HPC的底层原理讲透——这不是路线图，这是一次系统级的代码级映射。</description></item><item><title>系列01：内存管理——当你在管理 ByteBuf 时，你已经在管理 KV Cache 了</title><link>https://zhouwy.top/posts/java-to-ai-infra/01-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86-bytebuf-kvcache-%E6%98%BE%E5%AD%98%E6%B1%A0/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://zhouwy.top/posts/java-to-ai-infra/01-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86-bytebuf-kvcache-%E6%98%BE%E5%AD%98%E6%B1%A0/</guid><description>从 Netty ByteBuf 池化、JVM 堆管理到 vLLM PagedAttention 与 GPU 显存管理，同一个问题在三个世界的不同解法。附带 4 个可运行的代码实验。</description></item><item><title>AgentScope Java Harness 架构与实战指南</title><link>https://zhouwy.top/posts/agentscope-java-harness-%E6%9E%B6%E6%9E%84%E4%B8%8E%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://zhouwy.top/posts/agentscope-java-harness-%E6%9E%B6%E6%9E%84%E4%B8%8E%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;AgentScope Java 的 Harness 模块是一个面向生产环境的多智能体运行时框架。本文基于官方文档，从其设计理念到具体代码实践，完整梳理 Harness 的核心架构与使用方式。&lt;/p&gt;
&lt;h2 id="一harness-是什么"&gt;一、Harness 是什么&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;agentscope-harness&lt;/code&gt; 在 &lt;code&gt;agentscope-core&lt;/code&gt; 的 &lt;code&gt;ReActAgent&lt;/code&gt; 之上，通过 &lt;strong&gt;Hook&lt;/strong&gt; 和 &lt;strong&gt;Toolkit&lt;/strong&gt; 两个扩展点，装配出一套面向长期稳定运行的工程化基础设施。它的入口只有一个类：&lt;code&gt;HarnessAgent&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;裸的 &lt;code&gt;ReActAgent&lt;/code&gt; 只有&amp;quot;请求 — 推理 — 工具 — 回复&amp;quot;一轮循环。而 Harness 要回答的是一组更贴近生产的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下一轮怎么办？&lt;/li&gt;
&lt;li&gt;下一天怎么办？&lt;/li&gt;
&lt;li&gt;上下文爆了怎么办？&lt;/li&gt;
&lt;li&gt;状态丢了怎么办？&lt;/li&gt;
&lt;li&gt;任务太重怎么办？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它不替换推理循环，而是在循环的关键时机插入 hook、为模型补上一组基础工具，把这些问题的默认工程答案打包好。&lt;/p&gt;
&lt;h3 id="快速开始"&gt;快速开始&lt;/h3&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-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.agentscope&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;agentscope-harness&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${agentscope.version}&lt;span style="color:#f92672"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;QuickstartExample&lt;/span&gt; {
&lt;/span&gt;&lt;/span&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;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. 准备工作区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Path workspace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Paths.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;.agentscope/workspace&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initWorkspaceIfAbsent(workspace);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. 构建模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Model model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DashScopeChatModel.&lt;span style="color:#a6e22e"&gt;builder&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;apiKey&lt;/span&gt;(System.&lt;span style="color:#a6e22e"&gt;getenv&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;DASHSCOPE_API_KEY&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;modelName&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;qwen-max&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;stream&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3. 构建 HarnessAgent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HarnessAgent agent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; HarnessAgent.&lt;span style="color:#a6e22e"&gt;builder&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;quickstart-agent&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;sysPrompt&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;你是一个帮助用户做笔记的助手。&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;model&lt;/span&gt;(model)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;workspace&lt;/span&gt;(workspace)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;compaction&lt;/span&gt;(CompactionConfig.&lt;span style="color:#a6e22e"&gt;builder&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;triggerMessages&lt;/span&gt;(30)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;keepMessages&lt;/span&gt;(10)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;flushBeforeCompact&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 4. 两轮对话，同一 sessionId&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RuntimeContext ctx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; RuntimeContext.&lt;span style="color:#a6e22e"&gt;builder&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;sessionId&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;demo-session&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;userId&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;alice&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&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;span style="display:flex;"&gt;&lt;span&gt; Msg turn1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; agent.&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Msg.&lt;span style="color:#a6e22e"&gt;builder&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;role&lt;/span&gt;(MsgRole.&lt;span style="color:#a6e22e"&gt;USER&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;textContent&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;我叫天宇，今天准备做一个关于 ReAct 的技术分享。&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ctx).&lt;span style="color:#a6e22e"&gt;block&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;span style="display:flex;"&gt;&lt;span&gt; Msg turn2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; agent.&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Msg.&lt;span style="color:#a6e22e"&gt;builder&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;role&lt;/span&gt;(MsgRole.&lt;span style="color:#a6e22e"&gt;USER&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;textContent&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;我叫什么？我今天要干什么？&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ctx).&lt;span style="color:#a6e22e"&gt;block&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;span style="display:flex;"&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;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;initWorkspaceIfAbsent&lt;/span&gt;(Path workspace) &lt;span style="color:#66d9ef"&gt;throws&lt;/span&gt; Exception {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Files.&lt;span style="color:#a6e22e"&gt;createDirectories&lt;/span&gt;(workspace);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Path agentsMd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; workspace.&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;AGENTS.md&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (Files.&lt;span style="color:#a6e22e"&gt;exists&lt;/span&gt;(agentsMd)) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Files.&lt;span style="color:#a6e22e"&gt;writeString&lt;/span&gt;(agentsMd, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; # 笔记助手
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 你是一个帮助用户整理笔记和知识的助手。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ## 行为约定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; - 主动记录用户提到的关键事实（姓名、计划、偏好等）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; - 回答用简洁中文，必要时给出要点列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; - 对不确定的内容要主动说明，不要臆造
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&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;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述代码展示了 Harness 的三个核心价值：&lt;strong&gt;工作区驱动的人格&lt;/strong&gt;、&lt;strong&gt;会话持久化&lt;/strong&gt;（同一 sessionId 的第二轮对话记得第一轮的内容）、&lt;strong&gt;显式启用对话压缩&lt;/strong&gt;。&lt;/p&gt;</description></item></channel></rss>