Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit 0d3d48b

Browse files
author
Frank
committed
zen: fix cost in graph
1 parent 66eaba4 commit 0d3d48b

1 file changed

Lines changed: 17 additions & 13 deletions

File tree

packages/console/app/src/routes/workspace/[id]/graph-section.tsx

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { and, Database, eq, gte, inArray, isNull, lte, or, sql } from "@opencode-ai/console-core/drizzle/index.js"
1+
import { and, Database, eq, gte, inArray, isNull, lte, or, sql, sum } from "@opencode-ai/console-core/drizzle/index.js"
22
import { UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js"
33
import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
44
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
@@ -35,7 +35,7 @@ async function getCosts(workspaceID: string, year: number, month: number) {
3535
.select({
3636
date: sql<string>`DATE(${UsageTable.timeCreated})`,
3737
model: UsageTable.model,
38-
totalCost: sql<number>`SUM(${UsageTable.cost})`,
38+
totalCost: sum(UsageTable.cost),
3939
keyId: UsageTable.keyID,
4040
})
4141
.from(UsageTable)
@@ -46,7 +46,13 @@ async function getCosts(workspaceID: string, year: number, month: number) {
4646
lte(UsageTable.timeCreated, endDate),
4747
),
4848
)
49-
.groupBy(sql`DATE(${UsageTable.timeCreated})`, UsageTable.model, UsageTable.keyID),
49+
.groupBy(sql`DATE(${UsageTable.timeCreated})`, UsageTable.model, UsageTable.keyID)
50+
.then((x) =>
51+
x.map((r) => ({
52+
...r,
53+
totalCost: r.totalCost ? parseInt(r.totalCost) : 0,
54+
})),
55+
),
5056
)
5157

5258
// Get unique key IDs from usage
@@ -204,26 +210,24 @@ export function GraphSection() {
204210
const dates = getDates()
205211
if (!data?.usage?.length) return null
206212

207-
const filteredUsageResults = store.key ? data.usage.filter((row) => row.keyId === store.key) : data.usage
208-
209213
const dailyData = new Map<string, Map<string, number>>()
210214
for (const dateKey of dates) dailyData.set(dateKey, new Map())
211215

212-
for (const row of filteredUsageResults) {
213-
const dayMap = dailyData.get(row.date)
214-
if (dayMap) {
215-
const existing = dayMap.get(row.model) || 0
216-
dayMap.set(row.model, existing + row.totalCost)
217-
}
218-
}
216+
data.usage
217+
.filter((row) => (store.key ? row.keyId === store.key : true))
218+
.forEach((row) => {
219+
const dayMap = dailyData.get(row.date)
220+
if (!dayMap) return
221+
dayMap.set(row.model, (dayMap.get(row.model) ?? 0) + row.totalCost)
222+
})
219223

220224
const filteredModels = store.model === null ? getModels() : [store.model]
221225

222226
const datasets = filteredModels.map((model) => {
223227
const color = getModelColor(model)
224228
return {
225229
label: model,
226-
data: dates.map((date) => (dailyData.get(date)?.get(model) || 0) / 100000000),
230+
data: dates.map((date) => (dailyData.get(date)?.get(model) || 0) / 100_000_000),
227231
backgroundColor: color,
228232
hoverBackgroundColor: color,
229233
borderWidth: 0,

0 commit comments

Comments
 (0)