安装过程遇到「Tool call - Error: unknown tool "“ 问题」 #2982
NullPointer8023
started this conversation in
General
Replies: 1 comment
|
补充一个代码层面的定位:切换模型可以绕过这个问题,但根因是 DeepSeek 流式 tool-call delta 的兼容性处理。 我在当前源码中复现了:第一个 delta 带有 function.name: "run_code",后续 delta 带有 function.name: ""。packages/llm/llm-deepseek/src/translate.ts 原来的逻辑会用空字符串覆盖已保存的工具名,最后组装成 name: "",触发 Error: unknown tool ""。 修复方式是仅在工具名非空时更新: if (call.function?.name) block.name = call.function.name我还补充了回归测试,验证后续空名称不会清除首次收到的有效工具名。相关 llm-deepseek 测试、TypeScript 编译和 lint 均已通过。也就是说,切换模型是 workaround,保留首次有效工具名才是代码层面的修复。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
DSH Web 工具问题完整排查总结
📑 目录
问题概述
初始问题
npx @deepseek-ai/dsh web命令无法正常启动,启动后工具不可见,工具调用时报错。最终解决
通过切换模型解决了工具调用失败的问题。
第一阶段:启动失败
🚨 问题现象
npx @deepseek-ai/dsh web # 命令无响应,没有任何输出🔍 排查过程
1. 环境检查
2. 包安装检查
npm list -g @deepseek-ai/dsh # 输出:@deepseek-ai/dsh@0.1.0-rc.7 ✅3. Profile 配置检查
查看
~/.dsh/profiles/web/package.json:{ "name": "web-profile", "version": "1.0.0", "private": true, "dependencies": {} // ❌ 缺少 dsh.profile.bundles 配置 }🎯 根本原因
Web profile 的
package.json缺少必要的dsh.profile.bundles配置,导致无法加载工具 bundle。✅ 解决方案
删除损坏的 profile,让系统从模板重新初始化:
重新启动后生成的正确配置:
{ "name": "dsh-profile-web", "private": true, "dependencies": {}, "dsh": { "profile": { "bundles": [ "@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app" ] } } }第二阶段:工具不可见
🚨 问题现象
DSH Web 启动成功,但在 Web UI 中找不到任何工具。
🔍 排查过程
1. 检查配置
发现所有工具都被禁用:
2. 查看默认配置
检查
dsh-web-app的cordis.patch.yml:cat ~/.nvm/versions/node/v22.23.2/lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-web-app/cordis.patch.yml发现 Web 模式默认禁用了大部分工具:
🎯 根本原因
Web 模式出于安全考虑,默认禁用了大部分工具插件。这是设计决策,不是 bug。
✅ 解决方案
编辑
~/.dsh/profiles/web/cordis.patch.yml,启用需要的工具:重启服务使配置生效:
pkill -f "dsh.*web" dsh web --port 8080第三阶段:工具调用失败
🚨 问题现象
工具已启用,但在 Web UI 中调用工具时报错:
🔍 排查过程
1. 验证工具注册
输出:
2. 深入分析会话日志
DSH 会将每个会话的记录保存到
~/.dsh/sessions/目录:3. 分析日志内容
从日志中发现问题:
第 32 行 - 模型正确生成工具调用:
{ "type": "tool-call-delta", "index": 1, "id": "call_89f8cc603f8347d4987e5be4", "name": "run_code", // ✅ name 正确 "argumentsDelta": "" }第 33 行 - 后续 delta 中 name 丢失:
{ "type": "tool-call-delta", "index": 1, "id": "", "name": "", // ❌ name 为空 "argumentsDelta": "{" }第 70 行 - 最终组装的工具调用:
{ "type": "tool-call", "id": "", "name": "", // ❌ name 为空 "arguments": "{...}" }第 75 行 - 导致错误:
{ "type": "tool-result", "content": [ { "type": "text", "text": "Error: unknown tool \"\"" } ], "isError": true }🎯 根本原因
DSH 流式工具调用组装 bug
模型(DeepSeek v4-pro)正确地在第一个 delta 中提供了
name:"run_code",但 DSH 的ConversationNodeAssembler在处理后续 delta 时没有正确保留 name 字段,导致最终组装的工具调用 name 为空字符串。这是一个代码层面的 bug,位于 DSH 的流式组装逻辑中。
第四阶段:问题解决
✅ 解决方案
切换模型。
编辑
~/.dsh/settings.yaml:重启 DSH Web 服务后,工具调用正常工作!
💡 为什么有效
不同模型的流式输出格式可能略有差异。其他模型的工具调用格式能被 DSH 正确解析,不会触发组装 bug。
技术架构分析
DSH 工具系统架构
两层名称系统
"tool-bash"- 用于配置文件中的id字段"bash"- 模型实际调用时使用的名称流式工具调用组装流程
关键文件位置
配置文件
DSH 安装位置
常用命令
经验教训
1. 配置问题排查
package.json中的dsh.profile.bundles2. 工具可见性问题
cordis.patch.yml中的disabled设置dsh --dump-config验证配置3. 工具调用失败问题
session.jsonl.zstd4. 调试技巧
dsh --dump-config查看完整配置grep快速定位问题5. 架构理解
相关资源
官方资源
配置文件参考
~/.dsh/profiles/web/package.json~/.dsh/profiles/web/cordis.patch.yml~/.dsh/settings.yaml日志分析
~/.dsh/sessions/*/session.jsonl.zstdzstd -d file.zstd -o file.jsonlcat file.jsonl | jq .附录:常见问题
Q1: 如何查看所有可用的工具?
Q2: 如何启用/禁用特定工具?
编辑
~/.dsh/profiles/web/cordis.patch.yml:Q3: 如何查看会话日志?
Q4: 如何切换模型?
编辑
~/.dsh/settings.yaml:Q5: 工具调用失败如何排查?
dsh --dump-config | grep tool-bashsession.jsonl.zstd总结
通过系统性的排查,我们解决了 DSH Web 的三个层次的问题:
整个过程深入理解了 DSH 的架构设计,包括 Cordis 插件系统、工具动态注册机制、流式工具调用组装等核心技术。
最终状态:✅ DSH Web 正常运行,所有工具可用!🎊
文档生成时间:2026-08-18
环境:macOS, Node.js v22.23.2, DSH v0.1.0-rc.7
All reactions