dsh-short-tool-ids:为 OpenAI 兼容接口缩短超长 tool-call ID

前言

在 DeepSeek Harness(DSH)里用 pi-ai 接 OpenAI 兼容的 Chat Completions 时,会话历史里若带着过长的 tool-call ID,上游可能直接拒收请求,对话无法继续。pi-ai 只在部分条件下自行缩短 ID(例如 provider 名恰好为 openai,且历史来自不同模型),自定义 provider 或同模型续聊往往仍会把 64 字符以上的 ID 原样送出。下面介绍社区插件 dsh-short-tool-ids(维护者 mrbeandev),在出站请求里按 provider 可选地缩短这些 ID,且不改动已保存的会话文件。

这是什么

dsh-short-tool-ids 是面向 DSH 的实验性插件,npm 包名 dsh-short-tool-ids,当前资料中的版本为 0.4.0(MIT)。它只处理 使用 openai-completions 协议的 pi-ai provider;其它协议与内置 DeepSeek 适配器即使出现在设置里也不会被改写。已保存的 session 不会被编辑;开关从下一次请求起生效。

为什么会出现这类错误

部分 OpenAI 兼容接口要求 tool-call / call_id 字符串最长 64 字符。历史里若已有更长 ID(README 举例为 81 字符),每一轮都会把整段历史重发,错误会在模型回复之前就出现,例如:

Invalid 'input[5].call_id': string too long. Expected a string with maximum length 64, but got a string with length 81 instead.

插件作者说明:这是针对上述场景的定向 workaround,不是对 Responses、Anthropic message ID 等的通用修复。

核心功能

  1. 按 provider 开关:在 Settings → Short tool-call IDs 中为每个模型 provider 单独启用,默认全部关闭。非 pi-ai provider 的开关为禁用;其它协议(如 anthropic-messages)会标为不受影响。
  2. 缩短规则:长度超过 64 且需处理的普通 ID,变为 call_ 加 48 位 SHA-256 十六进制(共 53 字符);同一次 call 与其 tool result 使用同一缩短后的 ID。
  3. 历史格式:兼容 DSH 0.1.5(tool-result 块)与 0.1.7+(独立 tool 消息)两种历史形态;合法 ID、参数、输出、replay 元数据与 tool 执行身份保持不变。
  4. 安全边界:若缩短后 ID 与其它 ID 冲突,插件拒绝该请求而非错配结果;复合 Responses 的 call_id|item_id 不改动;无法安全重写的 signed / native 历史会拒绝而非强行剥离。
  5. 不半载:与 DSH / pi-ai 版本不匹配时启动会明确报错并拒绝加载,不会「加载一半」或悄悄改 session。

支持的 DSH 与运行环境

请先执行:

dsh --version

资料中的支持范围为 DSH 0.1.5-rc.1 起至(不含)0.3.0,且需 dsh-short-tool-ids 0.4.0 或更新。0.3.0 及更新版本在未经测试前会拒绝加载(可用 allowUntestedHarness: true 覆盖,README 有说明)。低于 0.1.5-rc.1 不支持。

Node.js:^22.19.0 或 >=24.0.0(与 pi-ai 要求一致)。

较旧插件 0.3.0 及更早 仅适配 DSH 0.1.5-rc.2 等有限组合,在 DSH 0.1.7 / 0.2 上会拒绝加载;升级路径见 README「Upgrading from 0.3.x or older」。

安装与启用

在 web profile 下从 npm 安装(命令来自仓库 README):

dsh plugin --profile web add dsh-short-tool-ids

当前工作告一段落时停止正在运行的 DSH Web 进程,再按平常方式启动,例如:

dsh web --no-open --port 3080

刷新页面后打开 Settings → Short tool-call IDs,为报 ID 长度错误的那条 provider 打开开关,然后重试对话。

从本地目录安装(路径须为绝对路径):

dsh plugin --profile web add "/absolute/path/to/dsh-short-tool-ids"

卸载:

dsh plugin --profile web remove dsh-short-tool-ids

也可仅关闭某个 provider 的开关:下一请求起不再改写出站内容。开关变更无需重启 DSH;若保存失败会显示错误而非假成功。

典型用法

  1. 安装插件并重启 DSH Web,刷新浏览器。
  2. 在 Short tool-call IDs 中找到出错的 provider(列表展示 display name、route id、protocol)。
  3. 打开该 provider 的开关。
  4. 回到原会话发送消息;插件会在出站 pi-ai openai-completions 请求中缩短超长 ID,已有历史中的长 ID 也会在发送路径上被处理,但不会写回磁盘上的 session 文件。

若 host 插件未运行(例如 DSH 版本不受支持),该设置页会说明情况且开关不可用。

配置存放位置(版本差异)

DSH 版本 开关存储位置
0.1.5-rc.x settings.yaml 中的 short-tool-ids 段
0.1.7+ / 0.2.x 本插件在 profile patch(cordis.patch.yml)中的条目

从 0.3.x 及更老插件升级时:开关已从 Settings → Models 各 provider 卡片迁到独立 Short tool-call IDs 页;与 dsh-rpm 的耦合已移除。

适用场景与注意

适合:通过 pi-ai 使用 OpenAI 兼容 Chat Completions、且因 tool-call ID 超过 64 字符导致请求失败的用户;需要按 provider 精确开启、避免误改其它链路时。

务必知晓:

  • 插件以当前 DSH 进程权限运行,安装前请自行查看 源码 与 MIT 许可证。
  • README 明确:不保证零回归;实现为对 pi-ai adapter 的 prototype 包装,非官方 decorator API。
  • 仅 openai-completions 的 pi-ai provider 会实际改写;其它项在 UI 中可能可见但不应产生效果。
  • DSH 社区目录 SkillHub 插件页 为独立生态站点,与 DeepSeek / 幻方无官方从属关系;本文事实以 GitHub 仓库 README 为准。

链接

在受支持的 DSH 版本上,按 provider 打开开关即可在不动本地 session 文件的前提下,让超长 tool-call ID 符合 64 字符限制,恢复因历史 ID 过长而中断的对话。

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

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

小夜