use-opencode-local-provider: Integrate OpenCode Zen as a local provider into dsh

前言

在 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 权限请求:oncealwaysreject(设为 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 中 typemodule

适用场景与注意

适合的场景:已经在本地使用 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 一并带给模型。装之前检查源码,配好 modelspermissionReply,重启 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye