ccus-cli 0.2.18 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/cli.js +21 -8
- package/dist/lib/api-pricing-catalog.json +30 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -171,7 +171,9 @@ ccus aggregate serve --input-dir ./team-exports
|
|
|
171
171
|
- v11 在有未定价请求的成本结果中增加 `unpricedModels: [{ model, requestCount }]`,按原始模型名累计请求数,模型缺失记为 `null`,无未定价请求时省略。该明细仅写入 JSON,不增加页面或 CSV 字段;v10 导出仍可读取,但没有模型明细。
|
|
172
172
|
- 等效 API 成本按每次请求的模型、发生时间和 token 分类套用内置标准同步 API 价格。Claude 区分输入、输出、缓存读取及 5 分钟/1 小时缓存写入;Codex 区分净输入、缓存输入和输出。它不是 Claude/Codex 订阅账单,也不含税费、折扣、批处理、工具附加费或区域溢价
|
|
173
173
|
- 未知模型不会丢弃:有部分请求可定价时金额是已知小计,页面显示“至少为”;全部请求均无法定价时金额为不可用。个人 dashboard 在顶部第五张卡显示 Claude 与 Codex 的合计成本,不显示来源分项。全部模型价格集中维护在 `src/lib/api-pricing-catalog.json`,价格目录随 ccus 发布,统计过程不联网;个人与多人 dashboard 的合计成本卡下链接独立 `pricing.html` 并在新页面打开,价格页只保留一套标题,Codex 排在 Claude 前并按模型版本从新到旧排列。当前 Claude 目录包含 Opus 4.7、Opus 4.8、Opus 5、Sonnet 5 和 Fable 5;Sonnet 5 按事件时间区分活动价与标准价
|
|
174
|
-
- GPT-6 使用 `gpt-6-astra` 定价,兼容 `gpt-6` 别名及推理强度后缀。自 2026-09-03 起,每百万 token 输入 / 缓存读取 / 输出为 $10 / $1 / $50;输入与缓存读取合计超过 272K 时为 $20 / $2 / $75。来源:[OpenAI 模型定价](https://developers.openai.com/api/docs/models/gpt-6-astra)。价格目录版本为 `2026-09-
|
|
174
|
+
- GPT-6 使用 `gpt-6-astra` 定价,兼容 `gpt-6` 别名及推理强度后缀。自 2026-09-03 起,每百万 token 输入 / 缓存读取 / 输出为 $10 / $1 / $50;输入与缓存读取合计超过 272K 时为 $20 / $2 / $75。来源:[OpenAI 模型定价](https://developers.openai.com/api/docs/models/gpt-6-astra)。价格目录版本为 `2026-09-23`
|
|
175
|
+
- 自 2026-09-22 起,`gpt-6-sol` 每百万 token 输入 / 缓存读取 / 输出为 $2 / $0.20 / $10,`gpt-6-luna` 为 $0.10 / $0.01 / $0.50;输入与缓存读取合计超过 272K 时,分别为 $4 / $0.40 / $15 和 $0.20 / $0.02 / $0.75。均兼容推理强度后缀。来源:[OpenAI 价格表](https://developers.openai.com/api/docs/pricing)。
|
|
176
|
+
- 自 2026-09-22 起,`claude-opus-5-5`(目录名 `claude-opus-5.5`)每百万 token 输入 / 输出 / 缓存读取 / 5 分钟缓存写入 / 1 小时缓存写入为 $4 / $20 / $0.20 / $5 / $8。来源:[官方发布公告](https://www.anthropic.com/claude-opus-5-5)、[缓存计价说明](https://claude.com/blog/what-a-task-costs-on-opus-5-5)。
|
|
175
177
|
- `gpt-5.3-codex-spark` 自 2026-02-12 起按 `gpt-5.3-codex` 价格估算:每百万 token 输入 $1.75、输出 $14、缓存读取 $0.175。这是本项目采用的估算单价,并非 Spark 官方公开 API 定价。
|
|
176
178
|
- 默认文件名会带 git email 的帐号名前缀和起止日期,例如:`alice_export_2026-05-26_to_2026-06-01.json.gz`
|
|
177
179
|
- `userMessageCount` 来自 `~/.claude/projects/**/*.jsonl` 的非 meta `type:user` 事件
|
|
@@ -209,6 +211,8 @@ ccus aggregate serve --input-dir ./team-exports
|
|
|
209
211
|
|
|
210
212
|
## 定时同步
|
|
211
213
|
|
|
214
|
+
`sync`(含后台同步)、`export` 和个人 dashboard 在统计前自动同步 session 文件修改时间,默认仅修复跨天差异,并按实际文件去重硬链接。自动同步保持静默,异常信息可通过 `--verbose` 查看。
|
|
215
|
+
|
|
212
216
|
session 内容已更新但文件修改时间仍旧,导致统计遗漏时,可手动修复:
|
|
213
217
|
|
|
214
218
|
```bash
|
package/dist/cli.js
CHANGED
|
@@ -247,6 +247,25 @@ async function handleStatuslineEmit(options) {
|
|
|
247
247
|
process.stdout.write(`${fallback.statusLine}\n`);
|
|
248
248
|
}
|
|
249
249
|
}
|
|
250
|
+
/** 统计前静默同步会话修改时间,修复失败时仍尝试原有统计流程。 */
|
|
251
|
+
async function loadSessionUsage(start, end) {
|
|
252
|
+
try {
|
|
253
|
+
const { repairSessionMtimes } = await Promise.resolve().then(() => __importStar(require("./lib/session-mtime")));
|
|
254
|
+
const results = await repairSessionMtimes(false);
|
|
255
|
+
(0, debug_1.debugLog)("sessions", "统计前同步修改时间", {
|
|
256
|
+
scanned: results.length,
|
|
257
|
+
repaired: results.filter((result) => result.status === "repaired").length,
|
|
258
|
+
issues: results.filter((result) => result.status === "failed" || result.status === "skipped"),
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
(0, debug_1.debugLog)("sessions", "统计前同步修改时间失败", error);
|
|
263
|
+
}
|
|
264
|
+
return Promise.all([
|
|
265
|
+
(0, claude_1.summarizeClaudeProjectUsageCombined)(start, end),
|
|
266
|
+
(0, codex_sessions_1.summarizeCodexSessionUsageCombined)(start, end),
|
|
267
|
+
]);
|
|
268
|
+
}
|
|
250
269
|
/**
|
|
251
270
|
* 加载 dashboard 渲染数据:statusline 事件、Claude/Codex 每日消息数与标准 API 等效成本。
|
|
252
271
|
*
|
|
@@ -264,10 +283,7 @@ async function loadDashboardData(options, defaultRange) {
|
|
|
264
283
|
// codex 消息柱图走 dailyUserMessages,不受影响。
|
|
265
284
|
const events = (await (0, storage_1.readEventsForRange)(dataDir, range, now))
|
|
266
285
|
.map((record) => (0, payload_1.computeStatuslineEvent)(record));
|
|
267
|
-
const [claudeUsage, codexUsage] = await
|
|
268
|
-
(0, claude_1.summarizeClaudeProjectUsageCombined)(window.start, window.end),
|
|
269
|
-
(0, codex_sessions_1.summarizeCodexSessionUsageCombined)(window.start, window.end),
|
|
270
|
-
]);
|
|
286
|
+
const [claudeUsage, codexUsage] = await loadSessionUsage(window.start, window.end);
|
|
271
287
|
const claudeDailyUsage = claudeUsage.daily;
|
|
272
288
|
const codexDailyUsage = codexUsage.daily;
|
|
273
289
|
const dailyUserMessages = (0, time_1.enumerateDateKeys)(window.start, window.end).map((date) => ({
|
|
@@ -401,10 +417,7 @@ async function runExport(options) {
|
|
|
401
417
|
const statuslineDailyRows = (0, export_1.buildSummaryRows)(claudeEvents);
|
|
402
418
|
const codexStatuslineSummary = (0, dashboard_2.summarizeEvents)(codexEvents);
|
|
403
419
|
const codexStatuslineDailyRows = (0, export_1.buildSummaryRows)(codexEvents);
|
|
404
|
-
const [claudeScan, codexScan] = await
|
|
405
|
-
(0, claude_1.summarizeClaudeProjectUsageCombined)(window.start, window.end),
|
|
406
|
-
(0, codex_sessions_1.summarizeCodexSessionUsageCombined)(window.start, window.end),
|
|
407
|
-
]);
|
|
420
|
+
const [claudeScan, codexScan] = await loadSessionUsage(window.start, window.end);
|
|
408
421
|
const claudeUsage = claudeScan.weekly;
|
|
409
422
|
const claudeDailyUsage = claudeScan.daily;
|
|
410
423
|
const codexUsage = codexScan.weekly;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"catalogVersion": "2026-09-
|
|
2
|
+
"catalogVersion": "2026-09-23",
|
|
3
3
|
"currency": "USD",
|
|
4
4
|
"basis": "event-time-standard-api",
|
|
5
5
|
"entries": [
|
|
@@ -148,6 +148,13 @@
|
|
|
148
148
|
"effectiveTo": null,
|
|
149
149
|
"prices": { "inputUsdPerMillion": 5, "outputUsdPerMillion": 25, "cacheReadInputUsdPerMillion": 0.5, "cacheWrite5mInputUsdPerMillion": 6.25, "cacheWrite1hInputUsdPerMillion": 10 }
|
|
150
150
|
},
|
|
151
|
+
{
|
|
152
|
+
"provider": "claude",
|
|
153
|
+
"model": "claude-opus-5.5",
|
|
154
|
+
"effectiveFrom": "2026-09-22T00:00:00.000Z",
|
|
155
|
+
"effectiveTo": null,
|
|
156
|
+
"prices": { "inputUsdPerMillion": 4, "outputUsdPerMillion": 20, "cacheReadInputUsdPerMillion": 0.2, "cacheWrite5mInputUsdPerMillion": 5, "cacheWrite1hInputUsdPerMillion": 8 }
|
|
157
|
+
},
|
|
151
158
|
{
|
|
152
159
|
"provider": "codex",
|
|
153
160
|
"model": "gpt-5",
|
|
@@ -283,6 +290,28 @@
|
|
|
283
290
|
"thresholdInputTokens": 272000,
|
|
284
291
|
"prices": { "inputUsdPerMillion": 20, "outputUsdPerMillion": 75, "cacheReadInputUsdPerMillion": 2 }
|
|
285
292
|
}
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"provider": "codex",
|
|
296
|
+
"model": "gpt-6-sol",
|
|
297
|
+
"effectiveFrom": "2026-09-22T00:00:00.000Z",
|
|
298
|
+
"effectiveTo": null,
|
|
299
|
+
"prices": { "inputUsdPerMillion": 2, "outputUsdPerMillion": 10, "cacheReadInputUsdPerMillion": 0.2 },
|
|
300
|
+
"longContext": {
|
|
301
|
+
"thresholdInputTokens": 272000,
|
|
302
|
+
"prices": { "inputUsdPerMillion": 4, "outputUsdPerMillion": 15, "cacheReadInputUsdPerMillion": 0.4 }
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
"provider": "codex",
|
|
307
|
+
"model": "gpt-6-luna",
|
|
308
|
+
"effectiveFrom": "2026-09-22T00:00:00.000Z",
|
|
309
|
+
"effectiveTo": null,
|
|
310
|
+
"prices": { "inputUsdPerMillion": 0.1, "outputUsdPerMillion": 0.5, "cacheReadInputUsdPerMillion": 0.01 },
|
|
311
|
+
"longContext": {
|
|
312
|
+
"thresholdInputTokens": 272000,
|
|
313
|
+
"prices": { "inputUsdPerMillion": 0.2, "outputUsdPerMillion": 0.75, "cacheReadInputUsdPerMillion": 0.02 }
|
|
314
|
+
}
|
|
286
315
|
}
|
|
287
316
|
]
|
|
288
317
|
}
|