0 元搭一个自己的大模型 API:免费 Instabox + OpenCode 免费模型池,全流程手把手,免费用 deepseek-v4.1-flash,glm-5.3-flash,mimo-v2.6
一台免费档的 4 核 8G 云电脑,一个开源项目,九个限时免费模型,一个 OpenAI 兼容地址。这篇文章不谈概念,只给能复现的步骤和我踩过的边界。
先亮结果。下面是我自己部署实例的健康检查地址与返回:
https://41980-agqy7jma5cbmmxzhlafbss33gm.instabox.tech/health
返回是这样的:
{"status":"ok","stage":"ready","runtime":{"base":"http://127.0.0.1:40099","pid":303377},"models":{"total":12,"usable":9},"uptime":286.0}stage: ready,12 个模型里 9 个探测可用。这意味着支持 OpenAI 协议的客户端,把 base_url 换成这个域名就能调模型——不用先充值,也不用单独购买模型额度。runtime.base 是隔离启动的 OpenCode 运行时本地地址,后面会用到。
先把话说在前面:这里的"免费"有三层边界。Instabox 免费档是 beta 政策、会休眠、有运行时长上限;OpenCode 的 -free 模型是限时免费、共享限流、提示词可能被用于改进模型;整套东西没有任何 SLA。它适合个人折腾、原型验证、给自己的小工具当后端,不适合生产服务,不适合放任何敏感数据,也不适合承载对外的正式服务。后面第七节会把这些坑逐条摊开。

一、先看清这套东西是怎么串起来的
三层,别混在一起理解:
你的客户端 (OpenAI SDK / curl / 任意兼容工具) │ HTTPS + Bearer API_KEY ▼ Instabox 公网端口 ←── 把机器内的 41980 映射成一个 HTTPS 域名 │ ▼ opencode-to-api (Express, 监听 0.0.0.0:41980) │ OpenAI 协议 ↔ OpenCode 协议转换、API Key 鉴权、请求队列 ▼ OpenCode 运行时 (隔离启动在 127.0.0.1:40099 这类本地随机端口) │ ▼ OpenCode Zen 免费模型池 (cost.input = 0 且 cost.output = 0)
Instabox:给一台完整的 Linux 虚拟机,不是容器、不是函数。免费档 1 台、4 vCPU / 8 GiB / 20 GiB 磁盘、5 个快照、每月 100 GiB 出流量、最多 16 个公网端口。
opencode-to-api:Gitee 上的开源项目(MIT),把 OpenCode 的免费模型池包装成
/v1/models和/v1/chat/completions,支持 SSE 流式。它要求 Node.js ≥ 22、内存 256 MB 起。
公网端口:让本机服务有了一个能被外网访问的 HTTPS 地址。
为什么这三层能凑到一起?因为 Instabox 默认的 agent-browser 模板预装了 Node.js 22.23.3、OpenCode 1.19.5、Docker 与 Docker Compose,正好卡在 opencode-to-api 的环境要求上。8 GiB 内存对它 256 MB 的起步门槛属于富余,20 GiB 磁盘也够放运行时和日志。
二、准备三样东西
1. 注册并建机
打开 instabox.sh,用 GitHub 或 Google 账号登录。据社区反馈,注册需要审核,新账号可能进 waitlist 等邀请码,一般 1–2 天——这不是官方承诺的时效,控制台界面也可能调整,以当下页面为准。
激活后进 Machines → Create machine,模板选默认的 agent-browser(控制台里也可能显示为 standard,带桌面环境),确认免费规格是 4 vCPU / 8 GiB / 20 GiB。列表显示 Running 就成了。它就是第一节说的那个预装环境,依赖不用另装。
2. 记下 Machine ID
打开机器 Details,浏览器地址栏里 open= 后面、& 之前那串 m_xxxxxx 就是机器 ID(社区教程中常见的取法,以当前控制台为准)。后面保活脚本要用。
3. 创建 API Key
控制台 → API Keys → Create API Key。权限建议选 Restricted,只开 Machines 的 Read + Write,关掉 Delete(续租不需要删机器)。Key 格式为 ibk_...,只在创建时显示一次,立即存好。
这个 Key 不是给 opencode-to-api 用的,是给 Instabox 的控制面 API 用的(保活脚本调
api.instabox.sh)。两个 Key 别搞混:一个管机器,一个管你自己的模型接口。
三、部署 opencode-to-api
SSH 或网页终端进机器。推荐 Docker Compose,一条命令收工:
git clone https://gitee.com/web/opencode-to-api.git cd opencode-to-api docker compose up -d --build docker compose logs -f | grep "Generated initial"
日志里那行 Generated initial admin API key: xxxxx 就是你自己的接口密钥,同时会持久化到 ~/.opencode-to-api/api-keys.json。把它存进密码管理器,不要贴进任何截图、文章或仓库。
不用 Docker 也行:
npm install npm start # 监听 0.0.0.0:41980
其他方式还有 PM2(pm2 start ecosystem.config.js)和 systemd,仓库 README 里都有。
首次启动别慌:程序会先自动下载对应平台的 OpenCode 二进制(npmmirror 优先、npmjs 兜底,SHA-512 校验),然后逐个探测模型,每个约 10 秒。这期间 API 可能还没开始监听,等探测跑完就会自动起来。全部探测失败也不用手动重启,调度器 30 分钟后会重试。
本地先验一遍:
curl http://127.0.0.1:41980/health curl -H "Authorization: Bearer $KEY" http://127.0.0.1:41980/v1/models
几个默认参数值得记住,都在 config/default.json,可用 CONFIG_PATH 覆盖:
配置项 | 默认值 | 作用 |
| 41980 | 对外监听端口 |
| 120 | 每分钟请求上限 |
| 8 / 200 | 并发与排队,超出返回 429 |
|
| 每 30 分钟重探模型可用性 |
| 360 | 探测成功结果缓存 6 小时 |
| 10 / 60 | 临时故障与永久失效的缓存时长 |
另外两个设计我挺喜欢:一是权限围栏,启动时注入隔离配置,禁用所有 native tool 调用,让后端只当纯推理引擎;二是分级探测缓存,跨重启复用结果,不会每次启动都把 12 个模型轮一遍。
四、把 41980 发布到公网
在机器里执行(dev 换成你的机器名或 ID):
instabox port publish dev 41980 --name 'OpenCode API' instabox port ls dev
会拿到一个形如下面的 URL:
https://<端口>-<机器ID去掉m_前缀>.<域名>/
我这次拿到的是 https://41980-agqy7jma5cbmmxzhlafbss33gm.instabox.tech/。看懂这个域名很有用:41980 是发布的端口,agqy7jma5cbmmxzhlafbss33gm 就是我的 Machine ID 去掉 m_。以后看到这类长域名,一眼就知道是哪台机器的哪个端口。
⚠️ 官方文档原话:公网 URL 不是秘密。默认的 public 端口意味着任何人拿到地址都能访问你的整个服务,直到你 unpublish。所以第三步生成的 API Key 必须保留,别为了图方便关鉴权。想再收一层,可以改用
--private,访问要带?_token=ibp_...或Authorization: Bearer ibp_...;脚本调用还得额外带这层 token,自己权衡。
五、验证,然后接进任何 OpenAI 客户端
四条命令走完:
BASE="https://41980-agqy7jma5cbmmxzhlafbss33gm.instabox.tech"
# 1. 根路径
curl "$BASE/"
# {"name":"OpenCode To API","version":"0.1.0","docs":"/v1/models","health":"/health"}
# 2. 健康检查(无需鉴权)
curl "$BASE/health"
# 3. 模型列表(需要 Key;不带 Key 应返回 401)
curl -H "Authorization: Bearer $KEY" "$BASE/v1/models"
# 4. 对话补全,改成 stream:true 即 SSE 流式
curl -X POST "$BASE/v1/chat/completions" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "opencode/glm-5.3-flash-free",
"messages": [{"role": "user", "content": "用一句话解释什么是活动租约"}],
"stream": false
}'第 3 条不带 Key 时,我实测返回的是:
{"error":{"message":"Invalid or missing API key","type":"auth_error","code":"invalid_api_key"}}说明鉴权确实在生效——这一步值得亲自验一次。
接 SDK 只需改两个参数:
from openai import OpenAI
client = OpenAI(
base_url="https://41980-agqy7jma5cbmmxzhlafbss33gm.instabox.tech/v1",
api_key="你的opencode-to-api-key",
)
resp = client.chat.completions.create(
model="opencode/glm-5.3-flash-free",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)我这次实测探测通过的 9 个模型(total 12 / usable 9):
模型 ID | 备注 |
| 第三方汇总里评分靠前(非统一口径) |
| — |
| — |
| — |
| — |
| 名称无 |
| — |
| — |
| 名称带 VL,属多模态类 |
这张表是我某一时刻的探测结果,不是承诺。项目筛选规则是「输入/输出成本均为 0 + 支持文本输出 + 未废弃」,OpenCode 那边随时可能上下架、限流或改价;一切以
/v1/models的当前返回为准。另外还有 3 个模型没通过探测,属于正常波动。
如果自己再套一层 Nginx 反代,stream: true 记得加 proxy_buffering off; 和较长的 proxy_read_timeout,否则流式会被缓冲成一次性返回。
六、保活:让机器别"睡着"
先讲规则(来自官方 Auto-pause and max-run 文档):免费档空闲 30 分钟自动暂停,该值固定、免费用户不可调整;单次连续运行最长 480 分钟。暂停会保留内存和进程,下次使用时唤醒。
官方给的应对接口叫活动租约(activity-lease):
PUT /v1/machines/{id}/activity-leases/{taskID} body {"ttlSeconds": 300} 范围 30–3600
DELETE /v1/machines/{id}/activity-leases/{taskID} 释放关键一句:续租必须从机器外部发起。机器一旦被暂停,内部的 cron、systemd timer 全冻住,自己叫不醒自己。
国内较省事的"外部常开"环境是金山文档 AirScript + 外部 cron,全程零成本、无需海外网络条件。Gitee 仓库 web/wps_airscript 里的 instabox.js 已经写好了,六步配完:
打开
kdocs.cn微信扫码登录,新建一个空白表格(建议一个脚本一张表,凭证别混)。
菜单
效率→高级开发→AirScript 脚本编辑器→ 创建脚本 → 选「文档共享脚本」。
左侧
服务→添加服务→ 添加「网络API」。漏了这步HTTP.get/HTTP.put不存在,是常见的翻车点。
表格里填:B1 = Instabox API Key,B2 = Machine ID,B3 留给脚本写执行结果。粘贴
instabox.js全部代码,点「运行」试跑,B3 应显示「续租成功|状态=running|过期=…|TTL=900s」。
脚本编辑器左侧找到脚本,点三个点 → 复制 webhook 链接,同时拿到 AirScript-Token。
打开
console.cron-job.org建任务:cron 表达式*/10 * * * *,HTTP 方法POST,目标 URL 填 webhook,请求体{"Context":{"argv":{}}},Headers 加AirScript-Token: 你的token和Content-Type: application/json,超时至少 30 秒。
为什么是 10 分钟?脚本里 TTL 设的是 900 秒(15 分钟),留 5 分钟余量给网络抖动和排队。WPS 内置定时任务每天只能触发一次,所以必须借外部 cron。
这个脚本最值得学的是它的"先检查再续租":它先 GET /v1/machines/{id},确认同时满足 state=running、desiredState=running、operationId=null、autoSuspendedAt 为空,才发起 PUT;任一条件不满足就直接跳过,还会校验返回的 expiresAt 晚于当前时间。重启中、已挂起、有操作进行中的机器,盲目续租毫无意义甚至有副作用。写完保活脚本,照这个思路自检一遍不亏。
也可换成任意支持定时 HTTP 触发的外部服务,把 API Key 放进密钥或环境变量,逻辑完全一样。
七、比保活更该知道的 5 件事
这一节最值得看。网上多数"防休眠教程"止步于第六节,但有几件事不说清楚,你迟早会踩。
1. 租约挡不住 480 分钟硬上限。 官方写得很直白:maxRunMinutes 到点就暂停,即使机器正忙,activity 和 leases 都不会延长它。免费档固定 480 分钟,且连续触发 max-run 暂停会进入递增冷却:第 1 次 5–20 分钟,第 2 次 60–75 分钟,第 3 次起 120–135 分钟(空闲暂停则没有冷却)。不建议尝试任何规避运行时长限制的做法:既不稳定,也可能与平台条款相冲突。
2. 其实低频自用,可能根本不需要保活。 官方文档明确:对公网端口的一次 HTTP 请求就会唤醒因空闲而自暂停的机器,请求会等待恢复(最多 45 秒);若还在恢复中,返回带 Retry-After 的 503 (Sandbox is waking up)。也就是说,配好客户端重试,第一次调用慢半拍,之后照常用。注意区分:只有"机器自己暂停"(autoSuspendedAt 有值)才会被唤醒,你手动 pause / stop 的机器不会自动醒,得回去 resume。保活的价值在于把首次延迟压掉、让监控和数字好看,而不是"不保活就用不了"。
3. 免费模型不免费在"稳定"和"私密"上。 -free 是限时免费口径,公开资料提示:部分免费模型的提示词可能被用于改进模型、Nemotron 系列走试用条款且会记录使用、免费模型共享全局速率限制,长 agent 任务后容易撞 Rate limit exceeded。所以别传公司代码、客户数据、任何不想外泄的内容,也别把它当付费 API 的平替写进生产链路。底层模型在境外,涉及境内数据的需评估数据出境合规。
4. 公网端口 = 暴露面。 再强调一次:URL 不是秘密。至少做到——API Key 保持开启,用 /admin/keys 给不同客户端发子 Key 而不是到处复用 admin Key;控制台能改 private 就改 private;rateLimit 别调大;定期看 logs/app.log。另外 Instabox API Key 和 AirScript-Token 都等同账号密码,含凭证的金山表格不要分享,token 不要 commit 到仓库,泄露立即去控制台吊销重建。密钥只读不写、结果不回显,这个原则值得抄。
5. 其余物理边界。 免费档出站带宽约 50 Mbit/s(≈6 MB/s),别拿它传大文件;starts / minute 限 3 次,别写激进的唤醒轮询;免费政策仍是 beta,官方没承诺长期存在,重要数据和配置在本地留一份。
一句话总结这节:把平台规则当设计输入,而不是当需要绕过的障碍。
八、到底适合拿它做什么
场景 | 是否合适 | 说明 |
个人原型、脚本、AI Agent 玩具 | ✅ 很合适 | 挂了重试一次即可,无直接费用 |
学习 OpenAI 协议 / 调试 SDK | ✅ 很合适 | 有 |
给自己的小工具站做后端 | ⚠️ 可用 | 客户端务必带重试,接受偶发 503 |
博客、群里演示"我有自己的 API" | ✅ 合适 |
|
生产服务 / 对外承诺 SLA | ❌ 别用 | 休眠、480 分钟上限、beta 政策三重不确定 |
敏感数据、合规业务 | ❌ 别用 | 免费模型的数据条款与限流均不可控 |
高并发、长稳在线、大文件 | ❌ 别用 | 并发 8、队列 200、出站约 6 MB/s |
写在最后
所谓"token 自由",不是找到一个无限量的水龙头,而是把「免费算力」和「免费模型池」用一段开源代码接起来,再老实接受它的边界。
九个随时可能换人的免费模型,一个你自己掌握的兼容地址——不完美,但够你今晚把想法跑起来。
先去把 /health 跑绿,剩下的交给重试。
资料来源与声明
资料来源:Instabox 官方文档(Auto-pause and max-run、Pricing、Limits、Public and private ports、API 说明与 llms.txt)、Gitee 仓库
web/opencode-to-api的 README 与配置文件、Gitee 仓库web/wps_airscript的 README 与instabox.js源码、OpenCode Zen 免费模型的第三方公开整理资料,以及本人部署实例的实测返回。
文中
/health、401 响应、total 12 / usable 9及模型清单为撰写时本人实例的真实返回,属时点数据;模型可用性、免费政策与平台规则均可能变动,以官方页面和你自己账户内的实际状态为准。注册邀请码等待时长、社区保活实践等来自社区公开分享,非官方承诺。
本文为技术教程,不含购买链接、返佣入口或二维码;平台与项目名称仅作客观指代,不代表授权、合作或背书,商标归各自权利人所有。
文中实例仅供个人技术验证,未开放模型调用能力;底层模型在境外,勿提交个人信息或重要数据。接口若对外开放,需自行履行相应合规义务。本文不涉及批量注册、额度转售或规避平台限制。


