<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Decisions on better-edit-tools 文档</title><link>https://conglinyizhi.github.io/better-edit-tools-mcp/decisions/</link><description>Recent content in Decisions on better-edit-tools 文档</description><generator>Hugo</generator><language>zh</language><atom:link href="https://conglinyizhi.github.io/better-edit-tools-mcp/decisions/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://conglinyizhi.github.io/better-edit-tools-mcp/decisions/chip-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://conglinyizhi.github.io/better-edit-tools-mcp/decisions/chip-design/</guid><description>&lt;h1 id="chip-机制设计决策"&gt;Chip 机制设计决策&lt;a class="anchor" href="#chip-%e6%9c%ba%e5%88%b6%e8%ae%be%e8%ae%a1%e5%86%b3%e7%ad%96"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="1-设计动机"&gt;1. 设计动机&lt;a class="anchor" href="#1-%e8%ae%be%e8%ae%a1%e5%8a%a8%e6%9c%ba"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 MCP（Model Context Protocol）调用链路中，LLM 生成的工具参数常常因为 JSON 转义、字段缺失、格式错乱等原因导致调用失败。一旦失败，原始的参数内容可能只出现在一次性的错误响应里，后续轮次中模型很难精确复现完全相同的内容，尤其是大段代码写入（&lt;code&gt;be-write&lt;/code&gt;）或多行替换时。&lt;/p&gt;
&lt;p&gt;Chip 机制的核心目标是把“失败现场”或“被删除的内容”临时保存下来，作为模型后续恢复操作的可靠数据来源。它相当于在进程内维护了一个轻量级的 FIFO 缓存队列，让 LLM 可以通过专用工具 &lt;code&gt;be-insert-chip&lt;/code&gt; 把之前丢失或删除的内容重新插入到目标文件中，从而降低因一次调用失败而导致整轮任务中断的概率。&lt;/p&gt;
&lt;h2 id="2-何时会创建-chip"&gt;2. 何时会创建 chip&lt;a class="anchor" href="#2-%e4%bd%95%e6%97%b6%e4%bc%9a%e5%88%9b%e5%bb%ba-chip"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当前有两种场景会触发 chip 记录：&lt;/p&gt;
&lt;h3 id="21-工具调用失败时自动保存参数"&gt;2.1 工具调用失败时自动保存参数&lt;a class="anchor" href="#21-%e5%b7%a5%e5%85%b7%e8%b0%83%e7%94%a8%e5%a4%b1%e8%b4%a5%e6%97%b6%e8%87%aa%e5%8a%a8%e4%bf%9d%e5%ad%98%e5%8f%82%e6%95%b0"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当某个工具调用返回错误，且入参序列化后的 JSON 长度大于 50 字节时，服务端会调用 &lt;code&gt;SaveChip(tool, args, errMsg)&lt;/code&gt; 把原始参数保存为 chip。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SaveChip&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tool&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;args&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;any&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;errMsg&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;参数 JSON 长度 ≤ 50 字节时不保存，避免记录过多无意义的短参数。&lt;/li&gt;
&lt;li&gt;保存成功后返回 chip ID（如 &lt;code&gt;a3f7b2&lt;/code&gt;）；不需要恢复时返回空字符串。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-删除操作时保存被删除内容"&gt;2.2 删除操作时保存被删除内容&lt;a class="anchor" href="#22-%e5%88%a0%e9%99%a4%e6%93%8d%e4%bd%9c%e6%97%b6%e4%bf%9d%e5%ad%98%e8%a2%ab%e5%88%a0%e9%99%a4%e5%86%85%e5%ae%b9"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;be-delete&lt;/code&gt; 在真正落盘前，会把被删除的非空内容通过 &lt;code&gt;SaveContentChip&lt;/code&gt; 保存为 chip，并在返回的 &lt;code&gt;warnings&lt;/code&gt; 中提示模型：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;deletedContent&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strings&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Join&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fileLines&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;end&lt;/span&gt;], &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;deletedContent&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;chipID&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;chipWarn&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SaveContentChip&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;be-delete&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;deletedContent&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;warnings&lt;/span&gt; = append(&lt;span style="color:#a6e22e"&gt;warnings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Sprintf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;deleted content saved as chip://%s&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;chipID&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这让误删后可以通过 &lt;code&gt;be-insert-chip&lt;/code&gt; 把内容重新插回文件。&lt;/p&gt;</description></item></channel></rss>