Skip to content

feat(chat): live token counter in composer - #524

Open
chujieHong wants to merge 1 commit into
TencentCloud:developfrom
chujieHong:feat/chat-input-token-counter
Open

feat(chat): live token counter in composer#524
chujieHong wants to merge 1 commit into
TencentCloud:developfrom
chujieHong:feat/chat-input-token-counter

Conversation

@chujieHong

Copy link
Copy Markdown
Contributor

在 ChatInputActionsRow 输入框右下角加一个 BPE token 计数 chip, 点击展开 popover 显示本轮用量明细(input / output / cache hit / cache write / total / model calls)和缓存命中率。

后端零改动。

实现要点:

  • estimateTokens 用 js-tiktoken/lite + cl100k_base ranks,cl100k_base 与 GPT-3.5/4 token 数 1:1 对齐;o200k_base 留给 GPT-4o 单独引入
  • 计数懒加载,首次 ~250ms 冷启动,后续 < 0.5ms
  • popover 数据从 chatStore.runUsage 通过 useSyncExternalStore 订阅, SSE 用量 chunk 实时刷新
  • showUsage = model_calls > 0,新 thread 不弹空 popover
  • 缓存命中率 = cache_read / (cache_read + uncached_input), OpenAI 官方口径;无缓存字段时显示 —

触碰文件:

  • 新增: dashboard/src/utils/estimateTokens.ts + .test.ts
  • 新增: dashboard/src/pages/Chat/components/TokenCounter.tsx + .test.tsx
  • 修改: dashboard/package.json + package-lock.json (加 js-tiktoken 依赖)
  • 修改: dashboard/vite.config.ts (vendor-tiktoken 分块)
  • 修改: dashboard/src/locales/{en,zh}.json (7 条 i18n key)
  • 修改: dashboard/src/pages/Chat/chatInputCore.partial.less (chip + panel + hint)
  • 修改: dashboard/src/pages/Chat/components/ChatInputActionsRow.tsx (渲染 TokenCounter)

bundle 影响: vendor-tiktoken 1.10 MB raw / 505 KB gzip (SW precache 已验证通过)

Summary

image

Target branch

  • Base is develop (feature / fix — default)
  • Base is main (release/* or hotfix/* only)

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation
  • Refactor / chore
  • Release / hotfix

Test plan

  • make all passes locally
  • Added/updated tests

Checklist

  • Updated CHANGELOG.md (if user-facing)
  • README / docs updated (if needed)

在 ChatInputActionsRow 输入框右下角加一个 BPE token 计数 chip,
点击展开 popover 显示本轮用量明细(input / output / cache hit /
cache write / total / model calls)和缓存命中率。

后端零改动。

实现要点:
- estimateTokens 用 js-tiktoken/lite + cl100k_base ranks,cl100k_base 与
  GPT-3.5/4 token 数 1:1 对齐;o200k_base 留给 GPT-4o 单独引入
- 计数懒加载,首次 ~250ms 冷启动,后续 < 0.5ms
- popover 数据从 chatStore.runUsage 通过 useSyncExternalStore 订阅,
  SSE 用量 chunk 实时刷新
- showUsage = model_calls > 0,新 thread 不弹空 popover
- 缓存命中率 = cache_read / (cache_read + uncached_input),
  OpenAI 官方口径;无缓存字段时显示 —

触碰文件:
- 新增: dashboard/src/utils/estimateTokens.ts + .test.ts
- 新增: dashboard/src/pages/Chat/components/TokenCounter.tsx + .test.tsx
- 修改: dashboard/package.json + package-lock.json (加 js-tiktoken 依赖)
- 修改: dashboard/vite.config.ts (vendor-tiktoken 分块)
- 修改: dashboard/src/locales/{en,zh}.json (7 条 i18n key)
- 修改: dashboard/src/pages/Chat/chatInputCore.partial.less (chip + panel + hint)
- 修改: dashboard/src/pages/Chat/components/ChatInputActionsRow.tsx (渲染 TokenCounter)

bundle 影响: vendor-tiktoken 1.10 MB raw / 505 KB gzip
(SW precache 已验证通过)
@jubaoliang

Copy link
Copy Markdown
Collaborator

评估结论:不建议按现状合并。 实现能跑、测试也有,但解决不了「上下文会不会爆 / 这一轮花了多少」这类问题,和现有 UI 重叠,还要给 PWA 多 precache 大约 505KB gzip 的词表。

和现有能力重叠

用户可能以为 chip 在答 实际 仓库里已有
这段会不会塞爆窗口 否。只数当前输入框,不含历史、系统提示、工具、附件 ContextWindowRing:真实 last_input_tokens / 窗口上限,点开还有服务端分段
这一轮 / 这次会话花了多少 半个。popover 是本轮 runUsage ChatComposerChrome 已有会话合计;气泡上也有 usage
草稿大概多长 是,但这是弱需求

主要问题

  1. tokenizer 对 Octop 模型不准。 cl100k_base 只对 GPT-3.5/4 对齐。常见混元、DeepSeek、Claude、Qwen、Gemini、GPT-4o(o200k)都会偏。这个数字容易被当成账单或窗口占用。
  2. 「懒加载」不成立。 ranks/cl100k_base 是静态 import,TokenCounter 又被 ChatInputActionsRow 静态引入,进聊天页就会拉 vendor-tiktokenvite.configassets/vendor-*.js 会进 Workbox precache,每个安装都缓存这一坨。注释里「没打开 composer 就不涨包」对不上。
  3. 第三枚 chip 会和 Ring / 会话用量条抢注意力,产品缺口不大。

建议

  • 草稿长度:丢掉 js-tiktoken,用字符启发式(CJK≈1、拉丁≈4),零依赖,文案标成「约」。
  • 本轮明细:塞进现有 ContextWindowRing popover,或加强顶上 sessionUsageLabel,不要再加一枚 chip。
  • 若仍要 BPE:真正 import() 懒加载,并且不要让 vendor-tiktoken 进 SW precache。

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