前言¶
在 DSH 里接入 OpenCode Go 时,客户端往往不能「裸连」上游:请求必须带上 OpenCode 约定的会话与客户端相关头,否则上游会拒绝或行为异常。常见做法是单独跑一个本地反代理脚本,手动注入头、再改模型配置里的 baseURL。@wjj-8283/dsh-opencode-go-proxy 把同类逻辑做成 DSH 插件:随 dsh 启动挂到 profile 的 webserver(或与 DSH 共用端口),转发到 OpenCode Go 上游并在发包前补齐所需头。下面介绍它是什么、如何安装,以及如何接到 DSH 的模型设置里。
这是什么¶
维护者 wjj-8283 在 GitHub 发布 wjj-8283/dsh-opencode-go-proxy,社区目录分类为 联网工具。插件定位是:本机 OpenCode Go 反代理——dsh 启动时自动把反代理挂到 DSH 自己的 webserver 上(与 DSH 共用端口),默认转发到 https://opencode.ai,并在转发前注入 x-opencode-session、x-opencode-request、x-opencode-client、x-opencode-project 以及符合 OpenCode 要求的 User-Agent。
实现上由仓库下的 opencode-go-proxy-win 脚本改造:opencode-go-proxy.mjs 顶层启动改为可导入的 proxy.js;原 opencode-go-proxy-start-minimal.bat 改为插件 apply 在 dsh 启动时自动拉起;停止方式从手动 Ctrl+C 改为随 dsh 应用卸载自动关闭。包名 @wjj-8283/dsh-opencode-go-proxy,版本 0.1.0,许可证 MIT,运行环境要求 Node.js >= 22。
核心功能¶
- bundle 自动加载:通过
dsh.bundle.patch与cordis.patch.yml插入宿主 Loader,装进 profile 后进入dsh.profile.bundles,下次以该 profile 启动dsh时自动加载。 - webserver 模式(默认):反代理挂在 profile webserver 的前缀路径下(默认
/api/opencode-proxy/v1),客户端baseURL指向该路径即可,无需单独记第二个端口(端口随各 profile 的 webserver,例如web默认 3080、qq默认 3220)。 - 路径映射:挂载前缀之后的路径映射回上游 API 根(默认
upstreamBasePath=/zen/go/v1)。例如.../api/opencode-proxy/v1/responses转发为https://opencode.ai/zen/go/v1/responses;若剥离后的路径已带upstreamBasePath前缀则不重复叠加(幂等)。 - 鉴权与头注入:原样转发
Authorization;API Key 仍由环境变量(如OC_GO_API_KEY)经客户端发出。代理侧补齐 OpenCode 会话/请求头并替换User-Agent。 - standalone 模式(可选):无 webserver 或需要独立端口时,可监听默认 8787,客户端
baseURL为http://127.0.0.1:8787。 - 状态检查:webserver 模式下经 profile 的 webserver 访问
GET /api/opencode-proxy/status。
安装与启用¶
插件是 bundle,需指定本地路径装进某个 profile(路径按你本机 clone 或下载后的目录替换,以下为 README 原文示例):
dsh plugin --profile web add /Users/wjj/repos/dsh/opencode-go-proxy-plugin
dsh plugin --profile qq add /Users/wjj/repos/dsh/opencode-go-proxy-plugin
装进 profile 后,下次执行 dsh --profile <name> 启动时会自动加载。若修改了插件源码,需要重启对应 profile 的 dsh 进程(例如 web profile 需重启 dsh web),才会从旧行为切到 webserver 挂载地址。
典型用法¶
客户端 baseURL(默认 webserver 模式)¶
反代理与 DSH webserver 共用端口,只需把 OpenCode Go 客户端或 DSH provider 的 baseURL 指到挂载前缀:
webprofile:http://127.0.0.1:3080/api/opencode-proxy/v1qqprofile:http://127.0.0.1:3220/api/opencode-proxy/v1
接入 DSH 模型设置¶
在 DSH 的 llm-pi-ai.providers 中,将 OpenCode Go provider(示例名 oc-go)的 baseURL 从直连改为代理地址。直连示例:
oc-go:
displayName: OpenCode Go
apiKeyEnv: OC_GO_API_KEY
api: openai-responses
baseURL: https://opencode.ai/zen/go/v1 # 原来是直连
reasoning: high
models: [...]
以 web profile 为例,改为走代理:
oc-go:
displayName: OpenCode Go
apiKeyEnv: OC_GO_API_KEY
api: openai-responses
baseURL: http://127.0.0.1:3080/api/opencode-proxy/v1 # 改成代理地址
reasoning: high
models: [...]
说明:
- 仅影响配置了
oc-go的 provider,不会改变其他默认模型(如agent-default-model仍为deepseek-official的配置不受影响)。 - 若某会话要用 OpenCode,将会话或全局默认模型设为
oc-go及具体 model(如muse-spark-1.2-contributor)。 - 代理须已在该 profile 的 webserver 上运行;
webprofile 改插件后需重启dsh web,才会使用3080/api/opencode-proxy/v1而非旧独立 8787 等方式。
可选 standalone¶
settings 中把 mode 设为 standalone,则用 port(默认 8787)起独立服务,客户端使用:
http://127.0.0.1:8787
配置项¶
settings 命名空间为 dsh-opencode-go-proxy:
| 配置项 | 默认值 | 含义 |
|---|---|---|
enabled |
true |
启动即拉起 |
mode |
webserver |
webserver(挂 DSH webserver 前缀)或 standalone(独立端口) |
mountPath |
/api/opencode-proxy/v1 |
webserver 模式挂载前缀 |
upstreamBasePath |
/zen/go/v1 |
映射到上游的真实 API 根(幂等叠加) |
port |
8787 |
standalone 模式监听端口 |
upstreamHost |
opencode.ai |
上游主机 |
upstreamProto |
https |
上游协议 |
opencodeUa |
opencode/1.18.29 cli |
注入的 User-Agent |
环境变量 PROXY_PORT、UPSTREAM_HOST、UPSTREAM_PROTO、UPSTREAM_PORT、OPENCODE_UA 仅在对应 settings 未设置时作为兜底。
适用场景与注意¶
适合谁:已在 DSH 中使用或计划使用 OpenCode Go(openai-responses 等),且需要在本机统一注入 OpenCode 请求头、又不想长期单独维护 bat/mjs 启动脚本的开发者。
权限与安全:插件以当前 dsh 进程权限 运行,会转发携带 API Key 的请求到配置的上游。安装前应阅读仓库源码与 MIT 许可证,确认 upstream 与挂载路径符合你的环境策略。社区目录 SkillHub 插件页 与 GitHub 仓库相互独立,并非 DeepSeek / 幻方官方应用商店;DSH 生态强调「一切皆插件」,目录站点为社区维护。
依赖:需 Node.js 22+;默认上游为 https://opencode.ai,可通过 settings 或环境变量调整 host/proto。
结尾¶
dsh-opencode-go-proxy 把 OpenCode Go 所需的本地反代收进 DSH 生命周期:默认与 profile webserver 同端口,改一行 provider baseURL 即可从直连切到本机代理,并自动处理 OpenCode 头与 User-Agent。进一步细节以仓库 README 为准。