Skip to content

v1.0.0

Choose a tag to compare

@jcleng jcleng released this 13 Oct 07:14
· 12 commits to main since this release

opencode-free-provider v1.0.0

本地 OpenAI 兼容代理,将聊天请求转发到 OpenCode Zen 免费档,无需 API key 即可使用 big-pickle 等免费模型。

核心特性

动态指纹(绕过免费档 client-fingerprint gate)

OpenCode 免费档服务端会校验请求指纹,其中 x-opencode-session 的 id 结构/校验和由服务端验证,无法伪造——只有真正的 opencode 二进制生成的 ses_... 才通过。

本版本改为:每次需要时 spawn 真实的 opencode 命令,通过本地 MITM/TLS 拦截代理捕获它真正发往 opencode.ai 的请求的 fingerprint headers(user-agent、x-opencode-session、x-opencode-client、x-opencode-project 等),并缓存复用(OPENCODE_FP_TTL_MS,默认 30 分钟)。

  • 相关文件:src/fingerprint.js(getFingerprint() / fingerprintHeaders()),server.js 启动预热,/__session 暴露 fingerprint.source(opencode-cli = 实时抓到;fallback* = 静态回退)。
  • 若 opencode 不可用或设 OPENCODE_FP_DISABLE=1,回退到内置静态指纹,保证代理仍能启动。

Docker 镜像必须安装 opencode

修正了原 Dockerfile 的问题(基于 node:24-alpine 且根本没装 opencode,容器内 opencode: not found):

  • 基础镜像 node:24-alpine(musl)→ node:24-bookworm-slim(glibc):opencode 是 Bun 编译的原生 ELF,链接 glibc,Alpine 跑不了。
  • npm install -g @opencode/cli@2.0.22(可用 OPENCODE_VERSION build-arg 升级)。
  • 安装 openssl(生成 MITM CA 用)。
  • 支持 NODE_IMAGE build-arg 指向私有镜像源。

使用方法

# 本地
npm start            # http://127.0.0.1:8791/v1

# Docker
docker build -t opencode-free-provider .
docker run -d --name opencode-free-provider -p 8791:8791 opencode-free-provider

Agent 配置:

baseURL: http://127.0.0.1:8791/v1
apiKey:  public
model:   opencode-free/big-pickle

验证指纹已动态获取:

curl http://127.0.0.1:8791/__session        # 期望 fingerprint.source == "opencode-cli"
docker exec opencode-free-provider opencode --version

环境变量

变量 默认 说明
OPENCODE_FP_DISABLE 未设 设 1 跳过 spawn,用静态回退指纹
OPENCODE_FP_TTL_MS 1800000 抓到的指纹缓存时长(毫秒)
OPENCODE_FP_TIMEOUT_MS 15000 spawn / MITM 抓取超时(毫秒)
OPENCODE_VERSION 2.0.22 仅构建时:Docker 内 opencode 版本
NODE_IMAGE node:24-bookworm-slim 仅构建时:Docker 基础镜像

验证

  • 47 个单元测试全部通过。
  • 本地端到端:真实动态指纹成功绕过验证,HTTP 200 且返回真实模型回复。
  • GitHub Actions 已成功构建并推送镜像到 ghcr.io/jcleng/opencode-free-provider:latest。

注意

  • 客户端若有 ALL_PROXY(如 socks5://127.0.0.1:20170),curl 会把 localhost 请求也走代理导致空响应,请用 curl --noproxy '*' 测试;Node 的 fetch 默认不读 ALL_PROXY,代理服务端不受影响。
  • 新镜像体积比旧的 Alpine 版大(含完整 opencode CLI 原生二进制,约 200MB)。