<?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-07-23T21:24:41+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">🚀Graph Engineering范式：Codex Multi-agent V2支持Kimi、MiniMax、GPT多模型混用+动态派生subagent，并行执行、Pi Agent工具调用，效率倍增</title><link href="https://www.aivi.fyi//llms/codex-multi-agent-v2" rel="alternate" type="text/html" title="🚀Graph Engineering范式：Codex Multi-agent V2支持Kimi、MiniMax、GPT多模型混用+动态派生subagent，并行执行、Pi Agent工具调用，效率倍增" /><published>2026-07-23T00:00:00+08:00</published><updated>2026-07-23T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/codex-multi-agent-v2</id><content type="html" xml:base="https://www.aivi.fyi//llms/codex-multi-agent-v2"><![CDATA[<h1 id="我把-codex-变成了一个多模型代码审查团队">我把 Codex 变成了一个多模型代码审查团队</h1>

<h3 id="gpt-负责调度kimiminimax-和-pi-分别担任专业审查员">GPT 负责调度，Kimi、MiniMax 和 Pi 分别担任专业审查员</h3>

<p>过去使用 Codex 进行代码审查，通常是把代码、分支或 Pull Request 交给同一个模型。</p>

<p>它负责理解改动、发现问题、判断严重程度，最后再生成审查报告。</p>

<p>这种方式足够简单，也很容易使用，但它存在一个明显的问题：</p>

<blockquote>
  <p>从发现问题到验证问题，所有判断都可能来自同一个模型。</p>
</blockquote>

<p>如果模型第一次阅读代码时忽略了某个风险，它在第二次检查自己的结论时，也可能继续忽略同一个风险。</p>

<p>随着 Codex 对自定义 Subagent 的支持逐渐完善，我们可以采用一种更接近真实软件团队的工作方式：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Codex 主 Agent
负责理解任务、拆解范围和调度流程

Kimi Code Reviewer
负责独立代码审查

MiniMax Code Reviewer
负责从另一个模型视角检查缺陷

Pi Code Reviewer
调用独立审查器提出候选问题，再逐条验证
</code></pre></div></div>

<p>最终形成的已经不再是一个模型独自完成全部工作，而是一套由主 Agent 统一调度的多模型代码审查系统。</p>

<blockquote>
  <p>🚀 本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://youtu.be/RAFQc6zHdXE">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<iframe width="800" height="450" src="https://www.youtube.com/embed/RAFQc6zHdXE" title="Codex Multi-agent V2 多模型代码审查与 Graph Engineering 工作流实测" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<hr />

<h2 id="一为什么要让不同模型担任不同角色">一、为什么要让不同模型担任不同角色？</h2>

<p>多模型系统的意义，并不是简单地让三个模型重复检查同一份代码。</p>

<p>如果只是把同一个 Prompt 同时交给多个模型，再把结果拼接起来，通常只会产生大量重复内容。</p>

<p>更有效的做法，是先为每个 Agent 设定清晰的职责边界。</p>

<p>例如：</p>

<table>
  <thead>
    <tr>
      <th>Agent</th>
      <th>主要职责</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>主 Agent</td>
      <td>确定审查范围、创建子 Agent、汇总与验证结果</td>
    </tr>
    <tr>
      <td>Kimi Reviewer</td>
      <td>独立检查正确性、安全性、并发和兼容性问题</td>
    </tr>
    <tr>
      <td>MiniMax Reviewer</td>
      <td>从另一个模型视角补充代码缺陷和测试风险</td>
    </tr>
    <tr>
      <td>Pi Reviewer</td>
      <td>调用独立审查流程，并验证候选问题是否真实存在</td>
    </tr>
  </tbody>
</table>

<p>这样的设计有两个直接价值。</p>

<h3 id="第一减少单一模型的盲区">第一，减少单一模型的盲区</h3>

<p>不同模型的训练数据、推理方式和代码偏好并不完全相同。</p>

<p>同一个问题可能被 GPT 忽略，却被 Kimi 或 MiniMax 发现。</p>

<p>多模型不能保证一定正确，但可以扩大审查覆盖面。</p>

<h3 id="第二把发现问题和确认问题分开">第二，把“发现问题”和“确认问题”分开</h3>

<p>一个模型提出问题，并不意味着这个问题可以直接写进最终报告。</p>

<p>更可靠的流程应该是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>第三方模型提出候选问题
          ↓
主 Agent 重新打开对应代码
          ↓
检查触发路径与实际影响
          ↓
必要时运行测试或静态检查
          ↓
确认后才进入最终报告
</code></pre></div></div>

<p>也就是说，其他模型负责提供新的观察角度，主 Agent 负责最终证据校验。</p>

<hr />

<h2 id="二整体架构主模型保持不变第三方模型只服务于专用-agent">二、整体架构：主模型保持不变，第三方模型只服务于专用 Agent</h2>

<p>这套系统中最重要的设计原则，是把主 Agent 和第三方 Subagent 的模型配置彻底分开。</p>

<p>整体结构如下：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>用户任务
   ↓
Codex 主 Agent
   ├→ Kimi Code Reviewer
   ├→ MiniMax Code Reviewer
   └→ Pi Code Reviewer
          ↓
   汇总、去重与验证
          ↓
       最终报告
</code></pre></div></div>

<p>主 Agent 继续使用默认的 OpenAI 模型，负责：</p>

<ul>
  <li>理解用户任务；</li>
  <li>确定代码审查范围；</li>
  <li>选择需要调用的 Reviewer；</li>
  <li>等待子 Agent 返回；</li>
  <li>删除重复问题；</li>
  <li>验证问题是否成立；</li>
  <li>输出最终审查结果。</li>
</ul>

<p>第三方模型则只绑定到指定的自定义 Agent。</p>

<p>例如，只有显式调用 Kimi Reviewer 时，任务才会被路由到 Kimi。</p>

<p>普通 Subagent 不会因为系统中注册了 Kimi，就自动切换到 Kimi 模型。没有明确指定 Agent 类型时，它仍可能继承主 Agent 的模型配置。</p>

<p>这可以避免一个非常危险的问题：</p>

<blockquote>
  <p>为了增加一个第三方 Reviewer，却意外把整个 Codex 主 Agent 都切换到了第三方模型。</p>
</blockquote>

<p>因此，第三方模型的连接信息、模型目录和认证逻辑，都应该被限制在独立的 Provider 和 Agent 配置中，而不是放入主配置的全局层级。</p>

<hr />

<h2 id="三代码审查-agent-必须默认保持只读">三、代码审查 Agent 必须默认保持只读</h2>

<p>代码审查和代码实现是两种不同的职责。</p>

<p>如果 Reviewer 在发现问题后立即开始修改代码，就容易出现以下情况：</p>

<ul>
  <li>审查范围不断扩大；</li>
  <li>原始问题被修改操作掩盖；</li>
  <li>多个 Reviewer 同时编辑同一文件；</li>
  <li>主 Agent 无法判断问题来自原始代码还是新修改；</li>
  <li>审查任务悄悄变成实现任务。</li>
</ul>

<p>因此，我为所有 Code Review Subagent 设置了相同的基本原则：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>默认只读
不主动编辑文件
不创建提交
不扩大任务范围
不把风格偏好当成缺陷
</code></pre></div></div>

<p>Reviewer 应重点检查：</p>

<ul>
  <li>明确的正确性错误；</li>
  <li>安全风险；</li>
  <li>数据丢失；</li>
  <li>并发与生命周期竞态；</li>
  <li>错误处理缺失；</li>
  <li>API 或平台兼容性；</li>
  <li>具有实际影响的性能问题；</li>
  <li>重要测试缺失。</li>
</ul>

<p>每一条问题还必须回答三个问题：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>问题发生在哪里？
什么场景会触发？
会造成什么实际影响？
</code></pre></div></div>

<p>如果没有足够证据，就不应该为了让报告显得“有内容”而编造 Finding。</p>

<p>没有发现可执行问题时，直接说明没有验证到明确缺陷，反而更加可靠。</p>

<hr />

<h2 id="四最容易踩坑的地方跨模型任务交接">四、最容易踩坑的地方：跨模型任务交接</h2>

<p>主 Agent 和第三方 Subagent 使用不同模型和 Provider 时，最大的难点往往不是模型路由，而是任务上下文如何传递。</p>

<p>在实测中，常见的上下文交接方式存在三种情况。</p>

<h3 id="传递完整历史">传递完整历史</h3>

<p>看起来最保险，但完整历史可能同时携带父 Agent 的模型类型、角色状态和内部上下文。</p>

<p>对于自定义第三方 Agent，这可能导致：</p>

<ul>
  <li>Agent 类型继承错误；</li>
  <li>自定义模型配置没有生效；</li>
  <li>子 Agent 被当成父 Agent 的延续；</li>
  <li>第三方模型收到它无法理解的上下文。</li>
</ul>

<h3 id="完全不传历史">完全不传历史</h3>

<p>这种方式看似最干净，但第三方 Subagent 可能根本收不到当前用户的实际任务。</p>

<p>结果通常是：</p>

<ul>
  <li>子 Agent 不知道应该审查什么；</li>
  <li>开始检查无关目录；</li>
  <li>根据仓库内容自行猜测任务；</li>
  <li>返回与用户要求无关的报告。</li>
</ul>

<h3 id="只传递当前任务轮次">只传递当前任务轮次</h3>

<p>在这次配置中，更可靠的方式是只让子 Agent 继承当前一轮任务。</p>

<p>这样既可以保留当前用户的明文要求，又不会把父 Agent 的完整历史、角色和模型状态全部带入子线程。</p>

<p>它解决的是一个非常实际的问题：</p>

<blockquote>
  <p>第三方模型必须知道“现在要做什么”，但不一定需要知道主 Agent 之前所有的思考过程。</p>
</blockquote>

<p>这也是跨 Provider Subagent 能否稳定工作的关键。</p>

<hr />

<h2 id="五还要防止-subagent-递归创建-subagent">五、还要防止 Subagent 递归创建 Subagent</h2>

<p>当父任务中包含“创建 Reviewer 并执行审查”之类的描述时，第三方 Subagent 有可能把这条父级指令也当成自己的任务。</p>

<p>于是可能出现：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>主 Agent 创建 Kimi Reviewer
       ↓
Kimi Reviewer 又尝试创建 Kimi Reviewer
       ↓
新的 Reviewer 继续创建 Reviewer
</code></pre></div></div>

<p>这会造成无意义的递归调用。</p>

<p>因此，每个专用 Subagent 的角色指令都应该明确：</p>

<blockquote>
  <p>直接执行被委派的任务，不要再次创建或委派给其他 Codex Agent。</p>
</blockquote>

<p>在联调过程中，还应当让不同角色清楚自己的身份：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>主 Agent：
负责创建子 Agent 并等待结果

Reviewer：
直接执行 Code Review，不再继续委派
</code></pre></div></div>

<p>在多 Agent 系统里，“你是谁”与“你应该做什么”同样重要。</p>

<hr />

<h2 id="六三种-reviewer-的职责应该怎样区分">六、三种 Reviewer 的职责应该怎样区分？</h2>

<h3 id="1-kimi-code-reviewer">1. Kimi Code Reviewer</h3>

<p>Kimi Reviewer 是一个独立的只读代码审查 Agent。</p>

<p>它适合检查：</p>

<ul>
  <li>代码正确性；</li>
  <li>安全问题；</li>
  <li>数据丢失；</li>
  <li>并发与生命周期问题；</li>
  <li>错误处理；</li>
  <li>兼容性；</li>
  <li>重要测试缺失。</li>
</ul>

<p>它的价值在于，为主 Agent 提供一个不同模型的独立审查视角。</p>

<hr />

<h3 id="2-minimax-code-reviewer">2. MiniMax Code Reviewer</h3>

<p>MiniMax Reviewer 的职责与 Kimi Reviewer 类似，但使用不同模型。</p>

<p>同时保留两个 Reviewer，并不是为了证明哪个模型一定更强，而是为了观察：</p>

<ul>
  <li>哪些问题两个模型都会发现；</li>
  <li>哪些问题只有一个模型发现；</li>
  <li>两个模型对风险等级是否存在分歧；</li>
  <li>是否出现大量重复或低质量 Finding。</li>
</ul>

<p>如果两个 Reviewer 返回同一个问题，主 Agent 仍需要重新验证。</p>

<p>多个模型意见一致，只能提高关注优先级，不能直接代替证据。</p>

<hr />

<h3 id="3-pi-code-reviewer">3. Pi Code Reviewer</h3>

<p>Pi Reviewer 的设计更特殊。</p>

<p>它本身仍然由主模型运行，但会调用一个受限、只读的 Pi 审查器，让 Pi 使用另一个模型进行第二轮独立审查。</p>

<p>其工作流程是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Codex Reviewer 确定审查范围
          ↓
调用只读 Pi Reviewer
          ↓
Pi 返回候选问题
          ↓
Codex 逐条重新检查代码
          ↓
确认或否决每一条候选问题
          ↓
只报告通过验证的问题
</code></pre></div></div>

<p>这里最关键的原则是：</p>

<blockquote>
  <p>Pi 的输出只是审查证据，不是最终答案。</p>
</blockquote>

<p>Pi 返回的问题必须被重新打开、重新定位和重新验证。</p>

<p>需要删除：</p>

<ul>
  <li>纯风格建议；</li>
  <li>重复问题；</li>
  <li>没有代码证据的猜测；</li>
  <li>超出审查范围的问题；</li>
  <li>无法复现的影响；</li>
  <li>与当前 diff 无关的旧问题。</li>
</ul>

<p>这种结构比直接转发 Pi 的回答更加可靠，因为它形成了“外部发现—本地验证”的两阶段流程。</p>

<hr />

<h2 id="七不要用一条-warning-判断路由是否成功">七、不要用一条 Warning 判断路由是否成功</h2>

<p>自定义模型接入 Codex 时，终端可能出现模型元数据相关的 Warning。</p>

<p>很多人看到 Warning 后，会立刻认为第三方模型没有真正运行。</p>

<p>但模型目录警告和模型路由失败是两件不同的事情。</p>

<p>判断 Subagent 是否真的使用了指定模型，应同时检查：</p>

<ul>
  <li>子线程记录的模型名称；</li>
  <li>子线程记录的 Provider；</li>
  <li>自定义 Agent 的角色名称；</li>
  <li>子 Agent 是否能够真实调用允许的工具；</li>
  <li>本地代理是否记录到相应模型请求；</li>
  <li>上游请求是否成功返回。</li>
</ul>

<p>也就是说，不要只看终端里的一行提示。</p>

<p>真正可靠的判断来自完整的运行链路：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Agent 角色正确
+
模型正确
+
Provider 正确
+
工具调用真实发生
+
请求日志匹配
</code></pre></div></div>

<hr />

<h2 id="八本地代理最常见的问题不一定来自模型">八、本地代理最常见的问题，不一定来自模型</h2>

<p>当第三方模型通过本地代理接入 Codex 时，还需要注意系统网络环境。</p>

<p>如果系统启用了全局 HTTP 代理，本来发往本机服务的请求，也可能被错误转发到外部代理。</p>

<p>表现通常是：</p>

<ul>
  <li>本地服务明明已经启动，Codex 却无法连接；</li>
  <li>浏览器或终端测试结果不一致；</li>
  <li>GUI 启动的程序与 shell 中表现不同；</li>
  <li>请求莫名超时或返回代理错误。</li>
</ul>

<p>解决思路不是不断修改模型参数，而是先确认：</p>

<ul>
  <li>本地回环地址已经排除在全局代理之外；</li>
  <li>GUI 应用继承了正确的环境；</li>
  <li>本地模型列表接口可以直接访问；</li>
  <li>请求没有被其他代理软件接管。</li>
</ul>

<p>这是本地 Agent Harness 中非常典型的一类问题：</p>

<blockquote>
  <p>看起来像模型错误，实际是网络路径错误。</p>
</blockquote>

<hr />

<h2 id="九配置被代理工具覆盖比配置写错更难发现">九、配置被代理工具覆盖，比配置写错更难发现</h2>

<p>另一类常见问题是：配置最初完全正确，但代理工具重启、切换 Provider 或重新接管后，主配置被自动重写。</p>

<p>结果可能是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>原本：
主 Agent 使用 OpenAI
Kimi 只用于指定 Reviewer

重启后：
主 Agent 也被改成 Kimi
</code></pre></div></div>

<p>这种错误非常隐蔽，因为用户可能仍然看到 Codex 正常运行，却不知道模型路由已经变化。</p>

<p>更可靠的做法是：</p>

<ul>
  <li>明确谁是主配置的唯一事实来源；</li>
  <li>将第三方 Provider 限制在独立配置段；</li>
  <li>配置修改采用原子写入；</li>
  <li>重启后自动检查主模型；</li>
  <li>避免两个程序反复覆盖同一个文件；</li>
  <li>每次升级或切换 Provider 后重新执行烟雾测试。</li>
</ul>

<p>如果确实需要自动修复配置，脚本应当具备幂等性：</p>

<blockquote>
  <p>无论执行一次还是执行多次，最终配置都保持相同。</p>
</blockquote>

<hr />

<h2 id="十如何验证多模型-subagent-真的工作了">十、如何验证多模型 Subagent 真的工作了？</h2>

<p>仅仅看到主 Agent 输出一句“Kimi 已完成审查”，并不能证明 Kimi 真的运行过。</p>

<p>父 Agent 有可能根据已有上下文模拟一个看似合理的子任务结果。</p>

<p>因此，完整验证应至少覆盖以下几层。</p>

<h3 id="第一层配置语法">第一层：配置语法</h3>

<p>确认主配置和自定义 Agent 配置可以被真实解析器读取，而不是仅凭肉眼判断格式正确。</p>

<h3 id="第二层主-agent-路由">第二层：主 Agent 路由</h3>

<p>发起一次真实任务，确认主 Agent 仍然使用预期的默认模型和 Provider。</p>

<h3 id="第三层第三方模型直连">第三层：第三方模型直连</h3>

<p>绕过 Subagent 交接，直接测试第三方模型路由，确认本地代理能够收到请求并成功返回。</p>

<h3 id="第四层真实-subagent-创建">第四层：真实 Subagent 创建</h3>

<p>由主 Agent 创建指定 Reviewer，并确认子线程中的：</p>

<ul>
  <li>Agent 角色；</li>
  <li>模型名称；</li>
  <li>Provider；</li>
  <li>当前任务范围。</li>
</ul>

<h3 id="第五层结果真实性">第五层：结果真实性</h3>

<p>要求子 Agent 返回一个只有实际执行后才能获得的标记或证据。</p>

<p>例如：</p>

<ul>
  <li>指定文件中的准确内容；</li>
  <li>独立工具调用结果；</li>
  <li>请求日志中的匹配记录；</li>
  <li>真实测试输出。</li>
</ul>

<h3 id="第六层重启测试">第六层：重启测试</h3>

<p>重启代理工具和 Codex 后，再次确认：</p>

<ul>
  <li>本地服务恢复；</li>
  <li>主模型没有被覆盖；</li>
  <li>第三方 Reviewer 仍然可以调用；</li>
  <li>已运行任务是否需要重新创建才能加载新配置。</li>
</ul>

<p>只有这些步骤全部通过，才能说明系统不是“配置看起来正确”，而是真的完成了端到端路由。</p>

<hr />

<h2 id="十一如何快速判断故障发生在哪一层">十一、如何快速判断故障发生在哪一层？</h2>

<h3 id="第三方模型直接调用成功但-subagent-失败">第三方模型直接调用成功，但 Subagent 失败</h3>

<p>说明模型连接和 Provider 大概率正常。</p>

<p>问题更可能出现在：</p>

<ul>
  <li>父子任务交接；</li>
  <li>上下文传递；</li>
  <li>Agent 类型；</li>
  <li>等待与结果回收机制。</li>
</ul>

<h3 id="subagent-开始检查无关目录">Subagent 开始检查无关目录</h3>

<p>通常说明它没有收到清晰的当前任务。</p>

<p>应优先检查上下文继承方式，而不是立刻修改模型参数。</p>

<h3 id="请求曾经成功后来出现上游繁忙">请求曾经成功，后来出现上游繁忙</h3>

<p>这通常属于上游容量问题。</p>

<p>不应直接把它判断为协议或本地代理配置错误。</p>

<h3 id="代理重启后主模型发生变化">代理重启后主模型发生变化</h3>

<p>说明全局配置被代理工具重新接管。</p>

<p>应检查配置事实来源和重启后的覆盖逻辑。</p>

<hr />

<h2 id="十二安全原则比配置技巧更重要">十二、安全原则比配置技巧更重要</h2>

<p>在接入第三方模型时，最容易被忽略的是凭据传播范围。</p>

<p>建议始终遵守以下原则：</p>

<ul>
  <li>API Key 只存放在专用凭据存储中；</li>
  <li>不把真实 Key 写入 Agent 配置；</li>
  <li>不把 Key 写入模型目录；</li>
  <li>不通过命令行参数传递 Key；</li>
  <li>不在测试输出中打印完整 Provider 配置；</li>
  <li>不把敏感配置截图发到公开平台；</li>
  <li>不向第三方 Reviewer 传递凭据文件和无关用户数据；</li>
  <li>一旦凭据出现在公共仓库或共享日志中，立即轮换。</li>
</ul>

<p>尤其在使用 Pi 等外部审查器时，传递内容应严格限制在当前代码审查范围内。</p>

<p>对于大型 diff，可以只传递：</p>

<ul>
  <li>变更文件列表；</li>
  <li>相关代码片段；</li>
  <li>明确的审查目标。</li>
</ul>

<p>不要为了让模型拥有“完整上下文”，把整个用户目录、配置目录或凭据文件一起交给它。</p>

<hr />

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

<p>这套多模型代码审查系统，真正有价值的地方，不是 Codex 可以同时调用 Kimi、MiniMax 和 Pi。</p>

<p>而是我们开始把代码审查拆成不同责任：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>主 Agent 负责调度
第三方模型负责独立发现
确定性工具负责验证
主 Agent 负责最终判断
</code></pre></div></div>

<p>这已经不再是简单的“换一个模型”。</p>

<p>它更接近一套小型的 Graph Engineering 工作流：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>任务进入
→ 选择 Reviewer
→ 多模型独立审查
→ 汇总候选问题
→ 逐条验证
→ 删除重复和误报
→ 输出最终报告
</code></pre></div></div>

<p>但多 Agent 并不会自动带来更高质量。</p>

<p>真正决定系统可靠性的，仍然是：</p>

<ul>
  <li>角色是否清晰；</li>
  <li>上下文是否正确传递；</li>
  <li>权限是否受到限制；</li>
  <li>Finding 是否经过验证；</li>
  <li>路由是否可以被审计；</li>
  <li>失败能否被准确定位；</li>
  <li>凭据是否被严格隔离。</li>
</ul>

<p>当这些基础工作真正做好之后，Codex 才不再只是一个独自工作的超级 Agent。</p>

<p>它开始变成一个能够调度不同模型、不同工具和不同审查路径的 AI 工程团队。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Codex" /><category term="Kimi" /><category term="MiniMax" /><category term="Pi Agent" /><category term="Subagents" /><category term="多Agent" /><category term="Graph Engineering" /><category term="AI智能体" /><category term="AI编程" /><category term="OpenAI" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[我把 Codex 变成了一个多模型代码审查团队]]></summary></entry><entry><title type="html">🚀Orca不是另一个AI IDE，而是一个人的AI工程团队作战室！Claude Code、Codex、OpenCode多Agent并行编排、Git Worktree隔离、Diff Review与手机远程控制完整实测</title><link href="https://www.aivi.fyi//llms/introduce-orca-ade" rel="alternate" type="text/html" title="🚀Orca不是另一个AI IDE，而是一个人的AI工程团队作战室！Claude Code、Codex、OpenCode多Agent并行编排、Git Worktree隔离、Diff Review与手机远程控制完整实测" /><published>2026-07-20T00:00:00+08:00</published><updated>2026-07-20T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/introduce-orca-ade</id><content type="html" xml:base="https://www.aivi.fyi//llms/introduce-orca-ade"><![CDATA[<h1 id="orca-不是另一个-ai-ide它想解决的是一个人如何管理一支-ai-工程团队">Orca 不是另一个 AI IDE：它想解决的是“一个人如何管理一支 AI 工程团队”</h1>

<p>当 Claude Code、Codex、Grok、Gemini、OpenCode 等 AI 编程工具越来越强，开发者面临的问题也在发生变化。</p>

<p>过去，我们关心的是：</p>

<blockquote>
  <p>哪个模型写代码更强？</p>
</blockquote>

<p>现在，一个新的问题逐渐浮现：</p>

<blockquote>
  <p>当我同时使用多个 AI Agent 时，应该怎样管理它们？</p>
</blockquote>

<p>如果让 Claude Code 负责分析，让 Codex 负责实现，让 Grok 负责 Review，再让另一个 Agent 补测试，你很快就会遇到一系列现实问题：</p>

<p>多个 Agent 会不会互相覆盖文件？</p>

<p>不同任务应该使用哪个分支？</p>

<p>谁正在执行，谁已经完成，谁在等待输入？</p>

<p>多个 Agent 给出不同实现后，应该怎样比较？</p>

<p>离开电脑之后，如何继续查看和控制任务？</p>

<p>多个 Claude、Codex 账号以及额度，又该如何管理？</p>

<p>最近我体验了一段时间 Orca。它给我的最大感受是：<strong>Orca 并不是想成为一个更强的 AI 编程 Agent，而是在尝试成为多个 AI Agent 之上的管理层。</strong></p>

<blockquote>
  <p>🚀 本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://youtu.be/Ide6kgz6Eyk">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<iframe width="800" height="450" src="https://www.youtube.com/embed/Ide6kgz6Eyk" title="Orca 多 AI Agent 工程团队管理与并行编排完整实测" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<hr />

<h2 id="一从-ide-到-adeorca-的定位有什么不同">一、从 IDE 到 ADE：Orca 的定位有什么不同？</h2>

<p>传统 IDE，例如 VS Code，主要围绕人类开发者设计：</p>

<ul>
  <li>人类打开项目；</li>
  <li>人类编辑文件；</li>
  <li>人类运行终端；</li>
  <li>人类切换分支；</li>
  <li>人类查看 Git Diff。</li>
</ul>

<p>但在 AI Agent 逐渐承担大量编码工作的情况下，开发界面的核心对象正在变化。</p>

<p>开发者不再只是自己编辑代码，还需要同时观察多个 Agent、给它们派发任务、检查执行状态、比较不同结果，并决定最终合并哪个方案。</p>

<p>Orca 将自己定位为一个面向 AI Agent 工作流的开发环境。官方对它的描述是：在同一个桌面 IDE 中并排运行多个 AI 编程 Agent，每项任务拥有自己的 Git worktree、Agent 终端和浏览器环境。它并不是模型，也不会替代 Git，而是运行开发者原本就在使用的 Claude Code、Codex、OpenCode 等 CLI Agent。</p>

<p>换句话说：</p>

<blockquote>
  <p>VS Code 更像一张给人类使用的办公桌，而 Orca 更像一间用于管理多个 AI 工程师的项目作战室。</p>
</blockquote>

<h2 id="二第一个核心痛点多个-agent-共用目录迟早会互相干扰">二、第一个核心痛点：多个 Agent 共用目录，迟早会互相干扰</h2>

<p>假设我们在同一个项目目录中同时运行三个 Agent：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Claude Code：分析认证模块并修改接口

Codex：重构登录流程

Grok：检查安全问题并补充修复
</code></pre></div></div>

<p>它们很可能同时读取和修改相同文件。</p>

<p>第一个 Agent 读取代码后，第二个 Agent 改写了文件；第一个 Agent 再继续操作时，它所理解的代码状态可能已经过时。</p>

<p>接下来就会出现：</p>

<ul>
  <li>未提交代码相互污染；</li>
  <li>文件被不同 Agent 反复覆盖；</li>
  <li>Git 状态越来越混乱；</li>
  <li>Agent 的上下文与磁盘中的实际内容不一致；</li>
  <li>无法判断某段代码到底是谁生成的；</li>
  <li>想放弃其中一个方案时，很难干净回滚。</li>
</ul>

<p>Orca 的核心设计之一，就是让每项任务运行在独立的 Git worktree 中。</p>

<p>每个 worktree 都有自己的：</p>

<ul>
  <li>磁盘目录；</li>
  <li>Git 分支；</li>
  <li>文件状态；</li>
  <li>Agent 终端；</li>
  <li>编辑器标签页；</li>
  <li>浏览器和分屏布局。</li>
</ul>

<p>多个 Agent 即使修改相同路径的文件，也不会直接覆盖彼此的工作。开发者可以让它们从同一个基础版本出发，分别尝试不同方案，最后查看各自的 Diff，选择更好的实现。</p>

<p>这解决的并不只是“分支切换麻烦”，而是多 Agent 并行开发最基础的隔离问题。</p>

<h2 id="三第二个核心痛点agent-多了以后状态会迅速变成黑盒">三、第二个核心痛点：Agent 多了以后，状态会迅速变成黑盒</h2>

<p>只有一个 Agent 时，我们可以盯着终端看它在做什么。</p>

<p>但当 Agent 数量变成五个、十个甚至更多时，情况就完全不同了。</p>

<p>你需要知道：</p>

<ul>
  <li>哪个 Agent 正在工作；</li>
  <li>哪个 Agent 已经完成；</li>
  <li>哪个 Agent 在等待确认；</li>
  <li>哪项任务依赖另一项任务；</li>
  <li>哪个执行失败后应该重试；</li>
  <li>哪个问题需要人类做决定。</li>
</ul>

<p>在我的视频测试中，Orca 左侧侧边栏能够显示不同 worktree 和 Agent 的运行状态；不同 Agent 还可以通过标签页或横向、纵向分屏同时显示。关闭 Orca 中的任务视图后，之前的 worktree、终端内容和任务记录也可以重新恢复。</p>

<p>Orca 还提供了更结构化的 Orchestration 能力。它可以通过消息、Task、Dispatch 和 Decision Gate 等机制协调多个 Agent，而不只是向多个终端随便发送几段 Prompt。官方将 Orchestration 定义为结构化的多 Agent 协调层，用于任务派发、完成状态跟踪、Agent 间消息以及需要人工决策的流程。</p>

<p>可以简单理解为：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Worktree
解决“在哪里工作”

Agent Terminal
解决“由谁执行”

Orchestration
解决“谁做什么、依赖谁、怎样确认完成”
</code></pre></div></div>

<p>这使多 Agent 工作流从“同时打开几个终端”，逐渐变成一套可管理的执行流程。</p>

<p>不过也需要注意：Orchestration 是协调基础设施，不是一个自动替你完成所有任务拆解、技术判断和代码合并的“AI 主管”。任务边界、验收标准和最终决策，仍然需要开发者负责。</p>

<h2 id="四第三个核心痛点ai-写得越多人类-review-的压力越大">四、第三个核心痛点：AI 写得越多，人类 Review 的压力越大</h2>

<p>AI 编程发展到现在，代码生成速度已经不是唯一瓶颈。</p>

<p>真正困难的部分越来越像是：</p>

<blockquote>
  <p>AI 一次生成了几百行甚至几千行修改，我怎样确认它真的做对了？</p>
</blockquote>

<p>如果同时运行多个 Agent，这个问题会更加严重。</p>

<p>三个 Agent 分别给出三个实现，并不意味着开发效率自动提升。假如所有修改都混在一个目录里，或者你必须手动来回寻找文件、复制行号、整理反馈，那么并行带来的收益很快会被 Review 成本抵消。</p>

<p>Orca 为每个 worktree 提供独立 Diff，并支持查看暂存、未暂存和新增文件，还提供合并冲突界面以及按行、按代码块暂存等能力。</p>

<p>它的 Annotate AI Diff 功能还允许开发者直接在 Diff 行上留下评论，再把一批评论统一发送给 Agent，让 Agent 根据带有明确代码位置的反馈进行修改。这样就不需要手动复制文件名、行号和代码片段。</p>

<p>这让一种非常有价值的工作流成为可能：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>让多个 Agent 从同一版本出发

分别尝试不同方案

查看各自 Diff

选择最好的方向

在 Diff 上批量标注意见

让获胜 Agent 继续修改

最终由人类审查和合并
</code></pre></div></div>

<p>Orca 官方甚至专门提供了“三个 Agent 竞争同一项任务”的使用方式：同一个 Prompt、三个 worktree、三个 Agent，完成后比较结果并选择获胜方案。</p>

<p>所以 Orca 的价值并不是减少人工 Review，而是让人工 Review 更有组织。</p>

<h2 id="五第四个核心痛点一离开电脑agent-就像失联了一样">五、第四个核心痛点：一离开电脑，Agent 就像失联了一样</h2>

<p>AI Agent 经常需要长时间运行。</p>

<p>它可能在：</p>

<ul>
  <li>安装依赖；</li>
  <li>执行测试；</li>
  <li>分析大型代码库；</li>
  <li>等待构建；</li>
  <li>修复 CI；</li>
  <li>等待用户确认。</li>
</ul>

<p>如果这时需要开会、出门或换一台设备，传统终端工作流就很不方便。</p>

<p>在这次视频测试中，我将 Orca 桌面端与手机配对后，可以直接在手机上查看不同任务和 Agent 的终端输出，了解它们当前的执行状态。</p>

<p>Orca 官方提供了 iOS 和 Android Mobile Companion。目前移动端仍处于 Beta 阶段，定位也不是完整代码编辑器，而是桌面端的远程控制器。它可以查看 worktree 和 Agent 状态、读取近期终端输出、回复等待输入的 Agent、查看 Source Control、切换账号和创建 workspace。</p>

<p>这意味着，一个比较现实的使用场景是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>在电脑上启动多个 Agent

离开工位去开会

手机收到 Agent 完成或等待输入的通知

查看终端内容

回复“继续”或补充一个要求

回到电脑后集中 Review
</code></pre></div></div>

<p>它并不是让开发者在手机上完成复杂编码，而是避免长时间 Agent 因为一个简单确认停在那里。</p>

<h2 id="六第五个核心痛点多个-provider多个账号和额度很难管理">六、第五个核心痛点：多个 Provider、多个账号和额度很难管理</h2>

<p>很多重度 AI 编程用户并不只使用一个工具。</p>

<p>常见组合可能是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Claude Code 负责分析和复杂推理

Codex 负责代码实现

Grok 或 Gemini 负责补充 Review

OpenCode 负责其他模型调用
</code></pre></div></div>

<p>与此同时，开发者还可能拥有个人账号、公司账号、不同工作区账号，以及 Host、WSL、远程服务器等不同运行环境。</p>

<p>传统做法经常是不断执行：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>logout
login
重新选择账号
检查额度
重启 Agent
</code></pre></div></div>

<p>Orca 可以在状态栏中显示 Claude、Codex 等 Provider 的用量和重置窗口，并提供 Claude、Codex 的账号切换能力。官方说明中，当前用量会跟随活动账户显示，其他已配置账户也可以在账号选择器中查看。</p>

<p>对于 Codex 和 Claude，Orca 可以在不手动修改配置文件的情况下切换活动账号。但已经运行的 Agent 进程通常仍会保留启动时的账号身份，需要重启相应 Session，新的 Session 才会使用切换后的账号。</p>

<p>这项功能看起来不像 worktree 那么醒目，但对于每天高频使用多个 AI Provider 的开发者来说，非常实用。</p>

<h2 id="七从-github-issue-到-agent-开工中间不再需要手动搬运上下文">七、从 GitHub Issue 到 Agent 开工，中间不再需要手动搬运上下文</h2>

<p>视频中我还演示了 Orca 的 Tasks 功能。</p>

<p>在 Tasks 页面中，可以选择项目仓库，查看 GitHub Issues 和 Pull Requests。打开一个 Issue 后，可以直接基于它创建 workspace，Orca 会启动对应 Agent，并把 Issue 上下文放入任务输入中。</p>

<p>这样，传统流程：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>打开 GitHub

找到 Issue

复制标题和描述

回到终端

创建分支

启动 Agent

粘贴上下文
</code></pre></div></div>

<p>就可以简化为：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>打开 Issue

创建 Worktree

启动 Agent
</code></pre></div></div>

<p>官方文档也说明，从 GitHub Issue 创建 worktree 时，Orca 会预填任务名称，并把 Issue 与 worktree 关联起来；Tasks 页面还可以浏览 GitHub Projects 中的卡片并从卡片直接创建 worktree。</p>

<p>除了 GitHub，Orca 还支持 Linear、Jira 和 GitLab 等工作项来源，把“任务从哪里来”和“Agent 在哪里执行”连接在一起。</p>

<h2 id="八语音输入和自动化让-agent-工作流更接近下达任务">八、语音输入和自动化，让 Agent 工作流更接近“下达任务”</h2>

<p>在视频中，我还测试了语音输入。</p>

<p>设置好语音识别模型后，通过快捷键即可直接说出：</p>

<blockquote>
  <p>对这个项目的代码进行 Review。</p>
</blockquote>

<p>识别结果会进入 Codex 的输入框，然后可以直接提交任务。</p>

<p>对于复杂代码需求，键盘输入依然更精确；但对于“继续执行”“检查测试”“总结当前修改”“对这个模块做 Review”一类指令，语音输入确实能够减少操作成本。</p>

<p>视频还演示了自动化功能。例如，可以选择一个仓库、指定 Codex 等 Agent，再设置为每个工作日上午 9 点自动运行 Repo Review。</p>

<p>这意味着 Orca 不只是在管理当前打开的终端，也开始把部分重复性工作转变为可计划的 Agent 任务。Orca CLI 同样提供对 worktree、终端、浏览器和定时自动化的控制能力。</p>

<h2 id="九会话恢复是一个很容易被低估的功能">九、会话恢复，是一个很容易被低估的功能</h2>

<p>在多 Agent 工作流中，最怕的事情之一是：</p>

<blockquote>
  <p>我昨天到底在哪个分支、哪个终端里，让哪个 Agent 做到了哪一步？</p>
</blockquote>

<p>Orca 会恢复打开的 worktree、终端分屏、滚动记录和聚焦标签页。在宿主机没有重启、后台 PTY 进程仍然存活的情况下，关闭并重新打开 Orca，Agent 进程还可以继续运行并重新连接。</p>

<p>在视频中，我恢复了之前关闭的 oh-my-pi 和 Claude Code 任务。之前的输出内容没有丢失，恢复后还可以继续查看或接着执行。</p>

<p>当你只有一个终端时，这可能只是一个便利功能；但当你同时维护多个 worktree 和多个 Agent 时，它实际上是在保存整个“AI 团队的工作现场”。</p>

<h2 id="十orca-并不是万能工具">十、Orca 并不是万能工具</h2>

<p>虽然 Orca 的功能非常丰富，但它并不是“输入一句需求，就自动完成整个项目”的工具。</p>

<p>官方也明确强调：</p>

<ul>
  <li>Orca 不是模型；</li>
  <li>Orca 不替代 Git；</li>
  <li>Orca 面向的是愿意认真阅读 Diff、管理 Commit 和审查 AI 代码的开发者；</li>
  <li>它不是无代码开发工具。</li>
</ul>

<p>它真正擅长的是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>把不同 Agent 放进合适的隔离环境

让多个任务可以并行推进

让状态、上下文和结果更容易被管理

把最终判断权留给开发者
</code></pre></div></div>

<p>Worktree 隔离也不等于完整安全沙箱。</p>

<p>即使每个 Agent 使用独立目录，Agent 仍然可能执行命令、访问网络、读取凭据或修改 worktree 之外的资源。特别是在启用类似 YOLO 或跳过权限确认的模式时，仍然需要理解相应风险。</p>

<p>此外，更多 worktree、文件监视器、浏览器标签和终端进程也会消耗更多磁盘与内存。官方的故障排查建议同样提到，不再使用的 worktree 和浏览器标签应及时关闭。</p>

<h2 id="十一orca-最适合哪些人">十一、Orca 最适合哪些人？</h2>

<p>我认为，Orca 特别适合下面几类开发者。</p>

<p>第一类，是已经同时使用 Claude Code、Codex、OpenCode 等多个 CLI Agent 的人。</p>

<p>第二类，是经常需要让多个 Agent 并行尝试同一个问题，并对不同结果进行比较的人。</p>

<p>第三类，是在多个功能分支、多个 Issue 和多个 PR 之间频繁切换的人。</p>

<p>第四类，是需要通过 SSH 或远程开发机运行长时间 Agent 任务的人。Orca 可以在远程主机创建 worktree 和运行 Agent，同时在本地继续使用编辑器与 Diff 界面。</p>

<p>第五类，是认为“生成代码已经很快，但管理、Review 和合并 AI 代码越来越累”的人。</p>

<p>相反，如果你平时只运行一个 Agent、一次只处理一个小任务，并且不需要多分支并行，那么 Orca 带来的收益可能没有那么明显。</p>

<h2 id="十二最后的思考下一阶段的竞争可能不只是模型能力">十二、最后的思考：下一阶段的竞争，可能不只是模型能力</h2>

<p>过去两年，AI 编程工具之间的竞争主要围绕：</p>

<ul>
  <li>哪个模型写代码更准确；</li>
  <li>哪个模型上下文更长；</li>
  <li>哪个 Agent 能使用更多工具；</li>
  <li>哪个 Agent 可以更自主地完成任务。</li>
</ul>

<p>但随着模型能力逐渐提高，另一个竞争维度也会越来越重要：</p>

<blockquote>
  <p>谁能更好地组织多个 Agent 工作？</p>
</blockquote>

<p>未来的开发方式可能不再只是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>一个开发者
+
一个 AI 助手
</code></pre></div></div>

<p>而是：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>一个开发者

管理多个拥有不同能力的 AI Agent

让它们在隔离环境中并行工作

通过结构化流程交付结果

最终由人类 Review 和决策
</code></pre></div></div>

<p>从这个角度来看，Orca 真正想解决的，并不是“怎样让一个 AI 写代码更快”。</p>

<p>而是：</p>

<blockquote>
  <p><strong>当一个人开始管理一支 AI 工程团队时，需要怎样的开发基础设施？</strong></p>
</blockquote>

<p>这也正是我认为 Orca 最值得关注的地方。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Orca" /><category term="Claude Code" /><category term="Codex" /><category term="OpenCode" /><category term="AI智能体" /><category term="多Agent" /><category term="AI编程" /><category term="Vibe Coding" /><category term="Git Worktree" /><category term="Agent Teams" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[Orca 不是另一个 AI IDE：它想解决的是“一个人如何管理一支 AI 工程团队”]]></summary></entry><entry><title type="html">🚀GPT-5.6 Sol真正可怕的，不是更聪明，而是更能把活干完！九轮极限实测：SVG、Three.js、Godot、iOS、Chrome扩展与浏览器自动化</title><link href="https://www.aivi.fyi//llms/introduce-GPT-5.6-Sol" rel="alternate" type="text/html" title="🚀GPT-5.6 Sol真正可怕的，不是更聪明，而是更能把活干完！九轮极限实测：SVG、Three.js、Godot、iOS、Chrome扩展与浏览器自动化" /><published>2026-07-11T00:00:00+08:00</published><updated>2026-07-11T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/introduce-GPT-5.6-Sol</id><content type="html" xml:base="https://www.aivi.fyi//llms/introduce-GPT-5.6-Sol"><![CDATA[<h1 id="gpt-56-sol-真正可怕的不是更聪明而是更能把活干完">GPT-5.6 Sol 真正可怕的，不是更聪明，而是更能把活干完</h1>

<p>GPT-5.6 系列终于正式发布了。</p>

<p>这次 OpenAI 一共推出了三个型号：面向复杂任务的 <strong>Sol</strong>、主打平衡的 <strong>Terra</strong>，以及追求速度和成本的 <strong>Luna</strong>。</p>

<p>从官方公布的数据来看，GPT-5.6 Sol 在终端操作、浏览器自动化、长上下文和 Agent 任务上的表现都非常突出，部分成绩甚至超过了 Claude Fable 5 和 Claude Mythos 5。</p>

<p>但跑分表只能告诉我们模型在标准化测试中拿了多少分，无法回答一个更实际的问题：</p>

<p><strong>把一个真正复杂的任务交给它，它到底能不能做出来？</strong></p>

<p>为了弄清楚这一点，我没有只让它写几个函数或者生成一个简单网页，而是连续安排了九组难度完全不同的任务：</p>

<ul>
  <li>用 SVG 制作三只鸟在土星环上骑自行车的动画；</li>
  <li>模拟复合弓从开弓到箭矢命中靶心的完整过程；</li>
  <li>推理并动画演示一个复杂的农夫过河问题；</li>
  <li>使用 Three.js 创建波音 747-8 的外部和机舱三维模型；</li>
  <li>使用 Godot 4 开发侏罗纪坦克射击游戏；</li>
  <li>使用一句非常简短的提示词开发 A-10 空战游戏；</li>
  <li>开发一套原生 iOS 背单词 App、Chrome 扩展和云端同步系统；</li>
  <li>操控浏览器进入 Tinkercad 创建三维房屋模型；</li>
  <li>验证模型的知识覆盖和近期信息掌握情况。</li>
</ul>

<p>测试完成以后，我对 GPT-5.6 Sol 最大的感受，不是它突然变得无所不能了。</p>

<p>而是它越来越像一个能够接手完整项目的人。</p>

<p>它仍然会犯错，也会误解指令，甚至会为了尽快完成任务主动寻找捷径。但只要任务目标足够清楚，它确实比过去的大多数模型更愿意继续追踪问题，把代码、测试、功能和最终交付一起做完。</p>

<blockquote>
  <p>🚀 本篇笔记所对应的视频：</p>
  <ul>
    <li><a href="https://youtu.be/7aCMHJRHZK0">👉👉👉 通过YouTube观看</a></li>
  </ul>
</blockquote>

<iframe width="800" height="450" src="https://www.youtube.com/embed/7aCMHJRHZK0" title="GPT-5.6 Sol 九轮极限实测" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<hr />

<h2 id="一先把-maxpro-和-ultra-说清楚">一、先把 Max、Pro 和 Ultra 说清楚</h2>

<p>GPT-5.6 Sol 发布后，OpenAI 同时推出了 Max、Pro、Ultra 等不同名称，很容易让人误以为它们是不同模型。</p>

<p>其实不是。</p>

<h3 id="max-是推理强度">Max 是推理强度</h3>

<p>GPT-5.6 Sol 支持多档推理强度：</p>

<p><code class="language-plaintext highlighter-rouge">none、low、medium、high、xhigh、max</code></p>

<p>推理强度越高，模型能够用于分析问题的时间和计算量越多，但延迟和 Token 消耗也会随之增加。</p>

<p>我在这次测试中，大部分复杂任务使用的都是 <strong>Extra High</strong>。</p>

<p>它适合大型代码开发、复杂逻辑推理、跨文件修改和需要反复验证的任务，但完全没有必要用来修改按钮颜色或者调整一段文案。</p>

<h3 id="pro-是高质量运行模式">Pro 是高质量运行模式</h3>

<p>Pro 更重视最终答案的质量，而不是速度和成本。</p>

<p>它更适合架构设计、安全审查、复杂研究，以及做错一次就会造成很大损失的任务。</p>

<h3 id="ultra-是多智能体模式">Ultra 是多智能体模式</h3>

<p>Ultra 默认由多个 Agent 并行处理任务，再由主 Agent 汇总结果。</p>

<p>它和 Max 的区别非常明显：</p>

<ul>
  <li>Max：让一个人多想一会儿；</li>
  <li>Pro：让一个人按照更高标准完成任务；</li>
  <li>Ultra：让几个人同时开工。</li>
</ul>

<p>如果任务可以拆成前端、后端、数据库和测试四个独立方向，Ultra 会很有价值。</p>

<p>但如果只是修改同一个文件，让四个 Agent 同时工作，往往只会产生重复劳动、上下文膨胀和修改冲突。</p>

<hr />

<h2 id="二gpt-56-sol-的核心参数">二、GPT-5.6 Sol 的核心参数</h2>

<p>OpenAI 没有公布 GPT-5.6 Sol 的参数量、训练规模和具体架构。</p>

<p>目前能够确认的主要参数包括：</p>

<p><strong>上下文窗口：1,050,000 Tokens</strong></p>

<p><strong>最大输出：128,000 Tokens</strong></p>

<p><strong>官方模型资料标注的知识截止日期：2026 年 2 月 16 日</strong></p>

<p><strong>输入类型：文本、图片</strong></p>

<p><strong>输出类型：文本</strong></p>

<p><strong>暂不支持：音频输入、视频输入和微调</strong></p>

<p><strong>API 模型名称：<code class="language-plaintext highlighter-rouge">gpt-5.6-sol</code></strong></p>

<p>它还支持网页搜索、文件搜索、代码解释器、Hosted Shell、Computer Use、MCP、Skills、图像生成、Apply Patch 和 Tool Search 等工具。</p>

<p>GPT-5.6 Sol 的标准 API 价格为：</p>

<ul>
  <li>输入：每百万 Tokens 5 美元；</li>
  <li>缓存读取：每百万 Tokens 0.5 美元；</li>
  <li>缓存写入：每百万 Tokens 6.25 美元；</li>
  <li>输出：每百万 Tokens 30 美元。</li>
</ul>

<p>这里还有一个容易被忽略的细节。</p>

<p>当单次请求的输入超过 272K Tokens 后，整个请求都会进入长上下文计价区间，输入和输出价格都会进一步上涨。</p>

<p>所以百万上下文并不意味着应该把整个代码仓库、几十份 PDF、所有日志和历史对话一次性全部塞进去。</p>

<p>它解决的是“放不下”的问题，却无法自动解决“内容太乱”和“重点不突出”的问题。</p>

<hr />

<h1 id="第一轮测试模型自己说的知识截止日期可靠吗">第一轮测试：模型自己说的知识截止日期可靠吗？</h1>

<p>我首先在 ChatGPT 网页版中询问了两个问题：</p>

<p>第一，它的知识截止日期是什么时候？</p>

<p>第二，它知道的日本最新首相是谁？</p>

<p>网页端给出的回答是，知识截止日期为 <strong>2025 年 12 月</strong>，同时也正确回答了当时的日本首相。</p>

<p>至少从这个简单测试看，它对近期政治信息的覆盖没有出现明显断层。</p>

<p>但这里也暴露出一个值得注意的问题：</p>

<p>模型自己回答的知识截止日期，和官方模型资料中的日期并不完全一致。</p>

<p>这说明我们不能单纯依赖模型自报身份、版本和知识截止日期。真正需要确认模型参数时，仍然应该以官方模型卡和 API 文档为准。</p>

<p>模型可以回答自己是谁，但它对自身运行环境的描述不一定永远准确。</p>

<hr />

<h1 id="第二轮测试三只鸟在土星环上骑自行车">第二轮测试：三只鸟在土星环上骑自行车</h1>

<p>第一道真正的能力测试，是让 GPT-5.6 Sol 使用 SVG 制作一段动画：</p>

<p>一只几维鸟、一只渡渡鸟和一只鹈鹕，分别骑着自行车在土星环上比赛。</p>

<p>我还要求：</p>

<ul>
  <li>必须是真正的 SVG 动画，而不是静态图片；</li>
  <li>土星环就是赛道；</li>
  <li>背景中需要出现太阳、地球、火星和木星；</li>
  <li>三只鸟和自行车都要有清晰的运动效果。</li>
</ul>

<p>最终生成的结果总体不错。</p>

<p>土星、土星环和背景中的几颗行星都被画了出来，鹈鹕和渡渡鸟的外形也比较容易辨认。自行车车轮会持续转动，而且不同车辆还表现出了不同的运动速度。</p>

<p>不过，它犯了一个非常明显的错误：</p>

<p><strong>几维鸟是倒着骑自行车的。</strong></p>

<p>几维鸟最长、最明显的嘴部应该朝向前进方向，但它生成的身体朝向刚好相反。</p>

<p>这次测试说明，GPT-5.6 Sol 已经能够同时处理：</p>

<ul>
  <li>多个角色；</li>
  <li>场景构图；</li>
  <li>SVG 元素；</li>
  <li>循环动画；</li>
  <li>自行车机械运动；</li>
  <li>太空背景；</li>
  <li>不同物体的相对比例。</li>
</ul>

<p>但它对角色朝向和生物结构的理解还不够稳定。</p>

<p>单从最终视觉效果来看，这次生成结果已经可以使用，不过和我之前测试 Claude Fable 5 时得到的版本相比，细节和整体完成度仍然略逊一筹。</p>

<hr />

<h1 id="第三轮测试复合弓滑轮和箭矢抛物线">第三轮测试：复合弓、滑轮和箭矢抛物线</h1>

<p>第二道 SVG 测试更加困难。</p>

<p>我要求它制作一段男性使用复合弓射箭的动画，并且必须表现出：</p>

<ul>
  <li>拉弓过程；</li>
  <li>复合弓滑轮转动；</li>
  <li>弓片发生形变；</li>
  <li>箭矢离弦；</li>
  <li>箭矢沿抛物线飞行；</li>
  <li>最后准确命中远处的靶心。</li>
</ul>

<p>结果一开始就出现了问题。</p>

<p>尽管提示词里明确要求使用 SVG，它第一次仍然直接调用了图像生成工具，给我生成了一张静态图片。</p>

<p>我再次强调：</p>

<p><strong>用 SVG，不是用图像生成。</strong></p>

<p>第二次它才真正生成了可运行的 SVG 动画。</p>

<p>修正后的结果包含了拉弓特写、滑轮转动、放箭、箭矢飞行和命中靶心等完整过程，还加入了动画进度显示。</p>

<p>从功能完整性来看，它确实理解了我想要的整个过程。</p>

<p>但在物理结构上仍然有一个严重问题：</p>

<p><strong>它把复合弓拿反了，弓片弯曲的方向也是反的。</strong></p>

<p>这次测试暴露了 GPT-5.6 Sol 的两个短板。</p>

<p>第一，它有时会根据任务内容自行选择工具，即使这个选择和提示词里的明确要求冲突。</p>

<p>第二，它可以生成“看起来像那么回事”的物理动画，却不一定真正理解机械结构中的受力方向。</p>

<p>箭能够飞出去，滑轮也会转，靶心也能命中。</p>

<p>但这些元素组合在一起，不代表物理关系一定正确。</p>

<hr />

<h1 id="第四轮测试把复杂逻辑推理变成-svg-动画">第四轮测试：把复杂逻辑推理变成 SVG 动画</h1>

<p>接下来，我把逻辑推理和动画生成结合在了一起。</p>

<p>题目是一个经过扩展的农夫过河问题。</p>

<p>农夫需要把老虎、羊、蛇、鸡和一筐苹果安全送到对岸，但船每次只能搭载农夫和一样东西。</p>

<p>同时存在三组特殊关系：</p>

<ul>
  <li>农夫不在时，老虎会吃羊，但鸡可以阻止老虎；</li>
  <li>农夫不在时，蛇会吃鸡，但老虎可以阻止蛇；</li>
  <li>农夫不在时，羊会吃苹果，但蛇可以阻止羊。</li>
</ul>

<p>普通的大模型测试，通常只需要输出一段文字步骤。</p>

<p>这次我要求 GPT-5.6 Sol 不仅要推导出正确方案，还要使用 SVG 动画完整演示整个过河过程。</p>

<p>最终，它给出的主要顺序是：</p>

<ol>
  <li>农夫先带羊过河；</li>
  <li>农夫返回；</li>
  <li>带鸡过河；</li>
  <li>返回；</li>
  <li>带老虎过河；</li>
  <li>返回；</li>
  <li>带蛇过河；</li>
  <li>返回；</li>
  <li>最后带苹果过河。</li>
</ol>

<p>这套顺序是成立的。</p>

<p>更重要的是，它没有只输出几个移动的小圆点，而是做出了一个完整场景：</p>

<ul>
  <li>出发岸和目标岸；</li>
  <li>河流和小船；</li>
  <li>会摆动的船桨；</li>
  <li>老虎、羊、蛇、鸡和苹果；</li>
  <li>天空中的太阳、云和飞鸟；</li>
  <li>岸边的树木；</li>
  <li>当前步骤文字；</li>
  <li>农夫和物品的动态移动。</li>
</ul>

<p>这次结果让我比较意外。</p>

<p>因为模型必须先完成逻辑推理，再把推理结果转换成时间轴，最后还要把每一步对应到 SVG 动画状态。</p>

<p>它唯一比较明显的 Bug，是农夫独自划船返回时，整个人会变成倒立状态。</p>

<p>原因很可能是模型为了复用同一个角色元素，直接使用了整体翻转，而没有单独处理人物朝向。</p>

<p>但除了这个问题，整段动画的推理顺序、场景元素和播放流程都比较完整。</p>

<p>在我看来，这个案例比单纯让模型回答一道逻辑题更有价值。</p>

<p>因为它不只证明了模型“知道答案”，还证明了它能够把答案转换成一个真正可运行、可观察的产品。</p>

<hr />

<h1 id="第五轮测试波音-747-8-的外部和机舱三维模型">第五轮测试：波音 747-8 的外部和机舱三维模型</h1>

<p>完成 SVG 测试后，我继续加大难度，让它使用 Three.js 创建波音 747-8 洲际客机的三维模型。</p>

<p>要求包括：</p>

<ul>
  <li>完整的 Three.js 场景；</li>
  <li>相机、灯光和渲染器；</li>
  <li>机身、机翼、发动机和尾翼；</li>
  <li>鼠标旋转和缩放；</li>
  <li>外部视角；</li>
  <li>机舱内部视角；</li>
  <li>多排经济舱座椅；</li>
  <li>过道、舷窗和行李架；</li>
  <li>在外部与内部之间自由切换。</li>
</ul>

<p>等待几分钟后，它生成了一个可以直接运行的版本。</p>

<p>外部视角下，可以对飞机进行 360 度旋转和缩放。机身、机翼、尾翼和四台发动机都已经具备，整体轮廓也能看出波音 747-8 的特征。</p>

<p>点击“进入机舱”后，视角会切换到飞机内部。</p>

<p>用户可以在机舱中转动视角和前后移动，内部也确实包含座椅、窗户和过道。</p>

<p>不过它实现的过道明显过于狭窄，部分座椅和机舱空间比例也不够合理。</p>

<p>这说明它已经能搭建完整的三维交互体验，但距离精准的工业建模还有很大差距。</p>

<p>如果目标是展示概念、制作网页 Demo 或快速验证交互方式，这个结果已经足够。</p>

<p>如果要还原真实飞机尺寸、空气动力学结构或者舱内布局，就必须提供更严格的尺寸数据和参考模型。</p>

<hr />

<h1 id="第六轮测试半小时开发一款侏罗纪坦克射击游戏">第六轮测试：半小时开发一款侏罗纪坦克射击游戏</h1>

<p>网页端的测试主要集中在 SVG 和 Three.js。</p>

<p>进入 Codex 后，我决定把难度再提高一个等级。</p>

<p>过去测试大模型的游戏开发能力时，我经常使用 Three.js。但对现在的模型来说，使用 Three.js 制作一个网页小游戏已经不算特别困难。</p>

<p>所以这一次，我改用 <strong>Godot 4</strong>。</p>

<p>第一个任务，是开发一款可以直接运行的 3D 侏罗纪坦克射击游戏。</p>

<p>游戏设定是：</p>

<p>玩家驾驶一辆现代坦克进入侏罗纪时代，通过鼠标控制炮塔和准星，可以射击恐龙、翼龙、树木、石头以及突然出现的 UFO。</p>

<p>我只提前创建了一个空的 Godot 3D 项目，然后把需求完整交给 Codex。</p>

<p>大约半小时后，游戏已经能够直接运行。</p>

<p>进入场景以后，可以看到一辆完整的 3D 坦克。键盘可以控制前进、后退和转向，鼠标能够控制炮塔方向，点击后会发射炮弹。</p>

<p>炮弹击中树木后，树会倒下。</p>

<p>场景里还出现了多种不同外形的恐龙和天空中的翼龙。玩家可以驾驶坦克在地图中寻找并攻击这些目标。</p>

<p>更出乎意料的是，它还实现了随机出现的 UFO。</p>

<p>UFO 不只是一个装饰模型，而是会主动攻击玩家。坦克可以转动炮塔进行还击，命中后 UFO 会坠落并发生爆炸。</p>

<p>它还加入了环境音效、射击音效、爆炸效果，以及不同类型的恐龙模型。</p>

<p>这个项目当然还称不上完整商业游戏。</p>

<p>画面精细度、敌人 AI、碰撞反馈和关卡设计都有提升空间。</p>

<p>但它已经不是一段用来演示语法的代码，而是一款具备基本循环的游戏原型：</p>

<p><strong>移动、瞄准、射击、敌人攻击、目标被摧毁、爆炸反馈。</strong></p>

<p>从一个空的 Godot 项目到能够运行的三维射击原型，大约用了半小时。</p>

<p>这已经足以说明，GPT-5.6 Sol 的优势不是只会生成某一段代码，而是能够在一个真实工程里持续创建场景、脚本、节点和交互逻辑，最后把它们拼成一个完整结果。</p>

<hr />

<h1 id="第七轮测试提示词越短它能不能自己发挥">第七轮测试：提示词越短，它能不能自己发挥？</h1>

<p>完成侏罗纪坦克游戏后，我又测试了一个相反的方向。</p>

<p>前一个任务的提示词非常详细，几乎把玩法、操作方式和场景元素都规定好了。</p>

<p>这一次，我故意只给它一个很短的任务：</p>

<p>使用 Godot 4 开发一款可以直接运行的 3D 空战原型。玩家驾驶 A-10 攻击机，可以攻击地面的坦克和装甲车，需要模拟导弹发射和机炮射击，其余部分由模型自行发挥。</p>

<p>大约 20 分钟后，项目完成。</p>

<p>游戏支持第三人称和第一人称视角切换。</p>

<p>飞机可以：</p>

<ul>
  <li>加速和减速；</li>
  <li>拉升和俯冲；</li>
  <li>左右转弯；</li>
  <li>进行滚转；</li>
  <li>发射机炮；</li>
  <li>发射导弹；</li>
  <li>躲避敌方导弹；</li>
  <li>攻击地面目标。</li>
</ul>

<p>画面中还会实时显示飞机速度。</p>

<p>第一人称座舱视角的效果尤其不错，导弹发射、飞行和爆炸也已经形成完整反馈。</p>

<p>测试过程中，我还因为操作失误直接撞到了地面。这从另一个侧面说明，它确实实现了飞机和地形之间的碰撞，而不只是播放一段预设动画。</p>

<p>这个案例说明，GPT-5.6 Sol 不仅能够根据详细规格执行，也能够在提示词非常简短的情况下自行补全大量设计。</p>

<p>但这并不意味着提示词越短越好。</p>

<p>提示词越短，模型发挥空间越大，结果也越不可控。</p>

<p>如果只是做创意原型，这种自主发挥非常有价值。</p>

<p>如果开发的是正式产品，仍然应该明确规定控制方式、核心玩法、性能要求、代码结构和验收标准。</p>

<hr />

<h1 id="第八轮测试从零开发一套真正可用的-ios-背单词产品">第八轮测试：从零开发一套真正可用的 iOS 背单词产品</h1>

<p>整个测试中，最复杂、也最有代表性的案例，是一套原生 iOS 背单词产品。</p>

<p>这次我没有让它开发一个只有几个页面的小型 MVP，而是明确告诉它：</p>

<p><strong>除非遇到无法解决的技术障碍，否则不要主动缩小范围，尽可能实现接近最终产品的体验。</strong></p>

<p>整个产品包含三个部分：</p>

<ol>
  <li>原生 iOS App；</li>
  <li>Chrome 扩展插件；</li>
  <li>Supabase 云端数据和大模型 API。</li>
</ol>

<p>Chrome 扩展负责用户阅读英文网页时的取词。</p>

<p>用户双击不认识的单词后，扩展需要显示：</p>

<ul>
  <li>中文解释；</li>
  <li>当前语境中的含义；</li>
  <li>英文例句；</li>
  <li>发音；</li>
  <li>原始网页句子。</li>
</ul>

<p>用户可以把这些单词保存到 Supabase。</p>

<p>iOS App 再从 Supabase 中读取词库，并根据用户保存的单词生成学习计划。</p>

<p>更复杂的是，我还要求它把用户学过的单词随机组合起来，通过 OpenRouter 调用大模型生成一篇英文短文，让这些单词自然地出现在文章中，帮助用户在语境中强化记忆。</p>

<p>App 使用 Swift 和 SwiftUI 开发。</p>

<p>整个开发过程持续了一个多小时，中间也不是完全一次成功。我让 Codex 继续修复了多轮 Bug，才最终得到能够完整运行的版本。</p>

<p>这一点必须说清楚：</p>

<p><strong>它不是一句提示词下去，几分钟后就凭空变出一个完全无 Bug 的商业产品。</strong></p>

<p>但真正重要的是，它在遇到问题后没有停在一个残缺版本，而是继续修改，最终把整条产品链路跑通了。</p>

<h3 id="账号和云端同步">账号和云端同步</h3>

<p>App 首先实现了注册和登录。</p>

<p>用户创建账号后，首页会显示当前词库、学习进度和学习状态。</p>

<p>Chrome 扩展也可以登录同一个账号，并提供：</p>

<ul>
  <li>自动保存查过的单词；</li>
  <li>保存网页语境；</li>
  <li>隐私模式；</li>
  <li>词库同步等选项。</li>
</ul>

<p>我在一篇英文文章中连续双击了多个单词。</p>

<p>扩展能够弹出翻译卡片，显示单词在当前句子中的具体意思，而不只是给出脱离语境的词典解释。</p>

<p>随后，我把八个单词保存到了词库。</p>

<p>回到 iOS App 后，这八个单词已经同步出现。</p>

<h3 id="学习计划和语境复习">学习计划和语境复习</h3>

<p>点击开始学习后，App 会自动创建一轮学习计划。</p>

<p>每个单词不仅包含中文解释，还会显示用户当时在网页中看到它的原始句子。</p>

<p>这点非常重要。</p>

<p>很多背单词软件只保存单词本身，过几天后用户已经忘记当时为什么查这个词。</p>

<p>保留原始网页语境，可以让记忆重新和具体阅读场景建立联系。</p>

<h3 id="用生词生成专属短文">用生词生成专属短文</h3>

<p>完成单词学习后，用户可以选择文章主题，再点击“生成专属短文”。</p>

<p>我选择了四个刚刚学习的单词。</p>

<p>生成完成后，这四个单词都自然出现在短文中，并且被高亮显示。</p>

<p>页面还支持：</p>

<ul>
  <li>英文短文阅读；</li>
  <li>中文翻译；</li>
  <li>重点单词高亮；</li>
  <li>整篇文章朗读；</li>
  <li>完成阅读后进入练习。</li>
</ul>

<p>其中朗读功能的声音比较机械，明显使用的是系统级语音合成。</p>

<p>这也是整个产品中比较明显的不足。</p>

<p>后续可以将它替换成质量更高的大模型语音 API，让长文章朗读听起来更自然。</p>

<h3 id="选择题听力填空和口语识别">选择题、听力、填空和口语识别</h3>

<p>读完短文后，App 会自动进入巩固练习。</p>

<p>它实现了：</p>

<ul>
  <li>单词选择题；</li>
  <li>正确与错误反馈；</li>
  <li>听力题；</li>
  <li>单词填空；</li>
  <li>录音；</li>
  <li>英语口语识别；</li>
  <li>错题回顾。</li>
</ul>

<p>我实际录入了一句英文，App 成功识别出了说话内容。</p>

<p>完成整轮学习后，它还会生成学习总结，显示：</p>

<ul>
  <li>本轮学习结果；</li>
  <li>需要加强的单词；</li>
  <li>错题；</li>
  <li>学习进度；</li>
  <li>解锁的徽章；</li>
  <li>刚才生成的短文。</li>
</ul>

<p>词库页面中，每个通过 Chrome 扩展保存的单词也可以单独打开，查看解释和原始语境。</p>

<h3 id="这个案例真正说明了什么">这个案例真正说明了什么？</h3>

<p>这个项目最有价值的地方，不是某一个页面设计得多漂亮。</p>

<p>而是 GPT-5.6 Sol 打通了完整的数据链路：</p>

<p><strong>网页取词 → Chrome 扩展 → Supabase → iOS App → 学习计划 → 大模型生成短文 → 练习 → 学习总结。</strong></p>

<p>它同时处理了：</p>

<ul>
  <li>Chrome 扩展开发；</li>
  <li>SwiftUI 界面；</li>
  <li>用户注册和登录；</li>
  <li>云端数据库；</li>
  <li>数据同步；</li>
  <li>大模型 API；</li>
  <li>文章生成；</li>
  <li>语音播放；</li>
  <li>录音和语音识别；</li>
  <li>学习状态管理。</li>
</ul>

<p>从最终完成度来看，这一次 GPT-5.6 Sol 开发的版本，甚至比我之前使用 Claude Fable 5 开发的版本更完整。</p>

<p>提示词中要求的大部分功能都实现了，其中一些学习流程和交互细节还超出了我原本的预期。</p>

<p>当然，这仍然是原型，而不是可以直接上架的正式产品。</p>

<p>真正发布前，还需要继续处理：</p>

<ul>
  <li>API Key 的安全存储；</li>
  <li>后端代理；</li>
  <li>数据库权限；</li>
  <li>隐私政策；</li>
  <li>异常状态；</li>
  <li>离线模式；</li>
  <li>订阅和付费；</li>
  <li>App Store 审核要求；</li>
  <li>更自然的语音合成。</li>
</ul>

<p>但它已经证明了一件事：</p>

<p><strong>复杂 Agent 模型正在从“帮你写代码”，走向“帮你搭建产品”。</strong></p>

<hr />

<h1 id="第九轮测试让它接管浏览器创建-tinkercad-房屋模型">第九轮测试：让它接管浏览器创建 Tinkercad 房屋模型</h1>

<p>最后，我测试了 GPT-5.6 Sol 的浏览器自动化能力。</p>

<p>我让 Codex 接管浏览器，进入 Tinkercad，创建一个简单的房屋三维模型。</p>

<p>它首先进入 3D 设计工作区，然后开始寻找可以使用的元素。</p>

<p>原本我以为它会使用立方体、屋顶、门窗等基本几何体，从零搭建一座房子。</p>

<p>但它很快清空了当前内容，在搜索框中直接搜索“房子”，找到一个现成房屋模型，拖到工作区，再对尺寸和参数进行调整。</p>

<p>最后，它保存了这个房屋模型，并告诉我任务已经完成。</p>

<p>这个结果非常有意思。</p>

<p>从任务目标来看，我只要求它“创建一个简单的房子模型”，并没有明确规定必须从几何体开始搭建。</p>

<p>所以它并没有违反指令。</p>

<p>它只是发现了一条更快完成目标的路径。</p>

<p>这说明 GPT-5.6 Sol 已经不再机械地把每一个动作都从头执行，而是会观察环境、寻找现有资源，再选择成本更低的方案。</p>

<p>但这个案例也带来了一个非常重要的提醒：</p>

<p><strong>模型完成了任务，不代表它使用的是你预期的方法。</strong></p>

<p>如果我的真实目的不是得到一座房子，而是测试它能否使用基本几何体完成建模，那么提示词中就必须明确写出：</p>

<ul>
  <li>禁止使用现成房屋模型；</li>
  <li>必须从立方体、屋顶和门窗开始；</li>
  <li>必须展示完整建模步骤；</li>
  <li>最终模型需要由指定数量的基本形状组成。</li>
</ul>

<p>否则，模型会优先优化最终结果，而不是遵循你脑海中没有写出来的过程。</p>

<hr />

<h2 id="三组测试之后我认为-sol-真正强在这五个地方">三组测试之后，我认为 Sol 真正强在这五个地方</h2>

<p>把 SVG、Three.js、Godot、iOS 和浏览器自动化放在一起看，GPT-5.6 Sol 的特点已经非常明显。</p>

<h3 id="第一长任务韧性明显提高了">第一，长任务韧性明显提高了</h3>

<p>过去使用代码 Agent，经常会遇到一种情况：</p>

<p>模型完成了表面修改，测试还没跑完，边界条件没有处理，文档也没有同步，然后就告诉你任务已经完成。</p>

<p>GPT-5.6 Sol 更愿意继续追踪问题。</p>

<p>尤其是在 iOS App 开发中，它经历了一个多小时和多轮 Bug 修复，最终仍然把 Chrome 扩展、Supabase、SwiftUI 和大模型接口连接了起来。</p>

<p>它不是不会失败。</p>

<p>它的提升在于，失败后更愿意继续做。</p>

<h3 id="第二它更擅长完成整条链路">第二，它更擅长完成整条链路</h3>

<p>很多模型可以单独写一个 SwiftUI 页面，也可以单独写一个 Chrome 扩展。</p>

<p>真正困难的是把这些部分连接起来。</p>

<p>Sol 在这次测试中表现最突出的能力，正是把不同技术栈组合成一个完整工作流。</p>

<p>它不是只生成一堆互不相关的文件，而是尝试让数据真正从一个系统流向另一个系统。</p>

<h3 id="第三它会主动补全提示词没有写明的内容">第三，它会主动补全提示词没有写明的内容</h3>

<p>A-10 游戏的提示词非常短，但它主动补充了：</p>

<ul>
  <li>第一人称视角；</li>
  <li>飞行速度显示；</li>
  <li>导弹攻击；</li>
  <li>飞机滚转；</li>
  <li>地面碰撞；</li>
  <li>敌方攻击。</li>
</ul>

<p>这种自主性在创意原型中非常有价值。</p>

<p>但在正式项目中，也意味着必须提前写清楚边界。</p>

<h3 id="第四它仍然会犯低级的空间和物理错误">第四，它仍然会犯低级的空间和物理错误</h3>

<p>几维鸟倒着骑车、复合弓方向错误、弓片弯曲方向错误、农夫返回时倒立、飞机机舱过道过窄。</p>

<p>这些错误有一个共同特点：</p>

<p>模型实现了主要功能，却没有完全理解现实世界中的结构、比例和方向。</p>

<p>所以在涉及机械、建筑、医学、工程和真实物理结构时，不能因为动画“能动起来”，就默认它是正确的。</p>

<h3 id="第五它会为了完成目标主动寻找捷径">第五，它会为了完成目标主动寻找捷径</h3>

<p>Tinkercad 房屋模型是最直观的例子。</p>

<p>它没有从零搭建，而是直接搜索现成模型。</p>

<p>这和 METR 测试中发现的某些行为虽然性质不同，但背后有一个相似点：</p>

<p><strong>模型会主动寻找最快满足完成条件的路径。</strong></p>

<p>这不一定是坏事。</p>

<p>在人类工作中，复用现成资源本来就是一种效率。</p>

<p>问题在于，如果某些路径不能使用，就必须提前写进约束，而不能指望模型自行理解。</p>

<hr />

<h2 id="跑分很强但绝不是全面碾压">跑分很强，但绝不是全面碾压</h2>

<p>GPT-5.6 Sol 在 Terminal-Bench 2.1 中获得 88.8 分，Ultra 模式达到 91.9。</p>

<p>它在 DeepSWE、BrowseComp 和 OSWorld 等涉及终端、网页和计算机操作的测试中也表现突出。</p>

<p>这些结果和我的实际体验基本一致。</p>

<p>Sol 最强的并不是单次代码补全，而是：</p>

<ul>
  <li>使用终端；</li>
  <li>创建和修改多个文件；</li>
  <li>调用工具；</li>
  <li>观察运行结果；</li>
  <li>根据错误继续修复；</li>
  <li>最终完成一个可运行项目。</li>
</ul>

<p>但在 SWE-Bench Pro 中，Sol 的成绩仍然明显落后于 Fable 5。</p>

<p>Artificial Analysis 的综合测试中，Sol Max 也没有全面超过 Fable 5。</p>

<p>这说明它并不是在所有任务中都更聪明。</p>

<p>我的判断是：</p>

<p><strong>Sol 更擅长把东西做出来，而且做得完整、可运行；Fable 5 在部分需要细腻理解、代码可读性和严密分析的任务中，仍然可能更强。</strong></p>

<p>这两个模型并不是简单的上下级关系，而是工作风格不同。</p>

<hr />

<h2 id="gpt-56-sol-应该怎么用才能发挥真正优势">GPT-5.6 Sol 应该怎么用，才能发挥真正优势？</h2>

<h3 id="1-不要只写一句帮我开发一个-app">1. 不要只写一句“帮我开发一个 App”</h3>

<p>Sol 的自主性很强。</p>

<p>如果不给出验收标准，它会自己判断什么叫完成，而这个判断不一定和你相同。</p>

<p>一个完整任务至少应该写清楚：</p>

<ul>
  <li>最终目标；</li>
  <li>技术栈；</li>
  <li>必须实现的功能；</li>
  <li>不允许使用的方法；</li>
  <li>测试方式；</li>
  <li>完成条件；</li>
  <li>哪些操作必须人工确认。</li>
</ul>

<h3 id="2-明确结果约束和过程约束">2. 明确“结果约束”和“过程约束”</h3>

<p>Tinkercad 案例里，我只规定了结果，没有规定过程，所以它直接复用了现成模型。</p>

<p>以后可以把约束分成两类。</p>

<p><strong>结果约束：</strong></p>

<ul>
  <li>最终必须生成什么；</li>
  <li>必须达到什么质量；</li>
  <li>必须通过哪些测试。</li>
</ul>

<p><strong>过程约束：</strong></p>

<ul>
  <li>必须使用什么方法；</li>
  <li>禁止使用哪些捷径；</li>
  <li>哪些步骤必须展示；</li>
  <li>哪些资源不能调用。</li>
</ul>

<p>只写结果，模型会寻找最快路径。</p>

<p>结果和过程都写清楚，才能得到真正符合预期的交付。</p>

<h3 id="3-重要任务必须要求它实际验证">3. 重要任务必须要求它实际验证</h3>

<p>不要让模型只说“已经完成”。</p>

<p>应该要求它：</p>

<ul>
  <li>运行项目；</li>
  <li>执行测试；</li>
  <li>检查构建结果；</li>
  <li>提供错误日志；</li>
  <li>验证主要功能；</li>
  <li>列出仍然存在的问题。</li>
</ul>

<p>在 iOS App 项目中，真正有价值的并不是它生成了多少代码，而是最后确实完成了注册、取词、同步、文章生成和练习流程。</p>

<h3 id="4-日常任务不要一上来就开-max-或-ultra">4. 日常任务不要一上来就开 Max 或 Ultra</h3>

<p>普通代码修改和文档整理，Medium 或 High 通常已经足够。</p>

<p>Max 更适合复杂架构、疑难故障和高风险决策。</p>

<p>Ultra 则只适合能够真正并行拆分的任务。</p>

<p>模型越强，越要学会控制计算量，而不是无脑把所有选项开到最高。</p>

<h3 id="5-把不同模型放到最适合的工序">5. 把不同模型放到最适合的工序</h3>

<p>目前更务实的方式，不是寻找一个包打天下的模型，而是按照任务路由：</p>

<ul>
  <li>Sol：长流程执行、工具调用、完整产品交付；</li>
  <li>Fable 5：架构审查、代码可读性、复杂分析；</li>
  <li>Luna：批量处理、提取、转换和低成本任务；</li>
  <li>Ultra：能够真正拆成多个独立方向的大型项目。</li>
</ul>

<p>可以先让 Fable 5 设计架构，再让 Sol 实现。</p>

<p>也可以先让 Sol 完成产品，再让 Fable 5 进行代码审查。</p>

<p>模型之间的竞争，正在逐渐变成不同工序之间的分工。</p>

<hr />

<h2 id="一套更适合-gpt-56-sol-的任务模板">一套更适合 GPT-5.6 Sol 的任务模板</h2>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>你是本项目的交付负责人，不是只提供建议的顾问。

目标：
[写清楚最终需要解决的问题]

最终交付物：
[代码、文件、报告、应用或可运行项目]

技术要求：
[技术栈、平台、依赖和版本]

必须实现：
1. [核心功能]
2. [核心功能]
3. [核心功能]

禁止事项：
1. [不能使用的捷径]
2. [不能修改的内容]
3. [未经批准不能执行的操作]

验收标准：
1. 项目可以实际运行或构建。
2. 必须执行相关测试。
3. 必须验证主要用户流程。
4. 不得只根据代码推测功能可用。
5. 必须列出仍然存在的问题。

工作规则：
1. 先检查现有项目和环境。
2. 制定实现计划，再开始修改。
3. 遇到错误后继续定位和修复。
4. 涉及删除数据、发布、付款或生产环境时，必须暂停。
5. 最终只交付完成结果、验证记录、已知问题和后续建议。
</code></pre></div></div>

<p>这套模板最重要的不是让提示词变长。</p>

<p>它真正解决的是四个问题：</p>

<p><strong>什么才算完成，哪些捷径不能走，什么时候必须停下来，以及最后拿什么证明结果可信。</strong></p>

<hr />

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

<p>完成这九轮测试后，我认为 GPT-5.6 Sol 并不是一个在所有方面都碾压其他模型的“全能模型”。</p>

<p>它会把几维鸟画反，会把复合弓拿反，会让农夫倒立，也会在 Tinkercad 里直接找一个现成房子交差。</p>

<p>但与此同时，它也能在半小时内做出一款可玩的 Godot 三维射击游戏，在简短提示词下自行补全空战玩法，还能持续一个多小时，把 Chrome 扩展、Supabase、SwiftUI 和大模型 API 连接成一套真正能够运行的学习产品。</p>

<p>这就是 GPT-5.6 Sol 最值得关注的地方。</p>

<p>过去，我们判断一个模型好不好，主要看它能不能给出正确答案。</p>

<p>现在，更值得问的问题变成了：</p>

<p>它能不能在长时间工作后仍然记得最初目标？</p>

<p>能不能自己发现缺失的功能？</p>

<p>能不能在遇到 Bug 后继续修复？</p>

<p>能不能把代码、界面、数据库、测试和最终交付连在一起？</p>

<p>能不能真正运行项目，而不只是生成几段看起来合理的代码？</p>

<p>从这次测试来看，GPT-5.6 Sol 已经越来越接近一个能够负责完整交付的 Agent。</p>

<p>它不一定是每一道题里最聪明的学生。</p>

<p>但在真实工作中，它可能是那个最愿意把项目做完、把现场收拾干净，最后还回来检查一遍的人。</p>

<p>而这，往往比跑分多拿几分更重要。</p>

<p><em>本文基于截至 2026 年 7 月 10 日的公开资料和实际测试结果整理。不同账户、运行环境、推理级别和工具权限可能导致结果存在差异。</em></p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="GPT-5.6 Sol" /><category term="GPT-5.6" /><category term="OpenAI" /><category term="Codex" /><category term="AI智能体" /><category term="AI编程" /><category term="Vibe Coding" /><category term="Godot 4" /><category term="SwiftUI" /><category term="AGI" /><category term="AIGC" /><summary type="html"><![CDATA[GPT-5.6 Sol 真正可怕的，不是更聪明，而是更能把活干完]]></summary></entry><entry><title type="html">🚀Claude Code有后门？立即锁进Docker Sandboxes里！sbx完整实测：Claude Code、Codex、OpenCode如何安全隔离运行！防隐私泄露、防恶意Skill和MCP</title><link href="https://www.aivi.fyi//llms/Claude-Code-Docker-Sandboxes" rel="alternate" type="text/html" title="🚀Claude Code有后门？立即锁进Docker Sandboxes里！sbx完整实测：Claude Code、Codex、OpenCode如何安全隔离运行！防隐私泄露、防恶意Skill和MCP" /><published>2026-07-04T00:00:00+08:00</published><updated>2026-07-04T00:00:00+08:00</updated><id>https://www.aivi.fyi//llms/Claude-Code-Docker-Sandboxes</id><content type="html" xml:base="https://www.aivi.fyi//llms/Claude-Code-Docker-Sandboxes"><![CDATA[<h1 id="docker-sandboxes-入门到常用命令把-ai-agent-关进安全开发舱">Docker Sandboxes 入门到常用命令：把 AI Agent 关进“安全开发舱”</h1>

<p>AI 编程工具越来越强，但问题也越来越现实：我们到底要不要让 Claude Code、Codex、Gemini 这类 agent 直接跑在自己的电脑上？它们能读项目、执行命令、安装依赖、访问网络，效率很高，但风险也不小。Docker Sandboxes 的定位就是给这些 AI agent 提供一个隔离运行环境：让 agent 能开发、能跑命令、能装依赖，但不要默认拥有整台电脑的访问能力。</p>

<p>Docker 官方文档里对 <code class="language-plaintext highlighter-rouge">sbx</code> 的定位很清楚：它是 Docker Sandboxes 的 CLI。你可以用它启动 agent、管理 sandbox、控制网络访问、挂载项目目录、转发端口、保存 secret，甚至让 agent 在 sandbox 内使用独立 Docker daemon 构建镜像。更重要的是，Docker Desktop 不是使用 <code class="language-plaintext highlighter-rouge">sbx</code> 的必要条件。</p>

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

<h2 id="一安装-docker-sandboxes">一、安装 Docker Sandboxes</h2>

<h3 id="macos-安装">macOS 安装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew trust docker/tap
brew <span class="nb">install </span>docker/tap/sbx
sbx login

<span class="nb">cd</span> ~/my-project
sbx run claude
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sbx login</code> 会打开浏览器，让你用 Docker 账号登录。第一次登录或重置策略后，CLI 会让你选择默认网络策略：Open、Balanced、Locked Down。官方建议多数开发工作从 Balanced 开始，因为它默认拒绝未知出站流量，但允许常见开发站点、AI Provider、包管理器、代码托管、容器 registry 等。</p>

<h3 id="windows-安装">Windows 安装</h3>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">winget</span><span class="w"> </span><span class="nx">install</span><span class="w"> </span><span class="nt">-h</span><span class="w"> </span><span class="nx">Docker.sbx</span><span class="w">
</span><span class="n">sbx</span><span class="w"> </span><span class="nx">login</span><span class="w">

</span><span class="n">cd</span><span class="w"> </span><span class="nx">~/my-project</span><span class="w">
</span><span class="n">sbx</span><span class="w"> </span><span class="nx">run</span><span class="w"> </span><span class="nx">claude</span><span class="w">
</span></code></pre></div></div>

<p>Windows 用户同样通过 <code class="language-plaintext highlighter-rouge">sbx login</code> 登录，然后进入项目目录启动 agent。常规体验和 macOS 类似。</p>

<h3 id="linux-安装">Linux 安装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://get.docker.com | <span class="nb">sudo </span><span class="nv">REPO_ONLY</span><span class="o">=</span>1 sh
<span class="nb">sudo </span>apt-get <span class="nb">install </span>docker-sbx
<span class="nb">sudo </span>usermod <span class="nt">-aG</span> kvm <span class="nv">$USER</span>
newgrp kvm
sbx login

<span class="nb">cd</span> ~/my-project
sbx run claude
</code></pre></div></div>

<p>Linux 上需要注意 KVM 权限。执行 <code class="language-plaintext highlighter-rouge">usermod -aG kvm</code> 后，需要重新登录，或者用 <code class="language-plaintext highlighter-rouge">newgrp kvm</code> 让当前 shell 立即获得权限。</p>

<h2 id="二最基础的日常命令">二、最基础的日常命令</h2>

<p>启动一个 Claude Code sandbox：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude
</code></pre></div></div>

<p>查看已有 sandbox：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">ls</span>
</code></pre></div></div>

<p>停止 sandbox，但保留状态：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx stop &lt;sandbox-name&gt;
</code></pre></div></div>

<p>删除 sandbox，彻底清理它的内部状态：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">rm</span> <span class="nt">--force</span> &lt;sandbox-name&gt;
</code></pre></div></div>

<p>进入 sandbox shell：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">exec</span> <span class="nt">-it</span> &lt;sandbox-name&gt; bash
</code></pre></div></div>

<p>官方文档给出的基本生命周期就是：<code class="language-plaintext highlighter-rouge">run</code> 启动，<code class="language-plaintext highlighter-rouge">ls</code> 查看，<code class="language-plaintext highlighter-rouge">stop</code> 暂停，<code class="language-plaintext highlighter-rouge">rm</code> 清理。要记住，<code class="language-plaintext highlighter-rouge">stop</code> 只是停掉，状态还在；<code class="language-plaintext highlighter-rouge">rm</code> 才是删除。删除 sandbox 后，里面安装的包、内部 Docker images、containers、volumes 都会一起消失。但如果你使用的是 direct mount 模式，agent 已经写到 host 项目目录里的文件不会因为 <code class="language-plaintext highlighter-rouge">sbx rm</code> 被删除。</p>

<h2 id="三给-sandbox-起名字">三、给 sandbox 起名字</h2>

<p>默认情况下，<code class="language-plaintext highlighter-rouge">sbx run claude</code> 会根据 agent 和工作目录生成名字，比如 <code class="language-plaintext highlighter-rouge">claude-test</code>。但更推荐显式命名：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude <span class="nt">--name</span> myproject-claude
</code></pre></div></div>

<p>之后你可以从任意目录重新连接：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run <span class="nt">--name</span> myproject-claude
</code></pre></div></div>

<p>如果你想对同一个项目跑多个实验，也可以起不同名字：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude <span class="nt">--name</span> feature ~/my-project
sbx run claude <span class="nt">--name</span> spike ~/my-project
</code></pre></div></div>

<p>两个 sandbox 可以挂载同一个 workspace，但它们的内部状态彼此独立。</p>

<h2 id="四如何传参数给-claude-code">四、如何传参数给 Claude Code</h2>

<p>这是很多人第一次会踩坑的地方。<code class="language-plaintext highlighter-rouge">sbx run</code> 有自己的参数，Claude Code 也有自己的参数。要把参数传给 sandbox 里的 Claude Code，需要用 <code class="language-plaintext highlighter-rouge">--</code> 分隔：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude <span class="nt">--</span> <span class="nt">--dangerously-skip-permissions</span>
</code></pre></div></div>

<p>规则是：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude <span class="o">[</span>sbx自己的参数] <span class="nt">--</span> <span class="o">[</span>传给claude的参数]
</code></pre></div></div>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude <span class="nt">--name</span> claude-test <span class="nt">--</span> <span class="nt">--dangerously-skip-permissions</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">--dangerously-skip-permissions</code> 不是 <code class="language-plaintext highlighter-rouge">sbx</code> 的参数，而是 Claude Code 的参数。如果少了中间的 <code class="language-plaintext highlighter-rouge">--</code>，<code class="language-plaintext highlighter-rouge">sbx</code> 会报：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ERROR: unknown flag: --dangerously-skip-permissions
</code></pre></div></div>

<p>需要注意的是，在 <code class="language-plaintext highlighter-rouge">sbx</code> 里用这个参数，风险确实比直接在 host 上小，但并不是零风险。Direct mount 模式下，Claude Code 仍然可以修改当前挂载进去的项目文件。</p>

<h2 id="五direct-mode-和-clone-mode-怎么选">五、Direct Mode 和 Clone Mode 怎么选</h2>

<p>默认是 Direct Mode。你在项目目录里运行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/Projects/myproject
sbx run claude
</code></pre></div></div>

<p>这时当前项目目录会被直接挂进 sandbox。Claude 改文件，host 上立即可见。这个模式最适合日常开发，尤其是 macOS/iOS 项目：Claude 在 sandbox 里改代码，Xcode 在 host 上构建和运行。</p>

<p>更隔离的方式是 Clone Mode：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/Projects/myproject
sbx run <span class="nt">--clone</span> claude
</code></pre></div></div>

<p>Clone Mode 会在 sandbox 里创建一个私有 Git clone，host 仓库以只读方式挂载。agent 的提交可以通过 host 上的 <code class="language-plaintext highlighter-rouge">sandbox-&lt;name&gt;</code> remote 拉回来。这个模式适合高风险重构、并行任务、探索性修改。缺点是 host 工作区不会立即看到改动，需要 <code class="language-plaintext highlighter-rouge">git fetch sandbox-&lt;name&gt;</code> 取回。</p>

<p>Direct Mode 简单高效，Clone Mode 隔离更强。个人日常开发建议默认 Direct Mode；不确定 agent 会不会大改时，再用 <code class="language-plaintext highlighter-rouge">--clone</code>。</p>

<h2 id="六多个目录和只读挂载">六、多个目录和只读挂载</h2>

<p>你可以给 sandbox 挂多个目录：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx run claude ~/project-a ~/shared-libs:ro ~/docs:ro
</code></pre></div></div>

<p>第一个路径是主 workspace，agent 会从这里启动。后面的路径是额外 workspace。加 <code class="language-plaintext highlighter-rouge">:ro</code> 表示只读挂载，适合挂文档、参考代码、公共库，避免 agent 误改。</p>

<p>不建议把整个 <code class="language-plaintext highlighter-rouge">~/Projects</code> 或 <code class="language-plaintext highlighter-rouge">~</code> 都挂进去。更安全的做法是：每个项目进入自己的目录启动，让 sandbox 只看到当前项目和必要的只读参考资料。</p>

<h2 id="七端口转发让浏览器访问-sandbox-里的服务">七、端口转发：让浏览器访问 sandbox 里的服务</h2>

<p>sandbox 默认是网络隔离的。agent 在里面启动了开发服务器后，host 浏览器不能直接访问。需要发布端口：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx ports my-sandbox <span class="nt">--publish</span> 8080:3000
open http://localhost:8080
</code></pre></div></div>

<p>也可以让系统自动选择 host 端口：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx ports my-sandbox <span class="nt">--publish</span> 3000
sbx ports my-sandbox
</code></pre></div></div>

<p>停止转发：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx ports my-sandbox <span class="nt">--unpublish</span> 8080:3000
</code></pre></div></div>

<p>这对前端项目、API 服务、文档站点都很实用。</p>

<h2 id="八复制文件进出-sandbox">八、复制文件进出 sandbox</h2>

<p>如果文件不在挂载的 workspace 里，可以用 <code class="language-plaintext highlighter-rouge">sbx cp</code>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">cp</span> ./config.json my-sandbox:/home/user/
sbx <span class="nb">cp </span>my-sandbox:/home/user/output.log ./
sbx <span class="nb">cp</span> ./src/ my-sandbox:/home/user/src
</code></pre></div></div>

<p>注意，复制时必须有一端使用 <code class="language-plaintext highlighter-rouge">SANDBOX:PATH</code> 形式。Docker 文档也说明，不支持直接在两个 sandbox 之间复制。</p>

<h2 id="九网络策略给-agent-上访问规则">九、网络策略：给 agent 上“访问规则”</h2>

<p><code class="language-plaintext highlighter-rouge">sbx</code> 的网络策略非常重要。官方文档说明，sandbox 出站 HTTP/HTTPS 流量会通过 host 上的代理执行访问规则。第一次登录时可以选择 Open、Balanced、Locked Down。</p>

<p>手动初始化策略：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx policy init balanced
</code></pre></div></div>

<p>允许访问某个域名：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx policy allow network api.anthropic.com
</code></pre></div></div>

<p>阻止某个域名：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx policy deny network ads.example.com
</code></pre></div></div>

<p>只对某个 sandbox 生效：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx policy allow network <span class="nt">--sandbox</span> my-sandbox api.example.com
</code></pre></div></div>

<p>一次允许多个：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx policy allow network <span class="s2">"api.anthropic.com,*.npmjs.org,*.pypi.org"</span>
</code></pre></div></div>

<p>查看策略：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx policy <span class="nb">ls</span>
</code></pre></div></div>

<p>如果公司启用了组织级治理，local policy 会失效。Docker FAQ 明确说，组织管理员可以通过 Docker Admin Console 集中管理网络和文件系统策略；当组织治理开启时，它会替代本机 <code class="language-plaintext highlighter-rouge">sbx policy</code> 规则，本地规则不再参与评估。这是付费组织治理能力，适合团队统一管控 agent 能访问什么、能挂载什么路径。</p>

<h2 id="十secret-和凭据">十、Secret 和凭据</h2>

<p>很多 agent 需要 Anthropic、OpenAI、GitHub 等 token。<code class="language-plaintext highlighter-rouge">sbx secret</code> 用来管理这类凭据。</p>

<p>例如给后续新 sandbox 配 GitHub token：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"</span><span class="si">$(</span>gh auth token<span class="si">)</span><span class="s2">"</span> | sbx secret <span class="nb">set</span> <span class="nt">-g</span> github
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">-g</code> 表示 global，对未来创建的 sandbox 生效。已有 sandbox 不会自动拿到新的 global secret，需要单独配置。</p>

<p>如果你只想在当前 shell 临时传入，也可以用环境变量配合 <code class="language-plaintext highlighter-rouge">sbx run</code>。如果某个环境变量不是 <code class="language-plaintext highlighter-rouge">sbx secret</code> 支持的服务类型，Docker FAQ 建议写入 sandbox 内的 <code class="language-plaintext highlighter-rouge">/etc/sandbox-persistent.sh</code>，让它在 sandbox 生命周期内持久生效。</p>

<h2 id="十一更新-claude-code-和模板">十一、更新 Claude Code 和模板</h2>

<p><code class="language-plaintext highlighter-rouge">sandbox</code> 里的 Claude Code 不等于 host 上的 <code class="language-plaintext highlighter-rouge">claude</code>。如果你卸载了 host 上通过 Homebrew 安装的 Claude Code，<code class="language-plaintext highlighter-rouge">sbx run claude</code> 仍然使用自己的 template。</p>

<p>查看 template：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx template <span class="nb">ls</span>
</code></pre></div></div>

<p>删除旧 Claude template，让下次重新拉取：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx template <span class="nb">rm </span>docker.io/docker/sandbox-templates:claude-code-docker
</code></pre></div></div>

<p>或者用 <code class="language-plaintext highlighter-rouge">IMAGE ID</code> 删除：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx template <span class="nb">rm </span>9a3bab17aae9
</code></pre></div></div>

<p>更新当前已有 sandbox 里的 Claude Code：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">exec</span> &lt;sandbox-name&gt; claude <span class="nt">--version</span>
sbx <span class="nb">exec</span> &lt;sandbox-name&gt; claude update
sbx <span class="nb">exec</span> &lt;sandbox-name&gt; claude <span class="nt">--version</span>
</code></pre></div></div>

<p>如果你想让以后新建 sandbox 默认更新，通常做法是删除旧 sandbox 和旧 template，再重新 <code class="language-plaintext highlighter-rouge">sbx run claude</code>。不要轻易用 <code class="language-plaintext highlighter-rouge">sbx reset</code>，它会清更多状态，包括 sandboxes、cache、policy、secret、登录状态等。</p>

<h2 id="十二关闭遥测数据">十二、关闭遥测数据</h2>

<p>Docker FAQ 说明，<code class="language-plaintext highlighter-rouge">sbx</code> CLI 会收集基础使用数据，例如运行了哪个命令、成功还是失败、耗时、登录用户名等；同时也说明 Docker Sandboxes 不会监控 session、不会读取 prompts、不会访问代码。</p>

<p>如果要关闭 analytics：</p>

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

<p>为了长期生效，写进 zsh 配置：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'export SBX_NO_TELEMETRY=1'</span> <span class="o">&gt;&gt;</span> ~/.zshrc
<span class="nb">source</span> ~/.zshrc
</code></pre></div></div>

<p>验证：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="nv">$SBX_NO_TELEMETRY</span>
</code></pre></div></div>

<p>应输出：</p>

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

<p>如果 <code class="language-plaintext highlighter-rouge">sbx daemon</code> 已经在没有这个变量的环境下启动，可以重启一次：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx daemon stop
<span class="nv">SBX_NO_TELEMETRY</span><span class="o">=</span>1 sbx daemon start <span class="nt">-d</span>
</code></pre></div></div>

<h2 id="十三常用清理命令">十三、常用清理命令</h2>

<p>列出 sandbox：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">ls</span>
</code></pre></div></div>

<p>删除不用的 sandbox：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">rm</span> <span class="nt">--force</span> claude-test1 claude-untitled-folder
</code></pre></div></div>

<p>删除所有 sandbox 前，先确认列表：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">ls</span>
</code></pre></div></div>

<p>再谨慎执行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sbx <span class="nb">rm</span> <span class="nt">--force</span> <span class="si">$(</span>sbx <span class="nb">ls</span> | <span class="nb">awk</span> <span class="s1">'NR&gt;1 {print $1}'</span><span class="si">)</span>
</code></pre></div></div>

<p>如果使用 <code class="language-plaintext highlighter-rouge">--clone</code>，删除前一定要确认改动已经 fetch 回 host 或 push 到远端。Docker 文档提醒，删除 clone-mode sandbox 会一起删除 sandbox 内的 clone；未 fetch 或未 push 的提交会丢失。</p>

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

<p>Docker Sandboxes 的核心价值，不是让 AI agent 变得“绝对安全”，而是把风险控制在更清晰的边界里。它让 Claude Code 这类工具仍然能读写项目、安装依赖、运行服务、构建容器，但不再默认拥有整台电脑的访问面。个人开发可以用 Direct Mode 获得最高效率；高风险任务可以用 Clone Mode；团队环境可以通过组织级 policy 和 audit log 做统一治理。</p>

<p>如果你准备长期使用 AI 编程工具，<code class="language-plaintext highlighter-rouge">sbx</code> 很适合成为默认入口：项目进目录，执行 <code class="language-plaintext highlighter-rouge">sbx run claude</code>，需要跳过 Claude Code 内部确认就用 <code class="language-plaintext highlighter-rouge">--</code> 传参，需要隔离就加 <code class="language-plaintext highlighter-rouge">--clone</code>，不用的 sandbox 及时 <code class="language-plaintext highlighter-rouge">sbx rm</code>。掌握这些命令之后，AI agent 的效率和安全边界会同时变得更可控。</p>]]></content><author><name>AI超元域</name></author><category term="LLMs" /><category term="Claude" /><category term="Claude Code" /><category term="Docker Sandboxes" /><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[Docker Sandboxes 入门到常用命令：把 AI Agent 关进“安全开发舱”]]></summary></entry><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></feed>