前言¶
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。
- 移除方式:移除操作需要手动编辑配置,不能通过插件自身卸载。