Token 价格指数 · 方法论
孵化中覆盖两条序列:Token 价格指数(token-price,22 支 token 计价模型,正式篮子)与Token 价格参考指数(美·回溯)(token-price-us-retro,Wayback 回溯,3 支美国旗舰,不入链,见 §8)。另有 1 支非 token 计价 ticker(Seedance 2.0,按秒计价)随白名单展示、不入任何指数。
怎么算(四步)
- 抓:10 家源逐源采集各自公开定价页(9 家厂商一手官方源 + SiliconFlow 对照源),原始响应原样存档(快照 + sha256),每个数字可溯源。
- 混:每个 token 计价模型当日「混合价」= 7:2:1 混合价公式(§1),单源直通、
source_count=1如实记录(非跨源中位的滥用,是官方带的退化情形——本条线每个成分本来就只认一家官方一手源)。 - 算:Token 价格指数 = 22 支成分各自「当期混合价 ÷ 自己基期混合价」的等权平均 × 100(§6)。
- 接:晚于基期日才有价的成分(如 kimi-k3)按无跳变公式后补入篮,不追溯重算历史、指数不跳变(§9)。
状态:孵化中(token-price、token-price-us-retro 均为 hatching,主 spec §6.1 分级)。
1. 混合价口径(7:2:1)及出处
混合价 = (7 × 缓存读价 + 2 × 输入价 + 1 × 输出价) ÷ 10
引自 Artificial Analysis methodology 原文("blended price assuming a 7:2:1 ratio of cache hit, input, and output tokens",2026-07-10 核实)——这是行业现行事实标准口径,不是本站自定权重,选它是为了让本站的价格数字能直接与业内通行的「blended price」对照。计算是纯函数(pipeline/core/token_price.py::blended_price),Decimal 精度,四舍五入到 4 位小数;设计出处见 docs/specs/2026-07-10-token-price-band-design.md §4.1。
缓存写价(cache_write)单独采集、单独在 ticker 页价目表展示,但不参与混合价计算——7:2:1 公式本身没有写价这一项(详见价目表卡「不入混合价」标注)。
2. 缓存读价缺失时的降级
若某源未公布独立的缓存读价,混合价计算按「缓存读价 = 输入价」代入(等同于该模型在价目表上原本就没有缓存折扣,如实反映其官方定价结构——不是把这类模型标记异常或跳过)。
这个降级只发生在混合价这一步的计算输入上;ticker 页价目表卡上「缓存读」这一格仍按实际观测展示——没有观测到独立缓存价就显示「核验中」,不会拿输入价去填一个看起来像是被测量出来的数字。降级是计算侧的显式规则,不是展示侧的编造。
3. 一手源规则与 SiliconFlow 对照定位
指数只收各厂商官方开放平台定价页作一手源(source.kind = 'official_pricing_page'):
| 一手源 | 厂商 | 覆盖系列 |
|---|---|---|
| Anthropic | Anthropic | claude |
| OpenAI | OpenAI | gpt |
| Google Gemini | gemini | |
| 智谱开放平台 | 智谱 | glm |
| DeepSeek 开放平台 | DeepSeek | deepseek |
| Kimi 开放平台 | 月之暗面 | kimi |
| 阿里云百炼 | 阿里云 | qwen |
| 火山引擎 | 字节 | doubao(含 Seedance,非 token 计价) |
| 腾讯云 | 腾讯 | hunyuan |
SiliconFlow 是第 10 源、独立对照源(source.kind = 'reference_pricing_page'),覆盖 GLM/DeepSeek/Qwen/Kimi 等开源系模型的转售价。它的观测全量采集、快照、入库,但不进 ticker_day_price、不进指数、不作任何折扣率分母——用途只是抽审对照与国产开源系价格参考。这条边界在数据层强制:构件展示查询(getTokenPriceRows/getTokenSeriesPoints)显式限定「ticker.provider → source.kind='official_pricing_page'」,SiliconFlow 观测即便时间戳更新也无法混入官方构件展示,回归测试锁死该边界(web/src/lib/__tests__/db-token.test.ts「对照源不得混入」用例)。
依据:主 spec §4.4 规则 1「只收一手源」;本设计 §11 对主 spec 附录 C 的修订(国产开源系官方价源由「SiliconFlow/百炼」改为各厂商一手开放平台,SiliconFlow 降为独立对照源)。
4. 刊例价规则(含 introductory 促销价实例)
取标准按量付费刊例价:定价页同时挂促销价(introductory / limited-time)与标准价时,采标准价;促销价原样留在快照中可溯源,但不写入 observation。与主 spec §3.5「折扣率分母用官方单价」语义一致。
实例(已写入解析器 fixture 断言,见 pipeline/tests/test_parse_anthropic.py):Anthropic 定价页曾同时列出 Claude Sonnet 5 两行价格——through 2026-08-31 的 introductory 促销行($2 / $10 每百万 token)与 starting 2026-09-01 起的标准行($3 / $15 每百万 token)。解析器精确匹配「standard/starting」标准行,促销行不采、仅存快照。
5. 分档定价:取标准档
部分源按上下文长度、批量等维度分价(如超长上下文加价档、批量折扣档)。计价一律取「标准档」——页面默认适用、最常被引用的那一档;不取促销折扣档,也不取特殊场景档(批量/长上下文加价)。档位选择记入各源 source.config,逐源在解析器注释中写清楚依据(如 pipeline/ingest/parsers/anthropic.py 对 Model pricing 表 vs. Batch/Fast mode 表的边界处理)。
6. 币种:指数不换汇,展示才换汇
指数计算全程不做汇率折算。等权相对价里每个成分的权重固定为 1/22,与其绝对价格水平、计价币种完全无关——每个成分先算「自己当期价 ÷ 自己基期价」的比值(无量纲,币种在这一步已经约掉),再对 22 个比值做等权平均。因此人民币计价的低价模型不会因为数字小而在指数里占比更小,美元计价的高价模型也不会因为数字大而占比更大——这正是选「等权相对价」而非「等权绝对价」的原因(主 spec §3.2)。若指数计算时先按汇率折算成同一币种再算,反而是把汇率波动本身混进了「模型价目表在怎么走」这个信号里,属于口径污染。
展示层则统一换算给用户看:全站绝对价默认统一按一个币种展示(默认 CNY),页头可切换 CNY/USD;换算使用 fx_rate 表的 USD/CNY 日频中间价(一手来源:中国外汇交易中心公开中间价),页面标注所用汇率与日期。ticker 页价目表卡同时保留原币价(不换算的那个数字,字号更大,在上)与换算价(「≈」前缀,字号更小,在下)。图表数值永远按原币展示、不随币种切换换算——避免把汇率波动的锯齿画进价格走势图里,误读成模型真的在涨跌。相对量(日环比、指数值本身)不受币种切换影响。
设计出处:docs/specs/2026-07-10-token-price-band-design.md §4.2、§7(2026-07-10 人类反馈新增)。
7. V1 历史回填口径与质量门控结论
前代产品(V1)留有一批历史官方价观测,人类对 V1 期数据质量有明确疑虑(V1 期约 90% 的 issue 是数据质量修复),因此本产品回填先复查、复查结果决定回填范围,不是照单全收。
全量核验结论(docs/reports/2026-07-v1-backfill-audit.md,Task 0,对 214 万行 V1 导出数据全量扫描,非抽样):
- 智谱(GLM)/ 月之暗面(Kimi)/ 火山引擎(Doubao)/ 腾讯混元这 4 个系列,在 V1 里没有任何一条真一手官方价——这 4 个系列当时用的 providerId 全部标注为聚合镜像(
aggregator_api、isMirrorSource=true),不是厂商官方页抓取。这 4 系列不回填,历史序列从本产品实际采集起点开始,如实留白,不拿聚合价冒充官方价。 - Anthropic / OpenAI / Google / DeepSeek / 阿里百炼这 5 个系列有真一手官方价,经字符串级比对与人工分层抽样核验(55 个样本对照定价页快照与已知价格锚点)后,Task 0 阶段确定回填范围为 8 支 ticker 的子集(其中 deepseek 两支后因币种记录问题被弃用,最终有效回填 6 支,见下方「接缝处置②」):
- 7 支高置信度别名映射:
claude-fable-5/claude-opus-4-8/claude-haiku-4-5(Anthropic)、gpt-5-4/gpt-5-5(OpenAI)、deepseek-v4-pro/deepseek-v4-flash(DeepSeek)。 - 追加确认的
gemini-3-5-flash(Google)——型号 retarget 至 3.5 后,V1 侧model_gemini-3-5-flash*数据回归可映射,导出内实测仅 GA 单一变体、无 preview/lite 歧义。
- 7 支高置信度别名映射:
- 以下疑点项经人类逐条裁决排除,不回填:
claude-sonnet-5(V1 期从未出现该型号,扫描 Anthropic 全部 modelId 最高只到claude-sonnet-4-6);claude-mythos-5(价格点与claude-fable-5高度重合,疑似同一模型曾用名,未能证实,按不同模型/不映射处理);gemini-3-1-pro-preview(预览版定价与正式版惯例不同,样本窗口过短);gemini-3-1-flash-lite(与gemini-3-1-flash是不同档位 SKU,价格不可比)。 - 阿里百炼在 V1 期最新只到 Qwen3.5,与白名单要求的 Qwen3.7-Plus/Max 隔了一代,无对应型号,该系列本轮不回填。
回填执行:一次性 job(pipeline/jobs/backfill_v1.py)按 (modelId, 自然日) 去重取当日末次写入 observation,status 全部标记 accepted(质量门控已在 Task 0 人工完成,回填顺序按 modelId 分组而非严格时间序,若再叠加环比校验闸会因跨模型假环比噪音误隔离本应通过的历史价);快照证据指向归档进 data/snapshots/ 的 V1 原始导出文件(meta.v1_backfill=true),可回溯到 VPS 原始归档。V1 观测只有 input/output 两个构件(未见分存缓存价),回填段混合价按「缓存读=输入价」降级口径计算(同 §2 规则)。
回填段与现采段交界做价格连续性检查(backfill_v1.py::check_seam_continuity,设计 §6.5,交界日价差 >15% 触发人工复核)。dev 环境实测:V1 回填最终有效覆盖 6 支 ticker(claude-fable-5 / claude-opus-4-8 / claude-haiku-4-5、gpt-5-4 / gpt-5-5、gemini-3-5-flash)共 466 条观测,重放出 209 行 V1 窗口内的 ticker_day_price;append-only 库中还留存着 deepseek-v4-pro/flash 两支 ticker 已弃用的 216 条 V1 USD 观测(处置详见下方「接缝处置②」)。
这批回填历史如实呈现在各成分自己的 ticker 页构件序列图上(真实观测,不做任何跨接缝拼接),但不再是 Token 价格指数的起算依据——指数改为从每条系列自己的「构件口径稳定日」起算,与 V1 回填基期脱钩(详见下方「接缝处置①」)。token-price 目前钉在 2026-07-11 = 100(IndexSeries.start_date 起算地板,非传统意义上"回填结论确定后的可用序列共同首日")。
接缝处置①:降级口径与真缓存价不可跨接缝比较(2026-07-11 人类批准)
V1 回填段的混合价用的是本文 §2 的降级口径(无独立缓存读观测,按「缓存读价=输入价」代入计算)。2026-07-11 是本产品对多数已回填成分首次抓到真实独立缓存读价的日子——以 claude-fable-5 为例:07-10 仍是降级口径,(7×10+2×10+50)/10=14.00;07-11 起真实缓存读价(cache_read=1)代入后混合价变为 (7×1+2×10+50)/10=7.70。这不是模型真的降价 45%,是计算口径本身在这一天发生了结构性切换(从"缓存读=输入价的代理值"变成"缓存读的真实观测值")——降级口径的数字与真口径的数字在量纲上不是同一件事,不能跨接缝直接相除算涨跌,指数也不能把这天算作一次真实价格变动。
处置(人类裁决,2026-07-11):
IndexSeries新增start_date起算地板列——token-price 钉在构件口径稳定日而非 V1 回填基期,compute_for_date/--rebuild全量重算路径均挡在地板之前的所有日期之外(pipeline/jobs/compute_index.py)。dev 环境已 reseed + rebuild:token-price 首期=末期=2026-07-11=100.00,覆盖 8/17;回溯参考指数(token-price-us-retro,基期 2024-01-06)与 GPU 带指数(us-gpu-rental)未挂start_date,不受影响。- 展示层同步抑制:
getTokenPriceRows/getTokenRepriceEvents现在要求相邻两日「构件集签名」(当日官方 accepted 观测的offer_type全集)一致才计算日环比、才产调价事件;签名不同(如 07-10→07-11 因缓存读价从无到有)或任一日无官方观测,则展示层显示「—」、不产事件,不冒充官方调价(web/src/lib/db.ts)。
V1 段的历史价格数字本身没有错——只是不能拿它和真口径的当期价直接算相对变化。回填历史因此完整保留在各成分 ticker 页的构件序列图里(可核验、不删除),指数层面则如实止步于口径稳定日,不做跨口径的"假装连续"。
接缝处置②:deepseek V1 USD 段弃用与币种纪律(2026-07-11 人类批准)
deepseek 一手源(api-docs.deepseek.com)实测是 CNY 计价,但 V1 回填当时把 deepseek-v4-pro/deepseek-v4-flash 这两支 ticker 的历史观测当 USD 写入(单位记录本身有误)。修复前,日评估价与环比校验的基线不区分币种,会把现采的真实 CNY 价与 V1 遗留的 USD 基线直接相除比较,误判成约 590% 的巨变,导致 2026-07-11 现采的真实 CNY 观测被错误隔离。
人类裁决(2026-07-11):与其为这两支 ticker 补一段事后 USD→CNY 换算(无可靠汇率锚定历史每日观测点,且原始单位记录本身有误,纠正成本高、可信度低),弃用这两支 ticker 的 V1 USD 段,只保留现采 CNY 序列作为其历史起点:
pipeline/ingest/v1_alias_map.json删除这两条别名(8 → 6 条,对应上方"最终回填范围"从 8 支收窄到 6 支)。- 环比基线与日评估价计算改按币种纪律隔离:差分基线按
(offer_type, currency)隔离,日评估价(compute_token_for_date)只认 ticker 声明币种(pricing_meta.currency)的观测,跨币种观测天然被排除(pipeline/ingest/run.py、pipeline/jobs/compute_day_prices.py)。 pipeline/jobs/replay_snapshots.py泛化到全部 token 源后,对已入库但曾被币种接缝误隔离的 2026-07-11 快照重放,追加新的 accepted CNY 裁决行(append-only 更正路径,原隔离行原样保留,不删除不改写)。- 被弃用的 216 条 deepseek V1 USD 观测(108×2)不删除——append-only 纪律下原样留存于
price_observation,只是因币种声明纪律不再进入ticker_day_price等派生表;deepseek-v4-pro/flash 的构件序列图与价目表卡自 2026-07-11 CNY 现采起如实展示,此前无历史。
处置全文见 docs/reports/2026-07-v1-backfill-audit.md §5(追加记录,不改写原始核验结论)。
8. Wayback 回溯参考段(篮子与正式指数不同)
Token 价格参考指数(token-price-us-retro)是从 archive.org 对 Anthropic / OpenAI / Google 三家美国定价页的历史快照(2024-01 起)回溯重建的独立序列,用来在正式指数覆盖不到的更早年份,提供一条「美国旗舰模型价格大致怎么走过来」的参考曲线。
与正式 Token 价格指数的关键差异(如实分开,不混算):
- 篮子完全不同:回溯参考只有 3 支美国旗舰模型(伪 ticker
claude-flagship-retro/gpt-flagship-retro/gemini-flagship-retro),正式指数是 22 支多厂商篮子;两者不叠加、不合并、不互相拖累覆盖率。 - 各自独立起算:回溯参考基期 2024-01-06 = 100;正式指数(token-price)起算 2026-07-11 = 100(
IndexSeries.start_date起算地板,非 V1 回填基期——详见 §7 接缝处置①)。指数页分轴、分色展示(回溯参考用--mkt-us-fg蓝灰色,与正式指数的品牌橘区分)。 - 三家可回溯深度不齐:archive.org 对三家定价页的存档密度与可解析程度各不相同——claude 约 18 个月(自 2024-03 起)、gpt 约 11 个月(自 2024-01 起)、gemini 约 7 个月(自 2024-07 起;均为月频存档中实际可解析的期数)。参考指数早段覆盖率仅 1/3 起步(最早只有 gpt 一家可回溯到 2024-01),且月频稀疏存档下三家基本不同日现价,多数期只有单家在场——覆盖率逐期如实标注(§9),不因深度不齐做插值补齐。
- 回溯参考不入链、不参与正式指数的链式切换(
chain机制)——它是独立展示的参考序列,不是正式指数的历史延伸。 - 历史段只有 input/output 两个构件(archive.org 定价页存档普遍无法可靠解析出独立缓存价),混合价同样按「缓存读=输入价」降级口径计算。
- 定价页结构随年代漂移(页面改版、模型换代),解析器按「时代分段」(
source.config.archive_eras)尽力而为:某个时间点解析不出就跳过留空,图上表现为灰带缺口,不做插值补数据。
设计出处:docs/specs/2026-07-10-token-price-band-design.md §5;主 spec 评审 S1 落地项。
9. 覆盖率降级
两条指数都用 coverage_used / coverage_total 逐日公示覆盖率:分子 = 当日实际有价的篮子成分数,分母 = 篮子总量(正式指数 22、回溯参考 3)。
缺席成分不拖累发布——指数照实际在场成分等权平均发布,覆盖率如实标注在指数值旁;不做插值补齐,不假设缺席成分「维持上次的值」。若某一天篮子内全部成分都缺价,当期不发布(跳过留空),不会为了不留缺口而编造一个数字。生产阶段随各源逐个 enable,指数按实际覆盖如实发布(设计 §4.2)。
10. 入篮规则:后补入篮成分的无跳变公式
篮子成分并非全部从基期日起就同时在场——例如 kimi-k3 尚未挂出可解析的定价,基期日(2026-07-11,即当前起算日)当天它还不存在、没有价格(现状见 runbook §5)。这类成分不能简单地用「基期日的价格」当自己的基期(那天它压根没有价格),也不能强行推迟整个指数的基期去等它凑齐满篮(那会让已经发布的历史指数值全部推倒重算)。
做法是在成分实际有价的第一天(入篮日 T)反推一个基期价,使这个成分从入篮那一刻起,对指数的相对贡献恰好等于「入篮日 T 的入篮前指数值 ÷ 100」:
新成分基期价 = 入篮日 T 当日价 × 100 ÷ 入篮日 T 的入篮前指数值
(pipeline/core/index_math.py::admission_base_price)。这样入篮瞬间指数不会因为新成分加入而产生数值跳变——已发布的历史指数值完全不受影响,从入篮那天起,这个成分开始按自己后续的真实涨跌影响指数。批量重算(回填后 compute_index --all --rebuild)场景下,「入篮前指数值」精确定义为「当日已入篮且当日有价的成分」单独算出的指数值,而不是上一个处理日的收盘指数值——两者在稀疏篮子(如回溯参考,成分基本不同日现价)里数值相等看不出差异,但在稠密篮子(正式指数 22 支,同一天可能多支同时现价涨跌)里若锚错会把指数从「当日已有成分推到的位置」硬拽回去,制造真实的跳变(Task 18 review 修订)。
更正
发现已发布错值时,执行与其它指数相同的显式更正协议:追溯剔除错误观测 → 受影响期重算 → 事件流公告(更正协议见主 spec §4.5 护栏 8)。append-only 快照与观测本身永不改写,更正只新增、不覆盖。