跳至内容
21/30第 21 章,共 30 章

多模态定价:图像、音频和视频到底按什么收费

同样500张照片,三个模型报价相差5.5倍;一旦有人调整尺寸,最便宜的模型也会立刻换位。

本页内容

这里有一个任务,被用三种方式定价:描述五百张产品照片,每张一句短说明。照片相同,指令相同,答案长度相同。唯一变化的是由哪个模型来读取它们。

照片gpt-5.6-lunagemini-3.1-flash-liteclaude-haiku-4.5
800 × 600$0.0848$0.1638$0.4380
1024 × 768$0.1200$0.1638$0.6370
1280 × 960$0.1718$0.1638$0.9010
1600 × 1200$0.2558$0.1638$0.9010
4000 × 3000$0.3220$0.1638$0.9010

这张表里有三件事值得停下来细看。

最便宜的模型在第三行和第四行之间变了,任务还是同一个,只因为有人调整了照片尺寸。如果你要求的不是一句说明,而是一段文字,交叉点又会移动:在 1280 × 960 时,四十个 token 的说明由 Gemini 胜出,四百个 token 的段落则由 OpenAI 胜出。

Gemini 那一列在任何一行里都完全不动:一张 4000 × 3000 的照片,对它来说成本和一张 640 × 480 的照片完全一样。一张 4000 × 3000 的照片,对它来说成本和一张 640 × 480 的照片完全一样。这不是上限,而是它计数方式的结果;也意味着这个行业最常见的成本优化——上传前先降采样——收益如下:

image tokens,4000 × 3000 → 800 × 600本次运行成本节省
gpt-5.6-luna2,942 → 570$0.3220 → $0.084873.7 %
claude-haiku-4.51,564 → 638$0.9010 → $0.438051.4 %
gemini-3.1-flash-lite1,032 → 1,032$0.1638 → $0.16380.0 %

这些数字没有一个是供应商直接发布的价格。三者都必须从三套不同规则中计算出来,因为照片在任何地方都不是可计费单位:它会先被转换成 token,而这套算术写在三个互不兼容的地方。

第 16 章为文本搭好了账单,并停在文本停止的地方。本章是发票剩下的部分:图像、语音、转录、视频和原始计算。它们合起来使用八种不同的计费单位,以及一套用于比较不同计量口径商品的方法。

查看详情

本章需要从前文继承的内容。

  • **第 7 章**构建了 tokenizer 和单位。这里的一切,都是在尝试把非文本的东西转成那个单位。
  • **第 8 章**确立了模型消耗的东西:不是符号,而是 embedding 空间里的向量。这就是为什么图像也能用 token 定价。
  • 第 16 章构建了 computeCost、它的价格阶梯,以及它的五个 token 桶。本章扩展这个函数,而不是替换它。
  • **第 11 章把 LoRA 作为一种 fine-tuning 技术引入,第 20 章**则把它作为预算决策来定价。这里它出现在一个不是语言模型的模型上。

按照第 14 章的规则,没有张量:这里是费率、换算和会计,所以用 TypeScript。

transformer 接收的是一串向量。它并不关心这些向量从哪里来。第 8 章喂给它的是从 token id 查出来的 embeddings;架构里没有任何东西要求必须查表。

所以:把图片切成固定大小的方块,把每个方块展平成一串数字,再让每串数字通过一个学习得到的线性层,变成模型宽度对应的向量。一个 32 × 32 的彩色像素 patch 是 32×32×3=307232 \times 32 \times 3 = 3072 个数字;投影 ERd×3072E \in \mathbb{R}^{d \times 3072} 会把它变成一个 dd 维向量,形状与一个文本 token 进入模型时完全相同。事情就这么多,而那篇论文的标题也正是这么说的:一张图像值 16 × 16 个词。1 加上位置编码,让模型知道哪个方块原来在哪里;再把结果与文本 embeddings 交错在一起,模型读取的序列就一部分是图片,一部分是句子。

三篇论文把它变成了产品。CLIP 在四亿个抓取来的图文对上训练一个图像编码器和一个文本编码器,让它们达成一致;也正是在那里,像素和文字可以共享一个空间的想法不再只是猜想。2 Flamingo 把一个冻结的视觉编码器,用少数训练过的桥接层接到一个冻结的语言模型上。3 LLaVA 证明这座桥可以只是一个线性投影,而 instruction-following 可以用生成数据教会;这就是为什么此后的每个开放视觉语言模型看起来都大致相同。4

对你的发票来说,后果直接且不华丽:这些 patch 是序列中的位置,所以它们是输入 token,所以你按输入费率付费。 多少个是算术问题,而且每家供应商的算法都不同。

三套规则,都已发布,没有一套相同

链接到此部分:三套规则,都已发布,没有一套相同

下面每条规则都按供应商自己的文档实现,并用同一文档中的示例校验过。

OpenAI 用 32 × 32 的 patch 覆盖图像,再把数量乘以每个模型自己的系数。如果 patch 数超过该模型与细节级别的预算,图像会被缩小,直到符合预算:

patches=w32×h32,shrink=322budgetwh\text{patches} = \left\lceil \frac{w}{32} \right\rceil \times \left\lceil \frac{h}{32} \right\rceil, \qquad \text{shrink} = \sqrt{\frac{32^2 \cdot \text{budget}}{w \cdot h}}

Anthropic 用 28 × 28 的 patch 覆盖图像,每个 patch 一个视觉 token,并同时限制长边和 token 数——标准档模型为 1,568 像素和 1,568 token,高分辨率档为 2,576 和 4,784。过大的图像会被缩放到同时满足两项限制的最大尺寸。5

Google 完全不数像素。 如果图像两边都不超过 384 像素,固定收费 258 token。任何更大的图像都会切成每块 258 token 的 tile,而 tile 网格来自一个 min(w,h)/1.5\lfloor \min(w,h) / 1.5 \rfloor 的裁剪单位。6

imagetokens.tsTS
export function openaiImageTokens(
  w: number, h: number,
  { maxDim, patchBudget, multiplier }: { maxDim: number; patchBudget: number; multiplier: number },
) {
  const fit = Math.min(1, maxDim / Math.max(w, h));      // never enlarges
  w = Math.floor(w * fit); h = Math.floor(h * fit);
  let patches = Math.ceil(w / 32) * Math.ceil(h / 32);   
  if (patches > patchBudget) {
    const s = Math.sqrt((32 * 32 * patchBudget) / (w * h));
    const adj = s * Math.min(
      Math.floor((w * s) / 32) / ((w * s) / 32),
      Math.floor((h * s) / 32) / ((h * s) / 32));
    patches = Math.ceil(Math.floor(w * adj) / 32) * Math.ceil(Math.floor(h * adj) / 32);
  }
  return Math.ceil(patches * multiplier);                
}

export function anthropicVisualTokens(
  w: number, h: number,
  { maxLongEdge, maxTokens }: { maxLongEdge: number; maxTokens: number },
) {
  const tok = (a: number, b: number) => Math.ceil(a / 28) * Math.ceil(b / 28);
  const long = Math.max(w, h), short = Math.min(w, h);
  for (let L = Math.min(long, maxLongEdge); L >= 1; L--) {     
    const t = tok(L, Math.round((short * L) / long));
    if (t <= maxTokens) return t;                              
  }
  return 0;
}

export function geminiImageTokens(w: number, h: number) {
  if (w <= 384 && h <= 384) return 258;
  const crop = Math.floor(Math.min(w, h) / 1.5);               
  return Math.ceil(w / crop) * Math.ceil(h / crop) * 258;      
}

把每条规则跑在各自供应商印出来的数字上:

three implementations against three documentationsTEXT
OpenAI, gpt-5.4 at detail:high (2048 px, 2,500 patches, 1.2x)
  1024x1024 -> 1024 patches -> 1229 tokens   doc says 1229   MATCH
  2048x2048 -> 2500 patches -> 3000 tokens   doc says 3000   MATCH

Anthropic, the published table (one tier per row shown)
  200x200    std   64 @ 200x200     doc   64, not resized    OK
  1000x1000  std 1296 @ 1000x1000   doc 1296, not resized    OK
  1092x1092  std 1521 @ 1092x1092   doc 1521, not resized    OK
  1920x1080  std 1560 @ 1456x819    doc 1560, 1456x819       OK
  2000x1500  std 1564 @ 1269x952    doc 1564, 1269x952       OK
  3840x2160  hi  4784 @ 2576x1449   doc 4784, 2576x1449      OK

Google, the worked example
  960x540 -> crop 360 -> 3 x 2 = 6 tiles     doc says 6      MATCH

打印出了九个一致结果;完整运行会检查十五个,因为 Anthropic 的表为六种尺寸都给出了两个档位。现在你可以把这些规则跑在自己的任何照片上,这正是重点:本章里只有这三个函数,是你无法从价格页得到的。

“更大”到底是什么意思:三种答案

链接到此部分:“更大”到底是什么意思:三种答案

把同一张 4:3 照片按六种尺寸分别送进三家规则:

尺寸OpenAI,highAnthropic,标准Anthropic,高分辨率Gemini
384 × 288130154154258
640 × 4803604144141,032
800 × 6005706386381,032
1600 × 12002,2801,5642,4941,032
3200 × 24002,9421,5644,7401,032
4000 × 30002,9421,5644,7401,032

向下读最后一列。图片一旦超过 384 像素,这个数字就再也不变;这不是巧合,也不是上限。把裁剪单位代回 tile 公式,对于一张宽度至少不小于高度的图像:

tiles=wh/1.5×hh/1.51.5wh×2\text{tiles} = \left\lceil \frac{w}{\lfloor h/1.5 \rfloor} \right\rceil \times \left\lceil \frac{h}{\lfloor h/1.5 \rfloor} \right\rceil \approx \left\lceil \frac{1.5\,w}{h} \right\rceil \times 2

尺寸抵消了。Google 的 image tokens 只取决于宽高比,除此之外什么都不取决。 一张 4:3 的照片,不管是缩略图还是海报,都是四个 tile。这个单一的代数事实,就是前面节省表中零的全部解释,而且没有任何价格页把它写出来。

另外两列则是在不同高度、出于不同原因封顶——Anthropic 封在声明的 token 上限,OpenAI 封在像素限制之后的 patch 预算——这就是三条曲线会在不同尺寸交叉的原因。

现在把它弄坏。想在视觉模型上少花钱,显而易见的做法是要求更少细节,所以发送 detail: "low"

gpt-5.4, the same photograph, two detail levelsTEXT
1600x1200   low = 2280   high = 2280   ratio 1.00
3200x2400   low = 3687   high = 2942   ratio 1.25

要求更少细节,成本却多了 25 %。这不是 bug,OpenAI 在尺寸表里用一行就说明了:在那个模型家族上,low 使用 2048 像素限制和 6,144 patch 预算,而 high 使用同样的像素限制但只有 2,500 patch 预算,“so it can use more tokens than high”。7 low 这个词命名的是保真度设置,不是价格:在五个已记录的模型家族里,有两个完全不省钱;而在这两个之一上,它还更贵。

到目前为止,所有内容都是模型在读取图像。制作一张图运行在一种完全没有 token 的机制上,这也是它按图片而不是按文字出售的原因。

生成图像:按图价格就是按 token 价格

链接到此部分:生成图像:按图价格就是按 token 价格

供应商把图像生成发布为每张图的价格。但它并不真的是。GPT Image 模型会发出专门的 image tokens,其数量取决于请求的尺寸和质量;把公开的计数乘以 GPT Image 1 公开的 image output 费率——每百万 $40——再与同一页上的按图价格比较:

质量1024 × 10241024 × 15361536 × 1024
low272 tok → $0.0109 ($0.011)408 tok → $0.0163 ($0.016)400 tok → $0.0160 ($0.016)
medium1,056 tok → $0.0422 ($0.042)1,584 tok → $0.0634 ($0.063)1,568 tok → $0.0627 ($0.063)
high4,160 tok → $0.1664 ($0.167)6,240 tok → $0.2496 ($0.25)6,208 tok → $0.2483 ($0.25)

九个推导数字对九个公开数字,每一对相差都不超过 $0.002。11 Google 更直白,直接在价格页上替你完成换算:图像输出每百万 token $60,“output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image”。12

所以按图价格就是把计数折进去的按 token 价格。这没问题,但它隐藏了一件事。拿当前一代的表反向相除:

gpt-image-2, published price -> implied output tokens at $30/MTEXT
quality   1024x1024            1024x1536
low       $0.006 -> 200 tok    $0.005 -> 167 tok
medium    $0.053 -> 1767 tok   $0.041 -> 1367 tok
high      $0.211 -> 7033 tok   $0.165 -> 5500 tok

在每个质量档位,更大的图像反而是更便宜的。1024 × 1536 的画布比 1024 × 1024 多 50 % 像素,但在 medium 下少花 23 % token。OpenAI 用一句你很可能跳过的话标出了这一点——“a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting”——而在上一代模型上方向相反,竖版比方图贵 50 %。11 在这次变化之前写下的每一个 1024x1024 默认值,现在都是昂贵选项。

声音,按秒、按字符、按 token 计费

链接到此部分:声音,按秒、按字符、按 token 计费

让三个产品朗读同一段 519 个字符——大约 38 秒音频——你会从两家供应商那里得到三套单位系统:

模型单位价格
tts-1按字符每百万字符 $15.00 → $0.007785
tts-1-hd按字符每百万字符 $30.00 → $0.015570
gemini-3.1-flash-tts按 audio token,每秒 25 个每百万 $20.00 → $0.019319

同一家供应商同时出售两种单位:OpenAI 的 tts-1 按每百万字符计价,而 gpt-4o-mini-tts 按每百万 token 计价,输入 $0.60,输出 $12.00。13 所以,“最便宜的 text-to-speech”不是一个有答案的问题,除非你先说明你要朗读什么。

而这两种单位各自对相反的事情视而不见。按字符价格看不到时长:选择一个缓慢、从容的声音,或加入停顿,音频变长了,账单不动。按秒价格看不到内容:三十秒的成本相同,不管它是一段密集的技术段落,还是有人从一数到十。换个声音,你的两个供应商里恰好只有一个会重新定价。

转录反过来,也是整张发票上最简单的一行——按音频分钟,固定计费:

transcribing 59.6 secondsTEXT
whisper                  $0.005960     ($0.006 / min)
gpt-transcribe           $0.004470     ($0.0045 / min)
gpt-4o-mini-transcribe   $0.002980     ($0.003 / min)
gpt-live-transcribe      $0.016887     ($0.017 / min)

注意最后一行相对第三行:随着词语到达而实时处理,成本是对完成文件处理的 5.7 倍。这个差额是不可能 batch 的代价,也正是下一节昂贵的原因。

现在来到决定语音究竟是功能还是产品的那个数字。

这通电话:一段十轮客服对话,149 个词,按声明的每分钟 150 词计算,是 59.6 秒语音——来电者说了 21.2 秒,系统回了 38.4 秒。token 换算使用供应商自己的规则。OpenAI:“audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50 ms”。14 Google:双向都是每秒 25 token,其价格页在同一行发布 $12.00 每百万和 $0.018 每分钟,确认了这一点。12

对话的累计方式与第 16 章所说完全相同,因为机制相同:“the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”。只不过现在历史记录是用 audio tokens 计量。

轮次userassistant新鲜 audio incached audio inaudio out成本
14.4 s9.2 s440184$0.013224
25.6 s9.6 s56228192$0.014211
35.2 s9.2 s52476184$0.013670
44.0 s4.8 s4071296$0.007749
52.0 s5.6 s20848112$0.008187

现在来看决定产品的比较,四者都归一化到一分钟:

每分钟相对文本
gpt-realtime-2.1,无 caching$0.13125937.9×
gpt-realtime-2.1,历史已 cached$0.05742516.6×
gemini-3.1-flash-live,无 caching$0.0239656.9×
同样的话改为打字,gpt-5.6-terra$0.003461

三十八倍。 不是百分之三十八。同一段交流,用声音而不是文本进行,几乎贵两个数量级;而这段差距没有任何部分是某个人选择收取的利润——它是换算率。一秒 assistant 音频是二十个 token。按声明速率,同一秒承载 2.5 个词,而测得的转录文本为每词 1.26 token,所以作为文本是 3.15 token。声音是承载同一含义时臃肿 6.3 倍的包装,而它的每个 token 又按文本输出费率的 5.3 倍、文本输入费率的 16 倍收费。把体积比乘以价格比,在任何会计开始之前,数量级就已经摆在那里。

两个运营后果直接从表里掉出来。

Audio caching 不是优化,而是商业模式。 Cached audio input 是每百万 $0.40,新鲜的是 $32.00——98.75 % 的折扣,足以把电话成本砍半。规则就是第 16 章的规则,没有变化:cache 匹配前缀,所以任何在通话中途插入对话开头的内容都会摧毁它,而“来电者现已验证”最自然的位置正好就是那里。

而且你在客户端做的任何事,都不能让已经出声的内容不计费。 用户打断 assistant,你的代码停止播放,扬声器安静下来。已经生成的内容已经被计费,因为计费在 response 创建时累积;并且按照第 16 章的规则,凡是留在对话中的内容,此后每一轮都会作为输入音频重新发送。第 14 章对中止文本流已经说明过这一点。到了语音里,它贵三十倍。

视频、GPU-second,以及一个不是价格的价格

链接到此部分:视频、GPU-second,以及一个不是价格的价格

有些供应商按秒出售视频,有些按片段出售,并按分辨率、有时也按时长分档。这两种形状不只是便利程度不同;它们会交叉。

模型1 s2 s5 s10 s20 s
veo-3.1,按秒,1080p$0.400$0.800$2.000$4.000$8.000
veo-3.1-fast,按秒,1080p$0.120$0.240$0.600$1.200$2.400
sora-2,按秒,720p$0.100$0.200$0.500$1.000$2.000
hailuo-02,按片段,1080p$0.480$0.480$0.480$0.480$0.480
mochi,按 GPU-second$0.018$0.037$0.092$0.183$0.366

按片段收费的供应商,在 1.2 秒以下比按秒收费的更贵,在二十秒时便宜 16.7 倍。这两个模型的排序无法经受片段长度变化,所以“哪个视频模型最便宜”并不是关于模型的问题。

最后一行更糟,也是本章最诚实的核心。mochi真实 GPU 秒数计费——作业测得的预测时间——A100 上每秒 $0.001400,H100 上每秒 $0.001525,这就是出租机器的费率,别无其他。15 这是一条完全精确的费率,但它不是价格,因为它乘上的数量,要在你承诺付款之后才知道。上面那一行假设每秒输出需要十二个 GPU-second;把这个假设翻四倍,它就离开最便宜区间;只有到六倍时才落到表的中段。这是本页唯一一条你无法写进报价的费率。

所以:tokens、image tokens、字符、分钟、视频秒、整段视频、GPU seconds、固定单位。八种数量,而把它们放到同一条轴上的唯一办法,就是声明一个工作负载并给它定价。

这是对第 16 章 computeCost 的扩展——同一套阶梯机制,只是现在条件不再是 prompt 长度:

normalise.tsTS
export interface MediaCriteria {
  resolution?: string[]; quality?: string[];
  hasAudio?: boolean; maxDurationSeconds?: number;
}
export interface MediaTier { when?: MediaCriteria; price: number }
export type MediaRate = number | MediaTier[];

const matches = (when: MediaCriteria, u: Usage) => {
  const inList = (l?: string[], v?: string) => !l || (v !== undefined && l.includes(v));
  if (!inList(when.resolution, u.resolution)) return false;
  if (!inList(when.quality, u.quality)) return false;
  if (when.hasAudio !== undefined && when.hasAudio !== (u.hasAudio ?? false)) return false;
  if (when.maxDurationSeconds !== undefined
      && (u.videoSeconds ?? 0) > when.maxDurationSeconds) return false;   
  return true;
};

const mediaPrice = (rate: MediaRate | undefined, u: Usage): number => {
  if (rate === undefined) return 0;
  if (typeof rate === "number") return rate;
  for (const t of rate.filter((t) => t.when)) if (matches(t.when!, u)) return t.price;
  return rate.find((t) => !t.when)?.price ?? 0;      // the tier with no criteria is the default
};

export function computeCost(p: Pricing, u: Usage): number {
  let c = textCost(p, u);                             // Chapter 16, unchanged
  if (p.imageInputToken || p.imageOutputToken) {
    c += (u.imageInputTokens ?? 0) * (p.imageInputToken ?? 0)
       + (u.imageOutputTokens ?? 0) * (p.imageOutputToken ?? 0);
  } else if (p.imageUnit !== undefined) c += (u.images ?? 1) * mediaPrice(p.imageUnit, u);  
  if (p.videoSecond !== undefined) c += (u.videoSeconds ?? 0) * mediaPrice(p.videoSecond, u);
  if (p.videoUnit   !== undefined) c += (u.videoCount ?? 1)   * mediaPrice(p.videoUnit, u);
  c += (u.audioInputTokens ?? 0)       * (p.audioInputToken ?? 0)
     + (u.cachedAudioInputTokens ?? 0) * (p.cachedAudioInputToken ?? p.audioInputToken ?? 0)
     + (u.audioOutputTokens ?? 0)      * (p.audioOutputToken ?? 0)
     + (u.computeSeconds ?? 0)         * (p.computeSecond ?? 0)
     + (u.chars ?? 0)                  * (p.perChar ?? 0)
     + (u.minutes ?? 0)                * (p.perMinute ?? 0);
  return c;
}

标出的两行就是它坏掉的地方。按单位报价的费率会乘以 u.images ?? 1;按 token 报价的费率会乘以某个默认值为零的东西。给两者都喂一个空 usage——也就是测量失败时得到的形状——然后看:

the same missing measurement, priced by unitTEXT
per image (nano-banana-pro)     empty usage => $0.1500
per clip  (hailuo-02)           empty usage => $0.1500
per unit  (a cloned voice)      empty usage => $3.0000
per token (gpt-image-2)         empty usage => $0.0000
per second (veo-3.1)            empty usage => $0.0000
per GPU-second (mochi)          empty usage => $0.0000

什么都没有发生,六次;其中一次花了三美元,另外五次什么都不花。这不是四舍五入差异;这是关于一个缺失数字意味着什么的决定,并且每个单位各自作出、从未写下。合理的规则是:没有人测量过的字段保持缺失,因为“未测量”和“测量后结果为零”是不同的事情。这个函数却悄悄不同意。

第二个失败是时长。按片段收费的费率用 maxDurationSecondsu.videoSeconds ?? 0 选择阶梯,所以一个从未记录时长的 usage 会匹配最短阶梯:

hailuo-02, 768pTEXT
duration recorded    ->  $0.45
duration missing     ->  $0.27

不知道视频有多长,就打六折。两个 bug 的根源相同:在一个职责是精确的函数内部,为了方便选择了默认值。

成本可计算之后,比较还需要另一半——一个声明的代表性工作负载,每个引擎一个,公开写出,让读者可以不同意:

workloads.tsTS
export const representative = {
  text:   { blend: [[{ promptTokens: 1e6 }, 0.25], [{ completionTokens: 1e6 }, 0.75]] },
  image:  { images: 1, imageInputTokens: 50, imageOutputTokens: 1500 },
  video:  { videoSeconds: 5, videoCount: 1, resolution: "1080p", hasAudio: true, computeSeconds: 60 },
  voice:  { chars: 1000, computeSeconds: 10 },
  stt:    { minutes: 1 },
};

其中每一行都是一个论点。文本混合四分之一输入和四分之三输出,因为真实使用偏向输出;五五混合会让模型排序不同。图像工作负载假设 1,500 个输出 token,介于 OpenAI 的 medium 方图 1,056 和 medium 竖图 1,584 之间。视频假设 1080p 下五秒,而我们刚刚看到两家供应商在 1.2 秒处互换位置。计算项假设六十个 GPU-second,因为没有别的可以假设。

这就是方法,而且这是唯一诚实的方法:你无法比较不同单位下的价格;你只能比较一个你已经写下来的工作负载的成本。 任何给多模态模型排名却不打印工作负载的表,排名的都是它自己的假设。

你现在可以给模型能生成的任何东西定价,不管它按什么单位出售,并且能大声说出你的比较假设了哪种工作负载。这关闭了第 16 章打开的发票,也关闭了第三部分:从第 14 章到这里,一切都在讲一次调用——如何发起、放什么进去、如何采样、返回什么、花多少钱。

第 22 章会改变分析单位,而这个变化很贵。agent 不是一次调用;它是一个循环,会自己决定要调用多少次,而过去两章的算术会把它从架构图变成预算。它开篇会对同一个模型问两遍同一个问题,第二次只是在目录里加了一个工具,然后测量这一个工具做了什么:一次调用变成两次,三十九个输入 token 变成 420 个。

这是否让它成为 agent,取决于你打开的是两个公开定义中的哪一个,而它们并不一致。其中一个甚至与自身不一致。


本章中的每个价格、公式和换算率,都是在 2026 年 9 月 7 日从供应商自己的页面读取,并带着该日期引用,因为它们都会变化。token 计数、成本和比较,是用上面打印的代码在这些数据上计算出来的,在一台机器上运行,没有发起任何付费 API 调用——这也是本章没有任何延迟声明的诚实原因。

image-token 函数、成本表、语音通话拆分和空 usage 结果,均由本章打印的 TypeScript 生成,在 Node 22 上运行。用于语音比较的对话为 149 个词,并用 tiktokeno200k_base encoding 下 tokenized 为 188 个 token;其时长来自声明的每分钟 150 词速率,这是比较参数,不是测量值。每个供应商数字都有脚注说明来源页面。

  1. Dosovitskiy, A. 等,An Image Is Worth 16x16 Words: Transformers for Image Recognition at ScalearXiv:2010.11929(2020)。Patches、到 embedding 维度的线性投影,以及让网格能被序列模型读懂的位置 embeddings。

  2. Radford, A. 等,Learning Transferable Visual Models From Natural Language SupervisionarXiv:2103.00020(2021)。在 4 亿个配对样本上对图像编码器和文本编码器进行对比训练,以及下游所有内容所假设的共享空间。

  3. Alayrac, J.-B. 等,Flamingo: a Visual Language Model for Few-Shot LearningarXiv:2204.14198(2022)。冻结的视觉编码器、冻结的语言模型、训练过的桥接层——把图像理解变成聊天能力的架构。

  4. Liu, H., Li, C., Wu, Q. 和 Lee, Y. J. Visual Instruction TuningarXiv:2304.08485(2023)。用单个线性投影作为桥接,并用生成的指令数据作为训练集;这是开放视觉语言模型收敛到同一种形状的原因。

  5. Anthropic,Visionplatform.claude.com/docs/en/build-with-claude/vision,访问日期 2026-09-07。“Claude views images in patches instead of pixels. Each patch is a 28×28-pixel block of the image, referred to as a visual token. An image, therefore, costs ⌈width / 28⌉ × ⌈height / 28⌉ visual tokens.” 还包括两个分辨率档位(标准:1568 像素长边,1568 visual tokens;高分辨率,Claude 4.7 及之后:2576 像素和 4784 token)、缩小规则,以及上文复现的六行尺寸与 token 计数表。模型费率来自 Anthropic,Pricingplatform.claude.com/docs/en/about-claude/pricing,同日:Claude Haiku 4.5 输入和输出 token 每百万分别为 $1 和 $5。

  6. Google,Image understandingai.google.dev/gemini-api/docs/image-understanding,访问日期 2026-09-07。“258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens”,以及裁剪单位公式——floor(min(width, height) / 1.5),尺寸除以它后相乘——和 960 × 540 得到 3 × 2 = 6 个 tile 的示例。Google 称其为“a rough formula”;上文推导的尺度不变性,是该公式按已发布形式所具有的性质。同一模型家族的音频输入为每秒音频 32 token(ai.google.dev/gemini-api/docs/audio,同日)。

  7. OpenAI,Images and visiondevelopers.openai.com/api/docs/guides/images-vision,访问日期 2026-09-07。来源包括基于 patch 的规则(32 × 32 patch、patch_count = ceil(width/32)×ceil(height/32)shrink_factor 公式及其整数调整、30,000 patch 拒绝限制);模型尺寸表,包括 lowgpt-5.4 上使用 2048 像素限制和 6,144 patch 预算,“so it can use more tokens than high”,而 high 的 patch 预算为 2,500;乘数表(GPT-5.x 家族为 1.2,gpt-4.1-mini 为 1.62,gpt-4.1-nano 为 2.46);上文复现的两个示例(1024 × 1024 → 1229 tokens,2048 × 2048 → 3000 tokens);旧模型的基于 tile 的规则(base 加 512 像素 tile,在 gpt-4o 上为 85 + 170);以及视觉框中引用的限制清单。 2

  8. Ho, J., Jain, A. 和 Abbeel, P. Denoising Diffusion Probabilistic ModelsarXiv:2006.11239(2020)。前向加噪调度、把目标重参数化为预测被加入噪声的方法,以及采样循环。

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. 和 Ommer, B. High-Resolution Image Synthesis with Latent Diffusion ModelsarXiv:2112.10752(2022)。在压缩 latent 空间中运行扩散过程,正是这一点让固定步数便宜到可以按图出售。

  10. Prince, S. J. D. Understanding Deep Learning(MIT Press,2023),第 18 章。对本章跳过的一切扩散细节的声明式委托——变分界、噪声调度、classifier-free guidance 和采样器家族。Hu, E. 等,LoRA: Low-Rank Adaptation of Large Language ModelsarXiv:2106.09685(2021),是适配器本身;它在第 11 章以语言模型为宿主引入,在这里用于图像模型,数学没有改变。Radford, A. 等,Robust Speech Recognition via Large-Scale Weak Supervision(Whisper),arXiv:2212.04356(2022),是上文按分钟定价的转录模型。

  11. OpenAI,Image generationdevelopers.openai.com/api/docs/guides/image-generationPricingdevelopers.openai.com/api/docs/pricing,以及 gpt-image-1 的模型页,均访问于 2026-09-07。gpt-image-2 的模型页没有价格部分;其费率来自上面的价格页。GPT Image 1 的页面在上文推导使用的按图价格表旁边,发布了文本输入每百万 $5.00、图像输入每百万 $10.00、图像输出每百万 $40.00。还包括:gpt-image-2 之前模型的输出 token 表(方图、竖图和横图在 low 下为 272 / 408 / 400,medium 下为 1056 / 1584 / 1568,high 下为 4160 / 6240 / 6208);GPT Image 2、1.5、1 和 1 Mini 在上文推导中使用的按图价格表;句子“a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting”;每个流式 partial image 会额外消耗 100 个 image output token 的说明;以及 gpt-image-2 的费率:image input 每百万 $8.00,cached image input $2.00,image output $30.00,text input $5.00。比较中使用的文本模型费率:gpt-5.6-terra 输入 $2.00、cached input $0.20、输出 $12.00;gpt-5.6-luna 为 $0.20 和 $1.20,标准档,短 context。视频:sora-2 在 720p 为每秒 $0.10,sora-2-pro 在 720p、1024p 和 1080p 分别为 $0.30、$0.50 和 $0.70。转录:gpt-4o-transcribegpt-transcribegpt-4o-mini-transcribegpt-live-transcribe 分别为每分钟 $0.006、$0.0045、$0.003 和 $0.017。 2

  12. Google,Gemini Developer API pricingai.google.dev/gemini-api/docs/pricing,访问日期 2026-09-07。Gemini 3.1 Flash-Lite 的输入 token(文本、图像和视频)为每百万 $0.25,输出为 $1.50。Gemini 3.1 Flash Image:图像输出每百万 token $60,并发布了 0.5K、1K、2K 和 4K 图像对应的 747、1120、1680 和 2520 token,以及每张图 $0.045、$0.067、$0.101 和 $0.151 的价格。Gemini 3.1 Flash TTS:文本输入 $1.00,音频输出 $20.00,“audio tokens correspond to 25 tokens per second of audio”。Gemini 3.1 Flash Live Preview:文本 $0.75,音频输入“$3.00 or $0.005/min”,输出“$4.50 (text) $12.00 or $0.018/min (audio)”。Veo 3.1 带音频按秒计费:标准档 720p 和 1080p 为 $0.40,4K 为 $0.60;快速档为 $0.10、$0.12 和 $0.30。Gemini Omni Flash 对视频输出“at a rate of 5,792 tokens per second of 720p video”计费,同一脚注将其换算为约每秒 $0.10——这是最清楚的公开表述,说明按秒媒体价格就是 token 价格。 2

  13. OpenAI 的 tts-1tts-1-hdgpt-4o-mini-tts 模型页,developers.openai.com/api/docs/models,访问日期 2026-09-07。tts-1tts-1-hd 分别按每百万字符 $15.00 和 $30.00 计费;gpt-4o-mini-tts 为每百万 text input tokens $0.60 和每百万 audio output tokens $12.00——同一供应商、同一操作、两种单位。

  14. OpenAI,Managing costs(Realtime API),developers.openai.com/api/docs/guides/realtime-costs,访问日期 2026-09-07。“Audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50ms of audio.” 还包括:“The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”;成本在 Response 创建时累积;上表复现其累计方式的两轮示例;以及带有 input_token_detailsoutput_token_details 拆分的 response.done usage payload。费率来自同日价格页:gpt-realtime-2.1 音频每百万 token 输入 $32.00、cached input $0.40、输出 $64.00;文本为 $4.00、$0.40 和 $24.00;图像输入为 $5.00。

  15. Replicate,Pricingreplicate.com/pricing,访问日期 2026-09-07。Nvidia A100(80GB)每秒 $0.001400、每小时 $5.04;Nvidia H100 每秒 $0.001525、每小时 $5.49。

准备好让 LIA 替你选模型了吗?

所有 AI 模型都在一处——今天就免费开始。