Skip to content

v1.0.3 — 修复 429(Bun 运行时 + <env> 块)并新增 API_KEY

Latest

Choose a tag to compare

@jcleng jcleng released this 29 Oct 08:21
· 4 commits to main since this release

更新内容

1. 修复 429 FreeUsageLimitError(免费层的第二道门)

问题现象:所有请求都返回

429 {"type":"error","error":{"type":"FreeUsageLimitError",
     "message":"Free usage limit reached. Free models work in OpenCode …"}}

根因不是 IP 限流。实测(同一 IP、同一时间段、同一份请求字节)定位到第二道客户端门:

  • 运行时 TLS 指纹:同一请求经本地 TLS 终结隧道转发,Bun 的 TLS 发出 → 200,Node/OpenSSL 发出 → 429;调整 Node 的 ciphers/ecdhCurve/sigalgs/ALPN/TLS1.2-vs-1.3 均无效;换其它出口 IP 同样 429。
  • system prompt 指纹:给任意 system prompt 追加 OpenCode 的 <env> 块 → 200;删掉或截断 → 回到 429(请求头与该门无关)。

修复:

  • 镜像改用 Bun(oven/bun:1.4.4,CMD ["bun","server.js"]),npm start / scripts/deploy.sh 同样使用 Bun;node server.js 仍可启动但会打印警告(客户端门必然 429)。
  • 新增 injectOpencodeSystemEnv() / opencodeEnvBlock()(src/conversions.js),在 finalizeBody() 中为 system prompt 追加 OpenCode 的 <env> 块:保留 agent 原有指令、幂等(真实 OpenCode 已带 <env> 时不重复注入)、初始请求与每个 follow-up turn 全覆盖。
  • src/routes.js 读取 x-opencode-directory(回退 OPENCODE_ENV_CWD)填入块内目录;OPENCODE_SYSTEM_FP=0 可关闭注入。
  • 上游端点统一为 https://opencode.ai/inference/openai/v1;429 错误文案改为真实原因(不再误导为 “per-IP 配额”)。

2. 新增 API_KEY(客户端 → 代理鉴权)

  • Dockerfile 新增 ENV API_KEY=public:
    • -e API_KEY=<secret> 覆盖为私有密钥;
    • -e API_KEY=(空值)关闭客户端鉴权;
    • 默认 public 保持历史配置 "apiKey": "public" 继续可用。
  • 新增 src/auth.js:接受 Authorization: Bearer <API_KEY>(OpenAI 客户端标准写法)与 x-api-key,使用 timing-safe 比较。
  • 鉴权失败返回 401 {"error":{"code":"invalid_api_key",…}} + WWW-Authenticate: Bearer;CORS 允许 x-api-key。
  • 保护范围:/v1/* 与 /__*(调试端点会暴露 session id);/、/health、/v1 保持公开。GET /__session 返回 auth.required。

客户端把同一个值填到 provider 的 apiKey:

"opencode-zen-server": {
  "baseUrl": "http://<host>:48391/v1",
  "api": "openai-completions",
  "apiKey": "<API_KEY>",
  "models": [
    { "id": "big-pickle", "contextWindow": 200000 }
  ]
}
docker run -d --name opencode-free-provider --restart unless-stopped \
  -p 48391:8791 -e API_KEY='sk-ofp-<your-secret>' \
  ghcr.nju.edu.cn/jcleng/opencode-free-provider:latest

3. 其它

  • 单元测试 66 → 72 个(新增 <env> 块注入、鉴权/401/公开路径等用例),全部通过。
  • README.md / agents.md 记录「两道门」(403 = 头/会话/工具;429 = 运行时 + system prompt)、API_KEY 用法与排障映射。

镜像:ghcr.io/jcleng/opencode-free-provider:latest(Dockerfile 运行时为 Bun 1.4.4)

完整变更:8bcda41...v1.0.3