- CLAUDE.md 升版至 V11.0:整合 P7/P9/P10 工作模式、12 人專家團隊、 委派鐵律、三條紅線(保留狙擊手模式精神) - .claude/hooks/:新增 8 個 Hook(momo-prod-guard / commit-quality / large-file-warner / mcp-health / audit-log / suggest-compact / cost-tracker / session-summary) - .claude/agents/:新增 11 個 Agent 定義(critic / debugger / db-expert / vuln-verifier / fullstack-engineer / planner / refactor-specialist / migration-engineer / onboarder / tool-expert / web-researcher) - .claude/settings.json:啟用 bypassPermissions + Hook 自動政策架構 - .gitignore:加入 settings.local.json 防止 Secret 意外 commit Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
37 lines
1.5 KiB
JavaScript
37 lines
1.5 KiB
JavaScript
/**
|
||
* cost-tracker.js — Stop Hook
|
||
* 追蹤 Token 用量與估算成本。定價已更新為 Claude 4.x。
|
||
*/
|
||
const fs = require('fs');
|
||
const os = require('os');
|
||
const path = require('path');
|
||
let d = '';
|
||
process.stdin.on('data', c => d += c);
|
||
process.stdin.on('end', () => {
|
||
try {
|
||
const i = JSON.parse(d);
|
||
const inputTokens = i.usage?.input_tokens || i.input_tokens || 0;
|
||
const outputTokens = i.usage?.output_tokens || i.output_tokens || 0;
|
||
const model = i.model || 'unknown';
|
||
// 定價 [input per M USD, output per M USD](2025 官方定價)
|
||
const pricing = {
|
||
'claude-haiku-4-5': [0.8, 4],
|
||
'claude-sonnet-4-6': [3, 15],
|
||
'claude-opus-4-7': [15, 75],
|
||
'claude-3-haiku': [0.8, 4],
|
||
'claude-3-sonnet': [3, 15],
|
||
'claude-3-opus': [15, 75],
|
||
};
|
||
const matchedKey = Object.keys(pricing).find(k => model.includes(k)) || null;
|
||
const [inputRate, outputRate] = matchedKey ? pricing[matchedKey] : [3, 15];
|
||
const cost = (inputTokens * inputRate + outputTokens * outputRate) / 1_000_000;
|
||
const metricsDir = path.join(os.homedir(), '.claude', 'metrics');
|
||
if (!fs.existsSync(metricsDir)) fs.mkdirSync(metricsDir, { recursive: true });
|
||
fs.appendFileSync(
|
||
path.join(metricsDir, 'costs.jsonl'),
|
||
JSON.stringify({ timestamp: new Date().toISOString(), model, input_tokens: inputTokens, output_tokens: outputTokens, cost_usd: cost.toFixed(6) }) + '\n'
|
||
);
|
||
} catch (e) {}
|
||
process.stdout.write(d);
|
||
});
|