Skip to content

Blockcell WebUI 对话中频繁出现 DSML 工具调用标记及 list_dir 重复调用 #73

Description

@ELE-Clouds

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(复现步骤)

  1. 启动 Blockcell 服务及 WebUI 端;

  2. 在 WebUI 对话输入框中输入任意内容(如“你好”)并发送;

  3. 观察对话输出,可直接看到 DSML 标记及重复的 list_dir 调用内容;

  4. 切换对话轮次、刷新 WebUI 后,再次发送消息,现象重复出现。

Expected behavior(预期行为)

  1. DSML 工具调用标记(&lt;||DSML||...&gt;)应被后端/前端过滤,不显示在 WebUI 对话界面;

  2. list_dir 方法不应重复、无意义地调用,仅在必要时(如技能加载)触发一次;

  3. 对话界面仅显示模型正常的自然语言回复,无底层工具调用标记泄漏。

Actual behavior(实际行为)

  1. DSML 工具调用标记未被过滤,直接透传到 WebUI 对话中,刷屏显示;

  2. list_dir 方法反复调用,针对 /home/blockcell/.blockcell/workspace/skills 和 /home/blockcell/.blockcell/skills 两个路径重复触发,无终止;

  3. 标记显示杂乱,遮挡正常对话内容,影响使用体验。

Possible Root Cause(可能原因分析)

  1. DSML 标记泄漏(核心原因):DeepSeek-V4 流式输出时,DSML 起止标记未被 Blockcell 后端完整过滤,分块解析过程中标记片段直接透传到前端;

  2. 技能目录循环探测:Blockcell 技能加载逻辑存在异常,模型每次对话都会自动扫描技能目录,若目录权限异常、不存在或技能损坏,会导致 list_dir 方法反复重试;

  3. 前端未做输出过滤:WebUI 前端未添加正则过滤逻辑,未对 DSML 标记块进行清除,导致原始标记直接显示。

Temporary Solution(临时解决方案)

以下方法可临时缓解问题,供开发者参考,期待官方修复根本问题:

  1. 前端过滤(最快见效):在 WebUI 前端代码中添加正则,移除所有 DSML 标记块,代码如下:
    // 过滤所有 \&lt;||DSML||\.\.\.\&gt; 标签及内容 content = content\.replace\(/\&lt;||DSML||\[\\s\\S\]\*?\&lt;\\/||DSML||\&gt;/g, \&\#39;\&\#39;\); // 兼容转义后的标记(若前端存在转义处理) content = content\.replace\(/\&amp;lt;||DSML||\[\\s\\S\]\*?\&amp;lt;\\/||DSML||\&amp;gt;/g, \&\#39;\&\#39;\);

  2. 修复技能目录异常:
    `# 检查目录是否存在
    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/*[异常文件夹]`

  1. 后端临时配置:模型服务端添加 stop_sequences,截断 DSML 标记输出:
    \{ \&\#34;stop\_sequences\&\#34;: \[\&\#34;\&lt;||DSML||\&\#34;, \&\#34;\&lt;/||DSML||\&\#34;\] \}

  2. 禁用自动技能探测(可选):修改 Blockcell 配置文件 config.toml,关闭启动时自动扫描技能目录:\[agent\] auto\_scan\_skills = false

Additional context(补充信息)

  • 重启 Blockcell 服务(systemctl restart blockcell)后,现象仍会重复出现;

  • 后台日志中可看到大量重复的 list_dir 调用记录,无报错信息;

  • 推测该问题与 Blockcell 0.15 版和 DeepSeek-V4 的工具调用适配相关,未使用其他模型时无此现象;且该问题在通过 Dockerfile 编译部署的实例中稳定复现。

Request(需求)

希望官方修复以下两点:

  1. 修复后端 DSML 标记过滤逻辑,避免标记泄漏到 WebUI;

  2. 优化技能目录探测逻辑,避免 list_dir 方法无意义重复调用。

(注:文档部分内容可能由 AI 生成)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions