opencode2pi
OpenCode Zen's anonymous free models (no API key) as a native omp/pi provider extension.
Package details
Install opencode2pi from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:opencode2pi- Package
opencode2pi- Version
0.3.7- Published
- Oct 17, 2026
- Downloads
- 572/mo · 572/wk
- Author
- guyuexuan
- License
- MIT
- Types
- extension
- Size
- 105.6 KB
- Dependencies
- 0 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
opencode2pi
在 omp / pi 里直接用 OpenCode Zen 的匿名免费模型。
无需 API key · 无需注册 · 无需登录 · 无需子进程 · 无需本地端口
⚠️ 这是匿名免费通道,上游随时可能改闸门或直接关停。 它不依赖任何凭据,所以上游一旦调整请求形状校验,本扩展会全线 403。 出问题先跑
/opencode2pi doctor,它会直接告诉你闸门还在不在。
安装
# 推荐:npm(已发布,自动带 provenance)
omp install npm:opencode2pi
pi install npm:opencode2pi
# 备用:git @stable(最近一次发版)
omp install git:https://github.com/FanchangWang/opencode2pi@stable
pi install git:https://github.com/FanchangWang/opencode2pi@stable
# 追踪最新代码:装的是"此刻 main 指向的 commit",含未发布的改动,之后不会自动更新
omp install git:https://github.com/FanchangWang/opencode2pi@main
pi install git:https://github.com/FanchangWang/opencode2pi@main
为什么 npm 优先:git 装的是源码快照,宿主要现读现编译;npm 装的是已发布的
tarball,带 provenance 签名(可在 npmjs.com 包页面核验),且 tag 与版本号一一对应。
注意 omp/pi 不支持直接装 .tgz 文件(实测报 package.json not found),
所以只能用 npm spec 或 git URL。
@stable 是最近一次发版的版本,随发版前移;要固定到某一版,去
releases 挑一个 tag,
把 @stable 换成那个 tag 名或 commit SHA。上游随时可能改闸门,只有钉死才能复现"当时能用"的状态。
@latest 用不了:git 没有这个 ref,omp 解析会报错。
从源码运行(开发用)
git clone https://github.com/FanchangWang/opencode2pi.git
cd opencode2pi
# 链接当前目录:改代码立即生效,不用重装
omp install .
# 单次试用,不落盘
omp -e ./src/index.ts -p --model opencode-zen-free/big-pickle "你好"
omp install . 是链接而非拷贝:装的是路径,所以改 src/ 下的代码下次启动就生效。
代价是删掉或移动这个目录,扩展就失效了 —— 所以本地开发用它,给别人用请走上面的 npm 或 git。
不要只复制
src/index.ts。扩展是多文件模块,index.ts依赖同目录的其它模块。 要手动常驻就整目录复制:cp -r src ~/.omp/agent/extensions/opencode2pi。
使用
选模型
会话里用 /model 选择,provider 名是 opencode-zen-free。
命令行要用 --model <provider>/<model>,不要用 --provider:
# 对
omp -p --model opencode-zen-free/big-pickle "你好"
# 错,会报 Unknown provider
omp --provider opencode-zen-free
扩展注册的 provider 在参数校验阶段还不可见,所以
--provider一定失败。 同理omp models不列出这个 provider,查清单请用会话内的/model或/opencode2pi status。
模型列表是自动发现的
免费池轮换频繁,所以列表不是写死的,而是实时发现 + 元数据判定:
| 级 | 来源 | 作用 |
|---|---|---|
| S1 | GET {zen}/v1/models |
谁现在真的在售 |
| S2 | models.dev | 免费判定 + 真实能力参数 |
| S3 | 内置静态种子 | 完全离线时的兜底 |
实测当前发现 7 个 免费模型(2026-10-11 实测后从 13 个减下来,恒定被拒的
id 已进 denylist,见 docs/FINDINGS.md §2.2)。付费模型不会进列表;断网也能用
(退回内置种子,能力参数不会变成错误的默认值)。
图片输入
能否附加图片取决于模型本身。把图片作为消息的一部分传入即可:
omp -p "@photo.png" "这张图是什么颜色?"
只支持文本的模型会收到明确的拒绝提示,而不是模糊的 400。
能力参数
上下文长度、最大输出、计价、reasoning effort 都取自 models.dev 的真实数据, 不是拍脑袋的默认值。某个字段上游没给时,会落到保守默认值并写进日志, 而不是悄悄用一个错的数字。
/opencode2pi
omp 没有扩展设置页,斜杠命令是本扩展唯一的界面。
| 命令 | 作用 |
|---|---|
/opencode2pi doctor |
检查形状闸门是否仍然成立。上游一改闸门,这里立刻告警 |
/opencode2pi status |
显示上次探测的结果;从未探测过的模型(含新发现的)会当场补测 |
/opencode2pi probe |
重新探测全部模型 |
/opencode2pi filter |
选择要在 /model 里隐藏哪些模型(默认一个都不隐藏) |
不带参数执行会弹出四项菜单。
健康标记
| 标记 | 含义 |
|---|---|
| ✅ | 可用 |
| ⚠️ | 现在不行(5xx、400、无法归类的错误),不代表模型没了 |
| 🚧 | 配额受限(429 / transport 超时)。这是通道的匿名额度用完了,不是模型的问题,等一会儿会自动恢复 |
| ❌ | 确定死了(地区封锁,或连续两次 ModelError) |
| ❓ | 闸门或凭据被拒 —— 全 roster 的问题,跑 doctor |
每行末尾直接带上原因(HTTP 状态与上游原文)和探测时间,所以不存在
「这个模型到底怎么回事」需要另外去查的情况。超过 6 小时的结果标 (已过期),
并提示你去跑 probe —— status 不会替你重探。
默认只标注、不隐藏。 这条通道波动很大,单次失败不足以判死刑 ——
实测有模型一分钟内先 401 ModelError、再 200,所以一次 ModelError 只标 ⚠️,
连续两次才升级 ❌,任何一次成功都会清零。
想让失败的模型不出现在 /model 里
/opencode2pi filter(或每次 probe 结束后自动询问)可以隐藏地区封锁的、以及所有
探测失败的模型。这个选择记在数据目录的 filters.json 里,重启后仍然有效;
随时可以改回「全部保留」。
配额耗尽和链路故障不会隐藏任何模型:那是通道的状态,不是模型的。被隐藏的只是
不进 /model 与 --model,status 里照样能看到全部。
排障
先跑 doctor
大部分「全都不能用」的情况,先跑 /opencode2pi doctor。它会直接告诉你闸门还在不在。
错误对照表
扩展会把上游错误翻译成人能看懂的原因:
| 你看到的 | 归类 | 原因 / 处理 |
|---|---|---|
上游形状闸门拒绝(FreeTierError) |
SHAPE_REJECTED |
闸门条件被破坏,通常是代码回归 —— 提 issue |
该模型在当前网络地区不可用(RegionError) |
REGION_BLOCKED |
地区封锁,不是凭据问题。换模型或换网络节点 |
模型已下线(ModelError) |
MODEL_GONE |
上游已不再支持该模型 |
匿名配额按出口 IP 限流(429) |
RATE_LIMIT |
等配额恢复,或设 PI_PROXY_OPENCODE_ZEN_FREE 换出口 |
上游拒绝了请求(400) |
REQUEST_REJECTED |
模型无法处理这次输入,最常见是给只支持文本的模型发图片 |
上游暂时不可用(5xx) |
UPSTREAM |
上游临时故障,换模型重试 |
其它常见问题
| 现象 | 处理 |
|---|---|
Unknown provider "opencode-zen-free" |
用了 --provider。改用 --model opencode-zen-free/<id> |
omp models 查不到这个 provider |
已知行为(实测),用会话内 /model 或 /opencode2pi status |
| 断网了还能用吗 | 能。退回内置种子,能力参数是正确的实测值 |
它做了什么、没做什么
宿主内建的 opencode-zen provider 需要付费 OPENCODE_API_KEY;本扩展走的是 Zen 的
匿名通道(Authorization: Bearer public),拿到的是那一批免费模型。
流式引擎、tool call 分片聚合、reasoning、图片 modality、模型选择器 —— 全部由
omp/pi 内建,本扩展不重复实现。它只补上匿名通道要求的那部分请求形状,
其余全部委托给宿主。细节见 docs/DEVELOPMENT.md。
不做:付费 Zen 通道、OpenAI/Anthropic 协议互转、IP 池轮换、子进程。
文档
| 文档 | 内容 |
|---|---|
docs/DEVELOPMENT.md |
架构、闸门条件、宿主 API 实测行为、模块说明、验证与发布流程 |
docs/FINDINGS.md |
实测结论存档:闸门精确条件、宿主扩展 API 的真实行为、同类扩展为什么都不能用 |
docs/PLAN.md |
任务清单与验收标准 |
AGENTS.md |
给接手的 AI:项目地图、验证命令、别踩的坑 |
致谢
灵感与闸门条件的逆向,来自 FishBottle7/opencode2dsh
(DSH 版的同类工具,其 legacy/ 里的 Go sidecar 源自 opencode2api)。
许可证
MIT