订阅还是按量付:算一次「每月每百万 token 到底多少钱」

2026-11-02 Skills成本订阅决策

订阅制最大的问题是它不告诉你单价。20 美元一个月,你能用多少 token、每个 token 折多少钱,全靠猜。而 12 月起额度还要在 ChatGPT 和 Codex 之间共享,猜的空间更大了。

这件事可以算出来,而且不需要等官方公布任何数字——你自己用掉的量,加上公开的 API 单价,就够了。

第一步:拿到你自己真实的输入和输出 token 量(5 分钟)

这一步的关键是别只看总量。API 的输出单价比输入贵 4 到 5 倍,只记一个总数,算出来的混合价会偏得离谱。

三条取数路径,任选一条:

  • 有 API key 的:直接在账单或用量的 usage 明细里拉 input_tokens 和 output_tokens 两列,取最近 30 天。这是最准的。
  • 纯订阅、没有 API:ChatGPT 在 Settings → Usage 里给的是额度消耗,Claude 在 /usage 里给的是窗口内的用量。这两个数字口径不一定和 token 一一对应,能拿到近似值就够用,拿不到就跳到第三条。
  • 都没有:装一个本地代理,把请求记成 JSONL(model、input_tokens、output_tokens、时间戳),跑一周。一周的样本外推一个月,误差在 20% 以内,足够做决策。

顺手记两个字段:月费(订阅实际支付金额)和额度利用率(你实际用掉的量 ÷ 额度上限)。第二个字段后面会决定结论翻不翻转。

第二步:跑脚本(5 分钟)

把三个数丢进去:月费、月度输入 token、月度输出 token,外加你在考虑的 API 的输入/输出单价。

// cost-per-mtok.mjs
// 用法:node cost-per-mtok.mjs
const cfg = {
  subMonthlyUsd: 200,        // 你的订阅月费
  inputTokens:   120_000_000, // 近 30 天输入 token
  outputTokens:   12_000_000, // 近 30 天输出 token
  api: {                     // 候选 API 的公开单价(美元/百万 token)
    name: "Sonnet 5.5",
    in: 2.0,
    out: 10.0,
  },
};

const { subMonthlyUsd, inputTokens: i, outputTokens: o, api } = cfg;
const total = i + o;

// API 在你这个输入/输出比例下的混合单价(美元/百万 token)
const blendedApi = (i / 1e6) * api.in + (o / 1e6) * api.out;
const blendedApiPerMtok = (blendedApi / total) * 1e6;

// 订阅的隐含单价:月费摊到同样这些 token 上
const subPerMtok = (subMonthlyUsd / total) * 1e6;

// 反向问题:这笔月费如果按 API 买,能买到多少 token?
const equivalentTokens = (subMonthlyUsd / blendedApiPerMtok) * 1e6;

const ratio = subPerMtok / blendedApiPerMtok;

console.log(`总 token       ${(total / 1e6).toFixed(1)}M(in ${(i / 1e6).toFixed(1)}M / out ${(o / 1e6).toFixed(1)}M)`);
console.log(`API 混合单价   $${blendedApiPerMtok.toFixed(3)} / 1M`);
console.log(`订阅隐含单价   $${subPerMtok.toFixed(3)} / 1M`);
console.log(`比值           ${ratio.toFixed(2)}`);
console.log(`月费折算 token ${(equivalentTokens / 1e6).toFixed(1)}M`);
console.log(ratio <= 0.8 ? "结论:留订阅"
  : ratio <= 1.2 ? "结论:双轨(订阅保底 + API 兜溢出)"
  : "结论:迁 API");

上面这组示例数(200 美元、1.2 亿输入、1200 万输出、Sonnet 5.5 的 2/10 美元)跑出来,API 混合价约 2.73 美元,订阅隐含价约 1.52 美元——比值 0.56,订阅明显划算。

注意这个比值对用量极其敏感:同样 200 美元,如果一个月只用掉一半(6600 万 token),订阅隐含价就涨到 3.03 美元,比值 1.11,落到双轨区。订阅划不划算,八成取决于你有没有把额度用满,而不是取决于模型单价。

第三步:三个阈值怎么用

  • 比值 ≤ 0.8:订阅便宜近三成以上,留着。但每季度重算一次,因为额度口径会变。
  • 0.8 < 比值 ≤ 1.2:双轨。订阅当保底和心智成本,把批量、可延迟的活丢给 API(Batch 还能再打 5 折)。
  • 比值 > 1.2:迁 API。这个区间几乎只有一个成因——你付了固定月费,但没把额度用掉八成。

还有一个常被忽略的数:月费折算 token。如果它比你实际用量大很多,说明你在为闲置额度付钱——这时候该干的第一件事不是换 API,是降档。

怎么知道自己算对了(验收标准)

  1. 输入和输出 token 分开记,不是只记一个总数。只有总数的那份表,结论不可信。
  2. 用的是最近 30 天连续数据,不是某个忙周的峰值,也不是某个摸鱼周的低谷。
  3. 脚本里 API 单价是你当天从官方定价页抄的数字,不是三个月前的截图,也不是二手博客。
  4. 算出了 月费折算 token,并且和你的实际用量对比过一次。这两个数的差距,就是你在为闲置付的钱。
  5. 结论写成一句话加一个日期(例:2026-11-02 比值 0.56,留订阅,2027-02-02 复算)。没有日期的结论三个月后就没用了。

三个容易算错的坑

只看输入单价。 现在很多模型的输出价是输入的 4 到 5 倍。如果你的场景是长文生成、agent 多轮工具调用,输出占比可能过半,这时候用输入价做比较会高估 API 的便宜程度,得出”赶紧迁”的错误结论。

把额度上限当用量。 200 美元的档位写着每月多少额度,那是天花板,不是你的消耗。用天花板算出来的单价会漂亮得像广告。

忘了 credits 这条赛道。 额度用完可以直接买 credits 继续用。这笔钱不进月费,但进账单。算总成本的时候要把它加回月费里,否则订阅的性价比是虚的。

最后一句

这套算法的价值不在于得出”订阅好”或”API 好”,而在于它逼你把两件事说清楚:我一个月到底烧多少 token,以及我在为什么付钱。 额度池合并之后,第二件事会越来越难看清——账本自己得留着。