前言¶
在 dsh 里想用 OpenCode Zen 的模型,公开的 /zen/v1 通道会消耗公开配额。另一条路是本地跑 opencode serve:opencode 的客户端通道(opencode.ai/zen/go/v1)不需要 OpenCode API key,也不占公开配额,但这条路默认接不进 dsh 的 provider 体系。
下面介绍的 use-opencode-local-provider 做的就是这个接线工作:在本地起一个 OpenAI 兼容桥接,把 dsh 的 chat completions 请求转换成 opencode serve 会话,让 OpenCode Zen 以 opencode-local 的名字出现在 dsh 的聊天 UI 里。
这是什么¶
use-opencode-local-provider 是一个 dsh 插件,由 Payel-git-ol 维护,许可证为 MIT,package.json 显示当前版本 0.2.0,入口 ./lib/index.js。一句话定位:把本地的 opencode serve(走 OpenCode Zen 客户端通道)包装成 dsh 里的一个 provider。目录页将它归在「模型推理」类下。
DSH 的理念是「一切皆插件」,provider 接入这类事正好可以交给插件完成。
工作原理¶
插件加载时做三件事:
1、确保 opencode serve 实例在运行,没有就自动启动;
2、启动一个小型 OpenAI 兼容桥接,提供 /v1/chat/completions 和 /v1/models 两个端点,把每个请求通过 opencode 的本地 HTTP API 转换成一个 opencode serve 会话;
3、在 llm-pi-ai 设置区注册 opencode-local provider 路由,之后它会自动出现在 dsh UI 里。
请求流使用 opencode 客户端通道 opencode.ai/zen/go/v1,不需要 OpenCode API key,也不消耗公开 /zen/v1 配额。
安装与启用¶
先安装插件。进入 profile 目录(~/.dsh/profiles/<profile>)执行:
dsh plugin --profile <profile> add use-opencode-local-provider
再把插件写进 cordis.patch.yml,并指定要暴露给 dsh 的模型:
- entry: use-opencode-local-provider
config:
models: [deepseek-v4-flash-free, hy3-free]
重启 dsh 进程。经过上面的步骤,opencode-local provider 会出现在聊天 UI 中。如果不配置 models,默认暴露完整的 OpenCode Zen 目录。
配置项¶
插件的可配置项及默认值如下:
| key | 默认值 | 说明 |
|---|---|---|
opencodeBin |
opencode |
opencode 可执行文件路径 |
serverHost |
127.0.0.1 |
opencode serve 实例的主机 |
serverPort |
17655 |
opencode serve 实例的端口 |
bridgeHost |
127.0.0.1 |
本地 OpenAI 兼容 API 的绑定主机 |
bridgePort |
17656 |
本地 OpenAI 兼容 API 的绑定端口 |
providerId |
opencode-local |
在 llm-pi-ai 设置中的路由名 |
providerName |
OpenCode Local |
在 dsh UI 中的显示名 |
apiKeyEnv |
OPENCODE_API_KEY |
dsh 用作 provider 凭据的环境变量名(桥接会忽略它;pi-ai 仍要求一份凭据) |
models |
完整 OpenCode Zen 目录 | 暴露给 dsh 的模型 id |
directory |
process.cwd() |
opencode 会话的工作目录 |
streamTimeoutMs |
600000 |
模型完成(含多步工具运行)的最长等待时间(毫秒) |
permissionReply |
once |
自动应答 opencode 权限请求:once、always 或 reject(设为 false 则从不自动应答) |
几个容易踩的点:
apiKeyEnv:请求流本身不需要 OpenCode API key,桥接会忽略这个变量里的值,但 pi-ai 仍然要求 provider 有一份凭据,所以这个环境变量名要保留。permissionReply:默认once,会自动应答 opencode 的权限请求。设为false时不自动应答,运行会等待手动响应或直到超时。streamTimeoutMs:默认 600000 毫秒,覆盖模型完成的全过程,包括多步工具运行,跑长任务时要留意。
工具与 MCP¶
这是这个插件比较特别的部分。桥接让模型可以使用 opencode 自带的工具,包括连接到 opencode 的 MCP 服务器。工具调用由 opencode 的 agent 在 opencode 会话内执行,带着它自己的沙箱和权限规则;桥接只负责让运行继续下去,最后返回答案。待处理的权限请求会按 permissionReply 的配置自动应答。
对 dsh 的 agent 来说,这些工具是不可见的:dsh 看到的只是一个 chat completions 端点,无法规划或观察工具调用,什么时候用工具由模型自己决定。如果流程依赖 dsh 侧感知和编排工具调用,这一点要先想清楚。
本地开发¶
想在本地跑一下源码,两步:
npm install
node -e "import('./lib/index.js').then(m => console.log(Object.keys(m)))"
第二条命令加载 ./lib/index.js 并打印导出的模块名,用来确认入口可用。package.json 中 type 为 module。
适用场景与注意¶
适合的场景:已经在本地使用 opencode,想在 dsh 里直接调用 OpenCode Zen 的模型,同时希望模型在会话内能用上 opencode 的工具和 MCP 服务器,并且不想消耗公开 /zen/v1 配额。
使用前注意:
1、插件以当前 dsh 进程的权限运行,安装前建议先读一遍源码并确认许可证(MIT)符合你的要求。
2、工具调用对 dsh 不可见,dsh 只能看到 chat completions 端点,需要 dsh 侧规划或观察工具调用的场景不适合用它。
3、permissionReply 设为 false 时,运行会等待手动响应或超时;长任务要配合 streamTimeoutMs 的值一起考虑。
4、opencode serve 与桥接默认绑定 127.0.0.1,端口分别为 17655 和 17656,与本机其他服务冲突时可在配置里调整。
小结¶
use-opencode-local-provider 用一个小桥接把本地的 opencode serve 接进 dsh:不需要 OpenCode API key,不占公开 /zen/v1 配额,还把 opencode 的工具和 MCP 一并带给模型。装之前检查源码,配好 models 和 permissionReply,重启 dsh 就能在 UI 里直接用。
插件收录在社区目录(独立站点,与 DeepSeek、幻方无官方从属关系):
- 目录页:https://www.skillhub.cn/plugins/Payel-git-ol/use-opencode-local-provider
- GitHub 仓库:https://github.com/Payel-git-ol/use-opencode-local-provider