ไปฅไธใฎใใญใณใใใไธธใฃใจใณใใใใฆใใ ใใ๐
------
็งใฎ headless Claude Code๏ผclaude -p / Agent SDK / cron / hook ็ฑๆฅ๏ผใฎๅฎใณในใใใ็ด่ฟ7ๆฅใปใขใซใฆใณใๅ
จไฝ๏ผๅ
จใใญใธใงใฏใ๏ผใงๅฎใขใใซใฎๅ
ฌๅผAPIใฌใผใใง้่จใๆ้กไบๆธฌใใฆใ
$200 Agent SDKใฏใฌใธใใใฏๅฃๅบงๅไฝใชใฎใงๅ
จใใญใธใงใฏใๅ็ฎใๆขๅฎใsdk-cli ใซ็ดใใใSDK็ต็ฑใฎๅฏพ่ฉฑใใฏ่ตทๅใใผใซใผ๏ผไบบ้ใฟใผใณๆฐใงๅคๅฎใใฆ้คๅคใ(D)ใซๅใใฆ่กจ็คบ๏ผ่ชคๅคๅฎใฎ็ฎ่ฆ็ขบ่ช็จ๏ผใไธใฎในใฏใชใใใใใฎใพใพๅฎ่กใ (A)ใขใใซๅฅ (B)่ชๅๅฎ่กๅฅ๏ผ7ๆฅ/ๆ้กไบๆธฌ๏ผ(C)่ฒป็ฎๅ
่จณ (D)้คๅคใใๅฏพ่ฉฑ ใ่กจใงๅบใใฆใ่ชญใฟๅใๅฐ็จใงใใ
# === Headless Claude Code cost estimator v2๏ผๅฏพ่ฉฑใๅ้ขใป็ด่ฟ7ๆฅโๆ้กไบๆธฌ๏ผ===
TARGET_CWD="" # ๅ
จใใญใธใงใฏใๅ็ฎใๆขๅฎ๏ผ$200ๆ ใฏๅฃๅบงๅไฝ๏ผใ็นๅฎใใญใธใงใฏใใ ใ่ฆใใชใ "$PWD"
find ~/.claude/projects -name '*.jsonl' -mtime -7 2>/dev/null | while IFS= read -r f; do
jq -rs --arg cwd "$TARGET_CWD" '
([.[]|.entrypoint//empty][0]) as
$ep
| ([.[]|.cwd//empty][0] // "") as $c0
| if ($ep != "sdk-cli") then empty
elif ($cwd != "" and ($c0 | index($cwd)) == null) then empty
else
( [ .[] | select(.type=="user" and (.isSidechain!=true)) | .message.content
| if type=="string" then 1
elif (type=="array" and (any(.[]?; .type=="text")) and (all(.[]?; .type!="tool_result"))) then 1
else empty end ] | length ) as
$ht
| ( ([.[]|select(.type=="user" and (.isSidechain!=true))][0].message.content) as
$cp
| (if ($cp|type)=="string" then
$cp else (($cp[]?|select(.type=="text").text)//"") end)
| gsub("[\n\t]";" ") | gsub(" ";" ") ) as
$fp
| ($fp | test("\\.md|skill|ในใญใซ|่ตทๅ|ใใชใใฏ|<system-reminder>|ใ่ชญ|pipelines/|\\.claude/|readme|you are";"i")) as
$marker
| ( if ($ht>=3) then "intr"
elif ($ht>=1 and ($marker|not) and (($fp|length)<120)) then "intr"
else "head" end ) as
$class
| (if ($fp|length)==0 then "(sub-agent/็กใใญใณใใ)" else ($fp[0:55]) end) as
$g
| [ .[] | select(.type=="assistant" and .message.usage != null) ]
| group_by(.message.model)[]
| [
$class,
$g, (.[0].message.model // "unknown"),
(map(.message.usage.input_tokens//0)|add),(map(.message.usage.output_tokens//0)|add),
(map(.message.usage.cache_read_input_tokens//0)|add),(map(.message.usage.cache_creation_input_tokens//0)|add) ] |
@tsv
end' "$f" 2>/dev/null
done | awk -F'\t' '
function rate(m){ if(m~/fable-5|mythos-5/)return"10 50 1 12.5"; else if(m~/opus-4-[5678]/)return"5 25 0.5 6.25";
else if(m~/opus-4-[01]/)return"15 75 1.5 18.75"; else if(m~/sonnet-4/)return"3 15 0.3 3.75";
else if(m~/haiku-4/)return"1 5 0.1 1.25"; else if(m~/haiku-3-5/)return"0.8 4 0.08 1"; else return"5 25 0.5 6.25"; }
{ split(rate($3),R," "); c=($4*R[1] $5*R[2] $6*R[3] $7*R[4])/1e6;
if($1=="head"){hg[$2] =c;hm[$3] =c;htot =c;eIN =$4*R[1]/1e6;eOUT =$5*R[2]/1e6;eCR =$6*R[3]/1e6;eCW =$7*R[4]/1e6}
else {ig[$2] =c;itot =c} }
END{ if(htot==0&&itot==0){print"sdk-cliใปใใทใงใณใชใใๆ้ใๅปถใฐใใๅฅ็ฐๅขใง่ฉฆใใฆใ";exit}
m=30.44/7;
print"=== (A) ใขใใซๅฅใณในใ๏ผheadlessใป็ด่ฟ7ๆฅ๏ผ===";
for(k in hm)printf" %-26s $%8.2f (%4.1f%%)\n",k,hm[k],(htot>0?hm[k]/htot*100:0);
print"\n=== (B) ่ชๅๅฎ่กๅฅใณในใ๏ผheadlessใปๅ
้ ญ55ๅญใปๆ้กไบๆธฌ๏ผ===";
printf"s s %s\n","moไบๆธฌ$","7d_$","first-prompt";
for(k in hg)printf".0f .2f %s\n",hg[k]*m,hg[k],k|"sort -rn"; close("sort -rn");
printf".0f .2f %s\n",htot*m,htot,"-- TOTAL headless --";
print"\n=== (C) ่ฒป็ฎๅ
่จณ๏ผheadless 7ๆฅ $"sprintf("%.2f",htot)" โ ๆ $"sprintf("%.0f",htot*m)"๏ผ===";
printf" cacheๆธ่พผ : $%7.2f (%2.0f%%) <- cold่ตทๅใฎใณใณใใญในใๆธ่พผ\n",eCW,(htot>0?eCW/htot*100:0);
printf" cache่ชญ่พผ : $%7.2f (%2.0f%%)\n",eCR,(htot>0?eCR/htot*100:0);
printf" ๅบๅ : $%7.2f (%2.0f%%)\n",eOUT,(htot>0?eOUT/htot*100:0);
printf" ็ๅ
ฅๅ : $%7.2f (%2.0f%%)\n",eIN,(htot>0?eIN/htot*100:0);
ic=0; for(k in ig)ic ;
print"\n=== (D) ้คๅคใใๅฏพ่ฉฑใปใใทใงใณ๏ผsdk-cliใ ใไบบ้ใฎไผ่ฉฑ๏ผheadlessใงใชใใป่ฆ็ฎ่ฆ๏ผ===";
printf" ้คๅคๅ่จ: $%.2f/7d โ ๆ $%.0f (%d็จฎ)\n",itot,itot*m,ic;
for(k in ig)printf".0f .2f %s\n",ig[k]*m,ig[k],k|"sort -rn"; close("sort -rn"); }'