feat(admin/jobs): select token-velden en bereken kostprijs server-side

Voegt model_id, input_tokens, output_tokens, cache_read_tokens en
cache_write_tokens toe aan de ClaudeJob-query en berekent cost_usd per
job via een ModelPrice-lookup. Jobs zonder prijs-entry of zonder
input_tokens krijgen cost_usd: null.
This commit is contained in:
Scrum4Me Agent 2026-05-07 15:59:58 +02:00
parent 5cb3abbd3d
commit ca07fb842f

View file

@ -16,15 +16,34 @@ export default async function AdminJobsPage() {
branch: true,
pr_url: true,
error: true,
model_id: true,
input_tokens: true,
output_tokens: true,
cache_read_tokens: true,
cache_write_tokens: true,
user: { select: { username: true } },
product: { select: { name: true } },
},
})
const prices = await prisma.modelPrice.findMany()
const priceMap = new Map(prices.map((p) => [p.model_id, p]))
const jobsWithCost = jobs.map((job) => {
const p = job.model_id ? priceMap.get(job.model_id) : undefined
if (!p || job.input_tokens == null) return { ...job, cost_usd: null }
const cost =
(job.input_tokens ?? 0) * Number(p.input_price_per_1m) / 1_000_000 +
(job.output_tokens ?? 0) * Number(p.output_price_per_1m) / 1_000_000 +
(job.cache_read_tokens ?? 0) * Number(p.cache_read_price_per_1m) / 1_000_000 +
(job.cache_write_tokens ?? 0) * Number(p.cache_write_price_per_1m) / 1_000_000
return { ...job, cost_usd: cost }
})
return (
<div>
<h1 className="text-xl font-semibold mb-4">Claude Jobs</h1>
<JobsTable jobs={jobs} />
<JobsTable jobs={jobsWithCost} />
</div>
)
}