跳转到内容

desktop/src-tauri/crates/core/src/pricing.rs

第 1 条注释,第 1 行

desktop/src-tauri/crates/core/src/pricing.rs:1

//! F2 价格快照与费用估算([价格规范](../../../docs/design/desktop-usage/pricing.md)、

第 2 条注释,第 2 行

desktop/src-tauri/crates/core/src/pricing.rs:2

//! [费用计算规则](../../../docs/design/desktop-usage/data-contract.md#pricing))。

第 3 条注释,第 3 行

desktop/src-tauri/crates/core/src/pricing.rs:3

//!(空行)

第 4 条注释,第 4 行

desktop/src-tauri/crates/core/src/pricing.rs:4

//! 单位约定:价格 = 最小货币单位的百分之一 / 百万 token(i64,如 $0.075/M = 750);

第 5 条注释,第 5 行

desktop/src-tauri/crates/core/src/pricing.rs:5

//! 单事件费用项以 i128 计算 round_half_up(token × 价格 / 100_000_000),

第 6 条注释,第 6 行

desktop/src-tauri/crates/core/src/pricing.rs:6

//! 同时保留精确分子,供汇总时先累加后舍入;不使用二进制浮点。

第 7 条注释,第 7 行

desktop/src-tauri/crates/core/src/pricing.rs:7

//!(空行)

第 8 条注释,第 8 行

desktop/src-tauri/crates/core/src/pricing.rs:8

//! 实付渠道未知时,只使用同模型且无歧义的官方 API 参考价。

第 9 条注释,第 9 行

desktop/src-tauri/crates/core/src/pricing.rs:9

//! 推理子集不与输出重复计价;未知 token 不补零;异常 token 不参与计价。

第 10 条注释,第 16 行

desktop/src-tauri/crates/core/src/pricing.rs:16

/// 仓库随版本维护的种子快照(种子导入幂等,见 [`crate::storage::pricing`])。

第 11 条注释,第 20 行

desktop/src-tauri/crates/core/src/pricing.rs:20

/// 币种枚举(种子与本程序当前核验范围;新币种需先核验对应价格资料再扩展)。

第 12 条注释,第 23 行

desktop/src-tauri/crates/core/src/pricing.rs:23

/// 服务档位(估算只自动匹配 standard;batch/flex/fast 行不串用)。

第 13 条注释,第 26 行

desktop/src-tauri/crates/core/src/pricing.rs:26

/// 缓存写 TTL 档(分钟)。

第 14 条注释,第 30 行

desktop/src-tauri/crates/core/src/pricing.rs:30

/// 金额换算分母:token × 价格(百分之一最小单位/Mtok) → 最小货币单位。

第 15 条注释,第 33 行

desktop/src-tauri/crates/core/src/pricing.rs:33

//(分隔线)

第 16 条注释,第 34 行

desktop/src-tauri/crates/core/src/pricing.rs:34

// 快照文件格式

第 17 条注释,第 35 行

desktop/src-tauri/crates/core/src/pricing.rs:35

//(分隔线)

第 18 条注释,第 37 行

desktop/src-tauri/crates/core/src/pricing.rs:37

/// 快照 JSON 文件(种子与用户手工导入同格式)。

第 19 条注释,第 48 行

desktop/src-tauri/crates/core/src/pricing.rs:48

/// 来源类型:seed、manual 或 community。

第 20 条注释,第 52 行

desktop/src-tauri/crates/core/src/pricing.rs:52

/// ISO 日期(YYYY-MM-DD,UTC)。

第 21 条注释,第 75 行

desktop/src-tauri/crates/core/src/pricing.rs:75

/// ISO 日期(YYYY-MM-DD,UTC 零点)。

第 22 条注释,第 92 行

desktop/src-tauri/crates/core/src/pricing.rs:92

/// 官方供应商按量价标记(v11;None = 按快照来源类型默认:seed/community

第 23 条注释,第 93 行

desktop/src-tauri/crates/core/src/pricing.rs:93

/// 为 true,manual 为 false)。

第 24 条注释,第 104 行

desktop/src-tauri/crates/core/src/pricing.rs:104

/// 解析后的快照(进入存储层前的运行时形态)。

第 25 条注释,第 128 行

desktop/src-tauri/crates/core/src/pricing.rs:128

/// NULL 阈值归一为 0。

第 26 条注释,第 130 行

desktop/src-tauri/crates/core/src/pricing.rs:130

/// 半开 [from, to);to None = 仍有效。

第 27 条注释,第 140 行

desktop/src-tauri/crates/core/src/pricing.rs:140

/// 官方供应商按量价标记:无精确匹配时的回退候选池(pricing.md 在线刷新设计)。

第 28 条注释,第 145 行

desktop/src-tauri/crates/core/src/pricing.rs:145

/// ISO 日期(YYYY-MM-DD)→ UTC 零点毫秒。

第 29 条注释,第 159 行

desktop/src-tauri/crates/core/src/pricing.rs:159

/// FNV-1a 内容哈希(跨版本稳定;用于同快照幂等导入判定)。

第 30 条注释,第 170 行

desktop/src-tauri/crates/core/src/pricing.rs:170

/// 内容哈希十六进制表示(TEXT 存储形态)。

第 31 条注释,第 175 行

desktop/src-tauri/crates/core/src/pricing.rs:175

/// 校验并归一化快照:格式标记、币种/档位枚举、非负价格、生效区间合法、

第 32 条注释,第 176 行

desktop/src-tauri/crates/core/src/pricing.rs:176

/// 同键区间不重叠、行内 price_id 唯一。

第 33 条注释,第 310 行

desktop/src-tauri/crates/core/src/pricing.rs:310

// 同键区间不重叠(半开 [from, to);to None 视为 +∞,其后不得再有同键行)。

第 34 条注释,第 342 行

desktop/src-tauri/crates/core/src/pricing.rs:342

// 内容哈希:修正必须换快照 ID(A10 幂等导入的前提)。

第 35 条注释,第 389 行

desktop/src-tauri/crates/core/src/pricing.rs:389

//(分隔线)

第 36 条注释,第 390 行

desktop/src-tauri/crates/core/src/pricing.rs:390

// 估算引擎(纯函数)

第 37 条注释,第 391 行

desktop/src-tauri/crates/core/src/pricing.rs:391

//(分隔线)

第 38 条注释,第 393 行

desktop/src-tauri/crates/core/src/pricing.rs:393

/// model_call 或 usage_observation 事件中的计价字段。

第 39 条注释,第 394 行

desktop/src-tauri/crates/core/src/pricing.rs:394

/// 调用方负责按 quality_json 把非 known(reported/derived)字段置 None。

第 40 条注释,第 408 行

desktop/src-tauri/crates/core/src/pricing.rs:408

/// 估算选项:精确渠道价优先;未知渠道仅允许无歧义的同型号官方参考。

第 41 条注释,第 411 行

desktop/src-tauri/crates/core/src/pricing.rs:411

/// 供应商(casefold 键)→ 用户选定的 (region, channel)。

第 42 条注释,第 413 行

desktop/src-tauri/crates/core/src/pricing.rs:413

/// 供应商(casefold 键)→ 缓存写默认 TTL 档(5/60 分钟)。

第 43 条注释,第 417 行

desktop/src-tauri/crates/core/src/pricing.rs:417

/// 估算用价格行集合(存储层载入全部行)。

第 44 条注释,第 423 行

desktop/src-tauri/crates/core/src/pricing.rs:423

/// 单事件估算结果。

第 45 条注释,第 426 行

desktop/src-tauri/crates/core/src/pricing.rs:426

/// 至少一个分量计价成功(其余分量可能未计价——见 known/priced token 与

第 46 条注释,第 427 行

desktop/src-tauri/crates/core/src/pricing.rs:427

/// 分量 Option)。

第 47 条注释,第 429 行

desktop/src-tauri/crates/core/src/pricing.rs:429

/// 整条事件未计价(金额空,不写 0)。

第 48 条注释,第 435 行

desktop/src-tauri/crates/core/src/pricing.rs:435

/// 保留 token × 单价的精确分子,直到相应统计范围完成累加。

第 49 条注释,第 437 行

desktop/src-tauri/crates/core/src/pricing.rs:437

/// 归档中各请求的上下文档位未知时,对已计价费用项给出上界。

第 50 条注释,第 440 行

desktop/src-tauri/crates/core/src/pricing.rs:440

/// 分量金额(最小货币单位);None = 该分量未计价(token 已知但价格缺)。

第 51 条注释,第 445 行

desktop/src-tauri/crates/core/src/pricing.rs:445

/// 已计价分量金额合计(仅 Some 分量求和)。

第 52 条注释,第 447 行

desktop/src-tauri/crates/core/src/pricing.rs:447

/// 已计价 token 数(按可计价分量)。

第 53 条注释,第 449 行

desktop/src-tauri/crates/core/src/pricing.rs:449

/// 已知 token 数(含未计价分量;覆盖比例 = priced/known)。

第 54 条注释,第 451 行

desktop/src-tauri/crates/core/src/pricing.rs:451

/// 存在未知 token 分量(输出或未缓存输入未知):金额只能部分估算(A2)。

第 55 条注释,第 453 行

desktop/src-tauri/crates/core/src/pricing.rs:453

/// 缓存写 TTL 采用用户默认档(事件未提供该值)。

第 56 条注释,第 455 行

desktop/src-tauri/crates/core/src/pricing.rs:455

/// 无精确 provider+模型匹配时采用了官方供应商按量价行(参考估算;

第 57 条注释,第 456 行

desktop/src-tauri/crates/core/src/pricing.rs:456

/// pricing.md 在线刷新设计)。

第 58 条注释,第 458 行

desktop/src-tauri/crates/core/src/pricing.rs:458

/// 经用户明确允许,使用另一模型的价格作为参考时所选的模型。

第 59 条注释,第 460 行

desktop/src-tauri/crates/core/src/pricing.rs:460

/// 参与计价的价格行(追溯)。

第 60 条注释,第 466 行

desktop/src-tauri/crates/core/src/pricing.rs:466

/// 来源没有报告任何可用于计价的 token 分量。

第 61 条注释,第 470 行

desktop/src-tauri/crates/core/src/pricing.rs:470

/// 官方参考渠道/地区/币种仍有歧义,或未知系列缺少渠道配置。

第 62 条注释,第 472 行

desktop/src-tauri/crates/core/src/pricing.rs:472

/// 无适用价格行(含事件早于快照生效起点)。

第 63 条注释,第 474 行

desktop/src-tauri/crates/core/src/pricing.rs:474

/// 分隔符归一化后仍有不同目录 ID,且没有精确匹配。

第 64 条注释,第 476 行

desktop/src-tauri/crates/core/src/pricing.rs:476

/// 存在多个上下文档但事件输入规模未知:不猜测档位。

第 65 条注释,第 478 行

desktop/src-tauri/crates/core/src/pricing.rs:478

/// token 异常(负值或缓存大于已知总输入):拒绝计价。

第 66 条注释,第 480 行

desktop/src-tauri/crates/core/src/pricing.rs:480

/// 中间量溢出:拒绝该事件计价并记诊断。

第 67 条注释,第 500 行

desktop/src-tauri/crates/core/src/pricing.rs:500

/// 单分量计价:token × 价格(百分之一最小单位/Mtok) ÷ 1e8,四舍五入到最小货币单位。

第 68 条注释,第 512 行

desktop/src-tauri/crates/core/src/pricing.rs:512

/// 分量槽位(金额列 + token 来源)。

第 69 条注释,第 538 行

desktop/src-tauri/crates/core/src/pricing.rs:538

/// 每个模型筛选一次价格行,保留全部生效区间、档位和快照优先级。

第 70 条注释,第 569 行

desktop/src-tauri/crates/core/src/pricing.rs:569

/// 按事件 occurred_at 所在的价格生效区间进行估算。

第 71 条注释,第 578 行

desktop/src-tauri/crates/core/src/pricing.rs:578

/// 按指定参考时点计价:`at_ms` 传入评估时点(now)即为"按当前价格模拟"。

第 72 条注释,第 588 行

desktop/src-tauri/crates/core/src/pricing.rs:588

/// 归档中的 token 合计无法确定各请求的上下文档位;在同一组所选价格内

第 73 条注释,第 589 行

desktop/src-tauri/crates/core/src/pricing.rs:589

/// 给出各费用项的上下界,不用整天输入合计选择请求档位。

第 74 条注释,第 630 行

desktop/src-tauri/crates/core/src/pricing.rs:630

// 异常 token:负值 / 缓存大于已知总输入(不用 max(0,…) 修饰)。

第 75 条注释,第 668 行

desktop/src-tauri/crates/core/src/pricing.rs:668

// 区间匹配:from ≤ at_ms < to(to NULL = 开放)。

第 76 条注释,第 694 行

desktop/src-tauri/crates/core/src/pricing.rs:694

// 实付渠道或供应商未知时也可展示参考估算,但不推断实际收费渠道。

第 77 条注释,第 695 行

desktop/src-tauri/crates/core/src/pricing.rs:695

// 模型供应商系列用于限制回退范围,模型版本仍须精确匹配。

第 78 条注释,第 716 行

desktop/src-tauri/crates/core/src/pricing.rs:716

// 继续检查渠道、币种和档位;只允许经明确授权的替代模型

第 79 条注释,第 717 行

desktop/src-tauri/crates/core/src/pricing.rs:717

// 对应的官方价格行参与计价。

第 80 条注释,第 796 行

desktop/src-tauri/crates/core/src/pricing.rs:796

// 先选择一个供应商和渠道,再确定上下文档位;混用供应商或币种

第 81 条注释,第 797 行

desktop/src-tauri/crates/core/src/pricing.rs:797

// 可能误选其他价格表中的高档位。

第 82 条注释,第 813 行

desktop/src-tauri/crates/core/src/pricing.rs:813

// 先确定价格目录中的模型名称,再选择档位;其他名称下的高档位

第 83 条注释,第 814 行

desktop/src-tauri/crates/core/src/pricing.rs:814

// 不能覆盖精确匹配的模型 ID。

第 84 条注释,第 838 行

desktop/src-tauri/crates/core/src/pricing.rs:838

// 各档位必须来自同一个按优先级选中的快照;混用新的基础价格

第 85 条注释,第 839 行

desktop/src-tauri/crates/core/src/pricing.rs:839

// 和旧的长上下文价格会形成不存在的价格表。

第 86 条注释,第 875 行

desktop/src-tauri/crates/core/src/pricing.rs:875

// 即使只有一个高档价格行,也必须验证输入达到该行阈值。

第 87 条注释,第 876 行

desktop/src-tauri/crates/core/src/pricing.rs:876

// 多档且输入规模未知时不能从价格簿顺序猜测档位。

第 88 条注释,第 897 行

desktop/src-tauri/crates/core/src/pricing.rs:897

// 相同档位跨快照重复时,候选行已按快照优先级排序。

第 89 条注释,第 908 行

desktop/src-tauri/crates/core/src/pricing.rs:908

/// 已选定价格行后的分量计价。

第 90 条注释,第 915 行

desktop/src-tauri/crates/core/src/pricing.rs:915

// TTL 默认档按事件供应商的用户配置取(回退行 provider 与事件不同也适用)。

第 91 条注释,第 921 行

desktop/src-tauri/crates/core/src/pricing.rs:921

// 未缓存输入:优先显式值;否则 total − read − write(三者均已知时派生)。

第 92 条注释,第 966 行

desktop/src-tauri/crates/core/src/pricing.rs:966

// 分量未计价:价格列缺失

第 93 条注释,第 1005 行

desktop/src-tauri/crates/core/src/pricing.rs:1005

// 缓存写:TTL 档由用户默认选定(事件未提供 TTL);未设默认档不计价。

第 94 条注释,第 1014 行

desktop/src-tauri/crates/core/src/pricing.rs:1014

// 已知零写入无需猜测 TTL,也不会产生写入费用。

第 95 条注释,第 1041 行

desktop/src-tauri/crates/core/src/pricing.rs:1041

// 无默认档或该档无价:写分量未计价

第 96 条注释,第 1055 行

desktop/src-tauri/crates/core/src/pricing.rs:1055

// 所有分量均未计价(价格列缺失或 token 未知):整条未计价。

第 97 条注释,第 1069 行

desktop/src-tauri/crates/core/src/pricing.rs:1069

/// 解析快照 JSON 文本(种子或用户文件)。

第 98 条注释,第 1109 行

desktop/src-tauri/crates/core/src/pricing.rs:1109

// 种子内 glm-5.1 两档阈值并存且不重叠。

第 99 条注释,第 1122 行

desktop/src-tauri/crates/core/src/pricing.rs:1122

// 同键两行首尾相接不重叠(from 相同则重叠)。

第 100 条注释,第 1132 行

desktop/src-tauri/crates/core/src/pricing.rs:1132

// $10/M = 100000 百分之一美分;1 token × 100000 / 1e8 → 0.001 美分 → 0。

第 101 条注释,第 1134 行

desktop/src-tauri/crates/core/src/pricing.rs:1134

// 1,234,567 × 80000 / 1e8 = 987.6536 → 988(E1 输入分量)。

第 102 条注释,第 1136 行

desktop/src-tauri/crates/core/src/pricing.rs:1136

// 1,000 × 280000 / 1e8 = 2.8 → 3(E6 输出分量,四舍五入)。

第 103 条注释,第 1138 行

desktop/src-tauri/crates/core/src/pricing.rs:1138

// 32,768 × 80000 / 1e8 = 26.2144 → 26(E6 输入分量)。

第 104 条注释,第 1169 行

desktop/src-tauri/crates/core/src/pricing.rs:1169

// 配置渠道后可计价(小 token 舍入为 0 是合法金额)。

第 105 条注释,第 1192 行

desktop/src-tauri/crates/core/src/pricing.rs:1192

// 缓存合计 110 超过总输入 100。

第 106 条注释,第 1204 行

desktop/src-tauri/crates/core/src/pricing.rs:1204

// P5/P6:glm-5.1 [0,32K) ¥6/¥24 与 [32K+) ¥8/¥28(百分之一分单位)。

第 107 条注释,第 1232 行

desktop/src-tauri/crates/core/src/pricing.rs:1232

// 输入规模未知 → 不猜档。

第 108 条注释,第 1237 行

desktop/src-tauri/crates/core/src/pricing.rs:1237

// E6:输入 32,768 命中高档 → 26 + 3 = 29 分。

第 109 条注释,第 1253 行

desktop/src-tauri/crates/core/src/pricing.rs:1253

// E7:输入 32,767 命中低档 → 20 + 2 = 22 分。

第 110 条注释,第 1310 行

desktop/src-tauri/crates/core/src/pricing.rs:1310

// 测试单价为每百万 token $0.10/$0.01/$0.03/$0.50,即 1000/100/300/5000 百分之一美分。

第 111 条注释,第 1331 行

desktop/src-tauri/crates/core/src/pricing.rs:1331

// 未设默认 TTL 时写入不计价;已知输入和输出金额合计 10 + 50 = 60 美分。

第 112 条注释,第 1340 行

desktop/src-tauri/crates/core/src/pricing.rs:1340

// 设默认 5m 档后:写分量 1M×300/1e8=3,标 defaulted。

第 113 条注释,第 1366 行

desktop/src-tauri/crates/core/src/pricing.rs:1366

// 无显式 uncached:total 3_000_000 − read 1_000_000 − write 1_000_000 = 1M。

第 114 条注释,第 1381 行

desktop/src-tauri/crates/core/src/pricing.rs:1381

// 各项 1M × 单价除以 1e8 后为 10 + 1 + 3 + 50 = 64 美分。

第 115 条注释,第 1400 行

desktop/src-tauri/crates/core/src/pricing.rs:1400

// 2001 年,早于 2026-01-01 生效起点

第 116 条注释,第 1411 行

desktop/src-tauri/crates/core/src/pricing.rs:1411

//(分隔线)

第 117 条注释,第 1412 行

desktop/src-tauri/crates/core/src/pricing.rs:1412

// 官方供应商回退匹配(当前规则;pricing.md 在线刷新设计)

第 118 条注释,第 1413 行

desktop/src-tauri/crates/core/src/pricing.rs:1413

//(分隔线)

第 119 条注释,第 1415 行

desktop/src-tauri/crates/core/src/pricing.rs:1415

/// 带 official_vendor 标记的行 JSON(seed/community 默认 true;manual 默认 false)。

第 120 条注释,第 1428 行

desktop/src-tauri/crates/core/src/pricing.rs:1428

// 模拟社区快照:vendorA/m-one 的 official 标记默认 true。

第 121 条注释,第 1455 行

desktop/src-tauri/crates/core/src/pricing.rs:1455

// 事件 provider「relay-x」无精确行;回退到官方 vendorA 行并标记。

第 122 条注释,第 1463 行

desktop/src-tauri/crates/core/src/pricing.rs:1463

// 参考金额:1M × $10/M + 1M × $50/M = $60。

第 123 条注释,第 1468 行

desktop/src-tauri/crates/core/src/pricing.rs:1468

// 精确链命中时不回退:provider=vendorA 精确命中同一行,无回退标记。

第 124 条注释,第 1482 行

desktop/src-tauri/crates/core/src/pricing.rs:1482

// 无渠道配置也能展示唯一官方模型价,实付渠道仍不推断。

第 125 条注释,第 1491 行

desktop/src-tauri/crates/core/src/pricing.rs:1491

// 模型无官方行 ⇒ no_price_row。

第 126 条注释,第 1500 行

desktop/src-tauri/crates/core/src/pricing.rs:1500

// 手工导入行默认非官方 ⇒ 不进回退候选池。

第 127 条注释,第 1516 行

desktop/src-tauri/crates/core/src/pricing.rs:1516

// 手工行显式 official_vendor: true ⇒ 参与回退。

第 128 条注释,第 1535 行

desktop/src-tauri/crates/core/src/pricing.rs:1535

// 同一模型的两个官方行:region/channel 与配置一致者优先。

第 129 条注释,第 1573 行

desktop/src-tauri/crates/core/src/pricing.rs:1573

// 档位歧义在回退中同样不猜档:两个档位的官方行 + 输入规模未知。