前言¶
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)安裝。
- 將此文件夾作爲名爲
dsh-finish-reason-patch的包放置在 DSH profile 可解析的位置。通常做法是在<profile root>/node_modules/dsh-finish-reason-patch下創建一個指向該文件夾的 junction 或 symlink。 - 在 profile 根目錄的
package.json中,將該包添加到dsh.profile.bundles和dependencies。例如:
{
"dsh.profile.bundles": ["dsh-finish-reason-patch"],
"dependencies": {
"dsh-finish-reason-patch": "link:<絕對路徑>"
}
}
- 重啓 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。
- 移除方式:移除操作需要手動編輯配置,不能通過插件自身卸載。