前言¶
在 DeepSeek Harness(DSH)里把智能体接到第三方模型或 OpenAI 兼容网关时,常见两类打断:模型服务对可选参数返回 400/422,整轮对话直接失败;流式结束时的 usage 帧被清零、重复或缺字段,仪表盘数字与账单对不上。换一家 provider,往往是另一组参数名或限制,手工改配置、重开会话成本很高。
下面介绍社区插件 dsh-llm-fidelity(维护者 philipho01,分类:模型推理)。它在不注册模型路由、不替换官方服务的前提下,监听 llm/stream 路径:对「明确拒绝可选参数」的响应做同请求内修正并重发;对 usage 统计做防清零、防重复与字段合并,且未上报的数字不臆造。
这是什么¶
dsh-llm-fidelity 是 DeepSeek Harness 插件,当前 npm 版本 0.1.3,许可证 MIT。定位可以概括为:高保真模型调用——自动适配被拒绝的可选参数,并保持 token 用量记账与 provider 上报一致。
安装后默认即可工作;它不与其他适配器抢路由,官方 dsh-llm-retry 仍负责 429、服务端错误等场景,本插件在这些情况会让路。
核心功能¶
对话不因可选参数 400/422 中断¶
典型错误包括:stop、max_tokens、temperature、reasoning effort 等不被当前模型支持。无插件时,智能体可能在多步工具调用中途收到类似:
400 — 'stop' is not supported with this model.
有插件时,同一 HTTP 请求内:从 provider 错误文案中读出被拒绝的字段,去掉或按错误提示 clamp(例如输出上限),立即重发;用户侧通常只看到回答继续,而不是错误页。
当前修正列表刻意保持简短,仅涉及可选标量:temperature、reasoningEffort、stop、maxTokens(不支持则省略,或按错误中的明确上限下调)。消息体、system prompt、tools 与约束不会被改动。上下文溢出、配额、鉴权、网络类错误原样透传,不做「猜参数」式重试。
每个请求最多 4 次自动适配(maxAdaptations 默认 4),且每次适配必须实际改变请求,避免无限循环。按 provider + model 在进程内缓存约 1 小时(strategyTtlMs 默认 3600000 ms),同一路由同类拒绝原则上最多经历一次。
默认识别的 HTTP 状态为 400 与 422(rectifyStatuses)。
用量统计:防清零、防重复、不造假¶
网关可能在流末尾发送全零 usage、重复快照,或缺少 cache 相关字段,导致统计被覆盖或重复计数。插件按帧守卫 usage 流:后帧不能抹掉先帧已有字段,全零占位不能覆盖真实合计,重复帧不重复入账。若 provider 从未上报某个数字,插件不会编造。
上述行为由选项 usageFidelity(默认 true)控制。
与生态的关系¶
插件 不注册 任何 model route,不替换 已有服务;与官方及社区 adapter、dsh-llm-retry 并行。DSH 社区插件目录在 SkillHub,与 DeepSeek / 幻方无官方从属关系,属「一切皆插件」生态中的独立条目。
安装与启用¶
兼容性(来自 README):DSH 0.1.0-rc.6 及之后版本,覆盖 0.2.0-rc 线;曾在 DeepSeek 桌面 0.2.0-rc.2 上测试。若安装报不兼容,先核对 DSH 版本。运行环境要求 Node >= 22。
官方安装命令:
dsh plugin add dsh-llm-fidelity
或使用 npm 系工作流:
pnpm add dsh-llm-fidelity
安装后在 DSH 插件设置中启用。默认项面向生产可用,下列开关均可选:
| 选项 | 默认值 | 含义 |
|---|---|---|
usageFidelity |
true |
usage 守卫(去重、防清零、字段合并) |
rectify |
true |
自动适配参数拒绝 |
rectifyStatuses |
[400, 422] |
视为「明确参数拒绝」的状态码 |
maxAdaptations |
4 |
单次请求最多自动重发次数 |
strategyTtlMs |
3600000 |
学到的 provider 偏好保留时长(毫秒) |
strategyCacheSize |
256 |
内存中保留的学习条目上限 |
rectifyAuxiliary |
false |
是否对后台任务(如自动标题)也做适配 |
修改配置¶
插件以 profile bundle 层安装;配置写在 profile 的 patch 文件中。桌面端路径示例:
~/.dsh/profiles/desktop/cordis.patch.yml
按 id llm-fidelity 覆盖配置。注意:config 整段替换而非合并,省略的键会回到内置默认值,改配置时需写全需要保留的项:
- id: llm-fidelity
config:
maxAdaptations: 2
rectifyAuxiliary: true
典型行为(可对照 README 场景)¶
发送带 temperature 的请求,模型不支持时:
You send: { temperature: 0.7, stop: ["END"], ... }
Model: 400 — 'temperature' is not supported with this model.
Plugin: (removes temperature, re-sends immediately)
Model: 200 — here is your answer.
You see: the answer. Nothing else. Ever.
这与 README 中「修复 bug 进行到第三步突然 400」的前后对比一致:有插件时错误在毫秒级被吸收并重发,且后续同路由请求可沿用已学到的参数组合。
适用场景与注意¶
适合谁:通过 DSH 对接多 provider、OpenAI 兼容网关或推理模型(常拒绝 max_tokens / stop / temperature 等)的开发者;需要 usage 与账单、仪表盘一致、且不希望为每个网关手工维护参数白名单的团队。
使用前请知悉:
- 插件在 当前 dsh 进程权限 下运行,安装前建议查看 GitHub 源码 与 MIT 许可证,确认符合你的安全与合规要求。
- 只处理 provider 明确写在错误信息里 的可选参数拒绝;不能替代正确的鉴权、配额与模型选型。
- 背景任务默认不参与参数适配(
rectifyAuxiliary: false);若希望自动标题等 auxiliary 调用也自愈,需显式打开并理解对延迟与请求次数的影响。 - 学习缓存为进程内、有时效;重启进程或 TTL 过期后,同类拒绝可能再出现一次,仍会在同请求内自动处理。
结尾¶
dsh-llm-fidelity 把「可选参数 400/422」和「usage 帧不可靠」两类常见问题收束在 llm/stream 一侧:对话尽量不断,数字尽量如实。零配置可上手,需要时再在 cordis.patch.yml 里收紧重试次数或扩展 auxiliary 适配。