5hãããã¯äžéãèžãåã«ç¥ã â token-budget-advisorãšã¹ããŒã¿ã¹ã©ã€ã³åã蟌ã¿
åäœãã¬ãŒããªãããã§æ¢ãŸã£ãã»ãã·ã§ã³ãèªååéãããã§ã¯5hãããã¯ã«æ¢ããããåŸã®è©±ãæžããŸãããä»åã¯æ¢ãŸãåã«æ°ã¥ãä»çµã¿ã§ãã
Claude MAXã®5hãããã¯ã¯åºåããŒã¯ã³ãäžéã«éããç¬éã«ã»ãã·ã§ã³ãæ¢ãŸããŸããã¹ããŒã¿ã¹ã©ã€ã³ã« ð 5h 82% ãèŠããŠããŠããæ®ã18%ãäœããŒã¯ã³åãã¯åãããŸããã**800kè¿ãã§ããããããã°ããã1.2Mè¶
ã§ãããè©°ãã§ããã**ãšãã絶察å€ã§ã®å¢çãæ€åºããã®ã token-budget-advisor.sh ã§ããã®èšäºã§ã¯ãã®èšèšãš dashboard.sh ãžã®çµ±åãã¹ããŒã¿ã¹ã©ã€ã³ãžã®é
ç·ãæžããŸãã
å°ãããšïŒäžéãèžããŸã§æ°ã¥ããªã
Claude Codeã®ã¹ããŒã¿ã¹ã©ã€ã³ã«ã¯ ð 5h N% ã衚瀺ãããŸãã~/.claude/scripts/statusline.sh ã¯ãããClaudeã®stdinããçŽæ¥èªãã§ããŸãã
H5=$(j '.rate_limits.five_hour.used_percentage // empty')
H5R=$(j '.rate_limits.five_hour.resets_at // empty')
pcolor 颿°ã50%以äžã§é»ã80%以äžã§èµ€ã«è²ãå€ããŸãããããã¯Claudeãèšç®ããããŒã»ã³ããŒãžã§ãã£ãŠã絶察ããŒã¯ã³æ°ã§ã¯ãããŸããã80%ãäœtokã«çžåœãããã¯Maxãã©ã³ã®å¥çŽç¶æ
次第ã§å€ãããé·ãè£å®ãç¶ãããšäžéã«å°éããŠæ¬¡ã®ã¿ãŒã³ããçªç¶æ¢ãŸããŸãã
確èªããã«ã¯æ¯å ccusage blocks ãå©ãå¿
èŠãããããããå¿ããŠéãã¿ã¹ã¯ãæµããš5hæ ããããã«äœ¿ãåããŸããç¡äººãžã§ããè£ã§åããŠããå Žåã人éãæ°ã¥ãåã«å
šSKIPç¶æ
ã«ãªãã
token-budget-advisor.sh ã®èšèš
~/.claude/scripts/token-budget-advisor.sh ã®ãããã«ããæ¹éããã®ãŸãŸèšèšã«ãªã£ãŠããŸãã
# ãããå€:
# 5h block: output > 800k â warn (>1.2M ã§ critical)
# weekly: cost > $3000 â warn
# sessions: >5/day â warn (éäžäœæ¥ã®çã)
#
# 倱ææã¯ exit 0 ã§ fail-open (dashboard çµ±åã®ãã)
# bash 3.2 äºæ
ãã¥ã¢ã«ãœãŒã¹ïŒccusage ã1次ãcost-log.jsonl ã2次
ãŸã ccusage blocks --json ã詊ã¿ãŸãã
if command -v ccusage >/dev/null 2>&1; then
CC_JSON=$(ccusage blocks --json 2>/dev/null || true)
if [ -n "$CC_JSON" ]; then
EXTRACTED=$(printf '%s' "$CC_JSON" | python3 -c "
import sys, json
try:
d = json.load(sys.stdin)
active = [b for b in d.get('blocks', []) if b.get('isActive')]
if active:
b = active[0]
tc = b.get('tokenCounts', {}) or {}
out = int(tc.get('outputTokens', 0))
cost = float(b.get('costUSD', 0))
print(f'{out}|{cost}')
...")
ccusage ãå±
ãªãç°å¢ã¯ cost-log.jsonl ã ãã§åããŸããäž¡æ¹ããå Žå㯠ccusage ã®å€ãåªå
ããå·®åã source_diff_pct ãšããŠèšé²ããŸãã
# ccusage ã®å€ãæå¹ãªããã¡ããåªå
(transcript èšç®ããä¿¡é Œã§ãã)
own_out_5h = out_5h
if cc_out is not None and cc_out > 0:
out_5h = cc_out
# æ¯èŒ (æ€èšŒçš)
diff_pct = None
if cc_out is not None and own_out_5h > 0:
diff_pct = round(abs(cc_out - own_out_5h) / max(cc_out, own_out_5h) * 100, 1)
å·®ã倧ããæã¯cost-logåŽã®éèšããžãã¯ã«åé¡ãããå¯èœæ§ããããsource_diff_pct ãç®å®ã«ãªããŸãã
cost-log.jsonl ã¯ãææ°è¡ã®ã¿æ¡çšãããªããšæ°å€ã2ã3åã«ãªã
cost-log.jsonl ã¯åã (session_id, transcript) ããŒã§è€æ°è¡æžãããŸãïŒã»ãã·ã§ã³éäžã®çޝç©å€ã远èšããã仿§ïŒãå
šè¡ãåç®ãããšããŒã¯ã³ãäºéã«ãŠã³ããããŸãã
# cost-log 㯠session_id à transcript ããšã«çޝç©å€ã§æžããã仿§ã
# ææ°è¡ã®ã¿æ¡çšããããã(session_id, transcript) ã§æçµè¡ãåãçŽãã
latest = {}
with open(log_path) as f:
for line in f:
r = json.loads(line)
key = (r.get("session_id", ""), r.get("transcript", ""))
prev = latest.get(key)
if (prev is None) or (t > prev[0]):
latest[key] = (t, r)
æçµè¡ã ãæ¡çšããŠãã5h/7dçªã§ãã£ã«ã¿ããŸãããããç¥ããã«å šè¡åç®ãããšãå®éã®2ã3åã®æ°å€ãåºãŸãã
ãããå€ãšå€å®ããžãã¯
THRESH_5H_WARN = 800_000 # output tokens
THRESH_5H_CRIT = 1_200_000
THRESH_WEEK_WARN = 3000 # USD
THRESH_SESS_PER_DAY = 5
if out_5h >= THRESH_5H_CRIT:
s5 = "critical"
elif out_5h >= THRESH_5H_WARN:
s5 = "warn"
else:
s5 = "ok"
éäžäœæ¥å€å®ã¯ãçŽè¿3æ¥å¹³å > 5 sess/dayãã§åºããŸãã
recent_days = sorted(by_day.keys())[-3:]
avg_sess = sum(by_day[d] for d in recent_days) / max(1, len(recent_days))
burst = avg_sess > THRESH_SESS_PER_DAY
--short ã¢ãŒãã®åºåãã©ãŒããã
_short ãã£ãŒã«ã㯠Python åŽã§çæãããŸãã
"_short": f"{icon} {label} (5h:{out_5h/1000:.0f}k tok ${cost_5h:.1f} / 7d:${cost_7d:.0f})",
ç¶æ ããšã®åºåäŸïŒå®éã®ããŒã¯ã³æ°ã¯å€ãããŸãïŒã
ð¢ OK (5h:234k tok $0.3 / 7d:$2)
ð¡ burst (5h:841k tok $1.2 / 7d:$8)
ðŽ cap-near (5h:1243k tok $2.1 / 7d:$12)
ã¢ã€ã³ã³ã ã grep -qE 'ðŽ|cap-near' ã§ããã®ã§ã·ã§ã«ã¹ã¯ãªããã®ã²ãŒãã«çŽæ¥æ¿ããŸãããšã©ãŒæã¯ â« n/a ãåºã㊠exit 0 ã§è¿ãããïŒfail-open èšèšïŒãåŒã³åºãå
ãæ¢ãŸããŸããã
ã¹ããŒã¿ã¹ã©ã€ã³ãžã®åã蟌ã¿ãš dashboard.sh çµ±å
dashboard.sh ã® Cost ã»ã¯ã·ã§ã³ãžçµã¿èŸŒã
~/.claude/scripts/dashboard.sh ã® ## ð° Cost (7d) ã»ã¯ã·ã§ã³ããããªã£ãŠããŸãã
echo "## ð° Cost (7d)"
~/.claude/scripts/cost-summary.sh --short
echo " budget: $(~/.claude/scripts/token-budget-advisor.sh --short)"
~/.claude/dashboard.md ã«æžãåºãããã®ã§ããããžã§ã¯ãéå§æã«ãã¡ã€ã«ãéãã ãã§badgetç¶æ³ãåãããŸãã
launchd ã§4æéããšã«èªåæŽæ°
~/Library/LaunchAgents/com.shun.dashboard.plist ã®èšå®ã§ãã
<key>Label</key>
<string>com.shun.dashboard</string>
<key>StartInterval</key>
<integer>14400</integer>
14400 ç§ ïŒ 4æéãmacãèµ·ããŠããéã¯4æéã«äžåºŠ dashboard.sh ãèµ°ããbudget è¡ãèªåã§æžãæãããŸããæåã§ ccusage blocks ãå©ããªããŠãããã¡ã€ã«ãèŠãã°çŽè¿ã®éèšå€ã確èªã§ããŸãã
ç¡äººãžã§ãã®ã²ãŒããšããŠäœ¿ã
autopilotã®ãããªç¡äººã¹ã¯ãªããã§ã¯ --short ã®åºåã§ãžã§ããäºå忢ããŸãïŒclaude-autopilot èšäºã§ç޹ä»ããé
ç·ïŒã
BUDGET=$(~/.claude/scripts/token-budget-advisor.sh --short)
if echo "$BUDGET" | grep -qE 'ðŽ|critical|cap-near'; then
log "ABORT: budget critical"; exit 0
fi
ã©ãã«å€å®ã ãã ãšå¢çä»è¿ã§ã®ãªã®ãªçŽ éãããã±ãŒã¹ããããŸããã¯ãªãã£ã«ã«ãªå€å®ãããå Žåã¯ãJSONåºåïŒ
--shortãªãïŒã®5h_output_tokensãã£ãŒã«ããæ°å€ã§åãåºããŠ>= 1200000ãçŽæ¥ãã§ãã¯ããæ¹ã確å®ã§ãã
èžãã èœãšã穎
- cost-log.jsonl ãå
šè¡åç®ããŠæ°å€ã2ã3åã«ãªã£ã â
(session_id, transcript)ããŒã§æçµè¡ã ãæ¡çšããæ¹åŒã«å€æŽ - ccusage ãPATHã«å±
ãªãç°å¢ã§ã¹ã¯ãªããããã®ãŸãŸæ¢ãŸã£ã â
command -v ccusageã§ååšç¢ºèªãããªããã° cost-log.jsonl åç¬ã§åã fallback ãã¹ãæã€ - fail-open ã«ããŠããªããš dashboard.sh ããšèœã¡ã â ãšã©ãŒæã¯ exit 0 +
â« n/aåºåã«ããŠãdashboard ã®ä»ã»ã¯ã·ã§ã³ãå®ã - launchd ã®æå°PATHã§ ccusage ãèŠã€ãããªã â
ProgramArgumentsã/bin/zsh -cçµç±ã«ããŠzshã®ãã¹ãåŒã - burst ãã©ã°ã鱿«ã®éäžäœæ¥ã§åžžæç¹ç¯ãã â çŽè¿3æ¥å¹³å > 5 sess/day ã®å€å®ãªã®ã§ãçšéã«ãã£ãŠã¯
THRESH_SESS_PER_DAYãåŒãäžãã - statusline.sh ã®
rate_limitsãååã¿ãŒã³åã¯--ã«ãªã â Claudeãããµãã¹ã¯ãªãã·ã§ã³å¥çŽè ã®æåã®APIå¿çåŸãã«ã ã rate_limits ãstdinã«å«ãããããæåã®ã¿ãŒã³åŸã¯æ£åžžã«è¡šç€ºããã
ãŸãšã
- 5hãããã¯ã®äžéã¯ãæ¢ãŸã£ãŠãããã§ãªãã800k / 1.2M ã®çµ¶å¯Ÿå€ã§äºåã«æ€åºãã
token-budget-advisor.sh㯠ccusageïŒ1次ïŒãš cost-log.jsonlïŒ2次ïŒã®ãã¥ã¢ã«ãœãŒã¹ã§éèšããå·®åãsource_diff_pctã§å¯èŠåãã- cost-log ã¯
(session_id, transcript)ããŒã®æçµè¡ã ãæ¡çšããªããš2ã3åã®èª€èšç®ã«ãªã --shortã¢ãŒãã¯ð¢/ð¡/ðŽ1è¡ã«å§çž®ããã·ã§ã«ã®ã²ãŒãã dashboard åã蟌ã¿ã«çŽæ¥äœ¿ããdashboard.shã launchd ã® StartInterval 14400ïŒ4hïŒã§èªåæŽæ°ããbudget è¡ãåžžã«ææ°ã«ä¿ããã- 倱ææã¯ fail-openïŒexit 0 / â« n/aïŒã«ããŠãããšãdashboard å šäœã®èœäžãé²ãã
次åã¯ããã®ããã·ã¥ããŒããåç
§ãã cost-log.jsonl ã®ãã°ããŒããŒã·ã§ã³ãšãéèšãéããªãåã«å€ããšã³ããªãå§çž®ããè©±ãæžããŸãã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ