免费大模型 API 导航站到处都是,但绝大多数有个通病:免费信息是静态的。写文章时免费的模型,三个月后就收费了;限时免费的模型到期了也没人管。作为开发者,我决定做一个 "会自己过期" 的导航站 —— 所有免费信息自动更新,限时免费到期自动下架。这篇文章拆解核心架构。
一、核心问题拆解
做这类站点本质是解决三个问题:
- 信息源:去哪里拿 "谁免费" 的准确信息?→ 信号源管理
- 信息提取:定价页 HTML 怎么变成结构化数据?→ 抽取引擎
- 信息保鲜:免费状态会变,怎么自动跟进?→ 定时调度 + 变更管理
二、信号源:官方定价页 + 社区源
信号源分两类:
- api 型:提供 JSON 接口的定价 / 模型列表(如硅基流动 /api/v1/models),直接请求解析
- page 型:官方定价页 HTML(如智谱 docs.bigmodel.cn、讯飞定价页),需要抽取
每条信号源记录:URL、类型、厂商、频率、连续失败次数。连续失败 N 次自动停用,避免死循环打不健康的源。
三、抽取:LLM 抽取 + 规则抽取双通道
定价页 HTML 用 cheerio 清洗后,走两条路:
- AI 抽取:清洗后的文本 + 结构化提示词发给 LLM(OpenAI 兼容接口,默认 GLM-4-Flash),让它输出 JSON(模型名 / 厂商 / 免费额度 / 到期时间 / 链接)
- 规则抽取:无 AI Key 时降级,正则 / 关键词模板从文本里捞字段
两个通道共用同一个 "置信度" 概念:AI 抽取带 JSON schema 校验,字段不全或置信度低于阈值(默认 80%)的不进正式库,进草稿队列人工复核。宁可慢,不放过假数据。
四、入库与变更管理(核心设计)
去重键 = 模型名 + 厂商。流程:
新模型 → 自动创建(置信度达标直接上架,否则 draft)
已有模型 → 字段 diff → 有变更进 changes 队列 → 前台/后台可审 → 推送通知
限时免费 → 记录 end 字段 → 到期检查每天跑 → 到期自动下架 + 提前7天预警
到期自动下架是这个站点的核心承诺:所有限时免费模型都有 end 时间戳,定时任务每天 09:00 检查,到期自动 status 切 archived,同时触发通知(邮件 / Webhook)。用户在前台永远看不到 "已经过期" 的免费信息。
五、健康探测:免费 API 是不是真的活着
免费 API 的坑不止 "过期",还有 "死链"。每天凌晨 3 点对每个模型发一次最小调用(1 token),401/403 视作在线(只是没带 key),连接失败 / 5xx 记一次,连续 3 次失败自动标异常并通知。在线率直接显示在后台仪表盘。
六、调度:node-cron 就够了
三个定时任务:
| 任务 | 周期 | 说明 |
|---|---|---|
| 全网抓取 | 每 3 小时 | 遍历信号源 → 抽取 → upsert |
| 到期检查 | 每天 09:00 | 到期下架 + 7 天预警推送 |
| 健康探测 | 每天 03:00 | 全量最小调用探测 |
服务重启后调度自动恢复,无外部依赖。
七、数据模型与 API
前台 / 后台 / API 三端一体(Express 静态托管 + REST):
- models(模型)+ offerings(多平台额度,同一模型多平台一屏比清)
- sources / crawl_logs / changes(抓取体系)
- health_checks / notifications(健康 + 通知)
- users / favorites / ratings / subscriptions(收藏评分订阅)
八、踩坑记录
- sqlite3 在 Node 22 没有预编译二进制,node-gyp 源码编译失败 → 换 better-sqlite3,但 Sequelize 6 不认它的同步 API → 手写了一层 shim 桥接(把 better-sqlite3 包成 node-sqlite3 风格回调)
- AI 抽取的 JSON 输出不稳定:LLM 偶尔包代码块 → 解析器要容忍剥壳
- 免费额度的 "有效期" 字段最容易被忽略:绝大多数清单没有这个字段,这是我们坚持要抓的
九、效果与开源思考
目前收录的都是真免费模型,覆盖智谱、讯飞、硅基流动、腾讯混元、OpenRouter 等平台,全自动运转,维护成本趋近于零。导航站地址:api-free.com (顺便求个 star 和反馈)。
你觉得 "到期自动下架" 这类机制还有哪些场景可以用? 欢迎评论区聊。