dsh-opencode-go-proxy:在 DSH 内为本机 OpenCode Go 提供反代理

前言

在 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。

核心功能

  1. bundle 自动加载:通过 dsh.bundle.patch 与 cordis.patch.yml 插入宿主 Loader,装进 profile 后进入 dsh.profile.bundles,下次以该 profile 启动 dsh 时自动加载。
  2. webserver 模式(默认):反代理挂在 profile webserver 的前缀路径下(默认 /api/opencode-proxy/v1),客户端 baseURL 指向该路径即可,无需单独记第二个端口(端口随各 profile 的 webserver,例如 web 默认 3080、qq 默认 3220)。
  3. 路径映射:挂载前缀之后的路径映射回上游 API 根(默认 upstreamBasePath=/zen/go/v1)。例如 .../api/opencode-proxy/v1/responses 转发为 https://opencode.ai/zen/go/v1/responses;若剥离后的路径已带 upstreamBasePath 前缀则不重复叠加(幂等)。
  4. 鉴权与头注入:原样转发 Authorization;API Key 仍由环境变量(如 OC_GO_API_KEY)经客户端发出。代理侧补齐 OpenCode 会话/请求头并替换 User-Agent。
  5. standalone 模式(可选):无 webserver 或需要独立端口时,可监听默认 8787,客户端 baseURL 为 http://127.0.0.1:8787。
  6. 状态检查: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 指到挂载前缀:

  • web profile:http://127.0.0.1:3080/api/opencode-proxy/v1
  • qq profile: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 上运行;web profile 改插件后需重启 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 为准。

羽毛球分组比赛记分
小程序二维码

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

小夜