TimedPS
TimedPS 是一个给 Trae / VS Code 使用的本地代理统计插件。
它的作用很简单:
- 在你本机启动一个本地 HTTP 网关,默认监听
31234 端口。
- 把你发给大模型的请求先经过这个本地网关,再转发到真实模型服务。
- 从模型返回结果里解析
usage 数据,统计 Token 用量和预估费用。
- 在编辑器里实时展示累计消耗、每轮历史记录,以及 DeepSeek 官方余额。
如果你之前总是搞不清楚“这一下午到底用了多少 Token、花了多少钱”,这个插件就是专门解决这个问题的。
它能做什么
- 在右下角状态栏实时显示总 Token、预估费用、官方余额。
- 点击状态栏后弹出悬浮面板,快速查看当前统计信息。
- 在侧边栏显示每一轮对话的历史记录。
- 自动记录每轮对话的大致提问摘要,方便回看。
- 支持区分输入 Token、缓存命中 Token、输出 Token。
- 支持按单价自动估算费用。
- 支持手动刷新 DeepSeek 官方余额。
- 支持手动设置 API Key。
- 支持查看本地网关运行日志,便于排查问题。
- 关闭编辑器后数据不会丢失,重新打开还能继续看历史。
工作原理
可以把它理解成一个“本地中转站”:
Trae / VS Code
-> TimedPS 本地网关(你的电脑,默认 31234)
-> 真实模型 API(默认 DeepSeek)
-> 返回结果给 Trae / VS Code
也就是说,Trae 原本直接请求 DeepSeek,现在改成先请求 http://127.0.0.1:31234。
TimedPS 收到请求后,会继续转发到真正的模型服务地址,比如 https://api.deepseek.com。
这样做的好处是:
- 不需要改你原本的使用习惯。
- 不需要改模型接口协议。
- 只要模型响应里带
usage,就可以统计。
适合谁用
- 想知道自己每天到底用了多少 Token 的人。
- 想知道大概花了多少钱的人。
- 使用 Trae 第三方模型配置的人。
- 想查看每轮 AI 对话消耗记录的人。
- 想排查代理请求、余额读取、端口冲突问题的人。
快速开始
如果你是第一次使用,建议先看这一节。
最容易漏掉的两件事就是:
- 先把 Trae 的自定义模型地址改到 TimedPS 本地代理。
- 再确认 API Key 是否已经带上,这样统计和余额功能才能正常工作。
只要这两步没配对,插件通常就会出现“装上了但没统计”“看不到余额”“状态栏没变化”这些问题。
第 1 步:安装插件
先把 TimedPS 安装到 Trae 或 VS Code 里。
如果你手里已经有打包文件,比如:
常见安装方式:
- 打开编辑器扩展页。
- 选择“从 VSIX 安装”。
- 选中
timedps-0.0.5.vsix。
- 安装完成后重载窗口。
安装完成后,右下角通常会出现 TimedPS 的状态栏信息。
常见显示有两种:
网关未连接
123k · ¥0.1234 ¥99.00
如果显示 网关未连接,一般说明:
- 本地网关还没成功启动。
- 配置端口被其他程序占用了。
- 插件刚启动,正在等待网关连接。
第 2 步:先配置 Trae 自定义模型
这一步最重要,而且一定要放在前面做。
插件安装完以后,并不会自动接管你的模型请求。
你必须手动把 Trae 里对应模型服务商的请求地址改成 TimedPS 的本地网关地址,请求才会先经过插件。
默认本地代理地址是:
http://127.0.0.1:31234
如果你的模型接口原本带 /v1 前缀,通常要改成:
http://127.0.0.1:31234/v1
你可以按下面步骤操作:
- 打开 Trae 的设置页。
- 找到你正在使用的自定义模型或第三方模型配置,比如 DeepSeek。
- 找到
Base URL、API Base URL、Endpoint 或类似字段。
- 把原来的官方地址改成 TimedPS 本地代理地址。
- 保存设置。
最常见的对应关系如下:
原地址是 https://api.deepseek.com
就改成 http://127.0.0.1:31234
原地址是 https://api.deepseek.com/v1
就改成 http://127.0.0.1:31234/v1
如果你不知道自己该填哪个,可以用这个最简单的判断方法:
- 你原来的地址后面没有
/v1,现在一般也不要加 /v1
- 你原来的地址后面有
/v1,现在一般也要保留 /v1
这一点非常关键,因为:
Base URL 不改,请求不会经过 TimedPS
- 请求不经过 TimedPS,就不会有 Token 统计
- 没有真正经过代理,插件也拿不到请求头里的 API Key
第 3 步:确认 API Key 已经设置好
这一步同样非常重要。
TimedPS 自己不负责帮你申请 API Key,它只是读取和使用你已经在 Trae 或命令里提供的 Key。
当前有两种方式让插件拿到 API Key。
方式 A:直接使用你在 Trae 自定义模型里填写的 API Key
这是最常见、也是最推荐的方式。
你在 Trae 自定义模型配置里,本来就会填写 API Key。
只要请求真的经过 TimedPS,本地网关就会从请求头里的 Authorization: Bearer ... 自动提取这个 Key。
这意味着:
- 你不一定需要额外手动设置 API Key
- 只要你已经在 Trae 里填好了,并且请求走到了本地代理,插件一般就能自动拿到
方式 B:手动设置 API Key
如果你还没有真正发起过一次请求,或者自动提取失败,也可以手动设置。
操作方法:
- 打开命令面板。
- 搜索
AI 用量:手动设置 API Key。
- 输入你的 DeepSeek API Key,例如
sk-...。
- 保存后,插件会把它写入本地汇总数据中。
这种方式适合下面几种情况:
- 你还没开始正式对话,但想先测试余额刷新功能。
- 你的请求没有成功经过代理,导致自动提取失败。
- 你想先单独确认 Key 是否可用。
第 4 步:确认官方余额能不能正常获取
如果你使用的是 DeepSeek,建议把这一步也尽早做掉。
操作方法:
- 打开命令面板。
- 搜索
AI 用量:刷新官方余额。
- 执行后观察是否提示获取成功。
这一步的意义是:
- 可以顺便确认你的 API Key 是有效的
- 可以确认插件已经拿到或保存了 API Key
- 可以提前排除“为什么后面看不到余额”的问题
如果刷新失败,常见原因通常是:
- 当前还没有可用的 API Key
- API Key 填错了
- 你当前使用的不是 DeepSeek
第 5 步:发起一次正常对话
现在你像平时一样在 Trae 里和模型对话就行。
当请求经过 TimedPS 后,插件会自动:
- 提取用户问题摘要。
- 解析响应里的
usage。
- 统计 Token。
- 计算预估费用。
- 记录到历史列表。
第 6 步:查看统计结果
你可以从 3 个地方看数据:
- 状态栏
- 点击状态栏后的悬浮面板
- 可以看到总 Tokens、预估费用、官方余额、网关状态。
- 左侧 AI 用量侧边栏
安装方式
方式一:安装打包好的 .vsix
如果你已经有打包文件,比如:
可以直接在 Trae 或 VS Code 里安装这个扩展包。
方式二:本地源码运行
如果你是开发者,或者你想自己改代码后测试:
- 进入项目目录。
- 安装依赖。
- 编译 TypeScript。
- 在 VS Code / Trae 里启动扩展调试。
常用命令:
npm install
npm run compile
开发时监听编译:
npm run watch
打包 .vsix:
npm run package
界面说明
1. 状态栏
状态栏在编辑器右下角。
当网关连接正常时,会显示类似:
12.3k · ¥0.0567 ¥18.42
这几个值分别表示:
- 第一个值:累计 Token。
- 第二个值:累计预估费用。
- 第三个值:官方余额(有时会显示,有时不会显示)。
如果当前没有成功连上网关,会显示:
网关未连接
点击状态栏,会打开统计悬浮面板。
2. 悬浮统计面板
点击状态栏后,会弹出一个悬浮面板,里面会展示:
这个面板右上角还有一个刷新按钮,用来刷新官方余额。
3. 左侧侧边栏历史
插件会在 Activity Bar 里提供一个 AI Usage 视图。
这里会按时间倒序显示每轮对话历史,每条记录会显示:
点开某一条记录后,还能看到详细拆分:
- 费用
- 总 Tokens
- 未命中缓存的输入 Token
- 命中缓存的输入 Token
- 输出 Token
- 本轮 API 请求次数
它是怎么统计“每一轮”的
插件不是简单地把每次 HTTP 请求都当成一轮。
它会把一次对话过程里的多次相关请求,尽量合并成同一轮来记录。
比如:
- 先发起一次提问
- 中间模型又触发一次内部继续生成
- 或者发生多次连续调用
这些都会尽量累加进同一轮里。
同时,插件会从请求体里的 messages 中提取最后一条用户消息,并清理掉一些 IDE 自动注入的上下文噪音,让历史记录里的标题更像“你真正问的问题”。
支持的响应类型
当前实现支持两类响应统计:
- 普通 JSON 响应
- SSE 流式响应(
text/event-stream)
也就是说,不管你是一次性返回,还是流式输出,只要上游响应里包含 usage 信息,TimedPS 就会尝试统计。
费用是怎么计算的
TimedPS 会分别统计:
- 未命中缓存的输入 Token
- 命中缓存的输入 Token
- 输出 Token
然后按下面思路估算费用:
费用 =
未命中缓存输入 Token / 1,000,000 × 输入单价
+ 命中缓存输入 Token / 1,000,000 × 缓存命中单价
+ 输出 Token / 1,000,000 × 输出单价
默认价格配置是:
你可以在设置里改成适合你当前模型的价格。
插件命令
打开命令面板:
- macOS:
Cmd + Shift + P
- Windows / Linux:
Ctrl + Shift + P
搜索 AI Usage,你会看到这些命令。
AI Usage: Show Details
打开或关闭悬浮统计面板。
AI Usage: Reset Usage
清空累计统计和历史记录。
适合在以下场景使用:
- 你想从今天重新开始统计。
- 你想单独统计某一次任务的消耗。
AI Usage: Refresh Official Balance
主动刷新 DeepSeek 官方余额。
AI Usage: Set API Key Manually
手动输入并保存 DeepSeek API Key。
这个命令主要用于下面两种情况:
- 你还没真正发起过代理请求,但想先刷新余额。
- 自动从请求头里提取 API Key 失败了。
AI Usage: Refresh History Tree
手动刷新左侧历史记录树。
AI Usage: Show Gateway Log
打开本地网关日志文件,用于排查问题。
设置项说明
在设置里搜索 aiUsageTracker,可以看到以下配置项。
aiUsageTracker.targetApiUrl
真实要转发到的模型 API 基础地址。
默认值:
https://api.deepseek.com
如果你接入别的兼容 OpenAI 风格接口的服务,可以改这里。
aiUsageTracker.proxyPort
本地代理端口。
默认值:
31234
如果这个端口被别的程序占用了,可以换一个。
改完以后,别忘了同步修改 Trae 里的模型 Base URL。
aiUsageTracker.currencySymbol
界面显示的货币符号。
默认值:
¥
你也可以改成:
$
每 100 万个未命中缓存输入 Token 的价格。
默认值:
1
aiUsageTracker.outputPricePerMillion
每 100 万个输出 Token 的价格。
默认值:
2
aiUsageTracker.cacheHitPricePerMillion
每 100 万个缓存命中输入 Token 的价格。
默认值:
0.1
官方余额说明
插件支持查询 DeepSeek 官方余额,但有几个前提:
- 需要有有效的 DeepSeek API Key。
- 这个 API Key 会从代理请求头里自动提取,或者通过命令手动设置。
- 点击刷新余额后,插件会去请求 DeepSeek 官方的
/user/balance 接口。
注意:
- 这里的“官方余额”是 DeepSeek 官方余额。
- 即使你把
targetApiUrl 改成别的服务商,余额刷新功能也不一定适用。
- 如果你使用的不是 DeepSeek,这部分功能可能不可用,但 Token 统计仍然可以正常工作。
数据保存在哪里
插件的数据不是只放在内存里。
TimedPS 会把数据写到扩展自己的本地存储目录中,主要包括:
summary.json
- 保存累计 Token、累计费用、官方余额、API Key 等汇总信息。
history.jsonl
gateway.log
所以即使你关闭编辑器,只要没有手动重置,这些统计数据一般都会保留下来。
常见问题
1. 我安装了插件,但没有任何统计
最常见原因是:你还没有把 Trae 的模型 Base URL 改到本地代理地址。
请重点检查:
- 是否改成了
http://127.0.0.1:31234
- 或者
http://127.0.0.1:31234/v1
2. 状态栏一直显示“网关未连接”
可能原因:
- 插件启动网关失败。
- 当前端口被其他程序占用。
- 你改了端口,但 Trae 里还是旧端口。
建议排查:
- 检查
aiUsageTracker.proxyPort。
- 确认这个端口没有被别的程序占用。
- 执行
AI Usage: Show Gateway Log 查看日志。
3. 为什么有时候看不到官方余额
可能原因:
- 还没有获取到 API Key。
- API Key 无效。
- 你当前不是在用 DeepSeek。
- 还没有手动点击刷新余额。
解决方法:
- 先正常发起一次请求,让插件自动提取 API Key。
- 或者执行
AI Usage: Set API Key Manually 手动填写。
- 再执行
AI Usage: Refresh Official Balance。
4. 为什么金额和官网账单不完全一样
因为这里显示的是“按你配置的单价估算出来的费用”。
影响差异的因素包括:
- 你设置的价格是否和官方最新价格一致。
- 你使用的模型是不是当前这组单价。
- 服务商是否还有其他计费规则。
所以 TimedPS 更适合做“实时估算和趋势观察”,不是替代官方结算单。
适合用来排查哪些问题
如果你在 Trae 里配置了自定义模型,经常会遇到这些问题:
- 到底有没有真的走到本地代理?
- 请求有没有转发到上游?
- 上游响应是不是正常返回了?
- 为什么状态栏没有累计数据?
- 为什么余额刷新失败?
这时你可以:
- 看状态栏是不是已连接。
- 打开悬浮面板看网关状态。
- 打开左侧历史看是否有新记录。
- 执行
AI Usage: Show Gateway Log 看网关日志。
开发说明
当前项目主要文件:
src/extension.ts
- 扩展入口,负责状态栏、命令、侧边栏、启动网关进程。
src/gateway.ts
- 独立本地网关,负责请求转发、usage 解析、文件存储、余额接口。
src/treeProvider.ts
编译输出目录:
TypeScript 配置入口:
项目脚本:
npm run compile
npm run watch
npm run package
总结
如果你只想快速用起来,记住下面 3 件事就够了:
- 安装 TimedPS。
- 把 Trae 的模型
Base URL 改成 http://127.0.0.1:31234 或 http://127.0.0.1:31234/v1。
- 发起一次对话,然后去看右下角状态栏和左侧
AI Usage 历史面板。
做到这 3 步,插件基本就已经正常工作了。