Skip to content

优化回复用量摘要,支持精确明细与平均输出速度 - #1417

Open
tossp wants to merge 3 commits into
agegr:mainfrom
tossp:feat/usage-notice-emoji
Open

tossp wants to merge 3 commits into
agegr:mainfrom
tossp:feat/usage-notice-emoji

Conversation

@tossp

@tossp tossp commented Oct 25, 2026 •

Copy link
Copy Markdown

优化回复用量摘要,支持精确明细与平均输出速度

关联议题

Closes #1416

改动说明

将回复底部用量行改为“紧凑摘要 + 按需精确明细”,复用现有视觉和通知机制,不新增设置、依赖或会话字段。

紧凑摘要

  • 抽取共享的 UsageIcon,沿用顶部统计栏的 SVG:输入 ↑、输出 ↓,缓存读写使用互为镜像的圆弧箭头。
  • 图标继承文字颜色,不单独染色;不改变顶部统计栏和生成中的图标配色。
  • token 数量使用十进制 K/M,最多保留一位小数并去掉末尾 .0;四舍五入到 1000K 时提升为 1M。
  • 保留费用和耗时,增加有明确统计范围的平均输出速度。

精确明细

  • 点击或通过键盘激活统计行,复用现有 addNotice Toast 展示未缩写的用量、总计、费用、耗时和速度。
  • token 明细保留未缩写的精确整数;摘要、总费用及费用分项则统一截断至最多小数点后 4 位,不四舍五入并去除末尾多余的 0。例如 $0.023180000000000003 → $0.0231;小于 $0.0001 显示为 $0。原始费用及累计结果不变。
  • 展示用量对象已有的输入、输出、缓存读取和缓存写入费用分项;缺失的分项不伪造。
  • 单次响应明细展示已加载消息的模型、模型提供商、请求开始、响应完成、结束原因和已有错误。开始时间来自 timestamp,完成时间仅在开始时间及 durationMs 有效时推导,使用查看者时区;整轮明细不显示最后一次响应的元信息,避免范围混淆。
  • 没有明细回调的只读视图保留普通展示,不渲染无效按钮。
  • 新文本覆盖 en、zh-CN、zh-TW,图标保留本地化的名称提示;Provider 标签分别为 Provider、模型提供商、模型供應商。

用量与速度口径

  • 最终答案汇总本轮原始模型响应的用量,平均速度使用整轮输出 token 除以同一轮未取整的毫秒耗时。
  • 过程详情保留单次响应的用量,并仅在有相应耗时时计算其速度。
  • 不累计答案/过程拆分产生的显示副本,避免重复计数。
  • 整轮平均速度包含等待和工具执行时间,不等于模型纯生成速度;界面提示明确这一含义。
  • 耗时缺失、非正数或无效,或统计范围内存在响应用量缺失时隐藏速度。有效耗时下零输出可显示 0.0 t/s。
  • 全部数据来自已有消息及计时记录,刷新后可重新计算;生成中的估算测速保持不变。
  • 用量摘要及费用分项参与 MessageView 的 memo 比较,避免派生对象导致无关 Markdown 重绘,也避免总费用未变时漏掉分项更新。

范围与兼容性

  • 只调整展示及派生统计,不修改 pi 的会话格式、模型调用、工具行为或扩展 API。
  • 不增加运行时依赖、设置、自定义颜色、币种转换或新的持久化字段。
  • 明细仅使用前端已加载的消息及用量对象,不新增后端请求、文件读取、轮询或历史配置反查;不会为展示思考深度而补查额外数据。
  • 不包含后台子代理状态提示或本地分支的发布、登录页等改动。
  • 已注意 fix(chat): translate the usage line, the full-output links and a banner's close button #1382 对同一用量行的翻译工作,以及 feat(i18n): show costs in yuan for Simplified Chinese #1398 的费用展示工作;若这些 PR 先合并,将保留其语义并适配相关调用,不覆盖完整输出链接翻译或币种格式化。

验证

以下检查在独立功能分支 feat/usage-notice-emoji 的提交 ceddc2f 上执行,base 为上游 main 的 e533d9b:

  • npm test:2889 通过、1 跳过、0 失败。本机以 root 运行,测试进程通过 setpriv --bounding-set=-dac_override,-dac_read_search 关闭文件访问绕过能力,使权限相关测试按预期执行。
  • node_modules/.bin/tsc --noEmit --incremental false。
  • npm run lint。
  • git diff --check。
  • node e2e/usage-notice.mjs:Chromium 下 1280px 桌面与 375px 手机宽度通过。
  • 浏览器覆盖点击、Enter、未缩写 token 明细、费用截断、费用分项、响应元信息、整轮与单次响应统计范围、刷新恢复速度、输入/输出箭头方向、K/M 舍入、零值、旧消息缺少耗时及用量缺失等情况;未发生浏览器错误或额外模型请求。
  • 单元测试覆盖浮点尾差、四位小数截断、不修改原始费用、缺失分项、无效日期或耗时、三语言标签及元信息不混入整轮明细;独立审阅无阻断项。

浏览器回归使用隔离的合成会话目录和自行启动的开发服务,结束后停止该服务并清理合成会话;不写入真实会话,也不运行 next build。

主要文件

  • components/MessageUsage.tsx、components/UsageIcon.tsx:摘要、图标和精确明细。
  • lib/message-usage.ts:数字格式化、同范围平均速度和整轮汇总。
  • components/MessageView.tsx、components/ChatWindow.tsx、components/AppShell.tsx:展示与现有 Toast 的接入。
  • lib/i18n/messages/{en,zh-CN,zh-TW}.ts:本地化文案。
  • 对应单元测试、e2e/usage-notice.mjs 和 docs/agents/sessions.md:回归与维护说明。

TossPig added 3 commits October 25, 2026 19:14
复用前端已有消息展示模型提供商、响应时间和结束信息,不增加后端读取。统一费用摘要与分项显示为最多四位小数截断,保持原始数据不变。

关联 agegr#1416、agegr#1417。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

优化回复底部用量展示:紧凑数字、精确明细与平均输出速度

1 participant