generated from coulomb/repo-seed
10 KiB
10 KiB
title
| title |
|---|
| Token Cost |
import {apiFetch, pollDelay, waitForVisible} from "./components/config.js";
import {refCell} from "./components/ref-cell.js";
const POLL = 60_000;
const evidenceSel = Inputs.radio(
["Measured only", "Active evidence", "All evidence"],
{value: "Measured only", label: "Evidence"}
);
const sortSel = Inputs.select(
["Tokens Total", "Event Count"],
{label: "Sort by"}
);
const maxSel = Inputs.select(
[10, 20, 50, 100, 500],
{value: 20, label: "Show"}
);
display(html`<div style="display:flex;gap:1.5rem;align-items:flex-end;flex-wrap:wrap;margin:0.5rem 0 1.5rem">${evidenceSel}${sortSel}${maxSel}</div>`);
const evidenceMode = view(evidenceSel);
const sortOrder = view(sortSel);
const maxResults = view(maxSel);
function aggregatePath(mode) {
if (mode === "Measured only") return "/token-events/aggregate/?measurement_kind=measured&include_superseded=false";
if (mode === "All evidence") return "/token-events/aggregate/?include_superseded=true";
return "/token-events/aggregate/?include_superseded=false";
}
const tokenState = (async function*() {
let failures = 0;
while (true) {
let aggregate = null, quality = null, ok = false;
try {
const [r1, r2] = await Promise.all([
apiFetch(aggregatePath(evidenceMode)),
apiFetch("/token-events/quality/"),
]);
ok = r1.ok && r2.ok;
if (ok) {
aggregate = await r1.json();
quality = await r2.json();
}
} catch {}
failures = ok ? 0 : failures + 1;
yield {aggregate, quality, ok, ts: new Date()};
await waitForVisible(pollDelay({ok, base: POLL, failures}));
}
})();
function nameCell(name, fullName) {
const s = String(name ?? fullName ?? "—");
const full = String(fullName ?? name ?? "—");
const el = document.createElement("span");
el.title = full;
el.textContent = s.length > 80 ? s.slice(0, 80) + "…" : s;
return el;
}
function sortRows(rows, sortField) {
const s = [...rows];
if (sortField === "Event Count") s.sort((a, b) => (b.event_count || 0) - (a.event_count || 0));
else s.sort((a, b) => (b.tokens_total || 0) - (a.tokens_total || 0));
return s;
}
function dictRows(obj, labelKey) {
return Object.entries(obj ?? {})
.map(([label, tokens_total]) => ({[labelKey]: label, tokens_total}))
.sort((a, b) => b.tokens_total - a.tokens_total);
}
function metricRows(quality) {
if (!quality) return [];
return [
{metric: "Measured", value: quality.measured_event_count},
{metric: "Allocated", value: quality.allocated_event_count},
{metric: "Estimated", value: quality.estimated_event_count},
{metric: "Superseded", value: quality.superseded_event_count},
{metric: "Fallback", value: quality.fallback_event_count},
{metric: "Unattributed measured", value: quality.unattributed_measured_event_count},
{metric: "Missing provenance", value: quality.missing_provenance_event_count},
{metric: "Duplicate sources", value: quality.duplicate_source_count},
];
}
const aggregate = tokenState.aggregate ?? {
tokens_in: 0, tokens_out: 0, tokens_total: 0, event_count: 0,
by_repo: [], by_workstream: [], by_task: [], by_model: [],
by_measurement_kind: {}, by_source_provider: {},
};
const quality = tokenState.quality ?? null;
const _ok = tokenState.ok ?? false;
const _ts = tokenState.ts;
Token Cost
display(html`<div style="font-size:0.8rem;color:${_ok ? 'var(--theme-foreground-focus)' : 'red'}">
● ${_ok ? `Live · ${_ts?.toLocaleTimeString()} · ${aggregate.event_count.toLocaleString()} events · ${aggregate.tokens_total.toLocaleString()} tokens` : "API offline"}
</div>`);
display(html`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0.75rem;margin:1rem 0">
<div style="border:1px solid var(--theme-foreground-faint);border-radius:6px;padding:0.75rem">
<div style="font-size:0.75rem;color:var(--theme-foreground-muted)">Tokens</div>
<div style="font-size:1.4rem;font-weight:650">${aggregate.tokens_total.toLocaleString()}</div>
</div>
<div style="border:1px solid var(--theme-foreground-faint);border-radius:6px;padding:0.75rem">
<div style="font-size:0.75rem;color:var(--theme-foreground-muted)">Events</div>
<div style="font-size:1.4rem;font-weight:650">${aggregate.event_count.toLocaleString()}</div>
</div>
<div style="border:1px solid var(--theme-foreground-faint);border-radius:6px;padding:0.75rem">
<div style="font-size:0.75rem;color:var(--theme-foreground-muted)">Last Event</div>
<div style="font-size:1rem;font-weight:650">${aggregate.last_event_at ? new Date(aggregate.last_event_at).toLocaleString() : "—"}</div>
</div>
<div style="border:1px solid var(--theme-foreground-faint);border-radius:6px;padding:0.75rem">
<div style="font-size:0.75rem;color:var(--theme-foreground-muted)">Last Ingested</div>
<div style="font-size:1rem;font-weight:650">${aggregate.last_ingested_at ? new Date(aggregate.last_ingested_at).toLocaleString() : "—"}</div>
</div>
</div>`);
By Repo
{
const sorted = sortRows(aggregate.by_repo ?? [], sortOrder);
const rows = sorted.slice(0, maxResults);
if (rows.length === 0) {
display(html`<p style="color:var(--theme-foreground-muted)">No token events with repo association yet.</p>`);
} else {
display(Plot.plot({
title: "Token consumption by repo",
marginLeft: 160,
width: Math.min(900, width),
x: {label: "Tokens", tickFormat: "~s"},
y: {label: null},
marks: [Plot.barX(rows, {x: "tokens_total", y: "label", fill: "#4e79a7", tip: true})],
}));
display(Inputs.table(rows.map((r, i) => ({...r, _ref: i})), {
columns: ["_ref", "label", "tokens_in", "tokens_out", "tokens_total", "event_count"],
header: {_ref: "REF", label: "Repo", tokens_in: "Tokens In", tokens_out: "Tokens Out", tokens_total: "Total", event_count: "Events"},
format: {
_ref: (_, i) => refCell(i + 1, "repos", rows[i].label),
label: d => nameCell(d, d),
tokens_in: d => d.toLocaleString(),
tokens_out: d => d.toLocaleString(),
tokens_total: d => d.toLocaleString(),
},
width: {_ref: 50, label: 160, tokens_in: 110, tokens_out: 110, tokens_total: 110, event_count: 80},
}));
}
}
By Workplan
{
const sorted = sortRows(aggregate.by_workstream ?? [], sortOrder);
const rows = sorted.slice(0, maxResults);
if (rows.length === 0) {
display(html`<p style="color:var(--theme-foreground-muted)">No workstream data yet.</p>`);
} else {
display(Inputs.table(rows.map((r, i) => ({...r, _ref: i})), {
columns: ["_ref", "label", "tokens_in", "tokens_out", "tokens_total", "event_count"],
header: {_ref: "REF", label: "Workstream", tokens_in: "Tokens In", tokens_out: "Tokens Out", tokens_total: "Total", event_count: "Events"},
format: {
_ref: (_, i) => refCell(i + 1, "workstreams", rows[i].scope_id),
label: d => nameCell(d, d),
tokens_in: d => d.toLocaleString(),
tokens_out: d => d.toLocaleString(),
tokens_total: d => d.toLocaleString(),
},
width: {_ref: 50, label: 240, tokens_in: 110, tokens_out: 110, tokens_total: 110, event_count: 80},
}));
}
}
By Evidence
{
const kindRows = dictRows(aggregate.by_measurement_kind, "kind");
const sourceRows = dictRows(aggregate.by_source_provider, "source");
if (kindRows.length === 0 && sourceRows.length === 0) {
display(html`<p style="color:var(--theme-foreground-muted)">No evidence breakdown yet.</p>`);
} else {
display(html`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1rem">
<div>${Inputs.table(kindRows, {
columns: ["kind", "tokens_total"],
header: {kind: "Kind", tokens_total: "Tokens"},
format: {tokens_total: d => d.toLocaleString()},
})}</div>
<div>${Inputs.table(sourceRows, {
columns: ["source", "tokens_total"],
header: {source: "Source", tokens_total: "Tokens"},
format: {tokens_total: d => d.toLocaleString()},
})}</div>
</div>`);
}
}
By Model
{
const rows = (aggregate.by_model ?? []).slice(0, maxResults);
if (rows.length === 0) {
display(html`<p style="color:var(--theme-foreground-muted)">No model data yet.</p>`);
} else {
display(Plot.plot({
title: "Token consumption by model",
marginLeft: 200,
width: Math.min(700, width),
x: {label: "Total tokens", tickFormat: "~s"},
marks: [Plot.barX(rows, {x: "tokens_total", y: "label", fill: "#59a14f", tip: true})],
}));
}
}
Data Quality
if (!quality) {
display(html`<p style="color:var(--theme-foreground-muted)">No quality data yet.</p>`);
} else {
display(Inputs.table(metricRows(quality), {
columns: ["metric", "value"],
header: {metric: "Signal", value: "Count"},
format: {value: d => d.toLocaleString()},
}));
display(html`<p style="font-size:0.8rem;color:var(--theme-foreground-muted)">
Codex: ${quality.last_codex_ingested_at ? new Date(quality.last_codex_ingested_at).toLocaleString() : "—"}
· Claude: ${quality.last_claude_ingested_at ? new Date(quality.last_claude_ingested_at).toLocaleString() : "—"}
· Reconcile: ${quality.last_reconciliation_at ? new Date(quality.last_reconciliation_at).toLocaleString() : "—"}
</p>`);
}
Top Tasks by Tokens
{
const sorted = sortRows(aggregate.by_task ?? [], sortOrder);
const rows = sorted.slice(0, maxResults);
if (rows.length === 0) {
display(html`<p style="color:var(--theme-foreground-muted)">No task-level data yet.</p>`);
} else {
display(Inputs.table(rows.map((r, i) => ({...r, _ref: i})), {
columns: ["_ref", "label", "tokens_in", "tokens_out", "tokens_total"],
header: {_ref: "REF", label: "Task", tokens_in: "In", tokens_out: "Out", tokens_total: "Total"},
format: {
_ref: (_, i) => refCell(i + 1, "tasks", rows[i].scope_id),
label: d => nameCell(d, d),
tokens_in: d => d.toLocaleString(),
tokens_out: d => d.toLocaleString(),
tokens_total: d => d.toLocaleString(),
},
width: {_ref: 50, label: 260},
}));
}
}