🚫 本仓库已停止维护,建议使用 zhuweiyou/codearts2api
OpenCode 免费模型的 OpenAI 兼容代理,纯 Go 实现,支持 SSE 流式,可部署到 Vercel、Docker 或本地。
flowchart TD
client["客户端<br/>Claude Code / Codex / DSH 等"]
gateway["聚合网关<br/>CLIProxyAPI / SUB2API / NEWAPI"]
a["oc2api 实例 A<br/>出口 IP 1"]
b["oc2api 实例 B<br/>出口 IP 2"]
c["oc2api 实例 C<br/>出口 IP 3"]
zen["OpenCode Zen<br/>免费模型"]
client --> gateway
gateway -->|轮询 / 负载| a
gateway -->|轮询 / 负载| b
gateway -->|轮询 / 负载| c
a --> zen
b --> zen
c --> zen
免费额度按出口网络计量。把多个实例填进 router-for-me/CLIProxyAPI、
Wei-Shaw/sub2api、QuantumNous/new-api
做轮询,就能把额度摊到多个出口上。用每个实例的 /ip 核对出口是否真的不同。
一键部署:
手动部署:
- Fork 本仓库到你的 GitHub
- 打开 Vercel Dashboard,点击 Add New > Project
- 选择你 Fork 的仓库,点击 Import
- 在 Environment Variables 中添加:
API_KEY— API 密钥(留空则匿名访问)DEBUG— 设为true开启调试日志(可选)
- 点击 Deploy,等待部署完成
部署完成后会得到一个 https://<项目名>.vercel.app 的域名。
构建阶段会自动下载 Go 工具链并交叉编译;流式请求由 api/index.js 薄层转发,业务逻辑在 Go 二进制里。
Vercel 版用 -tags nomihomo 构建,不打包 mihomo 内核(约 8 MB),只能使用纯文本 / URI /
base64 里的 http、socks5 代理;Clash 多协议订阅需要 Docker 或本地版本。
你也可以 Fork 后部署多个 Vercel Project 做轮询、负载分摊;多个项目不保证出口 IP 不同,
需通过各自实例的 /ip 核对。
拉取镜像
现成镜像在 ghcr.io/zhuweiyou/oc2api:
docker pull ghcr.io/zhuweiyou/oc2api:latest
docker run -d --name oc2api --restart unless-stopped \
-p 8080:8080 \
-e API_KEY=your-key \
ghcr.io/zhuweiyou/oc2api:latestlatest 跟着最新版本走;要固定版本就用具体的版本 tag。
容器监听 PORT,默认 8080。镜像基于 scratch,里面只有静态二进制和 CA 证书。
当前镜像带 mihomo 内核(约 47 MB);想要轻量镜像可构建时加
--build-arg GO_TAGS=nomihomo(约 9 MB,仅 http/socks5)。
镜像里的版本号由构建参数注入:--build-arg VERSION=4.5.0,不传则为 dev(/health 可见)。
官方 CI 构建时:tag 发布用 4.5.0,其余(main/latest、PR)用快照号 4.4.0-SNAPSHOT-<sha>。
云函数环境建议把超时调到 300 秒,否则长回答的流式响应会被提前截断。
本地构建
镜像定义与编排文件在 docker/:
cd docker && docker compose up -d --build要求 Go 1.24 或更高版本。
go run ./cmd/oc2api # 默认 :8080
API_KEY=your-key PORT=8080 go run ./cmd/oc2apiPORT:监听端口,默认8080API_KEY:请求鉴权,留空则匿名ZEN_API_BASE_URL:上游站点根地址,默认https://opencode.ai;接口路径由程序拼接, 自建中继只填根地址即可ZEN_CONNECT_TIMEOUT_MS:建连、TLS 握手与等响应头的超时,默认60000,允许1–600000DEBUG:设为true输出调试日志- 代理订阅相关环境变量(
PROXY_*)见下方「代理订阅与节点池」。
健康检查:
curl http://localhost:8080/healthDocker 部署和本地运行都适用:这两种构建内置 mihomo 内核,可以把一个代理订阅转成程序内的节点池——
启动时即拉取订阅并开始健康探测,之后按 PROXY_STRATEGY 选节点(默认 sticky 固定一个用到不可用,
round_robin 则每次轮询),并定时刷新订阅、失败自动换下一个。
订阅格式不限于 Clash:支持 Clash / Mihomo 的 YAML(proxies:)、纯文本 IP:PORT[:USER:PASS]、
http:// / socks5:// 等 URI 行、base64 包裹;其中 Clash YAML 的多协议节点
(ss / vmess / vless / trojan / hysteria2 等)由内置 mihomo 解析并拨号。
Vercel 函数版为了控制包体积不含内核,限制见 Vercel 部署说明与 AGENTS.md。
| 变量 | 默认 | 说明 |
|---|---|---|
PROXY_SUBSCRIPTION_URL |
空(直连) | 订阅地址(http/https)。支持 Clash/Mihomo YAML(proxies:)、纯文本 IP:PORT[(:USER:PASS)]、http:// / socks5:// URI 行、base64 包裹;Clash YAML 里的多协议节点(ss / vmess / vless / trojan / hysteria2 等)由内置 mihomo 解析,带 dialer-proxy 的链式节点会跳过。 |
PROXY_MAX_ATTEMPTS |
5 |
遇到 429/403/5xx 或节点不通时最多尝试几个节点,允许 1–10 |
PROXY_STRATEGY |
sticky |
节点选择策略:sticky(填充,默认)——一个节点一直用到不可用(429/403/传输失败)才换下一个;round_robin——每次请求都轮询下一个健康节点 |
PROXY_HEALTH_INTERVAL_SECONDS |
600 |
定时健康检查间隔秒数,允许 60–86400;0 关闭。定时检查会重试所有死节点,并每 30 分钟复检健康节点 |
PROXY_SUBSCRIPTION_REFRESH_SECONDS |
1800 |
定时重新拉取订阅的间隔,允许 300–86400;0 关闭。只有拉取成功、解析出节点、且新节点探测后至少有一个健康节点才替换;失败/为空/全不健康都会保留旧节点池,未变节点保留健康与冷却状态 |
Docker 示例:
docker run -d --name oc2api --restart unless-stopped \
-p 8080:8080 \
-e API_KEY=your-key \
-e PROXY_SUBSCRIPTION_URL='https://你的订阅地址' \
ghcr.io/zhuweiyou/oc2api:latest- 启动加载订阅并后台探测,只把健康节点投入轮换;
- 默认
sticky:固定用一个健康节点,429/403/传输失败才换;round_robin每次轮询; - 每 30 分钟刷新订阅:新节点探测完再整体切换,失败/为空/无健康节点都保留旧池;
GET /ip返回{direct, proxy}两份出口(多来源竞速);GET /health返回统计 + 健康节点列表, 支持?state=healthy|unhealthy|cooling|all。
构建标签、二进制约 8/46 MB 的差异等发布细节见 AGENTS.md。
兼容 OpenAI 格式,路径均支持带 /v1 前缀或不带:
| 路径 | 方法 | 说明 |
|---|---|---|
/v1/chat/completions 或 /chat/completions |
POST | Chat 补全(支持 stream: true 流式) |
/v1/models 或 /models |
GET | 模型列表 |
/ 或 /health |
GET | 健康检查(带订阅池时含健康节点列表) |
/ip |
GET | 同时查询直连与节点池出口 IP(多来源竞速) |
配置 API Key 后,请求携带:
Authorization: Bearer <api-key>
也支持 X-API-Key。客户端工具、工具选择、多轮工具调用均可正常使用。
代理只放行 big-pickle 及所有以 -free 结尾的模型,例如:
| 模型 | 上下文 | 输出 | 图片输入 |
|---|---|---|---|
big-pickle |
200,000 | 32,000 | ❌ |
mimo-v2.6-flash-free |
200,000 | 32,000 | ✅ |
deepseek-v4.1-flash-free |
200,000 | 32,000 | ✅ |
glm-5.3-flash-free |
200,000 | 32,000 | ✅ |
数据来源 https://models.opencode.ai/api.json,以实际为准。
额度由上游按账号/网络计量,代理本身没有配额。用完时上游回 429 并带 Retry-After(秒),
到期自动恢复;oc2api 会把该头原样透给客户端。
| 状态 | 错误类型 | 含义 |
|---|---|---|
| 403 | FreeTierError |
请求不像 OpenCode 客户端 |
| 429 | FreeUsageLimitError(带 Retry-After) |
额度用尽,或该出口已被上游限流 |
共享出口(云函数、Serverless)容易被别人先用掉额度,表现就是「昨天还好、今天全 429」, 这时换出口才有用。
构建、测试与实现细节(为什么用 uTLS、免费层的形状要求、Vercel 为什么是薄 Node 层)见 AGENTS.md。