前言¶
DeepSeek Harness (DSH) 在处理本地模型推理时,可能会遇到模型思考时间过长或生成大文件(如 write 工具调用)导致连接中断的问题。这是因为 Node.js 内置的 fetch(DSH 模型适配器使用此接口)在服务器 300 秒内未发送响应头或未传输任何数据字节时会超时。DSH 本身没有针对这两个时机的配置项,导致默认 5 分钟后请求被切断。dsh-fetch-timeouts 插件通过提升 Node 进程的 HTTP 超时阈值,解决了这个问题。
这是什么¶
- 插件名称:
dsh-fetch-timeouts - 维护者:d3vmeh
- 核心价值:提升 Node.js 的 HTTP 超时设置,防止慢速本地模型在 5 分钟静默后被切断。
- 解决的问题:当服务器(如 Ollama、LM Studio)长时间不发送响应头或无数据传输时,Node 默认超时机制会终止请求。
- 许可证:MIT
核心功能¶
- 提升 Node.js 的 HTTP 超时设置(全局生效)。
- 将 Node 的全局 fetch 调度器交换为 undici Agent。
- 支持
HTTP_PROXY和HTTPS_PROXY环境变量。 - 通过
cordis.patch.yml配置文件进行调节。
安装与启用¶
安装插件需要使用官方命令:
dsh plugin --profile web add dsh-fetch-timeouts
安装完成后,默认会将超时时间提升至 30 分钟。如需自定义,需编辑配置文件 ~/.dsh/profiles/web/cordis.patch.yml:
- id: fetch-timeouts
config:
headersTimeoutMs: 3600000 # 允许在收到响应头前的等待时间;0 表示禁用
bodyTimeoutMs: 3600000 # 允许在接收数据块之间的等待时间;0 表示禁用
配置完成后,重启 dsh web。启动日志中会出现确认信息:
fetch-timeouts: headers 1800000 ms, body 1800000 ms (process-wide)
典型用法¶
除了配置插件的超时,还需要在 provider 路由中配置 watchdogs,否则 watchdogs 会先于 fetch 超时触发。在对应的 provider 配置中添加:
llm-pi-ai:
providers:
ollama:
streamIdleTimeoutMs: 1800000
timeoutMs: 1800000
适用场景与注意¶
- 适用场景:使用 Ollama、LM Studio 等本地模型服务器,且服务器在长时间推理或生成大文件时不会发送 keepalive ping(心跳包)的情况。llama.cpp 的
llama-server默认每 30 秒发送一次 ping,因此 llama.cpp 用户通常不需要此插件。 - 全局影响:插件效果是进程级别的。任何使用 Node 全局调度器的
fetch调用(包括模型调用、Web 搜索、HTTP MCP 服务器、云提供商)都会受影响。web_fetch不受影响,因为它使用的是自身构建的 per-request agent。 - 死连接检测:由于超时时间被拉长,真正的死连接需要更长时间才能被检测到。
- 版本要求:需要 Node.js >= 22.19.0 和 undici >= 8。
- 卸载行为:卸载插件后,会恢复为 undici 的默认调度器,而非 Node.js 原始的 fetch 实现。
- 长期规划:这是一个权宜之计,直到 DSH 原生暴露这些超时设置(pi-ai 依赖已经接受自定义
fetch)。
短结尾¶
dsh-fetch-timeouts 插件通过修改全局 fetch 调度器,为长时间运行的本地模型推理提供了必要的超时缓冲。在使用共享主机或需要严格超时控制的场景时,需谨慎评估其全局生效的特性。插件源码及详细说明可参考其 GitHub 仓库。