diff --git a/packages/console/function/src/stat.ts b/packages/console/function/src/stat.ts index 9a1a1cc145..54d38bc311 100644 --- a/packages/console/function/src/stat.ts +++ b/packages/console/function/src/stat.ts @@ -1,17 +1,16 @@ import { and, Database, inArray } from "@opencode-ai/console-core/drizzle/index.js" import { ModelTpsRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js" -type Entry = { provider: string; model: string; tps: number } -type Result = Record +type Result = Record> export default { async fetch(request: Request) { if (request.method !== "POST") return new Response("Method Not Allowed", { status: 405 }) - const entries = (await request.json()) as Entry[] - if (!Array.isArray(entries) || entries.length === 0) return Response.json({} satisfies Result) + const body = (await request.json()) as { ids: string[] } + const ids = body.ids - const ids = entries.map((e) => `${e.provider}/${e.model}/${e.tps}`) + if (ids.length === 0) return Response.json({} satisfies Result) const toInterval = (date: Date) => parseInt( @@ -21,19 +20,23 @@ export default { .substring(0, 12), ) const now = Date.now() - const intervals = Array.from({ length: 5 }, (_, i) => toInterval(new Date(now - i * 60 * 1000))) + const intervals = Array.from({ length: 30 }, (_, i) => toInterval(new Date(now - i * 60 * 1000))) const rows = await Database.use((tx) => tx .select() .from(ModelTpsRateLimitTable) - .where(and(inArray(ModelTpsRateLimitTable.id, ids), inArray(ModelTpsRateLimitTable.interval, intervals))), + .where(and(inArray(ModelTpsRateLimitTable.id, body.ids), inArray(ModelTpsRateLimitTable.interval, intervals))), ) - const result: Result = Object.fromEntries(ids.map((id) => [id, { qualify: 0, unqualify: 0 }])) + const result: Result = Object.fromEntries( + body.ids.map((id) => [ + id, + Object.fromEntries(intervals.map((interval) => [interval, { qualify: 0, unqualify: 0 }])), + ]), + ) for (const row of rows) { - result[row.id].qualify += row.qualify - result[row.id].unqualify += row.unqualify + result[row.id][row.interval] = { qualify: row.qualify, unqualify: row.unqualify } } return Response.json(result) },