一、故事的起点是一笔很不爽的账单
事情通常是这样开始的。
你先买了订阅。二十刀,一百刀,或者那个让你在付款页面深呼吸了三秒的二百刀档位。用得很爽,白天写代码有人陪,晚上问点乱七八糟的也有人答。
然后你开始写自己的小工具。一个定时抓取的 agent,一个自动整理笔记的脚本,一个你自己都说不清为什么要做但就是想做的东西。这时候你发现,订阅那套额度,程序调不着。
于是你去开了 API。充了十刀试试水。跑了一个下午。
余额还剩三块二。
这时候你脑子里会浮现出一个特别朴素、特别理直气壮的念头:我那个二百刀的订阅额度,此刻正在我睡觉的时候原地蒸发。凭什么?
恭喜,你已经站在 Sub2Api 的门口了。
二、它到底想干什么
Sub2Api 这个名字起得挺直白:Subscription to API。把一个卖给人类的订阅,掰成一个喂给程序的接口。
大模型厂商在定价上挖了一道很宽的沟,两边各站一群人:
订阅这边,固定月费,按滚动时间窗口限流。设计前提是"一个人,一双手,一次只能打一行字"。你手速再快,一天也就那么多。厂商赌的就是这个——人类的生理带宽是有上限的,所以敢卖包月。
API 那边,按 token 计费,不封顶。设计前提是"程序,不睡觉,可以并发一百个"。厂商很清楚这边能跑出多少量,所以按量收钱,一分不让。
问题是,同样一段文字,从这两边流过去,价格能差一个数量级。重度用户的订阅额度换算成官方 API 单价,一个月跑出四位数美元不是罕见事。
Sub2Api 干的事情,本质上就是在这道沟上偷偷搭一块板:让程序假装成人,站到便宜的那一边去。
三、这块板是怎么搭的
技术上无非一层协议转换——在"人类客户端"该在的位置上,插一个自己人。
路线 A:包官方 CLI。
厂商自己发了 agent 命令行工具,而且允许订阅账号直接登录使用。那么最"体面"的做法就是:起一个官方 CLI 进程,把它的标准输入输出接到一个 HTTP server 上,对外吐 OpenAI 格式。
这条路最像样。因为你确实是在用官方客户端,凭据也是官方登录流程拿的,没有任何逆向成分。代价是它慢——一个进程一次只能干一件事,你想并发?排队。而且 CLI 是为交互设计的,有一堆你不需要的开销和它自己的 agent 逻辑,你想要一个纯净的 completion 接口,它偏要先给你分析一下当前目录。
路线 B:复用会话凭据。
从浏览器里把 session token 或者 OAuth 凭据抠出来,然后直接对着网页端的接口发请求。快、轻、不用跑 CLI。
也最脆。网页接口不是公开 API,厂商随时能改,改了不会通知你,因为你本来就不该在这儿。而且这个路线的行为特征最"不像人"——没有浏览器该有的那一堆前置请求,时序也不对。
路线 C:交给别人。
有人搭了一池订阅账号,帮你把上面那些脏活全干了。你充值、拿 key、按量扣,价格远低于官方。什么都不用部署。
听起来完美。代价是你把凭据、请求内容、以及预充值的钱,一次性全交给了一个你不知道是谁的人。这条路的风险不在技术,在"你凭什么信他"。
四、实操:怎样把这块板真正搭起来
既然你还没死心,那我们就动手搭一次。
目前社区里以 Go 写的 Sub2Api 为例,比起早期那堆跑着跑着就泄露内存的 Python/Node 脚本,这玩意儿已经体面得像个正经微服务了——Go、PostgreSQL、Redis、Docker Compose,架势摆得比你的业务主库还齐整。
整个过程分四步:拉服务、抠凭据、配网关、接客户端。
1. 起服务:先把架子支起来
找一台“网络通畅且 IP 干净”的小鸡(别用万人骑的劣质机房 IP,那等于直接往风控枪口上撞),写一个 docker-compose.yml:
version: '3.8'
services:
sub2api:
image: ghcr.io/your-sub2api-repo/sub2api:latest
container_name: sub2api
restart: unless-stopped
ports:
- "8080:8080"
environment:
- DB_HOST=postgres
- DB_PORT=5432
- DB_USER=sub2api
- DB_PASSWORD=your_secure_password
- DB_NAME=sub2api
- REDIS_ADDR=redis:6379
- JWT_SECRET=change_me_to_something_random
depends_on:
- postgres
- redis
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_USER: sub2api
POSTGRES_PASSWORD: your_secure_password
POSTGRES_DB: sub2api
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
pgdata:在同级目录下敲下:
docker compose up -d打开 http://你的服务器IP:8080,你会看到一个做得甚至比某些正经云厂商还清爽的管理后台。初始化一个管理员账号,这一步走完,你离“天才”感觉还剩 50%。
2. 抠凭据:当一把体面的数据搬运工
这是最考验心理素质的一步。系统支持多种模式,但本质上都是搞定“认证”:
- 如果你走 CLI/OAuth 链路:
在后台添加账号时,选择对应的平台提供商。它会生成一段授权 URL 或唤起本地终端登录,你在浏览器点完授权,把回调的 Token/Refresh Token 贴回面板。 - 如果你走 Session 路线:
打开你花了两百刀订阅的主力账号,登录网页版。按下F12,切到 Network(网络)或 Application(存储)标签页。
翻出那个至关重要的 Cookie(比如session-token或sessionKey)。
复制,粘贴到 Sub2Api 的后台「账号管理 -> 添加账号」里。
点下保存的那一瞬间,面板通常会变绿,显示:“账号健康 / 额度有效”。
恭喜,你已经把价值两百刀的身家性命,交给了容器里的几行环境变量。
3. 分发配置:假装自己是一家云厂商
Sub2Api 最迷人的地方就在这里,它不仅转发,还自带一套极其逼真的“老板面板”:
- 建渠道/分组: 把你刚刚绑的账号挂到对应的渠道上(比如
claude-pro-pool或openai-plus-team)。如果有好几个账号,它还能顺手帮你做权重轮询和负载均衡。 - 建用户 & 发 Key: 给自己生成一个专属的 API Key,格式长得跟正品一模一样:
sk-sub2api-xxxxxxxxxxxx。你甚至可以顺手给自己设个每日额度上限,仪式感直接拉满。
4. 接入与见证奇迹:Hello World
打开终端,把平时调官方接口的脚本翻出来,只改两行:
BASE_URL改成你的服务器地址:http://你的服务器IP:8080/v1API_KEY换成刚才面板发出来的sk-sub2api-xxxxxxxxxxxx
跑个测试:
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-sub2api-xxxxxxxxxxxx" \
-d '{
"model": "claude-3-5-sonnet-20241022",
"messages": [{"role": "user", "content": "你好,请确认你是否在线?"}],
"stream": false
}'回车。
屏幕卡顿了大约一秒,光标闪烁,随后吐出一段工整的标准 JSON:
{
"id": "chatcmpl-sub2api-7x9281",
"object": "chat.completion",
"choices": [
{
"message": {
"role": "assistant",
"content": "你好!我在线,请问有什么我可以帮你的吗?"
}
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 15,
"total_tokens": 27
}
}紧接着,把 Cursor、Cline 或者你的 Agent 框架的 base_url 统统填上它。看着 IDE 里的代码补全像流水一样倾泻而出,后台面板里的调用计数像电表倒转一样跳动。
你靠在椅子上,长舒一口气。
你觉得官方按 Token 卖接口的那帮人简直是把全世界当韭菜割,而你,仅仅用了一个周末的下午,就用一套 Go 网关完成了对资本主义价格歧视的技术反抗。
然后,你带着这种胜利者的微笑关上电脑睡觉。
五、跑通那一刻是真的爽
我得承认,第一次把 base_url 一改、原来的代码一行没动、然后看着请求从订阅额度里扣出去的时候,那个感觉是相当好的。
成本曲线肉眼可见地拍平了。 API 最折磨人的从来不是贵,是没有上限。你写了个循环,里面有个边界条件没处理好,半夜跑飞了——这种故事每个月都有人在群里讲,配图是一张后台账单截图和一个死亡表情。订阅是硬封顶,最坏结果就是这个月不能用了,钱不会多掉一分。
沉没成本被盘活了。 订阅费是预付的,你不用它也不会退。一天二十四小时里你真正在用的可能就六小时,剩下十八小时的额度纯粹在原地腐烂。接上自动化任务之后,边际成本看起来是零。
工具链零改造。 因为吐的是 OpenAI 兼容格式,你那一堆 SDK、IDE 插件、自己搭的中间件,全都不用管,换个地址就跑。
偶尔还能蹭到订阅独占的东西。 某些模型档位、某些 agent 能力,厂商只在订阅侧放,API 侧要么没有要么另算钱。
那几天你会觉得自己特别聪明。
六、然后你会慢慢发现,你手里的不是 API
这是整件事里最关键的认知转折:你拿到的不是一个 API,是一个长得像 API 的聊天会话。
| 你以为你有 | 你实际有 |
|---|---|
| 并发 | 单账号强限流,并发这个词基本不存在 |
| Prompt caching 省钱 | 没有。长上下文每次原价重来 |
| Batch 折扣 | 没有。这功能只在 API 侧 |
| 精确的 token usage | 通常是估的,成本核算靠玄学 |
| 完整的 tool use / 结构化输出 | 看封装层心情,普遍缺胳膊少腿 |
| 版本化和弃用公告 | 上游一改就挂,你从日志里得知 |
| 数据处理条款 | 路线 B/C 上,这一栏是空的 |
更微妙的是,订阅额度的消耗逻辑本来就是按"人类节奏"设计的。你想用它跑批量任务,会发现窗口额度消耗得极快——因为限流器压根没预期有人会连续不停地打满上下文。
于是那个漂亮的成本模型开始松动:你以为买断了一个月,实际上前三天就把窗口撞穿了,剩下二十七天在等重置。
而你为此付出的调试时间,如果按你自己的时薪算一遍……算了,别算。
七、风险,罗列一下
按会不会让你真正难受排序:
- 数据。 路线 B 和 C 意味着请求内容经过不受控的环节。里面只要有客户数据、内部代码、业务逻辑、凭据片段,性质就从"省钱"变成"事故"。有雇主的人,这条应该直接结束讨论。
- 封号且不退款。 订阅条款普遍禁止绕过速率限制和非授权访问方式。订阅费预付,封了就是没了,申诉基本没戏——因为你确实违约了。
- 供应链投毒。 你要把最高权限的会话凭据,交给一个 star 数不高、作者不认识、更新记录不规律的仓库。这是个多理想的下毒目标,不用我多说。
- 中转站跑路。 预充值 + 匿名运营 + 业务本身就不合规,这三样凑齐了,风控等级大概和路边扫码充话费差不多。
- 不可建设性。 你没法在这上面盖任何东西。上线当天就是违约,尽调那天就是暴雷,被断供那天就是全线故障。
- 隐性时间成本。 跟上游版本赛跑、调协议、处理莫名截断,这部分开销通常在第二个月超过你省下的钱。
八、放弃的那一刻
标题里那个"放弃"不是凑系列名。这张图上每条路最后都通向同一个出口,区别只在于你是从哪个岔口下来的。
我是从"上游升级"那条下来的。某天早上起来发现昨晚的任务全挂了,翻日志,协议变了。修了半小时,跑通了。第二周又挂了。
修到第三次的时候我坐在那儿想了个问题:我到底是在省钱,还是在给一个随时会掀桌子的人打白工?
结语
Sub2Api 是个挺漂亮的 hack。它精准地戳中了厂商定价里的一道缝,作为一次"这玩意儿到底行不行"的验证,值得你花一个周末。
但工程上真正长本事的地方,是分得清"能跑通"和"能依赖"。它的结构性问题从来不在技术——技术上它早就跑通了——而在于它成立的前提是对方没打算让你这么用。建在这个前提上的东西,都只是在借时间,利息还挺高。
入门很容易。
放弃也是。
生命在于折腾,但折腾完了记得回来把活干完。