chore(lps): FE 원가 타일 AI/DECODO 비용 분해 + config example cost_per_gb
- 임시 FE: 총 비용 타일에 AI·DECODO 분해, 크롤 트래픽에 프록시 경유 바이트(과금분) - config.local.toml.example: DecodoConfig.cost_per_gb 안내 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
c955a8f367
commit
a80109cdcf
@ -511,17 +511,18 @@ function renderJob(d, submitted){
|
||||
// 검색 원가 계측(리소스/비용/시간)
|
||||
const mt=o.metrics;
|
||||
if(mt){
|
||||
const kb=(mt.crawl?.html_bytes||0)/1024;
|
||||
const kbTxt = kb>=1024 ? (kb/1024).toFixed(1)+" MB" : Math.round(kb)+" KB";
|
||||
const cost=mt.ai?.est_cost_usd||0;
|
||||
const fmtBytes=b=>{const kb=(b||0)/1024; return kb>=1024?(kb/1024).toFixed(1)+" MB":Math.round(kb)+" KB";};
|
||||
const c=mt.cost||{}; const total=c.total_usd??(mt.ai?.est_cost_usd||0);
|
||||
const fc=v=>"$"+(v||0).toFixed((v||0)<0.01?6:4);
|
||||
const srcMs=mt.source_ms||{};
|
||||
const srcTxt=Object.entries(srcMs).map(([s,ms])=>`${(SRC[s]||{}).label||s} ${(ms/1000).toFixed(1)}s`).join(" · ");
|
||||
const crawledTxt=(mt.crawl?.malls_crawled||[]).length?' · 크롤 '+mt.crawl.malls_crawled.map(s=>(SRC[s]||{}).label||s).join(','):'';
|
||||
html += `<div class="sec-title">검색 원가 <span class="cnt">이 검색 1건이 쓴 리소스·비용·시간</span></div>
|
||||
<div class="metrics">
|
||||
<div class="metric"><div class="mk">소요 시간</div><div class="mv">${(mt.duration_ms/1000).toFixed(1)}<small>s</small></div>${srcTxt?`<div class="msub" title="${esc(srcTxt)}">${esc(srcTxt.length>34?srcTxt.slice(0,34)+'…':srcTxt)}</div>`:``}</div>
|
||||
<div class="metric"><div class="mk">AI 비용</div><div class="mv">$${cost.toFixed(cost<0.01?6:4)}</div><div class="msub">${mt.ai?.calls||0}회 호출</div></div>
|
||||
<div class="metric"><div class="mk">AI 토큰</div><div class="mv">${won((mt.ai?.prompt_tokens||0)+(mt.ai?.completion_tokens||0))}</div><div class="msub">in ${won(mt.ai?.prompt_tokens||0)} / out ${won(mt.ai?.completion_tokens||0)}</div></div>
|
||||
<div class="metric"><div class="mk">크롤 트래픽</div><div class="mv">${kbTxt}</div><div class="msub">${mt.crawl?.fetches||0} fetch${(mt.crawl?.malls_crawled||[]).length?' · 크롤 '+mt.crawl.malls_crawled.map(s=>(SRC[s]||{}).label||s).join(','):''}</div></div>
|
||||
<div class="metric"><div class="mk">총 비용</div><div class="mv">${fc(total)}</div><div class="msub" title="AI(OpenAI) + DECODO(프록시 대역폭)">AI ${fc(c.ai_usd)} · DECODO ${fc(c.proxy_usd)}</div></div>
|
||||
<div class="metric"><div class="mk">AI 토큰</div><div class="mv">${won((mt.ai?.prompt_tokens||0)+(mt.ai?.completion_tokens||0))}</div><div class="msub">${mt.ai?.calls||0}회 · in ${won(mt.ai?.prompt_tokens||0)}/out ${won(mt.ai?.completion_tokens||0)}</div></div>
|
||||
<div class="metric"><div class="mk">크롤 트래픽</div><div class="mv">${fmtBytes(mt.crawl?.html_bytes)}</div><div class="msub" title="프록시 경유 ${fmtBytes(mt.crawl?.proxy_bytes)} (DECODO 과금분)">${mt.crawl?.fetches||0} fetch · 프록시 ${fmtBytes(mt.crawl?.proxy_bytes)}${crawledTxt}</div></div>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
|
||||
@ -58,3 +58,4 @@ password = "" # 대시보드 PASSWORD
|
||||
port_start = 0 # 예: 10001
|
||||
port_end = 0 # 예: 10010
|
||||
session_minutes = 10 # 대시보드 Sticky 지속시간(분)과 일치
|
||||
cost_per_gb = 0.0 # DECODO 요금($/GB) — 검색 원가의 대역폭 비용 산정용(플랜에 맞게, 예 3.0)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user