前言¶
在 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