- 透明转发 /v1/responses、/v1/chat/completions、/v1/messages、/v1/models - 自动注入上游认证 / User-Agent / x-opencode-session 会话头 - 双层密钥:上游 key(-k)+ 客户端访问 key(-c),客户端认证头不透传 - 手写 HTTP/1.1(rustls 仅用于 TLS):keep-alive、chunked、100-continue - SSE 逐块流式透传,上游错误响应详情日志 - mini-socks 同款 systemd 安装(-i/--uninstall),musl 静态单文件 - 37 个单元/集成测试
5.0 KiB
5.0 KiB
opencode-go-proxy
OpenCode Go(opencode.ai/zh-cn/go)API 本地转发代理。
OpenCode Go 要求客户端请求携带专属 User-Agent 和稳定的 x-opencode-session 会话头,
大多数第三方客户端无法自定义这些请求头。本工具在本地起一个透明 HTTP 代理,自动注入
OpenCode Go 要求的全部请求头,让任意 OpenAI / Anthropic 兼容客户端零改造接入。
客户端(任意 OpenAI/Anthropic SDK)
│ http://127.0.0.1:8090/v1/*
▼
opencode-go-proxy
│ 注入 Authorization / User-Agent / x-opencode-session
│ 路径映射 /v1/* → https://opencode.ai/zen/go/v1/*
▼
OpenCode Go
功能
- 透明转发四个端点,响应体逐字节流式透传(SSE 首 token 延迟不受影响):
/v1/responses— OpenAI Responses API(Grok 4.6、GPT 5.6 Luna、Muse Spark)/v1/chat/completions— OpenAI 兼容(GLM、Kimi、DeepSeek、LongCat、MiMo、Hy3/Hy4、Omen Alpha)/v1/messages— Anthropic 兼容(MiniMax、Qwen 系列)/v1/models— 模型列表
- 自动注入:
Authorization: Bearer <密钥>(密钥由代理持有,不经过客户端)User-Agent: opencode-go-proxy/x.y(可自定义)x-opencode-session:客户端带了就透传;没带则为每个客户端连接生成稳定 ID (同一 keep-alive 连接内的连续请求共享,近似"每对话一个");也可用-s固定/v1/messages额外补x-api-key与anthropic-version: 2023-06-01(客户端未带时)
- 双层密钥:
- 上游密钥
-k:OpenCode Go 的 API key,仅存在于代理配置中,转发时注入 - 客户端密钥
-c(可选,公网部署强烈建议):配置后所有 API 请求必须携带Authorization: Bearer <客户端密钥>或x-api-key(任一匹配即可),否则 401;/healthz免鉴权供监控使用;-i安装时不指定则自动生成
- 上游密钥
- 支持 keep-alive、
Expect: 100-continue、chunked 请求体,请求体上限 32 MB - 上游连接/握手超时 15 秒,响应头超时 60 秒,响应体不限时(SSE 长连接)
- 客户端自带的认证头不会透传到上游,由代理统一替换
构建
需要 Rust 1.75+ 与 musl 工具链(或改用默认 gnu target):
rustup target add x86_64-unknown-linux-musl
cargo build --release
# 产物:target/x86_64-unknown-linux-musl/release/opencode-go-proxy(静态单文件,约 2 MB)
使用
export OPENCODE_GO_API_KEY=sk-xxx # 在 opencode.ai/auth 订阅后获取
opencode-go-proxy # 监听 127.0.0.1:8090
systemd 服务安装(mini-socks 方式)
sudo opencode-go-proxy -i -p 28080 -k sk-xxx # 安装并启动;-c 缺省自动生成客户端密钥
sudo opencode-go-proxy -i -p 28080 -k sk-xxx -c ogp-xxx # 或固定客户端密钥
sudo opencode-go-proxy --uninstall # 停止并卸载
安装会把二进制复制到 /usr/bin/opencode-go-proxy,unit 写入
/etc/systemd/system/opencode-go-proxy.service,-p/-k/-c/-s/-a/-u 固化在
ExecStart 中。更换密钥:编辑 unit 中的 -k(上游)或 -c(客户端)后
systemctl restart opencode-go-proxy。
opencode-go-proxy [-l 地址] [-p 端口] [-k 密钥] [-s 会话ID] [-a UA] [-u 上游] [-h]
-l <地址> 监听地址 (默认 127.0.0.1)
-p <端口> 监听端口 (默认 8090)
-k <密钥> API 密钥;缺省读环境变量 OPENCODE_GO_API_KEY / OPENCODE_API_KEY
-s <会话ID> 固定 x-opencode-session;缺省为每个客户端连接自动生成
-a <UA> 上游 User-Agent (默认 opencode-go-proxy/版本)
-u <地址> 上游地址 (默认 https://opencode.ai/zen/go;支持 http:// 供本地调试)
验证:
curl http://127.0.0.1:8090/v1/models
curl http://127.0.0.1:8090/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"kimi-k3","messages":[{"role":"user","content":"你好"}]}'
客户端接入
按各模型所属端点选择协议与模型 ID(完整列表见 /v1/models):
| 客户端 | 配置 |
|---|---|
| OpenAI SDK / Cherry Studio / LobeChat 等 | Base URL http://127.0.0.1:8090/v1,API Key 填客户端密钥(-c 的值) |
| Claude Code | ANTHROPIC_BASE_URL=http://127.0.0.1:8090 + ANTHROPIC_API_KEY=<客户端密钥> |
| curl / 脚本 | -H "Authorization: Bearer <客户端密钥>" 直接请求 /v1/* |
模型与端点的对应关系(节选,以 /v1/models 为准):
- chat/completions:kimi-k3、glm-5.3-flash、glm-5.3、deepseek-v4-pro、deepseek-v4-flash、mimo-v2.5、longcat-2.0、hy4-preview、omen-alpha
- messages:minimax-m3、qwen3.8-max、qwen3.8-flash、qwen3.7-max
- responses:grok-4.6、gpt-5.6-luna、muse-spark-1.3-contributor
日志
每请求一行(stderr):时间、客户端地址、序号、方法、路径、上游状态码、响应字节数、耗时。 API 密钥与请求体不会出现在日志中。
限制
- 仅支持 HTTP/1.1 客户端
- 每个上游请求新建 TLS 连接(AI 请求耗时长,复用收益低,换来实现简单)
- 不做协议转换:模型需用其原生协议(如 Claude Code 只能走
/v1/messages端点上的模型)
许可
MIT