Files
opencode-go-proxy/README.md
T
phptits a8198f47e4 opencode-go-proxy v0.1.0: OpenCode Go API 本地转发代理
- 透明转发 /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 个单元/集成测试
2026-09-10 07:29:00 +00:00

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