Ollama 调用 ID 修复 yuanc1204/dsh-ollama-tool-call-id-fix
DeepSeek Harness自动修补重复工具调用 ID,恢复对话历史加载
28.1/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yuanc1204/dsh-ollama-tool-call-id-fix该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 72 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 11 处,展示前 11 条)
- 读取本地文件plugin/lib/index.js:108
const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8")); - 读取本地文件plugin/lib/index.js:181
if (existsSync(candidate)) out.add(candidate); - 读取本地文件plugin/lib/index.js:188
const original = readFileSync(adapterPath, "utf8"); - 写入本地文件plugin/lib/index.js:218
copyFileSync(adapterPath, backupPath); - 写入本地文件plugin/lib/index.js:222
writeFileSync(adapterPath, work, "utf8"); - 读取本地文件plugin/test-standalone.mjs:56
const live = readFileSync(LIVE, "utf8"); - 读取本地文件plugin/test-standalone.mjs:65
const liveAfter = readFileSync(LIVE, "utf8"); - 读取本地文件plugin/test-standalone.mjs:72
const pristine = readFileSync(PRISTINE, "utf8"); - 写入本地文件plugin/test-standalone.mjs:99
writeFileSync(tmp, work, "utf8"); - 执行外部命令来自配置/变量plugin/test-standalone.mjs:102
execFileSync(process.execPath, ["--check", tmp], { stdio: "pipe" }); - 读取本地文件plugin/test-standalone.mjs:113
const liveAfter = readFileSync(LIVE, "utf8");
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 修补重复工具调用ID
- 恢复对话历史加载
修复 DeepSeek Harness 客户端会话历史,应对 Ollama 复用工具调用 ID 的问题。
README
由 DeepSeek 最新模型翻译生成DSH + Ollama 工具调用 ID 修复
修复 Ollama OpenAI-compatible 接口跨请求重复使用工具调用 ID(如 call_0)时,DeepSeek Harness 无法加载对话历史的问题。
推荐用 DSH 插件实现自动打补丁:DSH 每次启动时自动检测并重打,升级 DSH 后无需手动操作。见方案一。
问题
部分 Ollama OpenAI-compatible 工具调用响应会在每个请求中重新使用 call_0。DSH 原样保存该 ID;当对话包含多次工具调用时,历史重载会失败:
conversation Context … tool-callcall_0 received more than one start Match (internal)
这是 Ollama 的工具调用解析和 OpenAI 接口适配层造成的兼容性问题,而不是模型本身生成了重复的 OpenAI 工具调用 ID:模型生成的是工具调用文本(函数名、参数和标记),Ollama 解析后再组装 tool_call.id。在受影响的接口路径或版本中,该 ID 会在请求间重复为 call_0;DSH 将它原样持久化,才导致历史中的同名 ID 冲突。
展开完整文档(README 剩余 1 节)
DSH + Ollama 工具调用 ID 修复 修复 Ollama OpenAI-compatible 接口跨请求重复使用工具调用 ID(如 call_0)时,DeepSeek Harness 无法加载对话历史的问题。 推荐用 DSH 插件实现自动打补丁:DSH 每次启动时自动检测并重打,升级 DSH 后无需手动操作。见方案一。 问题 部分 Ollama OpenAI-compatible 工具调用响应会在每个请求中重新使用 call_0。DSH 原样保存该 ID;当对话包含多次工具调用时,历史重载会失败: conversation Context … tool-callcall_0 received more than one start Match (internal) 这是 Ollama 的工具调用解析和 OpenAI 接口适配层造成的兼容性问题,而不是模型本身生成了重复的 OpenAI 工具调用 ID:模型生成的是工具调用文本(函数名、参数和标记),Ollama 解析后再组装 tool_call.id。在受影响的接口路径或版本中,该 ID 会在请求间重复为 call_0;DSH 将它原样持久化,才导致历史中的同名 ID 冲突。 修复原理 补丁作用于本机安装的 @earendil-works/pi-ai(OpenAI Completions 适配器,dist/api/openai-completions.js):为每个响应生成唯一前缀,例如: dsh_mswogrud_pz76l04y_call_0 原始 ID 仍用于同一响应流的分块匹配;写入会话历史和工具结果的 ID 则在每个响应开始处理时加上新生成的时间戳与随机前缀,从而在正常使用中保持跨请求唯一。 方案一(推荐):DSH 自动补丁插件 plugin/ 目录是一个标准的 DSH bundle 插件(dsh-ollama-call-id-auto)。它在 DSH 启动时运行: - 定位本机 DSH 安装树里的 pi-ai 适配器; - 若尚未打补丁 → 校验锚点唯一后打补丁(先写 .bak 备份); - 若已打补丁 → 跳过(幂等); - 若 pi-ai 版本变化导致锚点不匹配 → 跳过并打日志,绝不影响 DSH 启动。 因为 pi-ai 的 openai-completions.js 是首次请求时才惰性加载的,启动时改写磁盘文件即可对当前进程立即生效,无需二次重启。 安装 1) 获取本仓库 git clone https://github.com/yuanc1204/dsh-ollama-tool-call-id-fix cd dsh-ollama-tool-call-id-fix 2) 一键安装(复制到自定义插件目录并注册到 web profile) .\setup.ps1 3) 重启 DeepSeek Harness,新建对话测试连续工具调用 或手动两步: Copy-Item .\plugin $env:USERPROFILE\.dsh\custom-plugins\dsh-ollama-call-id-auto -Recurse -Force dsh plugin --profile web add link:$env:USERPROFILE\.dsh\custom-plugins\dsh-ollama-call-id-auto 安装成功后,每次启动 DSH 都会在日志(stderr)看到: [dsh-ollama-call-id-auto] patched: …\openai-completions.js # 首次 / 升级后 [dsh-ollama-call-id-auto] already patched, skipping: … # 之后每次 卸载 dsh plugin --profile web remove dsh-ollama-call-id-auto Remove-Item $env:USERPROFILE\.dsh\custom-plugins\dsh-ollama-call-id-auto -Recurse -Force 方案二:一次性手动补丁(脚本) 不想装插件时,可直接运行脚本。注意:每次 DSH 升级/重装后需要手动重跑。 1. 关闭 DeepSeek Harness。 2. 在 PowerShell 中运行: Set-ExecutionPolicy -Scope Process Bypass .\patch-dsh-ollama-tool-call-ids.ps1 3. 重启 DeepSeek Harness,并新建对话测试连续工具调用。 脚本会先生成 openai-completions.js.dsh-call-id.bak 备份。旧的损坏历史不会被修改。 验证 本仓库附带可移植测试(plugin/test-standalone.mjs): 准备一份与 DSH 相同版本的未打补丁 pi-ai(例如 0.82.1) $pi = npm view @earendil-works/pi-ai version # 确认版本用 npm pack 下载后解出 dist/api/openai-completions.js 作为 pristine 参考 node plugin\test-standalone.mjs 它会核对:4 个锚点在 pristine 文件中各出现一次、打补丁后与线上文件逐字节一致(除现场生成的前缀外)、node --check 通过、对已打补丁文件幂等。 说明 - 已针对 @deepseek-ai/dsh 0.1.0-rc.6 / 0.1.1-rc.2、@earendil-works/pi-ai 0.82.1 验证:补丁产物与官方构建逐字节一致,且通过 node --check。 - 重装或升级 DSH 会覆盖被修补的 openai-completions.js:方案一在下次启动自动重打;方案二需手动重跑脚本。 - 旧的损坏历史不会被修改。 - 这是上游 Ollama 服务在受影响接口路径或版本中尚未生成跨请求全局唯一工具调用 ID 时的客户端兼容性修复;理想的上游修复应由 Ollama 输出全局唯一 ID。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yuanc1204/dsh-ollama-tool-call-id-fix
自动修补重复工具调用 ID,恢复对话历史加载
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,489已汉化DSH
73.1
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,918已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,453已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
Download DS Bot for Windows 10/11 64-bit / 下载 Windows…
★ 5,293已汉化DSH
71.2
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,797已汉化DSH
71.1
这是你的仓库?认领条目