dsh-finish-reason-patch:兼容 OpenAI 兼容提供商的無終端 finish_reason 流

前言

DSH 在處理智能體回合時,通過 @earendil-works/pi-ai 路由 OpenAI 兼容提供商。當流式響應結束且未包含終端 finish_reason 時,適配器會拋出 Stream ended without finish_reason 錯誤,導致本應正常的回合被中止。其他智能體(如 Codex)通常將流結束視爲響應結束。該插件通過重寫錯誤完成狀態,使 DSH 能夠兼容此類網關行爲。

插件介紹

這是一個 DSH 插件,由 Canson666 維護,屬於模型推理類目。它解決的核心問題是:當 OpenAI 兼容模型(GPT 家族、網關、代理)輸出完整內容但未返回終端 finish_reason 時,阻止智能體回合被錯誤中止。

核心功能

該插件通過鉤住 llm/stream 流水線工作:
* 重寫錯誤完成爲正常停止:當檢測到終端 finish 爲錯誤類型(finish {kind:'error', code:'TRANSPORT'})時,將其重寫爲正常的 stop 完成(或 tool-calls,如果已傳遞工具調用增量)。
* 兼容空響應:接受網關報告 outputTokens: 0 且無 finish_reason 的空響應,避免重試循環。
* 保留其他錯誤處理:所有其他錯誤完成(傳輸重置、速率限制、HTTP 錯誤)保持原樣,以便現有的重試策略仍然有效。

安裝與啓用

插件不提供命令行安裝命令,需手動配置。推薦作爲持久化配置包(Profile Bundle)安裝。

  1. 將此文件夾作爲名爲 dsh-finish-reason-patch 的包放置在 DSH profile 可解析的位置。通常做法是在 <profile root>/node_modules/dsh-finish-reason-patch 下創建一個指向該文件夾的 junction 或 symlink。
  2. 在 profile 根目錄的 package.json 中,將該包添加到 dsh.profile.bundles 和 dependencies。例如:
   {
     "dsh.profile.bundles": ["dsh-finish-reason-patch"],
     "dependencies": {
       "dsh-finish-reason-patch": "link:<絕對路徑>"
     }
   }
  1. 重啓 DSH。插件會在啓動時自動加載。

驗證與使用

  • 邏輯自測:運行自測腳本,無需網絡:
   node selftest.mjs
  • 實際場景:與 GPT 類模型運行正常對話。以前中止的回合現在應該完成,並會看到日誌:
    [finish-reason-patch] provider finished without finish_reason -> mapped to "stop"

移除

若需移除插件,需手動編輯 profile 的 package.json(移除 dsh.profile.bundles 中的條目和 dependencies 中的依賴),刪除 <profile root>/node_modules/dsh-finish-reason-patch 的 junction,然後重啓 DSH。無需修改 DSH 內部文件。

注意事項

  • 許可證:MIT。
  • 運行環境:插件以當前 DSH 進程權限運行。
  • 依賴:需要 Node.js >= 20.0.0。
  • 移除方式:移除操作需要手動編輯配置,不能通過插件自身卸載。
羽毛球分组比赛记分
小程序二维码

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

小夜