kimi-for-dsh
Fix third-party model (Kimi) routing in DeepSeek Harness: reclassify context-overflow/quota errors so compaction recovery actually triggers; inject Kimi's context-management beta for preserved thinking.
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 18, 2026
- Updated
- Aug 18, 2026
Introduction
kimi-for-dsh
第三方模型(Kimi 系为主)在 DeepSeek Harness 里的路由修复插件
解决什么问题
DSH 通过内置的 @deepseek-ai/dsh-llm-pi-ai 适配器(上游库 @earendil-works/pi-ai)接入 Kimi 等第三方模型。这条链路的核心能力(流式、工具调用、带签名的思考块回传、prompt 缓存)都能工作,但错误语义和思考保留契约上存在实测缺口:
① 上下文溢出不被识别 → 不触发自动压缩
Kimi 的两个硬限制报错:
total message size 5943865 exceeds limit 2097152 # 2MB 请求字节墙 → HTTP 400
Your request exceeded model token limit: 262144 # token 上限 → HTTP 400
这两段文本都不含 DSH 内置 isContextWindowExceededError 词表要求的关键词("context length/window"、"too long for this model" 等),于是被归类为 INVALID_REQUEST —— agent-loop 不知道这是"上下文爆了",不会触发压缩自愈,轮次直接失败。
本插件把这些报错改写为 CONTEXT_WINDOW_EXCEEDED,让 DSH 的压缩恢复链路正常接管。
② 配额型 429 被当成普通限流白重试
Kimi 的 429 有两种语义(官方错误文档):
| 报错 | 语义 | 正确处置 |
|---|---|---|
The engine is currently overloaded | 引擎过载 | 退避重试 ✓ |
You've reached your usage limit for this period | 5 小时滚动窗口耗尽 | 重试无意义,应终止 |
You've reached kimi monthly usage limit... | 月度配额耗尽 | 重试无意义,应终止 |
DSH 一律按 RATE_LIMIT 退避重试,且 isQuotaExceededError 的正则匹配不上 "reached your usage limit" 这种语序。本插件把配额型改写为 QUOTA_EXCEEDED(干净终止、不再浪费配额重试),过载型保持 RATE_LIMIT 不变。
③ Preserved Thinking 契约缺失
Kimi 官方客户端(Kimi Code CLI 0.31+)在 Anthropic 兼容模式下的思考保留契约是:
anthropic-beta: context-management-2025-06-27
context_management: { edits: [{ type: "clear_thinking_20251015", keep: "all" }] }
pi-ai 只回传带签名的 thinking block,不声明保留策略。本插件为 kimi 系路由的请求补上 context-management-2025-06-27 beta 头(edit 体的请求体注入受 waterfall 能力限制,见已知限制)。
安装
dsh plugin --profile web add github:<owner>/kimi-for-dsh
或在 DSH 设置 → 插件里添加。
配置
全部可选项(默认值即推荐值):
# ~/.dsh/settings.yaml
kimi-for-dsh:
reclassifyErrors: true # 错误重分类(①②)
thinkingKeep: true # context-management beta 头注入(③)
extraProviders: [] # 除自动识别的 kimi/moonshot 系外,额外纳入修复的 provider id
工作原理
挂在 DSH 的 llm/stream waterfall(cordis 的标准拦截点)上:
- 重分类器:包装流式返回,遇到
finish.reason.kind === "error"的 chunk 时按报错文本改写failure.code,后续的重试(llm-retry)、压缩(compaction)、终止逻辑自动按正确语义执行。命中时输出日志:[kimi-for-dsh] reclassify kimi-coding: INVALID_REQUEST → CONTEXT_WINDOW_EXCEEDED :: total message size ... - beta 头注入:kimi 系路由(provider id 含
kimi/moonshot,或extraProviders指定)的请求头自动补anthropic-beta: context-management-2025-06-27,与已有 beta 合并、不重复。
所有资源挂在 ctx.effect 上,热重载/卸载即净。
已知限制
context_managementedit 体需要修改请求 body,而llm/streamwaterfall 只共享 options 头——beta 头先到位(服务端见到即知道客户端支持该契约),edit 体注入待 DSH 提供请求体级挂点或 pi-ai 上游支持。当前 DSH 的 thinking 块签名回传本身可用,此项为加固。- 重分类基于报错文本匹配(Kimi 未提供结构化错误码),Kimi 若改措辞需更新正则——欢迎提 issue。
- 会员权益类报错("Your current plan supports only ... 256K context")故意不改写:它是 401 语义,正确动作是升级套餐或调低 contextWindow,不是压缩。
背景调研
本插件源于一次完整调研。核心结论:DSH↔Kimi 的核心链路可用、缓存命中正常、思考签名回传正常;缺口集中在错误语义映射。同类契约缺失亦见 MoonshotAI/Kimi-K2#129。
License
BSD-3-Clause