# AI 模型计费模式总览与站点规划

本文把官方定价页中的计费方式抽象成可扩展的价格模型。它是后续数据结构和页面设计的规划，不代表当前已经完成所有供应商的核价。

## 已观察到的计费维度

### 1. Token 角色

最基础的价格维度不是一个“输入价”，而是：

- 输入（缓存未命中）
- 输入（缓存命中）
- 缓存写入
- 输出
- 推理 / 思考 token（有的平台单独计费，有的平台并入输出）

DeepSeek、Kimi、MiniMax 和 GLM 都至少使用输入、缓存命中、输出中的一部分；Kimi 和 MiniMax 明确展示缓存写入。

### 2. 缓存条件

缓存写入可能按以下条件变化：

- TTL：5 分钟、1 小时等；
- 自动缓存或显式缓存；
- 缓存存储按 token·小时计费；
- 命中后是否自动续期；
- 写入费用和命中费用是否同时收取。

Kimi 官方价格页把 TTL 5min、TTL 1h、缓存命中、缓存未命中拆成独立价格；GLM 展示“缓存存储（元/百万 Tokens/小时）”和“缓存命中”；MiniMax 展示缓存读取和缓存写入。

### 3. 输入条件

输入价格可能按以下条件分档：

- 上下文长度：例如 ≤512K、>512K；
- 输入 token 区间：例如 0–32K、32K–200K；
- 输入与输出组合区间；
- 模型版本、模式或端点。

MiniMax M3 按输入是否超过 512K 分档；GLM-4.7 同时按输入长度和输出长度分档；BigModel 价格页也包含上下文区间。

### 4. 时间与服务等级

价格不一定全天相同：

- 高峰 / 非高峰；
- 工作日 / 周末；
- 标准服务 / Priority 服务；
- 低延迟、保 SLA 或专用容量；
- Batch、Flex、异步或离峰推理。

DeepSeek 官方价格页把高峰与非高峰分开，并说明高峰时段；MiniMax 官方页把 Standard 与 Priority 分开，Priority 为标准价格的 1.5 倍。

### 5. 货币、地区与税费

同一个模型可能存在多张官方价目表：

- 中国区 CNY；
- 国际区 USD；
- 云厂商区域价；
- 税前 / 税后；
- 结算币种与展示币种不同。

国内和国际报价必须是独立 offer。换算汇率只能用于比较，不能把换算结果写回官方原币价格。

### 6. 服务和资源类型

除了文本 token，还可能按其他单位计费：

- 图片：张、像素、分辨率；
- 音频：秒、分钟、字符；
- 视频：秒、分辨率、生成阶段；
- 搜索、代码执行、联网、地图等工具调用：次或查询量；
- 文件、向量存储、缓存存储：GB、小时或对象数量；
- 批处理、队列、异步任务：任务数或 token。

这些价格不能和文本 token 价格混在同一张主表里，应使用独立的计费项目。

### 7. 优惠与商业规则

官方价格还可能包含：

- 永久折扣；
- 限时免费；
- 新用户免费额度；
- 试用额度；
- 充值赠送；
- 阶梯折扣或承诺用量折扣；
- 最低消费、账户套餐或合同价。

优惠必须和标准价同时保存，记录适用范围、开始时间、结束时间和是否自动计入主比较。优惠不能覆盖标准价，也不能把“免费额度”当成长期单价。

### 8. 版本和状态

价格与模型状态必须绑定：

- 模型 ID 和官方名称；
- 模型版本或快照；
- 预览、上线、下线、历史模型；
- 价格生效时间和失效时间；
- 官方页面最后更新时间。

旧模型价格不能因为名称相似而覆盖新模型。官方页面标记 retired、legacy 或 deprecated 时，要保留历史记录，但默认不进入当前推荐排序。

## 统一数据模型

价格数据统一使用“价格项 + 条件”的结构：

```ts
type PriceComponent = {
  role: 'input_miss' | 'cache_read' | 'cache_write' | 'output' | 'reasoning' | 'tool_call';
  amount: number | null;
  currency: 'CNY' | 'USD';
  unit: 'per_1m_tokens' | 'per_token_hour' | 'per_call' | 'per_second' | 'per_minute' | 'per_character' | 'per_gb_hour';
  conditions?: Condition[];
};

type Condition = {
  dimension: 'context_tokens' | 'input_tokens' | 'output_tokens' | 'ttl' | 'time_window' | 'service_tier' | 'region' | 'modality' | 'model_mode';
  operator?: '<' | '<=' | '>' | '>=' | '=' | 'between';
  value: string | number;
  upperValue?: string | number;
  label: string;
};

type Offer = {
  provider: string;
  market: 'cn' | 'intl' | string;
  sourceType: 'official' | 'aggregated';
  prices: PriceComponent[];
  standardPrices?: PriceComponent[];
  promotions?: Promotion[];
  effectiveFrom?: string;
  effectiveTo?: string;
  sourceUrl: string;
  capabilitySourceUrl?: string;
  fetchedAt: string;
  verifiedAt: string;
};
```

独立静态站不保留旧字段兼容层。迁移完成后，`prices[]` 是唯一价格来源；任何新报价必须直接写入价格项和条件。

## 站点展示方案

### 主表

主表只承担跨模型的快速比较，固定显示：

```text
模型 | 渠道 | 输入（未命中） | 缓存命中 | 输出 | 上下文
```

主表使用“标准服务、当前有效、官方原币”的默认价格。若存在条件价格：

- 数值旁显示“多条件”或“查看条件”；
- 不把第一档伪装成完整价格；
- 不在主表塞入 TTL、高峰、Priority 等所有列。

### 详情抽屉

详情抽屉按价格角色分组：

```text
输入
  缓存未命中：...
缓存
  缓存命中：...
  写入 TTL 5min：...
  写入 TTL 1h：...
输出
  标准：...
服务条件
  高峰：...
  非高峰：...
  Priority：...
```

每个价格项同时显示币种、单位、适用条件、来源、复核时间和生效时间。

### 筛选与比较

排序必须先选择比较口径：

- 默认：标准服务 + 输入未命中；
- 输入价：输入未命中；
- 缓存价：缓存命中；
- 输出价：输出；
- 条件价：只比较同一条件，禁止把高峰价和非高峰价混排。

如果一个模型只有分档价格，排序结果显示“按条件”，并在详情中解释采用了哪一档。跨币种比较使用参考汇率，但页面必须保留官方原币。

### 价格条和摘要卡

主表的价格条只对同一角色、同一单位、同一条件的价格做归一化。不能把输入价、缓存写入价和输出价放到同一条颜色尺度上。

首页摘要卡必须写明口径，例如“标准服务下的输入未命中最低价”，不能只写“最低输入价”。

## 数据录入和审核流程

每次核价按以下顺序执行：

1. 确认官方模型 ID、官方价格页和能力页。
2. 把页面上的每个价格角色抄成独立 `PriceComponent`。
3. 把 TTL、上下文、输入输出区间、时间窗、服务等级写成条件。
4. 标准价、优惠价、免费额度分开记录。
5. 记录币种、计价单位、地区、税费说明和页面更新时间。
6. 用第二次独立核对检查单位和条件边界。
7. 填写 `verifiedAt`，并保存原始页面快照或证据链接。
8. 发布前运行结构校验：每个价格项有单位；每个条件有维度；同一 offer 不存在重叠且互相矛盾的条件。

## 分阶段实施

### 阶段一：统一价格项模型（已开始）

- 已将现有报价迁移为 `prices[]`，价格角色、单位和分档条件独立保存。
- GLM、DeepSeek、Kimi、MiniMax 后续直接写入统一结构。
- 把 GLM 的分档价格完整放入详情抽屉。
- 主表只显示输入未命中、缓存命中、输出和上下文。

### 阶段二：DeepSeek / Kimi / MiniMax

- 为 DeepSeek 增加高峰 / 非高峰价格。
- 为 Kimi 增加 TTL 5min / 1h 缓存写入价格。
- 为 MiniMax 增加上下文区间、标准 / Priority、缓存写入。
- 国内和国际 offer 使用各自原币，不合并。

### 阶段三：通用价格项模型

- 引入 `prices[]` 和 `conditions[]`，兼容旧字段。
- 增加价格条件选择器，而不是继续增加固定表格列。
- 为图片、音频、视频、工具调用和存储建立独立计费项目。

### 阶段四：历史和商业规则

- 保存价格生效 / 失效时间和快照版本。
- 区分标准价、优惠价、免费额度、套餐价和合同价。
- 只有数据完整后，才考虑价格历史和成本计算器。

## 当前明确不做的事情

- 不把第三方聚合快照当作官方价格。
- 不用一个数字覆盖所有缓存、时间、上下文和服务等级条件。
- 不把汇率换算价写回官方原币字段。
- 不在主表新增十几个固定价格列。
- 不在缺少官方证据时推测 TTL、峰谷时段或优惠有效期。
