面向自定义网关(vLLM / LM Studio / 自托管代理)的 OpenAI-completions 兼容适配器:始终 role:"system"、按模型配置驱动思考、Qwen 式 response 切分,并支持视觉模型图片输入(单图 / 多图)。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-llm-openai-completions
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:drscrewdriver/dsh-llm-openai-completions
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
✅ 0.3.0 复活(2026-10-05)。 传输接管回归,带着 pi-ai 给不了的真功能:多模态真发(图片/音频/视频/PDF)+ 模态硬门禁、面向 dsh-promptbook 类消费方的
llmOpenaiCompletions提示词源口子、凭据服务密钥,以及0.1.0-rc.8–0.2.0-rc.2全 rc 动态兼容。旧的settings.get世代架构已退役——判定为enabled && providers.includes(route)(纯手工名单:逐路由勾选框就是真相),开关就在本插件自己的设置区。契约面:AGENTS.md。
定位:作为 dsh-thinking-levels 可挂接的短路后端复活——按路由 api 声明实装全部三种主流 API 格式(OpenAI Chat Completions · Anthropic Messages · OpenAI Responses),主要为小米 MiMo 多模态打造:音视频与 PDF 真发。
说明文档 / README languages
English · 中文 · 日本語 · 한국어 · Deutsch · Español · Français · Italiano · Русский
安装指南:EN · 中文 · 日本語 · 한국어 · DE · ES · FR · IT · RU — 更新日志
面向自定义网关的 OpenAI-completions 兼容传输接管(vLLM / LM Studio / 自托管 OpenAI 代理):插件对被接管路由短路 llm/stream 瀑布,用从不猜测的行为服务它们——数据面(baseURL / models / reasoningEfforts / compat / input)留在 llm-pi-ai,经 settings.describe() 实时读取。
system永远是role: "system"——自定义网关绝不收到developer,开启思考也不会再触发Unexpected message role400(pi-ai 的detectCompat对非标准 URL 默认supportsDeveloperRole: true,一旦模型带reasoningEfforts表就打挂所有自定义网关)。- 思考由模型的
compat.thinkingFormat驱动:- toggle 型模型(带
reasoningEfforts表、无supportsReasoningEffort)→ 恒发chat_template_kwargs.enable_thinking(+ preserve),无视配置格式——裸 vLLM 的 Qwen3 模板只认这个 qwen→ 顶层enable_thinking: boolean(不发reasoning_effort、不发预算)qwen-chat-template→chat_template_kwargs.enable_thinking(+ preserve)- effort 型 →
reasoning_effort透传(Qwen3.8 风格)
- toggle 型模型(带
- 接收侧拆分 Qwen3 风格
</think>内容(vLLM 把思考渲染进content、无reasoning_content字段)为 reasoning 块,并认reasoning_content/reasoning/reasoning_text三字段。 - 刻意不发
thinking_budget(避免截断意外)。
🎉 0.3.0 — 多模态真发 + 模态硬门禁
短路消费瀑布发生在宿主把 file 块投影成文本句柄之前,媒体以结构块抵达并直接编码上线——零宿主补丁、零句柄重建:
- 图片 →
image_urldata-URI 段(多图保序、文本按源顺序交错) - 音频 →
input_audio段(base64 + 格式) - 视频 →
video_urldata-URI 段(内联上限 20 MB) - PDF → OpenAI
file段 - 模态硬门禁:发送前对全量历史的每个媒体块按模型 llm-pi-ai
input声明逐块校验;未声明模态被大声拒绝(INVALID_REQUEST,指明模态名),而不是静默降级成文本。 - 一次性调用(
session-title)剥离媒体块且从不思考。 - 字节来自附件服务(
readImage/readFileStream);非视觉模型遇图依旧大声拒绝(UNSUPPORTED_CONTENT)。
🎉 0.3.0 — llmOpenaiCompletions 提示词源口子
ctx.provide("llmOpenaiCompletions", { listHostedModels, registerPromptSource })——与 dsh-llm-mimo 的 llmMimo 同款契约,面向 dsh-promptbook 类消费方:按 (provider, model) 替换实际下发的系统提示词与工具描述,确定性纯函数(缓存安全)、只改文本(绝不碰 name/parameters)、无注册源零行为。作用域保证:只在被接管路由的 dispatch 内生效。完整契约:AGENTS.md §1。
三种线缆面(按路由 api)
| 面 | 端点 | 认证 | 思考 | 模态 |
|---|---|---|---|---|
openai-completions(缺省) |
{base}/chat/completions |
Bearer | thinkingFormat 矩阵 | 图片/音频/视频/PDF |
anthropic-messages |
{base}/v1/messages |
x-api-key + 版本头 |
off/一次性 → disabled | 仅图片 |
openai-responses |
{base}/responses |
Bearer | reasoning.effort(诚实折叠) |
图片/音频/视频/PDF |
- 每面:
max_tokens= 请求值 → 模型行 → 路由默认 → 8192;leading system 消息提取进各面的 system 通道并从消息列表剥离。 - Anthropic 配对纪律:tool_use/tool_result 必须配对(破碎历史 = 大声
INVALID_REQUEST);助手思考不回放(harness 无签名字段——严格弱于 chat 面)。 - Responses 边界:
stop丢弃(无 Responses 拼写);reasoning 档位诚实折叠;真机探针校准待对 MiMo 端点执行。
接管判定(单一事实源)
takeover(route) = section.enabled === true
&& section.providers.includes(route)
# ~/.dsh/profiles/web/cordis.patch.yml(或 设置 → 插件 → dsh-llm-openai-completions)
llm-openai-completions:
enabled: true
providers: # 接管名单——唯一真相(见下)
- local-35b
- 开关与接管名单在本插件自己的设置区(
.volatile()——运行时可改,宿主自动生成表单)。 - dsh-thinking-levels 驱动两个字段:它的
takeover开关把{enabled}镜像写进本 section,其模型面板的逐路由接管勾选框直接写providers——勾选框就是真相,dispatch、listHostedModels与控制层门控读的是同一份集合。 - 关掉开关(或卸载插件)即原样回落 pi-ai——没有需要回退的 adapter 注册。
- 你的 llm-pi-ai 配置原样保留(一份共享配置;本适配器只读——字段全表:docs/settings-spec.md,接管契约:docs/takeover-spec.md):
llm-pi-ai:
providers:
local-35b:
api: openai-completions
baseURL: http://192.168.100.242:8200/v1
models:
- id: Qwen3.6-35B-A3B
reasoningEfforts: { off: null, high: 'high' }
compat:
thinkingFormat: qwen # 只发 enable_thinking,不发 reasoning_effort
预览
实况截图——与 dsh-thinking-levels 联动:自定义模型的"可思考"档位下拉(默认/关/开),演示能力检测 → 接管链路:
安装
宿主兼容:0.1.0-rc.8 至 0.2.0-rc.2 的每个 rc,代码内按版本条件兼容(形状检测的 settings 面、ToolCallId/CallId shim、凭据 credentials → 启动环境 → process.env 三级链)。全部安装途径见安装指南:
# npm(推荐)
dsh plugin --profile web add dsh-llm-openai-completions -w
# 本地 tgz
dsh plugin --profile web add /路径/dsh-llm-openai-completions-0.3.0.tgz -w
dsh web
已知边界
- PDF 支持因端点而异(MiMo chat 直接 400,部分中转接受)——
input声明是能力声明;勾选pdf前先确认你的端点。 - 非媒体文件附件(如
.txt)没有跨网关线缆形状;被接管路由上退化为文本占位(内容仍可经文件工具读取)。 - 不发
thinking_budget(刻意)。 - 思考档位选择器仍来自模型推理元数据(llm-pi-ai + dsh-thinking-levels);本传输只管线缆行为。
- 安装后重启
dsh web;接管监听在 boot 时组合。
开发
npm install
npm run typecheck # tsc --noEmit
npm test # vitest(config / identify / serialize / sse / translate / prompt-source / version-conditional)
npm run build # tsc → lib/
node scripts/audit-host-faces.mjs # 15-rc 依赖面审计
上游建议
本插件同时是 llm-pi-ai / pi-ai 兼容缺口的参考实现:自定义 URL 应默认 supportsDeveloperRole: false、接收侧应拆分 </think> 内容、compat 应为真正支持它的网关暴露 supportsDeveloperRole——宿主投影层也可以长出与本插件按路由施加的同等的能力感知 file 块门禁。
链接
同类插件
corrinehu/dsh-workbuddy-connect★ 970
将 WorkBuddy 桌面 App 包含的模型自动接入 DeepSeek Harness,在 DSH 对话窗口里零配置使用。
V1ki/dsh-plugin-subscriptions★ 469
把 ChatGPT(Codex)、Claude、Grok 订阅当作 DeepSeek Harness 的 LLM 提供方:设置页登录、模型目录、用量展示,以及 image_generate、video_generate 与 x_search 工具。
Mars-Sea/dsh-commandcode-provider★ 393
非官方 Command Code 模型接入插件:注册 `commandcode` 路由,带实时模型目录与推理强度支持。
cv-superding/dsh-deepseek-web-login★ 274
新增 deepseek-web provider,把 chat.deepseek.com 网页端模型接入 DSH:浏览器登录抓取、PoW 请求签名、SSE 流式传输与基于提示词的工具调用。
FishBottle7/opencode2dsh★ 212
将 OpenCode Zen 免费模型接入 DeepSeek Harness,无需 API Key。
WSL043/dsh-codex-subscription★ 179
通过 ChatGPT OAuth 在 DSH 中使用 Codex 模型,提供订阅联网搜索、额度与安全重置、图片工具、高速模式和模型感知上下文;无需 API Key 或 Codex CLI。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。