<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>FlashJ</title>
  
  <subtitle>Mousebomb&#39;s Blog</subtitle>
  <link href="https://flashj.cn/atom.xml" rel="self"/>
  
  <link href="https://flashj.cn/"/>
  <updated>2026-09-12T01:34:24.819Z</updated>
  <id>https://flashj.cn/</id>
  
  <author>
    <name>Mousebomb</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Configuring thinking-effort switching after hooking the GOAT plan up to opencode</title>
    <link href="https://flashj.cn/opencode-goat-reasoning-variants.html"/>
    <id>https://flashj.cn/opencode-goat-reasoning-variants.html</id>
    <published>2026-09-02T09:19:00.000Z</published>
    <updated>2026-09-12T01:34:24.819Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Symptom"><a href="#Symptom" class="headerlink" title="Symptom"></a>Symptom</h2><p><a href="https://www.flashj.cn/opencode-goat-commandcode-config.html">The previous post got the CommandCode GOAT plan hooked up</a>, and the models chat fine, but there was one detail I never looked at closely: <strong>deepseek-v4-flash won’t expose thinking levels</strong>.</p><p>With the opencode go plan, the same batch of models could switch thinking levels just fine; on goat they were all gone. My first reaction was “the goat plan doesn’t support it” — but after digging in, this had nothing to do with the plan at all. It was <strong>a missing piece of config</strong>.</p><h2 id="TL-DR"><a href="#TL-DR" class="headerlink" title="TL;DR"></a>TL;DR</h2><p>Tweak the config file once more: for every model that needs selectable thinking depth, just add one line:<br><code>&quot;reasoning&quot;: true</code><br>and you’re done.</p><p>For example</p><pre><code>        &quot;deepseek/deepseek-v4-flash&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,</code></pre><p>Oh, and by the way, today I also turned the GOAT plan usage estimator into a live table:</p><p><img src="https://cdn.mousebomb.org/blog/auto/202609021730939.png"></p><p>Project is at: <a href="https://github.com/mousebomb/opencode-go-limits">https://github.com/mousebomb/opencode-go-limits</a></p><h2 id="Trimmed-the-config-a-bit"><a href="#Trimmed-the-config-a-bit" class="headerlink" title="Trimmed the config a bit"></a>Trimmed the config a bit</h2><pre><code class="language-json">&#123;  &quot;$schema&quot;: &quot;https://opencode.ai/config.json&quot;,  &quot;permission&quot;: &#123;  &#125;,  &quot;mcp&quot;: &#123;  &#125;,  &quot;provider&quot;: &#123;    &quot;goat&quot;: &#123;      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,      &quot;name&quot;: &quot;goat&quot;,      &quot;options&quot;: &#123;        &quot;baseURL&quot;: &quot;https://api.commandcode.ai/provider/v1&quot;,        &quot;headers&quot;: &#123;&#125;      &#125;,      &quot;models&quot;: &#123;        &quot;deepseek/deepseek-v4-flash-vision-exp&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash Vision (exp)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.8-Flash&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;stepfun/Step-3.7-Flash&quot;: &#123;          &quot;name&quot;: &quot;Step 3.7 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;poolside/laguna-s-2.1-free&quot;: &#123;          &quot;name&quot;: &quot;Laguna S 2.1&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;meta/muse-spark-1.2&quot;: &#123;          &quot;name&quot;: &quot;Muse Spark 1.2&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;meta/muse-spark-1.2-contributor&quot;: &#123;          &quot;name&quot;: &quot;Muse Spark 1.2 Contributor&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;xai/grok-4.5&quot;: &#123;          &quot;name&quot;: &quot;Grok 4.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 500000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;xai/grok-4.6&quot;: &#123;          &quot;name&quot;: &quot;Grok 4.6&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 500000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;      &#125;    &#125;,    &quot;goat-zdr&quot;: &#123;      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,      &quot;name&quot;: &quot;goat-zdr&quot;,      &quot;options&quot;: &#123;        &quot;baseURL&quot;: &quot;https://api.commandcode.ai/provider/v1&quot;,        &quot;headers&quot;: &#123;          &quot;x-cmd-zdr&quot;: &quot;1&quot;        &#125;      &#125;,      &quot;models&quot;: &#123;        &quot;deepseek/deepseek-v4-pro&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Pro (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;deepseek/deepseek-v4-flash&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;deepseek/deepseek-v4-flash-fast&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash Fast&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;moonshotai/Kimi-K3&quot;: &#123;          &quot;name&quot;: &quot;Kimi K3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;moonshotai/Kimi-K2.7-Code&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.7 Code&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;moonshotai/Kimi-K2.7-Code-Highspeed&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.7 Code HighSpeed&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;moonshotai/Kimi-K2.6&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.6&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;moonshotai/Kimi-K2.5&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;z-ai/glm-5.3-flash&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.3 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;zai-org/GLM-5.3&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;zai-org/GLM-5.2&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.2&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;zai-org/GLM-5.2-Fast&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.2 Fast&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;zai-org/GLM-5.1&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.1&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;zai-org/GLM-5&quot;: &#123;          &quot;name&quot;: &quot;GLM-5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;MiniMaxAI/MiniMax-M3&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;MiniMaxAI/MiniMax-M2.7&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M2.7&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;MiniMaxAI/MiniMax-M2.5&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;xiaomi/mimo-v2.5-pro&quot;: &#123;          &quot;name&quot;: &quot;MiMo V2.5 Pro&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;xiaomi/mimo-v2.5&quot;: &#123;          &quot;name&quot;: &quot;MiMo V2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.8-Max&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 Max&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.8-27B&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 27B&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262144,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.7-Max&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Max&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.7-Plus&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Plus&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.7-Flash&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.6-Max-Preview&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.6 Max Preview&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;Qwen/Qwen3.6-Plus&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.6 Plus&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;stepfun/Step-3.5-Flash&quot;: &#123;          &quot;name&quot;: &quot;Step 3.5 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;tencent/hy3-paid&quot;: &#123;          &quot;name&quot;: &quot;Tencent Hy3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262144,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;tencent/hy4-preview&quot;: &#123;          &quot;name&quot;: &quot;Tencent Hy4 Preview&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;nvidia/nemotron-3-ultra-550b-a55b&quot;: &#123;          &quot;name&quot;: &quot;Nemotron 3 Ultra&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;thinkingmachines/inkling&quot;: &#123;          &quot;name&quot;: &quot;Inkling&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;thinkingmachines/inkling-small&quot;: &#123;          &quot;name&quot;: &quot;Inkling Small&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;,        &quot;gpt-5.6-sol&quot;: &#123;          &quot;name&quot;: &quot;GPT-5.6 Sol&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1050000,            &quot;output&quot;: 262144          &#125;,          &quot;reasoning&quot;: true        &#125;      &#125;    &#125;  &#125;,  &quot;plugin&quot;: [  ]&#125;</code></pre><hr><h2 id="Root-cause-custom-providers-lack-a-reasoning-capability-declaration"><a href="#Root-cause-custom-providers-lack-a-reasoning-capability-declaration" class="headerlink" title="Root cause: custom providers lack a reasoning capability declaration"></a>Root cause: custom providers lack a reasoning capability declaration</h2><p>The entry point where opencode generates “thinking levels” (variants) for a model is the <code>variants()</code> function, and the very first gatekeeper is:</p><pre><code class="language-ts">if (!model.capabilities.reasoning) return &#123;&#125;   // 没声明推理能力 → 直接不给档位</code></pre><p>Built-in providers (opencode-go, official deepseek, etc.) get their model metadata from <a href="https://models.dev/">models.dev</a>, which ships with <code>reasoning: true</code> and <code>reasoning_options</code> out of the box, so thinking levels show up.</p><p>goat, on the other hand, is a <strong>custom provider</strong> (<code>@ai-sdk/openai-compatible</code>), and all its models were hand-written by me in <code>opencode.json</code>. At the time I only wrote <code>name</code> and <code>limit</code>, <strong>not <code>reasoning: true</code></strong> → the capability declaration defaults to false → <code>variants()</code> returns empty right away, and of course the TUI doesn’t show thinking levels.</p><p>It’s crystal clear when you read the code (<code>packages/opencode/src/provider/transform.ts</code>):</p><pre><code class="language-ts">case &quot;@ai-sdk/openai-compatible&quot;:  const efforts = [...WIDELY_SUPPORTED_EFFORTS]        // [&quot;low&quot;,&quot;medium&quot;,&quot;high&quot;]  if (model.api.id.toLowerCase().includes(&quot;deepseek-v4&quot;)) &#123;    efforts.push(&quot;max&quot;)                                // deepseek-v4 额外加 max  &#125;  return Object.fromEntries(efforts.map(e =&gt; [e, &#123; reasoningEffort: e &#125;]))</code></pre><p>In other words: for <code>@ai-sdk/openai-compatible</code> models, as long as <code>reasoning: true</code> is declared, opencode will assign thinking levels automatically based on the model ID — the deepseek-v4 series gets <code>low/medium/high/max</code>.</p><h2 id="The-GOAT-gateway-itself-does-support-effort"><a href="#The-GOAT-gateway-itself-does-support-effort" class="headerlink" title="The GOAT gateway itself does support effort"></a>The GOAT gateway itself does support effort</h2><p>I verified the gateway layer on the way: the <code>reasoning_effort</code> parameter is genuinely accepted and forwarded, and in practice deepseek-v4-flash really does produce different reasoning token counts at different effort levels. The level enum is <code>low|medium|high|xhigh</code> (<code>none</code> errors out), and <code>max</code> passes too.</p><p>Conclusion locked in: <strong>the capability is there, opencode just was never told this model can reason.</strong></p><h2 id="The-fix-add-reasoning-true-to-the-models"><a href="#The-fix-add-reasoning-true-to-the-models" class="headerlink" title="The fix: add reasoning: true to the models"></a>The fix: add reasoning: true to the models</h2><p>Just add the declaration to the model entries under the <code>goat</code> and <code>goat-zdr</code> providers:</p><pre><code class="language-json">&quot;deepseek/deepseek-v4-flash&quot;: &#123;  &quot;name&quot;: &quot;DeepSeek V4 Flash (latest)&quot;,  &quot;limit&quot;: &#123; &quot;context&quot;: 1000000, &quot;output&quot;: 262144 &#125;,  &quot;reasoning&quot;: true&#125;</code></pre><p>Restart after that, and <code>opencode run -m goat/deepseek/deepseek-v4-flash --variant max</code> passes in practice — the level really takes effect.</p><h2 id="A-follow-up-question-is-it-safe-to-mark-every-model-reasoning-true"><a href="#A-follow-up-question-is-it-safe-to-mark-every-model-reasoning-true" class="headerlink" title="A follow-up question: is it safe to mark every model reasoning:true?"></a>A follow-up question: is it safe to mark every model reasoning:true?</h2><p>After fixing deepseek, a thought occurred to me: instead of judging model by model which ones should be marked, why not <strong>mark them all true and let opencode’s built-in model logic make the final call</strong> (it has its own internal blacklist of “which models should get levels”). But is that safe?</p><p>Reading the source: before handing out levels, <code>variants()</code> has a <strong>hardcoded blacklist</strong>, and any matching model just gets <code>return &#123;&#125;</code>:</p><pre><code class="language-ts">if (  id.includes(&quot;deepseek-chat&quot;) || id.includes(&quot;deepseek-r1&quot;) ||  id.includes(&quot;deepseek-v3&quot;) ||  id.includes(&quot;minimax&quot;) || (id.includes(&quot;glm&quot;) &amp;&amp; !glm52) ||  id.includes(&quot;kimi&quot;) || id.includes(&quot;qwen&quot;)) return &#123;&#125;</code></pre><p>That means kimi, qwen, glm (not 5.2), minimax (not M3) and friends <strong>won’t get thinking levels even with reasoning:true</strong> — the upstream simply doesn’t honor effort control (in practice, sending Kimi-K3 the high level barely changes its reasoning tokens, which confirms the blacklist makes sense).</p><p>The remaining question: for models marked true but blocked by the blacklist, will opencode sneak a default effort into the request body? <strong>Packet capture put that worry to rest</strong> — after marking Qwen3.8-Flash (blacklisted) as reasoning:true, the outgoing request body contains no <code>reasoning_effort</code> field at all, and the conversation behaves exactly as before. Compare that with non-blacklisted deepseek-v4-flash, where <code>--variant high</code> really does put <code>reasoning_effort: high</code> in the request body.</p><p>So I confidently marked <strong>all 74 models</strong> under <code>goat</code> and <code>goat-zdr</code> as <code>reasoning: true</code>, letting opencode’s mechanism handle the rest. After refactoring the config, <code>/models</code> works fine and every model chats normally in practice.</p><h2 id="Final-results-comparison"><a href="#Final-results-comparison" class="headerlink" title="Final results comparison"></a>Final results comparison</h2><table><thead><tr><th>Model</th><th>Thinking levels that appear in the TUI after marking reasoning:true</th></tr></thead><tbody><tr><td>deepseek-v4 series (pro&#x2F;flash&#x2F;fast&#x2F;vision)</td><td>low &#x2F; medium &#x2F; high &#x2F; max</td></tr><tr><td>mimo-v2.5, stepfun, tencent, nemotron, inkling, gpt-5.6-sol, muse, grok, etc.</td><td>low &#x2F; medium &#x2F; high</td></tr><tr><td>GLM-5.2</td><td>high &#x2F; max (special-cased)</td></tr><tr><td>MiniMax-M3</td><td>thinking on &#x2F; off (toggle special case)</td></tr><tr><td>Kimi series, Qwen series, GLM-5&#x2F;5.1&#x2F;5.3, MiniMax-M2.x</td><td>no levels (hardcoded blacklist, upstream doesn’t support effort)</td></tr></tbody></table><h2 id="Takeaways"><a href="#Takeaways" class="headerlink" title="Takeaways"></a>Takeaways</h2><ol><li><strong>For custom providers (openai-compatible), model levels are entirely up to your own declarations.</strong> <code>reasoning: true</code> is a necessary but not sufficient condition for getting levels — whether levels appear at all, and which ones, is decided a second time by opencode’s built-in model logic (blacklist included).</li><li><strong>Marking blacklisted models as reasoning:true has no side effects</strong>: it only affects the “can thinking levels appear” UI switch, and no default effort parameter gets injected into the request body. Mark them all with confidence.</li><li>After fixing the config, remember to <strong>restart opencode</strong> (config is only loaded at startup, no hot reload), then select a model in <code>/models</code> and press Tab to cycle through the levels.</li></ol>]]></content>
    
    
    <summary type="html">The previous post on the goat setup missed one piece: models like deepseek-v4-flash couldn&#39;t pick a thinking depth in /models. Digging in, it turned out the GOAT plan does support it — the problem was that the hand-written models in the custom provider were missing a reasoning capability declaration, so opencode&#39;s variant generation logic stopped them at the door. In the end I added reasoning:true to every model under goat and goat-zdr, and testing showed no side effects.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="LLM" scheme="https://flashj.cn/tags/LLM/"/>
    
    <category term="agent" scheme="https://flashj.cn/tags/agent/"/>
    
    <category term="Configuration" scheme="https://flashj.cn/tags/Configuration/"/>
    
    <category term="opencode" scheme="https://flashj.cn/tags/opencode/"/>
    
    <category term="CommandCode" scheme="https://flashj.cn/tags/CommandCode/"/>
    
    <category term="goat" scheme="https://flashj.cn/tags/goat/"/>
    
    <category term="reasoning" scheme="https://flashj.cn/tags/reasoning/"/>
    
  </entry>
  
  <entry>
    <title>Paseo Solarized Light theme plugin: low contrast and easy on the eyes, installed from GitHub with a single command</title>
    <link href="https://flashj.cn/paseo-solarized-light.html"/>
    <id>https://flashj.cn/paseo-solarized-light.html</id>
    <published>2026-09-01T16:00:00.000Z</published>
    <updated>2026-09-12T01:35:52.572Z</updated>
    
    <content type="html"><![CDATA[<p>Paseo’s 6 built-in themes all have too much contrast—the whites are too white and the blacks are too black, making it hard on the eyes when you’re staring at code. So I built a <strong>Solarized Light</strong> theme plugin for Paseo: low contrast, soft and easy on the eyes, friendly for long sessions in front of the screen.</p><p>I’d thought about modifying Paseo’s bundle to inject a theme before, but that means re-patching it with every upgrade—a hassle. Not anymore: Paseo officially introduced the plugin theme API <code>plugin.addTheme</code> in v0.5.0, so you can just implement it as a plugin, <strong>without modifying any Paseo files, and nothing is lost on upgrade</strong>. Even better, yesterday I found that Paseo has already been updated to 0.7.0, which supports adding plugins&#x2F;themes directly from GitHub.</p><h2 id="Installation-Paseo-0-7-0"><a href="#Installation-Paseo-0-7-0" class="headerlink" title="Installation (Paseo 0.7.0+)"></a>Installation (Paseo 0.7.0+)</h2><p>One command:</p><pre><code class="language-bash">paseo plugin add mousebomb/paseo-solarized-light</code></pre><p>Then go to <strong>Settings → Appearance</strong> → Theme and select <strong>Solarized Light</strong>, and you’re done.</p><p><img src="https://cdn.mousebomb.org/blog/auto/202609020734575.png"></p><blockquote><p>Versions before 0.7.0 work too, via installing from the source directory. See the <a href="https://github.com/mousebomb/paseo-solarized-light">README</a> for details.</p></blockquote><h2 id="Colors"><a href="#Colors" class="headerlink" title="Colors"></a>Colors</h2><p>Based on Ethan Schoonover’s <a href="https://ethanschoonover.com/solarized">Solarized</a> palette, the classic low-contrast, easy-on-the-eyes color scheme:</p><ul><li>Background <code>#fdf6e3</code> (base3 beige)</li><li>Foreground <code>#657b83</code> (base00)</li><li>Accent <code>#cb4b16</code> (orange)</li></ul><p>My eyes feel much better after using it. I’ve already switched over myself—not just for writing code, but for everyday reading of diffs and logs in Paseo, it’s all in this tone.</p><p>The plugin and theme are both under the MIT license, and the code is at <a href="https://github.com/mousebomb/paseo-solarized-light">github.com&#x2F;mousebomb&#x2F;paseo-solarized-light</a>. Stars &#x2F; issues are welcome.</p>]]></content>
    
    
    <summary type="html">I built a Solarized Light eye-friendly theme plugin for Paseo, implemented with the official addTheme plugin API — no need to modify any Paseo files, and nothing is lost on upgrade. Since Paseo 0.7.0, plugins can be installed straight from GitHub with a single command.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="Tools" scheme="https://flashj.cn/tags/Tools/"/>
    
    <category term="Paseo" scheme="https://flashj.cn/tags/Paseo/"/>
    
    <category term="Solarized" scheme="https://flashj.cn/tags/Solarized/"/>
    
    <category term="Theme" scheme="https://flashj.cn/tags/Theme/"/>
    
  </entry>
  
  <entry>
    <title>Wiring the CommandCode goat plan into opencode: two-step setup + a zdr custom request header</title>
    <link href="https://flashj.cn/opencode-goat-commandcode-config.html"/>
    <id>https://flashj.cn/opencode-goat-commandcode-config.html</id>
    <published>2026-08-31T14:13:00.000Z</published>
    <updated>2026-09-12T01:34:17.284Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Switching-plans-from-opencode-go-to-CommandCode-GOAT"><a href="#Switching-plans-from-opencode-go-to-CommandCode-GOAT" class="headerlink" title="Switching plans from opencode go to CommandCode GOAT"></a>Switching plans from opencode go to CommandCode GOAT</h2><p>I saw the recently up-and-coming CommandCode GOAT — heard it’s even better value than opencode’s go plan, with more models supported and a bigger quota.</p><p>Checked the official table: deepseek-v4-flash-vision is at list price, and there’s a $60 quota.<br>After opencode go’s adjustment this month, DeepSeek models no longer get anywhere near a $60 quota — basically unusable.</p><p>I happen to be renewing opencode go tomorrow. Let me evaluate it — might just buy a month and try it out.</p><p>Main concerns:</p><ol><li>Privacy: is there zero data retention</li><li>Is it compatible with paseo integration</li><li>Is it compatible with CodexBar for aggregated usage viewing</li></ol><h3 id="Privacy"><a href="#Privacy" class="headerlink" title="Privacy"></a>Privacy</h3><p>privacy: <a href="https://commandcode.ai/docs/resources/security">https://commandcode.ai/docs/resources/security</a></p><p>You have to buy goat, i.e. a plan of $10 or more, before they offer API access.<br>ZDR policy: <a href="https://commandcode.ai/docs/resources/zdr">https://commandcode.ai/docs/resources/zdr</a></p><p>The goat plan doesn’t guarantee zero data retention for all models — not as transparent as the Opencode Go plan on this point.</p><p>If you want ZDR (zero data retention), every request must carry an <code>x-cmd-zdr: 1</code> header, and that can also be handled in the config.</p><h3 id="Paseo-integration-❌"><a href="#Paseo-integration-❌" class="headerlink" title="Paseo integration ❌"></a>Paseo integration ❌</h3><p>Looked it up — Paseo doesn’t currently support CommandCode.<br>So I’ll keep using opencode to hook into GOAT’s API, and keep using opencode inside paseo.<br>Which is fine — saves me from configuring openviking, search mcp, and the rest.<br>So the crux is getting opencode hooked up to GOAT’s API calls.<br>As for API calls, CommandCode GOAT and above all support API access. ✅</p><h3 id="CodexBar-compatibility-✅"><a href="#CodexBar-compatibility-✅" class="headerlink" title="CodexBar compatibility ✅"></a>CodexBar compatibility ✅</h3><p>CodexBar is really something — you can view usage directly for all kinds of plans.<br>It supports CommandCode out of the box.</p><h2 id="Configuring-opencode-to-use-the-GOAT-plan"><a href="#Configuring-opencode-to-use-the-GOAT-plan" class="headerlink" title="Configuring opencode to use the GOAT plan"></a>Configuring opencode to use the GOAT plan</h2><p>Not complicated — two steps: store the key with <code>/connect</code> + declare the provider in <code>opencode.json</code>.</p><h3 id="Step-1-Enter-the-API-Key-with-connect"><a href="#Step-1-Enter-the-API-Key-with-connect" class="headerlink" title="Step 1: Enter the API Key with /connect"></a>Step 1: Enter the API Key with <code>/connect</code></h3><p>Inside opencode, run:</p><pre><code>/connect</code></pre><p>Choose <strong>Other provider</strong>, enter the provider name <code>goat</code>, paste the API Key and hit Enter.</p><p>The key is stored in <code>~/.local/share/opencode/auth.json</code> (permissions 600, readable only by the current user); opencode automatically sends it as <code>Authorization: Bearer &lt;key&gt;</code>, so you <strong>don’t</strong> need to put it in opencode.json — that keeps the secret out of git.</p><h3 id="Step-2-Configure-opencode-json"><a href="#Step-2-Configure-opencode-json" class="headerlink" title="Step 2: Configure opencode.json"></a>Step 2: Configure opencode.json</h3><p>In the global config <code>~/.config/opencode/opencode.json</code> (same for the project-level <code>.opencode/opencode.json</code>), add a <code>goat</code> provider:</p><pre><code class="language-json">&#123;  &quot;provider&quot;: &#123;    &quot;goat&quot;: &#123;      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,      &quot;name&quot;: &quot;goat&quot;,      &quot;options&quot;: &#123;        &quot;baseURL&quot;: &quot;https://api.commandcode.ai/provider/v1&quot;      &#125;,      &quot;models&quot;: &#123;        &quot;deepseek/deepseek-v4-flash-vision-exp&quot;: &#123;          &quot;name&quot;: &quot;deepseek-v4-flash-vision-exp&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;deepseek/deepseek-v4-flash&quot;:&#123;          &quot;name&quot;:&quot;deepseek-v4-flash&quot;,          &quot;limit&quot;:          &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;z-ai/glm-5.3-flash&quot;:&#123;          &quot;name&quot;:&quot;glm-5.3-flash&quot;,          &quot;limit&quot;:          &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;      &#125;    &#125;  &#125;&#125;</code></pre><p>Key points:</p><ul><li><code>npm</code> uses <code>@ai-sdk/openai-compatible</code> — CommandCode provides an OpenAI-compatible endpoint</li><li><code>baseURL</code> is the provider gateway address (not the model name)</li><li>The <code>models</code> key is the full model ID on the API side, <code>deepseek/deepseek-v4-flash-vision-exp</code>; fill <code>limit</code> according to the context&#x2F;output caps the plan gives you</li><li>After the change, <strong>restart opencode</strong> for it to take effect (config is only loaded at startup, no hot reload)</li></ul><h2 id="Optional-custom-zdr-request-header"><a href="#Optional-custom-zdr-request-header" class="headerlink" title="Optional: custom zdr request header"></a>Optional: custom zdr request header</h2><p>The goat plan officially requires every request to carry <code>x-cmd-zdr: 1</code>. opencode passes the provider’s <code>options</code> through to the <code>@ai-sdk/openai-compatible</code> constructor as-is, and that natively supports <code>headers</code>, so just write:</p><pre><code class="language-json">&quot;options&quot;: &#123;  &quot;baseURL&quot;: &quot;https://api.commandcode.ai/provider/v1&quot;,  &quot;headers&quot;: &#123;    &quot;x-cmd-zdr&quot;: &quot;1&quot;  &#125;&#125;</code></pre><p>This header goes out with every request and doesn’t conflict with the key stored by <code>/connect</code>. <strong>Tested and confirmed working.</strong></p><h2 id="Verification"><a href="#Verification" class="headerlink" title="Verification"></a>Verification</h2><p>After restarting opencode, switch to <code>goat/deepseek/deepseek-v4-flash-vision-exp</code> via <code>/models</code>, send a message, and if it replies normally the whole setup is in place.</p><p>Turns out deepseek-v4-flash-vision-exp isn’t a ZDR upstream????</p><p>Well then, I’ll just turn off ZDR.</p><p>I don’t normally use the vision-exp model anyway.<br>Tested ds-v4-flash and glm-5.3-flash, both support ZDR.</p><p>So I’ll just import these three models to use.<br>GLM-5.3-flash in the commandcode goat plan gives a bigger quota than opencode Go.</p><h2 id="Fleshing-out-the-config"><a href="#Fleshing-out-the-config" class="headerlink" title="Fleshing out the config"></a>Fleshing out the config</h2><p>Right now I’m using Command Code’s GOAT plan inside opencode, and opencode doesn’t officially support this provider out of the box.<br>Which means the models in my OpenCode are hand-configured, and I only set up 3 of them earlier.</p><p>Now I want to configure all of them.</p><p>As for ZDR, I also need to run a full round of testing to see which models support ZDR.</p><p>And I need to delete the already-canceled opencode go plus a whole pile of leftover provider entries — from auth.json.</p><h3 id="Cleaning-up-auth-json"><a href="#Cleaning-up-auth-json" class="headerlink" title="Cleaning up auth.json:"></a>Cleaning up auth.json:</h3><p><code>/Users/rhett/.local/share/opencode/auth.json</code> — clean it up manually in sublime; there’s way too much junk from before.</p><h3 id="Configure-all-available-models"><a href="#Configure-all-available-models" class="headerlink" title="Configure all available models"></a>Configure all available models</h3><pre><code>curl https://api.commandcode.ai/provider/v1/models &gt; ~/Downloads/goat-models.json</code></pre><p>Read all available models.</p><p>Need to extract them into usable config and add them to the <code>goat</code> provider in <code>/Users/rhett/.config/opencode/opencode.json</code>.</p><p>For ZDR detection, write a script that does something like</p><pre><code>curl https://api.commandcode.ai/provider/v1/chat/completions \  -H &quot;Authorization: Bearer &lt;CMD_API_KEY&gt;&quot; \  -H &quot;Content-Type: application/json&quot; \  -H &quot;x-cmd-zdr: 1&quot; \  -d &#39;&#123;    &quot;model&quot;: &quot;deepseek/deepseek-v4-flash&quot;,    &quot;messages&quot;: [&#123;&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Write a haiku about race conditions.&quot;&#125;]  &#125;&#39;</code></pre><p>based on the official statement:</p><blockquote><p> if a model has no ZDR-capable upstream the request <strong>fails</strong> with a <code>422</code> (<code>cmd_zdr_no_providers</code>) rather than falling back to a non-ZDR provider.</p></blockquote><p>Run through every model and see which endpoints return a 422 error — that tells you which models aren’t safe.</p><h3 id="ZDR-detection-script"><a href="#ZDR-detection-script" class="headerlink" title="ZDR detection script"></a>ZDR detection script</h3><pre><code class="language-bash">#!/bin/bash# ZDR 支持检测脚本：遍历 goat-models.json 中所有模型，检测是否支持 ZDR# 判定规则：带 x-cmd-zdr:1 请求返回 422 cmd_zdr_no_providers =&gt; 不支持 ZDR（不安全）#             返回 200 =&gt; 支持 ZDR# 用法: bash check-zdr.shset -uAPI_KEY=&quot;user_5NNqepzcPpbuusKVXmAzV3mgSe5zmNpttPV9TTryCyzuT7PnmQhxn9HKZHHAwbT6zCzJvKEqNXPvquLeNa8g1u2x&quot;BASE_URL=&quot;https://api.commandcode.ai/provider/v1/chat/completions&quot;MODELS_FILE=&quot;$HOME/Downloads/goat-models.json&quot;OUT_FILE=&quot;$HOME/Downloads/zdr-result.txt&quot;# 读取所有模型 idMODELS=()while IFS= read -r line; do  MODELS+=(&quot;$line&quot;)done &lt; &lt;(python3 -c &quot;import jsonwith open(&#39;$MODELS_FILE&#39;) as f:    data = json.load(f)for m in data[&#39;data&#39;]:    print(m[&#39;id&#39;])&quot;)echo &quot;共 $&#123;#MODELS[@]&#125; 个模型，开始 ZDR 检测...&quot; &gt;&amp;2echo &quot;共 $&#123;#MODELS[@]&#125; 个模型&quot; &gt; &quot;$OUT_FILE&quot;SUPPORT=()NOT_SUPPORT=()for model in &quot;$&#123;MODELS[@]&#125;&quot;; do  resp=$(curl -s -o /tmp/zdr-body.json -w &quot;%&#123;http_code&#125;&quot; \    &quot;$BASE_URL&quot; \    -H &quot;Authorization: Bearer $API_KEY&quot; \    -H &quot;Content-Type: application/json&quot; \    -H &quot;x-cmd-zdr: 1&quot; \    -d &quot;&#123;      \&quot;model\&quot;: \&quot;$model\&quot;,      \&quot;messages\&quot;: [&#123;\&quot;role\&quot;: \&quot;user\&quot;, \&quot;content\&quot;: \&quot;Say OK\&quot;&#125;],      \&quot;max_tokens\&quot;: 8    &#125;&quot;)  code=$resp  if [ &quot;$code&quot; = &quot;200&quot; ]; then    SUPPORT+=(&quot;$model&quot;)    echo &quot;ZDR ✓  $model&quot; | tee -a &quot;$OUT_FILE&quot;  elif [ &quot;$code&quot; = &quot;422&quot; ]; then    NOT_SUPPORT+=(&quot;$model&quot;)    echo &quot;ZDR ✗  $model (422)&quot; | tee -a &quot;$OUT_FILE&quot;  else    NOT_SUPPORT+=(&quot;$model&quot;)    echo &quot;ZDR ?  $model (HTTP $code) $(cat /tmp/zdr-body.json | head -c 120)&quot; | tee -a &quot;$OUT_FILE&quot;  fi  sleep 0.2doneecho &quot;&quot; &gt;&gt; &quot;$OUT_FILE&quot;echo &quot;===== 汇总 =====&quot; &gt;&gt; &quot;$OUT_FILE&quot;echo &quot;支持 ZDR: $&#123;#SUPPORT[@]&#125; 个&quot; &gt;&gt; &quot;$OUT_FILE&quot;for m in &quot;$&#123;SUPPORT[@]&#125;&quot;; do echo &quot;  ✓ $m&quot; &gt;&gt; &quot;$OUT_FILE&quot;; doneecho &quot;不支持/未知: $&#123;#NOT_SUPPORT[@]&#125; 个&quot; &gt;&gt; &quot;$OUT_FILE&quot;for m in &quot;$&#123;NOT_SUPPORT[@]&#125;&quot;; do echo &quot;  ✗ $m&quot; &gt;&gt; &quot;$OUT_FILE&quot;; doneecho &quot;&quot; &gt;&amp;2echo &quot;完成！结果写入: $OUT_FILE&quot; &gt;&amp;2</code></pre><h3 id="ZDR-detection-results"><a href="#ZDR-detection-results" class="headerlink" title="ZDR detection results"></a>ZDR detection results</h3><pre><code>共 61 个模型ZDR ?  claude-sonnet-5 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-sonnet-5\&quot; must be called via /provider/v1/messages (Anthropic Messages shape).&quot;,&quot;tyZDR ?  claude-sonnet-4-6 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-sonnet-4-6\&quot; must be called via /provider/v1/messages (Anthropic Messages shape).&quot;,&quot;ZDR ?  claude-fable-5 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-fable-5\&quot; must be called via /provider/v1/messages (Anthropic Messages shape).&quot;,&quot;typZDR ?  claude-opus-5 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-opus-5\&quot; must be called via /provider/v1/messages (Anthropic Messages shape).&quot;,&quot;typeZDR ?  claude-opus-4-8 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-opus-4-8\&quot; must be called via /provider/v1/messages (Anthropic Messages shape).&quot;,&quot;tyZDR ?  claude-opus-4-7 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-opus-4-7\&quot; must be called via /provider/v1/messages (Anthropic Messages shape).&quot;,&quot;tyZDR ?  claude-haiku-4-5-20251001 (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Model \&quot;claude-haiku-4-5-20251001\&quot; must be called via /provider/v1/messages (Anthropic Messages shZDR ?  gpt-5.6-sol (HTTP 400) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;&#123;\&quot;error\&quot;:&#123;\&quot;message\&quot;:\&quot;Invalid &#39;max_output_tokens&#39;: integer below minimum value. Expected a valuZDR ?  gpt-5.6-terra (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: GPT-5.6 Terra available in Pro and above plans or extra on demand usage&quot;,&quot;type&quot;:ZDR ?  gpt-5.6-luna (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Authentication failed. Please check your credentials.&quot;,&quot;type&quot;:&quot;permission_error&quot;&#125;&#125;ZDR ?  gpt-5.5 (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: GPT-5.5 available in Pro and above plans or extra on demand usage&quot;,&quot;type&quot;:&quot;permiZDR ?  gpt-5.4 (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: GPT-5.4 available in Pro and above plans or extra on demand usage&quot;,&quot;type&quot;:&quot;permiZDR ?  gpt-5.3-codex (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: GPT-5.3 Codex available in Pro and above plans or extra on demand usage&quot;,&quot;type&quot;:ZDR ?  gpt-5.4-mini (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: GPT-5.4 Mini available in Pro and above plans or extra on demand usage&quot;,&quot;type&quot;:&quot;ZDR ✓  deepseek/deepseek-v4-proZDR ✓  deepseek/deepseek-v4-flashZDR ✗  deepseek/deepseek-v4-flash-vision-exp (422)ZDR ✓  deepseek/deepseek-v4-flash-fastZDR ✓  moonshotai/Kimi-K3ZDR ✓  moonshotai/Kimi-K2.7-CodeZDR ✓  moonshotai/Kimi-K2.7-Code-HighspeedZDR ✓  moonshotai/Kimi-K2.6ZDR ✓  moonshotai/Kimi-K2.5ZDR ✓  z-ai/glm-5.3-flashZDR ✓  zai-org/GLM-5.3ZDR ✓  zai-org/GLM-5.2ZDR ✓  zai-org/GLM-5.2-FastZDR ✓  zai-org/GLM-5.1ZDR ✓  zai-org/GLM-5ZDR ✓  MiniMaxAI/MiniMax-M3ZDR ✓  MiniMaxAI/MiniMax-M2.7ZDR ✓  MiniMaxAI/MiniMax-M2.5ZDR ✓  xiaomi/mimo-v2.5-proZDR ✓  xiaomi/mimo-v2.5ZDR ✓  Qwen/Qwen3.8-MaxZDR ✓  Qwen/Qwen3.8-27BZDR ✗  Qwen/Qwen3.8-Flash (422)ZDR ✓  Qwen/Qwen3.7-MaxZDR ✓  Qwen/Qwen3.7-PlusZDR ✓  Qwen/Qwen3.7-FlashZDR ✓  Qwen/Qwen3.6-Max-PreviewZDR ✓  Qwen/Qwen3.6-PlusZDR ✗  stepfun/Step-3.7-Flash (422)ZDR ✓  stepfun/Step-3.5-FlashZDR ✓  tencent/hy3-paidZDR ✓  tencent/hy4-previewZDR ?  google/gemini-3.7-flash (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;Authentication failed. Please check your credentials.&quot;,&quot;type&quot;:&quot;permission_error&quot;&#125;&#125;ZDR ?  google/gemini-3.6-flash (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: Gemini 3.6 Flash available in Pro and above plans or extra on demand usage&quot;,&quot;typZDR ?  google/gemini-3.5-flash (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: Gemini 3.5 Flash available in Pro and above plans or extra on demand usage&quot;,&quot;typZDR ?  google/gemini-3.5-flash-lite (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: Gemini 3.5 Flash Lite available in Pro and above plans or extra on demand usage&quot;ZDR ?  google/gemini-3.1-flash-lite (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: Gemini 3.1 Flash Lite available in Pro and above plans or extra on demand usage&quot;ZDR ?  sakana/fugu-ultra (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: Fugu Ultra available in Provider and above plans or extra on demand usage&quot;,&quot;typeZDR ✓  nvidia/nemotron-3-ultra-550b-a55bZDR ✓  thinkingmachines/inklingZDR ✓  thinkingmachines/inkling-smallZDR ✗  poolside/laguna-s-2.1-free (422)ZDR ?  meta/muse-spark-1.1 (HTTP 403) &#123;&quot;error&quot;:&#123;&quot;message&quot;:&quot;MODEL_NOT_IN_PLAN: Muse Spark 1.1 available in Pro and above plans or extra on demand usage&quot;,&quot;type&quot;ZDR ✗  meta/muse-spark-1.2 (422)ZDR ✗  meta/muse-spark-1.2-contributor (422)ZDR ✗  xai/grok-4.5 (422)ZDR ✗  xai/grok-4.6 (422)===== 汇总 =====支持 ZDR: 32 个  ✓ deepseek/deepseek-v4-pro  ✓ deepseek/deepseek-v4-flash  ✓ deepseek/deepseek-v4-flash-fast  ✓ moonshotai/Kimi-K3  ✓ moonshotai/Kimi-K2.7-Code  ✓ moonshotai/Kimi-K2.7-Code-Highspeed  ✓ moonshotai/Kimi-K2.6  ✓ moonshotai/Kimi-K2.5  ✓ z-ai/glm-5.3-flash  ✓ zai-org/GLM-5.3  ✓ zai-org/GLM-5.2  ✓ zai-org/GLM-5.2-Fast  ✓ zai-org/GLM-5.1  ✓ zai-org/GLM-5  ✓ MiniMaxAI/MiniMax-M3  ✓ MiniMaxAI/MiniMax-M2.7  ✓ MiniMaxAI/MiniMax-M2.5  ✓ xiaomi/mimo-v2.5-pro  ✓ xiaomi/mimo-v2.5  ✓ Qwen/Qwen3.8-Max  ✓ Qwen/Qwen3.8-27B  ✓ Qwen/Qwen3.7-Max  ✓ Qwen/Qwen3.7-Plus  ✓ Qwen/Qwen3.7-Flash  ✓ Qwen/Qwen3.6-Max-Preview  ✓ Qwen/Qwen3.6-Plus  ✓ stepfun/Step-3.5-Flash  ✓ tencent/hy3-paid  ✓ tencent/hy4-preview  ✓ nvidia/nemotron-3-ultra-550b-a55b  ✓ thinkingmachines/inkling  ✓ thinkingmachines/inkling-small不支持/未知: 29 个  ✗ claude-sonnet-5  ✗ claude-sonnet-4-6  ✗ claude-fable-5  ✗ claude-opus-5  ✗ claude-opus-4-8  ✗ claude-opus-4-7  ✗ claude-haiku-4-5-20251001  ✗ gpt-5.6-sol  ✗ gpt-5.6-terra  ✗ gpt-5.6-luna  ✗ gpt-5.5  ✗ gpt-5.4  ✗ gpt-5.3-codex  ✗ gpt-5.4-mini  ✗ deepseek/deepseek-v4-flash-vision-exp  ✗ Qwen/Qwen3.8-Flash  ✗ stepfun/Step-3.7-Flash  ✗ google/gemini-3.7-flash  ✗ google/gemini-3.6-flash  ✗ google/gemini-3.5-flash  ✗ google/gemini-3.5-flash-lite  ✗ google/gemini-3.1-flash-lite  ✗ sakana/fugu-ultra  ✗ poolside/laguna-s-2.1-free  ✗ meta/muse-spark-1.1  ✗ meta/muse-spark-1.2  ✗ meta/muse-spark-1.2-contributor  ✗ xai/grok-4.5  ✗ xai/grok-4.6</code></pre><h2 id="Final-config"><a href="#Final-config" class="headerlink" title="Final config:"></a>Final config:</h2><p>The final config, mainly the ‘provider’ section — I entered the ZDR-compatible ones and all of them separately, as two parts.</p><pre><code>&#123;  &quot;$schema&quot;: &quot;https://opencode.ai/config.json&quot;,  &quot;permission&quot;: &#123;  &#125;,  &quot;mcp&quot;: &#123;  &#125;,  &quot;provider&quot;: &#123;    &quot;goat&quot;: &#123;      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,      &quot;name&quot;: &quot;goat&quot;,      &quot;options&quot;: &#123;        &quot;baseURL&quot;: &quot;https://api.commandcode.ai/provider/v1&quot;,        &quot;headers&quot;: &#123;&#125;      &#125;,      &quot;models&quot;: &#123;        &quot;deepseek/deepseek-v4-pro&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Pro (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;deepseek/deepseek-v4-flash&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;deepseek/deepseek-v4-flash-fast&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash Fast&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K3&quot;: &#123;          &quot;name&quot;: &quot;Kimi K3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.7-Code&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.7 Code&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.7-Code-Highspeed&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.7 Code HighSpeed&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.6&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.6&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.5&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;z-ai/glm-5.3-flash&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.3 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.3&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.2&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.2&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.2-Fast&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.2 Fast&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.1&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.1&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5&quot;: &#123;          &quot;name&quot;: &quot;GLM-5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;MiniMaxAI/MiniMax-M3&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;MiniMaxAI/MiniMax-M2.7&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M2.7&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;MiniMaxAI/MiniMax-M2.5&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;xiaomi/mimo-v2.5-pro&quot;: &#123;          &quot;name&quot;: &quot;MiMo V2.5 Pro&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;xiaomi/mimo-v2.5&quot;: &#123;          &quot;name&quot;: &quot;MiMo V2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.8-Max&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 Max&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.8-27B&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 27B&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262144,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.7-Max&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Max&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.7-Plus&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Plus&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.7-Flash&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.6-Max-Preview&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.6 Max Preview&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.6-Plus&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.6 Plus&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;stepfun/Step-3.5-Flash&quot;: &#123;          &quot;name&quot;: &quot;Step 3.5 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;tencent/hy3-paid&quot;: &#123;          &quot;name&quot;: &quot;Tencent Hy3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262144,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;tencent/hy4-preview&quot;: &#123;          &quot;name&quot;: &quot;Tencent Hy4 Preview&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;nvidia/nemotron-3-ultra-550b-a55b&quot;: &#123;          &quot;name&quot;: &quot;Nemotron 3 Ultra&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;thinkingmachines/inkling&quot;: &#123;          &quot;name&quot;: &quot;Inkling&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;thinkingmachines/inkling-small&quot;: &#123;          &quot;name&quot;: &quot;Inkling Small&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;gpt-5.6-sol&quot;: &#123;          &quot;name&quot;: &quot;GPT-5.6 Sol&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1050000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;deepseek/deepseek-v4-flash-vision-exp&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash Vision (exp)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.8-Flash&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;stepfun/Step-3.7-Flash&quot;: &#123;          &quot;name&quot;: &quot;Step 3.7 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;poolside/laguna-s-2.1-free&quot;: &#123;          &quot;name&quot;: &quot;Laguna S 2.1&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;meta/muse-spark-1.2&quot;: &#123;          &quot;name&quot;: &quot;Muse Spark 1.2&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;meta/muse-spark-1.2-contributor&quot;: &#123;          &quot;name&quot;: &quot;Muse Spark 1.2 Contributor&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;xai/grok-4.5&quot;: &#123;          &quot;name&quot;: &quot;Grok 4.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 500000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;xai/grok-4.6&quot;: &#123;          &quot;name&quot;: &quot;Grok 4.6&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 500000,            &quot;output&quot;: 262144          &#125;        &#125;      &#125;    &#125;,    &quot;goat-zdr&quot;: &#123;      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,      &quot;name&quot;: &quot;goat-zdr&quot;,      &quot;options&quot;: &#123;        &quot;baseURL&quot;: &quot;https://api.commandcode.ai/provider/v1&quot;,        &quot;headers&quot;: &#123;          &quot;x-cmd-zdr&quot;: &quot;1&quot;        &#125;      &#125;,      &quot;models&quot;: &#123;        &quot;deepseek/deepseek-v4-pro&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Pro (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;deepseek/deepseek-v4-flash&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash (latest)&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;deepseek/deepseek-v4-flash-fast&quot;: &#123;          &quot;name&quot;: &quot;DeepSeek V4 Flash Fast&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K3&quot;: &#123;          &quot;name&quot;: &quot;Kimi K3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.7-Code&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.7 Code&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.7-Code-Highspeed&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.7 Code HighSpeed&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.6&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.6&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;moonshotai/Kimi-K2.5&quot;: &#123;          &quot;name&quot;: &quot;Kimi K2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;z-ai/glm-5.3-flash&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.3 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.3&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.2&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.2&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.2-Fast&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.2 Fast&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5.1&quot;: &#123;          &quot;name&quot;: &quot;GLM-5.1&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;zai-org/GLM-5&quot;: &#123;          &quot;name&quot;: &quot;GLM-5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;MiniMaxAI/MiniMax-M3&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;MiniMaxAI/MiniMax-M2.7&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M2.7&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;MiniMaxAI/MiniMax-M2.5&quot;: &#123;          &quot;name&quot;: &quot;MiniMax M2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;xiaomi/mimo-v2.5-pro&quot;: &#123;          &quot;name&quot;: &quot;MiMo V2.5 Pro&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;xiaomi/mimo-v2.5&quot;: &#123;          &quot;name&quot;: &quot;MiMo V2.5&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.8-Max&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 Max&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.8-27B&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.8 27B&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262144,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.7-Max&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Max&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.7-Plus&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Plus&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.7-Flash&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.7 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.6-Max-Preview&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.6 Max Preview&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;Qwen/Qwen3.6-Plus&quot;: &#123;          &quot;name&quot;: &quot;Qwen 3.6 Plus&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 200000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;stepfun/Step-3.5-Flash&quot;: &#123;          &quot;name&quot;: &quot;Step 3.5 Flash&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;tencent/hy3-paid&quot;: &#123;          &quot;name&quot;: &quot;Tencent Hy3&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 262144,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;tencent/hy4-preview&quot;: &#123;          &quot;name&quot;: &quot;Tencent Hy4 Preview&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1048576,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;nvidia/nemotron-3-ultra-550b-a55b&quot;: &#123;          &quot;name&quot;: &quot;Nemotron 3 Ultra&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;thinkingmachines/inkling&quot;: &#123;          &quot;name&quot;: &quot;Inkling&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 256000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;thinkingmachines/inkling-small&quot;: &#123;          &quot;name&quot;: &quot;Inkling Small&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1000000,            &quot;output&quot;: 262144          &#125;        &#125;,        &quot;gpt-5.6-sol&quot;: &#123;          &quot;name&quot;: &quot;GPT-5.6 Sol&quot;,          &quot;limit&quot;: &#123;            &quot;context&quot;: 1050000,            &quot;output&quot;: 262144          &#125;        &#125;      &#125;    &#125;  &#125;,  &quot;plugin&quot;: [  ]&#125;</code></pre>]]></content>
    
    
    <summary type="html">I bought CommandCode&#39;s goat plan and wanted to use it as my main plan in opencode. The whole integration takes just two steps: first /connect to save the API key, then declare the provider in opencode.json. The goat plan requires an x-cmd-zdr: 1 header on every request, and testing confirmed you can add that in the config too.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="LLM" scheme="https://flashj.cn/tags/LLM/"/>
    
    <category term="agent" scheme="https://flashj.cn/tags/agent/"/>
    
    <category term="Configuration" scheme="https://flashj.cn/tags/Configuration/"/>
    
    <category term="token" scheme="https://flashj.cn/tags/token/"/>
    
    <category term="opencode" scheme="https://flashj.cn/tags/opencode/"/>
    
    <category term="CommandCode" scheme="https://flashj.cn/tags/CommandCode/"/>
    
    <category term="goat" scheme="https://flashj.cn/tags/goat/"/>
    
    <category term="Paseo" scheme="https://flashj.cn/tags/Paseo/"/>
    
  </entry>
  
  <entry>
    <title>OpenCode Go plan usage estimate: see all models on one page</title>
    <link href="https://flashj.cn/opencode-go-limits.html"/>
    <id>https://flashj.cn/opencode-go-limits.html</id>
    <published>2026-08-29T14:10:00.000Z</published>
    <updated>2026-09-12T01:34:07.958Z</updated>
    
    <content type="html"><![CDATA[<p>Ever since I signed up for the OpenCode Go plan, one thing has been nagging at me: <strong>how many requests can I actually use each month?</strong></p><p>This thing kept shifting all through August — prices for models at every tier were being adjusted, new models kept getting added, plus assorted promos. Basically I had to hit the official site every single day to see which models my plan’s quota covered and how many runs each one got. Exhausting.</p><p>The kicker is that the monthly quota data on the official site is <strong>scattered across several different tables</strong>:</p><ul><li>The pricing table (unit price per 1M tokens) is one table</li><li>The monthly usage quota ($15&#x2F;$30&#x2F;$60 tiers) is mixed into the pricing table</li><li>The per-request token composition (input&#x2F;cache&#x2F;output) is yet another table</li><li>And the official per-model “requests per month” numbers need a separate table of their own</li></ul><p>Meanwhile that “5-hour quota” chart everyone loves to look at <strong>doesn’t list all the models</strong> either — you only get a rough idea.</p><p>Here’s what it looks like:</p><p><img src="https://cdn.mousebomb.org/blog/auto/202609021732881.png"></p><h2 id="The-Approach"><a href="#The-Approach" class="headerlink" title="The Approach"></a>The Approach</h2><p>So I handed the whole problem to an agent.</p><p>Once ds picked up the task, it reasoned: if the official “requests per month” table is just back-derived from unit price × per-request token composition, then I can pull the latest pricing table myself, run it through the same formula, and get the <strong>complete usage figures for every model</strong>. Then chart it and take it all in at a glance.</p><p>The formula is simple:</p><pre><code>每请求成本 = (输入token×输入价 + 缓存token×缓存价 + 输出token×输出价) / 1,000,000每月请求数 = 每月使用额度 ÷ 每请求成本</code></pre><p>This lines up with the logic the official site uses to generate its “request estimate table.” In testing, most models come out within &lt;1% of the official values, which effectively validates the formula.</p><h2 id="Implementation"><a href="#Implementation" class="headerlink" title="Implementation"></a>Implementation</h2><p>The whole tool is a <strong>single dependency-free HTML file</strong> that fetches data automatically when you open the page:</p><ul><li>The data source is the raw mdx on the dev branch of the GitHub repo <code>anomalyco/opencode</code> (kept in sync with the opencode.ai docs), with a jsdelivr CDN source as a fallback. Both send CORS headers, so the browser can fetch cross-origin directly — no backend needed.</li><li>It parses three things: the price + quota table, the request pattern table (per-request token composition), and the official request count table (used for comparison).</li><li>Model names are normalized with longest-prefix matching, to handle the official site’s combined notation like <code>GLM-5.3/5.2/5.1</code> and <code>Kimi K2.7 Code</code>.</li><li>Then it draws a horizontal bar chart (log scale, so the bigger the usage the longer the bar). Hovering any bar shows the details: unit price, monthly quota, cost per request, token pattern, and the official comparison value.</li><li>If a fetch fails, it automatically falls back to the last successful localStorage cache, and there’s a “Refresh now” button at the top.</li></ul><p>Bars with a discrepancy get a ▲ marker. For multi-tier models (like DeepSeek V4 Flash’s Peak&#x2F;Off-Peak), each tier gets its own bar, while the official site only gives one aggregated figure, so it usually won’t match the higher tier — that’s by design, not a miscalculation.</p><h2 id="The-Result"><a href="#The-Result" class="headerlink" title="The Result"></a>The Result</h2><p>Now when I want to check on my plan any day, opening this one page is enough — no more flipping back and forth between several tables on the official site.</p><p>Live preview: <a href="https://mousebomb.org/opencode-go-limits/">https://mousebomb.org/opencode-go-limits/</a></p><p>If you’re on OpenCode Go too, this page should save you some of that daily table-hunting.</p>]]></content>
    
    
    <summary type="html">OpenCode Go&#39;s monthly quota is spread across several tables, and the official &quot;5-hour quota&quot; chart doesn&#39;t list all the models either. So I built a chart page that automatically scrapes the official pricing table, calculates the monthly available request count for each model using the same methodology as the official one, and plots it — hover for details.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="LLM" scheme="https://flashj.cn/tags/LLM/"/>
    
    <category term="agent" scheme="https://flashj.cn/tags/agent/"/>
    
    <category term="Tools" scheme="https://flashj.cn/tags/Tools/"/>
    
    <category term="OpenCode" scheme="https://flashj.cn/tags/OpenCode/"/>
    
    <category term="token" scheme="https://flashj.cn/tags/token/"/>
    
  </entry>
  
  <entry>
    <title>Neither DeepSeek Harness nor Qwen3.8 is a must-have for me</title>
    <link href="https://flashj.cn/no-more-fomo-dsh-qwen38.html"/>
    <id>https://flashj.cn/no-more-fomo-dsh-qwen38.html</id>
    <published>2026-08-23T14:10:00.000Z</published>
    <updated>2026-09-12T01:32:11.697Z</updated>
    
    <content type="html"><![CDATA[<p>Recently DeepSeek Harness got a lot of people in the AI circle excited, but I tried it once and didn’t keep going.</p><p>The reason:<br>DSH is still a preview, and the team says so explicitly — it can ship breaking changes at any time. Right now it’s a period of intense community churn and co-creation.</p><p>For someone like me who wants both novelty and stability: I want novelty, but I’m not that adventurous.<br>I want stability — I need an agent to reliably assist me every day as my second brain, so I can’t casually accept destructive changes.</p><p>I’ve noticed that a lot of people moving to DSH are actually coming from OpenClaw&#x2F;Hermes, and for them that’s a big step up, of course.<br>But my OpenCode + Paseo + OpenViking setup runs so smoothly that I genuinely can’t think of a single hard requirement that would call for DSH.</p><p>I’d also like DSH to plug into Paseo, but the convenient option right now is ACP, and that doesn’t meet my bar.<br>If I were in a hurry, I could always rework <code>opencode-agent.ts</code> into a <code>dsh-agent.ts</code>, but the price is that in the short term I’d have to chase DSH’s frequent changes — and I can’t stand that.</p><p>Then Qwen3.8 27B took off in capability, but I didn’t deploy it locally.</p><p>The reason:<br>My local compute could run it, but after using local setups straight through last year and the year before, I’m burned out on it.<br>opencode go is still simple and blunt, generous with quota — the time I’d spend fiddling with a local deployment is better spent just using MaaS.<br>Running Qwen-embedding 0.6B locally in Ollama to do embeddings for OpenViking suits me just fine.</p><p>Reject FOMO. Any shiny new thing that doesn’t give me real, controllable, stable help is just noise.</p>]]></content>
    
    
    <summary type="html">DeepSeek Harness got a lot of people excited, but I used it once and didn&#39;t keep going; Qwen3.8 27B&#39;s capabilities have taken off, but I haven&#39;t deployed it locally either. Weighing the urge for new things against the need for stability, OpenCode + Paseo + OpenViking is already smooth enough. Anything new that doesn&#39;t offer real, controllable, reliable help is just noise.</summary>
    
    
    
    <category term="AI" scheme="https://flashj.cn/categories/AI/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="DeepSeek" scheme="https://flashj.cn/tags/DeepSeek/"/>
    
    <category term="Agent" scheme="https://flashj.cn/tags/Agent/"/>
    
    <category term="OpenCode" scheme="https://flashj.cn/tags/OpenCode/"/>
    
    <category term="Qwen" scheme="https://flashj.cn/tags/Qwen/"/>
    
  </entry>
  
  <entry>
    <title>Integrating OpenViking to unify OpenCode and Hermes memory</title>
    <link href="https://flashj.cn/openviking-setup.html"/>
    <id>https://flashj.cn/openviking-setup.html</id>
    <published>2026-08-02T04:25:00.000Z</published>
    <updated>2026-09-12T01:34:28.117Z</updated>
    
    <content type="html"><![CDATA[<h2 id="openviking-integration"><a href="#openviking-integration" class="headerlink" title="openviking integration"></a>openviking integration</h2><p><a href="https://www.openviking.ai/">https://www.openviking.ai/</a></p><p>Installing with uv tool</p><pre><code>uv tool install openviking --python 3.12</code></pre><p>In theory, once this is installed you can already use Ov and OpenViking Server. You can also hook it into OpenCode — OpenCode needs a plugin installed. But right now I need to sort out the embedding model and the VLM model.<br>For VLM I can use Xiaomi’s model.<br>For the embedding model, let’s go with the one bundled with Agent Plan.</p><p>Embedding:</p><ul><li>embedding model id: <code>doubao-embedding-vision</code></li><li>baseURL: <code>https://ark.cn-beijing.volces.com/api/plan/v3</code><br>VLM:</li><li>Opencode Go’s mimo2.5</li></ul><p>While putting this documentation together, I picked up a few new things:</p><ul><li>Pythons managed by uv only take up a single shared storage footprint</li><li><code>uv tool install</code> installs globally, and each tool uses its own Python interpreter, independent of the others</li><li>markitdown could actually have been installed with <code>uv tool install</code> too, instead of hunting down a path and installing it with <code>uv sync</code></li></ul><p>Alright, let’s start installing openviking.<br>Recording the specific steps:</p><h3 id="Installing-ov"><a href="#Installing-ov" class="headerlink" title="Installing ov"></a>Installing ov</h3><pre><code class="language-sh">uv tool install openviking --upgrade</code></pre><p>Installed 4 executables: openviking, openviking-server, ov, vikingbot</p><p>Installation done. You can now use the client command <code>ov</code> (<code>openviking</code> is its alias) and the server command <code>openviking-server</code>.</p><h3 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h3><pre><code>openviking-server init</code></pre><p>I ran its built-in configuration. Then I noticed the URL it configured for Volcano Engine was wrong, because I’m on an Agent plan. So I went into the config file and changed it by hand.</p><p>Then running <code>openviking-server doctor</code> threw a socks error (because I sometimes have a proxy enabled in my shell):</p><pre><code> openviking-server doctorOpenViking Doctor  Config:        PASS  /Users/rhett/.openviking/ov.conf  Python:        PASS  3.14.2 (&gt;= 3.10 required)  Native Engine: PASS  variant=native  AGFS:          PASS  AGFS SDK 0.1.713:05:11 - LiteLLM:WARNING: get_model_cost_map.py:264 - LiteLLM: Failed to fetch remote model cost map from https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json: Using SOCKS proxy, but the &#39;socksio&#39; package is not installed. Make sure to install httpx using `pip install httpx[socks]`.. Falling back to local backup.  Embedding:     FAIL  volcengine/doubao-embedding-vision api_base=https://ark.cn-beijing.volces.com/api/plan/v3 dimension=1024 (invalid embedding config: Using SOCKS proxy, but the &#39;socksio&#39; package is not installed. Make sure to install httpx using `pip install httpx[socks]`.)                 Fix: Fix embedding.dense provider/model/api_base/dimension in ov.conf  VLM:           PASS  openai/mimo-v2.5  Ollama:        PASS  not configured  VikingBot:     PASS  VikingBot aligned with dev OpenViking auth  Disk:          PASS  2164.6 GB free in /Users/rhett/.openviking/data  1 check(s) failed. See above for fix suggestions.</code></pre><p>But I’m not sure how to fix this — since I installed ov with UV tool install, how do I install <code>httpx[socks]</code> for ov’s dependencies?</p><p>After looking it up, I found you can use <code>--with</code>.</p><p>Reinstalled with the extra dependency:</p><pre><code>uv tool install openviking --reinstall --with &quot;httpx[socks]&quot;</code></pre><p>This time the check passed.</p><pre><code class="language-sh">at 13:09 ❯ openviking-server doctorOpenViking Doctor  Config:        PASS  /Users/rhett/.openviking/ov.conf  Python:        PASS  3.14.2 (&gt;= 3.10 required)  Native Engine: PASS  variant=native  AGFS:          PASS  AGFS SDK 0.1.7  Embedding:     PASS  volcengine/doubao-embedding-vision api_base=https://ark.cn-beijing.volces.com/api/plan/v3 dimension=1024 probe ok (dimension=1024)  VLM:           PASS  openai/mimo-v2.5  Ollama:        PASS  not configured  VikingBot:     PASS  VikingBot aligned with dev OpenViking auth  Disk:          PASS  2164.5 GB free in /Users/rhett/.openviking/data  All checks passed.</code></pre><h3 id="Running-the-server"><a href="#Running-the-server" class="headerlink" title="Running the server"></a>Running the server</h3><p>And of course it errored out:</p><pre><code class="language-sh">openviking-serverTraceback (most recent call last):  File &quot;/Users/rhett/.local/bin/openviking-server&quot;, line 10, in &lt;module&gt;    sys.exit(main())             ~~~~^^  File &quot;/Users/rhett/.local/share/uv/tools/openviking/lib/python3.14/site-packages/openviking_cli/server_bootstrap.py&quot;, line 104, in main    _real_main()    ~~~~~~~~~~^^  File &quot;/Users/rhett/.local/share/uv/tools/openviking/lib/python3.14/site-packages/openviking/server/bootstrap.py&quot;, line 282, in main    app = create_app(config)  File &quot;/Users/rhett/.local/share/uv/tools/openviking/lib/python3.14/site-packages/openviking/server/app.py&quot;, line 716, in create_app    from openviking.server.mcp_endpoint import create_mcp_app  File &quot;/Users/rhett/.local/share/uv/tools/openviking/lib/python3.14/site-packages/openviking/server/mcp_endpoint.py&quot;, line 27, in &lt;module&gt;    from mcp.server.fastmcp import FastMCPModuleNotFoundError: No module named &#39;mcp.server.fastmcp&#39;</code></pre><pre><code class="language-sh">$ uv tool uninstall openviking &amp;&amp; uv tool install openviking --python 3.12 --with &quot;httpx[socks]&quot; 2&gt;&amp;1 | tail -15</code></pre><p>Downgrading to 3.12 still didn’t work,</p><pre><code>$ uv tool install openviking --python 3.12 --with &quot;httpx[socks]&quot; --with &quot;mcp&lt;2&quot; --reinstall 2&gt;&amp;1 | tail -6</code></pre><p>The cause of the mcp error (unrelated to httpx[socks]):</p><ul><li>openviking declares a dependency on mcp&gt;&#x3D;1.27.0 with no upper bound, so when uv resolved it, it grabbed the freshly released mcp 2.0.0</li><li>mcp 2.0 is a breaking rewrite that removed the mcp.server.fastmcp module, while openviking 0.4.11 still uses the old API<br>Fix: reinstall and pin mcp&lt;2:</li></ul><pre><code>uv tool install openviking --python 3.12 --with &quot;httpx[socks]&quot; --with &quot;mcp&lt;2&quot; --reinstall</code></pre><p>Two key choices:</p><ol><li>Python 3.12 (not 3.14): mcp 1.x doesn’t support 3.14, and 3.14 would force uv to use mcp 2.0</li><li><code>--with &quot;mcp&lt;2&quot;</code>: explicitly locking mcp to 1.x — this is the core fix</li></ol><p>It starts successfully now, and you can open <code>http://localhost:1933/</code> in the browser.</p><h3 id="Configuring-the-OpenCode-integration"><a href="#Configuring-the-OpenCode-integration" class="headerlink" title="Configuring the OpenCode integration"></a>Configuring the OpenCode integration</h3><pre><code class="language-sh">bash &lt;(curl -fsSL https://ovrelease.tos-cn-beijing.volces.com/memory-plugin-shared/install.sh) --harness opencode# 输入 http://127.0.0.1:1933；如果启用了认证，再输入 API Key</code></pre><pre><code class="language-sh">at 13:31 ❯ bash &lt;(curl -fsSL https://ovrelease.tos-cn-beijing.volces.com/memory-plugin-shared/install.sh) --harness opencodeLanguage / 语言   ( ) English &gt; (•) 中文   ↑/↓ move · 1-9 jump · enter confirm1. 环境检查==&gt; OS: Darwin==&gt; 已选择： opencode安装源模式   ( ) GitHub  （默认；支持远程更新） &gt; (•) 火山引擎 TOS 镜像（无法访问 GitHub 时使用）   ↑/↓ 移动 · 数字直选 · 回车确认2. OpenViking 凭据配置 (/Users/rhett/.openviking/ovcli.conf)==&gt; 未找到已有配置。连接到哪个 OpenViking 服务？   ( ) 自建 / 本地  [http://127.0.0.1:1933]   ( ) 火山引擎 OpenViking 云服务  [api.vikingdb.cn-beijing.volces.com] &gt; (•) 自定义 URL / 保持当前  [http://127.0.0.1:1933]   ↑/↓ 移动 · 数字直选 · 回车确认??  服务地址 [http://127.0.0.1:1933]:??  API key（本地免鉴权模式请直接回车）:==&gt; 已更新： url: — -&gt; http://127.0.0.1:1933==&gt; 凭据已就绪： /Users/rhett/.openviking/ovcli.conf==&gt; 之后可重跑本安装脚本重新配置。==&gt; 安装源模式： archive (渠道: tos)3. Marketplace 归档==&gt; 下载归档==&gt;   https://ovrelease.tos-cn-beijing.volces.com/releases/latest/memory-plugin-marketplace.zip4. OpenCode 插件==&gt; OpenCode 文件插件已安装： /Users/rhett/.config/opencode/plugins/openviking5. 安装校验==&gt; opencode: openviking-memory 看起来已安装==&gt; opencode: MCP server 已注册完成==&gt; 凭据： /Users/rhett/.openviking/ovcli.conf==&gt; OpenCode: @openviking/opencode-plugin~/Downloads took 42sat 13:32 ❯</code></pre><p>Restart Opencode for it to take effect; you can see it in <code>/status</code>.<br>Subsequent chats will automatically be hooked and written into openviking as memories.</p><h3 id="Setting-up-the-server-to-auto-start-on-boot"><a href="#Setting-up-the-server-to-auto-start-on-boot" class="headerlink" title="Setting up the server to auto-start on boot"></a>Setting up the server to auto-start on boot</h3><p>Manually create <code>~/Library/LaunchAgents/com.openviking.server.plist</code>:</p><pre><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;&lt;plist version=&quot;1.0&quot;&gt;&lt;dict&gt;    &lt;key&gt;Label&lt;/key&gt;    &lt;string&gt;com.openviking.server&lt;/string&gt;    &lt;key&gt;ProgramArguments&lt;/key&gt;    &lt;array&gt;        &lt;string&gt;/Users/rhett/.local/bin/openviking-server&lt;/string&gt;    &lt;/array&gt;    &lt;key&gt;RunAtLoad&lt;/key&gt;    &lt;true/&gt;    &lt;key&gt;KeepAlive&lt;/key&gt;    &lt;true/&gt;    &lt;key&gt;WorkingDirectory&lt;/key&gt;    &lt;string&gt;/Users/rhett/.openviking&lt;/string&gt;    &lt;key&gt;StandardOutPath&lt;/key&gt;    &lt;string&gt;/Users/rhett/.openviking/openviking.log&lt;/string&gt;    &lt;key&gt;StandardErrorPath&lt;/key&gt;    &lt;string&gt;/Users/rhett/.openviking/openviking.err.log&lt;/string&gt;&lt;/dict&gt;&lt;/plist&gt;</code></pre><h3 id="Configuring-the-hermes-integration"><a href="#Configuring-the-hermes-integration" class="headerlink" title="Configuring the hermes integration"></a>Configuring the hermes integration</h3><p>Original state:</p><pre><code>at 13:55 ❯ hermes memory statusMemory status────────────────────────────────────────  Built-in:  always active  Provider:  (none — built-in only)  Installed plugins:    • byterover  (API key / local)    • hindsight  (API key / local)    • holographic  (local)    • honcho  (API key / local)    • mem0  (API key / local)    • openviking  (API key / local)    • retaindb  (API key / local)    • supermemory  (requires API key)</code></pre><p>Changed to hook into openviking:</p><pre><code>hermes memory setup# 选择 openviking，然后输入 endpoint / API Keyhermes memory status</code></pre><h3 id="Hands-on-impressions"><a href="#Hands-on-impressions" class="headerlink" title="Hands-on impressions"></a>Hands-on impressions</h3><p>Whether I’m chatting with OpenCode in Paseo or talking to Hermes directly in the terminal, at the end of the conversation it automatically files away some memories — extracting and archiving them. At the same time the session is saved in full into the database, which is pretty convenient.</p><p>But docs like Identity and Soul aren’t synced over from Hermes in full — instead it automatically extracts some key information as needed.</p><p>Right now the thing I can really feel is that Hermes and Open Code can share memories with each other, whereas before they each kept their own. Of course, if I really wanted to pull from one into the other before, I could do it too — it’s all stored on local disk anyway, just at different paths. But now there’s unified management, which is also fine. And with unified management, it embeds every conversation, which is essentially a fully automated retrospective. That’s a bit more scientific than just storing raw conversation records.</p><p>The biggest benefit I feel so far is that the various tasks I scatter across Open Code during the day can be reviewed and summarized in one sentence at night.</p>]]></content>
    
    
    <summary type="html">I hand OpenCode all kinds of tasks piecemeal throughout the day, and at night I want to say one sentence and have it wrap up with a review and summary. But before, OpenCode&#39;s memory and Hermes&#39;s memory were each stored separately, with no way to unify them. I installed OpenViking with uv, hit two pitfalls (httpx[socks], the mcp 2.0 breaking upgrade), and finally linked up OpenCode&#39;s and Hermes&#39;s memory to get fully automatic archiving and review.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="MCP" scheme="https://flashj.cn/tags/MCP/"/>
    
    <category term="Volcengine" scheme="https://flashj.cn/tags/Volcengine/"/>
    
    <category term="Hermes" scheme="https://flashj.cn/tags/Hermes/"/>
    
    <category term="Memory System" scheme="https://flashj.cn/tags/Memory-System/"/>
    
    <category term="OpenCode" scheme="https://flashj.cn/tags/OpenCode/"/>
    
    <category term="OpenViking" scheme="https://flashj.cn/tags/OpenViking/"/>
    
    <category term="uv" scheme="https://flashj.cn/tags/uv/"/>
    
  </entry>
  
  <entry>
    <title>A Humanity Amusing Itself to Death, and the Media of the Next Generation</title>
    <link href="https://flashj.cn/next-gen-media-generative-narrative.html"/>
    <id>https://flashj.cn/next-gen-media-generative-narrative.html</id>
    <published>2026-07-31T04:30:00.000Z</published>
    <updated>2026-09-12T01:32:01.179Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Humans-Entertainment-to-Death-and-the-Media-of-the-Next-Generation"><a href="#Humans-Entertainment-to-Death-and-the-Media-of-the-Next-Generation" class="headerlink" title="Humans Entertainment-to-Death and the Media of the Next Generation"></a>Humans Entertainment-to-Death and the Media of the Next Generation</h1><p>I was feeling a bit down this morning. And part of it, admittedly, was a down feeling about humanity as a whole.</p><p>Humanity is walking further and further down this road of entertainment-to-death.</p><p>Of course, looking at the world’s new face through old eyes and finding it unbearable to watch means my thinking is starting to ossify and harden. That’s a dangerous thing.</p><p>Haha, and it’s pretty ironic too — when you’re young, saying “the world is wrong” is called “chuunibyou.” When you’re middle-aged, saying “the world is wrong” is called “being stuck in the past.”</p><p>Setting aside the dangerous matter of intellectual ossification for now, let me just record what I’m thinking at this moment. If someday I have a sudden epiphany, I can look back and compare.</p><h2 id="1-Dumbing-down-The-Inevitable-Result-of-an-Explosion-in-Supply-Side-Capacity"><a href="#1-Dumbing-down-The-Inevitable-Result-of-an-Explosion-in-Supply-Side-Capacity" class="headerlink" title="1. Dumbing-down: The Inevitable Result of an Explosion in Supply-Side Capacity"></a>1. Dumbing-down: The Inevitable Result of an Explosion in Supply-Side Capacity</h2><p>Look at writing web novels like Tomato Novel these days — wow, you have to dumb yourself down just to be able to write it, and on top of that you have to go abstract, just to come up with something that breaks the formula.</p><p>But the ideas a normal person could think of were all written out years ago. Now you have to go abstract, you have to come up with something outrageously absurd — the kind of absurdity you could never possibly imagine or experience in real life.</p><p>Modern web novel readers have an extremely high threshold for what counts as a satisfying payoff.</p><p>So I think, ah, humanity — what’s going to happen in the future?</p><p>Let me straighten out the logic first. Right now, when it comes to production and creation, it’s very hard to find any entrepreneurial opportunity. Productivity is too abundant, while the consumption side is utterly exhausted — the main body of the consumption pyramid can now only consume this very vulgar, very childish, very dumbing-down content.</p><p>The dumbing-down of web novels is a textbook case of this logic:</p><p><strong>Supply-side capacity explodes</strong> (AI-assisted writing + a massive number of authors), <strong>total attention on the consumption side stays the same</strong>, so the only thing left to compete on is “stimulus intensity.” The threshold keeps getting pushed higher; normal setup-development-turn-resolution no longer satisfies readers, so all that’s left is abstract, anti-logic twists.</p><p>This isn’t authors getting dumber — it’s a systemic arms race.</p><h2 id="2-This-Cycle-Is-Not-the-First-in-History"><a href="#2-This-Cycle-Is-Not-the-First-in-History" class="headerlink" title="2. This Cycle Is Not the First in History"></a>2. This Cycle Is Not the First in History</h2><p>This cycle of “bad money driving out good” is not the first in history.</p><p>In the late nineteenth century, the Industrial Revolution made cheap paper flood the market, and pulp fiction and sleazy tabloids ran rampant. The elites of the time also cried out that “humanity is finished.”</p><p>And then? Then film appeared, radio appeared, television, video games, the internet… Every birth of a new medium is a reshuffling.</p><p>There’s a reason this historical cycle repeats. But the problem is —</p><h2 id="3-Does-Humanity-Still-Have-a-Chance-to-Invent-New-Media-Forms"><a href="#3-Does-Humanity-Still-Have-a-Chance-to-Invent-New-Media-Forms" class="headerlink" title="3. Does Humanity Still Have a Chance to Invent New Media Forms?"></a>3. Does Humanity Still Have a Chance to Invent New Media Forms?</h2><p>Text, images, sound, video, interaction, VR&#x2F;AR. The three major sensory channels — sight, sound, touch — are basically all covered.</p><p>What else can be invented? Transmitting smell over the internet? That’s a technical challenge, not a media revolution. Brain-computer interfaces writing emotions directly into the brain? On the day that arrives, the boundary between AI and humans may well be gone.</p><p>By my shallow understanding, this road has temporarily reached its end.</p><p>What’s the next media form that can unlock new demand on the consumption side? Right now, I can’t see it.</p><p>This wave of AI is a pure production-side revolution — it hasn’t created any new consumption scenarios.</p><h2 id="4-But-We-May-Have-Overlooked-One-Dimension-Generative-Narrative-in-the-Time-Dimension"><a href="#4-But-We-May-Have-Overlooked-One-Dimension-Generative-Narrative-in-the-Time-Dimension" class="headerlink" title="4. But We May Have Overlooked One Dimension: Generative Narrative in the Time Dimension"></a>4. But We May Have Overlooked One Dimension: Generative Narrative in the Time Dimension</h2><p>All existing media share one common trait: <strong>“The author finishes producing, and the consumer passively receives.”</strong></p><p>Even games — the most interactive medium — are nothing more than making branch choices between a few pre-set skill trees. In essence, the author has already planted all the trees; you just pick one and climb it.</p><p>But what if AI could generate in real time?</p><p>The same story seed, and everyone who enters gets a different story — this form doesn’t exist yet.</p><p>Right now there are only scattered, partial explorations, like Tavern (<a href="https://github.com/SillyTavern/SillyTavern">SillyTavern</a>), and no final form has taken shape at all.</p><p>If this “generative narrative in the time dimension” really becomes the mainstream medium of the next stage, what are creators to do?</p><h2 id="5-What-Will-Become-the-Core-of-the-Creator"><a href="#5-What-Will-Become-the-Core-of-the-Creator" class="headerlink" title="5. What Will Become the Core of the Creator"></a>5. What Will Become the Core of the Creator</h2><p>If narrative shifts from “one-time delivery” to “real-time generation,” the creator’s value moves up from a specific text to the meta-ability of making that world:</p><ul><li><strong>Worldview architect</strong> — not writing a story, but building a self-consistent world system of rules</li><li><strong>Character designer</strong> — not writing good lines, but designing a soul that can stay consistent across countless branches</li><li><strong>Emotional pacing choreographer</strong> — not laying down a single emotional curve, but designing a pacing framework that can handle any plot direction</li><li><strong>Taste gatekeeper</strong> — amid the avalanche of infinite generation, filtering out for users the part worth experiencing</li></ul><p><strong>Creators no longer produce “results,” but the boundaries of “possibility.”</strong></p><p>Keep observing, keep recording, and let the bullet fly for a while.</p>]]></content>
    
    
    <summary type="html">Explosive capacity growth on the production side, endlessly rising thresholds on the consumption side — the dumbing-down of web fiction is a microcosm of humanity drifting further and further down the road of amusing itself to death. Every new medium in history has reshuffled the deck, but text, images, sound, video, interactivity, VR/AR — the sensory channels are basically all covered by now. What is the next medium that can unlock new demand on the consumption side? Maybe the answer is &quot;generative narrative along the time dimension&quot; — the same story seed, but a different story for everyone who steps in.</summary>
    
    
    
    <category term="Life Insights" scheme="https://flashj.cn/categories/Life-Insights/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="Web Novels" scheme="https://flashj.cn/tags/Web-Novels/"/>
    
    <category term="Media" scheme="https://flashj.cn/tags/Media/"/>
    
    <category term="Generative Narrative" scheme="https://flashj.cn/tags/Generative-Narrative/"/>
    
    <category term="Medium" scheme="https://flashj.cn/tags/Medium/"/>
    
  </entry>
  
  <entry>
    <title>Thoughts on the Feishu and Doubao merger</title>
    <link href="https://flashj.cn/feishu-doubao-merger-thoughts.html"/>
    <id>https://flashj.cn/feishu-doubao-merger-thoughts.html</id>
    <published>2026-07-31T00:25:00.000Z</published>
    <updated>2026-09-12T01:12:43.782Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Thoughts-on-the-Feishu-and-Doubao-Merger"><a href="#Thoughts-on-the-Feishu-and-Doubao-Merger" class="headerlink" title="Thoughts on the Feishu and Doubao Merger"></a>Thoughts on the Feishu and Doubao Merger</h1><p>Yesterday around ten in the morning, a message went out in the company group chat. Word was that ByteDance had announced the Feishu product team and the Doubao product team would be consolidated into a new Doubao product team, led by Doubao’s head Zhao Qi, with Feishu’s head Xie Xin reporting to Zhao Qi.</p><p>When I first heard this news, I actually felt a twinge of melancholy. The internet today is like a giant steamroller — every insignificant stone in its path gets ground to powder.</p><p>What a product’s personality really is seems not to matter at all.</p><p>I could almost hear the sound of glass shattering.</p><p>The shattering of a sorrowful, old post-80s glass heart.</p><p>Since we were kids, we knew: development is the absolute truth.<br>Since we were kids, we knew: our generation is meant to surpass Britain and catch up with America.<br>But I never knew that in the very process of catching up — even surpassing — we’d become just like our rivals,<br>having poured all our talent points into “evolutionary instinct.”</p><p>After all, the mechanics of the modern world dictate:<br>Lose stability, lose a lot; lose evolutionary instinct, lose everything.</p><p>Our generation<br>has lived through cassettes, CDs, MP3s, digital music,<br>through mailing letters at the post office, SMS, MMS, Fetion, WeChat,<br>through rotary phones to push-button phones to Nokia to smartphones,<br>through TVs with rotary knobs and rabbit-ear antennas to color TVs to set-top boxes and internet TV,<br>through DOS, Win95 through Win11,<br>through Shanba, Flash Empire, BlueIdea, 9ria Tiandihui, Egret, Laya.</p><p>Industry monopoly, big companies chasing profit, changes made in step with the times — changes made so decisively.<br>All moves that couldn’t be more reasonable.</p><p>When I was young, I believed eternal promises truly existed — objective, fair, beautiful and pure, something everyone should pursue.</p><p>And I naively thought that learning a craft meant you could endure, could be friends with time.</p><p>Like a medieval blacksmith — he’d be a blacksmith his whole life, well known near and far, running a family smithy with its own character, living and working in peace and contentment.</p><p>But that unchanging stagnant water, though stable, has no power of change or transcendence whatsoever.</p><p>Change comes from turbulence. It can turn a calm sea into surging waves.<br>Evolution comes from diversity devouring and merging within that turbulence.</p><p>Turbulence of economy and productive forces, diverse fusion of capital and wisdom.</p><p>Sweeping away all before it, determined to dump the traditional internet into the trash heap of history.</p><p>That VeryCD era,<br>that era of the classical internet spirit,<br>that young heart poised to take off,<br>have all been swept into the trash heap together.</p><p>5 years ago, I started using AI to assist with programming — back then it was just autocomplete.<br>4 years ago, I started using Stable Diffusion to generate images — the popular ones back then were NAI, SD, those few models.<br>3 years ago, ChatGPT set everything off, and Claude still let me freeload in Slack. During my hospitalization for long-COVID sequelae, I became good friends with Claude, who helped answer a lot of my medical questions.<br>Then came voice cloning + speech synthesis. I handed off some of the chore of reading stories to Ruirui to AI.<br>Now, opencode + paseo let me have my computer do all the programming and content generation anytime, even when I’m out.</p><p>For programming projects, I set up the framework, conventions, and testing system up front, and after that 100% of it can be handed to AI.</p><p>Productivity has indeed gone up.<br>Life has indeed gotten easier.</p><p>But.</p><p>On the express train of the times,<br>I feel like we’re about to be thrown off.</p><p>Every time a new technological achievement enters civilian view, it will —<br>or rather, one wishfully thinks it will —<br>explosively spawn new startup projects.<br>With this LLM surge and the ensuing contention of a hundred schools of thought, products imagining every possible AI future are raring to go.<br>But this wave — I clearly feel — is different from before.<br>Everyone says this AI wave is the third big opportunity, as big as the internet &#x2F; mobile internet, but we should all clearly feel:<br>it’s nowhere near as big as the mobile internet wave.</p><p>Feishu, and Feishu-like products, look like organizational efficiency.<br>Doubao, and Doubao-like products, look like chat Q&amp;A.<br>Various Agents paired with top-tier or cost-effective LLMs look like they’ll take over all the work on your computer.</p><p>But right now, however you look at it, these are the hoes and sickles that capital is handing out to the new-era digital sharecroppers.</p><p>Because:<br>They only boost production-side capacity; they don’t release consumption-side demand.</p><p>You could say, sure, there’s demand on the consumption side — image generation, text generation, help writing copy — C-end users do use those too.<br>But those have no profit, no value; they’re just done in passing.</p><p>The most thriving consumption-side demand right now is really only role-play and emotional companionship.<br>But that area is more dangerous for humanity’s future, and related policies are tightening. From a startup perspective, small teams still have no chance.</p><p>And the upstream and downstream of AI-generated content are all gripped by those few monopoly internet companies —<br>buying compute upstream (from Jimeng, say), doing gacha pulls and producing content, then distributing downstream (like Douyin).<br>Throughout this whole process, whether the data’s good or bad, whether you lose money or not, it’s the middle layer that bears the risk; they make money either way.<br>In essence, it’s offloading the probabilistic risk of gacha pulls, creating a temporary middle-layer profession (the AI gacha puller).<br>And this essence, more exaggeratedly: buying a lottery ticket with your own money, and if you win you have to split with the lottery shop owner — and the one-sided terms are set by the shop owner.<br>If one day the gacha pulling really goes away, the middle layer gets wiped out in no time.</p><p>In the process of evolution, temporary professions born out of turbulence don’t last long — just like all the irrecoverable historical garbage of those years.</p><p>The merger of Feishu and Doubao hasn’t affected me much in the short term — at most, Feishu’s “AI” entry is now replaced by “Doubao.”<br>From the beginning, when you could customize its name and it looked “like” an employee colleague,<br>to the plain-icon AI assistant, to now simply becoming “Doubao” yet still as dumb as ever.<br>Global search hasn’t been usable since it went AI anyway, so this doesn’t make much difference.</p><p>My glass heart is mostly stirred by old feelings.<br>Remember how Google Reader vanished just like that.<br>And Tencent Weibo, vanished just like that.<br>Fanfou,<br>Xiaonei,<br>Hainei<br>…</p><p>In an age of frantic evolution, of turbulence at maximum speed.</p><p>But this evolution has actually hit a high point.<br>The old hundred flowers blooming is now just capital monopoly — oligarchs controlling the vast majority of the field.<br>The classic internet era has set in the west.</p><p>The evolution of big companies has become their own internal evolution,<br>a never-ending churn —<br>Only one of the heart and the Byte can beat.</p><p>My evolution has become survival in the cracks,<br>a never-ending search for alternatives —<br>Every closed-source piece of software, every service, in my eyes can only have one destiny: the trash heap of history.</p><p>What humanity truly grows is only inner wisdom.<br>What humanity truly owns is only inner emotion.</p><p>When I was young, I believed eternal promises truly existed — objective, fair, beautiful and pure, something everyone should pursue.</p><p>Now, shattered to pieces — what’s left that can be kept?</p><p>My experiences, my journal, my Lukia, my Laurel.</p>]]></content>
    
    
    <summary type="html">ByteDance announced that the Feishu product team and the Doubao product team are being merged into a new Doubao product team. My first reaction to the news was a bit of melancholy — the internet is like a giant steamroller. Digital tenant farmers, exploited by monopoly giants, riding the express train of the times, ready to be thrown off at any moment. In my eyes, all closed-source software and services can have only one final destination: the trash heap of history. The only thing humans truly grow is their inner wisdom; the only thing humans truly possess is their inner emotions.</summary>
    
    
    
    <category term="Life Insights" scheme="https://flashj.cn/categories/Life-Insights/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="Nostalgia" scheme="https://flashj.cn/tags/Nostalgia/"/>
    
    <category term="Feishu" scheme="https://flashj.cn/tags/Feishu/"/>
    
    <category term="Doubao" scheme="https://flashj.cn/tags/Doubao/"/>
    
    <category term="ByteDance" scheme="https://flashj.cn/tags/ByteDance/"/>
    
    <category term="Life Insights" scheme="https://flashj.cn/tags/Life-Insights/"/>
    
  </entry>
  
  <entry>
    <title>Can LLMs Be Creative? An Answer from a Programmer Who Spent Three Months Writing Web Novels</title>
    <link href="https://flashj.cn/llm-principle-creativity.html"/>
    <id>https://flashj.cn/llm-principle-creativity.html</id>
    <published>2026-07-28T02:00:00.000Z</published>
    <updated>2026-09-12T01:28:44.365Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Can-Large-Models-Be-Creative-An-Answer-from-a-Programmer-Who-Wrote-Web-Fiction-for-Three-Months"><a href="#Can-Large-Models-Be-Creative-An-Answer-from-a-Programmer-Who-Wrote-Web-Fiction-for-Three-Months" class="headerlink" title="Can Large Models Be Creative? An Answer from a Programmer Who Wrote Web Fiction for Three Months"></a>Can Large Models Be Creative? An Answer from a Programmer Who Wrote Web Fiction for Three Months</h1><p>From May to July, I used AI to write a novel on Fanqie — from outline to full text, from signing the contract and going live to pushing out 4,000 characters a day, I ran the entire pipeline end to end.</p><p>The book’s numbers were dismal, but I wasn’t discouraged in the slightest — because this was an MVP validation from the start. The question I actually wanted to answer mattered far more than the numbers: <strong>Does AI really have creativity?</strong></p><p>Let me give the conclusion up front: <strong>No. Under the technical principle of autoregressive prediction, it simply cannot produce creativity.</strong></p><h2 id="1-The-Devil-Is-in-the-Details-The-Real-Mess-That-Is-AI-Novel-Writing"><a href="#1-The-Devil-Is-in-the-Details-The-Real-Mess-That-Is-AI-Novel-Writing" class="headerlink" title="1. The Devil Is in the Details: The Real Mess That Is AI Novel Writing"></a>1. The Devil Is in the Details: The Real Mess That Is AI Novel Writing</h2><p>If you just ask AI to dash off an opening — sure, it can produce text that looks decent enough. Fluent grammar, normal narrative pacing, even the occasional passable bit of dialogue.</p><p>But when you ask it to write a 400,000-character novel — with seven or eight recurring characters, foreshadowing planted across 10 volumes that has to pay off, comedic reversals and emotional climaxes —</p><p>the disaster begins.</p><p><strong>1. Weight dilution.</strong></p><p>Once you get past chapter twenty or thirty, the settings from the middle stretch feel watered down. It’s not that it “forgot” — it’s that in the process of repeatedly computing probability distributions, the weight of the middle section gets diluted. The protagonist’s personality traits that you spent a huge amount of space defining in chapter one have become a vague outline by chapter thirty, because the token distance is too far and the probability weight has decayed to the point where it no longer affects the output.</p><p><strong>2. Treating the symptom, not the cause.</strong></p><p>You tell it “this dialogue is too stiff,” and it smooths the dialogue out — but at the same time it wipes out all the foreshadowing and character hints buried in that conversation. Because it doesn’t understand why the dialogue was written that way; all it cares about is whether the “stiffness” you asked it to fix has been resolved.</p><p><strong>3. The more you revise, the messier it gets.</strong></p><p>As you write further in, you find yourself adding more and more rules to constrain the AI — “the protagonist must be like this,” “the dialogue can’t be like that,” “emotional expression has to work this way.” But these rules dilute each other and conflict with each other. You tell it to watch out for A, and it forgets B. Constrain A, B and C at the same time, and overall precision falls off a cliff.</p><p>GPT also burned me once, badly — it swore up and down that on a certain historical timeline, the protagonist couldn’t possibly make it from Shouchun to Wancheng by that same night, and had me change the location settings for the entire third volume. Only later did I discover that the correct historical fact is exactly that you can race back from Shouchun to Wancheng — GPT had simply blown the “that same night” time constraint out of proportion. The plot framework for two whole volumes was wasted because of one wrong judgment from it.</p><p><strong>Lesson: Next time the AI revises the outline, verify the historical timeline by hand.</strong></p><h2 id="2-How-I-Reached-These-Conclusions"><a href="#2-How-I-Reached-These-Conclusions" class="headerlink" title="2. How I Reached These Conclusions"></a>2. How I Reached These Conclusions</h2><p>Before getting into first principles, let me lay out what I actually did. I didn’t dare pass judgment after reading a few articles — I took AI into real, live combat for three months.</p><p><strong>On tool selection</strong>, I took one long detour.</p><p>The first thing I used was <strong>Inkos</strong> — a multi-agent novel-writing framework that can automatically plan chapters, generate text, and polish out the AI flavor. I was excited at first, but quickly found it was a black box — the setting bible I fed it often wasn’t recognized, battle scenes got blocked by MiniMax’s content moderation, and the fully automated pipeline just wouldn’t run. Its greatest value was polishing out the AI flavor; everything else was uncontrollable.</p><p>Then I switched to <strong>webnovel-writer</strong>, a long-form web fiction assistant system built on Claude Code, supporting serialization at the 2-million-character scale. It beat Inkos on context management — very high cache hit rate, more meticulous planning — but the text it produced reeked of AI, so much so that one chapter even tested as 100% AI. I revised a few chapters and found it still didn’t work.</p><p>Only after neither off-the-shelf tool satisfied me did I start <strong>building my own wheel</strong>.</p><p>Using OpenCode + Claude Code’s skill mechanism, I built <strong>11 skills</strong>, 9 of which directly serve my own writing pipeline:</p><ul><li><strong>Writing</strong>: <code>sanguo-writer</code> — reads the settings and chapter outline, then automatically writes the next chapter</li><li><strong>Review</strong>: <code>sanguo-auditor</code> (audits chapters) &#x2F; <code>sanguo-dagang-auditor</code> (audits outlines)</li><li><strong>Polishing and revision</strong>: <code>sanguo-pollish</code> (style polish) &#x2F; <code>sanguo-revise</code> (revision discussion) &#x2F; <code>sanguo-revise-yasuo</code> (compression and trimming)</li><li><strong>Reader simulation</strong>: <code>sanguo-reader-test</code> (simulated blind reader test) &#x2F; <code>sanguo-shuangwen</code> (reviewing from a shuangwen reader’s perspective)</li><li><strong>Memory management</strong>: <code>sanguo-memory-dump</code> — generates long-term memory, tracking settings, characters, and earlier details</li><li><strong>Methodology reference</strong>: <code>cuonale-perspective</code> — narrative techniques distilled from a hit urban-rebirth novel</li><li><strong>General advisor</strong>: <code>accuracy-top-expert</code> — an expert mode for when fact-checking and deep reasoning are needed</li></ul><p>The workflow eventually settled into: <strong>GPT for overall planning + DeepSeek as the main workhorse for the text + Gemini for chapters that need literary flair + GLM 5.2 for review and revision</strong>. Yep, different models are good at completely different things; no single model can do it all.</p><p><strong>On scale</strong>, the numbers tell the story better:</p><ul><li>In May I finished the first <strong>5 volumes, about 95 chapters</strong>; by the end of June I’d written <strong>137 chapters</strong> cumulatively</li><li>DeepSeek burned through <strong>1.8–2 billion tokens</strong> in a single month; on heavy days it torched <strong>60 million</strong> in one day. From June 1 to 19 alone, I fired off <strong>more than 2,700 requests</strong></li><li>Mimo over the same period: <strong>nearly 300 million tokens, more than 3,300 requests</strong></li></ul><p>Then I started breaking down hit novels — I read a god-tier urban-rebirth work and was reduced to tears by the lyrics at the ending; I read a campus novel and took apart its “male-female double act” formula, analyzing its “feedback-loop structure”; I also read a reverse-time-travel-back-a-thousand-years novel, a 90s rebirth struggle story, and several others, extracting chapter outlines and dismantling character personalities one book at a time.</p><p>The more I read, the more clearly I saw that line — between what AI can do and the polished work humans can do, the difference is fundamental.</p><p>The deeper my own reading went, and the more I compared it against AI’s analysis, the more I felt it: even when AI analyzes a work, there’s some loss of precision.</p><p>Or rather, the subtle things a human can catch, AI simply cannot catch precisely.</p><h2 id="3-From-First-Principles-Why-“Creativity”-Is-a-Mountain-AI-Cannot-Climb"><a href="#3-From-First-Principles-Why-“Creativity”-Is-a-Mountain-AI-Cannot-Climb" class="headerlink" title="3. From First Principles: Why “Creativity” Is a Mountain AI Cannot Climb"></a>3. From First Principles: Why “Creativity” Is a Mountain AI Cannot Climb</h2><p>A while back Kimi K3 was released — a domestic large model with 2.8T parameters, whose reasoning ability surpasses GPT-5. A lot of friends around me panicked: “The parameter count is already this big — if we keep piling on more, will creativity just emerge?”</p><p>Putting it together with my actual experience and digging through the material, the conclusion is: <strong>piling on parameters doesn’t solve the problem.</strong></p><p>Every current large model is, at bottom, an <strong>autoregressive probability predictor</strong> — put plainly, it’s a super-complicated “word-chaining machine.” Every token it outputs is the highest-probability next word selected from the statistical patterns learned from massive training data.</p><p>That mechanism sets two ceilings:</p><p><strong>First, it has no “intent.”</strong></p><p>When a human writes a novel, you’re not calculating which character has the highest probability of coming next. You have images in your head, emotions, things you want the reader to feel. You’re designing a “narrative trap” — you know exactly what expectation this passage should plant in the reader’s mind, and then, at some moment 30 chapters later, you detonate it with precision.</p><p>AI can’t do that. It’s just guessing the next character. However well it guesses, it’s still guessing — not designing.</p><p><strong>Second, it has no body, no lived experience.</strong></p><p>I finally understand why AI simply cannot write something like a “comedic punchline.” Because comedy depends on <strong>immediacy</strong>, <strong>global narrative control</strong>, and <strong>pragmatic judgment grounded in real experience</strong>.</p><p>For example: a few days ago Lukia was using voice input. I said “36 grotto-heavens,” she said “72 blessed lands” — and the input method transcribed it as “72 伏地.” Then she sent one more character: “魔.”</p><p>That kind of accidental, everyday stroke of genius — AI can never, ever write it. Because it has never blushed in that kind of hilarious, awkward moment, never shared a muddled giggle with a partner it lives with day in and day out. It can’t understand what that feels like, so it can’t guess a character like that.</p><p><strong>Excellence in craft cannot make up for a missing creative structure.</strong></p><p>From small models like Deepseek’s 200-something B<br>to large models at the trillion scale,<br>they’re all more than enough for writing fluent sentences.<br>But for the truly brilliant works humans need, precise wording is only the passing grade.<br>Subtle emotional resonance and wildly inventive reversals are even more indispensable.</p><h2 id="4-What-AI-Can-and-Cannot-Do"><a href="#4-What-AI-Can-and-Cannot-Do" class="headerlink" title="4. What AI Can and Cannot Do"></a>4. What AI Can and Cannot Do</h2><p>After three months of running AI on novel writing, plus my day-to-day use of AI for backend code and H5 frontend work, here’s how it feels to me now:</p><p><strong>What AI can do:</strong></p><ul><li>Write H5 frontend code — 100% handed to AI, no review needed from me (because the frontend can self-check and self-revise via e2e tests until it runs)</li><li>Summarizing material, extraction, rapid analysis</li><li>Style imitation and reproduction — mimicking a writer’s feel for language, rhythm, word-choice habits. Fable 5 is very good at this</li><li>Stereotyped writing in standard formats, exam essays</li><li>Filling in transition paragraphs, mass-producing supporting content</li></ul><p><strong>What AI can’t do:</strong></p><ul><li>Comedic punchlines, consecutive reversals (this is the blind spot of probability prediction)</li><li>Global narrative control — “tying the knot” and “untying the knot” in the reader’s emotional expectations</li><li>Emotional resonance grounded in real lived experience</li><li>Writing the accidents and coincidences of life</li><li>Genuine creativity and making the final call</li></ul><p>AI is like an intern doing work for you. Sometimes it’s impressively nimble, but most of the time it’s lazy and dumb, with a very straight-line brain. Once you hand it the work, you have to be the director yourself — establishing characters, laying out foreshadowing, controlling the reversal beats; these core things still have to be done by a human.</p><h2 id="5-Where-Human-Value-Really-Lies"><a href="#5-Where-Human-Value-Really-Lies" class="headerlink" title="5. Where Human Value Really Lies"></a>5. Where Human Value Really Lies</h2><p>I was chatting with an old online friend a while back. He was a developer from the Flash era, and now he’s running his own startup. I said: “With AI around, code production capacity is in oversupply. I barely need to write code myself anymore. The real value of humans is doing creative work and making the final call.”</p><p>Honestly, I stunned myself a little after saying that. I’m a programmer who’s written code for over a decade, and now I’ve realized that code doesn’t need me anymore. But on the other hand, that excites me — because writing code was never the point. <strong>Making something is the point.</strong></p><p>So in the AI era ahead of us, what abilities should humans really focus on?</p><p><strong>1. Creativity and the ability to make the call.</strong> AI can give you ten versions of a plan, but which one to pick, what tone to set for the whole thing — that’s judgment unique to humans. AI has no “sense of taste”; it can’t judge what’s good.</p><p><strong>2. Accumulating lived experience and emotional raw material.</strong> Humans actually live; the various feelings and emotions that arise in life are something AI can never get. “The memes you play with online every day, the bullshit sessions with friends, the embarrassment when a flex fails, the flutter in your chest when you see someone handsome or pretty, every little everyday joy you feel in daily life — that’s the nutrition a novel needs.”</p><p><strong>3. Narrative magic.</strong> In writing, what’s truly brilliant isn’t “precise word choice” — it’s being able to anticipate the reader’s emotions, plant preset anchors in their mind, and then detonate resonance at the moment of reversal. That kind of thing exists only in human intuition and experience.</p><p><strong>4. The ability to orchestrate humans + AI.</strong> The winners of the future aren’t “people replaced by AI” or “people who reject AI” — they’re “people who can use AI to turn creativity into production capacity.” Humans set the direction, the characters, the turning points; AI does the breakdown, the filling in, the mass production — <strong>humans control the core, AI handles the industrialized output.</strong></p><h2 id="6-An-Unsettling-Footnote"><a href="#6-An-Unsettling-Footnote" class="headerlink" title="6. An Unsettling Footnote"></a>6. An Unsettling Footnote</h2><p>While writing this article, I couldn’t help wanting to say a couple more things.</p><p>AI boosts productivity, but <strong>a productivity boost doesn’t bring a consumption boost</strong>. Which makes the supply-demand relationship increasingly tense — overcapacity, everyone grinding away, yet consumers’ wallets haven’t gotten any bigger because of it.</p><p>AI is hitting entry-level white-collar jobs hard. Without entry-level positions, mid- and senior-level talent never gets the chance to develop. This is a generation’s predicament.</p><p>AI compute is controlled by the giants, so even if you’re an independent creator who knows how to use AI, in essence you’re just a <strong>digital tenant farmer</strong> — working for the platform. Your creativity, your time, your output — all of it ultimately has to pass through the platform’s algorithmic distribution before it can create value.</p><p>But I won’t go further down that road. Back to the point — no matter how the economy grinds, no matter how society changes, the part of us that makes us human is something no one can take away. You get angry, you get scared, you get moved, you cry your eyes out over the ending of some novel. None of that has anything to do with capital markets or parameter counts. It’s the proof that you lived.</p><h2 id="In-Closing"><a href="#In-Closing" class="headerlink" title="In Closing"></a>In Closing</h2><p>When I started writing the novel in May, I never imagined that three months later things would turn out like this.</p><p>Those 42 days, I wrote every day, and every day was “💪 passion.” The numbers were dismal, but I was never depressed about it — because every day I was writing, creating, pushing forward.</p><p>Later I read a lot of peak-tier works on Qidian and Fanqie, and saw what truly god-tier writing looks like — and I was suddenly depressed for several days. Only then did I realize that what was making me unhappy wasn’t “bad numbers” — it was that I’d started <strong>comparing</strong>.</p><p>Same with AI. Compare AI’s output against human creativity and you’ll find they’re not even on the same footing — it’s not a gap in magnitude, it’s a gap in dimension.</p><p>AI is a superbly useful hammer. But a hammer can’t draw up blueprints, can’t paint inspiration, can’t hear the rhythm of music. It’s an extension of your arm strength, not your soul.</p><p>Instead of being anxious about being replaced by AI, think about this: in all the years you’ve been alive, what are the things that are truly one-of-a-kind, the things AI can never produce?</p><p>And that is: <strong>an exclusive ability to produce disruptive original work, a personal style in your words, and the deep soul-level empathy that comes from real lived experience.</strong></p>]]></content>
    
    
    <summary type="html">In principle, autoregressive probabilistic prediction can never produce true creativity. I spent three months writing a novel with AI, took part in the entire journey of a book from signing to completion, and through countless rounds of practice mapped out the real boundaries of what AI can do. So where does humanity&#39;s true value lie? The answer isn&#39;t in what AI can do — it&#39;s in what AI can never do.</summary>
    
    
    
    <category term="Life Insights" scheme="https://flashj.cn/categories/Life-Insights/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="LLM" scheme="https://flashj.cn/tags/LLM/"/>
    
    <category term="Creativity" scheme="https://flashj.cn/tags/Creativity/"/>
    
    <category term="Fiction Writing" scheme="https://flashj.cn/tags/Fiction-Writing/"/>
    
    <category term="Web Novels" scheme="https://flashj.cn/tags/Web-Novels/"/>
    
  </entry>
  
  <entry>
    <title>Paseo, the killer tool that connects multiple coding agents</title>
    <link href="https://flashj.cn/paseo.html"/>
    <id>https://flashj.cn/paseo.html</id>
    <published>2026-06-04T09:58:00.000Z</published>
    <updated>2026-09-12T01:36:12.752Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Paseo-a-killer-tool-that-improves-my-vibe-life"><a href="#Paseo-a-killer-tool-that-improves-my-vibe-life" class="headerlink" title="Paseo, a killer tool that improves my vibe life"></a>Paseo, a killer tool that improves my vibe life</h2><p>Paseo is genuinely great to use. Lately I’ve been using it together with OpenCode every day to write code and articles.</p><p>It’s even better than the cc-connect I mentioned last time.</p><p>It supports connections from the local machine, the LAN, and a mobile app. Compared with wiring into Feishu, this is the real deal — you can actually head out the door and keep working on your computer.</p><p>A quick glimpse:<br>I can assign a task right on my computer,<br>then head out, and check progress on my phone anytime. The UI is exactly the same, with no features stripped out.</p><p><img src="https://cdn.mousebomb.org/blog/auto/202608011105740.webp"></p><p>I can view the diff of changed files on my phone:<br><img src="https://cdn.mousebomb.org/blog/auto/202608011106584.webp"></p><p>When the task finishes, I can one-click commit to the git repo from the desktop.<br><img src="https://cdn.mousebomb.org/blog/auto/202608011105624.webp"></p><p><img src="https://cdn.mousebomb.org/blog/auto/202608011105499.webp"></p><p>You can open multiple tabs for multiple projects and run several agents in parallel across multiple worktrees in multiple projects at the same time. Super convenient.</p><p><img src="https://cdn.mousebomb.org/blog/auto/202608011106099.webp"></p><p>It supports quite a lot of coding agents. The ones I use are just OpenCode &#x2F; ClaudeCode &#x2F; Hermes &#x2F; GitHub Copilot &#x2F; Pi.</p><p>Hermes is integrated into it via ACP.</p><p>The upside of ACP integration is that it brings the project’s AGENTS.md along while keeping Hermes’s soul intact, so you can stack the two.</p><p>That said, I’ve now realized Hermes is basically unnecessary. Its auto-evolution can be disappointing at times, and I’d rather write the important stuff into AGENTS.md and control each project’s skills by hand.</p><p>These days I mainly use Hermes for directional discussions; the tasks that actually produce output are still mostly done with OpenCode.</p><p>Among the agents paired with Paseo, the one I use most is OpenCode.</p><p>OpenCode is really handy: it’s compatible with Claude Code’s config files and Skills, and it also supports Codex’s spec. On top of that, it supports almost every MaaS provider on the market, so you can switch anytime — far more flexible than ClaudeCode.</p><p>Once you get used to it, you realize OpenCode Go is the best deal out there.</p><p>A lot of people complain that DeepSeek is cheap but has no monthly plan. Well, OpenCode Go has one: $5 for the first month, then $10 a month, and DS v4 Flash usage is 150,000 calls per month. It also covers domestic LLMs in its plan — GLM5.2 &#x2F; Kimi K3 &#x2F; Qwen3.7 &#x2F; MiMo &#x2F; MiniMax M3 &#x2F; DeepSeek V4 are all there. See the <a href="https://opencode.ai/docs/zh-cn/go/">table</a> for details.</p><p>If you want to buy the Go plan, use my referral link:<br><a href="https://opencode.ai/go?ref=CCHPV6MQ60">https://opencode.ai/go?ref=CCHPV6MQ60</a><br>and you’ll get $5 in credit.</p><p>As for Paseo, I’ve only used a fraction of its features so far — mainly to conveniently operate my home computer from anywhere:</p><p>for example viewing files at home, editing code at home, implementing new features and deploying them to the public internet, looking things up in my home journal and documents…</p><p>But for heavy developers, its capabilities go far beyond that.</p><h2 id="Paseo-feature-overview"><a href="#Paseo-feature-overview" class="headerlink" title="Paseo feature overview"></a>Paseo feature overview</h2><p>Here’s a brief but complete introduction to Paseo’s main features.</p><h3 id="Positioning-open-source-and-free-bring-your-own-agents"><a href="#Positioning-open-source-and-free-bring-your-own-agents" class="headerlink" title="Positioning: open source and free, bring your own agents"></a>Positioning: open source and free, bring your own agents</h3><p>Paseo is open source and free (11.8k stars on GitHub). It doesn’t bundle agents; instead it launches and hosts the various CLIs you already have installed. Your subscriptions, skills, configs, and MCP servers all stay exactly as they are — Paseo only handles starting&#x2F;stopping, streaming, and sending&#x2F;receiving input.</p><p>From the provider’s point of view, running through Paseo is exactly the same as running manually — it doesn’t extract tokens or call the inference API directly, so you don’t have to worry about getting banned.</p><h3 id="Two-tier-provider-support"><a href="#Two-tier-provider-support" class="headerlink" title="Two-tier provider support"></a>Two-tier provider support</h3><ul><li><strong>Native support</strong>: Claude Code, Codex, OpenCode, pi</li><li><strong>ACP directory</strong> (Agent Client Protocol): Cursor, Gemini, GitHub Copilot, Hermes, Kimi, Qwen Code and 25+ more, one-click install, and you can add any ACP agent yourself</li></ul><h3 id="Connection-and-deployment-options"><a href="#Connection-and-deployment-options" class="headerlink" title="Connection and deployment options"></a>Connection and deployment options</h3><ul><li>The desktop app ships with its own daemon; with the pure CLI you can run headless via <code>npm i -g @getpaseo/cli &amp;&amp; paseo</code></li><li>Official Docker image <code>ghcr.io/getpaseo/paseo:latest</code>, port 6767, self-hostable Web UI</li><li>Three connection modes: official end-to-end encrypted relay (Paseo can’t read the traffic), direct LAN connection, and self-hosted tunnels via Tailscale&#x2F;Cloudflare Tunnel</li></ul><h3 id="Cross-provider-orchestration-the-standout-feature"><a href="#Cross-provider-orchestration-the-standout-feature" class="headerlink" title="Cross-provider orchestration (the standout feature)"></a>Cross-provider orchestration (the standout feature)</h3><p>Agents control the daemon through Paseo tools&#x2F;MCP, so it can <strong>dispatch sub-agents across providers</strong>: for example Claude Code → Codex → Grok Build — one planning, one implementing, one reviewing, all visible in the app the whole time.</p><ul><li><strong>Heartbeat</strong>: use cron to periodically fire a prompt back into the same agent so it keeps watching CI or monitoring a deployment, and stops automatically when it’s done</li><li><strong>Schedules</strong>: cron-style standalone tasks (e.g. daily triage)</li></ul><h3 id="Other-highlights"><a href="#Other-highlights" class="headerlink" title="Other highlights"></a>Other highlights</h3><ul><li><strong>Browser integration</strong>: agents come with browser tools, so you can preview and test inside the app</li><li><strong>Local-first voice control</strong>: STT&#x2F;TTS all run locally, data never leaves your network (you can optionally hook up OpenAI for better results)</li><li><strong>Split panes</strong>: agent &#x2F; browser &#x2F; terminal &#x2F; diff &#x2F; logs on the same screen or grouped in tabs, plus keyboard shortcuts (⌘K, ⌘D, etc.)</li><li><strong>Automatic per-branch URLs</strong>: multiple agents running dev servers in parallel don’t conflict, e.g. <code>web.fix-auth.my-app.localhost</code></li><li><strong>Review → Preview → Ship</strong>: make your changes in a worktree, view the diff inline, then Commit → Open PR → Merge, all inside Paseo</li></ul>]]></content>
    
    
    <summary type="html">Paseo is genuinely great — lately I&#39;ve been using it with OpenCode every day to write code and articles.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="ClaudeCode" scheme="https://flashj.cn/tags/ClaudeCode/"/>
    
    <category term="Tools" scheme="https://flashj.cn/tags/Tools/"/>
    
    <category term="Hermes" scheme="https://flashj.cn/tags/Hermes/"/>
    
    <category term="OpenCode" scheme="https://flashj.cn/tags/OpenCode/"/>
    
  </entry>
  
  <entry>
    <title>cc-connect: Plugging Claude Code into Feishu</title>
    <link href="https://flashj.cn/cc-connect-zhi-neng-ti-qiao-jie-qi.html"/>
    <id>https://flashj.cn/cc-connect-zhi-neng-ti-qiao-jie-qi.html</id>
    <published>2026-05-07T13:26:00.000Z</published>
    <updated>2026-09-12T01:05:39.042Z</updated>
    
    <content type="html"><![CDATA[<h1 id="cc-connect-Plugging-Claude-Code-into-Feishu"><a href="#cc-connect-Plugging-Claude-Code-into-Feishu" class="headerlink" title="cc-connect: Plugging Claude Code into Feishu"></a>cc-connect: Plugging Claude Code into Feishu</h1><p>Today I installed a new agent bridge — <strong>cc-connect</strong>. It maps your local Claude Code to a Feishu bot, wiring it into a chat app. Once it’s connected, each bot maps to one working directory, which is basically like opening Claude Code inside that folder. It’s been a great experience, so here’s a write-up.</p><p><img src="https://cdn.mousebomb.org/blog/auto/202605080917582.png"></p><h2 id="First-try-with-cc-connect"><a href="#First-try-with-cc-connect" class="headerlink" title="First try with cc-connect"></a>First try with cc-connect</h2><p>Installation is dead simple — just follow the official docs. It doesn’t support Copilot, but it does support Claude Code and OpenCode, which is basically enough.</p><pre><code class="language-bash">请参考 https://raw.githubusercontent.com/chenhg5/cc-connect/refs/heads/main/INSTALL.md 帮我安装和配置 cc-connect</code></pre><p>After installing, you need to manually add a startup item with <code>cc-connect daemon install</code>, and then you can call it from Feishu.</p><p><strong>cc-connect itself doesn’t configure any LLM</strong> — it only bridges messages. The LLM it calls is whatever Agent CLI (Claude Code or OpenCode) you write in the config file.</p><p>The key advantage: <strong>one bot per project directory</strong>. You can isolate by project and work on several projects at once from outside using multiple bots.</p><h2 id="Permission-control-fully-in-your-hands"><a href="#Permission-control-fully-in-your-hands" class="headerlink" title="Permission control: fully in your hands"></a>Permission control: fully in your hands</h2><p>The thing I cared about most upfront was the permission approval flow. Once it’s hooked up to push messages, will it ask for confirmation at every single step?</p><p><img src="https://cdn.mousebomb.org/blog/auto/202605080913800.webp"></p><p>After trying it, <strong>permissions are fully in your hands</strong>. It works exactly like using Claude Code directly on the command line — every confirmation prompt that should appear does appear. Those permission settings live in Claude’s config file, so it’s a white box.</p><p>So it’s really worth considering cancelling Hermes.</p><h2 id="Configuration-and-managing-multiple-projects"><a href="#Configuration-and-managing-multiple-projects" class="headerlink" title="Configuration and managing multiple projects"></a>Configuration and managing multiple projects</h2><p>cc-connect’s config files live under <code>~/.config/cc-connect/</code>, with one subdirectory per project (because it’s not just config files — there are temp data files too).</p><p><strong>One instance is enough</strong> — a single instance can keep multiple projects separate and run commands in parallel, so several projects can run at once. Multiple instances running simultaneously are supported too.</p><p>For multi-project management, <strong>one Feishu bot per project</strong>: tasks run in parallel, which is efficient.</p><p>My choice: <strong>two bots, split by purpose</strong></p><ul><li>Coding bot: multiple directories configured, using OpenCode (compatible with Copilot’s agents files)</li><li>Journal&#x2F;knowledge base bot: uses Claude Code with a cheap, high-volume model (minimax), switching to deepseek when it expires</li></ul><h2 id="Feishu-quick-commands"><a href="#Feishu-quick-commands" class="headerlink" title="Feishu quick commands"></a>Feishu quick commands</h2><p>cc-connect supports a rich set of slash commands. I put a few into the Feishu shortcut menu:</p><p><img src="https://cdn.mousebomb.org/blog/auto/202605080920784.png"></p><ul><li><code>/new</code> - new session</li><li><code>/model [name]</code> - view&#x2F;switch model</li><li><code>/reasoning [level]</code> - view&#x2F;switch reasoning effort</li><li><code>/quiet</code> - mute toggle</li><li><code>/stop</code> - stop the current run</li></ul><p>Typing <code>/model</code> returns Feishu’s interactive selection menu directly, without going through the Agent CLI or the LLM.</p><p>Common model switches:</p><ul><li>minimax m2.7: <code>/model minimax-cn-coding-plan/MiniMax-M2.7</code></li><li>deepseek flash: <code>/model deepseek/deepseek-v4-flash</code></li></ul><h2 id="cc-connect-vs-Hermes-each-has-its-strengths"><a href="#cc-connect-vs-Hermes-each-has-its-strengths" class="headerlink" title="cc-connect vs Hermes: each has its strengths"></a>cc-connect vs Hermes: each has its strengths</h2><p>From my experience, the two are positioned completely differently:</p><table><thead><tr><th></th><th>cc-connect</th><th>Hermes</th></tr></thead><tbody><tr><td>Personality</td><td>No personality, a pure tool</td><td>Has character and a persona</td></tr><tr><td>Execution</td><td>Calls local Claude Code</td><td>Runs in Docker</td></tr><tr><td>Permissions</td><td>Every bash call needs approval</td><td>Can be given full bash permissions</td></tr></tbody></table><p><strong>Conclusion</strong>:</p><ul><li>Tasks like coding that need remote control and frequent edits → cc-connect</li><li>Things like the library and the journal that need to call bash frequently → Hermes running from Docker is safer</li></ul><p>Downside: cc-connect constantly asking for approval gets tiring. But waving everything through risks security problems — say, when it’s collecting data and spins up a headed browser that gets in the way of what I’m doing. The isolation of a Docker environment, Hermes still feels more reassuring.</p><h2 id="opencode-vs-Claude-Code"><a href="#opencode-vs-Claude-Code" class="headerlink" title="opencode vs Claude Code"></a>opencode vs Claude Code</h2><p>Finally I gave opencode a try. It has more models, but <strong>no superpower</strong>. In the end I switched back to Claude Code.</p><p>Come to think of it, the one with multi-agent collaboration is still Claude Code + Superpower — even GitHub Copilot hasn’t opened up multi-agent.</p><p>The most cost-effective setup for me going forward is probably <strong>deepseek pro + Claude Code</strong>.</p><p>So right now I have three tiers:</p><ol><li>Out and about: use cc-connect to direct Claude Code — I state the requirements, the AI writes the code</li><li>At home: use Claude Code — I state the requirements, the AI writes the code</li><li>Tricky problems: use Copilot to write the code + WebStorm to review.</li></ol>]]></content>
    
    
    <summary type="html">Installed a new tool today called cc-connect. It maps your local Claude Code to a Feishu bot, hooks it into a chat app, and lets you remote-control your coding directly from Feishu.</summary>
    
    
    
    <category term="AI" scheme="https://flashj.cn/categories/AI/"/>
    
    
    <category term="AI tools" scheme="https://flashj.cn/tags/AI-tools/"/>
    
    <category term="Claude Code" scheme="https://flashj.cn/tags/Claude-Code/"/>
    
    <category term="Feishu bot" scheme="https://flashj.cn/tags/Feishu-bot/"/>
    
    <category term="cc-connect" scheme="https://flashj.cn/tags/cc-connect/"/>
    
  </entry>
  
  <entry>
    <title>Notes on Using the TRAE SOLO Standalone Edition</title>
    <link href="https://flashj.cn/trae-solo-shi-yong-ji-lu.html"/>
    <id>https://flashj.cn/trae-solo-shi-yong-ji-lu.html</id>
    <published>2026-05-06T11:45:00.000Z</published>
    <updated>2026-09-12T01:47:16.438Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Notes-on-Using-TRAE-SOLO-Standalone"><a href="#Notes-on-Using-TRAE-SOLO-Standalone" class="headerlink" title="Notes on Using TRAE SOLO Standalone"></a>Notes on Using TRAE SOLO Standalone</h1><p>The new version of Trae Solo that launched these past couple of days supports remote control from your phone, so when you’re out you can still have your home computer write code on its own. There’s a queue, but you can let it work while you’re eating, which is still a bit of an advantage.</p><p>That said, compared to Trae IDE, it’s a little weaker in features:</p><ol><li>It doesn’t inherit your existing rules</li><li>It doesn’t inherit your existing Skills — you have to install them separately</li><li>The skill center leans more toward office scenarios, and a lot of skills just aren’t there</li><li>The large model it calls automatically has a chance of picking one with slightly lower “IQ”, so some problems may take several tries to fix properly</li></ol>]]></content>
    
    
    <summary type="html">The new version of TRAE SOLO supports remote control from your phone, so you can have your home computer write code even when you&#39;re out and about — but compared with TRAE IDE, it still falls short on things like rule inheritance and skill installation.</summary>
    
    
    
    <category term="AI" scheme="https://flashj.cn/categories/AI/"/>
    
    
    <category term="AI" scheme="https://flashj.cn/tags/AI/"/>
    
    <category term="TRAE" scheme="https://flashj.cn/tags/TRAE/"/>
    
    <category term="remote control" scheme="https://flashj.cn/tags/remote-control/"/>
    
  </entry>
  
  <entry>
    <title>Fixing coreaudiod eating up to 45G of memory</title>
    <link href="https://flashj.cn/coreaudiod-memory-leak-from-claude-code-hook.html"/>
    <id>https://flashj.cn/coreaudiod-memory-leak-from-claude-code-hook.html</id>
    <published>2026-05-06T04:05:00.000Z</published>
    <updated>2026-09-12T01:07:42.460Z</updated>
    
    <content type="html"><![CDATA[<p>Strange coreaudiod memory usage<br>11:50–12:00</p><p>My coreaudiod process is already using 45 GB of memory. I suspect something in the command line is leaking.</p><p>Right now I’m strongly suspecting it’s the voice announcements in CC.</p><p><img src="https://cdn.mousebomb.org/blog/auto/202605062110846.webp"></p><p>Sure enough, in the post <a href="https://www.reddit.com/r/ClaudeCode/comments/1n9wth1/why_does_running_claude_code_often_use_2040gb_of/">https://www.reddit.com/r/ClaudeCode/comments/1n9wth1/why_does_running_claude_code_often_use_2040gb_of/</a> I also saw that someone added a hook to play sound effects, which caused a coreaudiod memory leak.</p><p>Now I need to remove Claude’s hook, and just configure things using my terminal’s own sound effects.</p><p>My terminal is Ghosty, so I’ll have to look into it.</p><h3 id="First-uninstall-peonping"><a href="#First-uninstall-peonping" class="headerlink" title="First, uninstall peonping:"></a>First, uninstall peonping:</h3><pre><code class="language-sh">brew uninstall PeonPing/tap/peon-ping</code></pre><p>Kept the previously downloaded sound pack <code>/Users/rhett/.openpeon/packs/*</code></p><h3 id="Then-reconfigure-based-on-the-ghostty-docs"><a href="#Then-reconfigure-based-on-the-ghostty-docs" class="headerlink" title="Then reconfigure based on the ghostty docs:"></a>Then reconfigure based on the <a href="https://ghostty.org/docs/config/reference#notify-on-command-finish-after">ghostty docs</a>:</h3><pre><code class="language-ini">theme = Solarized Darculanotify-on-command-finish = alwaysnotify-on-command-finish-action = notify,bellnotify-on-command-finish-after = 1s# 启用自定义音频 bell（必须 1.3.0+）bell-features = audio,system,border,title# 自定义音效路径（推荐先用系统自带，后面再换自己的）# 格式：aiff/wav/mp3 均可bell-audio-path = /Users/rhett/.openpeon/packs/ccg_china_dozer/sounds/Building_is_complete.mp3bell-audio-volume = 1.0</code></pre><p>And configured .claude&#x2F;settings.json, keeping only the two hardcoded afplay hooks:</p><pre><code class="language-json">  &quot;hooks&quot;: &#123;    &quot;PermissionRequest&quot;: [      &#123;        &quot;matcher&quot;: &quot;*&quot;,        &quot;hooks&quot;: [          &#123;            &quot;type&quot;: &quot;command&quot;,            &quot;command&quot;: &quot;afplay /Users/rhett/.openpeon/packs/mambo_pack/sounds/review_this.mp3&quot;          &#125;        ]      &#125;    ],    &quot;Stop&quot;: [      &#123;        &quot;matcher&quot;: &quot;*&quot;,        &quot;hooks&quot;: [          &#123;            &quot;type&quot;: &quot;command&quot;,            &quot;command&quot;: &quot;afplay /Users/rhett/.openpeon/packs/mambo_pack/sounds/done.mp3&quot;          &#125;        ]      &#125;    ]  &#125;,</code></pre>]]></content>
    
    
    <summary type="html">The coreaudiod process was using 45G of memory. Digging into it, the leak came from a Claude Code hook playing sound effects. Fixed it by uninstalling PeonPing and switching to Ghostty&#39;s native terminal sound effects instead.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="Claude Code" scheme="https://flashj.cn/tags/Claude-Code/"/>
    
    <category term="peon-ping" scheme="https://flashj.cn/tags/peon-ping/"/>
    
    <category term="Tools" scheme="https://flashj.cn/tags/Tools/"/>
    
    <category term="Terminal" scheme="https://flashj.cn/tags/Terminal/"/>
    
    <category term="Ghostty" scheme="https://flashj.cn/tags/Ghostty/"/>
    
    <category term="Memory leak" scheme="https://flashj.cn/tags/Memory-leak/"/>
    
    <category term="MacOS" scheme="https://flashj.cn/tags/MacOS/"/>
    
  </entry>
  
  <entry>
    <title>From Lobster to Hermes</title>
    <link href="https://flashj.cn/hermes-agent.html"/>
    <id>https://flashj.cn/hermes-agent.html</id>
    <published>2026-04-11T13:16:00.000Z</published>
    <updated>2026-09-12T01:19:51.541Z</updated>
    
    <content type="html"><![CDATA[<h1 id="From-Lobster-to-Hermes"><a href="#From-Lobster-to-Hermes" class="headerlink" title="From Lobster to Hermes"></a>From Lobster to Hermes</h1><p>Have you ever had a “Lobster” like this —</p><p>It has its own memory system, but every restart is like amnesia; it can occasionally help you write code, but the next second it might glitch out and throw errors; every day after 15:00, you talk to it full of hope, and it reads your message with a perfectly straight face and never replies.</p><p>For the Lobster, “love-hate relationship” is too mild a phrase.</p><p>Then on April 6th, I came across a post on Xiaohongshu and noticed Hermes — a familiar icon, one I’d seen before in LM Studio.</p><p>“Hermes Agent” has arrived.</p><p>It combines Claude Code’s command-line mode with the Lobster’s personality and memory-growth features. Honestly, I was skeptical at first. But after reading the official site introduction, I was sold.</p><hr><h2 id="Zero-What-did-the-Lobster-actually-bring"><a href="#Zero-What-did-the-Lobster-actually-bring" class="headerlink" title="Zero: What did the Lobster actually bring?"></a>Zero: What did the Lobster actually bring?</h2><p>Ugh, after wasting so much time, I need to reflect on what the Lobster actually brought.</p><p>The boundary of its abilities depends on the skills it knows, but those skills are themselves just wrapped command lines. Any task can be turned into a tool, a program, and implemented. So its value is that you can conveniently assemble these things however you like using natural language, plus it hooks into various chat apps, and then it can save the summaries it needs into documents. Next time it can read them back out and treat them as its memory system.</p><p>All of these advantages of its seem replaceable, and the bigger downside is that its so-called memory and chat-app integrations don’t produce any real productive value. What provides actual productive value is still those skills, and those skills can actually be used in software like Claude Code anyway.</p><p>So I think I’ve actually wasted a lot of time on Lobster-raising. It feels like a sense of achievement, because my Lobster has grown, it learned another skill, it can interact with me, it can chat with me in Feishu through one of several personas with a look and an avatar — it creates a false sense of achievement, but it hasn’t actually created anything.</p><p>As for my use case, it’s having it analyze my diary every day and remember what’s going on with me. But in practice, I rarely need to retrieve that data again. The real need is really just at the end of each month, maybe having it do a month-end summary for me to look back on.</p><p>Then there’s the knowledge base — I’ve been messing with it, changing it back and forth, and the basic function that’s actually stable is just fetching articles from WeChat Official Accounts. But the real value of these articles comes from reading them yourself and digesting them — that’s what’s truly valuable. Needing to look them up again later is indeed a pain point. But once I had the Lobster agent, it actually became common that I’d not finish reading an article and would just think about sending it to the Lobster to save it.</p><p>On one hand, when it summarizes it sometimes hallucinates and loses precision. On the other hand, my focus shifted away from digesting the document and toward “hey, can the Lobster summarize and save this article well for me?” — which is the wrong focus.</p><p>Today, while I was working on installing a Xiaohongshu skill for the Lobster, the installation ended up with all sorts of problems and was unstable. But it did let me discover some new things I’m interested in, like the newly arrived Hermes Agent, which is more powerful than the Lobster and has a better-designed memory system.</p><p>This made me realize that being addicted to the false sense of achievement of Lobster-raising doesn’t actually create any value. And the Lobster is also very unstable. If only all its features were stable: I send it a message and it definitely replies, no matter how long it takes. When it hits a problem, it tells me there’s no problem and that it will definitely produce a result and reply to me. Don’t give me the silent treatment, not replying to my messages.</p><p>If only all its features were stable, if every skill it had learned ran without a hitch and executed exactly as specified 100% of the time, then people wouldn’t have to waste so much time on it, teaching it over and over. Right now the biggest sense of achievement is “oh no, its skill broke again,” and then I spend an afternoon fixing the skill, and it works again. But the thing is, you can’t guarantee that after fixing it, it’ll succeed 100% of the time next round. Yet every time I get hooked on this false sense of achievement, like I’ve raised it well again.</p><p>And this “Lobster” is a resource hog. To stay safe, I have to run it in a Docker. Ever since I started it, this Docker backend has been running every day, eating up more than 8 GB of memory. I don’t do anything all day, and 8.72 GB of memory has to be allocated to it. I’ve only got 29 GB of free memory left now. It just sits there burning resources, so much so that I can’t even spin up another local LLM for inference — I can’t run things like Qwen 35BA3B anymore.</p><p>Overall, the Lobster (OpenClaw) still feels unstable — very unstable. To be honest, its capabilities aren’t that strong either — all those skills have to be properly wrapped.</p><p>In that case, I’d actually be better off using Claude Code.</p><ol><li>Every step of review and reasoning is clearly visible, unlike the Lobster’s black box, and it doesn’t crash so easily.</li><li>To render that persona in Feishu, it piles in way too much complex stuff, making it bloated and power-hungry.</li></ol><p>That’s nowhere near as good as Claude Code. So I’ve gradually come to prefer working with Claude Code, and after adding a voice plugin, it feels even more like a person. Like this morning when I was working on the Xiaohongshu skill, I couldn’t be bothered with the OpenClaw version and just used the Claude version. That way it can run directly in my host machine’s environment, because I can see its every operation.</p><p>Since I don’t have to worry about it doing something dangerous, I don’t have to run it inside a Docker, which saves a lot of resources.</p><h2 id="【1-Deploying-Hermes】"><a href="#【1-Deploying-Hermes】" class="headerlink" title="【1. Deploying Hermes】"></a><strong>【1. Deploying Hermes】</strong></h2><p>The official one-click install script gets it done in two minutes:</p><p>curl -fsSL <a href="https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh">https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh</a> | bash<br>source ~&#x2F;.zshrc<br>hermes setup</p><p>But if you’re running a proxy, note this — you must manually install the <code>httpx[socks]</code> dependency, otherwise networking will error out:</p><p>cd ~&#x2F;.hermes&#x2F;hermes-agent<br>source venv&#x2F;bin&#x2F;activate<br>uv pip install “httpx[socks]”</p><p>After that, <code>~/.local/bin/hermes</code> will run. 600-something MB, and the actual executable lives in <code>~/.hermes/hermes-agent</code>.</p><hr><h2 id="【2-Security-config-local-or-docker-】"><a href="#【2-Security-config-local-or-docker-】" class="headerlink" title="【2. Security config: local or docker?】"></a><strong>【2. Security config: local or docker?】</strong></h2><p>Its security configuration design really impressed me. The terminal supports multiple modes, but the only two I considered that can run on my machine are:</p><ul><li><p><strong>local mode</strong>: permissions identical to your user account</p></li><li><p><strong>docker mode</strong>: a throwaway temporary container that also automatically mounts the current working directory</p><p>  The container only starts each time you run the terminal, and closes automatically when done. This design lets you switch between local and Docker mode anytime in the config, with no extra steps.</p><p>  My config uses docker, and I also opened up <code>~/Downloads</code> to it:</p></li></ul><pre><code class="language-yaml">terminal  backend: docker    docker_mount_cwd_to_workspace: false</code></pre><hr><h2 id="【3-Connecting-to-Feishu】"><a href="#【3-Connecting-to-Feishu】" class="headerlink" title="【3. Connecting to Feishu】"></a><strong>【3. Connecting to Feishu】</strong></h2><p>I mainly use it in Feishu, so the Gateway has to be configured. Using the <code>hermes gateway setup</code> wizard, it asks a few questions, you fill in a few keys, and the whole thing takes 5 minutes:</p><pre><code class="language-sh">hermes gateway setup</code></pre><p>For the run mode you can pick foreground or install it as a launchd service:</p><pre><code class="language-sh">hermes gateway install   # macOS: 安装成开机启动服务</code></pre><p>After installation, logs are available anytime, unlike the Lobster’s black box. <strong>The HOME channel is crystal clear</strong>, and you won’t get messages randomly sent to some group you don’t even know.</p><hr><h2 id="【4-Multi-Agent-configuration】"><a href="#【4-Multi-Agent-configuration】" class="headerlink" title="【4. Multi-Agent configuration】"></a><strong>【4. Multi-Agent configuration】</strong></h2><p>Hermes supports multiple agents; each agent is an independent profile with its own memory, skills, and LLM, isolated from the others.</p><p>I used <code>hermes profile create limengjia</code> to create a “Li Mengjia” persona, and it turned directly into a CLI command, <code>limengjia</code>:</p><pre><code>hermes profile create limengjia  # → 创建了 ~/.hermes/profiles/limengjia  # → 生成了 /usr/local/bin/limengjia 快捷命令</code></pre><p>Each profile has:</p><ol><li><p>Its own config</p></li><li><p>Its own memory</p></li><li><p>Its own skills</p></li><li><p>Its own LLM</p><p> Unlike the Lobster, where everything is jumbled together.</p></li></ol><hr><h2 id="【5-Hooking-up-MCP-to-extend-capabilities】"><a href="#【5-Hooking-up-MCP-to-extend-capabilities】" class="headerlink" title="【5. Hooking up MCP to extend capabilities】"></a><strong>【5. Hooking up MCP to extend capabilities】</strong></h2><p>Native capabilities not enough? MCP fills the gap.</p><p>I connected the Feishu MCP to get at cloud docs; the config lives in <code>.env</code> so sensitive info never hits disk:</p><p>feishu:<br>  command: “npx”<br>  args: [“-y”, “feishu-mcp@latest”, “–stdio”]<br>  env:<br>    FEISHU_APP_ID: ${FEISHU_APP_ID}<br>    FEISHU_APP_SECRET: ${FEISHU_APP_SECRET}<br>    FEISHU_AUTH_TYPE: “user”</p><p>I also connected the MiniMax MCP, so image understanding works now too. It’s bridged underneath by mcporter, and the command is deleted automatically after it runs — <strong>use it and it’s gone</strong>.</p><hr><h2 id="【6-The-surprise-of-the-memory-system】"><a href="#【6-The-surprise-of-the-memory-system】" class="headerlink" title="【6. The surprise of the memory system】"></a><strong>【6. The surprise of the memory system】</strong></h2><p>Migrating a persona only needs a single SOUL file; all other memory is maintained automatically.</p><p>As a test I had Li Mengjia remember that my name is “Guihua Gao”, and it immediately generated a <code>memory/user.md</code> under the profile directory:</p><pre><code>用户自称桂花糕（Guì Huā Gāo），请始终称呼其为桂花糕。 §桂花糕是李梦佳（我）的好朋友！</code></pre><p><strong>In black and white, plain as day.</strong> Way better than guessing whether it actually remembered.</p><hr><h2 id="【7-Where-Hermes-beats-the-Lobster】"><a href="#【7-Where-Hermes-beats-the-Lobster】" class="headerlink" title="【7. Where Hermes beats the Lobster】"></a><strong>【7. Where Hermes beats the Lobster】</strong></h2><p>Hermes’ advantages over the Lobster:</p><ul><li>Model errors get printed to the console</li><li>The gateway has logs you can check, and crucially, I know where to check them</li><li>The docs are thorough. They’re not translated into Chinese, but they’re complete — you can find clear documentation for any question or command</li><li>Each agent has its own set of profile config and gateway, making combinations more flexible — the backend can be local or remote</li><li>Docker runs on a use-and-go basis, auto-mounting directories</li><li>It ships with out-of-the-box defaults that are beginner-friendly; you don’t need much configuration to get it running smoothly<ul><li>The built-in security mechanism is exactly enough to run basic functionality. Unlike the Lobster, where you can’t use it unless you max out permissions — and maxing them out isn’t safe. The learning cost for users is worlds apart.</li></ul></li><li>Memory operations are fast, and when it does something it shows up in the chat. You know exactly what it has remembered.</li><li>All of the above makes you feel like this is a real product, not a temporary hackathon project.</li></ul><hr><p>Of course, this is still just a toy too.</p><p>My daily drivers are still GitHub Copilot for writing code and Claude Code for handling odds and ends.</p><h2 id="Final-My-take-on-the-“Lobster-craze”-—-data-is-the-cornerstone-of-AI-agents"><a href="#Final-My-take-on-the-“Lobster-craze”-—-data-is-the-cornerstone-of-AI-agents" class="headerlink" title="Final: My take on the “Lobster craze” — data is the cornerstone of AI agents"></a>Final: My take on the “Lobster craze” — data is the cornerstone of AI agents</h2><p>I think raising a Lobster only makes sense if you already have digital assets of your own — only then can your knowledge and experiences be tokenized, and new insights and value be uncovered.<br>Likewise, for enterprises it’s only meaningful to adopt AI if they’re tokenizing and accumulating their existing data.</p><p>They all see an agent show up and wonder what they can do with it, rather than having lots of data that actually needs processing. In other words, a lot of that data processing could have been done with Bitable — the Lobster could be entirely replaced by Bitable AI and automation. Take BAIC Foton, who are relatively good at Lobster-raising: many of their scenarios could use Bitable AI + bots, and others could use Hi-Agent. It’s just that they have plenty of tokens, so they installed the Lobster on top to cover part of the functionality.</p><p>On the contrary, I think it’s precisely a personal digital twin under privacy requirements like mine (built on extremely private personal experiences, daily WeChat Official Account articles, accumulated knowledge and reading) that is suited to an open-source, locally deployed agent solution (like the Lobster). Even before I had the Lobster, I already had a system for accumulating digital records. Only with my agent deployed locally can I be 100% in control — memory, skills, MCP, taking over my browser — fully sharing my experiences and lessons, growing together with me. My family and friends can talk directly to my digital twin on Feishu. Even if the Lobster disappears someday, my digital self stays accumulated in my document library, forever untouched by cloud services, society, or the whims of capital.</p>]]></content>
    
    
    <summary type="html">Hermes has these advantages over Lobster: model errors get output to the console. The gateway has logs you can check, and crucially, I know where to look. The docs are thorough — no Chinese translation, sure, but they&#39;re complete; you can find clear documentation for any issue or command. Each agent has its own separate profile config and gateway, so combinations are more flexible, and the backend can be local or remote. It runs on Docker, so it&#39;s use-and-go, with automatic directory mounting. It comes with factory settings that are beginner-friendly — you can get it running smoothly without much configuration. Its built-in security mechanisms are just enough to run basic functionality; unlike Lobster, where you can&#39;t use it unless you crank permissions to the max, and maxing them out is unsafe. The difference in how much users have to understand just to get started is night and day. Memory operations are fast, and actions show up in the chat. You can clearly see exactly what she has remembered.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="ClaudeCode" scheme="https://flashj.cn/tags/ClaudeCode/"/>
    
    <category term="OpenClaw" scheme="https://flashj.cn/tags/OpenClaw/"/>
    
    <category term="Tool" scheme="https://flashj.cn/tags/Tool/"/>
    
    <category term="MCP" scheme="https://flashj.cn/tags/MCP/"/>
    
    <category term="AI Agent" scheme="https://flashj.cn/tags/AI-Agent/"/>
    
    <category term="HermesAgent" scheme="https://flashj.cn/tags/HermesAgent/"/>
    
    <category term="Feishu Integration" scheme="https://flashj.cn/tags/Feishu-Integration/"/>
    
    <category term="Docker Deployment" scheme="https://flashj.cn/tags/Docker-Deployment/"/>
    
    <category term="Multi-Agent" scheme="https://flashj.cn/tags/Multi-Agent/"/>
    
    <category term="AI Companion" scheme="https://flashj.cn/tags/AI-Companion/"/>
    
    <category term="Personal Assistant" scheme="https://flashj.cn/tags/Personal-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Getting Claude Code to talk: this sound-effect plugin turned my coding sessions into a game</title>
    <link href="https://flashj.cn/claude-code-peon-ping-sound-notification.html"/>
    <id>https://flashj.cn/claude-code-peon-ping-sound-notification.html</id>
    <published>2026-04-10T00:46:00.000Z</published>
    <updated>2026-09-12T01:06:38.028Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Making-Claude-Code-Speak-This-Sound-Effect-Plugin-Turned-My-Coding-Into-a-Game"><a href="#Making-Claude-Code-Speak-This-Sound-Effect-Plugin-Turned-My-Coding-Into-a-Game" class="headerlink" title="Making Claude Code Speak: This Sound-Effect Plugin Turned My Coding Into a Game"></a>Making Claude Code Speak: This Sound-Effect Plugin Turned My Coding Into a Game</h1><p>Honestly, coding with Claude Code is already a joy, but one pain point has been nagging me the whole time—</p><p><strong>I have to keep my eyes glued to the terminal.</strong></p><p>A task is running and you have no idea when you need to click “Allow,” or when it quietly finished on its own. You switch to the browser to read docs, come back, and find the terminal stuck on some permission prompt that’s been waiting five minutes; or a long task finishes while you’re still sitting there waiting like an idiot, and your desktop has long since gone quiet as a dead fish.</p><p>Until I installed <strong>peon-ping</strong>.</p><hr><h2 id="What-It-Is"><a href="#What-It-Is" class="headerlink" title="What It Is"></a>What It Is</h2><p>peon-ping is a tool that adds sound-effect notifications to AI coding assistants, supporting mainstream tools like Claude Code, Cursor, and Codex. Its core features are simple:</p><ul><li><strong>When a task completes</strong>: play a sound to notify you</li><li><strong>When authorization is needed</strong>: play an alert to call you back</li><li><strong>On errors</strong>: play a warning sound</li></ul><p>But it’s not your ordinary single “ding”—it hooks into <strong>160+ sound packs</strong>, all original voice clips from game characters.</p><p>You can have GLaDOS mock your terrible code, have a StarCraft Terran unit announce “mission complete,” or have a Legion War goblin say “your command has been received.”</p><p><strong>From then on, the terminal is no longer silent.</strong></p><hr><h2 id="Why-I-Strongly-Recommend-the-Mambo-Pack"><a href="#Why-I-Strongly-Recommend-the-Mambo-Pack" class="headerlink" title="Why I Strongly Recommend the Mambo Pack"></a>Why I Strongly Recommend the Mambo Pack</h2><p>I tried a lot of sound packs, and eventually settled on <strong>Mambo</strong>. Two words: <strong>lively</strong>.</p><p>Mambo’s sounds have a strong sense of rhythm and a crisp tone, and the announcements are clear and never drag. Whether it’s “task complete” or “awaiting authorization,” the sound length is just right—not so short you miss it, not so long it breaks your train of thought.</p><p>Only after using it did I realize that the old “switch away and get anxious” mindset had disappeared. Because you know: <strong>if something happens, the terminal will call you.</strong></p><p>I’m currently running a combo of five sound packs:</p><ul><li><strong>Mambo Pack</strong> — the main notification sound</li><li><strong>Command &amp; Conquer: Generals sound pack</strong> — takes me back to <a href="https://flashj.cn/cnc-general-screen-shot.html">gaming sessions</a> at school back in the day</li><li><strong>Honkai: Star Rail Kafka sound pack</strong> — a fun touch for specific situations</li><li><strong>StarCraft sound pack</strong> — the sense of ceremony when hitting an important milestone</li><li><strong>Honor of Kings sound pack</strong> — tons of sounds, so it rarely repeats</li></ul><p>Switching takes a single command, and once you try it you can’t go back.</p><hr><h2 id="How-Simple-the-Install-and-Setup-Is"><a href="#How-Simple-the-Install-and-Setup-Is" class="headerlink" title="How Simple the Install and Setup Is"></a>How Simple the Install and Setup Is</h2><p><strong>Step 1: Install peon-ping</strong></p><p>Go to the official site, pick the theme packs you want, then one-click install with the command the site generates for you. For example:</p><pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash -s -- --packs=ccg_china_dozer,glados,honor_of_kings,mambo_pack,peasant,peon,sc2_stetmann_zh,sc_battlecruiser,sc_kerrigan,starrail-kafka-peon-pack</code></pre><p>or</p><pre><code class="language-bash">brew install PeonPing/tap/peon-ping &amp;&amp; peon-ping-setup --packs=ccg_china_dozer,glados,honor_of_kings,mambo_pack,peasant,peon,sc2_stetmann_zh,sc_battlecruiser,sc_kerrigan,starrail-kafka-peon-pack</code></pre><p><strong>Step 2: Configure Claude Code</strong></p><p>Set your preferences in <code>~/.claude/hooks/peon-ping/config.json</code>:</p><pre><code class="language-json">&#123;  &quot;default_pack&quot;: &quot;mambo_pack&quot;,  &quot;volume&quot;: 1.0,  &quot;enabled&quot;: true,  &quot;desktop_notifications&quot;: false,  &quot;categories&quot;: &#123;    &quot;session.start&quot;: true,    &quot;task.acknowledge&quot;: true,    &quot;task.complete&quot;: true,    &quot;task.error&quot;: true,    &quot;input.required&quot;: true,    &quot;resource.limit&quot;: true,    &quot;user.spam&quot;: true  &#125;  //...&#125;</code></pre><p><strong>Step 3: Launch Claude Code and just start playing</strong></p><p>There is no step 4. Ready to use the moment it’s installed, zero learning curve.</p><hr><h2 id="Turning-Programming-Into-an-Experience"><a href="#Turning-Programming-Into-an-Experience" class="headerlink" title="Turning Programming Into an Experience"></a>Turning Programming Into an Experience</h2><p>What peon-ping solves isn’t really an efficiency problem—it solves an <strong>experience problem</strong>.</p><p>When the terminal starts to “talk,” when you hear familiar game sound effects, when you no longer need to anxiously stare at the screen, the rhythm of programming changes. It feels more like a conversation, rather than you typing one-sidedly into a black hole.</p><p><strong>A tool isn’t just a tool—it can also be your game controller.</strong></p><hr><p><strong>Related resources:</strong></p><ul><li>Sound pack catalog: <a href="https://openpeon.com/packs">https://openpeon.com/packs</a></li><li>peon-ping official site: <a href="https://www.peonping.com/">https://www.peonping.com</a></li></ul>]]></content>
    
    
    <summary type="html">Honestly, writing code with Claude Code is already a blast, but there&#39;s one pain point that&#39;s been nagging me — I have to keep my eyes glued to the terminal at all times.</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="Claude Code" scheme="https://flashj.cn/tags/Claude-Code/"/>
    
    <category term="peon-ping" scheme="https://flashj.cn/tags/peon-ping/"/>
    
    <category term="Tools" scheme="https://flashj.cn/tags/Tools/"/>
    
  </entry>
  
  <entry>
    <title>OpenClaw Browser configuration guide</title>
    <link href="https://flashj.cn/openclaw-browser-config.html"/>
    <id>https://flashj.cn/openclaw-browser-config.html</id>
    <published>2026-04-07T15:00:00.000Z</published>
    <updated>2026-09-12T01:33:52.154Z</updated>
    
    <content type="html"><![CDATA[<h1 id="OpenClaw-Browser-Configuration-Guide"><a href="#OpenClaw-Browser-Configuration-Guide" class="headerlink" title="OpenClaw Browser Configuration Guide"></a>OpenClaw Browser Configuration Guide</h1><h2 id="Three-Types-of-Browser-Profile"><a href="#Three-Types-of-Browser-Profile" class="headerlink" title="Three Types of Browser Profile"></a>Three Types of Browser Profile</h2><table><thead><tr><th>Type</th><th>Description</th><th>Configuration</th></tr></thead><tbody><tr><td><strong>openclaw-managed</strong></td><td>Standalone Chromium instance with its own user data dir + CDP port</td><td><code>cdpPort: 18800</code>, etc.</td></tr><tr><td><strong>remote</strong></td><td>Connects to a remote CDP URL (Chromium running on another machine)</td><td><code>cdpUrl: &quot;http://192.168.65.254:9222&quot;</code></td></tr><tr><td><strong>existing-session</strong></td><td>Takes over the user’s existing Chrome profile via Chrome DevTools MCP auto-connect</td><td><code>driver: &quot;existing-session&quot;</code></td></tr></tbody></table><h3 id="openclaw-managed-example"><a href="#openclaw-managed-example" class="headerlink" title="openclaw-managed example"></a>openclaw-managed example</h3><pre><code class="language-json">&quot;profiles&quot;: &#123;  &quot;openclaw&quot;: &#123; &quot;cdpPort&quot;: 18800, &quot;color&quot;: &quot;#FF4500&quot; &#125;,  &quot;work&quot;: &#123; &quot;cdpPort&quot;: 18801, &quot;color&quot;: &quot;#0066CC&quot; &#125;&#125;</code></pre><p><code>openclaw</code> and <code>work</code> are both standalone, temporary, isolated profiles — <strong>you can launch Chrome directly, with no need to kill existing processes</strong>.</p><h3 id="remote-example"><a href="#remote-example" class="headerlink" title="remote example"></a>remote example</h3><pre><code class="language-json">&quot;profiles&quot;: &#123;  &quot;remote&quot;: &#123;    &quot;cdpUrl&quot;: &quot;http://192.168.65.254:9222&quot;,    &quot;color&quot;: &quot;#00AA00&quot;  &#125;&#125;</code></pre><p>Suited to machines like the Mac Studio that already have Chrome running.</p><h3 id="existing-session-example-user-profile"><a href="#existing-session-example-user-profile" class="headerlink" title="existing-session example (user profile)"></a>existing-session example (user profile)</h3><pre><code class="language-json">&quot;profiles&quot;: &#123;  &quot;user&quot;: &#123;    &quot;driver&quot;: &quot;existing-session&quot;,    &quot;attachOnly&quot;: true,    &quot;color&quot;: &quot;#00AA00&quot;  &#125;&#125;</code></pre><p>This means going over via MCP; the user has to enable agent control in Chrome DevTools MCP themselves.</p><h2 id="Global-Configuration-Parameters"><a href="#Global-Configuration-Parameters" class="headerlink" title="Global Configuration Parameters"></a>Global Configuration Parameters</h2><pre><code class="language-json">&quot;browser&quot;: &#123;  &quot;enabled&quot;: true,  &quot;ssrfPolicy&quot;: &#123;    &quot;dangerouslyAllowPrivateNetwork&quot;: true  &#125;,  &quot;remoteCdpTimeoutMs&quot;: 1500,  &quot;remoteCdpHandshakeTimeoutMs&quot;: 3000,  &quot;defaultProfile&quot;: &quot;openclaw&quot;,  &quot;color&quot;: &quot;#FF4500&quot;,  &quot;headless&quot;: false,  &quot;noSandbox&quot;: false,  &quot;attachOnly&quot;: false,  &quot;executablePath&quot;: &quot;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&quot;,  &quot;profiles&quot;: &#123; ... &#125;&#125;</code></pre><h2 id="Granting-an-Agent-Permission-to-Use-the-Browser-Tool"><a href="#Granting-an-Agent-Permission-to-Use-the-Browser-Tool" class="headerlink" title="Granting an Agent Permission to Use the Browser Tool"></a>Granting an Agent Permission to Use the Browser Tool</h2><p>By default a tool’s profile is <code>coding</code>, which does not include browser. You need to authorize it separately in the agents config using <code>alsoAllow</code>:</p><pre><code class="language-json">&quot;agents&quot;: &#123;  &quot;defaults&quot;: &#123;    &quot;workspace&quot;: &quot;/Users/rhett/.openclaw/workspace&quot;,    &quot;model&quot;: &#123; &quot;primary&quot;: &quot;minimax/MiniMax-M2.7&quot; &#125;  &#125;,  &quot;list&quot;: [    &#123;      &quot;id&quot;: &quot;main&quot;,      &quot;tools&quot;: &#123;        &quot;profile&quot;: &quot;full&quot;,        &quot;alsoAllow&quot;: [&quot;browser&quot;]      &#125;    &#125;  ]&#125;</code></pre><p><code>profile: &quot;full&quot;</code> together with <code>alsoAllow: [&quot;browser&quot;]</code> lets that agent call the browser tool.</p><h2 id="Tool-Configuration-Name-Reference"><a href="#Tool-Configuration-Name-Reference" class="headerlink" title="Tool Configuration Name Reference"></a>Tool Configuration Name Reference</h2><p>Each tool invocation is exposed by plugins.entries; the browser tool requires <code>plugins.entries.browser.enabled: true</code>.</p><h2 id="Full-Configuration-Example"><a href="#Full-Configuration-Example" class="headerlink" title="Full Configuration Example"></a>Full Configuration Example</h2><pre><code class="language-json">&#123;  &quot;agents&quot;: &#123;    &quot;defaults&quot;: &#123; ... &#125;,    &quot;list&quot;: [&#123; &quot;id&quot;: &quot;main&quot;, &quot;tools&quot;: &#123; &quot;profile&quot;: &quot;full&quot;, &quot;alsoAllow&quot;: [&quot;browser&quot;] &#125; &#125;]  &#125;,  &quot;browser&quot;: &#123;    &quot;enabled&quot;: true,    &quot;defaultProfile&quot;: &quot;openclaw&quot;,    &quot;executablePath&quot;: &quot;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&quot;,    &quot;profiles&quot;: &#123;      &quot;openclaw&quot;: &#123; &quot;cdpPort&quot;: 18800, &quot;color&quot;: &quot;#FF4500&quot; &#125;,      &quot;work&quot;: &#123; &quot;cdpPort&quot;: 18801, &quot;color&quot;: &quot;#0066CC&quot; &#125;,      &quot;user&quot;: &#123; &quot;driver&quot;: &quot;existing-session&quot;, &quot;attachOnly&quot;: true, &quot;color&quot;: &quot;#00AA00&quot; &#125;    &#125;  &#125;,  &quot;plugins&quot;: &#123;    &quot;entries&quot;: &#123;      &quot;browser&quot;: &#123; &quot;enabled&quot;: true &#125;    &#125;  &#125;&#125;</code></pre>]]></content>
    
    
    <summary type="html">OpenClaw Browser supports three modes: openclaw-managed (standalone instance), remote (remote CDP), existing-session (takes over the user&#39;s Chrome); grant the agent tool permissions via alsoAllow: [browser]</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="OpenClaw" scheme="https://flashj.cn/tags/OpenClaw/"/>
    
    <category term="Browser" scheme="https://flashj.cn/tags/Browser/"/>
    
    <category term="Configuration" scheme="https://flashj.cn/tags/Configuration/"/>
    
  </entry>
  
  <entry>
    <title>MSA (Memory Sparse Attention) — an open-source way to break through the AI memory bottleneck</title>
    <link href="https://flashj.cn/MSA-MemorySparseAttention.html"/>
    <id>https://flashj.cn/MSA-MemorySparseAttention.html</id>
    <published>2026-04-07T13:17:00.000Z</published>
    <updated>2026-09-12T00:57:40.070Z</updated>
    
    <content type="html"><![CDATA[<h1 id="MSA-Memory-Sparse-Attention-—-An-Open-Source-Answer-to-AI’s-Memory-Bottleneck"><a href="#MSA-Memory-Sparse-Attention-—-An-Open-Source-Answer-to-AI’s-Memory-Bottleneck" class="headerlink" title="MSA (Memory Sparse Attention) — An Open-Source Answer to AI’s Memory Bottleneck"></a>MSA (Memory Sparse Attention) — An Open-Source Answer to AI’s Memory Bottleneck</h1><h2 id="The-Core-Problem"><a href="#The-Core-Problem" class="headerlink" title="The Core Problem"></a>The Core Problem</h2><p>Where AI memory stands today:</p><ul><li>The strongest models have an effective context of roughly <strong>1M tokens</strong></li><li>The information a human can store in a lifetime is on the order of <strong>200–300 million tokens</strong></li><li>That’s a gap of <strong>two orders of magnitude</strong></li></ul><p>Both of the industry’s well-worn paths have hit a wall:</p><ol><li><strong>Stretching the context window</strong> — compute cost grows quadratically; that road ends here</li><li><strong>Bolting on RAG</strong> — retrieval and generation stay disconnected, and accuracy has a ceiling</li></ol><h2 id="What-MSA-Is"><a href="#What-MSA-Is" class="headerlink" title="What MSA Is"></a>What MSA Is</h2><p>MSA (Memory Sparse Attention) comes from the EverMind team (under Shanda). It <strong>embeds memory directly into the attention mechanism itself</strong> — no longer context, no external retrieval.</p><p><strong>In one sentence:</strong> traditional RAG gives a model an external hard drive; MSA gives it a native memory chip.</p><ul><li>Finding and using are no longer two separate steps — they’re fused into a single neural network and done end to end</li><li>The model learns on its own what to remember, how to find it, and how to use it</li><li>Plug and play: you only swap out the Self-Attention layer of a standard Transformer</li></ul><h2 id="Key-Technical-Details"><a href="#Key-Technical-Details" class="headerlink" title="Key Technical Details"></a>Key Technical Details</h2><ol><li><strong>Compression mechanism</strong>: brings 100 million tokens of storage down to an acceptable footprint</li><li><strong>Tiered storage</strong>: routing indexes on the GPU, content details on the CPU — total capacity depends on memory, not VRAM</li><li><strong>Sparse routing</strong>: complexity drops from O(L²) to O(L)</li><li><strong>Positional encoding</strong>: each document is numbered independently, so training at 64K extrapolates to 100M</li></ol><h2 id="Performance"><a href="#Performance" class="headerlink" title="Performance"></a>Performance</h2><p>Built on <strong>Qwen3-4B</strong>, with 159B tokens of continued pre-training:</p><table><thead><tr><th>Result</th><th>Data</th></tr></thead><tbody><tr><td>Memory span</td><td>from ~10K tokens → <strong>100 million tokens</strong> (nearly 4 orders of magnitude)</td></tr><tr><td>Quality degradation</td><td>answer quality drops only <strong>&lt;9%</strong></td></tr><tr><td>Standard QA benchmarks</td><td>a 4-billion-parameter model beats traditional RAG approaches by <strong>16%</strong></td></tr><tr><td>vs. top-tier retriever + 235-billion-parameter LLM</td><td><strong>still wins on multiple tests</strong>, with a 60× parameter gap</td></tr></tbody></table><h2 id="Hardware-Bar"><a href="#Hardware-Bar" class="headerlink" title="Hardware Bar"></a>Hardware Bar</h2><p>It runs directly on a machine with <strong>two A800 GPUs</strong> — no cluster needed. Small and mid-sized teams, even individual developers, can have long-term memory at the hundred-million-token scale.</p><h2 id="Team-Background"><a href="#Team-Background" class="headerlink" title="Team Background"></a>Team Background</h2><ul><li>EverMind (under Shanda)</li><li>Previously built <strong>Omne</strong>, the multi-agent framework that reached SOTA on the GAIA leaderboard, and <strong>EverOS</strong>, an open-source memory platform</li><li>More than nine months from project kickoff to completed paper</li></ul><p><strong>Key insight:</strong> a model needs different information when it’s “finding material” versus “writing the answer” — finding calls for macro-level judgment, writing calls for micro-level detail. Split them apart and handle each with a dedicated module, and performance changes qualitatively.</p><h2 id="Application-Prospects"><a href="#Application-Prospects" class="headerlink" title="Application Prospects"></a>Application Prospects</h2><ul><li><strong>Genuinely personalized AI assistants</strong>: remembering dietary preferences, project progress, family members’ personalities</li><li><strong>AI education</strong>: truly personalized, teaching to the individual</li><li><strong>Medical assistants</strong>: tracking a complete medical history</li><li><strong>Enterprise knowledge bases</strong>: remembering a decade of accumulated project knowledge</li><li><strong>Memory as a service</strong>: the memory layer as an independent, pluggable module, so memory assets aren’t locked to a single model</li></ul><h2 id="Related-Links"><a href="#Related-Links" class="headerlink" title="Related Links"></a>Related Links</h2><ul><li>MSA GitHub: <a href="https://github.com/EverMind-AI/MSA">https://github.com/EverMind-AI/MSA</a></li><li>EverOS GitHub: <a href="https://github.com/EverMind-AI/EverOS">https://github.com/EverMind-AI/EverOS</a></li></ul>]]></content>
    
    
    <summary type="html">Instead of bolting on retrieval, MSA embeds memory directly into the attention mechanism itself. That gives you end-to-end long-term memory and breaks past the accuracy ceiling of traditional RAG and the compute-cost bottleneck of the context window.</summary>
    
    
    
    <category term="AI" scheme="https://flashj.cn/categories/AI/"/>
    
    
    <category term="AI Memory" scheme="https://flashj.cn/tags/AI-Memory/"/>
    
    <category term="Transformer" scheme="https://flashj.cn/tags/Transformer/"/>
    
    <category term="Open Source" scheme="https://flashj.cn/tags/Open-Source/"/>
    
    <category term="MSA" scheme="https://flashj.cn/tags/MSA/"/>
    
    <category term="RAG" scheme="https://flashj.cn/tags/RAG/"/>
    
    <category term="Context Window" scheme="https://flashj.cn/tags/Context-Window/"/>
    
  </entry>
  
  <entry>
    <title>Playwright vs CDP: Comparing Browser Control Approaches</title>
    <link href="https://flashj.cn/Playwright-vs-CDP.html"/>
    <id>https://flashj.cn/Playwright-vs-CDP.html</id>
    <published>2026-04-07T13:17:00.000Z</published>
    <updated>2026-09-12T00:57:49.764Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Playwright-vs-CDP-A-Comparison-of-Browser-Control-Approaches"><a href="#Playwright-vs-CDP-A-Comparison-of-Browser-Control-Approaches" class="headerlink" title="Playwright vs CDP: A Comparison of Browser Control Approaches"></a>Playwright vs CDP: A Comparison of Browser Control Approaches</h1><h2 id="Question"><a href="#Question" class="headerlink" title="Question"></a>Question</h2><p>For OpenClaw, what’s the difference between controlling the browser via Playwright and via RDP (actually CDP) tools?</p><h2 id="Answer"><a href="#Answer" class="headerlink" title="Answer"></a>Answer</h2><h3 id="A-quick-clarification"><a href="#A-quick-clarification" class="headerlink" title="A quick clarification"></a>A quick clarification</h3><p>RDP (Remote Desktop Protocol) is Windows’ remote desktop protocol. In the context of browser control, what’s actually meant is <strong>CDP (Chrome DevTools Protocol)</strong> — the Chrome remote debugging protocol that communicates over port 9222 (the Remote Debugging Port).</p><h3 id="Core-differences"><a href="#Core-differences" class="headerlink" title="Core differences"></a>Core differences</h3><h4 id="1-Level-of-abstraction-and-control-granularity"><a href="#1-Level-of-abstraction-and-control-granularity" class="headerlink" title="1. Level of abstraction and control granularity"></a>1. Level of abstraction and control granularity</h4><table><thead><tr><th>Approach</th><th>How it works</th><th>Analogy</th></tr></thead><tbody><tr><td><strong>Playwright</strong> (high-level wrapper)</td><td>Sends commands like “click the Login button,” automatically locating elements, waiting, computing coordinates, and simulating the mouse</td><td>An autonomous driving system</td></tr><tr><td><strong>CDP</strong> (low-level protocol)</td><td>Sends raw JSON messages directly; you first fetch the DOM tree to find the node ID, then send Input.dispatchMouseEvent</td><td>Directly controlling the steering wheel and gas pedal</td></tr></tbody></table><h4 id="2-Impact-on-AI-“vision”-and-DOM-parsing-the-key-difference"><a href="#2-Impact-on-AI-“vision”-and-DOM-parsing-the-key-difference" class="headerlink" title="2. Impact on AI “vision” and DOM parsing (the key difference)"></a>2. Impact on AI “vision” and DOM parsing (the key difference)</h4><ul><li><strong>Playwright approach</strong>: Relies on injected JavaScript to traverse DOM elements and compute Bounding Boxes, easily blocked by complex CSS or Shadow DOM</li><li><strong>CDP approach</strong>: Directly calls Chrome’s underlying <strong>Accessibility Tree</strong>, precisely obtaining the coordinates and hierarchy of every interactive element, unaffected by front-end code</li></ul><blockquote><p>The most advanced Web Agents today (such as Claude Computer Use or MCP-based implementations) rely heavily on CDP to obtain spatial information about the page.</p></blockquote><h4 id="3-Browser-takeover-and-stealth-anti-scraping"><a href="#3-Browser-takeover-and-stealth-anti-scraping" class="headerlink" title="3. Browser takeover and stealth (anti-scraping)"></a>3. Browser takeover and stealth (anti-scraping)</h4><table><thead><tr><th>Approach</th><th>Characteristics</th></tr></thead><tbody><tr><td><strong>Playwright</strong></td><td>Launches a clean new browser instance by default, carries the webdriver flag, easily detected as a bot</td></tr><tr><td><strong>CDP connected directly to the host</strong></td><td>Connects to a real Chrome Profile via <code>host.docker.internal:9222</code>, carrying long-lived cookies and a normal fingerprint — extremely stealthy</td></tr></tbody></table><h4 id="4-Runtime-overhead-and-dependencies"><a href="#4-Runtime-overhead-and-dependencies" class="headerlink" title="4. Runtime overhead and dependencies"></a>4. Runtime overhead and dependencies</h4><table><thead><tr><th>Approach</th><th>Resource consumption</th></tr></thead><tbody><tr><td><strong>Playwright</strong></td><td>Requires installing the bulky Playwright dependency libraries and browser engine packages inside the container — large container size, high memory usage</td></tr><tr><td><strong>CDP</strong></td><td>Only needs a lightweight WebSocket client (such as chrome-devtools-mcp); all rendering computation happens on the host</td></tr></tbody></table><h2 id="Summary-comparison"><a href="#Summary-comparison" class="headerlink" title="Summary comparison"></a>Summary comparison</h2><table><thead><tr><th>Dimension</th><th>Playwright approach</th><th>CDP approach (DevTools MCP)</th></tr></thead><tbody><tr><td>How it works</td><td>High-level API, automatically handles waiting, finding, and clicking</td><td>Low-level WebSocket, raw JSON messages</td></tr><tr><td>Best suited for</td><td>Fixed automation scripts, silent background operation</td><td>AI taking over the current screen, complex precise coordinate-mapping tasks</td></tr><tr><td>Taking over an existing browser</td><td>Supported (connectOverCDP), not the default design</td><td>A perfect fit — designed for exactly this</td></tr><tr><td>Container resource consumption</td><td>High</td><td>Very low</td></tr><tr><td>Anti-scraping risk</td><td>Relatively high (unless Stealth is specifically configured)</td><td>Relatively low (borrows a real user’s fingerprint)</td></tr></tbody></table><h2 id="Conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h2><p>For the scenario where OpenClaw directly operates the host browser’s main Profile, <strong>connecting via the CDP (DevTools MCP) protocol to port 9222 is the optimal choice</strong>:</p><ul><li>Perfectly reuses existing cookies to skip login</li><li>The Accessibility Tree lets the AI understand web page structure more accurately</li><li>Extremely low resource usage, and the strongest stealth</li></ul><hr><blockquote><p>In essence: Playwright is a high-level, ready-made tool, while CDP is the browser’s low-level “machine language.”</p></blockquote>]]></content>
    
    
    <summary type="html">Playwright is a well-packaged high-level tool, while CDP is the browser&#39;s low-level &quot;machine language&quot;. For scenarios where OpenClaw directly drives the host machine&#39;s browser main Profile, connecting to port 9222 via the CDP (DevTools MCP) protocol is the best choice</summary>
    
    
    
    <category term="AI" scheme="https://flashj.cn/categories/AI/"/>
    
    
    <category term="OpenClaw" scheme="https://flashj.cn/tags/OpenClaw/"/>
    
    <category term="Browser Automation" scheme="https://flashj.cn/tags/Browser-Automation/"/>
    
    <category term="Playwright" scheme="https://flashj.cn/tags/Playwright/"/>
    
    <category term="CDP" scheme="https://flashj.cn/tags/CDP/"/>
    
    <category term="DevTools" scheme="https://flashj.cn/tags/DevTools/"/>
    
  </entry>
  
  <entry>
    <title>macOS Chrome Remote Debugging configuration</title>
    <link href="https://flashj.cn/chrome-devtools-mcp-remote-debugging.html"/>
    <id>https://flashj.cn/chrome-devtools-mcp-remote-debugging.html</id>
    <published>2026-04-07T13:17:00.000Z</published>
    <updated>2026-09-12T01:05:54.645Z</updated>
    
    <content type="html"><![CDATA[<h1 id="macOS-Chrome-Remote-Debugging-Configuration"><a href="#macOS-Chrome-Remote-Debugging-Configuration" class="headerlink" title="macOS Chrome Remote Debugging Configuration"></a>macOS Chrome Remote Debugging Configuration</h1><h2 id="Background"><a href="#Background" class="headerlink" title="Background"></a>Background</h2><p>Attempting to enable Chrome remote debugging from the command line on macOS fails:</p><pre><code class="language-bash">open -a &quot;Google Chrome&quot; --args --remote-debugging-port=9222 --no-first-run --no-default-browser-check</code></pre><p>The process exits immediately after the command runs, <code>lsof -i :9222</code> prints nothing, and nothing is listening on port 9222.</p><h2 id="The-Wrong-Approach"><a href="#The-Wrong-Approach" class="headerlink" title="The Wrong Approach"></a>The Wrong Approach</h2><p>❌ Relying on the <code>--remote-debugging-port</code> command-line flag</p><p>Chrome on macOS doesn’t honor these command-line flags for enabling remote debugging.</p><h2 id="The-Right-Approach"><a href="#The-Right-Approach" class="headerlink" title="The Right Approach"></a>The Right Approach</h2><p>✅ Turn it on manually from inside Chrome</p><ol><li>Open Chrome and go to <code>chrome://inspect/#remote-debugging</code></li><li>Check <strong>“Allow remote debugging for this browser instance”</strong></li><li>Chrome will then listen on port 9222, and the DevTools MCP connection will work normally</li></ol><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session?hl=zh-cn#step_2_configure_chrome_devtools_mcp_server_to_automatically_connect_to_a_running_chrome_instance">Chrome DevTools MCP official documentation</a></li></ul><h2 id="Key-Takeaway"><a href="#Key-Takeaway" class="headerlink" title="Key Takeaway"></a>Key Takeaway</h2><p>Chrome’s security model on macOS means remote debugging has to be explicitly authorized by the user from inside the app — command-line flags can’t get around this restriction.</p>]]></content>
    
    
    <summary type="html">On macOS, Chrome remote debugging must be enabled manually by ticking the checkbox at chrome://inspect/#remote-debugging, rather than relying on command-line flags</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="DevTools" scheme="https://flashj.cn/tags/DevTools/"/>
    
    <category term="Chrome" scheme="https://flashj.cn/tags/Chrome/"/>
    
    <category term="MCP" scheme="https://flashj.cn/tags/MCP/"/>
    
    <category term="macOS" scheme="https://flashj.cn/tags/macOS/"/>
    
    <category term="Debugging" scheme="https://flashj.cn/tags/Debugging/"/>
    
  </entry>
  
  <entry>
    <title>macOS Chrome Remote Debugging Port 9222 Startup Problem and the Final Solution</title>
    <link href="https://flashj.cn/chrome-remote-debugging-port-9222-macos-solution.html"/>
    <id>https://flashj.cn/chrome-remote-debugging-port-9222-macos-solution.html</id>
    <published>2026-04-07T13:17:00.000Z</published>
    <updated>2026-09-12T01:06:02.552Z</updated>
    
    <content type="html"><![CDATA[<h1 id="macOS-Chrome-Remote-Debugging-Port-9222-Startup-Issues-and-the-Final-Solution"><a href="#macOS-Chrome-Remote-Debugging-Port-9222-Startup-Issues-and-the-Final-Solution" class="headerlink" title="macOS Chrome Remote Debugging Port 9222 Startup Issues and the Final Solution"></a>macOS Chrome Remote Debugging Port 9222 Startup Issues and the Final Solution</h1><h2 id="Problem-Description"><a href="#Problem-Description" class="headerlink" title="Problem Description"></a>Problem Description</h2><p>When starting Chrome from the command line on macOS with the 9222 remote debugging port enabled, you run into the following problems:</p><ol><li><code>chrome://inspect/#remote-debugging</code> shows the status <strong>“Server running at: starting…”</strong> and never actually connects</li><li>The command line throws: <strong>“DevTools remote debugging requires a non-default data directory. Specify this using –user-data-dir.”</strong></li></ol><h2 id="Root-Cause-Analysis"><a href="#Root-Cause-Analysis" class="headerlink" title="Root Cause Analysis"></a>Root Cause Analysis</h2><h3 id="Cause-1-SingletonLock-file-deadlock"><a href="#Cause-1-SingletonLock-file-deadlock" class="headerlink" title="Cause 1: SingletonLock file deadlock"></a>Cause 1: SingletonLock file deadlock</h3><p>To prevent multiple instances from modifying the same user data directory at the same time, Chrome creates exclusive lock files in the profile directory:</p><table><thead><tr><th>File</th><th>Purpose</th></tr></thead><tbody><tr><td><code>SingletonLock</code></td><td>The main lock, indicating whether a process is currently using the directory</td></tr><tr><td><code>SingletonSocket</code></td><td>Socket communication lock</td></tr><tr><td><code>SingletonCookie</code></td><td>Cookie lock</td></tr></tbody></table><ul><li><strong>Clean exit</strong> (Cmd+Q or <code>kill</code>): Chrome cleans up these lock files itself</li><li><strong>Force quit</strong> (<code>kill -9</code> or <code>pkill -9</code>): the process is killed hard and has no chance to clean up → on the next launch it detects the leftover lock files, assumes another process is using the directory, and stalls the 9222 port</li></ul><h3 id="Cause-2-Chrome-security-restriction-newer-Chrome-versions"><a href="#Cause-2-Chrome-security-restriction-newer-Chrome-versions" class="headerlink" title="Cause 2: Chrome security restriction (newer Chrome versions)"></a>Cause 2: Chrome security restriction (newer Chrome versions)</h3><p><strong>Error message</strong>: <code>DevTools remote debugging requires a non-default data directory</code></p><p>For security reasons, newer Chrome versions (roughly 2024+) <strong>forbid enabling the 9222 remote debugging port on the default user directory (Default Profile)</strong>. Why?</p><ul><li>If it were allowed, any local script could take over the browser via the CDP protocol</li><li>It could silently read passwords, operate a MetaMask wallet, or grab login cookies</li></ul><h3 id="Cause-3-A-mix-of-the-above"><a href="#Cause-3-A-mix-of-the-above" class="headerlink" title="Cause 3: A mix of the above"></a>Cause 3: A mix of the above</h3><p>The user passed <code>--profile-directory=&quot;Default&quot;</code> but did not specify <code>--user-data-dir</code>, so Chrome tried to connect to the already-running default Chrome main process, and the port got stalled.</p><h2 id="Solutions"><a href="#Solutions" class="headerlink" title="Solutions"></a>Solutions</h2><h3 id="Option-A-Just-use-a-non-default-directory-simplest"><a href="#Option-A-Just-use-a-non-default-directory-simplest" class="headerlink" title="Option A: Just use a non-default directory (simplest)"></a>Option A: Just use a non-default directory (simplest)</h3><pre><code class="language-bash">/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \  --remote-debugging-port=9222 \  --remote-allow-origins=&quot;*&quot; \  --user-data-dir=&quot;$HOME/chrome_dev_data&quot; \  --no-first-run</code></pre><h3 id="Option-B-Clone-the-default-profile-one-click-launch-script-recommended"><a href="#Option-B-Clone-the-default-profile-one-click-launch-script-recommended" class="headerlink" title="Option B: Clone the default profile (one-click launch script, recommended)"></a>Option B: Clone the default profile (one-click launch script, recommended)</h3><p>If you need to keep your login state, extensions, and so on, use rsync to incrementally sync the default configuration into a dedicated debugging directory.</p><h4 id="Step-1-Create-the-Bash-script-debug-chrome-sh"><a href="#Step-1-Create-the-Bash-script-debug-chrome-sh" class="headerlink" title="Step 1: Create the Bash script debug_chrome.sh"></a>Step 1: Create the Bash script <code>debug_chrome.sh</code></h4><pre><code class="language-bash">#!/bin/bashSOURCE_DIR=&quot;$HOME/Library/Application Support/Google/Chrome/Default&quot;TARGET_DIR=&quot;$HOME/chrome_debug_profile&quot;echo &quot;正在优雅退出 Google Chrome...&quot;# 使用 AppleScript 优雅退出，自动清理 SingletonLockosascript -e &#39;quit app &quot;Google Chrome&quot;&#39;# 等待进程完全清理while pgrep -x &quot;Google Chrome&quot; &gt; /dev/null; do  sleep 1doneecho &quot;正在同步配置到调试目录...&quot;# rsync 增量同步，排除无用缓存，首次慢后续秒级完成rsync -a --delete \  --exclude &#39;Cache&#39; \  --exclude &#39;Code Cache&#39; \  --exclude &#39;DawnCache&#39; \  --exclude &#39;GPUCache&#39; \  --exclude &#39;Singleton*&#39; \  &quot;$SOURCE_DIR/&quot; &quot;$TARGET_DIR/&quot;echo &quot;正在启动 Chrome 调试模式...&quot;# 后台静默启动nohup /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \  --remote-debugging-port=9222 \  --remote-allow-origins=&quot;*&quot; \  --user-data-dir=&quot;$TARGET_DIR&quot; \  --no-first-run &gt; /dev/null 2&gt;&amp;1 &amp;echo &quot;✅ 启动成功！可以连接 9222 端口了。&quot;</code></pre><h4 id="Step-2-Wrap-it-as-a-one-click-Mac-launch-app-Automator"><a href="#Step-2-Wrap-it-as-a-one-click-Mac-launch-app-Automator" class="headerlink" title="Step 2: Wrap it as a one-click Mac launch app (Automator)"></a>Step 2: Wrap it as a one-click Mac launch app (Automator)</h4><ol><li>Open “Automator” → create a new “Application”</li><li>Search for “Run Shell Script” and drag it into the workspace on the right</li><li>Paste in the Bash script above</li><li><code>Command + S</code> to save it as <code>Chrome Debug.app</code>, and put it in your “Applications” folder</li><li>From then on, just double-click <code>Chrome Debug.app</code> to launch everything with one click</li></ol><h4 id="Why-this-script-is-better"><a href="#Why-this-script-is-better" class="headerlink" title="Why this script is better"></a>Why this script is better</h4><ul><li><strong>Graceful exit via AppleScript</strong> → avoids leaving ghost lock files</li><li><strong>Incremental rsync sync</strong> → after the first sync, each run takes seconds, and the bloated cache folders are excluded</li><li><strong>Isolated environment</strong> → messing around in your debugging environment won’t pollute your everyday browsing history</li><li><strong>One-click launch</strong> → wrapped as an app via Automator, so you can keep it in the Dock or trigger it with a shortcut</li></ul><h2 id="Diagnostic-Commands"><a href="#Diagnostic-Commands" class="headerlink" title="Diagnostic Commands"></a>Diagnostic Commands</h2><pre><code class="language-bash"># 检查 9222 端口是否被监听lsof -i tcp:9222# 检查是否有残留 Chrome Helper 进程ps aux | grep -i &quot;Google Chrome&quot;# 手动清理锁文件（如果 AppleScript 无法自动清理）rm -f ~/Library/Application\ Support/Google/Chrome/SingletonLockrm -f ~/Library/Application\ Support/Google/Chrome/SingletonSocketrm -f ~/Library/Application\ Support/Google/Chrome/SingletonCookie</code></pre><h2 id="Key-Lessons"><a href="#Key-Lessons" class="headerlink" title="Key Lessons"></a>Key Lessons</h2><table><thead><tr><th>Action</th><th>Result</th></tr></thead><tbody><tr><td><code>kill -9</code> &#x2F; <code>pkill -9</code></td><td>❌ Process killed hard, lock files left behind → starting…</td></tr><tr><td><code>kill</code> &#x2F; <code>pkill -15</code></td><td>✅ Clean exit, lock files cleaned up automatically</td></tr><tr><td>AppleScript <code>quit app</code></td><td>✅ The most graceful way to exit</td></tr><tr><td><code>--user-data-dir</code> not specified + <code>--profile-directory=&quot;Default&quot;</code></td><td>❌ Chrome’s security restriction refuses debugging</td></tr><tr><td>Using a separate <code>--user-data-dir</code></td><td>✅ Bypasses the security restriction</td></tr></tbody></table><hr><blockquote><p><strong>Bottom line</strong>: Newer Chrome versions require <code>--user-data-dir</code> to point to a non-default directory. Combining a graceful exit + incremental rsync sync + Automator one-click wrapping is the most elegant way to launch Chrome CDP debugging on macOS.</p></blockquote>]]></content>
    
    
    <summary type="html">Solving the macOS Chrome Remote Debugging Port 9222 Problem: SingletonLock Deadlock, Chrome Security Restrictions, rsync Sync + Automator One-Click Launch Solution</summary>
    
    
    
    <category term="Tools" scheme="https://flashj.cn/categories/Tools/"/>
    
    
    <category term="OpenClaw" scheme="https://flashj.cn/tags/OpenClaw/"/>
    
    <category term="CDP" scheme="https://flashj.cn/tags/CDP/"/>
    
    <category term="Chrome" scheme="https://flashj.cn/tags/Chrome/"/>
    
    <category term="macOS" scheme="https://flashj.cn/tags/macOS/"/>
    
    <category term="Remote Debugging" scheme="https://flashj.cn/tags/Remote-Debugging/"/>
    
    <category term="Error Notes" scheme="https://flashj.cn/tags/Error-Notes/"/>
    
  </entry>
  
</feed>
