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 个单元/集成测试
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
# 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 <UA> 上游 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
|
||||
Reference in New Issue
Block a user