dsh-fetch-timeouts: 提升 DeepSeek Harness 的 HTTP 超时设置

前言

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 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜