<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kimi-Code on Svtter's Blog</title><link>https://svtter.cn/tags/kimi-code/</link><description>Recent content in Kimi-Code on Svtter's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 27 May 2026 10:30:00 +0800</lastBuildDate><atom:link href="https://svtter.cn/tags/kimi-code/index.xml" rel="self" type="application/rss+xml"/><item><title>Kimi Code 对 kimi-k2.6 的专用处理：与 OpenCode 的对比</title><link>https://svtter.cn/p/kimi-code-%E5%AF%B9-kimi-k2.6-%E7%9A%84%E4%B8%93%E7%94%A8%E5%A4%84%E7%90%86%E4%B8%8E-opencode-%E7%9A%84%E5%AF%B9%E6%AF%94/</link><pubDate>Wed, 27 May 2026 10:30:00 +0800</pubDate><guid>https://svtter.cn/p/kimi-code-%E5%AF%B9-kimi-k2.6-%E7%9A%84%E4%B8%93%E7%94%A8%E5%A4%84%E7%90%86%E4%B8%8E-opencode-%E7%9A%84%E5%AF%B9%E6%AF%94/</guid><description>&lt;img src="https://svtter.cn/p/kimi-code-%E5%AF%B9-kimi-k2.6-%E7%9A%84%E4%B8%93%E7%94%A8%E5%A4%84%E7%90%86%E4%B8%8E-opencode-%E7%9A%84%E5%AF%B9%E6%AF%94/featured-image.png" alt="Featured image of post Kimi Code 对 kimi-k2.6 的专用处理：与 OpenCode 的对比" /&gt;&lt;p&gt;最近 kimi code 从 python 迁移到了 ts 版本。于是做了个简单的分析。&lt;/p&gt;
&lt;p&gt;根据对 &lt;strong&gt;kimi-code&lt;/strong&gt; 源代码（特别是 &lt;code&gt;packages/kosong/src/providers/kimi.ts&lt;/code&gt;、&lt;code&gt;kimi-schema.ts&lt;/code&gt;、&lt;code&gt;kimi-files.ts&lt;/code&gt; 等）以及 &lt;strong&gt;OpenCode&lt;/strong&gt; 相关兼容性 Issue 的分析，以下是 kimi-code 针对 kimi-k2.6（及 Kimi 系列模型）做的专用处理，以及相对于 OpenCode 的关键差异。&lt;/p&gt;
&lt;h2 id="1-原生-kimi-provider非通用-openai-兼容层"&gt;1. 原生 Kimi Provider（非通用 OpenAI 兼容层）
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;kimi-code&lt;/strong&gt; 没有直接把 Kimi 当&amp;quot;又一个 OpenAI 兼容接口&amp;quot;处理，而是实现了专门的 &lt;code&gt;kimi&lt;/code&gt; provider 类型：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;kimi-code&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Provider 类型&lt;/td&gt;
&lt;td&gt;专门的 &lt;code&gt;'kimi'&lt;/code&gt; 类型，独立适配&lt;/td&gt;
&lt;td&gt;通过 OpenAI/Anthropic 通用 bridge 访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;专有字段&lt;/td&gt;
&lt;td&gt;原生处理 &lt;code&gt;reasoning_content&lt;/code&gt;、&lt;code&gt;thinking&lt;/code&gt;、&lt;code&gt;generationKwargs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bridge 层常丢失 &lt;code&gt;reasoning_content&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;认证头&lt;/td&gt;
&lt;td&gt;支持 &lt;code&gt;kimiRequestHeaders&lt;/code&gt; 和 &lt;code&gt;X-Msh-Tool-Call-Id&lt;/code&gt; 等 Moonshot 专有 header&lt;/td&gt;
&lt;td&gt;通用 header 转发&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="2-reasoning_content-的全生命周期处理"&gt;2. &lt;code&gt;reasoning_content&lt;/code&gt; 的全生命周期处理
&lt;/h2&gt;&lt;p&gt;kimi-k2.6 默认开启 thinking，且&lt;strong&gt;要求多轮对话历史中保留 &lt;code&gt;reasoning_content&lt;/code&gt;&lt;/strong&gt;，否则工具调用后会报 400 错误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;kimi-code 的处理：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;convertMessage&lt;/code&gt;&lt;/strong&gt;：将内部 &lt;code&gt;think&lt;/code&gt; 类型的 content part 提取并序列化为 &lt;code&gt;reasoning_content&lt;/code&gt; 字段，确保历史消息中 thinking 内容不丢失&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流式解析&lt;/strong&gt;：在 &lt;code&gt;_convertStreamResponse&lt;/code&gt; 和 &lt;code&gt;_convertNonStreamResponse&lt;/code&gt; 中都专门提取 &lt;code&gt;delta.reasoning_content&lt;/code&gt; / &lt;code&gt;message.reasoning_content&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TUI 渲染&lt;/strong&gt;：有专门的 &lt;code&gt;ThinkingComponent&lt;/code&gt; 组件实时显示 thinking 内容，支持展开/收起和 spinner 动画&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;OpenCode 的问题：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OpenCode Go 的 bridge 在第二轮对话时&lt;strong&gt;丢失 &lt;code&gt;reasoning_content&lt;/code&gt;&lt;/strong&gt;，导致 Moonshot API 返回：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;thinking&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;reasoning_content&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;assistant&lt;/span&gt; &lt;span class="k"&gt;tool&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-json-schema-专用规范化kimi-schemats"&gt;3. JSON Schema 专用规范化（&lt;code&gt;kimi-schema.ts&lt;/code&gt;）
&lt;/h2&gt;&lt;p&gt;Moonshot 的工具参数验证器对 JSON Schema 有严格且特殊的要求，这是 OpenCode 与 kimi-k2.6 不兼容的主要来源之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;kimi-code 的 &lt;code&gt;normalizeKimiToolSchema&lt;/code&gt; 做了：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解引用 &lt;code&gt;$ref&lt;/code&gt;&lt;/strong&gt;：将 &lt;code&gt;$defs&lt;/code&gt; / &lt;code&gt;definitions&lt;/code&gt; 中的定义内联展开，消除外部引用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补全缺失的 &lt;code&gt;type&lt;/code&gt;&lt;/strong&gt;：Kimi 验证器会拒绝省略 &lt;code&gt;type&lt;/code&gt; 的嵌套属性（比如 MCP 产生的 enum-only schema），kimi-code 会推断并补全 &lt;code&gt;type: string/object/array&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环引用检测&lt;/strong&gt;：遇到循环引用时保留原始 &lt;code&gt;$ref&lt;/code&gt;，避免无限递归&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;OpenCode 的问题：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;生成 schema 使用 &lt;code&gt;#/definitions/&lt;/code&gt; 而非 Moonshot 要求的 &lt;code&gt;#/$defs/&lt;/code&gt;，且没有为 Kimi 做 schema 类型推断和补全，导致复杂工具调用直接 400。&lt;/p&gt;
&lt;h2 id="4-thinking-模式的原生配置体系"&gt;4. Thinking 模式的原生配置体系
&lt;/h2&gt;&lt;p&gt;kimi-code 从配置层到 UI 层都内置了对 Kimi thinking 模式的支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置解析&lt;/strong&gt;：&lt;code&gt;ThinkingConfigSchema&lt;/code&gt; 支持 &lt;code&gt;mode: auto/on/off&lt;/code&gt; 和 &lt;code&gt;effort: low/medium/high/xhigh/max&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型能力标注&lt;/strong&gt;：&lt;code&gt;ModelAlias&lt;/code&gt; 支持 &lt;code&gt;capabilities: ['thinking', 'always_thinking']&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型选择器 UI&lt;/strong&gt;：按 &lt;code&gt;←→&lt;/code&gt; 键可切换 thinking on/off，&lt;code&gt;always-on&lt;/code&gt; 模型不可关闭&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Provider 方法&lt;/strong&gt;：&lt;code&gt;withThinking(effort)&lt;/code&gt; 会正确生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reasoning_effort&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;high&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extra_body&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;thinking&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;token 预算&lt;/strong&gt;：自动将 legacy &lt;code&gt;max_tokens&lt;/code&gt; 规范化为 Kimi 偏好的 &lt;code&gt;max_completion_tokens&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;OpenCode 的问题：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过 Anthropic bridge 时硬编码发送 &lt;code&gt;thinking&lt;/code&gt; content blocks，但 Kimi API 只支持 &lt;code&gt;text/image_url/video_url/video&lt;/code&gt;，导致：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Invalid value: thinking. Supported values are: &amp;#39;text&amp;#39;,&amp;#39;image_url&amp;#39;,&amp;#39;video_url&amp;#39; and &amp;#39;video&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="5-moonshot-原生服务集成"&gt;5. Moonshot 原生服务集成
&lt;/h2&gt;&lt;p&gt;kimi-code 内置了 Moonshot 专属服务，而非使用通用本地实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;MoonshotFetchURLProvider&lt;/code&gt;&lt;/strong&gt;：优先调用 Moonshot 的 &lt;code&gt;coding-fetch&lt;/code&gt; 服务（已做页面文本提取），失败才 fallback 到本地&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;MoonshotWebSearchProvider&lt;/code&gt;&lt;/strong&gt;：直接调用 Moonshot 搜索 API，支持 &lt;code&gt;enable_page_crawling&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;KimiFiles&lt;/code&gt;&lt;/strong&gt;：视频上传到 Moonshot 文件服务，生成 &lt;code&gt;ms://&amp;lt;file-id&amp;gt;&lt;/code&gt; 格式的 &lt;code&gt;video_url&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-工具调用层细节"&gt;6. 工具调用层细节
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内置函数&lt;/strong&gt;：以 &lt;code&gt;$&lt;/code&gt; 开头的工具名会被识别为 Kimi builtin function，序列化为 &lt;code&gt;type: 'builtin_function'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage 提取&lt;/strong&gt;：支持 Moonshot 特有的 &lt;code&gt;choices[0].usage&lt;/code&gt; 位置，以及 &lt;code&gt;cached_tokens&lt;/code&gt; 等字段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finish Reason 映射&lt;/strong&gt;：将 OpenAI 格式的 &lt;code&gt;stop&lt;/code&gt;/&lt;code&gt;tool_calls&lt;/code&gt;/&lt;code&gt;length&lt;/code&gt; 等映射到内部统一枚举&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="7-cli-核心与-llm-sdk-的架构隔离"&gt;7. CLI 核心与 LLM SDK 的架构隔离
&lt;/h2&gt;&lt;p&gt;这是一个容易被忽视但很重要的架构差异。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;kimi-code 的核心 CLI（&lt;code&gt;apps/kimi-code&lt;/code&gt;）本身不直接依赖任何 OpenAI 或 Anthropic 的 TypeScript SDK。&lt;/strong&gt; 查看其 &lt;code&gt;package.json&lt;/code&gt;，核心依赖只有 TUI 渲染（&lt;code&gt;pi-tui&lt;/code&gt;）、命令行解析（&lt;code&gt;commander&lt;/code&gt;）、语法高亮（&lt;code&gt;cli-highlight&lt;/code&gt;）等通用库。所有与 LLM provider 的交互都被隔离在自研的 &lt;code&gt;kosong&lt;/code&gt; 包中。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;packages/kosong&lt;/code&gt; 虽然内部使用了 &lt;code&gt;openai&lt;/code&gt; 和 &lt;code&gt;@anthropic-ai/sdk&lt;/code&gt; 作为实现细节（因为 Kimi API 是 OpenAI-compatible 的），但对外提供的是统一的 LLM 抽象接口。CLI 核心只依赖 &lt;code&gt;kosong&lt;/code&gt;，不感知底层 vendor SDK。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenCode 则不同。&lt;/strong&gt; 其 &lt;code&gt;packages/opencode&lt;/code&gt; 核心包直接依赖了大量 vendor SDK：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@ai-sdk/openai&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ai-sdk/anthropic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ai-sdk/google&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ai-sdk/azure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@openrouter/ai-sdk-provider&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;……（共计十余个 provider-specific 包）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着 OpenCode 的核心代码与各个 vendor 的 SDK 深度耦合，而 kimi-code 的核心 CLI 保持干净，模型交互完全通过自研抽象层隔离。&lt;/p&gt;
&lt;h2 id="8-commit-历史揭示的演进路径"&gt;8. Commit 历史揭示的演进路径
&lt;/h2&gt;&lt;p&gt;以上的代码结构差异只是静态结果。更有意思的是看两边的 commit 历史——&lt;strong&gt;动态演进方向完全不同&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="kimi-code原生设计持续消除配置负担"&gt;kimi-code：原生设计，持续消除配置负担
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;842e699&lt;/code&gt; — &amp;ldquo;Kimi For Coding&amp;rdquo;（初始提交）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是整个项目的起点。初始代码就包含了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;packages/kosong/src/providers/kimi.ts&lt;/code&gt;：专用 Kimi provider&lt;/li&gt;
&lt;li&gt;&lt;code&gt;packages/kosong/src/providers/kimi-schema.ts&lt;/code&gt;：专用 JSON Schema 规范化器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;packages/kosong/src/providers/kimi-files.ts&lt;/code&gt;：专用文件上传服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;结论：kimi-code 从一开始就把 Kimi API 当作一等公民设计，不是后期打补丁适配。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;d95b013&lt;/code&gt; fix(catalog): preserve reasoning fields in custom model (&lt;a class="link" href="https://github.com/MoonshotAI/kimi-code/pull/70" target="_blank" rel="noopener"
&gt;#70&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个 commit 修复了一个很隐蔽的问题。models.dev 用 &lt;code&gt;interleaved&lt;/code&gt; 字段标记 reasoning 支持，但早期代码把 &lt;code&gt;interleaved=true&lt;/code&gt; 当作 undefined 处理，导致通过 &lt;code&gt;/connect&lt;/code&gt; 选择的模型静默丢失 reasoning 能力。&lt;/p&gt;
&lt;p&gt;修复内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;interleaved=true&lt;/code&gt; 映射为默认的 &lt;code&gt;reasoning_content&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update-catalog.mjs&lt;/code&gt; 的 allowlist 加入 &lt;code&gt;interleaved&lt;/code&gt;，否则 release build 的离线 catalog 会再次丢失该字段&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;61f7d0e&lt;/code&gt; fix(kosong): make openai-compatible thinking work without reasoning_key (&lt;a class="link" href="https://github.com/MoonshotAI/kimi-code/pull/78" target="_blank" rel="noopener"
&gt;#78&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这是 reasoning 处理的核心 commit&lt;/strong&gt;，展示了 kimi-code 对兼容性的深层思考。diff 显示了三层关键设计：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inbound 自动扫描&lt;/strong&gt;（响应解析）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;KNOWN_REASONING_KEYS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;reasoning_content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reasoning_details&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reasoning&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 自动扫描三个字段，第一个字符串值获胜
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Outbound 默认回写&lt;/strong&gt;（请求序列化）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DEFAULT_OUTBOUND_REASONING_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;KNOWN_REASONING_KEYS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#39;reasoning_content&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 默认以 reasoning_content 回传，无需用户配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自动注入 &lt;code&gt;reasoning_effort&lt;/code&gt;&lt;/strong&gt;（历史连续性）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 当历史中有 ThinkPart 但 caller 未显式设置 reasoning_effort 时，
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 自动注入 &amp;#39;medium&amp;#39;，避免 One API / DeepSeek 等严格网关返回 400
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;边界情况也处理得很细：blank &lt;code&gt;reasoning_key&lt;/code&gt;（&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;）被 normalize 为 &lt;code&gt;undefined&lt;/code&gt;；caller 通过 &lt;code&gt;withGenerationKwargs&lt;/code&gt; 显式设置的值&lt;strong&gt;不会被自动注入覆盖&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;验证目标明确写的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Manually verified end-to-end against the real DeepSeek API with a hand-written config.toml that does not set reasoning_key: thinking content renders, no 400, multi-turn conversations work.&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="opencode通用层设计openai-centric"&gt;OpenCode：通用层设计，OpenAI-centric
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;eb84f46&lt;/code&gt; fix(llm): split OpenAI reasoning summary blocks (#29000)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个 commit 展示了 OpenCode 处理 reasoning 的完全不同思路——围绕 &lt;strong&gt;OpenAI Responses API&lt;/strong&gt; 设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;维护 &lt;code&gt;encrypted_content&lt;/code&gt; 和 &lt;code&gt;item_reference&lt;/code&gt; 的状态机&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;item_id&lt;/code&gt; + &lt;code&gt;summary_index&lt;/code&gt; 折叠多个 summary parts&lt;/li&gt;
&lt;li&gt;&lt;code&gt;store:false&lt;/code&gt; 时过滤缺少 &lt;code&gt;encrypted_content&lt;/code&gt; 的 reasoning items&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这与 Kimi 的 &lt;code&gt;reasoning_content&lt;/code&gt; 机制完全不同。&lt;/strong&gt; Kimi 不需要 &lt;code&gt;encrypted_content&lt;/code&gt; 或 &lt;code&gt;item_reference&lt;/code&gt;，而是直接在 message 上附加 &lt;code&gt;reasoning_content&lt;/code&gt; 字段。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="一个残酷的事实"&gt;一个残酷的事实
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/anomalyco/opencode/issues/26331" target="_blank" rel="noopener"
&gt;OpenCode Issue #26331&lt;/a&gt;&lt;/strong&gt; &amp;ldquo;Bug: OpenCode Go bridge layer incompatible with kimi-k2.6 tool calls&amp;rdquo; — &lt;strong&gt;状态：至今仍是 open&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/anomalyco/opencode/issues/27054" target="_blank" rel="noopener"
&gt;OpenCode Issue #27054&lt;/a&gt;&lt;/strong&gt; &amp;ldquo;KIMI K2.6 showing error in Opencode GO&amp;rdquo; — &lt;strong&gt;状态：closed，但关闭方式是禁用 MCP（workaround）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;#27054 的最后一个 comment：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The workaround is to disable your MCP and then initiate the session&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这不是修复，这是回避问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="commit-历史对比总结"&gt;Commit 历史对比总结
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;kimi-code&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;初始设计&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;初始提交即包含完整 Kimi provider + schema 规范化 + 文件服务&lt;/td&gt;
&lt;td&gt;通用多模型架构，后期通过 bridge 适配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;reasoning 机制&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;围绕 &lt;code&gt;reasoning_content&lt;/code&gt; 字段设计，自动扫描/回写/注入 effort&lt;/td&gt;
&lt;td&gt;围绕 OpenAI Responses 的 &lt;code&gt;encrypted_content&lt;/code&gt; + &lt;code&gt;item_reference&lt;/code&gt; 设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;schema 处理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;专用 &lt;code&gt;normalizeKimiToolSchema&lt;/code&gt;，解引用 &lt;code&gt;$ref&lt;/code&gt; + 补全 &lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通用 schema 验证，友好错误提示为主&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;配置哲学&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;让 OpenAI-compatible 网关&amp;quot;零配置工作&amp;quot;，自动推断所有字段&lt;/td&gt;
&lt;td&gt;依赖用户通过 bridge/config 手动适配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;issue 状态&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;持续发布 reasoning 相关 patch（&lt;a class="link" href="https://github.com/MoonshotAI/kimi-code/pull/70" target="_blank" rel="noopener"
&gt;#70&lt;/a&gt;, &lt;a class="link" href="https://github.com/MoonshotAI/kimi-code/pull/78" target="_blank" rel="noopener"
&gt;#78&lt;/a&gt;）&lt;/td&gt;
&lt;td&gt;kimi-k2.6 兼容性问题 &lt;a class="link" href="https://github.com/anomalyco/opencode/issues/26331" target="_blank" rel="noopener"
&gt;#26331&lt;/a&gt; 至今 open&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="总结核心差异"&gt;总结：核心差异
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;kimi-code&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;架构定位&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;原生为 Kimi/Moonshot 设计，专用 provider&lt;/td&gt;
&lt;td&gt;通用多模型代理，通过 bridge 适配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Thinking/Reasoning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;原生支持，全链路保留 &lt;code&gt;reasoning_content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bridge 层易丢失，导致 400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JSON Schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;专用 &lt;code&gt;normalizeKimiToolSchema&lt;/code&gt; 做解引用和类型补全&lt;/td&gt;
&lt;td&gt;通用 schema 生成，不符合 Kimi 验证器要求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API 格式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;直接生成 Moonshot 原生格式（含 &lt;code&gt;thinking&lt;/code&gt; 配置、&lt;code&gt;$defs&lt;/code&gt; 规范等）&lt;/td&gt;
&lt;td&gt;经 OpenAI/Anthropic 协议转换，产生格式不匹配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;服务集成&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;内置 Moonshot fetch/search/file 服务&lt;/td&gt;
&lt;td&gt;使用通用本地工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;核心依赖&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI 核心不直接依赖 vendor SDK，通过自研 kosong 包隔离&lt;/td&gt;
&lt;td&gt;核心包直接耦合 &lt;code&gt;@ai-sdk/openai&lt;/code&gt; 等十余个 vendor SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;从 commit 历史看，kimi-code 的演进方向是&lt;strong&gt;持续消除用户配置负担&lt;/strong&gt;（&lt;code&gt;reasoning_key&lt;/code&gt; 从必填 → 可选覆盖 → 自动推断；&lt;code&gt;interleaved&lt;/code&gt; 从被过滤 → 正确映射），而 OpenCode 的演进方向是&lt;strong&gt;持续深化 OpenAI 生态集成&lt;/strong&gt;（Responses API、encrypted reasoning、item reference），对 Kimi 的适配停留在通用 bridge 层。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就是 commit 层面的真相：一个是原生演进，一个是 bridge 间隙。&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>