)
DeepSeek Harness 词汇治理以「生产者准入」裁剪无生产者的词汇变体CacheHint、agent 来源、continuation 触发器【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harnessDeepSeek Harness 的核心会话与 LLM 层大量使用基于声明合并declaration merging的可扩展映射表ContentBlockMap、MessageSourceMap、TurnTriggerMap、TurnEndReasonMap等来承载消息内容块、消息来源、轮次触发器等「词汇」。这些映射表遵循一条准入策略变体只有在适配器或 agent loop 首次真正发出它时才允许加入词汇。本文围绕仓库中已归档的技术决策记录.agents/notes/archived/simplification/2026-07-04-prune-producerless-vocabulary-variants.zh.md完整剖析一次针对三个「无生产者」词汇变体的裁剪行动说明判断依据、执行方式、验证手段与回归路径并对照当前源码印证裁剪后的真实状态。读者读完将理解 DeepSeek Harness 的可扩展词汇设计原则以及如何在类似架构中治理「已声明但无人生产」的契约表面。背景可合并扩展的词汇映射表与生产者准入策略DeepSeek Harness 的消息模型建立在 dsh-llm 提供方无关内容块词汇 之上消息是类型化内容块的数组text、reasoning、tool-call、tool-result其联合类型派生自可合并扩展的ContentBlockMap插件通过声明合并添加新的块类型。同一可合并扩展映射模式为所有「字符串化」字段提供类型——MessageSource、FinishReason、TurnTrigger、TurnEndReason全部由此派生。从当前源码可以直接看到这套机制的两个实例在 packages/llm/llm/src/message.ts 中MessageSourceMap声明了user、plugin、model、tool四个来源并注明Merge-extensible sum type — plugins add their ownkinds在 packages/llm/llm/src/types.ts 中ContentBlockMap声明了五种块类型注释明确写着New core blocks must land with adapter, UI, and compaction support新核心块必须与适配器、UI 和压缩支持一同落地。而准入策略本身写在与本决策密切相关的 packages/core/session/README.md 中TurnEndReasonMapomits the ACP-namedrefusal/max_turn_requestsvariants— producer-gated: they land when an adapter or the loop first emits them.即refusal、max_turn_requests这类变体「在适配器或循环首次发出它之前有意不纳入」。这就是本决策所依据的**生产者准入producer-gated**原则词汇中的每一个成员都必须存在实时生产者空槽位不是意图声明而是每个实现和消费方都必须考虑的契约负担。问题三个已声明却无人生产的词汇项在 packages/core/session/src/types.ts 中TurnEndReasonMap明确列出的准入策略点名下代码库中却有三个已声明的词汇项违反了该策略——每个都既无生产者也无消费方其中两个甚至没有测试1.CacheHint及其cache?: CacheHint块字段CacheHint与其在TextBlock/ToolResultBlock上的cache?: CacheHint字段本应位于 packages/llm/llm/src/types.ts 的内容块类型上图像块曾携带第三个此类字段已随图像块一同移除见 删除图像内容块 Agent Note。问题在于任何地方都没有构造带cache:的块——源码、测试和文档粘贴均为空两个真实适配器也都不读取.cache。以 DeepSeek 为例其提示词缓存prompt caching是自动的适配器会从响应中映射出prompt_cache_hit_tokens命中缓存 token 数却从不向请求中发送任何缓存 hint。也就是说这是没有任何提供方能够兑现的 Anthropic 风格cache_control表面——它只属于某个外部 API 的私有结构而非 harness 实际对接的提供方能力。这一点在 packages/llm/llm/src/types.ts 的TokenUsage中可以得到印证token 记账通过可选的cacheReadTokens/cacheWriteTokens字段从响应方向表达缓存命中注释明确说明Adapters whose providers fold cache hits into a total prompt count (DeepSeeksprompt_tokens) subtract them out——缓存是适配器读取响应时核算的结果而非请求时需要构造的输入。2.MessageSourceMap.agentagent来源变体{ kind: agent; agentId: string }曾声明在 packages/llm/llm/src/message.ts 的MessageSourceMap中。当前源码中该映射只保留user、plugin、model、tool四个成员agent已不存在——这正是本决策裁剪的结果。该变体的死因在于预期的生产者在实现时并未使用它subagent 后端将父级的提示词发送给子级时不带source因此记录为{ kind: user }而通用信封渲染器在插值source.kind时也从未对agent做路由。零构造点测试中也没有零消费点——一个从出生起就没有主人的槽位。3.TurnTriggerMap.continuationcontinuation轮次触发器变体曾声明在 packages/core/session/src/types.ts 的轮次触发词汇中。从当前源码看turn/start事件见 packages/core/session/src/types.ts的数据载荷仅为{ turn: number }而会话持久化协调器对旧turn/start信封的迁移逻辑见 packages/session/session-persistence/src/coordinator.ts只兼容message、retry等既有触发类型——continuation不在此列。其死因是结构性的agent loop 在结构上不可能发出它——continuation自动续行发生在一个轮次内部作为后续步骤而非作为新轮次启动循环只构造message和injection触发器。唯一的写入者是一个手工构建的测试 fixture测试前置数据它只需要一个任意的非 message 触发器packages/test-support/llm-replay/tests/llm-replay.spec.tsllm-replay 快照重放插件的测试而injection触发器同样满足需求。唯一的生产环境触发器读取方——ACPAgent Client Protocol桥接层——只过滤kind message对continuation既不读也不路由。决策删除而非保留决策非常明确CacheHint、其cache?块字段、agent消息来源变体和continuation轮次触发器变体全部删除——已发布的词汇不再携带它们。具体执行与配套动作包括llm-replay fixture 改用injection触发器测试夹具需要一个任意的非message触发器即可满足重放行为断言injection完全胜任。从当前 packages/test-support/llm-replay/tests/llm-replay.spec.ts 可以看到其构造的turn/start事件数据仅为{ turn: 1 }与该决策后的精简触发器词汇一致。文档同步core.md和session.md中的 type-equiv 粘贴与裁剪后的映射匹配MessageSourceMap、TurnTriggerMap、TurnEndReasonMap两个符号仍保留在 scripts/type-equiv.manifest.json 中的清单行——因为每个映射只是少了一个成员而继续存在type 等价性断言无需删除符号本身从清单中可查到MessageSourceMap与TurnEndReasonMap的条目。词汇归属记录修正内容块词汇 Agent Note 中缓存提示……有了归属的设计后果表述被更正为按生产者门控producer-gated记录——缓存提示与 assistant prefill 在有实际适配器能兑现之前保持缺席。这正是.agents/notes/implemented/AGENTS.md对决策记录与实现一致性要求的体现。曾考虑的替代方案为什么不保留空槽位一个值得认真对待的反对意见是内容块词汇 Agent Note 曾把cache hint……有了归属列为设计后果预留槽位确实能表明意图。但决策记录给出了更有说服力的反驳空槽位是每个实现和消费方都必须考虑的契约表面——我的适配器是否必须遵守cache我的 renderer 是否必须路由agent来源。一个无人生产的变体会向所有下游提出无法回答的问题成为纯粹的认知负担与潜在 bug 来源。更重要的是相邻映射自身的 JSDoc 已经拒绝了无 emitter 先预留的做法refusal和max_turn_requests被点名为首次有内容发出它们时再添加的变体而不是提前声明见 packages/core/session/README.md 的 producer-gated 说明。让已经声明但无用的变体遵守同一标准才能使词汇真正有意义只要它位于 map 中就必须有内容生产它。验证方式决策的验证依赖可复现的全局检索对CacheHint、agent消息来源拼写和continuation触发器拼写运行rg只会返回 Agent Note 记录本决策记录本身以及删除图像 Agent Note 对图像块自身cache字段的说明llm-replay fixture 使用injection触发器断言相同的重放行为——即测试语义不变仅替换了触发词核心数据结构粘贴core.md / session.md与 scripts/type-equiv.manifest.json 的 type-equiv 清单保持同步。这套验证方式在读者侧同样可复现在仓库中搜索CacheHint、kind: agent消息来源语境、continuation触发器语境除归档的 Agent Note 外不应命中任何生产代码、测试或文档粘贴。这是词汇由生产者驱动这一原则最直接的落地证据。后果与影响范围操作行为没有变化——原本就没有任何内容能够构造这些值删除是零风险的清理而非行为变更。与其他并行清理的关系同样清晰镜像事件移除边界镜像事件 Agent Note、流分片 Agent Note只触及瞬态agent/*事件从不触及持久词汇因此不存在冲突。值得强调的是准入策略在词汇的其他位置本就成立rejected、prompt/blocked、hook/invoked/hook/result都有实时生产者。本决策只是把同一道门槛扩展到了缺少生产者的三个变体上让整个词汇表的一致性标准得到统一。另一个边界划分图像块自身的cache?字段归属删除图像 Agent Note——它随图像块一同被移除本决策覆盖的是剩余块类型TextBlock、ToolResultBlock上的两个字段两者互不重叠、共同完成了对cache表面的彻底清理。回归路径每个变体在获得真正生产者之日回归本决策并非永久删除。恰恰相反每个变体在获得真正的生产者之日回归——这正是映射表设计的增长方式缓存功能回归时会连同传输它的适配器一起重新添加cache届时适配器能在请求方向兑现并消费提供方的缓存协议subagent 归属回归时会连同打标的后端和路由它的消费方一起重新添加agent后端在发送子级请求时打上source标记渲染器据此路由展示自动续行功能真正启动新轮次时会连同发出它的插件一起重新添加continuation。也就是说词汇变体的生命周期由生产者驱动先有实现后有词汇。这条生产者准入标准对 DeepSeek Harness 的插件开发者同样有指导意义——当你在ContentBlockMap、MessageSourceMap或其他可合并扩展映射上通过声明合并添加新成员时请确保同一提交中就包含真正构造它的生产者适配器、循环或插件与路由它的消费方否则该成员将在下一次词汇治理中被裁剪。关键源码索引以下是本文涉及的核心证据位置便于读者深入仓库验证packages/llm/llm/src/message.tsMessageSourceMap当前仅含user/plugin/model/tool四个成员packages/llm/llm/src/types.tsContentBlockMap五块类型无cache字段packages/llm/llm/src/types.tsTokenUsage的cacheReadTokens/cacheWriteTokens——缓存从响应方向核算packages/core/session/src/types.tsTurnEndReasonMap六个变体无refusal/max_turn_requestspackages/core/session/README.md生产者准入策略的官方表述packages/test-support/llm-replay/tests/llm-replay.spec.tsfixture 使用精简后的turn/start载荷scripts/type-equiv.manifest.jsontype-equiv 清单中MessageSourceMap、TurnEndReasonMap符号行.agents/notes/implemented/architecture/2026-06-11-content-block-vocabulary.zh.md内容块词汇的归属记录含裁剪后的 producer-gated 表述.agents/notes/archived/simplification/2026-07-04-drop-image-content-block.zh.md图像块及其cache字段的移除记录【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考