跳到正文
Petrichor's Blog
返回

OpenCode开启自定义Provider的WebScoket

阅读 ...

目录

目录

前言

OpenCode作为开源agent支持自定义模型、并原生适配几乎所有模型厂商,subagent又做的很好,因此是博主使用最频繁的agent之一(另一个是codex)。最近gpt-5.6系列取消5h限额后速度很慢,于是一直沉迷于使用opencode做多模型编排:

image1

比如这里使用gpt-5.6-sol high做主会话模型进行任务编排,调研、实施、检查派发子代理使用grok-4.5,这样会快很多,上下文也会更加干净,能有效保证模型注意力,并且效果也更好。

image2

但是OpenCode自定义provider时并不支持websocket开关,默认通过 HTTP SSE 调用模型。不过对于完全反代 Codex Responses API 的服务,可以复用OpenCode 内置的 Codex WebSocket 适配器,让主对话请求通过 WebSocket连接上游。

Tip

你的自定义Provider要完全兼容 OpenAI Responses WebSocket 协议,比如我这里用的就是自己的Sub2API反代,配置时也打开了WS协议。

操作

很简单,最关键的配置不是显示名称,而是 provider ID 必须使用 openai,不能使用自定义名,因为内置 Codex 插件只绑定 providerID = “openai”。显示名称可以继续写成 Sub2API 或其他自定义名称。

同时,SDK 包必须是:

"npm": "@ai-sdk/openai"

不要使用:

"npm": "@ai-sdk/openai-compatible"

后者走的是 Chat Completions 兼容路径,默认使用 /chat/completions 和 SSE,无法触发 Codex Responses WebSocket 适配。

示例配置

注意将下方高亮内容改为你自己的

{
  "$schema": "https://opencode.ai/config.json",
  "agent": {},
  "autoupdate": false,
  "small_model": "openai/gpt-5.4-mini",
  "mcp": {},
  "provider": {
    "openai": {
      "models": {
        "gpt-5.6-sol": {
          "name": "gpt-5.6-sol",
          "limit": {
            "context": 353000,
            "output": 64000
          },
          "variants": {
            "low": {
              "reasoningEffort": "low"
            },
            "medium": {
              "reasoningEffort": "medium"
            },
            "high": {
              "reasoningEffort": "high"
            },
            "xhigh": {
              "reasoningEffort": "xhigh"
            },
            "max": {
              "reasoningEffort": "max"
            },
            "ultra": {
              "reasoningEffort": "ultra"
            }
          }
        },
        "gpt-5.6-terra": {
          "name": "gpt-5.6-terra",
          "limit": {
            "context": 353000,
            "output": 64000
          },
          "variants": {
            "low": {
              "reasoningEffort": "low"
            },
            "medium": {
              "reasoningEffort": "medium"
            },
            "high": {
              "reasoningEffort": "high"
            },
            "xhigh": {
              "reasoningEffort": "xhigh"
            },
            "max": {
              "reasoningEffort": "max"
            },
            "ultra": {
              "reasoningEffort": "ultra"
            }
          }
        },
        "gpt-5.6-luna": {
          "name": "gpt-5.6-luna",
          "limit": {
            "context": 353000,
            "output": 64000
          },
          "variants": {
            "low": {
              "reasoningEffort": "low"
            },
            "medium": {
              "reasoningEffort": "medium"
            },
            "high": {
              "reasoningEffort": "high"
            },
            "xhigh": {
              "reasoningEffort": "xhigh"
            },
            "max": {
              "reasoningEffort": "max"
            },
            "ultra": {
              "reasoningEffort": "ultra"
            }
          }
        },

      "name": "Sub2API",
      "npm": "@ai-sdk/openai",
      "options": {
        "apiKey": "你的api key",
        "baseURL": "https://sub.telyra.top/v1"
      }
    }
  },
  "tools": {
    "webfetch": true
  }
}
~/.opencode/opencode.json
Warning

OpenCode 创建新会话时,会先发送一次标题生成请求。Codex WebSocket 插件会主动让 title请求走 HTTP SSE,这时候你必须配置一个”small_model”,如上方绿色高亮。否则会默认调用gpt-5.4-nano,如果失败,后续主模型会正常对话但是无法走WS。

然后显式设置环境变量:

export OPENCODE_EXPERIMENTAL_WEBSOCKETS=true

此时启动opencode才会开启WebSocket。

然后测试成功:

image3

可以看到如上面所说title模型走的流式,但不影响主模型走WS

踩坑

如果本机之前保存过 OpenAI OAuth 凭据,可能会出现:

Token refresh failed: 403

可以先删除:

opencode auth logout openai

否则 OpenCode 可能优先读取:

~/.local/share/opencode/auth.json

而不是使用配置文件里的 API Key。

对于Windows桌面版用户,只按照上面配置时,API Key只写在上述配置文件的形式内,那OpenCode 本地凭据库里没有 openai 条目,内置插件可能不会调用 auth loader,WebSocket fetch 也就不会安装。Issue #29843 · anomalyco/opencode

你需要在设置-提供商-查看更多提供商这里,再一次填入你的上游密钥(和配置文件一样即可)。

image4

此时发送对话,测试成功走WS:

image5

分享这篇文章:

上一篇
FastCtx:Codex Windows增强工具
下一篇
giffgaff验证码转发