痛点:AI 在跑,你在等
我用 OpenCode 写代码已经有一阵子了。说"写代码"不太准确,更像是"让 AI 帮我写代码,我等它写完"。
一个典型的场景是这样的:给 OpenCode 丢一个大任务——"重构这个模块"、"把测试补全"、"修这几个 bug"——然后它开始跑。快的几十秒,慢的可能几分钟甚至十几分钟。问题来了:我在这段时间里干什么?
盯着终端看进度?太无聊了。切去干别的事?怕错过完成时机,或者更糟——它报错了,我半小时后回来才发现。
桌面通知倒是有,但只在你坐在电脑前才有用。SSH 连着远程服务器?没有桌面。容器里跑着?没有桌面。合上笔记本去倒杯水?更没有桌面。
更让我焦虑的是另一个问题:这次任务到底烧了多少 Token?花了多少钱?
OpenCode 自己的界面能看用量,但你要在终端前才能看到。而且它只给你看单次会话的数据,子会话(subagent)的消耗散落在各个子任务里,你不去手动翻根本不知道整体开销有多大。
于是我做了 ul-opencode-event。表面上是通知插件,但真正想解决的是:让 AI 编程助手的任务状态和用量数据,随时随地推到你眼前。
不只是通知,是用量管家
通知只是载体。每一条推送到钉钉、飞书、邮件的消息里,都携带了三层聚合数据。
看一条真实的通知:
[ul-opencode-event] 任务已完成
任务完成时间: 2026-06-04, 20:22:23
会话: OpenCode 插件社区发布指南 (ses_16d7c43b...)
消息: Task completed successfully
耗时: 19m 36s
Token(53.7K/710.1K/81.5M) Cache:99.0%
Req(13/21/833) glm-5.1
这一行 Token(53.7K/710.1K/81.5M) Cache:99.0% 信息量很大:
- 53.7K — 当前会话的 Token 消耗
- 710.1K — 包含所有子会话的总消耗(subagent 也算进来了)
- 81.5M — 整个项目的累计 Token 消耗
- Cache:99.0% — 缓存命中率,99% 的输入 Token 命中了缓存
Req(13/21/833) 是请求次数的三个维度:当前会话 13 次 API 调用、含子会话 21 次、项目累计 833 次。
这三组数据——Token、请求次数、缓存率——在会话级、总计级、项目级三个层面实时聚合。每一条通知都是一份用量快照。
实践经验:项目级累计数据(那 81.5M)是我最看重的。一个项目从开写到收工到底烧了多少 Token,以前完全是笔糊涂账。现在每条通知都在帮你记账。
为什么要追踪子会话
OpenCode 有 subagent 机制——AI 会派子任务给其他会话去完成。你在跑一个重构任务的时候,底下可能已经起了五六个 explore agent、两个 oracle agent,各自独立消耗 Token。
这些子会话的消耗不会体现在主会话的统计里。你看到主会话只用了 5 万 Token,但子会话们加起来可能已经干了 50 万。
ul-opencode-event 递归收集所有后代会话(子、孙、更深层),把它们的 Token 和请求次数聚合到 total 字段里。你看到的是真实总开销,不是冰山一角。
支持的通知渠道
目前四个渠道可用:
| 渠道 | 状态 | 说明 |
|---|---|---|
| SMTP(邮件) | 已发布 | 任意 SMTP 服务器,QQ/163/Gmail 都行 |
| 钉钉机器人 | 已发布 | 群机器人,支持 Markdown 和 @人 |
| 飞书机器人 | 已发布 | 群机器人,支持交互式卡片 |
| 文件(JSONL) | 自动注入 | 本地日志,默认就有,不用配 |
计划中的:Webhook、Telegram、Slack、企业微信。够用了再说,不画大饼。
通知长什么样
钉钉

钉钉机器人支持 Markdown 格式。上面截图里两条通知,一条任务 13 秒完成(Token 31.6K),另一条跑了 19 分 36 秒(Token 53.7K)。注意看项目累计:两条之间从 81.4M 涨到 81.5M,差值刚好是这次任务的消耗。
飞书

飞书走交互式卡片格式,信息层次更清晰。这张截图里能看到任务已启动和任务已完成两种事件。启动通知告诉你"开始了"(带项目累计基线),完成通知告诉你"干完了"(带三层 Token 对比)。两条一对照,这次任务烧了多少 Token 一目了然。
邮件

邮件通道最通用,不管什么设备都能收到。
实践经验:邮件通道几乎是零门槛的。如果团队里有人不装钉钉也不用飞书,邮件是唯一能覆盖所有人的渠道。
事件订阅:不是什么都推
默认只推两种事件:idle(会话完成)和 error(出错了)。这是最核心的两个——你要知道 AI 干完了,也要知道它干崩了。
但事件类型远不止这两种:
| 事件 | 默认 | 说明 |
|---|---|---|
idle |
开 | 会话完成(AI 响应结束) |
error |
开 | 会话出错 |
question |
开 | AI 提问需要你回答 |
permission |
开 | 需要权限确认 |
created |
关 | 新会话创建 |
status |
关 | 会话状态变更 |
command |
关 | 命令执行 |
fileEdited |
关 | 文件编辑 |
todo |
关 | Todo 列表更新 |
question 和 permission 这两个我觉得特别有用。AI 跑任务时经常遇到需要确认权限或回答问题的场景,你不在旁边它就卡死等着。有了通知,手机一震就知道该回去处理了。
多通道策略
插件支持全局配置和项目级配置。我的做法是:
- 全局配一个邮件通道兜底,所有项目的通知都发到邮箱
-
团队项目里加一个钉钉群,但只推
error事件——群里只在出事的时候响,平时不吵 -
个人项目里配飞书,推
idle和error,信息密度刚好
实践经验:钉钉千万别全开,不然群里消息刷屏,很快大家就麻木了。错误通知才有打断的价值,完成通知看邮件就够。
成本统计:从糊涂账到心里有数
成本核算是用量追踪的自然延伸。插件内置了货币转换:
- 中文环境默认显示人民币(Y),英文环境默认美元($)
- 汇率可自定义,默认 1 USD = 7.25 CNY
- 小数位数可配置,默认保留四位
每条通知里虽然只显示 Token 数,但底层每条消息的 cost 都在累计。打开 JSONL 日志文件(默认自动注入,不用配),每条记录里都有完整的 cost 字段——会话级、总计级、项目级各一个。
跑完一天下来,翻翻日志就知道今天烧了多少钱。按项目维度汇总也行,按会话维度切片也行。数据全在本地,想怎么分析就怎么分析。
踩过的几个坑
SMTP 连接失败:十次里八次是密码写成了登录密码而不是授权码。QQ 邮箱在设置里开 SMTP 服务后会给你一个授权码,那个才是要填的。剩下两次是端口被防火墙拦了。
钉钉签名失败:secret 值复制的时候注意前后有没有空格。另外服务器时间偏差超过 1 小时也会签名失败。
飞书消息收不到:先确认服务器能正常访问 open.feishu.cn,有些公司内网会拦这个域名。
聊聊为什么做这个
一开始确实只是想解决"离开电脑收不到通知"的问题。做着做着发现,通知里的 Token 数据才是真正高价值的东西。
AI 编程助手的成本是个黑盒——你不知道一个任务烧了多少 Token,不知道子会话有多大的消耗,不知道缓存命中率是多少、合不合理。这些数据在 OpenCode 的 UI 里能看到一部分,但分散在各处,而且你不在终端前就看不到。
把用量数据打包进通知,推到手机上,这个问题就解了。每一条通知都是一份用量快照,积攒下来就是完整的成本账本。
后面还会加 Webhook 和 Telegram,不过核心功能已经够用了。工具这东西,够用就是最好的状态,加太多反而臃肿。
这个插件本身就是用 OpenCode 配合 GLM-5.1 模型全程开发的,文章里那些截图里的 Token 数据就是它自己跑出来的——算是自己给自己记账了。
开源地址在 Gitee:https://gitee.com/ulthon/ul-opencode-event
MIT 协议,想加什么通道或者有什么问题直接提 issue。
原文标题: 每次 AI 任务烧了多少钱?ul-opencode-event 让你心里有数
原文地址: https://phpreturn.com/index/a6a217e0714e74.html
原文平台: PHP武器库
版权声明: 本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。