做一个会自己过期的免费大模型 API 导航站:抓取、LLM 抽取、健康探测与到期自动下架

4 阅读4分钟

免费大模型 API 导航站到处都是,但绝大多数有个通病:免费信息是静态的。写文章时免费的模型,三个月后就收费了;限时免费的模型到期了也没人管。作为开发者,我决定做一个 "会自己过期" 的导航站 —— 所有免费信息自动更新,限时免费到期自动下架。这篇文章拆解核心架构。

一、核心问题拆解

做这类站点本质是解决三个问题:

  1. 信息源:去哪里拿 "谁免费" 的准确信息?→ 信号源管理
  2. 信息提取:定价页 HTML 怎么变成结构化数据?→ 抽取引擎
  3. 信息保鲜:免费状态会变,怎么自动跟进?→ 定时调度 + 变更管理

二、信号源:官方定价页 + 社区源

信号源分两类:

  • 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(收藏评分订阅)

八、踩坑记录

  1. sqlite3 在 Node 22 没有预编译二进制,node-gyp 源码编译失败 → 换 better-sqlite3,但 Sequelize 6 不认它的同步 API → 手写了一层 shim 桥接(把 better-sqlite3 包成 node-sqlite3 风格回调)
  2. AI 抽取的 JSON 输出不稳定:LLM 偶尔包代码块 → 解析器要容忍剥壳
  3. 免费额度的 "有效期" 字段最容易被忽略:绝大多数清单没有这个字段,这是我们坚持要抓的

九、效果与开源思考

目前收录的都是真免费模型,覆盖智谱、讯飞、硅基流动、腾讯混元、OpenRouter 等平台,全自动运转,维护成本趋近于零。导航站地址:api-free.com (顺便求个 star 和反馈)。

你觉得 "到期自动下架" 这类机制还有哪些场景可以用? 欢迎评论区聊。