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
// 档位歧义在回退中同样不猜档:两个档位的官方行 + 输入规模未知。