Blockcell WebUI 对话中频繁出现 DSML 工具调用标记及 list_dir 重复调用
Describe the bug(问题描述)
Blockcell WebUI 端对话过程中,频繁出现 DSML(DeepSeek Markup Language)工具调用相关标记,且重复触发 list\_dir 方法调用,标记未被过滤直接显示在对话界面,影响正常使用体验。
频繁出现的文本样式如下(可直接复制):
<||DSML||tool_calls> <||DSML||invoke name="list_dir"> <||DSML||parameter name="path" string="true">/home/blockcell/.blockcell/workspace/skills</||DSML||parameter> </||DSML||invoke> <||DSML||invoke name="list_dir"> <||DSML||parameter name="path" string="true">/home/blockcell/.blockcell/skills</||DSML||parameter> </||DSML||invoke> </||DSML||tool_calls>
现象补充:每次发起对话、切换对话轮次时,该标记片段会重复出现,且 list\_dir 调用针对两个固定路径反复触发,无终止迹象。
Environment(环境信息)
-
Blockcell 版本:0.15 版(通过 Dockerfile 编译部署)
-
模型:DeepSeek-V4(启用工具调用模式)
-
部署方式:WebUI 端(本地部署,基于 Blockcell 0.15 版 Dockerfile 编译构建)
-
系统环境:Linux(用户目录为 /home/blockcell)
-
模型服务配置:stream=true、tool_choice=auto
Steps to Reproduce(复现步骤)
-
启动 Blockcell 服务及 WebUI 端;
-
在 WebUI 对话输入框中输入任意内容(如“你好”)并发送;
-
观察对话输出,可直接看到 DSML 标记及重复的 list_dir 调用内容;
-
切换对话轮次、刷新 WebUI 后,再次发送消息,现象重复出现。
Expected behavior(预期行为)
-
DSML 工具调用标记(<||DSML||...>)应被后端/前端过滤,不显示在 WebUI 对话界面;
-
list_dir 方法不应重复、无意义地调用,仅在必要时(如技能加载)触发一次;
-
对话界面仅显示模型正常的自然语言回复,无底层工具调用标记泄漏。
Actual behavior(实际行为)
-
DSML 工具调用标记未被过滤,直接透传到 WebUI 对话中,刷屏显示;
-
list_dir 方法反复调用,针对 /home/blockcell/.blockcell/workspace/skills 和 /home/blockcell/.blockcell/skills 两个路径重复触发,无终止;
-
标记显示杂乱,遮挡正常对话内容,影响使用体验。
Possible Root Cause(可能原因分析)
-
DSML 标记泄漏(核心原因):DeepSeek-V4 流式输出时,DSML 起止标记未被 Blockcell 后端完整过滤,分块解析过程中标记片段直接透传到前端;
-
技能目录循环探测:Blockcell 技能加载逻辑存在异常,模型每次对话都会自动扫描技能目录,若目录权限异常、不存在或技能损坏,会导致 list_dir 方法反复重试;
-
前端未做输出过滤:WebUI 前端未添加正则过滤逻辑,未对 DSML 标记块进行清除,导致原始标记直接显示。
Temporary Solution(临时解决方案)
以下方法可临时缓解问题,供开发者参考,期待官方修复根本问题:
-
前端过滤(最快见效):在 WebUI 前端代码中添加正则,移除所有 DSML 标记块,代码如下:
// 过滤所有 \<||DSML||\.\.\.\> 标签及内容 content = content\.replace\(/\<||DSML||\[\\s\\S\]\*?\<\\/||DSML||\>/g, \&\#39;\&\#39;\); // 兼容转义后的标记(若前端存在转义处理) content = content\.replace\(/\&lt;||DSML||\[\\s\\S\]\*?\&lt;\\/||DSML||\&gt;/g, \&\#39;\&\#39;\);
-
修复技能目录异常:
`# 检查目录是否存在
ls -la /home/blockcell/.blockcell/workspace/skills
ls -la /home/blockcell/.blockcell/skills
# 创建缺失目录并授权
mkdir -p /home/blockcell/.blockcell/{workspace/,}skills
chmod -R 755 /home/blockcell/.blockcell
chown -R blockcell:blockcell /home/blockcell/.blockcell
# 清理损坏技能(删除目录下异常/空文件夹)
rm -rf /home/blockcell/.blockcell/workspace/skills/*[异常文件夹]
rm -rf /home/blockcell/.blockcell/skills/*[异常文件夹]`
-
后端临时配置:模型服务端添加 stop_sequences,截断 DSML 标记输出:
\{ \&\#34;stop\_sequences\&\#34;: \[\&\#34;\<||DSML||\&\#34;, \&\#34;\</||DSML||\&\#34;\] \}
-
禁用自动技能探测(可选):修改 Blockcell 配置文件 config.toml,关闭启动时自动扫描技能目录:\[agent\] auto\_scan\_skills = false
Additional context(补充信息)
-
重启 Blockcell 服务(systemctl restart blockcell)后,现象仍会重复出现;
-
后台日志中可看到大量重复的 list_dir 调用记录,无报错信息;
-
推测该问题与 Blockcell 0.15 版和 DeepSeek-V4 的工具调用适配相关,未使用其他模型时无此现象;且该问题在通过 Dockerfile 编译部署的实例中稳定复现。
Request(需求)
希望官方修复以下两点:
-
修复后端 DSML 标记过滤逻辑,避免标记泄漏到 WebUI;
-
优化技能目录探测逻辑,避免 list_dir 方法无意义重复调用。
(注:文档部分内容可能由 AI 生成)
Blockcell WebUI 对话中频繁出现 DSML 工具调用标记及 list_dir 重复调用
Describe the bug(问题描述)
Blockcell WebUI 端对话过程中,频繁出现 DSML(DeepSeek Markup Language)工具调用相关标记,且重复触发
list\_dir方法调用,标记未被过滤直接显示在对话界面,影响正常使用体验。频繁出现的文本样式如下(可直接复制):
现象补充:每次发起对话、切换对话轮次时,该标记片段会重复出现,且
list\_dir调用针对两个固定路径反复触发,无终止迹象。Environment(环境信息)
Blockcell 版本:0.15 版(通过 Dockerfile 编译部署)
模型:DeepSeek-V4(启用工具调用模式)
部署方式:WebUI 端(本地部署,基于 Blockcell 0.15 版 Dockerfile 编译构建)
系统环境:Linux(用户目录为 /home/blockcell)
模型服务配置:stream=true、tool_choice=auto
Steps to Reproduce(复现步骤)
启动 Blockcell 服务及 WebUI 端;
在 WebUI 对话输入框中输入任意内容(如“你好”)并发送;
观察对话输出,可直接看到 DSML 标记及重复的 list_dir 调用内容;
切换对话轮次、刷新 WebUI 后,再次发送消息,现象重复出现。
Expected behavior(预期行为)
DSML 工具调用标记(<||DSML||...>)应被后端/前端过滤,不显示在 WebUI 对话界面;
list_dir 方法不应重复、无意义地调用,仅在必要时(如技能加载)触发一次;
对话界面仅显示模型正常的自然语言回复,无底层工具调用标记泄漏。
Actual behavior(实际行为)
DSML 工具调用标记未被过滤,直接透传到 WebUI 对话中,刷屏显示;
list_dir 方法反复调用,针对 /home/blockcell/.blockcell/workspace/skills 和 /home/blockcell/.blockcell/skills 两个路径重复触发,无终止;
标记显示杂乱,遮挡正常对话内容,影响使用体验。
Possible Root Cause(可能原因分析)
DSML 标记泄漏(核心原因):DeepSeek-V4 流式输出时,DSML 起止标记未被 Blockcell 后端完整过滤,分块解析过程中标记片段直接透传到前端;
技能目录循环探测:Blockcell 技能加载逻辑存在异常,模型每次对话都会自动扫描技能目录,若目录权限异常、不存在或技能损坏,会导致 list_dir 方法反复重试;
前端未做输出过滤:WebUI 前端未添加正则过滤逻辑,未对 DSML 标记块进行清除,导致原始标记直接显示。
Temporary Solution(临时解决方案)
以下方法可临时缓解问题,供开发者参考,期待官方修复根本问题:
前端过滤(最快见效):在 WebUI 前端代码中添加正则,移除所有 DSML 标记块,代码如下:
// 过滤所有 \<||DSML||\.\.\.\> 标签及内容 content = content\.replace\(/\<||DSML||\[\\s\\S\]\*?\<\\/||DSML||\>/g, \&\#39;\&\#39;\); // 兼容转义后的标记(若前端存在转义处理) content = content\.replace\(/\&lt;||DSML||\[\\s\\S\]\*?\&lt;\\/||DSML||\&gt;/g, \&\#39;\&\#39;\);修复技能目录异常:
`# 检查目录是否存在
ls -la /home/blockcell/.blockcell/workspace/skills
ls -la /home/blockcell/.blockcell/skills
# 创建缺失目录并授权
mkdir -p /home/blockcell/.blockcell/{workspace/,}skills
chmod -R 755 /home/blockcell/.blockcell
chown -R blockcell:blockcell /home/blockcell/.blockcell
# 清理损坏技能(删除目录下异常/空文件夹)
rm -rf /home/blockcell/.blockcell/workspace/skills/*[异常文件夹]
rm -rf /home/blockcell/.blockcell/skills/*[异常文件夹]`
后端临时配置:模型服务端添加 stop_sequences,截断 DSML 标记输出:
\{ \&\#34;stop\_sequences\&\#34;: \[\&\#34;\<||DSML||\&\#34;, \&\#34;\</||DSML||\&\#34;\] \}禁用自动技能探测(可选):修改 Blockcell 配置文件 config.toml,关闭启动时自动扫描技能目录:
\[agent\] auto\_scan\_skills = falseAdditional context(补充信息)
重启 Blockcell 服务(systemctl restart blockcell)后,现象仍会重复出现;
后台日志中可看到大量重复的 list_dir 调用记录,无报错信息;
推测该问题与 Blockcell 0.15 版和 DeepSeek-V4 的工具调用适配相关,未使用其他模型时无此现象;且该问题在通过 Dockerfile 编译部署的实例中稳定复现。
Request(需求)
希望官方修复以下两点:
修复后端 DSML 标记过滤逻辑,避免标记泄漏到 WebUI;
优化技能目录探测逻辑,避免 list_dir 方法无意义重复调用。