<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.aivi.fyi//feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.aivi.fyi//" rel="alternate" type="text/html" /><updated>2026-05-24T22:37:25+08:00</updated><id>https://www.aivi.fyi//feed.xml</id><title type="html">AI超元域的博客</title><subtitle>AI超元域频道的技术博客。分享AI技术、AI项目、开源大模型、大模型微调、RAG、AIAgent、提示词工程等AI前沿内容。</subtitle><author><name>AI超元域</name></author><entry><title type="html">🚀Claude Code悄悄加入的Workflow，可能会改变我们使用多Agent的方式！隐藏的多Agent编排能力实测：JavaScript脚本化编排、Subagent并行调度、结构化输出+Schema约束，比Subagents/Agent Teams/Skills更适合沉淀复用的工程流水线</title><link href="https://www.aivi.fyi//llms/claude-code-workflow" rel="alternate" type="text/html" title="🚀Claude Code悄悄加入的Workflow，可能会改变我们使用多Agent的方式！隐藏的多Agent编排能力实测：JavaScript脚本化编排、Subagent并行调度、结构化输出+Schema约束，比Subagents/Agent Teams/Skills更适合沉淀复用的工程流水线" /><published>2026-05-24T00:00:00+08:00</published><updated>2026-05-24T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/claude-code-workflow</id><content type="html" xml:base="https://www.aivi.fyi//llms/claude-code-workflow"><![CDATA[<p>这两天我一直在测试 Claude Code 一个非常有意思的新能力：<strong>Workflow</strong>。</p>

<p>它有点特殊。</p>

<p>特殊在于，它不是 MCP，也不是 Skills，也不是普通的 Subagent，更不是 Agent Teams。</p>

<p>更特殊的是：它已经出现在 Claude Code 的二进制实现里，也可以实际运行，但官方公开文档里还没有正式说明。甚至在 Claude Code <code class="language-plaintext highlighter-rouge">2.1.147</code> 的发布信息中，Workflow 曾短暂出现过，随后又被移除。</p>

<p>所以今天这篇文章不会把它包装成”官方正式发布的新功能”。更准确地说：</p>

<p><strong>Workflow 是 Claude Code 里已经可用、但仍处于隐藏/实验状态的多 Agent 编排能力。</strong></p>

<p>如果你平时已经在用 Claude Code、Subagents、Skills 或 Agent Teams，那么 Workflow 值得重点关注。它可能是继 MCP 和 Skills 之后，Claude Code 生态里又一个非常关键的能力方向。</p>

<blockquote>
  <p>🚀 本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://www.bilibili.com/video/BV1KoGE6cE53/">👉👉👉 通过哔哩哔哩观看</a></li>
    <li><a href="https://youtu.be/ozVTJm3n2U4">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<iframe width="800" height="450" src="https://www.youtube.com/embed/ozVTJm3n2U4" title="Claude Code Workflow 实测" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<hr />

<h2 id="一workflow-到底是什么">一、Workflow 到底是什么？</h2>

<p>一句话解释：</p>

<p><strong>Workflow 是用 JavaScript 脚本来编排多个 Claude Code agent 的机制。</strong></p>

<p>以前我们让 Claude Code 做复杂任务，通常是这样说：</p>

<blockquote>
  <p>请你先分析代码，再找风险，再给出修复方案。</p>
</blockquote>

<p>这本质上还是自然语言驱动。模型会自己决定怎么拆任务、什么时候派 subagent、如何汇总结果。</p>

<p>Workflow 不一样。</p>

<p>它把这个过程写成代码：</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">phase</span><span class="p">(</span><span class="dl">"</span><span class="s2">Review</span><span class="dl">"</span><span class="p">)</span>

<span class="kd">const</span> <span class="nx">results</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span>
  <span class="nx">agent</span><span class="p">(</span><span class="dl">"</span><span class="s2">检查 correctness 风险</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">correctness-reviewer</span><span class="dl">"</span> <span class="p">}),</span>
  <span class="nx">agent</span><span class="p">(</span><span class="dl">"</span><span class="s2">检查 security 风险</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">security-reviewer</span><span class="dl">"</span> <span class="p">}),</span>
  <span class="nx">agent</span><span class="p">(</span><span class="dl">"</span><span class="s2">检查 testing 覆盖</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">test-reviewer</span><span class="dl">"</span> <span class="p">}),</span>
<span class="p">])</span>

<span class="nx">phase</span><span class="p">(</span><span class="dl">"</span><span class="s2">Aggregate</span><span class="dl">"</span><span class="p">)</span>

<span class="kd">const</span> <span class="nx">final</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">agent</span><span class="p">(</span>
  <span class="s2">`请汇总这些结果：</span><span class="p">${</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">results</span><span class="p">)}</span><span class="s2">`</span><span class="p">,</span>
  <span class="p">{</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">aggregator</span><span class="dl">"</span> <span class="p">},</span>
<span class="p">)</span>

<span class="k">return</span> <span class="nx">final</span>
</code></pre></div></div>

<p>也就是说，Workflow 做的不是”再多叫几个 agent”，而是把多 Agent 的调用顺序、并行关系、阶段划分、输出格式和最终聚合，都变成可复用的脚本。</p>

<p>这就是它真正重要的地方。</p>

<hr />

<h2 id="二它和-subagentsagent-teamsskills-有什么区别">二、它和 Subagents、Agent Teams、Skills 有什么区别？</h2>

<p>很多人第一次看到 Workflow，可能会问：Claude Code 不是已经有 Subagents 和 Agent Teams 了吗？为什么还需要 Workflow？</p>

<p>可以这样理解。</p>

<h3 id="subagents临时派人做事">Subagents：临时派人做事</h3>

<p>Subagent 很适合临时委派。</p>

<p>比如：</p>

<ul>
  <li>让一个 agent 看某个模块</li>
  <li>让一个 agent 查某段日志</li>
  <li>让一个 agent 找潜在 bug</li>
</ul>

<p>它的优点是简单、自然、启动成本低。</p>

<p>但它的问题也明显：整个流程主要还是模型临场决定。今天它这么拆，明天可能换一种拆法；这次它记得验证，下次可能跳过验证。它适合”临时任务”，不太适合沉淀成稳定流程。</p>

<h3 id="agent-teams多角色协作工作台">Agent Teams：多角色协作工作台</h3>

<p>Agent Teams 更像一个多 agent 协作界面。</p>

<p>你可以让不同角色并行工作，人类再去调度、查看、接管。它适合交互式协作，适合长期多角色任务。</p>

<p>但如果你要的是一个可以反复跑的”工程流水线”，Agent Teams 仍然偏交互，不够脚本化。</p>

<h3 id="skills把能力封装给模型">Skills：把能力封装给模型</h3>

<p>Skills 更像”能力包”。</p>

<p>它告诉模型：</p>

<ul>
  <li>什么时候该用这个技能</li>
  <li>怎么用</li>
  <li>有哪些限制</li>
  <li>可以参考哪些文件、模板、脚本</li>
</ul>

<p>Skills 的优势在于分发、说明、触发、上下文封装。</p>

<p>但 Workflow 的优势在于执行编排。</p>

<p>所以更准确的关系不是”Workflow 取代 Skills”，而是：</p>

<p><strong>Skills 负责封装和分发，Workflow script 负责执行真正的多 Agent 工作流。</strong></p>

<p>未来很可能出现这种形态：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>my-review-skill/
  SKILL.md
  workflows/
    sharded-review.workflow.mjs
    pr-review.workflow.mjs
  examples/
    report.md
</code></pre></div></div>

<p>Skill 告诉 Claude Code 什么时候用；Workflow 负责把流程跑起来。</p>

<hr />

<h2 id="三workflow-最核心的优势可复用">三、Workflow 最核心的优势：可复用</h2>

<p>这是我测试之后最深的感受。</p>

<p>普通 prompt 是一次性的。</p>

<p>Subagent 是临时派生的。</p>

<p>Agent Teams 更偏人工调度。</p>

<p>但 Workflow script 可以沉淀下来。</p>

<p>一旦某个脚本在某类任务上跑得不错，后续你就可以复用它完成类似任务。</p>

<p>比如：</p>

<ul>
  <li>大代码库分片审查</li>
  <li>PR 多角色 Review</li>
  <li>深度研究</li>
  <li>文档生成</li>
  <li>Prompt Eval</li>
  <li>Bug 定位</li>
  <li>Release 前质量门禁</li>
  <li>安全 Threat Modeling</li>
</ul>

<p>你不需要每次重新描述完整流程。你只需要保存脚本，下次换一个仓库、换一个主题、换一个 PR，再把参数改掉即可。</p>

<p>这就让”工作流”从一种 prompt 写法，变成了可以共享、可以修改、可以迭代的资产。</p>

<hr />

<h2 id="四如何启用-workflow">四、如何启用 Workflow？</h2>

<p>当前 Workflow 仍然是隐藏/实验能力，所以需要显式开启。</p>

<p>启动 Claude Code 前，可以这样设置：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">CLAUDE_CODE_WORKFLOWS</span><span class="o">=</span>1
claude
</code></pre></div></div>

<p>或者直接：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CLAUDE_CODE_WORKFLOWS</span><span class="o">=</span>1 claude
</code></pre></div></div>

<p>进入 Claude Code 后，如果你希望它使用 Workflow，可以明确写：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ultrawork

请生成一个只读的大代码库分片审查 workflow script。
不要执行，先让我确认。
</code></pre></div></div>

<p>这里要注意：<code class="language-plaintext highlighter-rouge">ultrawork</code> 更像一个经验性触发词，不是官方公开文档里的正式命令。它在测试中能有效提示 Claude Code 使用 Workflow，但不能把它当成稳定 API。</p>

<p>最稳妥的方式是两步走：</p>

<p>第一步，让 Claude Code 生成脚本，但不要执行。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ultrawork

请为当前仓库生成一个 workflow script，但不要执行。

要求：
1. 识别 4-8 个 review shard
2. 每个 shard 用 agent()
3. 每个 agent 必须带 JSON schema
4. 最后 aggregator 合并 findings
5. 写到 /tmp/sharded-review.workflow.mjs
6. 输出 scriptPath，等待我确认
</code></pre></div></div>

<p>第二步，确认脚本后再运行：</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">Workflow</span><span class="p">({</span>
  <span class="na">scriptPath</span><span class="p">:</span> <span class="dl">"</span><span class="s2">/tmp/sharded-review.workflow.mjs</span><span class="dl">"</span>
<span class="p">})</span>
</code></pre></div></div>

<p>目前我最推荐 <code class="language-plaintext highlighter-rouge">scriptPath</code> 方式，因为这是反复 E2E 验证过的路径。</p>

<hr />

<h2 id="五一个最小-workflow-长什么样">五、一个最小 Workflow 长什么样？</h2>

<p>下面是一个最小可运行的例子：</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">meta</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">workflow-smoke-test</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">description</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Minimal one-agent workflow script smoke test</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">phases</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span> <span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Run</span><span class="dl">"</span><span class="p">,</span> <span class="na">detail</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Spawn one subagent and validate structured output</span><span class="dl">"</span> <span class="p">},</span>
  <span class="p">],</span>
<span class="p">}</span>

<span class="nx">phase</span><span class="p">(</span><span class="dl">"</span><span class="s2">Run</span><span class="dl">"</span><span class="p">)</span>

<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">agent</span><span class="p">(</span>
  <span class="dl">"</span><span class="s2">Return ok=true and message exactly WORKFLOW_SCRIPT_SMOKE_OK. Do not use tools.</span><span class="dl">"</span><span class="p">,</span>
  <span class="p">{</span>
    <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">smoke-agent</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">phase</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Run</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">model</span><span class="p">:</span> <span class="dl">"</span><span class="s2">haiku</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">schema</span><span class="p">:</span> <span class="p">{</span>
      <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">object</span><span class="dl">"</span><span class="p">,</span>
      <span class="na">properties</span><span class="p">:</span> <span class="p">{</span>
        <span class="na">ok</span><span class="p">:</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">boolean</span><span class="dl">"</span> <span class="p">},</span>
        <span class="na">message</span><span class="p">:</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">string</span><span class="dl">"</span> <span class="p">},</span>
      <span class="p">},</span>
      <span class="na">required</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">ok</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">message</span><span class="dl">"</span><span class="p">],</span>
      <span class="na">additionalProperties</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
    <span class="p">},</span>
  <span class="p">},</span>
<span class="p">)</span>

<span class="k">return</span> <span class="p">{</span>
  <span class="na">ok</span><span class="p">:</span> <span class="nx">result</span><span class="p">.</span><span class="nx">ok</span> <span class="o">===</span> <span class="kc">true</span> <span class="o">&amp;&amp;</span> <span class="nx">result</span><span class="p">.</span><span class="nx">message</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">WORKFLOW_SCRIPT_SMOKE_OK</span><span class="dl">"</span><span class="p">,</span>
  <span class="nx">result</span><span class="p">,</span>
<span class="p">}</span>
</code></pre></div></div>

<p>这里有几个关键点：</p>

<p>第一，<code class="language-plaintext highlighter-rouge">meta</code> 定义这个 workflow 的名称、描述和阶段。</p>

<p>第二，<code class="language-plaintext highlighter-rouge">phase()</code> 用来声明当前执行阶段。</p>

<p>第三，<code class="language-plaintext highlighter-rouge">agent()</code> 用来启动 subagent。</p>

<p>第四，<code class="language-plaintext highlighter-rouge">schema</code> 用来约束 subagent 的结构化输出。</p>

<p>第五，最后用 <code class="language-plaintext highlighter-rouge">return</code> 返回 workflow 的最终结果。</p>

<p>这已经不是普通 prompt，而是一个可以复跑、可以检查 artifact、可以被别人复用的工作流。</p>

<hr />

<h2 id="六它能跑哪些场景">六、它能跑哪些场景？</h2>

<p>下面是几类我认为最值得做成 Workflow script 的场景。</p>

<h3 id="1-大代码库分片审查">1. 大代码库分片审查</h3>

<p>这是 Workflow 最典型的场景。</p>

<p>比如一个仓库可以拆成：</p>

<ul>
  <li>correctness reviewer</li>
  <li>security reviewer</li>
  <li>performance reviewer</li>
  <li>data integrity reviewer</li>
  <li>testing reviewer</li>
  <li>packaging reviewer</li>
</ul>

<p>每个 reviewer 只看自己的分片，最后 aggregator 汇总结果、去重、排序。</p>

<p>这种模式比”请审查整个仓库”稳定得多。</p>

<h3 id="2-pr-多角色-review">2. PR 多角色 Review</h3>

<p>一个 PR 可以让多个 agent 同时检查：</p>

<ul>
  <li>行为是否正确</li>
  <li>是否有安全风险</li>
  <li>是否缺测试</li>
  <li>是否破坏 API 兼容性</li>
  <li>是否影响性能</li>
</ul>

<p>最后给出：</p>

<ul>
  <li>blocking findings</li>
  <li>non-blocking findings</li>
  <li>merge recommendation</li>
</ul>

<p>这比单 agent review 更有覆盖面。</p>

<h3 id="3-生成批评修复">3. 生成、批评、修复</h3>

<p>适合文档、方案、Prompt、Release Note。</p>

<p>流程可以是：</p>

<ol>
  <li>generator 生成初稿</li>
  <li>critic 找问题</li>
  <li>repairer 根据问题修复</li>
  <li>final judge 判断是否通过</li>
</ol>

<p>这个模式很适合需要质量闭环的内容生产。</p>

<h3 id="4-深度研究">4. 深度研究</h3>

<p>可以让不同 agent 分别研究：</p>

<ul>
  <li>官方文档</li>
  <li>论文</li>
  <li>社区讨论</li>
  <li>GitHub 项目</li>
  <li>实测结果</li>
</ul>

<p>然后由 synthesizer 生成最终报告。</p>

<p>这种 workflow 一旦跑通，就可以反复用于不同技术主题。</p>

<h3 id="5-prompt--agent-eval">5. Prompt / Agent Eval</h3>

<p>比如你有 4 个 prompt 版本，不知道哪个更好。</p>

<p>Workflow 可以并行测试多个版本，然后由 judge agent 评分和排序。</p>

<p>这比人工复制粘贴 prompt 做对比高效很多。</p>

<hr />

<h2 id="七workflow-script-可以共享吗">七、Workflow script 可以共享吗？</h2>

<p>可以，而且这可能是 Workflow 最有想象力的地方。</p>

<p>以前大家共享的是 prompt、skill、MCP server。</p>

<p>现在，至少在工作流编排这个层面，大家可以共享：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>deep-research.workflow.mjs
pr-review.workflow.mjs
large-codebase-review.workflow.mjs
prompt-eval.workflow.mjs
release-gate.workflow.mjs
</code></pre></div></div>

<p>别人拿到脚本后，只要环境支持 Workflow，就可以复用这套工作流。</p>

<p>这意味着什么？</p>

<p>意味着”如何组织多个 agent 做事”本身，也可以变成开源资产。</p>

<p>以前我们共享的是能力。</p>

<p>现在我们可以共享流程。</p>

<hr />

<h2 id="八但它还不能盲用">八、但它还不能盲用</h2>

<p>Workflow 很强，但不代表它可以无监督使用。</p>

<p>我在实际测试中也看到过边界。</p>

<p>比如用 Workflow 做代码审查时，它能快速发现很多高价值问题，但也可能把某些问题严重级别判断过高。一个看似 SQL 注入的 finding，人工复核后发现上游已经有 UUID/prefix 正则约束，所以不能直接定性为 critical。</p>

<p>还有一次生成-批评-修复 workflow 中，因为 schema 字段叫 <code class="language-plaintext highlighter-rouge">ok</code>，critic 把它理解成”草稿是否合格”，返回了 <code class="language-plaintext highlighter-rouge">ok=false</code>，导致脚本最终断言失败。后来把字段改成 <code class="language-plaintext highlighter-rouge">reviewed</code>，结果就稳定了。</p>

<p>这说明两点：</p>

<p>第一，Workflow 能提升覆盖面，但不能替代工程判断。</p>

<p>第二，Workflow 的 schema 设计非常关键。</p>

<p>所以我建议：</p>

<ul>
  <li>高风险任务先让 Claude Code 只生成脚本，不执行</li>
  <li>人工审查后再用 <code class="language-plaintext highlighter-rouge">Workflow({ scriptPath })</code> 执行</li>
  <li>每个 agent 都要求结构化输出</li>
  <li>最终 artifact 必须复核</li>
  <li>不要把隐藏实验能力直接接入生产 CI</li>
</ul>

<hr />

<h2 id="九我的判断">九、我的判断</h2>

<p>Workflow 的价值，不是让 Claude Code 多叫几个 agent。</p>

<p>它真正的价值是：</p>

<p><strong>把 Agent 编排变成代码。</strong></p>

<p>这件事会带来三个变化。</p>

<p>第一，复杂任务可以复跑。</p>

<p>第二，优秀工作流可以共享。</p>

<p>第三，多 Agent 协作可以从”模型临场发挥”，变成”脚本化、结构化、可观察的工程流程”。</p>

<p>这也是为什么我认为 Workflow 值得重点关注。</p>

<p>它现在还不是正式公开能力，也不适合被包装成稳定平台 API。</p>

<p>但如果你已经在深度使用 Claude Code，尤其是已经在使用 Subagents、Agent Teams、Skills，那么 Workflow 很可能会成为你下一阶段最重要的效率杠杆。</p>

<p>未来如果官方正式公开这个能力，我们大概率会看到大量 workflow script 项目出现：</p>

<ul>
  <li>代码审查 workflow</li>
  <li>安全审计 workflow</li>
  <li>深度研究 workflow</li>
  <li>文档生成 workflow</li>
  <li>Prompt eval workflow</li>
  <li>Release gate workflow</li>
</ul>

<p>那时，大家共享的就不只是 prompt，而是完整的多 Agent 工作流。</p>

<p>这可能才是 Claude Code Workflow 最值得期待的地方。</p>

<hr />

<p>本期内容到这里，欢迎大家点赞、关注和转发，谢谢大家观看。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Claude" /><category term="Claude Code" /><category term="Workflow" /><category term="Subagents" /><category term="Agent Teams" /><category term="Skills" /><category term="MCP" /><category term="多Agent" /><category term="AI编程" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[这两天我一直在测试 Claude Code 一个非常有意思的新能力：Workflow。]]></summary></entry><entry><title type="html">🚀开发者必看！Codex /goal命令你真用对了吗？goal命令高级技巧保姆级教程，Plan模式+Spec-Driven+自研Skill，三大高级技巧组合让开发效率倍增！真正内置Ralph Loop</title><link href="https://www.aivi.fyi//llms/codex-goal" rel="alternate" type="text/html" title="🚀开发者必看！Codex /goal命令你真用对了吗？goal命令高级技巧保姆级教程，Plan模式+Spec-Driven+自研Skill，三大高级技巧组合让开发效率倍增！真正内置Ralph Loop" /><published>2026-05-05T00:00:00+08:00</published><updated>2026-05-05T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/codex-goal</id><content type="html" xml:base="https://www.aivi.fyi//llms/codex-goal"><![CDATA[<p><code class="language-plaintext highlighter-rouge">/goal</code> 是 OpenAI 在 <strong>Codex CLI 0.128.0</strong>（2026 年 4 月 30 日发布）中新增的一条命令。它不是又一个普通的提示词模板，而是 Codex 内部新增了一整套<strong>目标生命周期管理</strong>机制——给一个目标，Codex 会自己一轮接一轮往下推进，真正实现无人值守。社区里已经出现连续运行 21 小时、烧掉 9 亿 token 的案例。这篇笔记把我自己踩过的坑、固定下来的工作流、配套的 Skill 全都整理成保姆级教程。</p>

<blockquote>
  <p>🚀 本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://www.bilibili.com/video/BV13KR1BEEBm/">👉👉👉 通过哔哩哔哩观看</a></li>
    <li><a href="https://youtu.be/sAYM1xvDXw4">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<iframe width="800" height="450" src="https://www.youtube.com/embed/sAYM1xvDXw4" title="Codex /goal 保姆级教程" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<hr />

<h2 id="一goal-是什么以及它为什么重要">一、<code class="language-plaintext highlighter-rouge">/goal</code> 是什么，以及它为什么重要</h2>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 是 OpenAI 在 <strong>Codex CLI 0.128.0</strong>（2026 年 4 月 30 日发布）中新增的一条命令。官方更新日志的原话是：</p>

<blockquote>
  <p><em>Added persisted /goal workflows with app-server APIs, model tools, runtime continuation, and TUI controls for create, pause, resume, and clear.</em></p>
</blockquote>

<p>翻译成大白话就是：<code class="language-plaintext highlighter-rouge">/goal</code> 不是又一个普通的提示词模板，而是 Codex 内部新增了一整套<strong>目标生命周期管理</strong>机制。它由四个层面共同构成：</p>

<ol>
  <li><strong>持久化层</strong> — 把目标作为一个独立于对话历史的状态存起来，带状态机（<code class="language-plaintext highlighter-rouge">active</code> / <code class="language-plaintext highlighter-rouge">paused</code> / <code class="language-plaintext highlighter-rouge">achieved</code> / <code class="language-plaintext highlighter-rouge">unmet</code> / <code class="language-plaintext highlighter-rouge">budget_limited</code>）</li>
  <li><strong>App-server RPC</strong> — <code class="language-plaintext highlighter-rouge">thread/goal/{get, set, clear}</code> 三个接口，让客户端可以读写目标状态</li>
  <li><strong>模型工具</strong> — <code class="language-plaintext highlighter-rouge">get_goal</code>、<code class="language-plaintext highlighter-rouge">create_goal</code>、<code class="language-plaintext highlighter-rouge">update_goal</code> 三个工具，让模型可以查询和声明完成，但<strong>不能</strong>自己暂停/清空/篡改</li>
  <li><strong>运行时延续（continuation）+ TUI</strong> — 每一轮空闲时，Codex 会自动注入一段”延续提示词”让模型决定下一步，直到目标达成、被暂停、被清空或者烧到 token 上限才停</li>
</ol>

<p>这套机制最直观的效果就是：<strong>给一个目标，Codex 会自己一轮接一轮往下推进，真正实现无人值守</strong>。社区里已经出现连续运行 21 小时、烧掉 9 亿 token 的案例；我自己测试中也跑过几个小时不间断的批量重构任务。</p>

<p>如果你之前听说过 <strong>Ralph Loop</strong>（用脚本反复让 agent 跑同一个目标的工作流），<code class="language-plaintext highlighter-rouge">/goal</code> 就是 OpenAI 把它做进了 Codex 内核里。OpenAI 总裁 Greg Brockman 在 X 上的原话是：<em>“codex now has a built in Ralph loop++”</em>。比起外部脚本驱动的 Ralph Loop，内置版本的优势在于：目标可以跨会话恢复、token 预算是一等公民、暂停/恢复是原生命令，而且不需要每轮重建上下文，产出质量明显更稳。</p>

<hr />

<h2 id="二goal-解决了哪些以前解决不了的问题">二、<code class="language-plaintext highlighter-rouge">/goal</code> 解决了哪些以前解决不了的问题</h2>

<p>理解 <code class="language-plaintext highlighter-rouge">/goal</code> 价值的关键，是它<strong>到底解决了什么以前没办法解决的问题</strong>。我归纳为四点：</p>

<h3 id="1-目标本身的持久化">1. 目标本身的持久化</h3>

<p>普通 prompt 是写在 Codex 的对话流里的。一旦上下文超过阈值触发 <code class="language-plaintext highlighter-rouge">/compact</code>，或者你切换会话，prompt 就可能被压缩、被覆盖、被丢失。<code class="language-plaintext highlighter-rouge">/goal</code> 不一样，它把”目标”作为独立的 thread 状态存起来，跟对话历史是两回事。所以：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">/compact</code> 压缩对话历史，<strong>不会</strong>破坏 goal 状态</li>
  <li>关掉终端，下次 <code class="language-plaintext highlighter-rouge">codex resume &lt;id&gt;</code> 还能续上之前的 goal</li>
  <li>多天跨度的长任务也能撑住</li>
</ul>

<blockquote>
  <p>注意一个已知问题：Issue #19910 报告，如果 <code class="language-plaintext highlighter-rouge">/compact</code> 发生在<strong>一轮模型调用执行的中间</strong>，延续提示词不会被重新注入，下一个 agent 可能丢掉目标和审计要求。如果你计划做超长任务，尽量让自动 compaction 落在轮次边界而不是手动压缩。</p>
</blockquote>

<h3 id="2-内置的完成审计">2. 内置的”完成审计”</h3>

<p>这是 <code class="language-plaintext highlighter-rouge">/goal</code> 最低估的部分，但也是最关键的部分。</p>

<p>每一轮空闲后，Codex 会自动向模型注入一段叫 <code class="language-plaintext highlighter-rouge">continuation.md</code> 的提示词（源码在 <code class="language-plaintext highlighter-rouge">codex-rs/core/templates/goals/continuation.md</code>）。这段提示词的核心要求是这样的（直译关键段落）：</p>

<blockquote>
  <p>在判定目标已达成之前，执行一次”完成审计”：</p>
  <ul>
    <li>把目标重述为具体的交付物或成功标准</li>
    <li>构建一份<strong>提示词到产物</strong>的清单，把每一条显式要求、每一个编号项、每一个具名文件、命令、测试、门禁、交付物映射到具体证据</li>
    <li>检查相关文件、命令输出、测试结果、PR 状态等真实证据</li>
    <li><strong>不要把代理信号当成完成证据</strong>：测试通过、清单填满、verifier 跑成功、写了大量代码 —— 这些只是辅助信号，不能单独作为完成依据</li>
    <li><strong>把不确定视作未达成</strong>；继续验证或继续工作</li>
  </ul>
</blockquote>

<p>以及一段非常关键的反偷懒规则：</p>

<blockquote>
  <p>不要依赖你的意图、阶段性进度、已耗费精力、对早前工作的记忆、或一个看上去合理的最终答案，作为完成的证明。只有审计显示目标确实已达成、且没有遗留必需工作时，才能调用 <code class="language-plaintext highlighter-rouge">update_goal</code> 标记完成。</p>
</blockquote>

<p>这套机制是在解决一个具体的痛点：<strong>模型在长任务中习惯”sandbag”</strong>（早早声称做完然后偷懒）。<code class="language-plaintext highlighter-rouge">/goal</code> 把这种倾向用机制压住了 —— 但前提是你给的目标必须能被映射成一份清单。</p>

<h3 id="3-token-预算的软停止">3. Token 预算的软停止</h3>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 支持设置 token 预算上限。一旦烧到上限，Codex 不会粗暴中断当前轮次，而是注入另一段提示词 <code class="language-plaintext highlighter-rouge">budget_limit.md</code>，让模型把当前任务<strong>收尾</strong>：总结已完成的进度、列出剩余工作、给出下一步建议，然后停下。</p>

<p>对于无人值守场景，这意味着即使你设错了预期或者目标比想象中复杂，你也能在第二天打开终端时拿到一份能看懂的进度报告，而不是一堆半成品和没了的 token。</p>

<h3 id="4-完整的生命周期控制">4. 完整的生命周期控制</h3>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 提供四条 TUI 命令：</p>

<table>
  <thead>
    <tr>
      <th>命令</th>
      <th>作用</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/goal &lt;objective&gt;</code></td>
      <td>创建或替换当前目标</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/goal</code></td>
      <td>显示当前目标摘要（状态、目标内容、耗时、token 用量）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/goal pause</code></td>
      <td>暂停延续</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/goal resume</code></td>
      <td>恢复暂停的目标（早期叫 <code class="language-plaintext highlighter-rouge">/goal unpause</code>，后来 PR #20082 改名了）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/goal clear</code></td>
      <td>清空当前目标</td>
    </tr>
  </tbody>
</table>

<p>注意：暂停/恢复/清空/预算限制状态的转换，<strong>模型自己改不了</strong>，只能由用户或运行时触发。这是设计上的安全边界 —— 模型唯一能自己做的状态变更是”标记完成”，而且这个动作还得通过完成审计。</p>

<hr />

<h2 id="三什么场景适合用-goal什么场景不要用">三、什么场景适合用 <code class="language-plaintext highlighter-rouge">/goal</code>，什么场景不要用</h2>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 很强，但不是所有任务都该用它。盲目用反而费 token、跑偏、卡死。我的判断标准是这样的：</p>

<h3 id="-适合用-goal">✅ 适合用 <code class="language-plaintext highlighter-rouge">/goal</code></h3>

<ul>
  <li><strong>重复性 + 持续性的批量任务</strong>：批量修 bug、批量重命名、批量生成测试用例、批量补文档</li>
  <li><strong>覆盖式任务</strong>：QA 一个完整流程、把整个 repo 的某个表面摸完（类型严格化、文档同步、安全扫描）</li>
  <li><strong>明确的工程任务</strong>：迁移一个模块、把一个 feature 从老仓库移植到新仓库、按规格文档实现一个完整功能</li>
  <li><strong>长程探索</strong>：代码考古、架构梳理（只生成报告，不动代码）</li>
  <li><strong>基于规格文档的实现</strong>：配合 OpenSpec 这类工具，把 spec 直接交给 <code class="language-plaintext highlighter-rouge">/goal</code> 跑</li>
</ul>

<h3 id="-不要用-goal">❌ 不要用 <code class="language-plaintext highlighter-rouge">/goal</code></h3>

<ul>
  <li><strong>单轮就能完成的小任务</strong> —— 比如让 Codex 写个冒泡排序。直接用普通 prompt，杀鸡用牛刀只会更慢更费 token。</li>
  <li><strong>说不清”完成长什么样”的探索性任务</strong> —— 比如 <code class="language-plaintext highlighter-rouge">/goal 给我开发一个背单词 APP</code>。没有验收标准，Codex 会幻想出一个目标然后认真去实现，但实现出来的不是你要的。</li>
  <li><strong>需要用户不断决策的任务</strong> —— 比如产品决策、商业取舍、UX 偏好。这些必须人来拍板，Agent 替不了。</li>
  <li><strong>破坏性、不可回滚的操作</strong> —— 删数据库、删大量文件、做不可逆的迁移。<code class="language-plaintext highlighter-rouge">/goal</code> 的特点是会自己往下推进，这种场景下风险会被放大。</li>
  <li><strong>需要快速迭代的原型阶段</strong> —— 几分钟就能跑出来的原型，直接做就行，套上 <code class="language-plaintext highlighter-rouge">/goal</code> 反而徒增开销。</li>
  <li><strong>Plan 模式下</strong> —— ⚠️ 这是个<strong>最容易踩的坑</strong>。Issue #20656 已经报告：在 <code class="language-plaintext highlighter-rouge">/plan</code> 模式下，即使你看到 UI 上显示 “Goal active”，Codex 实际上<strong>不会自动延续</strong>。源码里 <code class="language-plaintext highlighter-rouge">should_ignore_goal_for_mode</code> 函数在 <code class="language-plaintext highlighter-rouge">Plan</code> 模式下直接跳过 goal 延续。所以如果你要用 <code class="language-plaintext highlighter-rouge">/plan</code> 做规划，<strong>先退出 Plan 模式再启动或恢复 <code class="language-plaintext highlighter-rouge">/goal</code></strong>。</li>
</ul>

<hr />

<h2 id="四启用-goal">四、启用 <code class="language-plaintext highlighter-rouge">/goal</code></h2>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 目前是实验性功能，默认关闭，需要手动开启。</p>

<h3 id="方法-1改配置文件">方法 1：改配置文件</h3>

<p>打开 <code class="language-plaintext highlighter-rouge">~/.codex/config.toml</code>，加上下面这段：</p>

<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[features]</span>
<span class="py">goals</span> <span class="p">=</span> <span class="kc">true</span>
</code></pre></div></div>

<p>如果你想完整体验所有相关功能（尤其是 <code class="language-plaintext highlighter-rouge">/plan</code> 配合 <code class="language-plaintext highlighter-rouge">/goal</code>），可以把协作模式也打开：</p>

<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[features]</span>
<span class="py">goals</span> <span class="p">=</span> <span class="kc">true</span>
<span class="py">collaboration_modes</span> <span class="p">=</span> <span class="kc">true</span>
</code></pre></div></div>

<p>保存，然后<strong>重启 Codex</strong>，<code class="language-plaintext highlighter-rouge">/goal</code> 就可用了。</p>

<h3 id="方法-2让-codex-自己改">方法 2：让 Codex 自己改</h3>

<p>如果你不熟悉配置文件的位置和写法，可以直接在 Codex 里用自然语言描述，比如：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>请帮我开启 Codex 0.128 新增的 /goal 命令。
配置文件位置：~/.codex/config.toml
需要在 [features] 段下加上 goals = true。
如果文件不存在请创建，如果 [features] 段不存在请新增。
</code></pre></div></div>

<p>Codex 会自动帮你完成。改完别忘了重启。</p>

<h3 id="验证">验证</h3>

<p>启动后输入 <code class="language-plaintext highlighter-rouge">/</code>，如果在斜杠命令补全列表里能看到 <code class="language-plaintext highlighter-rouge">/goal</code>，说明已经启用。也可以直接输入 <code class="language-plaintext highlighter-rouge">/goal</code> 回车，如果显示”暂无目标”或者类似的状态摘要，就是好了。</p>

<hr />

<h2 id="五goal-提示词的核心心法">五、<code class="language-plaintext highlighter-rouge">/goal</code> 提示词的核心心法</h2>

<p>我在最初使用 <code class="language-plaintext highlighter-rouge">/goal</code> 的时候，踩过一个最典型的坑：<strong>直接 <code class="language-plaintext highlighter-rouge">/goal</code> 加一句简短描述就回车走人</strong>。结果几个小时回来一看，Codex 跑了一堆事情，但跑的根本不是我要的；甚至有时候会陷入静默卡死状态。</p>

<p>后来我把这个事情想清楚了：<strong><code class="language-plaintext highlighter-rouge">/goal</code> 对提示词的要求，比普通对话高一个数量级</strong>。原因是它的内置审计机制 —— <code class="language-plaintext highlighter-rouge">continuation.md</code> 要把你的目标映射成一份”提示词到产物”的清单，如果你用的是模糊词（”全部”、”所有”、”彻底”、”清理一下”、”提升一下”），清单根本建不起来，审计就会退化成”测试跑过了就算完成”这种代理信号 —— 然后你就得到一个声称完成、实际跑偏的结果。</p>

<p>所以 <code class="language-plaintext highlighter-rouge">/goal</code> 真正发挥威力的前提，是你要能写出<strong>可被映射成清单</strong>的目标。</p>

<h3 id="五段式黄金模板">五段式黄金模板</h3>

<p>经过这段时间的实践，我固定下来一套五段式模板，几乎所有 <code class="language-plaintext highlighter-rouge">/goal</code> 我都按这个写：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/goal &lt;一句话描述目标&gt;

Scope: &lt;作用范围 — 改哪些文件/子系统/feature 区域，其他不要碰&gt;

Constraints:
- &lt;硬性约束 1 — 比如"不要修改数据库 schema"&gt;
- &lt;硬性约束 2 — 比如"保持现有公开 API 不变"&gt;
- &lt;硬性约束 3 — 项目类型相关的默认规则&gt;

Done when:
1. &lt;可验证的产物 1 — 引用具体文件名或命令&gt;
2. &lt;可验证的产物 2&gt;
3. &lt;可验证的产物 3&gt;
...

Stop if:
- &lt;机械可识别的停止条件 1 — 比如"需要新依赖"&gt;
- &lt;机械可识别的停止条件 2 — 比如"需要修改 MUST NOT 列表中的文件"&gt;

Use a token budget of &lt;N&gt; tokens for this goal.
</code></pre></div></div>

<p>每一段的要点：</p>

<ul>
  <li><strong>Objective</strong>：一句话说清要做什么。<strong>避开虚词</strong>：全部、所有、彻底、improve、optimize、clean up —— 这些词无法映射成清单，会让审计失效。</li>
  <li><strong>Scope</strong>：画一条边界。Codex 是会扩散的，你不画它就乱跑。</li>
  <li><strong>Constraints</strong>：硬性规则，违反就停。约束一定要”可机械识别”，比如”不动 <code class="language-plaintext highlighter-rouge">project.pbxproj</code>“就比”不要破坏现有结构”好。</li>
  <li><strong>Done when</strong>：验收清单。每一条最好引用一个具体文件路径或者一个具体命令（<code class="language-plaintext highlighter-rouge">npm test</code>、<code class="language-plaintext highlighter-rouge">pytest -q</code>、<code class="language-plaintext highlighter-rouge">tsc --noEmit</code> 都比”测试通过”明确）。</li>
  <li><strong>Stop if</strong>：停止条件。这个比 Done when 更重要，它防止 Codex 钻牛角尖或越界。</li>
  <li><strong>Token budget</strong>：必给。这是 Codex 唯一一个一等公民的成本治理机制 —— 没设预算 = 没有软停止 = 万一跑飞就只能眼睁睁看着烧 token。</li>
</ul>

<h3 id="一个具体例子">一个具体例子</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/goal 把 src/data/words.json 里的词库扩展到 1000 个唯一词条。

Scope: 只改 src/data/words.json，其他文件不要动。

Constraints:
- 词条 schema 保持不变（id / word / phonetic / meaning / example）
- 不允许重复词条（以 word 字段为准去重）
- 只能用真实的、常见的英语单词，不要生造

Done when:
1. words.json 包含恰好 1000 个唯一词条
2. 所有词条 schema 校验通过（用 tools/validate.js 跑一遍）
3. 在终端输出最终词条数和文件大小

Stop if:
- 需要修改 words.json 以外的任何文件
- 需要新增 npm 依赖
- 出现 schema 校验失败超过 3 次

Use a token budget of 80000 tokens.
</code></pre></div></div>

<p>这个目标可以被审计 —— 每一条 Done when 都对应一个能跑的检查；每一条 Stop if 都是机械可识别的；Scope 把作用面锁死了。这种 goal Codex 跑起来准确率明显不一样。</p>

<hr />

<h2 id="六三种典型工作流">六、三种典型工作流</h2>

<p>下面是我目前固定下来的三种 <code class="language-plaintext highlighter-rouge">/goal</code> 用法。从简单到复杂，按任务规模选用。</p>

<h3 id="工作流-agoal-直接用--适合中等任务">工作流 A：<code class="language-plaintext highlighter-rouge">/goal</code> 直接用 — 适合中等任务</h3>

<p>适合任务边界清楚、自己能写出五段式模板的场景。直接在 Codex 里输入完整的 <code class="language-plaintext highlighter-rouge">/goal &lt;五段式提示词&gt;</code>，回车，然后该干嘛干嘛去。</p>

<p>跑起来后，你随时可以：</p>

<ul>
  <li>用 <code class="language-plaintext highlighter-rouge">/goal</code>（不带参数）查看当前进度：状态、耗时、token 用量</li>
  <li>用 <code class="language-plaintext highlighter-rouge">/goal pause</code> 暂停</li>
  <li>用 <code class="language-plaintext highlighter-rouge">/goal resume</code> 恢复</li>
  <li>用 <code class="language-plaintext highlighter-rouge">/goal clear</code> 中止</li>
</ul>

<p>这是最常用的形态。70% 的任务我都是这样跑的。</p>

<h3 id="工作流-bplan--goal--适合复杂任务">工作流 B：<code class="language-plaintext highlighter-rouge">/plan</code> + <code class="language-plaintext highlighter-rouge">/goal</code> — 适合复杂任务</h3>

<p>如果任务复杂、需求还比较模糊、自己也没想清楚验收标准，直接 <code class="language-plaintext highlighter-rouge">/goal</code> 是不行的，要先用 <code class="language-plaintext highlighter-rouge">/plan</code> 把方案讨论清楚。</p>

<p>完整流程：</p>

<ol>
  <li>进入 Plan 模式（<code class="language-plaintext highlighter-rouge">/plan</code> 或者 <code class="language-plaintext highlighter-rouge">Shift+Tab</code> 切换）</li>
  <li>输入相对模糊的需求，比如”把这个 APP 做成可商业化的水平”</li>
  <li>Codex 会和你互动，问关键决策（变现方式、差异化主线、目标用户等），它会基于你的回答生成完整计划</li>
  <li>计划生成后，Codex 会给你三个选项：立即执行 / 清空上下文再执行 / 保持在 Plan 模式</li>
  <li><strong>选第三项</strong>，然后用 <code class="language-plaintext highlighter-rouge">Shift+Tab</code> 退出 Plan 模式</li>
  <li>这时再输入 <code class="language-plaintext highlighter-rouge">/goal 执行上面的开发计划</code>，加上 Done when / Stop if / token budget</li>
</ol>

<p>为什么要先选”保持 Plan 模式”再手动退出？因为前两个选项会立刻执行，但执行的不是 <code class="language-plaintext highlighter-rouge">/goal</code> 模式，享受不到延续和审计；而你直接在 Plan 模式里输入 <code class="language-plaintext highlighter-rouge">/goal</code>，会落入 Issue #20656 的坑（看上去激活了但其实不延续）。所以<strong>必须先退出 Plan 模式，再下 <code class="language-plaintext highlighter-rouge">/goal</code></strong>。</p>

<h3 id="工作流-copenspec--goal--适合规格驱动开发">工作流 C：OpenSpec + <code class="language-plaintext highlighter-rouge">/goal</code> — 适合规格驱动开发</h3>

<p>这是最适合 <code class="language-plaintext highlighter-rouge">/goal</code> 的工作流之一。<strong>Spec-Driven Development（SDD）</strong>的思路是：先把需求写成规格文档（包含 proposal、specs、design、tasks），然后让 AI 严格按规格实现。规格文档天然就是一份审计清单 —— 把它喂给 <code class="language-plaintext highlighter-rouge">/goal</code>，完成审计能精准地工作。</p>

<p>OpenSpec 是 Fission-AI 团队开发的开源 SDD 工具（MIT 协议，GitHub 上 37k stars），它的工作方式是这样的：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>You: /opsx:propose add-dark-mode
AI:  Created openspec/changes/add-dark-mode/
     ✓ proposal.md — 为什么要做、改了什么
     ✓ specs/      — 需求和场景
     ✓ design.md   — 技术方案
     ✓ tasks.md    — 实现清单
     Ready for implementation!
</code></pre></div></div>

<p>完整工作流：</p>

<h4 id="1-安装-openspec">1. 安装 OpenSpec</h4>

<p>OpenSpec 需要 Node.js 20.19.0+。安装命令：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> @fission-ai/openspec@latest
</code></pre></div></div>

<p>进入项目目录，初始化：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>your-project
openspec init
</code></pre></div></div>

<p>OpenSpec 会在项目里生成 <code class="language-plaintext highlighter-rouge">openspec/</code> 目录，并把适配你 AI 工具的指令写到对应的位置（它支持 20+ 种 AI 工具，Codex 也在里面）。</p>

<h4 id="2-用-openspec-生成规格文档">2. 用 OpenSpec 生成规格文档</h4>

<p>在 Codex 里直接输入（<code class="language-plaintext highlighter-rouge">/opsx:propose</code> 是 OpenSpec 安装后注册的斜杠命令）：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/opsx:propose 为这个项目新增 Cohere Rerank 作为第五个 Rerank provider
</code></pre></div></div>

<p>Codex 会调用 OpenSpec，把你的需求拆解成 <code class="language-plaintext highlighter-rouge">proposal.md</code>、<code class="language-plaintext highlighter-rouge">specs/</code>、<code class="language-plaintext highlighter-rouge">design.md</code>、<code class="language-plaintext highlighter-rouge">tasks.md</code>。这一步不会动你任何源代码，只是把”要做什么”写清楚。</p>

<h4 id="3-用-goal-执行规格">3. 用 <code class="language-plaintext highlighter-rouge">/goal</code> 执行规格</h4>

<p>规格文档生成完后，在 Codex 里：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/goal 严格实现 openspec/changes/add-cohere-rerank/ 中描述的变更。

First action: 先读 proposal.md / specs/ / design.md / tasks.md / AGENTS.md 这五个文件，
报告每个文件的字数和关键章节标题，等我确认后再开始实现。

Scope: design.md 里的 "MUST NOT modify" 列表严格遵守。

Constraints:
- AGENTS.md 中的所有 iron rules 不可违反
- 不允许新增 npm 依赖
- 镜像现有 4 个 Rerank provider 的代码风格

Done when:
1. tasks.md 中的每一项都打勾，引用对应文件路径
2. 每条 SHALL 都有对应的通过测试，引用测试名
3. 每个 GIVEN/WHEN/THEN 场景都有集成测试覆盖
4. `npx tsc --noEmit` 退出码 0
5. `npm test` 退出码 0，粘贴汇总输出
6. README.md 在 provider 表格里加上新一行
7. CHANGELOG.md 在 Unreleased 段加条目

Stop if:
- 任何任务需要修改 MUST NOT 列表中的文件
- SHALL 之间出现冲突（暂停，让我决定）
- 需要 npm install 新依赖
- 现有 Rerank provider 测试出现失败

Use a token budget of 120000 tokens.
</code></pre></div></div>

<p>注意第二行的 <strong>First action</strong>：这是个非常关键的小技巧。它强制 Codex 在动手前先把规格文件全部读一遍并向你报告确认 —— 防止 Codex 用 <code class="language-plaintext highlighter-rouge">@filename</code> 等不可靠引用方式假装”知道”了规格，实际上没读全。</p>

<p>这种工作流跑出来的产物质量最稳。我自己测试中，中等规模的 feature（类似新增一个 provider 这种 200~400 行的改动）基本都能一次跑通，跑完直接是个能 review 的 PR。</p>

<hr />

<h2 id="七用-goal-prompt-builder-把上面这些自动化">七、用 <code class="language-plaintext highlighter-rouge">goal-prompt-builder</code> 把上面这些自动化</h2>

<p>写好五段式提示词需要练习。如果不熟练，或者懒得每次手写，可以用我开发的 <strong><code class="language-plaintext highlighter-rouge">goal-prompt-builder</code></strong> —— 一个专门用来生成 <code class="language-plaintext highlighter-rouge">/goal</code> 提示词的 Claude Skill，仓库在：</p>

<blockquote>
  <p>https://github.com/win4r/goal-prompt-builder （MIT 协议）</p>
</blockquote>

<h3 id="它解决什么">它解决什么</h3>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 内置的 <code class="language-plaintext highlighter-rouge">continuation.md</code> 审计机制非常强，但前提是你的目标文本能被映射成清单。这个 skill 的核心目的就是：<strong>保证生成的目标文本一定可以被映射成审计清单</strong>。</p>

<h3 id="它内部是怎么工作的">它内部是怎么工作的</h3>

<p>按 README 描述，skill 触发后会走 6 步：</p>

<ol>
  <li><strong>选择交互模式</strong> — 步进式 / 完整描述式 / 混合式（默认）</li>
  <li><strong>自动检测项目类型</strong> — 通过看文件系统（<code class="language-plaintext highlighter-rouge">package.json</code>、<code class="language-plaintext highlighter-rouge">Cargo.toml</code>、<code class="language-plaintext highlighter-rouge">*.xcodeproj</code> 等）或者抓 GitHub README，顺便读 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> / <code class="language-plaintext highlighter-rouge">CLAUDE.md</code></li>
  <li><strong>挑选场景模板</strong> — 内置 7 套（refactor / SDD feature / batch / archaeology / UI audit / gatekeeper / custom）</li>
  <li><strong>收集 5 段输入</strong> — Objective / Scope / Constraints / Done when / Stop if</li>
  <li><strong>预测审计友好度</strong> — 内部打分，如果分数低于 70 直接拒绝渲染，要求你补充信息</li>
  <li><strong>渲染输出</strong> — 一段可以直接粘贴的 <code class="language-plaintext highlighter-rouge">/goal</code> 提示词，加一段简短的设计说明</li>
</ol>

<p>它内部有一组<strong>硬规则</strong>（从 <code class="language-plaintext highlighter-rouge">continuation.md</code> 倒推出来的）：</p>

<ul>
  <li><strong>拒绝模糊动词</strong> — improve、optimize、clean up、all、everything、全部、彻底 这些词会触发反推，要求你换成可验证的描述</li>
  <li><strong>强制要求 token budget</strong> — 没预算就没软停止，潜在跑飞</li>
  <li><strong>强制回归保护</strong> — 任何动到测试覆盖代码的目标，自动加上”不许改测试让它通过”的 stop-if</li>
  <li><strong>SDD 类目标强制 read+report 优先</strong> — 防止 <code class="language-plaintext highlighter-rouge">@filename</code> 引用不准</li>
  <li><strong>brownfield 项目强制探测 MUST NOT 列表</strong> — scope creep 第一大原因</li>
  <li><strong>审计友好度 &lt; 70% 直接拒绝渲染</strong></li>
</ul>

<p>我用这个 skill 之后，日常写 <code class="language-plaintext highlighter-rouge">/goal</code> 的速度快了非常多 —— 简单任务一两分钟就能从一句话需求走到一个可用的 5 段式提示词。</p>

<h3 id="怎么安装">怎么安装</h3>

<p>按 README，有三种方式：</p>

<h4 id="方式-1一行命令安装">方式 1：一行命令安装</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-L</span> <span class="nt">-o</span> /tmp/goal-prompt-builder.skill <span class="se">\</span>
  https://github.com/win4r/goal-prompt-builder/raw/main/goal-prompt-builder.skill
<span class="nb">mkdir</span> <span class="nt">-p</span> ~/.claude/skills
unzip <span class="nt">-o</span> /tmp/goal-prompt-builder.skill <span class="nt">-d</span> ~/.claude/skills/
<span class="nb">rm</span> /tmp/goal-prompt-builder.skill
</code></pre></div></div>

<h4 id="方式-2克隆并软链">方式 2：克隆并软链</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/win4r/goal-prompt-builder.git
<span class="nb">ln</span> <span class="nt">-s</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span><span class="s2">/goal-prompt-builder/goal-prompt-builder"</span> ~/.claude/skills/goal-prompt-builder
</code></pre></div></div>

<h4 id="方式-3让-codex-自己装视频演示中用的方式">方式 3：让 Codex 自己装（视频演示中用的方式）</h4>

<p>如果你不熟命令行，直接在 Codex 里描述安装需求：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>请帮我安装这个 skill：https://github.com/win4r/goal-prompt-builder
按 README 的安装方式装到默认位置。
</code></pre></div></div>

<p>Codex 会自己执行下载、解压、放到对应目录。装完后<strong>重启 Codex</strong>，skill 就生效了。</p>

<blockquote>
  <p>注意：这个 skill 是用 Claude Skills 格式构建的，默认安装位置是 <code class="language-plaintext highlighter-rouge">~/.claude/skills/</code>。具体在哪个客户端能被识别，以你客户端文档为准 —— README 明确列出的兼容客户端是 Claude Code、Claude Desktop、以及支持 Skills 的 Claude.ai。</p>
</blockquote>

<h3 id="怎么用">怎么用</h3>

<p>安装重启后，skill 会被以下短语自动触发，不需要手动调：</p>

<ul>
  <li>“help me write a /goal for …”</li>
  <li>“design a goal for X”</li>
  <li>“review my goal command”</li>
  <li>“我要用 /goal 来…”</li>
  <li>任何提到长任务 + Codex 的对话</li>
</ul>

<p>最简单的用法是丢一个一句话需求进去，比如：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>我想用 /goal 给这个项目增加 Cohere Rerank 作为第五个 Rerank provider
</code></pre></div></div>

<p>skill 会：</p>

<ul>
  <li>自动检测出这是 Node/TypeScript 项目（看 <code class="language-plaintext highlighter-rouge">package.json</code>）</li>
  <li>读 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> / <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 提取项目特定的规则</li>
  <li>问你几个关键问题（token 预算、是否有 SDD 规格、是否有要保护的 MUST NOT 文件）</li>
  <li>输出一段五段式 <code class="language-plaintext highlighter-rouge">/goal</code> + 一段设计说明，告诉你为什么这样写</li>
</ul>

<p>把输出粘贴到 Codex 的输入框，回车，任务就跑起来了。</p>

<hr />

<h2 id="八几个非常容易踩的坑">八、几个非常容易踩的坑</h2>

<p>这些是我自己踩过、或者社区在 GitHub Issue 里报告过的坑。直接列出来，贴在显示器旁边比什么都管用。</p>

<h3 id="坑-1plan-模式下-goal-不延续">坑 1：Plan 模式下 <code class="language-plaintext highlighter-rouge">/goal</code> 不延续</h3>

<p><strong>现象</strong>：UI 上显示 “Goal active”，但 Codex 不会自己往下推进，看上去像卡死了。</p>

<p><strong>原因</strong>：Issue #20656。源码里 <code class="language-plaintext highlighter-rouge">should_ignore_goal_for_mode(mode) -&gt; mode == ModeKind::Plan</code>。Plan 模式下 goal 延续被静默跳过。</p>

<p><strong>对策</strong>：用 <code class="language-plaintext highlighter-rouge">/plan</code> 做规划时不要同时启动 <code class="language-plaintext highlighter-rouge">/goal</code>。规划完先退出 Plan 模式（<code class="language-plaintext highlighter-rouge">Shift+Tab</code>），再下 <code class="language-plaintext highlighter-rouge">/goal</code>。</p>

<h3 id="坑-2中途-compact-把-goal-上下文搞丢">坑 2：中途 <code class="language-plaintext highlighter-rouge">/compact</code> 把 goal 上下文搞丢</h3>

<p><strong>现象</strong>：跑了一段时间，模型突然好像”忘了”目标的细节，开始做不相关的事，或者过早声称完成。</p>

<p><strong>原因</strong>：Issue #19910。如果 <code class="language-plaintext highlighter-rouge">/compact</code> 发生在一轮模型调用执行的<strong>中间</strong>，延续提示词不会被重新注入，后续 agent 丢掉目标和审计要求。</p>

<p><strong>对策</strong>：长任务<strong>不要手动 <code class="language-plaintext highlighter-rouge">/compact</code></strong>。设一个相对宽松的 token 预算，让自动 compaction 落在轮次边界上。</p>

<h3 id="坑-3第一条消息就发-goal之后-resume-列表里找不到这个会话">坑 3：第一条消息就发 <code class="language-plaintext highlighter-rouge">/goal</code>，之后 resume 列表里找不到这个会话</h3>

<p><strong>现象</strong>：<code class="language-plaintext highlighter-rouge">codex resume</code> 列表、Codex Desktop 的 recents 里都看不到这个 thread，但 thread 本身没丢，知道 ID 还能打开。</p>

<p><strong>原因</strong>：Issue #20792。<code class="language-plaintext highlighter-rouge">/goal</code>-first 的 thread 在列表里被遗漏了。</p>

<p><strong>对策</strong>：<strong>新 thread 第一条消息别用 <code class="language-plaintext highlighter-rouge">/goal</code></strong>。先随便发一句话，比如 “Working on the OAuth migration goal”，再用 <code class="language-plaintext highlighter-rouge">/goal</code>。</p>

<h3 id="坑-4目标里出现全部--所有--彻底--improve">坑 4：目标里出现”全部 / 所有 / 彻底 / improve”</h3>

<p><strong>现象</strong>：跑了几个小时回来，声称做完了，但你一看实际改动只是边边角角，核心问题没动。</p>

<p><strong>原因</strong>：这些词没法被 <code class="language-plaintext highlighter-rouge">continuation.md</code> 映射成清单，审计退化成”测试跑过 = 完成”。</p>

<p><strong>对策</strong>：换具体的数字或可验证的状态。”修 5 个真实可复现的 bug”、”覆盖 README 列出的 3 条用户路径”、”<code class="language-plaintext highlighter-rouge">pytest</code> 0 失败 0 跳过” —— 这些都比”修复所有 bug”强一万倍。</p>

<h3 id="坑-5不设-token-预算">坑 5：不设 token 预算</h3>

<p><strong>现象</strong>：任务跑飞，token 烧光也没人提醒，等回来一看账单不对劲。</p>

<p><strong>对策</strong>：<strong>永远设 token budget</strong>。<code class="language-plaintext highlighter-rouge">Use a token budget of &lt;N&gt; tokens for this goal.</code>。烧到上限会触发软停止，让模型把工作收尾，而不是裸停。</p>

<h3 id="坑-6破坏性操作不加保护">坑 6：破坏性操作不加保护</h3>

<p><strong>现象</strong>：让 Codex 做迁移，跑着跑着把数据库 schema 改了 / 把不该删的文件删了。</p>

<p><strong>对策</strong>：破坏性操作<strong>不要用 <code class="language-plaintext highlighter-rouge">/goal</code></strong>。必须用的话，Constraints 里明确写”不要执行 <code class="language-plaintext highlighter-rouge">rm -rf</code>“、”不要修改数据库 schema”、”任何 destructive migration 暂停问我”，并且把对应内容也写进 Stop if。</p>

<hr />

<h2 id="九控制命令速查">九、控制命令速查</h2>

<table>
  <thead>
    <tr>
      <th>操作</th>
      <th>命令</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>创建/替换目标</td>
      <td><code class="language-plaintext highlighter-rouge">/goal &lt;objective&gt;</code></td>
    </tr>
    <tr>
      <td>查看当前目标摘要</td>
      <td><code class="language-plaintext highlighter-rouge">/goal</code>（不带参数）</td>
    </tr>
    <tr>
      <td>暂停</td>
      <td><code class="language-plaintext highlighter-rouge">/goal pause</code></td>
    </tr>
    <tr>
      <td>恢复</td>
      <td><code class="language-plaintext highlighter-rouge">/goal resume</code></td>
    </tr>
    <tr>
      <td>清空</td>
      <td><code class="language-plaintext highlighter-rouge">/goal clear</code></td>
    </tr>
    <tr>
      <td>退出 Plan 模式</td>
      <td><code class="language-plaintext highlighter-rouge">Shift+Tab</code></td>
    </tr>
    <tr>
      <td>跨会话恢复 thread</td>
      <td><code class="language-plaintext highlighter-rouge">codex resume &lt;id&gt;</code></td>
    </tr>
  </tbody>
</table>

<p>状态标识：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">pursuing</code> / <code class="language-plaintext highlighter-rouge">active</code> — 正在自主推进</li>
  <li><code class="language-plaintext highlighter-rouge">paused</code> — 被手动暂停</li>
  <li><code class="language-plaintext highlighter-rouge">achieved</code> / <code class="language-plaintext highlighter-rouge">complete</code> — 完成审计通过，目标达成</li>
  <li><code class="language-plaintext highlighter-rouge">unmet</code> — 未达成</li>
  <li><code class="language-plaintext highlighter-rouge">budget_limited</code> — token 预算耗尽，软停止中</li>
</ul>

<hr />

<h2 id="十启动前-checklist">十、启动前 checklist</h2>

<p>每次发 <code class="language-plaintext highlighter-rouge">/goal</code> 之前，过一遍这个清单：</p>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />对项目的上下文我先聊过一轮了吗？（背景、关心的模块、已排除的方向、AGENTS.md / CLAUDE.md 是否已读）</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />我的目标可以被映射成一份清单吗？</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />验收标准是具体数字 / 可验证状态，还是”全部 / 所有 / 彻底”这种虚词？</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Stop if 段写了吗？它能不能机械可识别？</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Token budget 设了吗？</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />这个任务真的需要 <code class="language-plaintext highlighter-rouge">/goal</code> 吗？（单轮能干完的别用）</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />我现在不在 Plan 模式吧？</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />这是 thread 的第一条消息吗？如果是，先发一条非 <code class="language-plaintext highlighter-rouge">/goal</code> 消息再说</li>
</ul>

<p>跑起来之后：</p>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />第一轮输出对得上我的目标吗？对不上立刻 <code class="language-plaintext highlighter-rouge">/goal pause</code>，补上下文，再 <code class="language-plaintext highlighter-rouge">/goal resume</code></li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />中间需要的话用 <code class="language-plaintext highlighter-rouge">/goal</code> 查进度</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />长任务不要手动 <code class="language-plaintext highlighter-rouge">/compact</code></li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />重要节点考虑挂 hook（自动 commit、自动跑测试）</li>
</ul>

<hr />

<h2 id="十一一些更宏观的观察">十一、一些更宏观的观察</h2>

<p>最近半年，prompt 写法明显在变化：</p>

<ul>
  <li><strong>以前</strong> —— 一步一步指挥（”先做 A，再做 B，然后 C”）</li>
  <li><strong>现在</strong> —— 声明结果（”我要这个，完成标准是 X、Y、Z，达到 X / Y / Z 才算完成”），然后让 Agent 自己规划</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 是这个方向走得最远的产物之一。它把”过程指挥”压到最低、把”结果声明”提到最高，然后用一套内置审计机制保证模型不偷懒。</p>

<p>但反过来，这也提高了对”会写需求”的要求。模型越来越能干，但它干得好不好，反过来更依赖你能不能把”到底要啥”说清楚。<strong>会写需求</strong>这件事，正在重新变成稀缺技能。</p>

<p>以前 prompt 糊一点没事，反正它也只跑几秒钟；现在它能跑一整天，你那条糊掉的 goal，换来的就是一整天的糊产出。</p>

<p><code class="language-plaintext highlighter-rouge">/goal</code> 的真正价值不在于”它能跑一整天”，而在于它把”AI 真的能替你跑一整天”这件事，从一个需要外部脚本 + 反复试错的工程，变成了一条可以直接在终端里下的命令。剩下的事，是把目标写清楚。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Codex" /><category term="Claude" /><category term="Claude Code" /><category term="OpenAI" /><category term="goal" /><category term="Ralph Loop" /><category term="Spec-Driven" /><category term="OpenSpec" /><category term="AI编程" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[/goal 是 OpenAI 在 Codex CLI 0.128.0（2026 年 4 月 30 日发布）中新增的一条命令。它不是又一个普通的提示词模板，而是 Codex 内部新增了一整套目标生命周期管理机制——给一个目标，Codex 会自己一轮接一轮往下推进，真正实现无人值守。社区里已经出现连续运行 21 小时、烧掉 9 亿 token 的案例。这篇笔记把我自己踩过的坑、固定下来的工作流、配套的 Skill 全都整理成保姆级教程。]]></summary></entry><entry><title type="html">🚀GitNexus保姆级教程：将代码库索引为知识图谱，让Claude Code/Codex/Cursor真正读懂你的代码！MCP一键集成，零Token消耗本地索引，影响范围分析+智能重构+PR Review全流程实测</title><link href="https://www.aivi.fyi//llms/gitnexus" rel="alternate" type="text/html" title="🚀GitNexus保姆级教程：将代码库索引为知识图谱，让Claude Code/Codex/Cursor真正读懂你的代码！MCP一键集成，零Token消耗本地索引，影响范围分析+智能重构+PR Review全流程实测" /><published>2026-05-02T00:00:00+08:00</published><updated>2026-05-02T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/gitnexus</id><content type="html" xml:base="https://www.aivi.fyi//llms/gitnexus"><![CDATA[<p>在之前的视频中，我为大家演示过 Graphify——那款能够把代码库、文档、论文、图片一起编译成知识图谱的开源项目。本期继续给大家分享一个新的开源工具：<strong>GitNexus</strong>。它和 Graphify 都属于”让 AI 编程助手真正理解代码”这个赛道，但解决的维度并不一样，两者完全可以叠加使用。</p>

<p>GitNexus 被作者称作<strong>代码库的神经系统</strong>，核心理念只有一句话：<strong>AI Agent 不应该盲目编辑代码</strong>。它把代码仓库索引为知识图谱，再通过 MCP 协议把这份图谱喂给 Codex、Claude Code、Cursor 等 AI 编程助手，让它们在动手改代码之前就能完整地感知项目结构、依赖关系和”爆炸半径”。</p>

<blockquote>
  <p>🚀 本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://www.bilibili.com/video/BV1vy9XBrExq/">👉👉👉 通过哔哩哔哩观看</a></li>
    <li><a href="https://youtu.be/Zy6tS-7xg9M">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<iframe width="800" height="450" src="https://www.youtube.com/embed/Zy6tS-7xg9M" title="GitNexus 保姆级教程" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<hr />

<h2 id="一gitnexus-解决了什么痛点">一、GitNexus 解决了什么痛点</h2>

<p>传统 AI 编程工具最大的问题是：它们看到的是<strong>代码片段</strong>，而不是<strong>代码结构</strong>。</p>

<p>无论是 Claude Code、Codex 还是 Cursor，本质上都是通过 Glob / Grep 一段一段地读文件。如果不借助外部工具，它们对项目的全貌缺乏感知，很容易出现”盲改代码”的情况——改了一个函数的返回类型，根本不知道有几十个调用方会被破坏；重构一个模块，不知道下游有哪些隐藏依赖。</p>

<p>GitNexus 的解题思路是：<strong>在索引阶段就把调用链、聚类、置信度评分全部预计算好</strong>，AI 工具一次调用 MCP 就能拿到完整的结构化上下文。这样既提升了改动的可靠性，又节省了 Token，甚至让小模型也能胜任原本需要大模型才能处理的复杂任务。</p>

<hr />

<h2 id="二gitnexus-的核心特性">二、GitNexus 的核心特性</h2>

<h3 id="1-七个内置-mcp-工具">1. 七个内置 MCP 工具</h3>

<p>GitNexus 内置了 7 个 MCP 工具，每一个都对应一个具体的开发痛点：</p>

<table>
  <thead>
    <tr>
      <th>工具</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">impact</code></td>
      <td>爆炸半径分析——改这个函数会波及哪些代码</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">context</code></td>
      <td>360 度符号视图——某个符号的完整上下游关系</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">query</code></td>
      <td>进程感知的混合搜索（BM25 + 语义向量）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">detect_changes</code></td>
      <td>Git diff 风险评估，配合 PR Review</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rename</code></td>
      <td>跨文件协调重命名</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cypher</code></td>
      <td>原始图查询，给高级用户用</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">list_repos</code></td>
      <td>全局仓库注册表</td>
    </tr>
  </tbody>
</table>

<h3 id="2-索引阶段零-token-消耗">2. 索引阶段零 Token 消耗</h3>

<p>这是 GitNexus 最值得称道的一点：<strong>索引、解析、聚类、图构建都是完全本地化的</strong>。即便是嵌入向量（用于语义搜索），它也是通过本地的 transformers.js 跑 Hugging Face 嵌入模型，不调用任何 LLM API，不消耗任何 Token。</p>

<p>你只在用 <code class="language-plaintext highlighter-rouge">gitnexus wiki</code> 自动生成项目文档时才会用到 LLM API（默认 OpenAI 的 <code class="language-plaintext highlighter-rouge">gpt-4o-mini</code>，可以通过 <code class="language-plaintext highlighter-rouge">--base-url</code> 切换到任意 OpenAI 兼容协议的服务）。日常的索引、查询、影响分析等核心功能，<strong>一个 API Key 都不需要</strong>。</p>

<h3 id="3-多语言支持">3. 多语言支持</h3>

<p>支持主流的 TypeScript、JavaScript、Python、Java、Kotlin、C#、Go、Rust、PHP 等编程语言，覆盖绝大多数生产项目的技术栈。</p>

<h3 id="4-gitnexus-与-graphify-的区别">4. GitNexus 与 Graphify 的区别</h3>

<p>不少朋友会问 GitNexus 和 Graphify 怎么选，这里直接给一个对照：</p>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>GitNexus</th>
      <th>Graphify</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>定位</td>
      <td>AI Agent 的代码地图</td>
      <td>跨模态知识编译器</td>
    </tr>
    <tr>
      <td>关注点</td>
      <td>调用链、爆炸半径、类型解析</td>
      <td>代码、文档、论文、图像、视频统一图谱</td>
    </tr>
    <tr>
      <td>索引 LLM 开销</td>
      <td>零 Token</td>
      <td>AST 通道零开销，语义通道有 LLM 消耗</td>
    </tr>
    <tr>
      <td>触发方式</td>
      <td>MCP 协议</td>
      <td>Skill 触发</td>
    </tr>
    <tr>
      <td>输出</td>
      <td>实时查询的结构化上下文</td>
      <td>Git 友好的静态产物（团队共享）</td>
    </tr>
  </tbody>
</table>

<p>简单概括：</p>

<ul>
  <li><strong>精准代码问题</strong>用 GitNexus。比如：「修改这个函数的返回类型会影响哪些模块？」</li>
  <li><strong>语义知识问题</strong>用 Graphify。比如：「这段 attention 实现和 Transformer 论文的哪个部分对应？」</li>
  <li><strong>复杂混合问题</strong>两个一起开。比如：「重构 Auth 模块前我需要知道所有依赖它的代码路径，以及当初选择 OAuth 的原因。」</li>
</ul>

<p>两个项目互不冲突，叠加使用效果更好。</p>

<hr />

<h2 id="三安装与配置">三、安装与配置</h2>

<h3 id="31-全局安装">3.1 全局安装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> gitnexus
</code></pre></div></div>

<p>如果你担心 npm 全局目录权限问题，可以提前把全局目录改到家目录下：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> ~/.npm-global
npm config <span class="nb">set </span>prefix ~/.npm-global
<span class="nb">echo</span> <span class="s1">'export PATH=~/.npm-global/bin:$PATH'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
<span class="nb">source</span> ~/.zshrc
</code></pre></div></div>

<p>之后所有的 <code class="language-plaintext highlighter-rouge">npm install -g</code> 都不再需要 sudo。</p>

<h3 id="32-验证安装">3.2 验证安装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus <span class="nt">--version</span>
</code></pre></div></div>

<p>输出版本号即说明安装成功。</p>

<h3 id="33-一键配置编辑器-mcp">3.3 一键配置编辑器 MCP</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus setup
</code></pre></div></div>

<p>这条命令会自动检测本地装的 Cursor、Claude Code、OpenCode、Codex、Windsurf 等 MCP 兼容编辑器，把 GitNexus 的 MCP server 配置一次性写入所有编辑器的全局 MCP 配置文件，同时安装对应的 Skill。</p>

<p>如果你只想配置 Claude Code，也可以单独执行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude mcp add gitnexus <span class="nt">--</span> gitnexus mcp
</code></pre></div></div>

<blockquote>
  <p>Windows 用户请使用：<code class="language-plaintext highlighter-rouge">claude mcp add gitnexus -- cmd /c gitnexus mcp</code></p>
</blockquote>

<p>配置完成后，<strong>完全退出再重启 Claude Code</strong>——MCP server 只在启动时初始化，配置改了必须重启才会生效。</p>

<hr />

<h2 id="四索引代码库">四、索引代码库</h2>

<p>下面以一个真实项目为例：为 OpenClaw 开发的记忆插件 <code class="language-plaintext highlighter-rouge">memory-lancedb-pro</code>，看看完整的索引流程。</p>

<h3 id="41-进入项目目录">4.1 进入项目目录</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/Desktop/project/memory-lancedb-pro
</code></pre></div></div>

<h3 id="42-基础索引最快零-token">4.2 基础索引（最快、零 Token）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus analyze
</code></pre></div></div>

<p>这条命令会跑完整的 6 阶段管线：Structure → Parsing → Resolution → Clustering → Processes → Search，最终生成 <code class="language-plaintext highlighter-rouge">.gitnexus/lbug</code> 数据库，以及配套的 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 和 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>。</p>

<p>实测下来，167 个文件的项目大约 6 秒完成索引；几千文件的项目也只需要几分钟。索引完成后，会提示生成了多少节点、多少边、多少社区（cluster）、多少执行流（flow）——比如本期演示的项目就生成了 6400 个节点、1 万多条边、203 个簇、300 个 flow。</p>

<p>需要注意的是：<strong>基础索引不会生成语义向量、模块级 Skill 和诊断细节</strong>。也就是说在 Claude Code 里调用 GitNexus 时只能做关键词匹配，无法发挥真正的实力。</p>

<h3 id="43-推荐索引启用语义搜索">4.3 推荐索引（启用语义搜索）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus analyze <span class="nt">--embeddings</span>
</code></pre></div></div>

<p>加上 <code class="language-plaintext highlighter-rouge">--embeddings</code> 参数后，GitNexus 会用本地 Hugging Face 嵌入模型为每个 symbol 生成向量。这样 <code class="language-plaintext highlighter-rouge">query()</code> 工具就能做真正的自然语言语义搜索，而不只是关键词匹配。</p>

<p>整个过程<strong>仍然零 Token、零 LLM 调用</strong>，只是索引时间会多 30%–100%（取决于 CPU/GPU 性能）。</p>

<h3 id="44-完整索引最推荐">4.4 完整索引（最推荐）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus analyze <span class="nt">--embeddings</span> <span class="nt">--skills</span> <span class="nt">--verbose</span>
</code></pre></div></div>

<p>这是日常使用的推荐配置：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">--embeddings</code> 启用语义搜索</li>
  <li><code class="language-plaintext highlighter-rouge">--skills</code> 把 Leiden 算法识别的每个功能社区生成独立的 SKILL.md，写到 <code class="language-plaintext highlighter-rouge">.claude/skills/generated/&lt;area&gt;/</code>，让 Claude Code 在不同模块工作时拿到精准的局部架构上下文</li>
  <li><code class="language-plaintext highlighter-rouge">--verbose</code> 打印被跳过的文件，方便诊断索引覆盖率</li>
</ul>

<h3 id="45-验证索引状态">4.5 验证索引状态</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus list      <span class="c"># 查看所有已索引的仓库</span>
gitnexus status    <span class="c"># 查看当前仓库索引状态</span>
</code></pre></div></div>

<hr />

<h2 id="五web-ui-可视化图谱">五、Web UI 可视化图谱</h2>

<p>索引完成后，可以启动本地 HTTP 服务来浏览图谱：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus serve
</code></pre></div></div>

<p>默认监听 4747 端口，启动后保持终端运行即可。然后浏览器访问 <code class="language-plaintext highlighter-rouge">https://gitnexus.vercel.app</code>，UI 会自动检测本地 4747 端口的 backend，列出所有已索引的仓库。点击对应卡片就能进入图浏览界面。</p>

<p>实测体验：</p>

<ul>
  <li>力导向布局的代码图（Sigma.js + WebGL 渲染）</li>
  <li>可以缩放、拖拽、按 cluster 着色</li>
  <li><strong>直接点击任意节点即可查看对应的代码内容</strong></li>
  <li>自带 AI Chat 框，对图提问</li>
  <li><strong>代码不上传服务器，所有计算跑在本地 backend</strong></li>
</ul>

<p>如果你不想长期占着一个终端，可以把服务放到后台：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">nohup </span>gitnexus serve <span class="o">&gt;</span> ~/.gitnexus/serve.log 2&gt;&amp;1 &amp;
</code></pre></div></div>

<p>需要停止时执行 <code class="language-plaintext highlighter-rouge">pkill -f "gitnexus serve"</code> 或 <code class="language-plaintext highlighter-rouge">lsof -ti:4747 | xargs kill</code>。</p>

<hr />

<h2 id="六实测gitnexus-在-claude-code-里到底好用在哪">六、实测：GitNexus 在 Claude Code 里到底好用在哪</h2>

<p>完成索引后，在 Claude Code 中输入斜杠，就能看到 GitNexus 自动注册的几个 Skill，比如 <code class="language-plaintext highlighter-rouge">gitnexus exploring</code>、<code class="language-plaintext highlighter-rouge">gitnexus debugging</code>、<code class="language-plaintext highlighter-rouge">gitnexus pr review</code>。下面分别测试几个高频场景。</p>

<h3 id="测试-1项目架构分析">测试 1：项目架构分析</h3>

<p>直接输入：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>分析项目架构
</code></pre></div></div>

<p>Claude Code 会调用 GitNexus 的 MCP 工具，输出结构化的分析报告：</p>

<ul>
  <li><strong>项目定位</strong>：生产级长期记忆 MCP 插件</li>
  <li><strong>项目规模</strong>：节点数、边数、模块数</li>
  <li><strong>辅助子系统</strong>：列出各功能模块及其相互关系</li>
</ul>

<h3 id="测试-2模块作用解读">测试 2：模块作用解读</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>分析这个项目中 A-MAC 的作用是什么
</code></pre></div></div>

<p>GitNexus 会基于图谱给出准确的回答：「A-MAC 是智能写入门控」，并给出具体的调用关系和上下文。</p>

<h3 id="测试-3影响范围分析核心场景">测试 3：影响范围分析（核心场景）</h3>

<p>这是 GitNexus 最能体现价值的场景：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>如果删除 A-MAC 功能会影响哪些代码
</code></pre></div></div>

<p>输出结果不仅列出了所有受影响的文件，<strong>甚至精确到具体的代码行号</strong>。这种粒度的分析，没有知识图谱根本做不到。</p>

<h3 id="测试-4对照实验不用-gitnexus-是什么效果">测试 4：对照实验——不用 GitNexus 是什么效果</h3>

<p>为了公平对比，我重新克隆了同样的项目，<strong>不做任何 GitNexus 索引</strong>，开一个干净的 Claude Code 窗口，提同样的问题。</p>

<p>然后再开第三个 Claude Code 窗口，把两边的回复都贴进去，让它客观评判：</p>

<blockquote>
  <p>「分析这两个 AI 回答的差别，哪个更详细？」</p>
</blockquote>

<p>最终结论：</p>

<ul>
  <li><strong>使用 GitNexus 的 Claude Code</strong>：在深度上更详细，列出了具体改动的代码行号，<strong>更适合直接执行</strong></li>
  <li><strong>未使用 GitNexus 的 Claude Code</strong>：在广度上更全面一些，但缺少精确定位</li>
  <li><strong>如果只能选一份当作改动清单，应当交给使用了 GitNexus 的版本</strong></li>
</ul>

<p>这个对比基本可以说明 GitNexus 在影响分析这类任务上的硬实力。</p>

<h3 id="测试-5issue-自动诊断">测试 5：Issue 自动诊断</h3>

<p>随便从项目里挑一个 issue，把链接贴给 Claude Code，再用 <code class="language-plaintext highlighter-rouge">/gitnexus debugging</code> 触发分析：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/gitnexus debugging 分析这个 issue：&lt;issue 链接&gt;
</code></pre></div></div>

<p>GitNexus 会输出：</p>

<ol>
  <li><strong>Bug 形成的根本原因</strong></li>
  <li><strong>具体涉及的代码位置</strong></li>
  <li><strong>数学层面的证明</strong>（比如算法相关的 Bug）</li>
  <li><strong>多条修复路线</strong>（最小修复、彻底重构等）</li>
</ol>

<p>选定路线（比如直接回复「路线 A」）后，Claude Code 会按 GitNexus 给出的方案完成修复，并提供改动摘要和验证方式。</p>

<h3 id="测试-6pr-review">测试 6：PR Review</h3>

<p>通过 <code class="language-plaintext highlighter-rouge">/gitnexus pr review</code> Skill 加上 PR 链接：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/gitnexus pr review &lt;PR 链接&gt;
</code></pre></div></div>

<p>GitNexus 会基于图谱完成 review。继续追问「如果合并这个 PR 会影响哪些代码」时，它会输出：</p>

<ul>
  <li>受影响的具体符号清单</li>
  <li><strong>GitNexus 自动评估的风险等级</strong>（low / medium / high）</li>
  <li>总结性结论</li>
</ul>

<hr />

<h2 id="七日常维护">七、日常维护</h2>

<h3 id="71-提交代码后增量更新">7.1 提交代码后增量更新</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus analyze
</code></pre></div></div>

<p>GitNexus 会比对已有索引，只处理变更的文件。如果你执行过 <code class="language-plaintext highlighter-rouge">gitnexus setup</code>，PostToolUse hook 会在每次 commit 后自动提醒 Claude Code 重新索引，多数情况下不用手动跑。</p>

<h3 id="72-检查索引是否过期">7.2 检查索引是否过期</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus status
</code></pre></div></div>

<p>会对比 <code class="language-plaintext highlighter-rouge">meta.json</code> 里的 <code class="language-plaintext highlighter-rouge">lastCommit</code> 和当前 HEAD，告诉你索引是否需要更新。</p>

<h3 id="73-强制重建">7.3 强制重建</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus analyze <span class="nt">--force</span>
</code></pre></div></div>

<p>升级 GitNexus 大版本、改动量过大、怀疑索引被污染时使用。</p>

<h3 id="74-清理索引">7.4 清理索引</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus clean              <span class="c"># 清当前项目</span>
gitnexus clean <span class="nt">--all</span> <span class="nt">--force</span> <span class="c"># 清所有已注册仓库</span>
</code></pre></div></div>

<h3 id="75-自动生成项目-wiki会消耗-token">7.5 自动生成项目 Wiki（会消耗 Token）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gitnexus wiki
</code></pre></div></div>

<p>这是 GitNexus 唯一会调用 LLM 的命令，默认走 OpenAI 的 <code class="language-plaintext highlighter-rouge">gpt-4o-mini</code>。如果想换模型，加 <code class="language-plaintext highlighter-rouge">--model</code> 和 <code class="language-plaintext highlighter-rouge">--base-url</code> 参数即可，对应的 API Key 通过环境变量提供。</p>

<hr />

<h2 id="八完整一键流程">八、完整一键流程</h2>

<p>如果你只想要一份能直接拷贝执行的脚本：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 阶段 0：环境准备（可选）</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> ~/.npm-global
npm config <span class="nb">set </span>prefix ~/.npm-global
<span class="nb">echo</span> <span class="s1">'export PATH=~/.npm-global/bin:$PATH'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
<span class="nb">source</span> ~/.zshrc

<span class="c"># 阶段 1：安装</span>
npm <span class="nb">install</span> <span class="nt">-g</span> gitnexus
gitnexus <span class="nt">--version</span>

<span class="c"># 阶段 2：索引（在你的项目目录下执行）</span>
<span class="nb">cd</span> ~/your-project-path
gitnexus analyze <span class="nt">--embeddings</span> <span class="nt">--skills</span>

<span class="c"># 阶段 3：启动 Web UI</span>
gitnexus serve &amp;
<span class="c"># 浏览器打开 https://gitnexus.vercel.app</span>

<span class="c"># 阶段 4：配置 Claude Code</span>
claude mcp add gitnexus <span class="nt">--</span> gitnexus mcp
<span class="c"># 完全重启 Claude Code</span>

<span class="c"># 阶段 5：日常维护</span>
gitnexus list      <span class="c"># 查看所有索引仓库</span>
gitnexus status    <span class="c"># 查看当前索引状态</span>
gitnexus analyze   <span class="c"># 增量更新</span>
</code></pre></div></div>

<hr />

<h2 id="九状态对照表">九、状态对照表</h2>

<p>每一步是否成功，可以参考下面这张表自检：</p>

<table>
  <thead>
    <tr>
      <th>阶段</th>
      <th>验证命令</th>
      <th>成功标志</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>安装</td>
      <td><code class="language-plaintext highlighter-rouge">gitnexus --version</code></td>
      <td>输出 <code class="language-plaintext highlighter-rouge">1.6.3</code> 或更新版本</td>
    </tr>
    <tr>
      <td>索引</td>
      <td><code class="language-plaintext highlighter-rouge">cat .gitnexus/meta.json</code></td>
      <td>看到 nodes / edges / lastCommit 字段</td>
    </tr>
    <tr>
      <td>注册</td>
      <td><code class="language-plaintext highlighter-rouge">cat ~/.gitnexus/registry.json</code></td>
      <td>出现你的仓库条目</td>
    </tr>
    <tr>
      <td>Context 文件</td>
      <td><code class="language-plaintext highlighter-rouge">ls AGENTS.md CLAUDE.md</code></td>
      <td>两个文件都存在且非空</td>
    </tr>
    <tr>
      <td>HTTP server</td>
      <td><code class="language-plaintext highlighter-rouge">curl http://localhost:4747/api/mcp</code></td>
      <td>返回 JSON 而非 connection refused</td>
    </tr>
    <tr>
      <td>Web UI</td>
      <td>访问 <code class="language-plaintext highlighter-rouge">https://gitnexus.vercel.app</code></td>
      <td>看到仓库列表页面</td>
    </tr>
    <tr>
      <td>Claude MCP</td>
      <td>在 Claude Code 里问「列出 GitNexus 工具」</td>
      <td>列出 7 个工具名</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="十写在最后">十、写在最后</h2>

<p>通过这一轮实测可以看到，借助 GitNexus，AI 编程工具就能对代码库有更深入、更全面的理解：</p>

<ul>
  <li>项目架构分析更精准</li>
  <li>影响范围能定位到具体行号</li>
  <li>Issue 诊断能给出多条修复路线</li>
  <li>PR Review 能自动评估风险等级</li>
  <li>跨文件重构、代码探索、依赖追踪也都更加可靠</li>
</ul>

<p>而且这一切的代价仅仅是一次本地索引，<strong>不消耗任何 Token，不需要任何 LLM API</strong>。对于希望让 Claude Code、Codex、Cursor 这类工具在自己代码库上变得真正靠谱的开发者来说，GitNexus 几乎是一个零成本的能力增强。</p>

<p>如果你前面已经在用 Graphify 处理跨模态知识，那么把 GitNexus 加进来，就等于把代码侧的”全局视野”也补齐了——一个负责语义，一个负责结构，配合起来才是完整的 AI 编程工作流。</p>

<p>本期内容到这里，欢迎大家点赞、关注和转发，谢谢大家观看。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Claude" /><category term="Claude Code" /><category term="Codex" /><category term="Cursor" /><category term="GitNexus" /><category term="MCP" /><category term="知识图谱" /><category term="AI编程" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[在之前的视频中，我为大家演示过 Graphify——那款能够把代码库、文档、论文、图片一起编译成知识图谱的开源项目。本期继续给大家分享一个新的开源工具：GitNexus。它和 Graphify 都属于”让 AI 编程助手真正理解代码”这个赛道，但解决的维度并不一样，两者完全可以叠加使用。]]></summary></entry><entry><title type="html">🚀解锁NotebookLM隐藏功能！notebooklm-py完全使用指南：Python+CLI+AI Agent三种玩法，批量下载、播客生成、思维导图、PPT导出，连Web版没有的功能都能用！Claude Code、Hermes Agent、OpenClaw一键集成</title><link href="https://www.aivi.fyi//llms/notebooklm-py" rel="alternate" type="text/html" title="🚀解锁NotebookLM隐藏功能！notebooklm-py完全使用指南：Python+CLI+AI Agent三种玩法，批量下载、播客生成、思维导图、PPT导出，连Web版没有的功能都能用！Claude Code、Hermes Agent、OpenClaw一键集成" /><published>2026-04-26T00:00:00+08:00</published><updated>2026-04-26T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/notebooklm-py</id><content type="html" xml:base="https://www.aivi.fyi//llms/notebooklm-py"><![CDATA[<p>Google 的 NotebookLM 是当下最强的”个人知识库 + AI 研究助手”之一，但官方 Web 界面有几个老大难问题：</p>

<ul>
  <li><strong>没有官方 API</strong>——所有操作只能在网页里点点点</li>
  <li><strong>批量任务做不了</strong>——想一次导入 50 个 PDF？想都别想</li>
  <li><strong>隐藏功能用不上</strong>——比如思维导图导出 JSON、PPT 导出 PPTX、测验导出 Markdown，Web UI 全都没暴露</li>
</ul>

<p>今天给大家介绍一个非常硬核的开源项目——<a href="https://github.com/win4r/notebooklm-py"><code class="language-plaintext highlighter-rouge">notebooklm-py</code></a>。它通过逆向 NotebookLM 的内部 API，把所有功能（包括 Web 端没暴露的）都做成了 <strong>Python API + CLI + AI Agent Skill</strong> 三件套。</p>

<blockquote>
  <p>⚠️ <strong>重要提示</strong>：这是非官方库，使用的是 Google 未公开的内部接口，存在 API 随时变动的风险。适合做原型、做研究、做个人项目，不建议用在生产环境。</p>
</blockquote>

<hr />

<h2 id="一它到底能干什么">一、它到底能干什么？</h2>

<p>先看一张能力总览：</p>

<table>
  <thead>
    <tr>
      <th>模块</th>
      <th>能力</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>笔记本</strong></td>
      <td>创建、列出、重命名、删除</td>
    </tr>
    <tr>
      <td><strong>资料源</strong></td>
      <td>URL、YouTube、PDF、Markdown、Word、音视频、图片、Google Drive、纯文本，都能批量导入</td>
    </tr>
    <tr>
      <td><strong>对话</strong></td>
      <td>提问、查看历史、自定义 Persona</td>
    </tr>
    <tr>
      <td><strong>研究</strong></td>
      <td>Web 研究 / Drive 研究 Agent，支持快速 / 深度两种模式，结果自动入库</td>
    </tr>
    <tr>
      <td><strong>分享</strong></td>
      <td>公开 / 私有链接、用户权限（查看 / 编辑）</td>
    </tr>
    <tr>
      <td><strong>生成</strong></td>
      <td>音频概览、视频概览、PPT、信息图、测验、闪卡、报告、数据表、思维导图</td>
    </tr>
  </tbody>
</table>

<h3 id="web-ui-里没有但-api-能干的事">Web UI 里没有、但 API 能干的事</h3>

<p>这才是这个项目最值钱的地方：</p>

<ul>
  <li>🚀 <strong>批量下载</strong>——一次性把笔记本里所有音频、视频、PPT 全部下载到本地</li>
  <li>📝 <strong>测验 / 闪卡导出</strong>——支持 JSON / Markdown / HTML 三种格式（Web 只能在线交互）</li>
  <li>🧠 <strong>思维导图导出 JSON</strong>——可以喂给 Mermaid、XMind 等可视化工具</li>
  <li>📊 <strong>数据表导出 CSV</strong>——直接进 Excel</li>
  <li>📑 <strong>PPT 导出 PPTX</strong>——Web 只给 PDF，API 给可编辑的 PowerPoint</li>
  <li>✏️ <strong>单页 PPT 重写</strong>——用自然语言改某一页，其他页不动</li>
  <li>🔓 <strong>资料全文访问</strong>——拿到 NotebookLM 索引后的纯文本</li>
</ul>

<p>光这几条就值得一试。</p>

<hr />

<h2 id="二安装30-秒上手">二、安装：30 秒上手</h2>

<p><code class="language-plaintext highlighter-rouge">win4r</code> 这个 fork 把版本锁定在 <strong><code class="language-plaintext highlighter-rouge">v0.3.4-hermes.4</code></strong>，附带了一份 <code class="language-plaintext highlighter-rouge">SECURITY_AUDIT.md</code> 安全审计报告，比直接装 PyPI 上的版本更稳。</p>

<h3 id="21-标准安装">2.1 标准安装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install</span> <span class="s2">"git+https://github.com/win4r/notebooklm-py@v0.3.4-hermes.4"</span>
</code></pre></div></div>

<h3 id="22-带浏览器支持推荐">2.2 带浏览器支持（推荐）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install</span> <span class="s2">"notebooklm-py[browser] @ git+https://github.com/win4r/notebooklm-py@v0.3.4-hermes.4"</span>
playwright <span class="nb">install </span>chromium
</code></pre></div></div>

<p>加上 <code class="language-plaintext highlighter-rouge">[browser]</code> extra 后就能用 Playwright 自动登录，省掉手动复制 cookie 的麻烦。</p>

<h3 id="23-hermes-agent-专用安装">2.3 Hermes Agent 专用安装</h3>

<p>如果你是 Hermes 用户：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">VIRTUAL_ENV</span><span class="o">=</span>~/.hermes/hermes-agent/venv uv pip <span class="nb">install</span> <span class="se">\</span>
  <span class="s2">"notebooklm-py[browser,cookies] @ git+https://github.com/win4r/notebooklm-py@v0.3.4-hermes.4"</span>

~/.hermes/hermes-agent/venv/bin/playwright <span class="nb">install </span>chromium

<span class="nb">mkdir</span> <span class="nt">-p</span> ~/.local/bin
<span class="nb">ln</span> <span class="nt">-sf</span> ~/.hermes/hermes-agent/venv/bin/notebooklm ~/.local/bin/notebooklm
</code></pre></div></div>

<p>最后这行 <code class="language-plaintext highlighter-rouge">ln -sf</code> 是把 <code class="language-plaintext highlighter-rouge">notebooklm</code> 命令软链到 <code class="language-plaintext highlighter-rouge">~/.local/bin/</code>，这样在终端任何位置都能调用。</p>

<hr />

<h2 id="三登录认证三种姿势">三、登录认证：三种姿势</h2>

<p>NotebookLM 没有 OAuth，所以认证只能靠 cookie。项目提供了三种方案，<strong>首推方案一</strong>。</p>

<h3 id="方案一直接抓浏览器-cookie最省事">方案一：直接抓浏览器 Cookie（最省事）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm login <span class="nt">--browser-cookies</span> chrome
notebooklm auth check <span class="nt">--test</span>
</code></pre></div></div>

<p>这条命令会自动从你已登录的 Chrome 里读 cookie，<strong>几乎零配置</strong>。</p>

<p>由于 Google session 通常 15-30 分钟就过期，强烈建议在 <code class="language-plaintext highlighter-rouge">~/.hermes/.env</code>（或你常用的 shell rc 文件）里加一行：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NOTEBOOKLM_REFRESH_CMD=notebooklm login --browser-cookies chrome
</code></pre></div></div>

<p>设置后，cookie 过期时会<strong>自动透明刷新</strong>，你不会感知到。</p>

<h3 id="方案二playwright-交互式登录">方案二：Playwright 交互式登录</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm login
<span class="c"># 企业 SSO 用户用 Edge：</span>
notebooklm login <span class="nt">--browser</span> msedge
</code></pre></div></div>

<p>会弹一个浏览器窗口让你扫码 / 输密码，登完自动保存。</p>

<h3 id="方案三手动导出-cookie兜底方案">方案三：手动导出 Cookie（兜底方案）</h3>

<p>装一个浏览器扩展叫 <strong>“Get cookies.txt LOCALLY”</strong>，导出 JSON 后：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 skills/notebooklm/import_browser_cookies.py /tmp/nb_cookies.json
<span class="nb">rm</span> /tmp/nb_cookies.json   <span class="c"># ⚠️ 用完立刻删，里面是你的 Google 登录态</span>
</code></pre></div></div>

<blockquote>
  <p>🔐 <strong>安全提示</strong>：<code class="language-plaintext highlighter-rouge">~/.notebooklm/storage_state.json</code> 存的就是你的 Google 登录凭证，<strong>当成密码看待</strong>。项目自带 <code class="language-plaintext highlighter-rouge">.gitignore</code> 屏蔽，但别手贱去 <code class="language-plaintext highlighter-rouge">git add -A</code>。</p>
</blockquote>

<hr />

<h2 id="四cli-速查一条命令搞定一个流程">四、CLI 速查：一条命令搞定一个流程</h2>

<p>CLI 是最适合脚本化的入口，下面是一份”从零到产出”的完整 demo。</p>

<h3 id="41-创建笔记本--选定上下文">4.1 创建笔记本 &amp; 选定上下文</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm create <span class="s2">"AI 研究"</span>
notebooklm list                  <span class="c"># 列出所有笔记本</span>
notebooklm use &lt;notebook_id&gt;     <span class="c"># 把某个笔记本设为当前默认上下文</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">use</code> 之后，后续所有命令都默认作用在这个笔记本上，不用每次都传 ID。</p>

<h3 id="42-批量导入资料">4.2 批量导入资料</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 网页</span>
notebooklm <span class="nb">source </span>add <span class="s2">"https://arxiv.org/abs/2501.12345"</span>

<span class="c"># 本地 PDF</span>
notebooklm <span class="nb">source </span>add <span class="s2">"./paper.pdf"</span>

<span class="c"># 让 NotebookLM 自己去 Web 上找资料并自动入库</span>
notebooklm <span class="nb">source </span>add-research <span class="s2">"Diffusion Transformer"</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">source add-research</code> 是<strong>真·杀器</strong>：传一个关键词，它会调用 NotebookLM 的 Research Agent 去全网检索，结果自动塞进笔记本，省掉你自己搜 + 整理的功夫。</p>

<h3 id="43-提问">4.3 提问</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm ask <span class="s2">"总结一下这些论文的核心方法"</span>
</code></pre></div></div>

<h3 id="44-生成各种内容">4.4 生成各种内容</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 音频概览（播客）</span>
notebooklm generate audio <span class="s2">"make it engaging"</span> <span class="nt">--wait</span>

<span class="c"># 视频概览（白板风格）</span>
notebooklm generate video <span class="nt">--style</span> whiteboard <span class="nt">--wait</span>

<span class="c"># 电影感视频（纪录片风格）</span>
notebooklm generate cinematic-video <span class="s2">"documentary-style"</span> <span class="nt">--wait</span>

<span class="c"># 测验</span>
notebooklm generate quiz <span class="nt">--difficulty</span> hard

<span class="c"># 闪卡</span>
notebooklm generate flashcards <span class="nt">--quantity</span> more

<span class="c"># PPT</span>
notebooklm generate slide-deck

<span class="c"># 信息图</span>
notebooklm generate infographic <span class="nt">--orientation</span> portrait

<span class="c"># 思维导图</span>
notebooklm generate mind-map

<span class="c"># 数据表（用自然语言描述结构）</span>
notebooklm generate data-table <span class="s2">"对比各论文的核心方法、数据集、评测指标"</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">--wait</code> 参数会一直 poll 到任务完成，省掉自己写轮询逻辑。</p>

<h3 id="45-批量下载重头戏">4.5 批量下载（重头戏）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm download audio              ./podcast.mp3
notebooklm download video              ./overview.mp4
notebooklm download cinematic-video    ./documentary.mp4
notebooklm download quiz       <span class="nt">--format</span> markdown ./quiz.md
notebooklm download flashcards <span class="nt">--format</span> json     ./cards.json
notebooklm download slide-deck         ./slides.pdf       <span class="c"># 也支持 .pptx</span>
notebooklm download infographic        ./infographic.png
notebooklm download mind-map           ./mindmap.json
notebooklm download data-table         ./data.csv
</code></pre></div></div>

<p>注意 quiz / flashcards 的 <code class="language-plaintext highlighter-rouge">--format</code> 选项，<strong>这是 Web UI 完全没有的能力</strong>。</p>

<h3 id="46-诊断命令">4.6 诊断命令</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm auth check <span class="nt">--test</span>     <span class="c"># 检查登录状态</span>
notebooklm metadata <span class="nt">--json</span>       <span class="c"># 输出当前笔记本元数据</span>
notebooklm share status          <span class="c"># 查看分享设置</span>
notebooklm language list         <span class="c"># 列出 50+ 语言代码</span>
</code></pre></div></div>

<hr />

<h2 id="五python-api异步全家桶">五、Python API：异步全家桶</h2>

<p>CLI 适合写脚本，Python API 适合接进自己的应用。整个库基于 <code class="language-plaintext highlighter-rouge">asyncio</code>，下面是一个标准用法：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">asyncio</span>
<span class="kn">from</span> <span class="nn">notebooklm</span> <span class="kn">import</span> <span class="n">NotebookLMClient</span>

<span class="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="k">async</span> <span class="k">with</span> <span class="k">await</span> <span class="n">NotebookLMClient</span><span class="p">.</span><span class="n">from_storage</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
        <span class="c1"># 1. 创建笔记本，导入网页
</span>        <span class="n">nb</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">notebooks</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="s">"Research"</span><span class="p">)</span>
        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">sources</span><span class="p">.</span><span class="n">add_url</span><span class="p">(</span>
            <span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
            <span class="s">"https://example.com"</span><span class="p">,</span>
            <span class="n">wait</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="p">)</span>

        <span class="c1"># 2. 提问
</span>        <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">chat</span><span class="p">.</span><span class="n">ask</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span> <span class="s">"Summarize this"</span><span class="p">)</span>
        <span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">answer</span><span class="p">)</span>

        <span class="c1"># 3. 生成 + 下载播客
</span>        <span class="n">status</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">generate_audio</span><span class="p">(</span>
            <span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
            <span class="n">instructions</span><span class="o">=</span><span class="s">"make it fun"</span><span class="p">,</span>
        <span class="p">)</span>
        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">wait_for_completion</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span> <span class="n">status</span><span class="p">.</span><span class="n">task_id</span><span class="p">)</span>
        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">download_audio</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span> <span class="s">"podcast.mp3"</span><span class="p">)</span>

        <span class="c1"># 4. 生成 + 导出测验为 JSON
</span>        <span class="n">status</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">generate_quiz</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">)</span>
        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">wait_for_completion</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span> <span class="n">status</span><span class="p">.</span><span class="n">task_id</span><span class="p">)</span>
        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">download_quiz</span><span class="p">(</span>
            <span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
            <span class="s">"quiz.json"</span><span class="p">,</span>
            <span class="n">output_format</span><span class="o">=</span><span class="s">"json"</span><span class="p">,</span>
        <span class="p">)</span>

        <span class="c1"># 5. 生成 + 导出思维导图 JSON
</span>        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">generate_mind_map</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">)</span>
        <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">artifacts</span><span class="p">.</span><span class="n">download_mind_map</span><span class="p">(</span><span class="n">nb</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span> <span class="s">"mindmap.json"</span><span class="p">)</span>

<span class="n">asyncio</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
</code></pre></div></div>

<p>几个关键点：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">NotebookLMClient.from_storage()</code> 会自动读 <code class="language-plaintext highlighter-rouge">~/.notebooklm/storage_state.json</code>，<strong>不需要你管 cookie</strong></li>
  <li><code class="language-plaintext highlighter-rouge">async with</code> 会保证 client 优雅退出，连接不泄漏</li>
  <li>所有生成类操作都返回 <code class="language-plaintext highlighter-rouge">task_id</code>，配合 <code class="language-plaintext highlighter-rouge">wait_for_completion</code> 实现异步轮询</li>
  <li><code class="language-plaintext highlighter-rouge">download_quiz</code> 这种 API 多了一个 <code class="language-plaintext highlighter-rouge">output_format</code> 参数——这就是 Web UI 拿不到的”结构化导出”</li>
</ul>

<hr />

<h2 id="六ai-agent-集成让-claude-code--hermes-直接驱动-notebooklm">六、AI Agent 集成：让 Claude Code / Hermes 直接驱动 NotebookLM</h2>

<p>这是整个项目最有想象力的玩法——<strong>把 NotebookLM 变成 AI Agent 的工具</strong>。</p>

<h3 id="61-claude-code--openclaw">6.1 Claude Code / OpenClaw</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npx skills add win4r/notebooklm-py
</code></pre></div></div>

<p>一行命令搞定。装完之后，Claude Code 就能用自然语言驱动整个 NotebookLM 流程，比如你跟它说：</p>

<blockquote>
  <p>“把这 10 篇论文导入新笔记本，生成一个深度播客和思维导图，导出到 ./output/”</p>
</blockquote>

<p>它会自己去调 <code class="language-plaintext highlighter-rouge">notebooklm create</code> → <code class="language-plaintext highlighter-rouge">source add</code> → <code class="language-plaintext highlighter-rouge">generate audio</code> → <code class="language-plaintext highlighter-rouge">download</code> 全流程。</p>

<h3 id="62-claude-code-的-agents-目录方式">6.2 Claude Code 的 <code class="language-plaintext highlighter-rouge">.agents/</code> 目录方式</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>notebooklm skill <span class="nb">install</span>
</code></pre></div></div>

<p>会把 Skill 写到当前项目的 <code class="language-plaintext highlighter-rouge">.agents/</code> 下，<strong>只在当前项目生效</strong>，适合给具体项目定制。</p>

<h3 id="63-hermes-agent">6.3 Hermes Agent</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hermes skills tap add win4r/notebooklm-py
hermes skills <span class="nb">install </span>win4r/notebooklm-py/skills/notebooklm <span class="nt">--force</span>
</code></pre></div></div>

<p>记得<strong>先装 Python 包</strong>（参见第二节），并且把自动刷新命令塞到 <code class="language-plaintext highlighter-rouge">~/.hermes/.env</code>：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NOTEBOOKLM_REFRESH_CMD=notebooklm login --browser-cookies chrome
</code></pre></div></div>

<p>Hermes 子进程会自动继承这个环境变量，cookie 过期不用你管。</p>

<hr />

<h2 id="七几个真实可玩的场景">七、几个真实可玩的场景</h2>

<h3 id="场景一论文自动播客流水线">场景一：论文自动播客流水线</h3>

<p>每天早上跑一个定时任务：</p>

<ol>
  <li>抓 arxiv 上你订阅的几个分类</li>
  <li>全部 <code class="language-plaintext highlighter-rouge">source add</code> 进同一个笔记本</li>
  <li><code class="language-plaintext highlighter-rouge">generate audio --wait</code></li>
  <li>下载到本地 + 推送到你的播客 RSS</li>
</ol>

<p><strong>通勤路上听昨天的论文摘要</strong>——比逛 Twitter 高效十倍。</p>

<h3 id="场景二课程自动生成学习包">场景二：课程自动生成”学习包”</h3>

<p>老师 / 培训讲师特别适合：</p>

<ol>
  <li>把课件、教材、参考论文塞进笔记本</li>
  <li>一键生成 <strong>PPT + 测验 + 闪卡 + 思维导图</strong></li>
  <li>测验导出 Markdown 直接给学生</li>
  <li>闪卡导出 JSON 喂给 Anki</li>
</ol>

<h3 id="场景三竞品调研机器人">场景三：竞品调研机器人</h3>

<p>接到 Claude Code / OpenClaw 之后：</p>

<blockquote>
  <p>“调研 NotebookLM 的所有竞品，每个都生成一份对比报告，最后产出一张数据表”</p>
</blockquote>

<p>Agent 会自己跑 <code class="language-plaintext highlighter-rouge">add-research</code> → <code class="language-plaintext highlighter-rouge">generate report</code> → <code class="language-plaintext highlighter-rouge">generate data-table</code> → <code class="language-plaintext highlighter-rouge">download data-table</code>，<strong>全程不用你点鼠标</strong>。</p>

<hr />

<h2 id="八踩坑提示">八、踩坑提示</h2>

<ol>
  <li>
    <p><strong>API 不稳定性</strong>：Google 可能随时改内部接口。如果哪天突然报错，先 <code class="language-plaintext highlighter-rouge">git pull</code> 看看 fork 有没有更新，或者去 <a href="https://github.com/teng-lin/notebooklm-py">upstream</a> 看 issue。</p>
  </li>
  <li>
    <p><strong>Cookie 过期</strong>：默认 15-30 分钟，<strong>一定要配 <code class="language-plaintext highlighter-rouge">NOTEBOOKLM_REFRESH_CMD</code></strong>，否则跑长任务跑一半挂掉很烦。</p>
  </li>
  <li>
    <p><strong>Linux + Playwright</strong>：第一次装可能缺系统依赖，跑一下 <code class="language-plaintext highlighter-rouge">playwright install-deps chromium</code> 即可。</p>
  </li>
  <li>
    <p><strong>存储路径</strong>：<code class="language-plaintext highlighter-rouge">~/.notebooklm/storage_state.json</code> 是登录态文件，<strong>别上传到任何地方</strong>（包括 GitHub Gist、ChatGPT 截图）。</p>
  </li>
  <li>
    <p><strong>生产慎用</strong>：再说一遍，这是非官方接口，<strong>千万别接到生产业务</strong>——一旦 Google 改 API，你的服务就挂了。</p>
  </li>
</ol>

<hr />

<h2 id="九总结">九、总结</h2>

<p>如果你符合下面任何一条，这个项目值得花 10 分钟试一下：</p>

<ul>
  <li>✅ 重度 NotebookLM 用户，受够了 Web UI 的批量限制</li>
  <li>✅ 想做”论文 → 播客”或者”课件 → 学习包”的自动化流水线</li>
  <li>✅ 玩 Claude Code / Hermes / OpenClaw，希望给 Agent 加一个”超强研究工具”</li>
  <li>✅ 单纯想白嫖 NotebookLM 的思维导图 / 测验 / PPT 数据，做二次加工</li>
</ul>

<p>项目地址再贴一遍：</p>

<ul>
  <li>🔗 <strong>本期主角（fork）</strong>：<a href="https://github.com/win4r/notebooklm-py">https://github.com/win4r/notebooklm-py</a></li>
  <li>🔗 <strong>upstream 上游</strong>：<a href="https://github.com/teng-lin/notebooklm-py">https://github.com/teng-lin/notebooklm-py</a></li>
</ul>

<p>如果只是普通用法、不需要 Hermes，建议直接用 upstream（更新更快）；如果你是 Hermes 用户或者特别在意安全审计，就用 <code class="language-plaintext highlighter-rouge">win4r</code> 这个 fork（带 audit report 和锁版本）。</p>

<p>NotebookLM 本身已经是 2026 年最被低估的 AI 工具之一，再叠加 <code class="language-plaintext highlighter-rouge">notebooklm-py</code> 之后，它从一个”网页版 AI 研究助手”直接升维成了”<strong>可编程的知识基础设施</strong>“。</p>

<p>值得玩。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="NotebookLM" /><category term="Python" /><category term="CLI" /><category term="Claude Code" /><category term="Hermes Agent" /><category term="OpenClaw" /><category term="AI Agent" /><category term="自动化" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[Google 的 NotebookLM 是当下最强的”个人知识库 + AI 研究助手”之一，但官方 Web 界面有几个老大难问题：]]></summary></entry><entry><title type="html">🚀达到专业设计师水平！ChatGPT Images 2.0深度评测：会思考的图像生成模型！生成中文书法零错别字！还能生成架构图、工程手稿、杂志封面、装修图、老照片修复！超越谷歌Nano Banana！</title><link href="https://www.aivi.fyi//llms/chatgpt-images-2" rel="alternate" type="text/html" title="🚀达到专业设计师水平！ChatGPT Images 2.0深度评测：会思考的图像生成模型！生成中文书法零错别字！还能生成架构图、工程手稿、杂志封面、装修图、老照片修复！超越谷歌Nano Banana！" /><published>2026-04-22T00:00:00+08:00</published><updated>2026-04-22T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/chatgpt-images-2</id><content type="html" xml:base="https://www.aivi.fyi//llms/chatgpt-images-2"><![CDATA[<p>就在昨天，OpenAI又一次”不讲武德”，直接发布 <strong>ChatGPT Images 2.0</strong>。</p>

<p>官方给它的定义只有一句话——</p>

<blockquote>
  <p>“A new era of image generation.”（图像生成的新纪元）</p>
</blockquote>

<p>轻描淡写，却野心毕露。</p>

<hr />

<h2 id="一这一代到底升级了什么">一、这一代，到底升级了什么？</h2>

<p>如果说上一代AI画图是”听得懂话的画师”，那么2.0这一代，更像是一个”既懂设计、又懂排版、还懂文化”的全能创作搭子。</p>

<p>从官方放出的大量样图来看，这次升级主要踩在了几个关键词上：</p>

<h3 id="1-更高的精度与控制greater-precision-and-control">1. 更高的精度与控制（Greater precision and control）</h3>

<p>以前你让AI画一幅海报，得到的可能是”大概那个意思”。现在，连一张桌面截图里的macOS图标、文件命名、窗口层级，它都能精细还原。Designer看了直呼内行。</p>

<h3 id="2-跨语言更强大stronger-across-languages">2. 跨语言更强大（Stronger across languages）</h3>

<p>中文、日文、韩文、阿拉伯文……以往AI一写非英文就变”鬼画符”的尴尬，这次被一次性按住。官方放出的日式漫画、韩屋（hanok）酒店宣传页、泰国街景海报，文字排版几乎可以直接拿去印刷。</p>

<h3 id="3-排版力拉满typography">3. 排版力拉满（Typography）</h3>

<p>Bauhaus风、Art Deco风、法国新浪潮拼贴风、杂志跨页风……这一次它不只是”画图”，而是在做<strong>完整的视觉设计</strong>。</p>

<h3 id="4-风格化精致度stylistic-sophistication">4. 风格化精致度（Stylistic sophistication）</h3>

<p>从电影感人像、夜晚闪光灯抓拍，到超现实主义、seinen黑白漫画，AI的”审美颗粒度”肉眼可见地往上拔了一个段位。</p>

<h3 id="5-思考模式thinking-mode">5. 思考模式（Thinking mode）</h3>

<p>这是最让人兴奋的一点：AI画图开始”先思考再下笔”。你让它解释康托尔对角线论证？它能给你画一张<strong>干净漂亮的教学信息图</strong>；你让它复刻GPT-1论文海报？它能像学术会议poster那样排版严谨。</p>

<hr />

<h2 id="二几个让人哇出声的示例">二、几个让人”哇”出声的示例</h2>

<p>官方放出的几十张样图里，几个场景特别有代表性：</p>

<ul>
  <li>一张<strong>《北美狼群》杂志跨页信息图</strong>，图文混排、比例精准，连小注释都工整；</li>
  <li>一本”<strong>B开头历史</strong>“的真实感手写笔记页，纸张纹理、笔锋、涂改痕迹都到位；</li>
  <li>一张<strong>韩屋高端酒店宣传</strong>，东方美学拿捏得相当稳；</li>
  <li>一张<strong>咖啡馆里两个灰色外星人的写实场景</strong>，荒诞又好笑，但光影完全合理；</li>
  <li>还有一张Brooklyn <strong>Kizuna抹茶店开业海报</strong>，品牌感强到像真的存在。</li>
</ul>

<p>看完只有一个感觉：<strong>设计师的工作流，要重新洗牌了。</strong></p>

<hr />

<h2 id="三它意味着什么">三、它意味着什么？</h2>

<p>坦白说，ChatGPT Images 2.0释放的信号，已经不只是”AI画图变强了”。</p>

<p>它意味着：</p>

<ul>
  <li><strong>内容生产的门槛，又一次被砸穿</strong>。以前需要设计师 + 文案 + 排版 + 摄影协作一整天的活，现在一句prompt可能就是一个下午的事。</li>
  <li><strong>“视觉语言”正在变成一种新的通用语</strong>。跨语言、跨风格、跨媒介的输出能力，让非专业用户也能做出专业级视觉。</li>
  <li><strong>创意行业的价值锚点，会从”执行”往”审美 + 判断 + 叙事”迁移</strong>。会用工具的人不稀奇，能想清楚”要做什么、为什么做”的人，才会越来越贵。</li>
</ul>

<hr />

<h2 id="四在哪里用">四、在哪里用？</h2>

<p>官方已经开放入口，直接在ChatGPT里就能体验（Try in ChatGPT）。有Horizontal / Square / Vertical三种画幅，还新增了Image mode和Classic mode两种模式切换。</p>

<p>建议你今晚就去玩一把，不夸张地说——</p>

<p><strong>你今天玩到的，就是明年广告公司、自媒体、电商设计师正在卷的东西。</strong></p>

<hr />

<h2 id="五视频中的prompt全公开">五、视频中的Prompt全公开</h2>

<p>下面是本期视频中实测用到的所有Prompt，按场景分类整理，方便你直接复制使用。</p>

<h3 id="1-迷宫最短路径">1. 迷宫最短路径</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>用红线划出迷宫从入口到出口的最短路线图：
</code></pre></div></div>

<hr />

<h3 id="2-宋词意境图长相思伤春">2. 宋词意境图：《长相思·伤春》</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>为这首宋词生成一幅与词中意境相匹配的画：

**长相思·伤春**

花又残，雨又寒，
一夜东风吹梦难。
啼莺隔小阑。

柳丝闲，雁书悭，
满地香尘不忍看。
春归人未还。
</code></pre></div></div>

<hr />

<h3 id="3-宋词书法作品">3. 宋词书法作品</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>将这首词生成一张书法作品
</code></pre></div></div>

<hr />

<h3 id="4-慈禧老照片上色">4. 慈禧老照片上色</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>还原成彩色照片
</code></pre></div></div>

<hr />

<h3 id="5-韩熙载夜宴图改油画风格">5. 《韩熙载夜宴图》改油画风格</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>将图像改成油画风格
</code></pre></div></div>

<hr />

<h3 id="6-韩熙载夜宴图还原为真实照片风格">6. 《韩熙载夜宴图》还原为真实照片风格</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>将图像还原为真实的照片风格
</code></pre></div></div>

<hr />

<h3 id="7-手绘涂鸦风格射箭打卡日记">7. 手绘涂鸦风格射箭打卡日记</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>手绘涂鸦风格的射箭打卡日记，竖版构图，米黄色格纹笔记本纸张质感，拼贴风格。页面顶部写着"2026年4月22日 星期三"标题，右上角有黑色素描风格的拉弓射箭男人剪影和手写"ARCHERY"字样。中间部分是手绘的靶场射箭靶纸图案，红黄蓝黑白同心圆箭靶，上面用彩色（绿→黄→橙→红渐变）小箭头标注每一轮射箭的落点，标有第1箭、第2箭、第3箭、第4箭、第5箭节点和对应环数。左侧信息栏用蓝色、红色、绿色马克笔手写记录：地点"大王山射箭馆"、距离"30米"、类型"反曲弓训练"、心率"95bpm"、专注度"2-3区"、每轮得分数据。下方有红色折线图的命中环数曲线
</code></pre></div></div>

<hr />

<h3 id="8-毛坯房装修后照片现代简约">8. 毛坯房装修后照片：现代简约</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>生成这个毛坯房装修后照片，装修风格为现代简约
</code></pre></div></div>

<p>后续修改（北欧风格）：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>再生成一张北欧风格的装修后的照片
</code></pre></div></div>

<hr />

<h3 id="9-古画中老者钓鱼改成路亚钓">9. 古画中老者钓鱼改成路亚钓</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>将图中老者钓鱼的鱼竿换成路亚竿，老者的姿势改成路亚钓
</code></pre></div></div>

<hr />

<h3 id="10-agent-skills架构图">10. Agent Skills架构图</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>阅读Agent Skills官方文档：https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview

然后画出Agent Skills的架构图
</code></pre></div></div>

<hr />

<h3 id="11-ios-app登录页">11. iOS App登录页</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>生成一张iOS端app的登陆页
</code></pre></div></div>

<hr />

<h3 id="12-超写实机械鹤--塔吊概念摄影">12. 超写实机械鹤 / 塔吊概念摄影</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>超写实电影感概念摄影：一只巨型 机械鹤（同时是塔吊） 伫立在建筑工地上——鸟身与长颈由桁架钢架构成，红顶钢喙延伸成塔吊臂，钢索下方正吊起一块混凝土配重；地面有戴安全帽的小工人作尺寸对比，远景是黄昏城市天际线与在建高楼。金属工业细节高度写实，金色 magic hour 落日配冷蓝云层，低角度仰视构图，史诗感十足。视觉双关玩 "crane = 鹤 / 起重机"，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="13-仿time杂志封面">13. 仿TIME杂志封面</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>仿《TIME》杂志封面：标志性红色粗边框 + 白色衬线大号 "TIME" Logo。中央为电影感 CG 视觉：一个巨大暗色多面体悬浮在荒原湿地上，棱边发出蓝色霓虹光，落日余晖与远山剪影，一个小小的人物背影仰望它。下方白色无衬线大字副标题 "[AI超元域]" 与小字说明 "[突破10万粉丝]"。深蓝紫 + 橙色夕阳的高反差末世科技氛围，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="14-1920年巴黎360全景图">14. 1920年巴黎360°全景图</h3>

<p>短版prompt：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Make me a 360 image of Paris in 1920.
</code></pre></div></div>

<p>详细版prompt：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>一张 1920 年代巴黎街头的 360° 全景照片，
等距圆柱投影格式（Equirectangular Projection），宽高比严格为 2:1，
分辨率 8192×4096，适合用于 VR 全景查看器与 Google Street View。

【场景设定】：1920 年的巴黎，春日午后，阳光明媚，
蓝天中飘着几朵松软的积云。画面以街道中央为观察点，
四周 360 度完整展开城市风貌。

【左前方】：经典的巴黎老式咖啡馆"Café de Flore"，
墨绿色遮阳棚、金色手写体店招、藤编椅与圆形大理石桌，
几位戴礼帽的绅士与穿及膝连衣裙、戴钟形帽的女士围坐喝咖啡，
一位穿白围裙黑马甲的侍者正端着托盘走出店门。

【正前方 / 街道中央】：奥斯曼风格的米白色石砌公寓
</code></pre></div></div>

<hr />

<h3 id="15-visual-polyglot--视觉通才杂志风拼贴页">15. “Visual Polyglot / 视觉通才”杂志风拼贴页</h3>

<p>英文标题版：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>创作一幅以 "visual polyglot（视觉通才）" 为主题的杂志风拼贴页，画面中央标题为 "Create Everything at Once"。采用非网格的、发散式的艺术排版，融合科学图解、元素周期表、太阳系、中世纪手稿、植物与解剖插图、古地图、工程图纸、多语言文字、漫画分格、UI 截图、蝴蝶标本、图表、建筑蓝图、像素艺术、雕塑、绘画等多元视觉元素。整体呈现高端研究宣言或博物馆式宣言的气质：优雅、有野心，色彩鲜艳（避免米色调）。4:5 竖版，除中央标题外不添加其他说明文字（作为画面一部分的文字可以保留）。
</code></pre></div></div>

<p>中文标题版：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>杂志风拼贴艺术海报，中央大标题 "一次创造万物"。发散式自由排版（非网格），融合科学图解、周期表、太阳系、古地图、中世纪手稿、植物与解剖插画、建筑蓝图、漫画分格、UI 截图、蝴蝶标本、像素艺术、雕塑与绘画等多元视觉元素。博物馆宣言式的优雅气质，色彩鲜艳（避免米色调），4:5 竖版，除中央标题外不加额外说明文字。
</code></pre></div></div>

<hr />

<h3 id="16-餐巾纸铅笔速写肖像">16. 餐巾纸铅笔速写肖像</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>一张放在木桌上的白色餐巾纸,上面用铅笔速写一位长发女性的正面肖像,旁边有一圈淡淡的咖啡渍,手机随手拍摄。
</code></pre></div></div>

<hr />

<h3 id="17-厚涂油画笔触日系动漫插画">17. 厚涂油画笔触日系动漫插画</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>厚涂油画笔触的日系动漫插画：一位黑色齐刘海长发少女站在东京原宿街头，穿着宽松白色连帽卫衣，卫衣上点缀着随性的彩色油画笔触；背景是 "原宿"、"Laforet" 招牌和熙攘人群的色块化建筑。印象派厚涂油画质感，紫青橙黄的高饱和互补配色，青春文艺氛围，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="18-广州手绘水彩旅行攻略海报">18. 广州手绘水彩旅行攻略海报</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>手绘水彩插画风旅行攻略海报：以 [广州] 行政区划地图为主体，每个区用糖果色水彩块填色，虚线分界；地图上手绘当地地标建筑、山水、美食小图标。顶部糖果色描边手写体大标题 "[广州]吃货和游玩地图"，搭配太阳、彩虹、云朵、帆船等可爱贴纸。四周圆角卡片分区列出"玩/吃"要点并配美食插画；右下角戴渔夫帽、拿糖葫芦和相机的卡通女孩吉祥物，左下角木牌写 "快乐出游 快乐干饭"。暖米黄背景 + 高饱和糖果色，小红书治愈风，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="19-19世纪末美好年代学院派油画肖像">19. 19世纪末美好年代学院派油画肖像</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>19 世纪末美好年代学院派油画肖像（Sargent / Boldini 风格）：一位端庄优雅的年轻女士四分之三侧身站在昏暗的古典厅室内，深色盘发、柔光打亮面部。她身穿紧身胸衣 + 泡泡短袖的拖地长 A 字晚礼服，裙身如同一幅展开的风景油画——胸口是远方城堡，从腰际到裙摆绘着山谷、河流、树林与田园，颜料笔触与丝缎褶皱浑然一体。左侧有刺绣白纱帘与窗框，右侧深绿墙面前一张巴洛克雕花木桌与瓷瓶。厚涂油画技法，暖棕、奶白、墨绿的古典配色，戏剧性明暗对比，博物馆藏画气质，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="20-工程手稿风格火箭涂鸦">20. 工程手稿风格火箭涂鸦</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>桌面近摄照片：一页米白色笔记本纸斜放在深色木桌上，背景浅景深虚化，右上方一束柔和窗光。纸上是一枚用红蓝两色蜡笔涂鸦的卡通火箭（线条粗糙、颜色涂不均、有蜡笔颗粒感），旁边用黑色圆珠笔手写英文工程笔记，关键词加下划线并用手绘小箭头指向火箭部位，内容如 "Images 2.0 with thinking"、"Stage II — Liquid fuel, gimballed engine"、"Payload 3000 lbs"、"thrust"、"ORION"。童趣 + 工程手稿感，米色纸张 + 红蓝蜡笔 + 黑笔字的低饱和暖调，写实摄影质感，4:5 竖版。
</code></pre></div></div>

<hr />

<h2 id="六未一一展示的彩蛋prompt">六、未一一展示的彩蛋Prompt</h2>

<p>字幕最后说还有很多图像没有逐一展示，prompt也一并放在笔记中，供大家继续探索。</p>

<h3 id="211-纽约时报头版风格">21.1 纽约时报头版风格</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>一张仿《纽约时报》头版报纸被斜放在深色木桌上的 45° 俯拍写实照片，暖色侧光，纸张有真实褶皱与新闻纸质感。严格遵守 NYT 排版：哥特体报头、日期版次、多栏 Serif 衬线正文；大通栏主标题 "[AI超元域]"，副标题 "[突破10万粉丝]"；中央一张大幅黑白新闻摄影配图，左右两栏为 "Wall Street Reacts" 和 "What This Means" 分栏评论，底部含一条走势折线图。写实摄影风格，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="212-复古剪贴拼贴海报">21.2 复古剪贴拼贴海报</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>复古剪贴拼贴海报（欧式老杂志 / 丝网印刷风），米白毛糙纸张质感。上半部为撕边拼贴：一位条纹衫黑白老照片女郎正看着一份旧报纸，背景由红、黄、蓝三色撕纸色块与黑白街景、法文字片拼接。中部是巨大、错落叠压的粗体无衬线三原色大标题 "GPT Image 2.0"（GPT 黑、Image 红、2.0 蓝），下方黑色粗笔刷横条压着白字 "即将上线"。底部大号黑色衬线中文标题 "OpenAI 正式推出 ChatGPT Images 2.0"，再下方一排社交平台图标与账号。红黄蓝三原色 + 黑白照片的达达主义配色，撕边毛边颗粒感，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="213-瑞士国际主义--包豪斯海报">21.3 瑞士国际主义 / 包豪斯海报</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>瑞士国际主义 / 包豪斯风格海报，做旧米白褶皱纸张质感。左侧大号黑色无衬线粗体中文标题 "正式推出 ChatGPT Images 2.0"，下方红色副标题 "图像生成的新纪元"，再下方多段左对齐小字正文排版；右侧为蒙德里安式几何构成：正红圆形、蓝色矩形、黄色方块、黑色半圆与平行黑色细条纹，由垂直水平基准线精确切分。米白 + 红蓝黄 + 黑的克制三原色配色，理性克制的宣言式气质，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="214-俯拍创意工具桌面海报">21.4 俯拍创意工具桌面海报</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>俯拍平铺摄影海报：浅灰色设计师桌面正上方视角，中央是一台显示彩色画面的宽屏显示器，周围对称整齐地排列着相机镜头、音箱、笔、剪刀、平板、调色盘、色卡、颜料瓶等创意工具。画面中央叠加大号白色无衬线中文标题 "一次创造万物"，下方小字 "即将上线"。写实摄影质感，整洁专业，4:5 竖版。
</code></pre></div></div>

<hr />

<h3 id="215-color-block极简摄影">21.5 Color Block极简摄影</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Color block 极简摄影美学,正面平视视角,一栋粉色平顶小屋孤立在橙红色沙漠中,天空是一整块纯钴蓝,屋顶有一根薄荷绿的烟囱;画面被水平分割成三大色块(天空 / 房子 / 地面),对称、安静、超现实,Palm Springs 中世纪建筑风格,强烈的几何秩序感。
</code></pre></div></div>

<hr />

<h3 id="216-risograph胖橘猫">21.6 Risograph胖橘猫</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Risograph 印刷风格插画,荧光粉与薄荷绿双色套印,一只坐着的胖橘猫正面肖像,轮廓用粗黑线勾勒,毛发以半调网点表现;背景是简单的几何图形和手写英文字母拼贴;油墨不均、略有错版、纸面有轻微颗粒与折痕,温暖的手工感,独立艺术家 zine 风格。
</code></pre></div></div>

<hr />

<h3 id="217-双色朋克海报">21.7 双色朋克海报</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>理想孔版印刷(Risograph)风格的双色海报,荧光粉红与荧光绿两种专色套印,画面中央是一个张大嘴尖叫的朋克青年,头发竖起呈锐利的尖刺状,背后有爆炸式放射图形;左右两侧拼贴着模糊的黑色人物剪影,边缘粗糙像被撕下的报纸;整体带有明显的半调网点、颗粒噪点、油墨错位和纸张折痕,低保真 DIY 朋克 zine 美学,1980年代地下音乐海报感。
</code></pre></div></div>

<hr />

<h3 id="218-植物图鉴风格插页">21.8 植物图鉴风格插页</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>维多利亚时代植物图鉴风格插页，泛米色旧纸质感。顶部页眉 "BOTANICAL ATLAS · PLATE XLVII · NATURAL HISTORY"，中央用花体 Serif 大字写学名 "[拉丁学名]"，下方副标题 "[植物俗名] / Family, [科名]"。中心是水彩钢笔线描的盆栽主图，周围环绕多个标号小图（Fig. 2 花正面、Fig. 3 花纵剖、Fig. 4 叶、Fig. 5 根茎、Fig. 6 雄蕊与雌蕊、Fig. 7/8 花苞），用细线引出各部位英文术语标注，说明文字为古典衬线小字。彩蛋：在其中一个花苞内藏着一位透翅花仙子，用同样严谨的博物学口吻把她作为物种描述。水彩 + 钢笔描边，典雅橙红与叶绿配色，四角有小卷草装饰
</code></pre></div></div>

<hr />

<h2 id="写在最后">写在最后</h2>

<p>每一次OpenAI的更新，都像是在提醒我们一句老话——</p>

<blockquote>
  <p>“工具永远不会淘汰人，但会用工具的人，会。”</p>
</blockquote>

<p>这一次，轮到图像生成了。</p>

<p>你准备好了吗？👀</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="ChatGPT" /><category term="OpenAI" /><category term="Images 2.0" /><category term="AI画图" /><category term="图像生成" /><category term="Prompt" /><category term="视觉设计" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[就在昨天，OpenAI又一次”不讲武德”，直接发布 ChatGPT Images 2.0。]]></summary></entry><entry><title type="html">🚀Hermes Agent高级玩法之三大隐藏技能全公开！Ollama云端免费模型+Open WebUI美化界面+主副模型省Token配置，稳定性碾压小龙虾，一键部署免费云端模型完整教程，小白3分钟上手</title><link href="https://www.aivi.fyi//llms/hermes-agent-advanced" rel="alternate" type="text/html" title="🚀Hermes Agent高级玩法之三大隐藏技能全公开！Ollama云端免费模型+Open WebUI美化界面+主副模型省Token配置，稳定性碾压小龙虾，一键部署免费云端模型完整教程，小白3分钟上手" /><published>2026-04-21T00:00:00+08:00</published><updated>2026-04-21T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/hermes-agent-advanced</id><content type="html" xml:base="https://www.aivi.fyi//llms/hermes-agent-advanced"><![CDATA[<p>🔥 本期内容全面公开 Hermes Agent 的三大进阶玩法：<strong>Ollama 一键集成免费云端模型</strong>、<strong>Open WebUI 美化交互界面</strong>、<strong>主副模型分工省 Token 配置</strong>。从零基础小白到高级玩家，都能找到适合自己的方案。</p>

<p>💡 方案一适合想要<strong>零配置、零成本</strong>快速上手的新手；方案二解决了聊天软件中使用 Hermes 的各种痛点，带来<strong>媲美 ChatGPT 的交互体验</strong>；方案三则是高阶省钱技巧——用<strong>主副模型分工</strong>策略大幅降低 Token 消耗。</p>

<hr />

<h2 id="一方案一ollama-一键集成-hermes-agent免费云端模型">一、方案一：Ollama 一键集成 Hermes Agent（免费云端模型）</h2>

<h3 id="11-适用场景">1.1 适用场景</h3>

<ul>
  <li>想在 Hermes Agent 中使用 <strong>免费模型</strong></li>
  <li>想在本地部署 <strong>开源模型</strong></li>
  <li>想要 <strong>一键部署配置</strong>，无需复杂手动安装</li>
</ul>

<h3 id="12-核心优势">1.2 核心优势</h3>

<p>Ollama <strong>已内置 Hermes Agent</strong>，所以不需要单独部署 Hermes，只需要：</p>

<ol>
  <li>下载安装 Ollama</li>
  <li>执行一条命令</li>
  <li>傻瓜化完成 Hermes 的配置与运行</li>
</ol>

<h3 id="13-操作步骤">1.3 操作步骤</h3>

<p><strong>Step 1：下载并安装 Ollama</strong></p>

<ul>
  <li>前往 Ollama 官方网站</li>
  <li>根据自己的操作系统选择对应版本下载</li>
  <li>安装完成后打开 Ollama</li>
</ul>

<p><strong>Step 2：查看集成项</strong></p>

<p>打开 Ollama 后可以看到已集成：</p>

<ul>
  <li>OpenClaw</li>
  <li>Claude Code</li>
  <li>Codex</li>
  <li><strong>Hermes Agent</strong></li>
</ul>

<p><strong>Step 3：复制启动命令并在终端执行</strong></p>

<p>在 Ollama 界面复制 Hermes 的启动命令，回到终端运行，进入模型选项界面。</p>

<p><strong>Step 4：选择模型</strong></p>

<p>推荐模型列表中，<strong>前几个模型后缀带 <code class="language-plaintext highlighter-rouge">Cloud</code></strong>，表示可通过 Ollama 云端使用（<strong>不占用本地资源</strong>）。</p>

<p>演示中选择的是：<code class="language-plaintext highlighter-rouge">MiniMax M2.7</code></p>

<p><strong>Step 5：登录账号</strong></p>

<ul>
  <li>浏览器会弹出登录页面</li>
  <li>随便登录一个账号</li>
  <li>点击”连接”按钮</li>
  <li>提示”设备连接成功”</li>
</ul>

<p><strong>Step 6：完成 Gateway 刷新与 App 连接</strong></p>

<ul>
  <li>返回终端点击”继续”</li>
  <li>Hermes Agent Gateway 开始刷新</li>
  <li>选择需要连接的 App（上期视频演示过连接到微信）</li>
  <li>跳过可进入 Hermes Agent 终端聊天界面</li>
</ul>

<p><strong>Step 7：验证模型</strong></p>

<p>提问”你是什么模型”，返回：<strong>MiniMax M2.7 云端版本</strong> ✅</p>

<h3 id="14-ollama-方案总结">1.4 Ollama 方案总结</h3>

<table>
  <thead>
    <tr>
      <th>特性</th>
      <th>说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>✅ 部署方式</td>
      <td>一条命令完成全部配置</td>
    </tr>
    <tr>
      <td>✅ 费用</td>
      <td>免费使用云端模型额度</td>
    </tr>
    <tr>
      <td>✅ 资源占用</td>
      <td>零本地资源占用</td>
    </tr>
    <tr>
      <td>✅ 上手难度</td>
      <td>适合新手小白快速上手</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="二方案二open-webui--hermes-agent最佳交互体验">二、方案二：Open WebUI + Hermes Agent（最佳交互体验）</h2>

<h3 id="21-为什么不推荐在聊天软件中使用-hermes-agent">2.1 为什么不推荐在聊天软件中使用 Hermes Agent</h3>

<p>直接在聊天软件中使用 Hermes Agent 存在以下局限：</p>

<ol>
  <li>当 Hermes Agent 直接运行在电脑上时，再去用聊天工具访问显得<strong>比较麻烦</strong></li>
  <li>很多聊天工具<strong>不支持 Markdown 格式解析</strong></li>
  <li>单窗口下会产生非常多轮对话，<strong>难以管理历史</strong></li>
</ol>

<h3 id="22-open-webui-的优势">2.2 Open WebUI 的优势</h3>

<p>Hermes Agent <strong>原生支持 Open WebUI</strong>，通过这种方式可以获得以下体验：</p>

<ul>
  <li>✅ 像使用 ChatGPT 一样，<strong>每次会话记录保存在左侧侧边栏</strong></li>
  <li>✅ 可随时查看之前聊过的内容</li>
  <li>✅ 真正解析 Markdown 格式</li>
  <li>✅ 支持 <strong>流式输出</strong></li>
  <li>✅ 代码展示在独立代码块中，方便复制</li>
  <li>✅ 支持 <strong>在线运行代码</strong>（如 Python 冒泡算法）</li>
  <li>✅ 自动生成相关问题推荐，点击即可继续提问</li>
  <li>✅ 支持发音、修改、复制、重新生成回答</li>
  <li>✅ 可以 <strong>搜索对话历史</strong>（示例：搜索”冒泡算法”可快速定位之前的对话）</li>
  <li>✅ 支持上传文件、截图、引用网页、引用笔记、引用知识库、引用其他对话</li>
</ul>

<h3 id="23-完整部署步骤">2.3 完整部署步骤</h3>

<h4 id="step-1安装-open-webui">Step 1：安装 Open WebUI</h4>

<p>按照 Open WebUI 官方仓库的安装命令进行安装，复制官方给出的安装命令，在终端直接执行即可。</p>

<h4 id="step-2修改-hermes-agent-配置文件">Step 2：修改 Hermes Agent 配置文件</h4>

<p>用编辑器（Antigravity / 记事本 / VS Code 均可）打开 Hermes Agent 配置文件，<strong>添加两个参数</strong>：</p>

<table>
  <thead>
    <tr>
      <th>参数</th>
      <th>作用</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>启用 API 服务参数</td>
      <td>为 Hermes Agent 启用 API 服务</td>
    </tr>
    <tr>
      <td>API 密码参数</td>
      <td>为 API 设置访问密码（可自定义）</td>
    </tr>
  </tbody>
</table>

<p>保存配置文件即可。</p>

<blockquote>
  <p>💡 <strong>懒人方案</strong>：也可以直接让 Codex / Claude Code 等任何支持操作本地文件的 Agent，用自然语言描述需求（告诉它配置文件位置和要添加的两个参数），自动完成配置。</p>
</blockquote>

<h4 id="step-3重启-hermes-gateway">Step 3：重启 Hermes Gateway</h4>

<p>在终端执行重启命令，让配置生效。</p>

<h4 id="step-4启动-open-webui">Step 4：启动 Open WebUI</h4>

<p>复制 Open WebUI 官方的启动命令，在终端执行启动。</p>

<h4 id="step-5打开-open-webui-界面">Step 5：打开 Open WebUI 界面</h4>

<p>浏览器访问：<code class="language-plaintext highlighter-rouge">localhost:8080</code></p>

<h4 id="step-6首次配置连接">Step 6：首次配置连接</h4>

<ol>
  <li>点击左下角用户名</li>
  <li>点击 <strong>设置</strong></li>
  <li>点击 <strong>管理员设置</strong></li>
  <li>点击 <strong>连接</strong></li>
  <li>点击 <strong>加号</strong>（+）添加连接</li>
</ol>

<p>配置项填写：</p>

<table>
  <thead>
    <tr>
      <th>字段</th>
      <th>填写内容</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>URL</td>
      <td><code class="language-plaintext highlighter-rouge">http://localhost:8642/v1</code>（本地 Hermes Agent，端口 <code class="language-plaintext highlighter-rouge">8642</code>，后缀 <code class="language-plaintext highlighter-rouge">/v1</code> 表示兼容 OpenAI API 的接口）</td>
    </tr>
    <tr>
      <td>认证</td>
      <td>刚才在配置文件中设置的 API 密码</td>
    </tr>
  </tbody>
</table>

<p>点击 <strong>保存</strong>。</p>

<h4 id="step-7开始使用">Step 7：开始使用</h4>

<ol>
  <li>新开一个对话</li>
  <li>在模型选择下拉中选中 <strong>Hermes Agent</strong></li>
  <li>直接在对话窗口与 Hermes Agent 交互</li>
</ol>

<p><strong>验证测试</strong>：提问”你可以调用哪些 Skill” → 返回 <strong>118 个 Skill</strong> ✅</p>

<h3 id="24-手机端访问局域网方案">2.4 手机端访问（局域网方案）</h3>

<p>可以直接在手机上通过 Open WebUI 与电脑上的 Hermes Agent 交互：</p>

<ol>
  <li>手机浏览器输入：<code class="language-plaintext highlighter-rouge">http://&lt;电脑IP地址&gt;:8080</code></li>
  <li>登录 Open WebUI 账号</li>
  <li>可以设置系统颜色（如浅色模式）</li>
  <li>左侧可看到所有对话历史</li>
  <li>支持新开对话、流式输出</li>
</ol>

<p><strong>手机端效果</strong>：</p>

<ul>
  <li>显示效果非常不错</li>
  <li>支持流式输出</li>
  <li>支持所有桌面端的高级功能（文件上传、截图、知识库引用等）</li>
</ul>

<h3 id="25-公网访问进阶">2.5 公网访问（进阶）</h3>

<p>如果需要在 <strong>公网环境</strong> 通过手机访问本机 Hermes Agent：</p>

<ul>
  <li>可用 <strong>ngrok</strong> 进行内网穿透</li>
  <li>也可用其他开源项目进行内网穿透</li>
</ul>

<hr />

<h2 id="三方案三主副模型分工省-token-核心技巧">三、方案三：主副模型分工（省 Token 核心技巧）</h2>

<p>这是最高阶的玩法——通过配置 <strong>MiniMax-CN 主模型 + Gemini 副模型</strong>，让核心对话走高质量模型，辅助任务走免费/低价模型，从而<strong>大幅节省 Token 消耗</strong>。</p>

<h3 id="步骤-0备份配置">步骤 0：备份配置</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cp</span> ~/.hermes/config.yaml ~/.hermes/config.yaml.bak-<span class="si">$(</span><span class="nb">date</span> +%Y%m%d-%H%M%S<span class="si">)</span>
</code></pre></div></div>

<h3 id="步骤-1配置环境变量">步骤 1：配置环境变量</h3>

<p>编辑 <code class="language-plaintext highlighter-rouge">~/.hermes/.env</code>，确保以下三个 key 存在：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">MINIMAX_CN_API_KEY</span><span class="o">=</span>&lt;你的 MiniMax 国内 key&gt;
<span class="nv">GOOGLE_API_KEY</span><span class="o">=</span>&lt;你的 Google AI Studio key&gt;
<span class="nv">OPENAI_API_KEY</span><span class="o">=</span>&lt;你的 OpenAI key&gt;
</code></pre></div></div>

<h3 id="步骤-2主模型配置">步骤 2：主模型配置</h3>

<p>编辑 <code class="language-plaintext highlighter-rouge">~/.hermes/config.yaml</code>，将 <code class="language-plaintext highlighter-rouge">model:</code> 块改为：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">model</span><span class="pi">:</span>
    <span class="na">api_key</span><span class="pi">:</span> <span class="s">env:MINIMAX_CN_API_KEY</span>
    <span class="na">base_url</span><span class="pi">:</span> <span class="s">https://api.minimaxi.com/anthropic</span>
    <span class="na">default</span><span class="pi">:</span> <span class="s">MiniMax-M2.7</span>
    <span class="na">provider</span><span class="pi">:</span> <span class="s">minimax-cn</span>
</code></pre></div></div>

<p><strong>要点：</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">base_url</code> <strong>不要带 <code class="language-plaintext highlighter-rouge">/v1</code></strong>（SDK 自动追加）</li>
  <li>模型 ID 大小写敏感：<code class="language-plaintext highlighter-rouge">MiniMax-M2.7</code></li>
  <li><code class="language-plaintext highlighter-rouge">provider</code> 必须是 <code class="language-plaintext highlighter-rouge">minimax-cn</code>（国内端点）</li>
</ul>

<h3 id="步骤-3副模型配置auxiliary">步骤 3：副模型配置（auxiliary）</h3>

<p><code class="language-plaintext highlighter-rouge">auxiliary:</code> 块保持如下结构，全部走 <strong>Gemini 2.5 Flash</strong>（免费额度大、速度快）：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">auxiliary</span><span class="pi">:</span>
    <span class="na">approval</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">compression</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">120</span>
    <span class="na">flush_memories</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">mcp</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">session_search</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">skills_hub</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">title_generation</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">vision</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
        <span class="na">download_timeout</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">web_extract</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">gemini</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">gemini-2.5-flash</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">360</span>
</code></pre></div></div>

<h3 id="步骤-4compression-调优">步骤 4：compression 调优</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">compression</span><span class="pi">:</span>
    <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
    <span class="na">protect_last_n</span><span class="pi">:</span> <span class="m">20</span>
    <span class="na">target_ratio</span><span class="pi">:</span> <span class="m">0.2</span>
    <span class="na">threshold</span><span class="pi">:</span> <span class="m">0.5</span>
</code></pre></div></div>

<blockquote>
  <p>⚠️ 不要在这里放 <code class="language-plaintext highlighter-rouge">summary_model</code> / <code class="language-plaintext highlighter-rouge">summary_provider</code> / <code class="language-plaintext highlighter-rouge">summary_base_url</code>，模型选择统一在 <code class="language-plaintext highlighter-rouge">auxiliary.compression</code> 中配置。</p>
</blockquote>

<h3 id="步骤-5custom_providers可选">步骤 5：custom_providers（可选）</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">custom_providers</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">api_key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
      <span class="na">api_mode</span><span class="pi">:</span> <span class="s">chat_completions</span>
      <span class="na">base_url</span><span class="pi">:</span> <span class="s">https://generativelanguage.googleapis.com/v1beta</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">google-ai</span>
    <span class="pi">-</span> <span class="na">api_key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
      <span class="na">api_mode</span><span class="pi">:</span> <span class="s">anthropic_messages</span>
      <span class="na">base_url</span><span class="pi">:</span> <span class="s">https://api.minimaxi.com/anthropic</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">minimax-custom</span>
</code></pre></div></div>

<p><strong>要点：</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">name</code> 不能与内置 provider 同名</li>
  <li><code class="language-plaintext highlighter-rouge">api_mode</code> 必须与 <code class="language-plaintext highlighter-rouge">base_url</code> 端点格式一致：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">/anthropic</code> → <code class="language-plaintext highlighter-rouge">anthropic_messages</code></li>
      <li><code class="language-plaintext highlighter-rouge">/v1</code> → <code class="language-plaintext highlighter-rouge">chat_completions</code></li>
    </ul>
  </li>
</ul>

<h3 id="步骤-6mcp-servers-api-key">步骤 6：MCP servers API key</h3>

<p>所有 <code class="language-plaintext highlighter-rouge">mcp_servers.*.env</code> 下的 key 都用 <code class="language-plaintext highlighter-rouge">env:</code> 前缀引用，<strong>不要写明文</strong>：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">mcp_servers</span><span class="pi">:</span>
    <span class="na">gbrain</span><span class="pi">:</span>
        <span class="na">command</span><span class="pi">:</span> <span class="s">gbrain</span>
        <span class="na">args</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">serve</span><span class="pi">]</span>
        <span class="na">env</span><span class="pi">:</span>
            <span class="na">OPENAI_API_KEY</span><span class="pi">:</span> <span class="s">env:OPENAI_API_KEY</span>
        <span class="na">connect_timeout</span><span class="pi">:</span> <span class="m">15</span>
        <span class="na">timeout</span><span class="pi">:</span> <span class="m">30</span>
</code></pre></div></div>

<h3 id="步骤-7验证配置">步骤 7：验证配置</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># YAML 语法检查</span>
python3 <span class="nt">-c</span> <span class="s2">"import yaml; yaml.safe_load(open('</span><span class="nv">$HOME</span><span class="s2">/.hermes/config.yaml'))"</span> <span class="o">&amp;&amp;</span> <span class="nb">echo </span>OK

<span class="c"># 配置诊断</span>
hermes doctor

<span class="c"># 功能测试</span>
hermes chat <span class="nt">-q</span> <span class="s2">"Say exactly 'pong' and nothing else."</span> <span class="nt">-Q</span>
</code></pre></div></div>

<p>期望输出：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>session_id: ...
pong
</code></pre></div></div>

<h3 id="回滚方案">回滚方案</h3>

<p>如果配置出现问题，随时可以回滚：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cp</span> ~/.hermes/config.yaml.bak-&lt;时间戳&gt; ~/.hermes/config.yaml
</code></pre></div></div>

<hr />

<h2 id="总结">总结</h2>

<table>
  <thead>
    <tr>
      <th>方案</th>
      <th>适合人群</th>
      <th>核心优势</th>
      <th>难度</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ollama 一键集成</td>
      <td>新手小白</td>
      <td>零配置、免费模型、3分钟上手</td>
      <td>⭐</td>
    </tr>
    <tr>
      <td>Open WebUI</td>
      <td>日常重度使用</td>
      <td>ChatGPT 级交互体验、多端访问</td>
      <td>⭐⭐</td>
    </tr>
    <tr>
      <td>主副模型分工</td>
      <td>高阶玩家</td>
      <td>大幅省 Token、灵活配置</td>
      <td>⭐⭐⭐</td>
    </tr>
  </tbody>
</table>

<p>三个方案可以<strong>组合使用</strong>：用 Ollama 快速启动 + Open WebUI 美化界面 + 主副模型分工省钱，打造最强 Hermes Agent 使用体验！</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Hermes Agent" /><category term="Ollama" /><category term="Open WebUI" /><category term="MiniMax" /><category term="Gemini" /><category term="省Token" /><category term="AI智能体" /><category term="免费模型" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[🔥 本期内容全面公开 Hermes Agent 的三大进阶玩法：Ollama 一键集成免费云端模型、Open WebUI 美化交互界面、主副模型分工省 Token 配置。从零基础小白到高级玩家，都能找到适合自己的方案。]]></summary></entry><entry><title type="html">🚀Hermes Agent高级玩法！微信扫码即用+LLM Wiki知识库+Obsidian图谱，AI知识管理终极方案！人人都可以打造自己的数据飞轮！复刻Andrej Karpathy工作流！保姆级教程</title><link href="https://www.aivi.fyi//llms/hermes-wiki" rel="alternate" type="text/html" title="🚀Hermes Agent高级玩法！微信扫码即用+LLM Wiki知识库+Obsidian图谱，AI知识管理终极方案！人人都可以打造自己的数据飞轮！复刻Andrej Karpathy工作流！保姆级教程" /><published>2026-04-12T00:00:00+08:00</published><updated>2026-04-12T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/hermes-wiki</id><content type="html" xml:base="https://www.aivi.fyi//llms/hermes-wiki"><![CDATA[<p>🔥 本期视频详细演示了Hermes Agent的两大高级功能：<strong>个人微信原生集成</strong>和<strong>LLM Wiki知识库构建</strong>。</p>

<p>📱 首先演示了Hermes Agent连接个人微信的完整流程——扫码登录、配对连接、私聊交互，轻松在微信中调用AI能力。</p>

<p>📚 重点讲解了基于Andrej Karpathy分享的LLM Wiki知识库工作流。通过深入对比传统RAG（无状态碎片检索）与LLM Wiki（有状态知识编辑），揭示了知识复利增长的核心优势。实战演示了：从ArXiv批量摄入论文 → 自动提取结构化知识 → 生成交叉引用的Wiki页面 → 在Obsidian中可视化Graph图谱 → 多Wiki无缝切换与合并。</p>

<p>🏗️ 详细解析了LLM Wiki的三层架构：不可变的原始来源层、Agent驱动的Wiki页面层、人机协同的进化层，真正实现”编译一次，持续更新”的数据飞轮。</p>

<blockquote>
  <p>🚀本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://www.bilibili.com/video/BV1zGD9BrEwe/">👉👉👉 通过哔哩哔哩观看</a></li>
    <li><a href="https://youtu.be/UeI3nR9HLoQ">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<hr />

<p>这个适配器是针对<strong>个人微信账号</strong>的，使用的是腾讯的 <strong>iLink Bot API</strong>。它通过 HTTP 长轮询（long-polling）接收消息，因此<strong>不需要公网端点或 Webhook</strong>。如果你需要企业微信，请使用 WeCom 适配器。</p>

<hr />

<h2 id="前置条件">前置条件</h2>

<ol>
  <li>一个个人微信账号</li>
  <li>Python 包：<code class="language-plaintext highlighter-rouge">aiohttp</code> 和 <code class="language-plaintext highlighter-rouge">cryptography</code></li>
  <li><code class="language-plaintext highlighter-rouge">qrcode</code> 包（可选，用于在终端中显示二维码）</li>
</ol>

<p>安装依赖：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>aiohttp cryptography
<span class="c"># 可选：用于终端二维码显示</span>
pip <span class="nb">install </span>qrcode
</code></pre></div></div>

<hr />

<h2 id="设置步骤">设置步骤</h2>

<h3 id="第一步运行设置向导">第一步：运行设置向导</h3>

<p>执行以下命令：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hermes gateway setup
</code></pre></div></div>

<p>在提示中选择 <strong>Weixin</strong>。向导会自动完成以下操作：从 iLink Bot API 请求二维码 → 在终端显示二维码（或提供一个 URL）→ 等待你用微信手机端扫码 → 提示你在手机上确认登录 → 自动将账号凭证保存到 <code class="language-plaintext highlighter-rouge">~/.hermes/weixin/accounts/</code>。</p>

<p>成功后你会看到类似消息：<code class="language-plaintext highlighter-rouge">微信连接成功，account_id=your-account-id</code></p>

<p>向导会自动保存 <code class="language-plaintext highlighter-rouge">account_id</code>、<code class="language-plaintext highlighter-rouge">token</code> 和 <code class="language-plaintext highlighter-rouge">base_url</code>，无需手动配置。</p>

<h3 id="第二步配置环境变量">第二步：配置环境变量</h3>

<p>QR 登录完成后，在 <code class="language-plaintext highlighter-rouge">~/.hermes/.env</code> 中至少设置 account ID：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">WEIXIN_ACCOUNT_ID</span><span class="o">=</span>your-account-id

<span class="c"># 可选：访问控制</span>
<span class="nv">WEIXIN_DM_POLICY</span><span class="o">=</span>open
<span class="nv">WEIXIN_ALLOWED_USERS</span><span class="o">=</span>user_id_1,user_id_2

<span class="c"># 可选：定时任务/通知的主频道</span>
<span class="nv">WEIXIN_HOME_CHANNEL</span><span class="o">=</span>chat_id
<span class="nv">WEIXIN_HOME_CHANNEL_NAME</span><span class="o">=</span>Home
</code></pre></div></div>

<h3 id="第三步启动网关">第三步：启动网关</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hermes gateway
</code></pre></div></div>

<p>适配器会恢复已保存的凭证，连接 iLink API，并开始长轮询接收消息。</p>

<hr />

<h2 id="主要功能">主要功能</h2>

<p>该适配器支持非常丰富的功能，包括：长轮询传输（无需公网端点）、二维码扫码登录、私聊和群聊消息（可配置访问策略）、媒体支持（图片/视频/文件/语音）、AES-128-ECB 加密的 CDN 媒体传输（自动加解密）、上下文 Token 持久化（重启后保持回复连续性）、Markdown 格式适配（标题/表格/代码块自动转换为微信可读格式）、智能消息分块（4000 字符以内保持单条发送）、输入中提示（”对方正在输入…”）、消息去重（5 分钟滑动窗口）以及自动重试与退避机制。</p>

<hr />

<h2 id="访问策略">访问策略</h2>

<p><strong>私聊策略（DM Policy）</strong> 默认为 <code class="language-plaintext highlighter-rouge">open</code>（任何人可以私聊机器人），可设为 <code class="language-plaintext highlighter-rouge">allowlist</code>（仅白名单用户）、<code class="language-plaintext highlighter-rouge">disabled</code>（忽略所有私聊）或 <code class="language-plaintext highlighter-rouge">pairing</code>（配对模式）。</p>

<p><strong>群聊策略（Group Policy）</strong> 默认为 <code class="language-plaintext highlighter-rouge">disabled</code>（忽略所有群消息，这是有意为之，因为个人微信可能在很多群中）。可设为 <code class="language-plaintext highlighter-rouge">open</code> 或 <code class="language-plaintext highlighter-rouge">allowlist</code>。</p>

<hr />

<h2 id="常见问题排查">常见问题排查</h2>

<ul>
  <li><strong>启动失败提示缺少 aiohttp/cryptography</strong>：执行 <code class="language-plaintext highlighter-rouge">pip install aiohttp cryptography</code></li>
  <li><strong>提示缺少 WEIXIN_TOKEN</strong>：重新运行 <code class="language-plaintext highlighter-rouge">hermes gateway setup</code> 完成扫码登录</li>
  <li><strong>会话过期（errcode=-14）</strong>：重新运行 <code class="language-plaintext highlighter-rouge">hermes gateway setup</code> 扫描新二维码</li>
  <li><strong>机器人不回复私聊</strong>：检查 <code class="language-plaintext highlighter-rouge">WEIXIN_DM_POLICY</code> 是否设为 <code class="language-plaintext highlighter-rouge">allowlist</code> 且发送者不在白名单中</li>
  <li><strong>机器人不回复群消息</strong>：群策略默认为 <code class="language-plaintext highlighter-rouge">disabled</code>，需要设置 <code class="language-plaintext highlighter-rouge">WEIXIN_GROUP_POLICY=open</code> 或 <code class="language-plaintext highlighter-rouge">allowlist</code></li>
  <li><strong>终端二维码无法显示</strong>：安装 <code class="language-plaintext highlighter-rouge">pip install qrcode</code>，或使用终端上方打印的 URL 链接</li>
</ul>

<p>整个流程非常简洁：安装依赖 → 运行 <code class="language-plaintext highlighter-rouge">hermes gateway setup</code> 扫码 → 配置环境变量 → 启动 <code class="language-plaintext highlighter-rouge">hermes gateway</code>，就可以让 Hermes Agent 通过你的个人微信收发消息了。</p>

<h1 id="hermes-agent-llm-wiki-深度分析">Hermes Agent LLM Wiki 深度分析</h1>

<blockquote>
  <p>分析日期: 2026-04-11
数据来源: GitHub PR #5100/#5635、Karpathy Gist、Hermes Agent 官方文档、SkillsLLM</p>
</blockquote>

<hr />

<h2 id="1-概述">1. 概述</h2>

<p>LLM Wiki 是 Andrej Karpathy 于 2026 年 4 月 4 日提出的一种<strong>持久化知识编译模式</strong>，旨在用 LLM 增量构建和维护一个<strong>结构化的 Markdown 知识库</strong>，取代传统 RAG（检索增强生成）每次查询都从头发现知识的低效方式。</p>

<p>Hermes Agent（Nous Research 开发的自改进 AI Agent）在 PR #5100 中首次引入 LLM Wiki 作为内置 Skill，并在 PR #5635 中正式合并，成为<strong>第一个使用全新 Skill Config 接口的技能</strong>。</p>

<h3 id="核心差异llm-wiki-vs-传统-rag">核心差异：LLM Wiki vs 传统 RAG</h3>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>传统 RAG</th>
      <th>LLM Wiki</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>知识发现</td>
      <td>每次查询重新检索</td>
      <td>编译一次，持续更新</td>
    </tr>
    <tr>
      <td>检索单元</td>
      <td>原始文档片段</td>
      <td>结构化 Wiki 页面</td>
    </tr>
    <tr>
      <td>交叉引用</td>
      <td>无</td>
      <td>预先构建</td>
    </tr>
    <tr>
      <td>矛盾检测</td>
      <td>查询时可能发现</td>
      <td>摄入时主动标记</td>
    </tr>
    <tr>
      <td>知识积累</td>
      <td>无累积效应</td>
      <td>每个源使 Wiki 更丰富</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="2-三层架构-three-layer-architecture">2. 三层架构 (Three-Layer Architecture)</h2>

<h3 id="21-原始来源层-raw-sources--不可变">2.1 原始来源层 (Raw Sources) — 不可变</h3>

<ul>
  <li>存放文章、论文、图片、数据文件等原始材料</li>
  <li><strong>不可变 (Immutable)</strong> — LLM 只读不改</li>
  <li>这是事实的源头 (Source of Truth)</li>
  <li>建议通过 <code class="language-plaintext highlighter-rouge">chmod -R a-w raw/</code> 强制文件系统级不可变</li>
  <li>位置：<code class="language-plaintext highlighter-rouge">~/wiki/raw/</code></li>
</ul>

<h3 id="22-wiki-页面层-wiki-pages--agent-拥有">2.2 Wiki 页面层 (Wiki Pages) — Agent 拥有</h3>

<ul>
  <li>LLM 完全拥有和维护的 Markdown 文件目录</li>
  <li>包含：摘要页面、实体页面、概念页面、比较页面、综述、综合分析</li>
  <li>LLM 创建页面、更新内容、维护交叉引用、保持一致性</li>
  <li>人类阅读，LLM 编写</li>
  <li>使用 YAML frontmatter 进行搜索和过滤</li>
  <li>使用 <code class="language-plaintext highlighter-rouge">[[wikilink]]</code> 进行交叉引用</li>
  <li>位置：<code class="language-plaintext highlighter-rouge">~/wiki/wiki/</code></li>
</ul>

<h3 id="23-schema-配置层-schema-config--协同进化">2.3 Schema 配置层 (Schema Config) — 协同进化</h3>

<ul>
  <li>一个告诉 LLM Wiki 结构和约定的文档（如 <code class="language-plaintext highlighter-rouge">SCHEMA.md</code>）</li>
  <li>定义工作流程：摄入源、回答问题、维护 Wiki</li>
  <li>将 LLM 从通用聊天机器人变为纪律严明的 Wiki 维护者</li>
  <li>人类和 LLM 共同演化</li>
  <li>位置：<code class="language-plaintext highlighter-rouge">~/wiki/SCHEMA.md</code></li>
</ul>

<hr />

<h2 id="3-三大核心操作-three-core-operations">3. 三大核心操作 (Three Core Operations)</h2>

<h3 id="31-ingest摄入">3.1 Ingest（摄入）</h3>

<p><strong>流程步骤：</strong></p>

<ol>
  <li>用户将新源丢入 <code class="language-plaintext highlighter-rouge">raw/</code> 目录</li>
  <li>LLM 读取源文档</li>
  <li>与用户讨论关键要点</li>
  <li>在 Wiki 中写入摘要页面</li>
  <li>更新 <code class="language-plaintext highlighter-rouge">index.md</code></li>
  <li>更新相关实体和概念页面（一次摄入可能触及 10-15 个 Wiki 页面）</li>
  <li>追加 <code class="language-plaintext highlighter-rouge">log.md</code> 条目</li>
  <li><strong>重要</strong>：当更新超过 10 个页面时，先询问再批量更新</li>
</ol>

<p><strong>Hermes 增强特性：</strong></p>

<ul>
  <li>Session 导向：每次会话开始时读取 <code class="language-plaintext highlighter-rouge">index.md</code> 定位</li>
  <li>Tag 分类法 (Tag Taxonomy)</li>
  <li>更新策略 (Update Policy)</li>
  <li>扩展指导 (Scaling Guidance)</li>
  <li>日志轮转 (Log Rotation)</li>
  <li>归档工作流 (Archiving Workflow)</li>
</ul>

<h3 id="32-query查询">3.2 Query（查询）</h3>

<p><strong>流程步骤：</strong></p>

<ol>
  <li>用户提出查询问题</li>
  <li>LLM 读取 <code class="language-plaintext highlighter-rouge">index.md</code> 找到相关页面</li>
  <li>深入读取相关页面</li>
  <li>从已编译知识中综合答案（带引用）</li>
  <li>答案可以是多种格式：Markdown 页面、比较表、幻灯片、图表</li>
  <li><strong>关键洞察</strong>：好的答案应被归档回 Wiki 作为新页面</li>
  <li>探索成果像摄入源一样在知识库中复利增长</li>
</ol>

<h3 id="33-lint健康检查">3.3 Lint（健康检查）</h3>

<p><strong>检查维度（Hermes 实现 8 类检查）：</strong></p>

<ol>
  <li>孤立页面 (Orphan Pages) — 无入链的页面</li>
  <li>死链 (Dead Wikilinks) — 指向不存在页面的链接</li>
  <li>矛盾检测 (Contradictions) — 页面间冲突的声明</li>
  <li>缺失页面 (Missing Pages) — 被提及但未创建的概念</li>
  <li>未链接提及 (Unlinked Mentions) — 提到但未建立链接的实体</li>
  <li>不完整元数据 (Incomplete Metadata) — frontmatter 缺失字段</li>
  <li>空白段落 (Empty Sections) — 内容不完整的页面</li>
  <li>过期索引 (Stale Index) — <code class="language-plaintext highlighter-rouge">index.md</code> 与实际内容不一致</li>
</ol>

<hr />

<h2 id="4-导航与索引系统">4. 导航与索引系统</h2>

<h3 id="41-indexmd--内容导向">4.1 index.md — 内容导向</h3>

<ul>
  <li>Wiki 中所有内容的目录</li>
  <li>每个页面含：链接、一行摘要、可选元数据（日期、源数量）</li>
  <li>按类别组织（实体、概念、来源等）</li>
  <li>LLM 每次摄入时更新</li>
  <li>查询时 LLM 先读 index 再定位相关页面</li>
  <li>在中等规模（约 100 个源、数百个页面）下效果很好</li>
</ul>

<h3 id="42-logmd--时间线导向">4.2 log.md — 时间线导向</h3>

<ul>
  <li>追加式的事件记录</li>
  <li>格式：<code class="language-plaintext highlighter-rouge">## [YYYY-MM-DD] action | subject</code></li>
  <li>可用 Unix 工具解析：<code class="language-plaintext highlighter-rouge">grep "^## \[" log.md | tail -5</code></li>
  <li>记录：摄入、查询、Lint 操作</li>
  <li>帮助 LLM 理解最近发生了什么</li>
</ul>

<h3 id="43-hotmd--热缓存hermes-增强">4.3 hot.md — 热缓存（Hermes 增强）</h3>

<ul>
  <li>约 500 词的会话上下文持久化</li>
  <li>消除”我们上次聊到哪里了？”的重新解释问题</li>
  <li>占用不到 0.25% 的上下文窗口</li>
  <li>每次会话节省 2-3K token 的重新解释</li>
</ul>

<hr />

<h2 id="5-hermes-agent-集成细节">5. Hermes Agent 集成细节</h2>

<h3 id="51-skill-config-接口">5.1 Skill Config 接口</h3>

<p>LLM Wiki 是第一个使用 Hermes 新 Skill Config 接口的技能：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># config.yaml</span>
<span class="na">skills</span><span class="pi">:</span>
  <span class="na">config</span><span class="pi">:</span>
    <span class="na">wiki</span><span class="pi">:</span>
      <span class="na">path</span><span class="pi">:</span> <span class="s">~/wiki</span>  <span class="c1"># LLM Wiki 路径</span>
</code></pre></div></div>

<p><strong>实现组件：</strong></p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">agent/skill_utils.py</code>: <code class="language-plaintext highlighter-rouge">extract_skill_config_vars()</code>, <code class="language-plaintext highlighter-rouge">discover_all_skill_config_vars()</code>, <code class="language-plaintext highlighter-rouge">resolve_skill_config_values()</code>, <code class="language-plaintext highlighter-rouge">SKILL_CONFIG_PREFIX</code></li>
  <li><code class="language-plaintext highlighter-rouge">agent/skill_commands.py</code>: <code class="language-plaintext highlighter-rouge">_inject_skill_config()</code> — 将配置注入技能上下文</li>
  <li><code class="language-plaintext highlighter-rouge">hermes_cli/config.py</code>: <code class="language-plaintext highlighter-rouge">get_missing_skill_config_vars()</code>, <code class="language-plaintext highlighter-rouge">migrate_config()</code>, <code class="language-plaintext highlighter-rouge">show_config()</code></li>
</ul>

<h3 id="52-可配置项">5.2 可配置项</h3>

<ul>
  <li>通过 <code class="language-plaintext highlighter-rouge">wiki.path</code> 配置 Wiki 存储路径</li>
  <li>默认路径：<code class="language-plaintext highlighter-rouge">~/wiki</code></li>
  <li>通过 <code class="language-plaintext highlighter-rouge">hermes config migrate</code> 扫描并提示配置</li>
  <li>通过 <code class="language-plaintext highlighter-rouge">hermes config show</code> 显示所有技能配置</li>
</ul>

<h3 id="53-与-hermes-记忆系统的协作">5.3 与 Hermes 记忆系统的协作</h3>

<ul>
  <li>Hermes 自身的 MEMORY.md / USER.md 用于短期交互记忆</li>
  <li>LLM Wiki 用于长期领域知识编译</li>
  <li>FTS5 跨会话搜索与 LLM 摘要互补</li>
  <li>Honcho 用户建模提供用户偏好上下文</li>
</ul>

<hr />

<h2 id="6-使用场景">6. 使用场景</h2>

<h3 id="61-研究深潜">6.1 研究深潜</h3>

<ul>
  <li>数周/数月阅读论文、文章、报告</li>
  <li>增量构建综合 Wiki，形成演进论述</li>
  <li>用 <code class="language-plaintext highlighter-rouge">lint</code> 发现知识空白并指导下一步阅读</li>
</ul>

<h3 id="62-读书笔记">6.2 读书笔记</h3>

<ul>
  <li>按章节归档</li>
  <li>构建角色页面、主题页面、情节线索页面</li>
  <li>类似 Tolkien Gateway 级别的个人读书 Wiki</li>
</ul>

<h3 id="63-商业团队知识库">6.3 商业/团队知识库</h3>

<ul>
  <li>摄入 Slack 对话、会议记录、项目文档、客户电话</li>
  <li>LLM 做人类不想做的维护工作</li>
  <li>通过 Hermes Gateway 跨 15+ 平台自动化</li>
</ul>

<h3 id="64-竞争分析与尽职调查">6.4 竞争分析与尽职调查</h3>

<ul>
  <li>长期追踪公司、市场、技术</li>
  <li>交叉引用多源信息</li>
  <li>自动标记矛盾与过期信息</li>
</ul>

<h3 id="65-个人知识管理">6.5 个人知识管理</h3>

<ul>
  <li>追踪目标、健康、心理、自我提升</li>
  <li>归档日记、文章、播客笔记</li>
  <li>构建结构化的自我认知画像</li>
</ul>

<hr />

<h2 id="7-obsidian-集成">7. Obsidian 集成</h2>

<ul>
  <li>Wiki 目录直接作为 Obsidian Vault 使用</li>
  <li>使用 Obsidian Graph View 查看知识结构</li>
  <li>Obsidian Web Clipper 快速将网页文章转为 Markdown</li>
  <li>Dataview 插件查询 YAML frontmatter</li>
  <li>Marp 插件直接从 Wiki 内容生成演示文稿</li>
  <li>Wiki 本身是 Git 仓库 — 免费版本历史</li>
</ul>

<hr />

<h2 id="8-扩展生态">8. 扩展生态</h2>

<h3 id="81-社区实现">8.1 社区实现</h3>

<ul>
  <li><strong>SwarmVault</strong>: 50+ 格式支持、混合搜索、commit-on-write</li>
  <li><strong>agent-wiki</strong>: Python 工具包、链接感知移动/合并、PDF 转 Markdown</li>
  <li><strong>knowledge-pipline</strong>: BFS 推理链、知识图谱、Louvain 社区检测</li>
  <li><strong>Cortex</strong>: OWL-RL 本体、Oxigraph SPARQL + SQLite FTS5</li>
  <li><strong>ΩmegaWiki</strong>: 北京大学团队的全生命周期研究平台</li>
</ul>

<h3 id="82-cli-工具">8.2 CLI 工具</h3>

<ul>
  <li><strong>qmd</strong>: 本地 Markdown 搜索引擎、BM25/向量混合搜索、LLM 重排</li>
  <li>支持 CLI 和 MCP Server 两种接入方式</li>
</ul>

<hr />

<h2 id="9-设计哲学">9. 设计哲学</h2>

<p>Karpathy 将此理念追溯到 Vannevar Bush 的 Memex (1945)：</p>

<ul>
  <li>个人化、主动策展的知识存储</li>
  <li>文档间的关联和通道与文档本身同等重要</li>
  <li>Bush 无法解决的部分 — 谁来维护 — LLM 解决了这一问题</li>
</ul>

<blockquote>
  <p>“人类的工作是策展来源、指导分析、提出好问题、思考这一切的意义。LLM 的工作是其他一切。”
— Andrej Karpathy</p>
</blockquote>

<hr />

<h2 id="10-已知局限与解决方案">10. 已知局限与解决方案</h2>

<table>
  <thead>
    <tr>
      <th>局限</th>
      <th>解决方案</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>raw/ 不可变仅是口头约定</td>
      <td><code class="language-plaintext highlighter-rouge">chmod -R a-w raw/</code> 文件系统强制</td>
    </tr>
    <tr>
      <td>log.md 格式漂移</td>
      <td>宽松正则 + 格式修复指导</td>
    </tr>
    <tr>
      <td>search_files 工具名可能不匹配</td>
      <td>运行时工具名验证</td>
    </tr>
    <tr>
      <td>Schema 迁移路径</td>
      <td>Lint 检查 frontmatter 与当前 SCHEMA 一致性</td>
    </tr>
    <tr>
      <td>大规模更新风险</td>
      <td>10+ 页面阈值，先确认再批量更新</td>
    </tr>
    <tr>
      <td>知识规模增长后的检索效率</td>
      <td>qmd 混合搜索引擎</td>
    </tr>
    <tr>
      <td>持久化错误复合传播</td>
      <td>矛盾标记 <code class="language-plaintext highlighter-rouge">[!contradiction]</code> + 定期 Lint</td>
    </tr>
  </tbody>
</table>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Hermes Agent" /><category term="LLM Wiki" /><category term="Obsidian" /><category term="Karpathy" /><category term="微信" /><category term="AI智能体" /><category term="知识库" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[🔥 本期视频详细演示了Hermes Agent的两大高级功能：个人微信原生集成和LLM Wiki知识库构建。]]></summary></entry><entry><title type="html">🚀Karpathy知识库工作流终极进化：graphify知识图谱保姆级教程！代码库编译成知识图谱，支持Claude Code/Codex/OpenCode/OpenClaw！支持导出到Obsidian</title><link href="https://www.aivi.fyi//llms/graphify" rel="alternate" type="text/html" title="🚀Karpathy知识库工作流终极进化：graphify知识图谱保姆级教程！代码库编译成知识图谱，支持Claude Code/Codex/OpenCode/OpenClaw！支持导出到Obsidian" /><published>2026-04-07T00:00:00+08:00</published><updated>2026-04-07T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/graphify</id><content type="html" xml:base="https://www.aivi.fyi//llms/graphify"><![CDATA[<p>Graphify 是一个面向 AI 编程助手的「技能插件」（Skill），其核心使命是：<strong>将任意文件夹中的代码、文档、论文、图片转化为一个可查询的知识图谱</strong>。它解决的核心痛点来自一个被 Andrej Karpathy 广泛传播的工作流问题——你有一个 <code class="language-plaintext highlighter-rouge">/raw</code> 文件夹，里面塞满了论文、推文截图、代码片段和笔记，但这些素材之间的关联全在你脑子里，任何 AI 助手想要理解它们就必须把所有文件全读一遍。Graphify 的答案是：一次性构建知识图谱，之后每次查询仅消耗原始 token 的 1/71.5。</p>

<p>该项目是 MIT 许可的开源项目，截至目前已有约 2.2k stars，支持 Claude Code、Codex、OpenCode 和 OpenClaw 四个 AI 编程平台。</p>

<blockquote>
  <p>🚀本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://www.bilibili.com/video/BV1G9DiBSEmj/">👉👉👉 通过哔哩哔哩观看</a></li>
    <li><a href="https://youtu.be/m_5OLW52JwI">👉👉👉 通过YouTube观看</a></li>
    <li><a href="https://github.com/safishamsi/graphify">👉👉👉 GitHub仓库</a></li>
  </ul>
</blockquote>

<hr />

<h2 id="二核心功能全景">二、核心功能全景</h2>

<h3 id="1-双通道提取引擎">1. 双通道提取引擎</h3>

<p>Graphify 的提取分为两个独立的通道，可并行执行：</p>

<p><strong>通道 A — AST 确定性提取</strong>：对代码文件使用 tree-sitter 进行抽象语法树分析，零 LLM 开销。支持 15 种编程语言（Python、TypeScript、JavaScript、Go、Rust、Java、C/C++、Ruby、C#、Kotlin、Scala、PHP、Swift、Lua）。提取内容包括类定义、函数签名、导入关系、调用图、文档字符串，以及带有 <code class="language-plaintext highlighter-rouge"># WHY:</code>、<code class="language-plaintext highlighter-rouge"># HACK:</code>、<code class="language-plaintext highlighter-rouge"># NOTE:</code> 等标记的设计决策注释。</p>

<p><strong>通道 B — 语义提取</strong>：由 LLM 子代理对文档（.md/.txt/.rst）、论文（.pdf）和图片（.png/.jpg/.webp/.gif）进行概念抽取。图片使用视觉模型分析，PDF 进行引用挖掘和概念提取。这一通道会产生 token 消耗。</p>

<h3 id="2-三级置信度标签体系">2. 三级置信度标签体系</h3>

<p>每条关系边都被标记为三级之一：<strong>EXTRACTED</strong>（直接从源码找到的显式关系，置信度固定为 1.0）、<strong>INFERRED</strong>（合理推断的关系，附带 0.6-0.9 的置信度评分）、<strong>AMBIGUOUS</strong>（不确定的关系，标记留待人工审查）。这套体系是 graphify 的核心设计哲学——对自己「找到了什么」和「猜测了什么」保持诚实。</p>

<h3 id="3-图拓扑社区检测">3. 图拓扑社区检测</h3>

<p>使用 Leiden 算法（基于 graspologic 库）进行社区发现，完全基于图的边密度拓扑，不需要任何嵌入向量或向量数据库。LLM 提取出的语义相似性边（<code class="language-plaintext highlighter-rouge">semantically_similar_to</code>，标记为 INFERRED）直接参与社区检测的计算。</p>

<h3 id="4-丰富的输出格式">4. 丰富的输出格式</h3>

<p>一次运行产出四类核心输出：<code class="language-plaintext highlighter-rouge">graph.html</code>（交互式可视化图，支持节点点击、搜索、按社区筛选）、<code class="language-plaintext highlighter-rouge">GRAPH_REPORT.md</code>（包含上帝节点、惊人连接、建议问题的审计报告）、<code class="language-plaintext highlighter-rouge">graph.json</code>（持久化图数据，可跨会话查询）、以及 <code class="language-plaintext highlighter-rouge">cache/</code> 目录（SHA256 缓存，增量更新仅处理变更文件）。</p>

<p>可选输出还包括：Obsidian 知识库（<code class="language-plaintext highlighter-rouge">--obsidian</code>）、SVG 导出（<code class="language-plaintext highlighter-rouge">--svg</code>）、GraphML 格式（<code class="language-plaintext highlighter-rouge">--graphml</code>，供 Gephi/yEd 使用）、Neo4j Cypher 脚本（<code class="language-plaintext highlighter-rouge">--neo4j</code>）、直接推送 Neo4j（<code class="language-plaintext highlighter-rouge">--neo4j-push</code>）、MCP 服务器（<code class="language-plaintext highlighter-rouge">--mcp</code>）、Wiki 风格的 Markdown 知识库（<code class="language-plaintext highlighter-rouge">--wiki</code>）。</p>

<h3 id="5-高级图特性">5. 高级图特性</h3>

<p><strong>超边（Hyperedges）</strong>：捕捉 3 个以上节点之间的群组关系，比如实现同一协议的所有类、认证流程中的所有函数。这是普通的成对边无法表达的关系。</p>

<p><strong>语义相似性边</strong>：跨文件的概念链接，当两个函数解决同一问题但没有任何调用关系时自动建立连接。</p>

<p><strong>设计决策节点（Rationale Nodes）</strong>：从文档和代码注释中提取的「为什么」信息，以 <code class="language-plaintext highlighter-rouge">rationale_for</code> 关系连接到对应的代码元素。</p>

<h3 id="6-运维自动化">6. 运维自动化</h3>

<p><strong>Git Hooks</strong>（<code class="language-plaintext highlighter-rouge">graphify hook install</code>）：安装 post-commit 和 post-checkout 钩子，每次提交和分支切换后自动重建图谱（仅代码文件，无 LLM 开销）。如果重建失败，钩子会以非零退出码结束，Git 会显式地报告错误。</p>

<p><strong>文件监听</strong>（<code class="language-plaintext highlighter-rouge">--watch</code>）：后台监控文件变更，代码变更即时触发 AST 重建，文档/图片变更则通知用户执行 <code class="language-plaintext highlighter-rouge">--update</code>。</p>

<p><strong>反馈回路</strong>：每次 <code class="language-plaintext highlighter-rouge">/graphify query</code> 的问答结果自动保存到 <code class="language-plaintext highlighter-rouge">graphify-out/memory/</code>，下次 <code class="language-plaintext highlighter-rouge">--update</code> 时会被提取为图中的节点，让知识图谱越用越智能。</p>

<hr />

<h2 id="三典型使用场景">三、典型使用场景</h2>

<p><strong>场景 1：快速理解新代码库</strong>。你刚加入一个项目，面对数十个源文件。运行 <code class="language-plaintext highlighter-rouge">/graphify .</code> 后，GRAPH_REPORT 告诉你哪些是「上帝节点」（所有东西都连接到的核心概念），社区结构揭示了模块的真实边界，惊人连接可能揭示出某个看似无关的工具函数实际是性能瓶颈的根源。</p>

<p><strong>场景 2：个人知识库管理</strong>。把论文、推文截图、白板照片、代码实验扔进一个文件夹，graphify 自动将它们连接起来。例如一篇 Transformer 论文中的「注意力机制」概念会与你代码中的 <code class="language-plaintext highlighter-rouge">Attention</code> 类自动建立跨模态关联。</p>

<p><strong>场景 3：大型研究项目的文献管理</strong>。通过 <code class="language-plaintext highlighter-rouge">/graphify add</code> 从 arXiv 拉取论文、从 Twitter/X 抓取推文，自动融入现有图谱。引用图和概念图合二为一，让你发现论文之间的隐藏联系。</p>

<p><strong>场景 4：团队协作中的架构文档自动化</strong>。通过 <code class="language-plaintext highlighter-rouge">--wiki</code> 生成 Wikipedia 风格的知识库，每个社区一篇文章，自动交叉引用。新成员阅读 <code class="language-plaintext highlighter-rouge">index.md</code> 即可导航整个代码库的知识结构。</p>

<hr />

<h2 id="四管线架构">四、管线架构</h2>

<p>根据 ARCHITECTURE.md，整个管线是 <code class="language-plaintext highlighter-rouge">detect() → extract() → build_graph() → cluster() → analyze() → report() → export()</code>，每个阶段是一个独立模块中的单一函数，通过普通 Python 字典和 NetworkX 图进行通信，无共享状态，无副作用（所有输出仅写入 <code class="language-plaintext highlighter-rouge">graphify-out/</code> 目录）。</p>

<p>核心模块包括：detect.py（文件收集与过滤）、extract.py（AST + 语义提取）、build.py（图构建与节点去重）、cluster.py（Leiden 社区检测）、analyze.py（上帝节点/惊人连接/建议问题分析）、report.py（报告生成）、export.py（多格式导出）、security.py（URL 验证、SSRF 防护、Cypher 注入防护等安全模块）。</p>

<hr />

<h2 id="五graphify-如何在-openclaw-中使用">五、Graphify 如何在 OpenClaw 中使用</h2>

<p>这是你问题的核心部分。根据源码和文档的详细分析，在 OpenClaw 中使用 graphify 的完整流程如下：</p>

<h3 id="第一步安装">第一步：安装</h3>

<p>bash</p>

<p>`pip install graphifyy &amp;&amp; graphify install –platform claw</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
这个命令做了一件事：将 `skill-claw.md` 文件复制到 `~/.claw/skills/graphify/SKILL.md`。这个路径是 OpenClaw 读取技能定义的标准位置。

### 第二步：使用 /graphify 命令构建图谱

在 OpenClaw 中打开你的项目，输入：
</code></pre></div></div>
<p>/graphify .`</p>

<p>OpenClaw 会读取 <code class="language-plaintext highlighter-rouge">~/.claw/skills/graphify/SKILL.md</code> 中定义的完整管线指令，按步骤执行。</p>

<h3 id="第三步openclaw-的特殊行为">第三步：OpenClaw 的特殊行为</h3>

<p>OpenClaw 与其他平台有一个关键区别——<strong>语义提取使用顺序模式而非并行模式</strong>。在 skill-claw.md 中明确写到：由于 OpenClaw 的多代理支持尚处于早期阶段，提取过程是逐文件顺序执行的。这意味着相比 Claude Code 的并行子代理提取，OpenClaw 上的首次构建会更慢，但结果完全一致。AST 提取（代码文件）不受此影响，仍然是瞬时完成的。</p>

<h3 id="第四步启用-always-on-模式推荐">第四步：启用 Always-on 模式（推荐）</h3>

<p>bash</p>

<p><code class="language-plaintext highlighter-rouge">graphify claw install</code></p>

<p>这个命令会在你的项目根目录写入一个 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 文件（而非 Claude Code 使用的 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>），其中包含一个 <code class="language-plaintext highlighter-rouge">## graphify</code> 段落，指示 OpenClaw：在回答架构或代码库问题前，先读取 <code class="language-plaintext highlighter-rouge">graphify-out/GRAPH_REPORT.md</code> 了解上帝节点和社区结构；如果存在 <code class="language-plaintext highlighter-rouge">graphify-out/wiki/index.md</code>，优先导航 wiki 而非直接读源文件；修改代码后自动触发图谱重建。</p>

<p>需要注意的是，OpenClaw 不支持 Claude Code 的 PreToolUse hook 机制（该机制能在 Claude 每次执行 Glob/Grep 操作前自动提醒它先查看图谱）。AGENTS.md 是 OpenClaw 上唯一的 always-on 机制。</p>

<h3 id="第五步查询图谱">第五步：查询图谱</h3>

<p>构建完成后，可使用以下命令在 OpenClaw 中交互式探索：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">/graphify query "什么连接了认证模块和数据库？"</code> — BFS 广度遍历</li>
  <li><code class="language-plaintext highlighter-rouge">/graphify query "..." --dfs</code> — DFS 深度追踪特定路径</li>
  <li><code class="language-plaintext highlighter-rouge">/graphify path "AuthModule" "Database"</code> — 两个概念间的最短路径</li>
  <li><code class="language-plaintext highlighter-rouge">/graphify explain "SwinTransformer"</code> — 某个节点的完整解释</li>
</ul>

<h3 id="第六步卸载">第六步：卸载</h3>

<p>bash</p>

<p><code class="language-plaintext highlighter-rouge">graphify claw uninstall</code></p>

<p>这会从 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 中移除 graphify 段落。如果移除后文件为空，会直接删除该文件。</p>

<h3 id="openclaw-集成的技术细节总结">OpenClaw 集成的技术细节总结</h3>

<p>从源码 <code class="language-plaintext highlighter-rouge">__main__.py</code> 可以看到，OpenClaw 的平台配置为：技能文件使用 <code class="language-plaintext highlighter-rouge">skill-claw.md</code>，安装目标路径为 <code class="language-plaintext highlighter-rouge">~/.claw/skills/graphify/SKILL.md</code>，不使用 CLAUDE.md（<code class="language-plaintext highlighter-rouge">claude_md: False</code>）。always-on 集成通过写入项目根目录的 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 实现。Git hooks（<code class="language-plaintext highlighter-rouge">graphify hook install</code>）是跨平台的，在 OpenClaw 上同样适用。</p>

<h2 id="用例一接手一个陌生项目5-分钟建立全局认知">用例一：接手一个陌生项目，5 分钟建立全局认知</h2>

<p>你刚加入团队，面前是一个几十个文件的 Python 项目，完全不知道从哪里看起。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify .
</code></pre></div></div>

<p>graphify 扫描整个目录，代码文件走 tree-sitter AST 提取，文档走语义提取，几分钟后直接在聊天里输出三段关键信息：上帝节点（所有东西都连接到的核心概念，比如某个 <code class="language-plaintext highlighter-rouge">BaseHandler</code> 类被 15 个模块依赖）、惊人连接（你绝对想不到的跨模块关联，比如日志模块和认证模块共享同一个配置解析器）、建议问题（图谱最擅长回答的 4-5 个架构问题）。同时生成 <code class="language-plaintext highlighter-rouge">graphify-out/graph.html</code>，浏览器打开就是一张可交互的节点图，按社区着色，点击任意节点查看它的所有连接。</p>

<p>你不需要读一行代码就已经知道了这个项目的骨架。</p>

<hr />

<h2 id="用例二追踪两个概念之间的依赖链路">用例二：追踪两个概念之间的依赖链路</h2>

<p>你在 code review 时发现改了 <code class="language-plaintext highlighter-rouge">DigestAuth</code> 模块后 <code class="language-plaintext highlighter-rouge">Response</code> 模块的测试挂了，但你不理解它们之间有什么关系。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify path "DigestAuth" "Response"
</code></pre></div></div>

<p>graphify 在已有的知识图谱上跑最短路径算法，返回类似这样的结果：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Shortest path (3 hops):
  DigestAuth --calls--&gt; [EXTRACTED]
  AuthFlow --shares_data_with--&gt; [INFERRED, 0.82]
  RequestBuilder --implements--&gt; [EXTRACTED]
  Response
</code></pre></div></div>

<p>每一跳都标注了关系类型、置信度和源码位置。你立刻知道中间经过了 <code class="language-plaintext highlighter-rouge">AuthFlow</code> 和 <code class="language-plaintext highlighter-rouge">RequestBuilder</code>，而且 <code class="language-plaintext highlighter-rouge">AuthFlow</code> 到 <code class="language-plaintext highlighter-rouge">RequestBuilder</code> 之间的关系是推断出来的（不是显式调用，而是共享数据结构），置信度 0.82。这比自己在代码里追调用链快得多。</p>

<hr />

<h2 id="用例三深度理解某个核心模块">用例三：深度理解某个核心模块</h2>

<p>你想搞清楚项目里最关键的 <code class="language-plaintext highlighter-rouge">Gateway</code> 模块到底做了什么、和谁有关系。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify explain "Gateway"
</code></pre></div></div>

<p>返回该节点的完整连接画像：度数（多少个其他节点连接到它）、所有邻居节点及其关系类型、源码文件位置。然后 Claude 用这些图数据写一段 3-5 句话的结构化解释，每个论断都引用了 <code class="language-plaintext highlighter-rouge">source_location</code>。</p>

<hr />

<h2 id="用例四带着具体问题查询图谱">用例四：带着具体问题查询图谱</h2>

<p>你想知道项目里的错误处理和日志记录之间是怎么协作的。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify query "错误处理和日志记录之间有什么关系？"
</code></pre></div></div>

<p>graphify 用 BFS 从匹配的节点出发，向外探索 3 层邻居，返回相关的子图。Claude 基于子图中的节点、边和置信度标签来回答你的问题，而且只使用图谱中实际存在的信息——如果图谱里没有足够的数据，它会明确告诉你而不是编造。</p>

<p>如果你想追踪一条具体的依赖链而不是看广泛的上下文：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify query "错误处理和日志记录之间有什么关系？" --dfs
</code></pre></div></div>

<p>DFS 模式会沿着一条路径深入追踪到 6 层，适合回答”A 怎么最终影响到 B”这类链式问题。</p>

<hr />

<h2 id="用例五往知识库里添加外部资料">用例五：往知识库里添加外部资料</h2>

<p>你读到一篇和项目相关的论文，想把它纳入图谱。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify add &lt;https://arxiv.org/abs/1706.03762&gt;
</code></pre></div></div>

<p>graphify 自动抓取论文的摘要和元数据，保存为 Markdown 文件到 <code class="language-plaintext highlighter-rouge">./raw</code> 目录，然后自动触发 <code class="language-plaintext highlighter-rouge">--update</code> 管线，只提取这一个新文件并合入现有图谱。论文中的概念会和代码中的已有节点自动建立跨模态关联。</p>

<p>同样支持推文：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify add &lt;https://x.com/karpathy/status/&gt;... --author "Karpathy"
</code></pre></div></div>

<p>也支持任意网页、PDF 链接和图片 URL。</p>

<hr />

<h2 id="用例六代码改了之后增量更新图谱">用例六：代码改了之后增量更新图谱</h2>

<p>你做了一轮重构，改了几个核心文件。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify . --update
</code></pre></div></div>

<p>graphify 比较 SHA256 缓存，只对变更的文件重新提取。如果只改了代码文件，它会自动跳过语义提取（零 LLM 开销，只跑 AST）。更新完成后还会展示图谱 diff——新增了哪些节点、新增了多少条边。</p>

<hr />

<h2 id="用例七让图谱完全自动维护不需要手动操作">用例七：让图谱完全自动维护，不需要手动操作</h2>

<p>你希望图谱永远和代码保持同步，不想记任何命令。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 在终端执行一次</span>
graphify claude <span class="nb">install
</span>graphify hook <span class="nb">install</span>
</code></pre></div></div>

<p>第一条命令做两件事：在项目的 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 里写入指令让 Claude 每次回答架构问题前自动查图谱，并在 <code class="language-plaintext highlighter-rouge">.claude/settings.json</code> 里注册 PreToolUse hook 在每次 Glob/Grep 前自动提醒。第二条命令安装 git post-commit 和 post-checkout 钩子，每次提交和切换分支都自动重建。</p>

<p>装完之后你就可以忘掉 graphify 的存在了。你正常提问，Claude 自动走图谱路径；你正常 commit，图谱自动更新。</p>

<hr />

<h2 id="用例八用-mode-deep-做更激进的关系发现">用例八：用 –mode deep 做更激进的关系发现</h2>

<p>你觉得默认提取太保守，想发现更多潜在的关联。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify . --mode deep
</code></pre></div></div>

<p>deep 模式让语义提取的子代理更激进地推断 INFERRED 边——间接依赖、共享假设、潜在耦合都会被标注出来。不确定的用 AMBIGUOUS 标记而不是省略。适合做架构审计或准备重构前的全面摸底。</p>

<hr />

<h2 id="用例九生成可供团队浏览的-wiki-知识库">用例九：生成可供团队浏览的 Wiki 知识库</h2>

<p>你想让团队其他成员也能浏览项目的知识结构，但他们不用 Claude Code。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify . --wiki
</code></pre></div></div>

<p>生成 <code class="language-plaintext highlighter-rouge">graphify-out/wiki/</code> 目录，包含 <code class="language-plaintext highlighter-rouge">index.md</code> 入口页和每个社区、每个上帝节点的独立文章，带有交叉链接、内聚度评分和审计追踪。任何人用 Markdown 阅读器就能导航整个知识库。</p>

<hr />

<h2 id="用例十导出到外部工具做更深入的分析">用例十：导出到外部工具做更深入的分析</h2>

<p>你想用专业的图分析工具进一步探索。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify . --graphml    # 导出给 Gephi 或 yEd
/graphify . --neo4j      # 生成 Cypher 导入脚本
/graphify . --neo4j-push bolt://localhost:7687  # 直接推到 Neo4j
/graphify . --mcp        # 启动 MCP 服务器，其他 AI agent 可以实时查询
</code></pre></div></div>

<p>MCP 服务器模式特别值得注意——它暴露了 <code class="language-plaintext highlighter-rouge">query_graph</code>、<code class="language-plaintext highlighter-rouge">get_node</code>、<code class="language-plaintext highlighter-rouge">get_neighbors</code>、<code class="language-plaintext highlighter-rouge">shortest_path</code> 等工具接口，可以加入 Claude Desktop 的 MCP 配置，让其他 agent 也能查询这张图谱。</p>

<hr />

<h2 id="用例十一实时监听文件变更自动同步">用例十一：实时监听文件变更自动同步</h2>

<p>你在一个长时间的开发会话中，希望图谱实时跟上你的改动。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify . --watch
</code></pre></div></div>

<p>在后台终端运行。代码文件变更立即触发 AST 重建（无 LLM 开销）；文档或图片变更会写一个 flag 文件并通知你执行 <code class="language-plaintext highlighter-rouge">--update</code>。设有 3 秒防抖，不会因为快速连续保存触发多次重建。</p>

<hr />

<h2 id="用例十二只调整社区划分不重新提取">用例十二：只调整社区划分，不重新提取</h2>

<p>你觉得社区划分不够理想，想用已有的图数据重新跑一次聚类。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/graphify . --cluster-only
</code></pre></div></div>

<p>跳过所有提取步骤，直接加载 <code class="language-plaintext highlighter-rouge">graph.json</code>，重新运行 Leiden 社区检测，重新生成报告和可视化。零 token 开销，几秒完成。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Claude" /><category term="Claude Code" /><category term="Codex" /><category term="Claude Code 2.0" /><category term="Vibe Coding" /><category term="AI智能体" /><category term="graphify" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[Graphify 是一个面向 AI 编程助手的「技能插件」（Skill），其核心使命是：将任意文件夹中的代码、文档、论文、图片转化为一个可查询的知识图谱。它解决的核心痛点来自一个被 Andrej Karpathy 广泛传播的工作流问题——你有一个 /raw 文件夹，里面塞满了论文、推文截图、代码片段和笔记，但这些素材之间的关联全在你脑子里，任何 AI 助手想要理解它们就必须把所有文件全读一遍。Graphify 的答案是：一次性构建知识图谱，之后每次查询仅消耗原始 token 的 1/71.5。]]></summary></entry><entry><title type="html">🦞在OpenClaw实测谷歌开源大模型Gemma 4！256K上下文+多模态输入，小龙虾里实战测试多Agent协作与浏览器自动化全流程！31B参数碾压其他开源大模型！五大维度深度评分结果出人意料</title><link href="https://www.aivi.fyi//llms/Gemm4-in-OpenClaw" rel="alternate" type="text/html" title="🦞在OpenClaw实测谷歌开源大模型Gemma 4！256K上下文+多模态输入，小龙虾里实战测试多Agent协作与浏览器自动化全流程！31B参数碾压其他开源大模型！五大维度深度评分结果出人意料" /><published>2026-04-03T00:00:00+08:00</published><updated>2026-04-03T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/Gemm4-in-OpenClaw</id><content type="html" xml:base="https://www.aivi.fyi//llms/Gemm4-in-OpenClaw"><![CDATA[<p>需要将 OpenClaw 配置为使用 gemma-4-31b-it 作为默认模型，并确保其能够正常工作。</p>

<blockquote>
  <p>🚀本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://www.bilibili.com/video/BV1Ff9gBwESC/">👉👉👉 通过哔哩哔哩观看</a></li>
    <li><a href="https://youtu.be/GJYQ9Aw7wL8">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<h2 id="根本原因"><strong>根本原因</strong></h2>

<p>修复这个问题主要涉及三层兼容性问题：</p>

<ol>
  <li>
    <p><strong>OpenRouter / HuggingFace Router 不支持 Gemma 4 的 tool/function calling</strong></p>

    <p>而 OpenClaw 的 agent 依赖工具调用，因此这些接入方式不可用。</p>
  </li>
  <li>
    <p><strong>OpenClaw 内置的 google/* provider 不包含 Gemma 模型</strong></p>

    <p>因此直接使用内置 Google provider 时，gemma-4-31b-it 会被识别为未知模型。</p>
  </li>
  <li>
    <p><strong>Gemma 4 的流式响应中包含 “thought”: true 的 thinking / reasoning token</strong></p>

    <p>OpenClaw 的响应解析器会尝试将其按结构化 reasoning 输出处理，进而触发 MALFORMED_RESPONSE 错误。</p>
  </li>
</ol>

<h2 id="修复方式"><strong>修复方式</strong></h2>

<p>解决方案是：</p>

<ul>
  <li>使用 <strong>自定义 google-ai provider</strong></li>
  <li>使用 <strong>Google Generative AI 原生 API 格式</strong></li>
  <li>在模型定义中加入 <strong>“reasoning”: false</strong></li>
</ul>

<p>这样可以让 OpenClaw 跳过对 reasoning/thinking token 的解析，从而避免 Gemma 4 的 thought chunk 导致解析失败。</p>

<hr />

<h1 id="需要修改的配置"><strong>需要修改的配置</strong></h1>

<h2 id="1-在openclawopenclawjson"><strong>1. 在~/.openclaw/openclaw.json</strong></h2>

<h2 id="中添加自定义-provider"><strong>中添加自定义 provider</strong></h2>

<p>在 models.providers 下加入：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"google-ai": {
  "baseUrl": "https://generativelanguage.googleapis.com/v1beta",
  "api": "google-generative-ai",
  "authHeader": true,
  "models": [
    {
      "id": "gemma-4-31b-it",
      "name": "Gemma 4 31B IT",
      "reasoning": false,
      "input": ["text", "image"],
      "cost": {
        "input": 0,
        "output": 0
      },
      "contextWindow": 262144,
      "maxTokens": 32768
    }
  ]
}
</code></pre></div></div>

<h2 id="2-在openclawopenclawjson"><strong>2. 在~/.openclaw/openclaw.json</strong></h2>

<h2 id="中设置默认模型和主-agent-模型"><strong>中设置默认模型和主 agent 模型</strong></h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// agents.defaults.model
"primary": "google-ai/gemma-4-31b-it",
"fallbacks": ["minimax/MiniMax-M2.7", "minimax-portal/MiniMax-M2.1"]

// agents.list[0]（主 agent）
"primary": "google-ai/gemma-4-31b-it"

// agents.defaults.models（模型目录项）
"google-ai/gemma-4-31b-it": {
  "alias": "gemma4"
}
</code></pre></div></div>

<h2 id="3-在openclawagentsmainagentauth-profilesjson"><strong>3. 在~/.openclaw/agents/main/agent/auth-profiles.json</strong></h2>

<h2 id="中添加认证配置"><strong>中添加认证配置</strong></h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"google-ai:default": {
  "type": "api_key",
  "provider": "google-ai",
  "key": "&lt;GOOGLE_AI_STUDIO_API_KEY&gt;"
}
</code></pre></div></div>

<h2 id="4-在openclawenv"><strong>4. 在~/.openclaw/.env</strong></h2>

<h2 id="中配置-api-key"><strong>中配置 API Key</strong></h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>GOOGLE_AI_API_KEY=AIza...
</code></pre></div></div>

<hr />

<h1 id="关键点总结"><strong>关键点总结</strong></h1>

<p>要让 OpenClaw 正常使用 Gemma 4 31B IT，核心是三点：</p>

<ul>
  <li>不使用 OpenRouter / HuggingFace Router 作为 Gemma 4 的 tool use 接入方式</li>
  <li>通过自定义 google-ai provider 直连 Google AI Studio</li>
  <li>在模型定义中设置 “reasoning”: false，避免 OpenClaw 解析 Gemma 4 的 thinking token 时出错</li>
</ul>

<hr />]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Claude" /><category term="Claude Code" /><category term="Gemma4" /><category term="Gemma" /><category term="OpenClaw" /><category term="AI智能体" /><category term="TDD" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[需要将 OpenClaw 配置为使用 gemma-4-31b-it 作为默认模型，并确保其能够正常工作。]]></summary></entry><entry><title type="html">🚀深挖50万行源码：Claude Code上下文管理对中文的支持到底差在哪？Token 估算的致命偏差</title><link href="https://www.aivi.fyi//llms/ClaudeCode-SourceCode" rel="alternate" type="text/html" title="🚀深挖50万行源码：Claude Code上下文管理对中文的支持到底差在哪？Token 估算的致命偏差" /><published>2026-04-01T00:00:00+08:00</published><updated>2026-04-01T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/ClaudeCode-SourceCode</id><content type="html" xml:base="https://www.aivi.fyi//llms/ClaudeCode-SourceCode"><![CDATA[<p>Claude Code 是 Anthropic 推出的 AI 编程 CLI 工具，堪称当前最强的 AI 编程助手之一。它的源码规模惊人——约 1,900 个文件、512,000+ 行 TypeScript 代码。</p>

<p>今天我对这份源码进行了深度分析，专注于一个很少有人关注的问题：<strong>Claude Code 的上下文管理和记忆系统，对英文和中文的支持程度是否一样？</strong></p>

<p>结论先行：<strong>英文是原生优化的一等公民，中文存在系统性偏差。</strong></p>

<hr />

<h2 id="一核心问题token-估算的致命偏差">一、核心问题：Token 估算的致命偏差</h2>

<p>整个上下文管理系统的决策基础是一个叫 <code class="language-plaintext highlighter-rouge">roughTokenCountEstimation()</code> 的函数，源码位于 <code class="language-plaintext highlighter-rouge">src/services/tokenEstimation.ts</code> 第 203-208 行：</p>

<div class="language-typescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">export</span> <span class="kd">function</span> <span class="nx">roughTokenCountEstimation</span><span class="p">(</span>
  <span class="nx">content</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span>
  <span class="nx">bytesPerToken</span><span class="p">:</span> <span class="kr">number</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span>
<span class="p">):</span> <span class="kr">number</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="nx">content</span><span class="p">.</span><span class="nx">length</span> <span class="o">/</span> <span class="nx">bytesPerToken</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>逻辑很简单：用 JavaScript 的 <code class="language-plaintext highlighter-rouge">string.length</code>（UTF-16 code unit 数量）除以 4 来估算 token 数。</p>

<p><strong>这个假设完全是为英文设计的。</strong></p>

<p>在英文中，1 个 token 大约对应 4 个字符，所以 <code class="language-plaintext highlighter-rouge">string.length / 4</code> 是一个合理的近似。但在中文里：</p>

<table>
  <thead>
    <tr>
      <th>文本</th>
      <th style="text-align: center">string.length</th>
      <th style="text-align: center">估算 tokens</th>
      <th style="text-align: center">实际 tokens</th>
      <th style="text-align: center">偏差</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>“hello world”</td>
      <td style="text-align: center">11</td>
      <td style="text-align: center">~3</td>
      <td style="text-align: center">~2</td>
      <td style="text-align: center">1.5x 高估（安全）</td>
    </tr>
    <tr>
      <td>“你好世界”</td>
      <td style="text-align: center">4</td>
      <td style="text-align: center"><strong>1</strong></td>
      <td style="text-align: center"><strong>4-6</strong></td>
      <td style="text-align: center"><strong>4-6x 低估（危险）</strong></td>
    </tr>
    <tr>
      <td>400字中文段落</td>
      <td style="text-align: center">400</td>
      <td style="text-align: center">100</td>
      <td style="text-align: center">400-800</td>
      <td style="text-align: center"><strong>4-8x 低估</strong></td>
    </tr>
  </tbody>
</table>

<p><strong>每个中文字在 JavaScript 里只占 1 个 string.length 单位，但在 Claude 的 BPE 分词器中通常需要 1-2 个 token。</strong> 除以 4 之后，中文的 token 数被低估了 4 到 8 倍。</p>

<p>更关键的是，代码中完全没有语言感知的调整——唯一存在的调整是针对 JSON 文件类型（<code class="language-plaintext highlighter-rouge">bytesPerToken = 2</code>），而不是针对语言。</p>

<hr />

<h2 id="二连锁反应auto-compact-触发失效">二、连锁反应：Auto-Compact 触发失效</h2>

<p>这个 token 低估不是孤立的问题，它直接影响了上下文自动压缩（auto-compact）的触发时机。</p>

<p>Claude Code 的 auto-compact 触发逻辑定义在 <code class="language-plaintext highlighter-rouge">src/services/compact/autoCompact.ts</code>：</p>

<ul>
  <li><strong>触发阈值</strong>：当前 token 数 &gt; <code class="language-plaintext highlighter-rouge">effectiveContextWindow - 13,000</code></li>
  <li><strong>当前 token 数</strong>的计算依赖 <code class="language-plaintext highlighter-rouge">tokenCountWithEstimation()</code>，而这个函数底层就是 <code class="language-plaintext highlighter-rouge">roughTokenCountEstimation()</code></li>
</ul>

<p><strong>英文对话：</strong> 估算值接近真实值，auto-compact 在上下文窗口用到 ~93% 时准时触发，平稳压缩。</p>

<p><strong>中文对话：</strong> 估算值只有真实值的 12.5%-25%。系统认为上下文才用了 25%，实际已经 100% 满了。结果是 auto-compact 永远触发不了，直到 API 返回 413 Prompt Too Long 错误，才由反应式压缩（reactive compact）兜底。</p>

<p>这意味着中文用户会经历更多的”上下文突然中断”，而英文用户几乎不会遇到这个问题。</p>

<hr />

<h2 id="三压缩总结英文提示--中文内容--语言混杂">三、压缩总结：英文提示 + 中文内容 = 语言混杂</h2>

<p>当上下文压缩确实被触发后（无论是主动还是被动），系统会调用一个 LLM 来生成结构化摘要。</p>

<p>摘要提示词定义在 <code class="language-plaintext highlighter-rouge">src/services/compact/prompt.ts</code>，包含 9 个英文结构化节：</p>

<ol>
  <li>Primary Request and Intent</li>
  <li>Key Technical Concepts</li>
  <li>Files and Code Sections</li>
  <li>Errors and fixes</li>
  <li>Problem Solving</li>
  <li>All user messages</li>
  <li>Pending Tasks</li>
  <li>Current Work</li>
  <li>Optional Next Step</li>
</ol>

<p><strong>没有中文变体，没有语言适配指令。</strong></p>

<p>虽然系统提示中有一条 <code class="language-plaintext highlighter-rouge">"Always respond in {language}"</code> 指令会传递给压缩子代理，但压缩专用提示本身完全是英文的。这导致：</p>

<ul>
  <li>英文对话 → 英文提示 + 英文内容 = 完美一致</li>
  <li>中文对话 → 英文提示 + 中文内容 = 模型可能产生中英混杂的摘要</li>
</ul>

<p>此外，摘要的最大输出限制是 20,000 tokens。由于中文字符的 token 密度更高（每个字 1-2 tokens vs 英文每个词 1 token），<strong>同样 20K tokens 的预算下，中文摘要能承载的信息量更少。</strong></p>

<hr />

<h2 id="四记忆系统跨语言匹配的隐性降级">四、记忆系统：跨语言匹配的隐性降级</h2>

<p>Claude Code 有一个精巧的记忆系统（<code class="language-plaintext highlighter-rouge">src/memdir/</code>），能从最多 200 个记忆文件中选出 5 个最相关的，注入到当前对话上下文。</p>

<p>选择器使用 Sonnet 模型，接收用户查询和记忆文件清单（文件名 + 描述），返回最匹配的文件名。</p>

<p><strong>关键点：选择器的系统提示是纯英文的。</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"You are selecting memories that will be useful to Claude Code 
as it processes a user's query..."
</code></pre></div></div>

<p>当英文用户查询 “Fix the auth middleware” 匹配英文描述 “Auth middleware gotchas” 时，这是直接的关键词对应。</p>

<p>当中文用户查询 “修复认证中间件的问题” 匹配同一个英文描述时，Sonnet 需要做<strong>跨语言语义推理</strong>——”认证” ↔ “auth”，”中间件” ↔ “middleware”。虽然现代 LLM 有很好的多语言理解能力，但跨语言匹配的精度和可靠性不可避免地低于同语言匹配。</p>

<hr />

<h2 id="五语音输入中文完全缺席">五、语音输入：中文完全缺席</h2>

<p>这是最直观的差距。</p>

<p><code class="language-plaintext highlighter-rouge">src/hooks/useVoice.ts</code> 中定义了 16 种支持的 STT（语音转文字）语言：</p>

<blockquote>
  <p>en, es, fr, <strong>ja</strong>, de, pt, it, <strong>ko</strong>, hi, id, ru, pl, tr, nl, uk, el, cs, da, sv, no</p>
</blockquote>

<p><strong>日语和韩语都有，唯独没有中文（zh）。</strong></p>

<p>作为全球使用人数最多的语言之一，中文在语音输入中的缺席是一个明显的功能空白。</p>

<hr />

<h2 id="六唯一的亮点终端渲染">六、唯一的亮点：终端渲染</h2>

<p>公平地说，Claude Code 在终端显示层面对中文的支持是<strong>合格的</strong>。</p>

<p><code class="language-plaintext highlighter-rouge">src/ink/stringWidth.ts</code> 使用了 <code class="language-plaintext highlighter-rouge">east-asian-width</code> 库和 <code class="language-plaintext highlighter-rouge">Intl.Segmenter</code> 进行字素分割，CJK 全角字符被正确地视为宽度 2。这意味着中文文本在终端界面中的布局和换行是准确的。</p>

<p>但终端渲染只是”展示层”，它不影响上下文管理的核心决策。</p>

<hr />

<h2 id="七全维度评分">七、全维度评分</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">维度</th>
      <th style="text-align: center">English</th>
      <th style="text-align: center">中文</th>
      <th style="text-align: center">差距等级</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Token 估算准确度</td>
      <td style="text-align: center">90%</td>
      <td style="text-align: center">15%</td>
      <td style="text-align: center">严重</td>
    </tr>
    <tr>
      <td style="text-align: left">Auto-Compact 触发时机</td>
      <td style="text-align: center">92%</td>
      <td style="text-align: center">12%</td>
      <td style="text-align: center">严重</td>
    </tr>
    <tr>
      <td style="text-align: left">压缩总结质量</td>
      <td style="text-align: center">95%</td>
      <td style="text-align: center">55%</td>
      <td style="text-align: center">中等</td>
    </tr>
    <tr>
      <td style="text-align: left">记忆召回匹配</td>
      <td style="text-align: center">88%</td>
      <td style="text-align: center">62%</td>
      <td style="text-align: center">轻-中</td>
    </tr>
    <tr>
      <td style="text-align: left">语音输入</td>
      <td style="text-align: center">100%</td>
      <td style="text-align: center">0%</td>
      <td style="text-align: center">完全缺失</td>
    </tr>
    <tr>
      <td style="text-align: left">终端渲染</td>
      <td style="text-align: center">95%</td>
      <td style="text-align: center">93%</td>
      <td style="text-align: center">无差距</td>
    </tr>
  </tbody>
</table>

<p><strong>综合评级：English A / 中文 C-</strong></p>

<hr />

<h2 id="八根因分析">八、根因分析</h2>

<p>这些问题不是零散的 bug，而是<strong>同一个根因的连锁反应</strong>。</p>

<p><code class="language-plaintext highlighter-rouge">roughTokenCountEstimation()</code> 中 <code class="language-plaintext highlighter-rouge">string.length / 4</code> 这个假设是为英文字符密度设计的。这个偏差通过调用链向上传播：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>roughTokenCountEstimation()  ← 根因：CJK 低估 4-8x
    ↓
tokenCountWithEstimation()   ← 上下文大小的权威函数
    ↓
┌───────────────┬──────────────────┬──────────────────┐
│ autoCompact   │ microCompact     │ shouldAutoCompact│
│ 触发过晚      │ 工具结果清理不及时 │ 阈值判断失准      │
└───────────────┴──────────────────┴──────────────────┘
</code></pre></div></div>

<p><strong>修复思路也很明确：</strong></p>

<ol>
  <li>引入语言感知的 <code class="language-plaintext highlighter-rouge">bytesPerToken</code> 系数——检测到 CJK 字符占比 &gt;50% 时，使用 ~1.0-1.5 而非 4</li>
  <li>或者更彻底地，优先使用 API 的 <code class="language-plaintext highlighter-rouge">countTokens</code> 端点进行精确计数，而非本地估算</li>
</ol>

<p>这两个改动的代码量都不大，但影响面覆盖整个上下文管理链路。</p>

<hr />

<h2 id="写在最后">写在最后</h2>

<p>Claude Code 无疑是一款优秀的产品，其架构设计（query loop、5 层错误恢复、4 层上下文压缩）展现了极高的工程水准。但在国际化支持方面，它目前本质上还是一个”英文优先”的工具。</p>

<p>对于中文用户来说，你可能会发现在长对话中更容易遇到上下文中断、压缩后信息丢失、记忆匹配不精确等问题——这些不是你的使用方式有问题，而是底层系统对中文的支持确实存在结构性差距。</p>

<p>希望这篇分析能帮助大家更好地理解自己使用的工具，也希望 Anthropic 团队能在未来版本中改进这些问题。</p>

<hr />

<p><em>本文基于 Claude Code 源码快照（2026-03-31）的深度分析，涵盖 src/services/tokenEstimation.ts、src/services/compact/、src/memdir/ 等核心模块。</em></p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Claude" /><category term="Claude Code" /><category term="Plugins" /><category term="Claude Code 2.0" /><category term="Vibe Coding" /><category term="AI智能体" /><category term="TDD" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[Claude Code 是 Anthropic 推出的 AI 编程 CLI 工具，堪称当前最强的 AI 编程助手之一。它的源码规模惊人——约 1,900 个文件、512,000+ 行 TypeScript 代码。]]></summary></entry></feed>