@yalieny/pi-better-cost-display-footer
pi extension: scriptable peak/off-peak tier rules per provider with an enhanced footer (tier label, cache-hit-rate precision, custom currency symbol)
Package details
Install @yalieny/pi-better-cost-display-footer from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@yalieny/pi-better-cost-display-footer- Package
@yalieny/pi-better-cost-display-footer- Version
2.3.0- Published
- Sep 22, 2026
- Downloads
- 1,225/mo · 56/wk
- Author
- yalieny
- License
- MIT
- Types
- extension
- Size
- 70.1 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./extensions"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@yalieny/pi-better-cost-display-footer
pi 扩展:脚本化多段计价动态列表 + footer 增强。
- 多段动态计价:每个 provider 一个
tierFn脚本函数(JS 表达式字符串)判定当前档位,档位是任意字符串 id(peak/flat/valley/sharp…),不绑定峰谷语义;在session_start、每次发送消息、每次 LLM 调用前重注册 provider 的cost(仅影响 pi 本地用量统计)。 - 计费自愈:每轮比对期望 cost(配置 × 当前档位)与实际参与计费的
ctx.model.cost,不一致则重注册纠正;连续 3 次未收敛则停止重试并在 footer 显式告警(金额前≈、标签加?),不再静默错价. - 档位标签:价格后紧跟当前档位标签(如
¥0.047(梁文峰)),按档位 id 配置文案与颜色;未配置标签的档位不显示。 - CH 精度:footer 缓存命中率小数位可配(默认 1 位)。
- tok/s 速率(思考/正文分相位):footer 常显 —— 流式中只显示当前相位的实时值
⚡45.2t/s(思考中/出字中都是这个形式,无前缀,2s 滚动窗口);assistant 消息结束(工具执行前)后冻结,只在冻结态带前缀,固定三档⚡(175.1/r31.8/o613.4)t/s= 总吞吐 / 思考(r标识) / 正文(o标识),无值打-占位:本条无思考就是⚡(334.8/r-/o336.2)t/s(无思考时总与正文本就重合)。分母均从各相位首 delta 起算,不含首 token 延迟与工具执行时长。实时值为估算(字符折算 token),思考/正文各自的折算比由真实usage.output/usage.reasoningEMA 自校准(初始 4,限幅 0.5~8);异常速率(>1000 t/s)丢弃。注:DeepSeek 在工具循环的续写消息里经常不吐思考,所以 r 档会时有时无(显示为-)。 - 货币符号:按 provider 配置计费金额符号(默认
$)。 - 配置升级:旧版顶层计价配置与
peakWindows首次启动自动迁移为 provider 分层 +tierFn格式(语义不变)。
安装
pi install npm:@yalieny/pi-better-cost-display-footer
或本地加载:pi -e npm:@yalieny/pi-better-cost-display-footer
配置
扩展读取 <configDir>/pi-better-cost-display-footer.json(configDir 默认 ~/.pi/agent,可用 PI_CODING_AGENT_DIR 覆盖)。配置文件不存在时自动生成默认配置并落盘(DeepSeek 官方价目,开箱即用,生成后可直接编辑);配置文件存在时按字段覆盖默认值(provider/model 三级深合并)。
{
"cacheHitRatePrecision": 3,
"providers": {
"deepseek": {
"timezone": "Asia/Shanghai",
"effectiveFrom": "2026-08-23T00:00:00+08:00",
"currencySymbol": "¥",
"tierFn": "(ctx) => ctx.isWeekend() ? 'offPeak' : (ctx.inWindow('09:00','12:00') || ctx.inWindow('14:00','18:00')) ? 'peak' : 'offPeak'",
"defaultTier": "offPeak",
"labels": {
"peak": { "text": "(梁文峰)", "color": "error" },
"offPeak": { "text": "(梁文谷)", "color": "success" }
},
"models": {
"deepseek-v4-flash": {
"offPeak": { "input": 1.5, "output": 4.5, "cacheRead": 0.05, "cacheWrite": 0 },
"peak": { "input": 3.0, "output": 9.0, "cacheRead": 0.1, "cacheWrite": 0 }
}
}
}
}
}
价格单位:每百万 tokens(元),与 pi 的 calculateCost 约定一致。effectiveFrom(含)之前不做任何事。
档位判定(tierFn)
tierFn 是 JS 函数表达式字符串(编译执行),返回任意档位 id(字符串)。上下文 ctx 均为配置时区本地值:
| 字段/方法 | 说明 |
|---|---|
ctx.now |
当前时刻 Date |
ctx.timezone |
计费时区 |
ctx.weekday |
0=周日 … 6=周六 |
ctx.hour / ctx.minute |
时区本地时钟 |
ctx.dateStr |
YYYY-MM-DD(如 '2026-10-01',可做日期区间比较) |
ctx.isWeekend() |
周六/周日 |
ctx.inWindow(start, end) |
HH:mm 窗口命中,含起点不含终点 |
ctx.afterISO(iso) / ctx.beforeISO(iso) |
ISO 日期比较(节假日窗口、调价日等) |
任一声场(语法错误、执行异常、返回非字符串、未配置 tierFn)→ 回退 defaultTier(默认 "offPeak"),绝不崩溃。旧字段 peakWindows 首次加载自动迁移为等价 tierFn 并写回配置文件(语义不变)。
示例(档位数不限):
- 工作日峰谷 + 周末全天低谷(DeepSeek 2026-08-23 起官方新规):
"(ctx) => ctx.isWeekend() ? 'offPeak' : (ctx.inWindow('09:00','12:00') || ctx.inWindow('14:00','18:00')) ? 'peak' : 'offPeak'" - 三段计价(尖峰/高峰/平段):
"(ctx) => ctx.inWindow('11:00','12:00') ? 'sharp' : ctx.inWindow('09:00','12:00') ? 'peak' : 'valley'"对应每个模型三方价格"sharp": {...}, "peak": {...}, "valley": {...},labels同样按档位 id 添加。 - 单一平价(官方取消峰谷):
"(ctx) => 'offPeak'" - 国庆节假日全天低谷:
"(ctx) => ctx.dateStr >= '2026-10-01' && ctx.dateStr <= '2026-10-07' ? 'offPeak' : (ctx.inWindow('09:00','12:00') ? 'peak' : 'offPeak')"
tierFn为本地执行脚本(new Function编译),仅应来自受信任的配置文件。
一键更新官方定价
/deepseek-pricing-update
该命令把抓取官方价目页、解析价格、更新配置文件的完整任务交给 agent 执行(自然语言指令,无需手动维护价格表)。命令会告知 agent 配置文件位置与 JSON 格式;agent 抓取 DeepSeek 官方价目页 后更新 providers.deepseek.models 下各模型的分档价格,其余字段不动。
计价诊断
/cost-tier
只读打印当前模型的档位状态:档位、期望费率 vs 实际计费费率、是否漂移、tierFn 编译状态、注册守卫与重试预算、最近一次注册结果。扩展的 console.error 在 TUI 下不落盘,排查"标签与金额不符"时用这条命令而不是猜。
测试
npm install && npm test # 纯函数单测(档位判定 / 漂移判定)
node --experimental-strip-types test/drift-probe.ts # 端到端:守卫重试与自愈(用系统临时目录隔离配置)
说明
- 顶层仅配置全局
cacheHitRatePrecision;timezone/effectiveFrom/currencySymbol/tierFn/defaultTier/labels/models均配置在对应 provider 下。 - provider 必须在
models.json中有定义;未列出的模型保持原价。 - 模型缺少当前档位价格时保持原价并打日志。
- cost 仅影响 pi 本地用量统计,不影响 API 实际账单。
footer 与 pi 升级
本扩展不再复刻 pi 的 footer。它在 session_start 加载已安装 pi 自己的
dist/modes/interactive/components/footer.js(路径由 pi 的 bin 反推),把内置的
FooterComponent 包一层,只在渲染结果上打补丁:
- 金额符号(
currencySymbol,内置硬编码$)。 - CH 小数位(
cacheHitRatePrecision,内置硬编码 1 位)。 - context 占用条(
█░░░░░░░░░ 10.5%/1.0M;外观抄pi-cc-extensions的barGauge,≥80% 转 warning、≥95% 转 error)。 - 档位标签(内置没有)。
- tok/s 速率段(内置没有)。
- pwd 行:cwd 只显示最底层目录(抄 cc),分支换成
⎇ 分支底色 chip(图标抄 look pack),后跟 git 变更行数+12 −3(数据与刷新抄 cc:git diff --numstat HEAD,启动查一次 + 10s 轮询 + 分支变化重查,跳过二进制行)。 - 右侧:模型(含
(provider)前缀)上底色 chip(抄 look pack),thinking 级别上色(抄 cc;分隔符沿用内置的•)。
pwd 行、统计段布局、对齐、截断、状态行、以及 pi 以后新增的字段,全部用内置渲染: pi 改 footer 会自动跟随,不会用旧版布局覆盖。补丁只改行的文本,并按补白收缩保证行宽不变。 空间不够时按 速率 → 标签 → 占用条 的顺序舍弃。
降级(都不会弄坏 footer):
- 拿不到内置组件(单文件二进制、源码运行、构造失败)→ 不替换,直接用 pi 自带 footer,并提醒一次。
- 内置 stats 行结构不认识(补丁打不上)→ 内置原样渲染,提醒一次;
/cost-tier的footer:一行给出状态。
footer 控制权(与其他扩展共存)
pi 没有“叠加 footer”的扩展点。两家扩展都调 setFooter 时,后调用的直接覆盖前一个
(顺序 = settings.packages 顺序)。已知的竞争者:pi-cc-extensions(enableCustomFooter: true,
两行 chips 状态栏)与 awesome-pi-themes 的 look pack。
本插件是通用插件,不做针对某个扩展的特例,总是接管 footer。要同时用对方的 footer,
就关掉一个(cc:/ccstyle,或 "enableCustomFooter": false)。
变更记录
- 2.3.0 footer 改为“增量补丁”而非整段复刻:加载并包装 pi 自己的
FooterComponent,只在渲染结果上换金额符号、改 CH 小数位、加 context 占用条、加档位标签与 tok/s;pwd 行改为“⎇ 分支底色 chip + git 变更行数”,右侧模型上 chip、thinking 上色(分隔符沿用内置)。占用条抄pi-cc-extensions的barGauge,分支图标与分隔符抄 look pack,git 变更行数(含 10s 轮询与分支变化重查)抄 cc。pi 升级 footer(新字段、新布局)自动跟随,不再覆盖。拿不到内置组件或布局变化时降级为 pi 自带 footer 并提醒一次。 - 2.2.0 footer 新增 tok/s 速率(思考/正文分相位):流式中显示当前相位实时值
⚡45.2t/s(无前缀,2s 滚动窗口),assistantmessage_end用真实usage冻结为固定三档⚡(175.1/r31.8/o613.4)t/s(总/思考/正文,无值打-占位);分母从各相位首 delta 起算,不含首 token 延迟与工具执行时长(定稿用 message_end 而非 turn_end)。实时值为估算,思考/正文各自的折算比由真实 token EMA 自校准(初始 4,限幅 0.5~8);异常速率(>1000 t/s)丢弃;无效usage(失败/中止)不覆盖定稿值。/cost-tier 新增两档折算比。 - 2.1.2 修复"档位标签正确但计费金额按错档结算":注册守卫改为按实际计费 cost 判定漂移(不再只看档位字符串),注册失败不再写入守卫(下一轮自动重试);漂移 3 次未收敛转为 footer 可见告警(
≈+ 标签?);新增/cost-tier诊断命令与注册失败一次性提示。方案见docs/fix-plan-stale-cost-tier.md。