Repository navigation
更新内容
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:
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:latest3. 其它
- 单元测试 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