一个面向 OpenAI 兼容客户端的轻量代理服务。
它对外提供本地 /v1/* 接口,校验你自定义的代理密钥,然后把请求转发到 OpenCode 上游。适合把不直接支持 OpenCode 的客户端,接到统一的 OpenAI 风格入口上。
- 提供本地 OpenAI 风格接口:
/v1/* - 使用
PROXY_API_KEY保护本地代理入口 - 自动把上游鉴权改写为
OPENCODE_API_KEY - 支持可选上游代理:
http、https、socks5、socks5h - 支持
IS_FREE=true的 free 模式 - 透传普通请求,支持流式响应
客户端请求流程:
- 你的客户端把请求发到本地代理,例如
http://127.0.0.1:8080/v1/chat/completions - 请求头里的
Authorization必须是:
Bearer <PROXY_API_KEY>
- 代理校验通过后,把请求转发到
OPENCODE_BASE_URL - 转发时会自动替换为上游需要的
Authorization: Bearer <OPENCODE_API_KEY>
这意味着:
PROXY_API_KEY是你的本地代理口令,给客户端用OPENCODE_API_KEY是代理访问上游 OpenCode 用的密钥,不给客户端直接暴露
- Go 1.26 或更高版本
复制示例配置:
Copy-Item .env.example .env最小可运行配置如下:
OPENCODE_BASE_URL=https://opencode.ai/zen/v1
OPENCODE_API_KEY=public
UPSTREAM_PROXY_URL=
PROXY_API_KEY=change-me
PORT=8080
IS_FREE=true直接运行:
go run .或先构建再运行:
go build .
.\opencode_proxy.exe启动成功后会监听:
http://localhost:8080
端口由 PORT 控制。
上游 OpenCode 的完整基础地址,必须是绝对 URL。
默认示例:
https://opencode.ai/zen/v1
程序会把本地 /v1/* 路径映射到这个地址下。
例如:
- 本地请求:
/v1/models - 上游请求:
https://opencode.ai/zen/v1/models
代理访问 OpenCode 上游时使用的 API Key。
如果留空,程序会使用默认值 public。
给代理程序自己访问上游时使用的网络代理,可为空。
支持的协议:
http://host:porthttps://host:portsocks5://host:portsocks5h://host:port
示例:
UPSTREAM_PROXY_URL=http://127.0.0.1:7890UPSTREAM_PROXY_URL=socks5://127.0.0.1:7891留空表示不走上游代理。
客户端访问本地代理时必须携带的口令,必填。
例如你配置为:
PROXY_API_KEY=my-local-key那么所有请求都要带:
Authorization: Bearer my-local-key
本地监听端口,默认 8080。
是否启用 free 模式,取值只能是 true 或 false。
当 IS_FREE=true 时,代理会做两件事:
- 转发普通请求时,如果请求 JSON 里有
model字段,会自动补上-free - 请求
/v1/models时,只保留上游返回里以-free结尾的模型,并在返回给客户端前去掉这个后缀
例子:
- 客户端请求模型:
gpt-4.1 - 实际转发到上游:
gpt-4.1-free /v1/models返回给客户端时显示为:gpt-4.1
如果你不需要这个行为,把 IS_FREE=false。
把你的客户端 Base URL 指向:
http://127.0.0.1:8080/v1
把 API Key 设置为:
<PROXY_API_KEY>
有些客户端会自动拼 Bearer,有些需要你自己填完整 Header,按客户端要求配置即可。
curl.exe -X GET "http://127.0.0.1:8080/v1/models" `
-H "Authorization: Bearer change-me"curl.exe -X POST "http://127.0.0.1:8080/v1/chat/completions" `
-H "Authorization: Bearer change-me" `
-H "Content-Type: application/json" `
-d "{\"model\":\"gpt-4.1\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}"- 只处理
/v1和/v1/*路径,其他路径返回404 - 未携带正确的
Authorization时返回401 unauthorized - 客户端传入的
Authorization不会原样转发到上游 - 代理会统一设置上游请求头和 Host
- 支持解压上游
gzip响应后再返回给客户端
如果同一个配置项同时存在于系统环境变量和 .env 文件中,环境变量优先。
检查 OPENCODE_BASE_URL 是否包含完整协议和主机,例如:
https://opencode.ai/zen/v1
说明你没有配置本地代理口令。补上 .env 里的 PROXY_API_KEY。
说明上游代理地址不是完整 URL。
正确示例:
http://127.0.0.1:7890
错误示例:
127.0.0.1:7890
说明代理协议不受支持,只能用这四种 scheme。
检查客户端发给本地代理的 Header 是否为:
Authorization: Bearer <PROXY_API_KEY>
通常是因为启用了 IS_FREE=true。这是预期行为,代理会自动处理 -free 后缀。
运行测试:
go test ./...- 你有一个只认 OpenAI 兼容接口的客户端
- 你想把 OpenCode 作为上游,但不希望客户端直接持有上游密钥
- 你需要在本地统一加一层代理鉴权或上游代理网络配置
项目包含 LICENSE 文件,按仓库内许可证使用。