使用 opencode2api 反向代理 OpenCode Zen
众所周知,OpenCode 是一个开源的 AI 编程 Agent,它通过 OpenCode Zen 提供一些免费模型供用户使用。早些时候 OpenCode 甚至还提供过免费的 DeepSeek V4 Flash,一个 IP 一天的用量据说能达到 1 亿多 tokens。
当时我们甚至不需要使用 OpenCode 软件本身,可以直接调用 OpenCode Zen,把这些模型接入自己的应用。
不过,随着用户量增加,OpenCode 也开始逐步限制免费模型的使用。
最开始,它检查的是请求头,要求免费模型必须从 OpenCode 中发起请求。
这个限制其实并不难理解,但问题也很明显:OpenCode 本身是开源项目,对应的请求头可以直接从 GitHub 找到,而 HTTP 请求头本身也比较容易伪造。
直到最近再调用时,我突然遇到了这个错误:
HTTP 403
{"type":"error","error":{"type":"FreeTierError","message":"Error from provider (Console): OpenCode's free tier can only be used from within OpenCode"}}看来 OpenCode 又更新了检测方式。
抓包并简单折腾了一下之后发现,现在光伪造几个 Header 已经不够了,需要把完整的请求头带上。其中 x-opencode-request 和 x-opencode-session 是 OpenCode CLI 在本地计算出来的,随便乱填是不行的。
User-Agent: opencode/1.18.31 ai-sdk/provider-utils/4.0.40 runtime/bun/1.3.14x-opencode-client: clix-opencode-project: globalx-opencode-request: msg_0ada1b968001cxm5rgh28JxlDHx-opencode-session: ses_f525e4699ffe5hmrr6t1FiPVca不过,这一层也不是完全没有办法处理。request 和 session 都是在 OpenCode CLI 本地生成的,也可以通过 JS 脚本自动生成。
但没过几天,检测又升级了。
这次开始检查请求 Body,规则大致是:
"stream": truetools数组里必须存在name=bash的项,具体 schema 内容并不检查,可以最小化tools数量必须大于等于 2,第二个工具的名称可以是任意的
谁知没过多久,OpenCode 又进一步加入了客户端指纹检测,开始关注 TLS 握手行为,包括:
- ClientHello 内容
- 密码套件协商方式
- 扩展处理顺序
- 握手时序特征
也就是说,检测已经不再局限于 HTTP 请求本身,连 TLS 握手阶段的行为也可能成为判断请求来源的依据。
这样继续折腾下去,就会变成一个不断追着检测规则更新的过程。刚把 Header 补齐,对方开始检查 Body;刚处理完 Body,又开始关注 TLS 指纹。
所以与其一直研究怎么让我们的应用伪造 OpenCode 的请求,与检测规则对抗,不如换个思路:让 opencode2api 在中间做一层网关,负责把标准 API 请求转换成 OpenCode Zen 所需要的上游请求。
这也是我这次想介绍的项目:
这是一个适用于 OpenCode Zen 和 Zen Go 的 Go 网关,可以提供聊天完成、Responses 和 Human Message 等接口,并负责在不同协议之间进行转换,同时处理上游 Key 和代理配置。
简单来说,原本的思路是:
自己的应用 → 伪造 OpenCode 请求 → OpenCode Zen现在换成:
自己的应用 │ │ OpenAI / Anthropic 等标准 API 请求 ▼┌─────────────────┐│ opencode2api ││ ││ 协议转换/路由 ││ Key 池/代理池 │└────────┬────────┘ │ │ 按照 OpenCode Zen 的接口和协议发起请求 ▼ OpenCode Zen │ ▼ 模型换句话说,opencode2api 自己就是一个“中间人”。它并不直接提供模型,而是把 OpenCode Zen 的能力重新包装成兼容其他客户端的 API:
OpenAI 格式 ──┐ │Anthropic 格式 ─┼→ opencode2api → OpenCode Zen / Go │Responses 格式 ─┘如果把官方 OpenCode 客户端和 opencode2api 放在一起看,两条请求路径最终都会汇入 OpenCode Zen:
官方 OpenCode │ │ 原生 OpenCode 请求 ▼ OpenCode Zen │ ▼ 模型
自己的应用 │ │ OpenAI / Anthropic 请求 ▼ opencode2api │ │ 转换成上游请求 ▼ OpenCode Zen │ ▼ 模型这样就不需要让自己的应用直接适配 OpenCode Zen,也不需要一直跟着 OpenCode 的检测规则修改请求格式。
接下来我就实际折腾一下 opencode2api,教你如何部署、如何配置 OpenCode Zen,以及如何让自己的应用通过 OpenAI 兼容格式调用 OpenCode Zen。
部署 opencode2api
本次我使用 Docker Compose 来部署 opencode2api。
首先打开宝塔面板,进入 Docker,选择创建容器 → 手动创建,然后填写以下信息:

容器名称
opencode2api镜像
ghcr.io/jasonxu114514/opencode2api:latest端口我们先选择暴露端口,然后按照图中手动填写 8081 和 8082 端口,并勾选这两个端口的对外暴露。
全部输入完成后,点击右下角的创建按钮,等待镜像拉取和容器创建。
等到界面显示容器运行中后,我们就可以在浏览器中访问:
http://你的服务器IP:8081如果能够看到登录界面,就说明部署成功了。
修改默认密码
第一次登录使用默认账号密码:
用户名:admin密码:change-this-admin-password登录成功后,第一件事就是修改默认密码。
点击页面左侧的账号安全,进入下面这个页面:

输入自己的密码,点击保存即可。
保存之后重新登录一次。
获取 OpenCode Zen API Key
接下来开始配置 opencode2api。
首先打开 OpenCode Zen 官网,注册账号,然后进入控制台。
点击上方菜单的 Keys,进入 Keys 页面后,在页面下方点击 Add API Key。
随便填写一个名称,就可以获取我们需要的 API Key。

把这个 API Key 保存好,后面配置 opencode2api 时会用到。
配置 opencode2api
然后回到 opencode2api 的控制台,点击左侧菜单的配置中心,进入配置页面。

先找到服务与管理端。
认证 Key 首选 Tier
改为:
Zen(失败回退 Go)API Listen
设置为:
0.0.0.0:8082WebUI Listen
保持默认的:
0.0.0.0:8081然后继续向下滑动。
配置密钥
找到密钥与匿名通道。
在 Server Keys 中填写你自己调用 opencode2api 时使用的 Key。
然后在 Zen Keys 中填写刚才从 OpenCode Zen 获取的 API Key。
配置完成后继续滑动到页面最下方。

点击验证、保存并应用。
然后回到宝塔面板,点击容器的重启按钮,等待容器重启完成。
使用 OpenAI 兼容格式调用
容器重启完成之后,我们就可以通过下面这个地址调用 opencode2api:
http://你的服务器IP:8082/v1也就是说,后面的应用不需要直接对接 OpenCode Zen,而是把 opencode2api 当成一个 OpenAI 兼容 API 来使用。
整个请求链路就变成了:
你的应用 ↓http://你的服务器IP:8082/v1 ↓opencode2api ↓OpenCode Zen ↓模型到这里,opencode2api 的基础部署和 OpenCode Zen 配置就完成了。
后面就可以直接拿这个 OpenAI 兼容接口接入支持自定义 API Endpoint 的客户端或应用。