Skip to content

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

Merged
agegr merged 6 commits into
agegr:mainfrom
tossp:feat/usage-notice-emoji
Oct 29, 2026
Merged

agegr merged 6 commits into
agegr:mainfrom
tossp:feat/usage-notice-emoji

Conversation

@tossp

@tossp tossp commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

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

关联议题

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

关联 agegr#1416、agegr#1417。
The maintainer wants only pi TUI's footer format on the usage line under a
reply. Restore the files to the PR's base; the format change follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
↑1.2k ↓567 R8.9k W12 $0.0036, zero counts left out, through the
footer's formatTokens() (formatNoticeTokens(), already pinned against the
SDK), then the turn's time as before. Same in the demo mirror.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@agegr

agegr commented Oct 29, 2026

Copy link
Copy Markdown
Owner

谢谢!思路是对的:回复下方的用量行确实太长,在手机上尤其明显。不过我按 pi TUI 底栏的格式把它精简了,没有采用点击看明细和输出速度这一套。pi-web 是 pi 的轻量外壳,用量行和 TUI 保持一致最清楚。点击弹出的 Toast、模型和时间等元信息、t/s 速度、新图标、费用截断规则,这些都是 TUI 没有的界面负担;而且 t/s 把等待和工具执行的时间也算了进去,容易被误读。

我在你的分支上追加了两个提交(没有改写历史):

  • 撤回 MessageUsage / UsageIcon / message-usage、Toast 明细、平均速度、整轮用量汇总,以及新增的 i18n 文案和 e2e 脚本;处理详情行和耗时的位置保持原样。
  • 用量行改成 TUI 底栏的格式:↑1.2k ↓567 R85k W12 $0.0036 · 耗时 10s。数字用的是已有的 formatNoticeTokens(),它就是 pi 底栏 formatTokens() 的副本,已经有对照 SDK 的测试;费用格式和耗时不变。demo 镜像同步修改,docs/agents/sessions.md 补了一条说明,另外加了一个渲染测试。

npm test、tsc、lint 都通过。箭头和字母是 TUI 原样使用的符号,不需要翻译,所以 #1382 先合并的话,它新增的四个 chat.usage* 文案会在这里一并删掉。

agegr#1382 translated the old usage line; the TUI footer format has no words,
so formatUsage() keeps this branch's arrows, drops its t parameter, and
the four chat.usage* messages go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@agegr
agegr merged commit b966404 into agegr:main Oct 29, 2026
4 checks passed
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.

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

2 participants