1728 字
9 分钟

使用 opencode2api 反向代理 OpenCode Zen

gemini-aiAI 摘要

众所周知,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.14
x-opencode-client: cli
x-opencode-project: global
x-opencode-request: msg_0ada1b968001cxm5rgh28JxlDH
x-opencode-session: ses_f525e4699ffe5hmrr6t1FiPVca

不过,这一层也不是完全没有办法处理。request 和 session 都是在 OpenCode CLI 本地生成的,也可以通过 JS 脚本自动生成。

但没过几天,检测又升级了。

这次开始检查请求 Body,规则大致是:

  • "stream": true
  • tools 数组里必须存在 name=bash 的项,具体 schema 内容并不检查,可以最小化
  • tools 数量必须大于等于 2,第二个工具的名称可以是任意的

谁知没过多久,OpenCode 又进一步加入了客户端指纹检测,开始关注 TLS 握手行为,包括:

  • ClientHello 内容
  • 密码套件协商方式
  • 扩展处理顺序
  • 握手时序特征

也就是说,检测已经不再局限于 HTTP 请求本身,连 TLS 握手阶段的行为也可能成为判断请求来源的依据。

这样继续折腾下去,就会变成一个不断追着检测规则更新的过程。刚把 Header 补齐,对方开始检查 Body;刚处理完 Body,又开始关注 TLS 指纹。

所以与其一直研究怎么让我们的应用伪造 OpenCode 的请求,与检测规则对抗,不如换个思路:让 opencode2api 在中间做一层网关,负责把标准 API 请求转换成 OpenCode Zen 所需要的上游请求。

这也是我这次想介绍的项目:

jasonxu114514
/
opencode2api
Waiting for api.github.com...
00K
0K
0K
Waiting...

这是一个适用于 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

把这个 API Key 保存好,后面配置 opencode2api 时会用到。

配置 opencode2api#

然后回到 opencode2api 的控制台,点击左侧菜单的配置中心,进入配置页面。

配置中心

先找到服务与管理端。

认证 Key 首选 Tier

改为:

Zen(失败回退 Go)

API Listen

设置为:

0.0.0.0:8082

WebUI 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 的客户端或应用。

使用 opencode2api 反向代理 OpenCode Zen
https://blog.tianhw.top/posts/opencode2api/
作者
THW
发布于
2026-09-25