前言¶
在 DeepSeek Harness (DSH) 中,当模型调用 ask_user_question 工具时,循环会一直挂起,直到人类在 Web UI 中回答。该问题仅在浏览器接管 (ui-user-questions) 时渲染。如果标签页关闭、进入后台或连接中断,问题将永远不渲染。此时,会话状态将保持“进行中”且无超时,唯一的退出方式是手动停止,这会显示误导性的 ASK_ABORTED 错误。dsh-ask-user-timeout 插件通过为该工具提供有界生命周期,解决了这个问题。
插件简介¶
dsh-ask-user-timeout 是一个 Guard 插件,由 yeruizhi 维护。它通过监听 tools/execute 扩展点,为 ask_user_question 工具设定截止时间。当问题未渲染时,工具会返回 ASK_TIMEOUT 错误,而不是无限挂起。该插件不改变工具的模式、输出形状或语义,仅负责终止挂起。
安装¶
使用官方安装命令添加插件:
dsh plugin --profile web add git+https://github.com/yeruizhi/dsh-ask-user-timeout.git
安装后,重启 dsh web,然后硬刷新浏览器以应用包装器。插件将对安装后创建的会话中的 ask_user_question 调用生效。
配置¶
插件通过 timeoutMs 配置项控制超时时间,默认值为 600000(10 分钟)。
在 ~/.dsh/profiles/web/cordis.patch.yml 中添加以下配置:
- insert:
- id: ask-user-timeout
name: 'dsh-ask-user-timeout'
config:
timeoutMs: 300000
工作原理¶
- 监听
tools/execute扩展点(与官方timeout-policyguard 相同)。 - 仅包装名为
ask_user_question的工具,其他工具保持不变。 - 在分发期间,将
exec.signal替换为融合截止时间(fused deadline),执行完毕后恢复上游信号。 - 当截止时间到达时,将结果替换为
error.code = ASK_TIMEOUT,允许循环继续。 - 不改变工具的 schema、输出形状或语义。
适用范围与注意¶
这是一个 Guard 插件,旨在解决“挂起”问题,而非 Web UI 渲染问题的修复。如果问题未渲染且用户重新打开标签页,插件不会重新通知该问题。更深层的问题在 deepseek-ai/deepseek-harness discussion #2929 中被追踪。