dsh-llm-fidelity:参数被拒自动修正与用量统计保真

前言

在 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 与账单、仪表盘一致、且不希望为每个网关手工维护参数白名单的团队。

使用前请知悉:

  1. 插件在 当前 dsh 进程权限 下运行,安装前建议查看 GitHub 源码 与 MIT 许可证,确认符合你的安全与合规要求。
  2. 只处理 provider 明确写在错误信息里 的可选参数拒绝;不能替代正确的鉴权、配额与模型选型。
  3. 背景任务默认不参与参数适配(rectifyAuxiliary: false);若希望自动标题等 auxiliary 调用也自愈,需显式打开并理解对延迟与请求次数的影响。
  4. 学习缓存为进程内、有时效;重启进程或 TTL 过期后,同类拒绝可能再出现一次,仍会在同请求内自动处理。

结尾

dsh-llm-fidelity 把「可选参数 400/422」和「usage 帧不可靠」两类常见问题收束在 llm/stream 一侧:对话尽量不断,数字尽量如实。零配置可上手,需要时再在 cordis.patch.yml 里收紧重试次数或扩展 auxiliary 适配。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜