# opencode-go-proxy OpenCode Go([opencode.ai/zh-cn/go](https://opencode.ai/docs/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): ```sh rustup target add x86_64-unknown-linux-musl cargo build --release # 产物:target/x86_64-unknown-linux-musl/release/opencode-go-proxy(静态单文件,约 2 MB) ``` ## 使用 ```sh export OPENCODE_GO_API_KEY=sk-xxx # 在 opencode.ai/auth 订阅后获取 opencode-go-proxy # 监听 127.0.0.1:8090 ``` ### systemd 服务安装(mini-socks 方式) ```sh 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 上游 User-Agent (默认 opencode-go-proxy/版本) -u <地址> 上游地址 (默认 https://opencode.ai/zen/go;支持 http:// 供本地调试) ``` 验证: ```sh 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