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 倉庫。

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

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

小夜