From 1a596d2674a1541609995fb18cc9d60f311f27b3 Mon Sep 17 00:00:00 2001 From: "Sven (AAMOS AI)" Date: Wed, 12 Aug 2026 21:13:39 +0700 Subject: [PATCH] =?UTF-8?q?feat(ops):=20fyll=20gemini-blocket=20fr=C3=A5n?= =?UTF-8?q?=20gemini=5Fusage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/src/routes/ops.ts | 43 +++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/apps/api/src/routes/ops.ts b/apps/api/src/routes/ops.ts index e89bca8..072ab87 100644 --- a/apps/api/src/routes/ops.ts +++ b/apps/api/src/routes/ops.ts @@ -1,6 +1,8 @@ import { timingSafeEqual } from "node:crypto"; +import { gte, sql } from "drizzle-orm"; import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; import BRAND from "../../../../brand.config.json" with { type: "json" }; +import { geminiUsage } from "@app/database"; import { errors } from "../lib/errors.js"; const CACHE_KEY = "ops:summary:cache"; @@ -61,7 +63,7 @@ export async function opsRoutes(app: FastifyInstance) { } const enriched = structuredClone(summary); - enriched.gemini = { + const geminiDefaults = { anrop_24h: null, prompt_tokens_24h: null, output_tokens_24h: null, @@ -71,6 +73,45 @@ export async function opsRoutes(app: FastifyInstance) { andel_pa_aamos: 0.0, aamos_agreement: null, }; + + try { + const now = new Date(); + const since24h = new Date(now.getTime() - 24 * 60 * 60 * 1000); + const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); + + const [dayAgg, monthAgg] = await Promise.all([ + app.db + .select({ + count: sql`count(*)`, + promptTokens: sql`coalesce(sum(${geminiUsage.promptTokens}), 0)`, + outputTokens: sql`coalesce(sum(${geminiUsage.outputTokens}), 0)`, + totalTokens: sql`coalesce(sum(${geminiUsage.totalTokens}), 0)`, + costMicrocents: sql`coalesce(sum(${geminiUsage.costMicrocents}), 0)`, + }) + .from(geminiUsage) + .where(gte(geminiUsage.createdAt, since24h)), + app.db + .select({ + totalTokens: sql`coalesce(sum(${geminiUsage.totalTokens}), 0)`, + }) + .from(geminiUsage) + .where(gte(geminiUsage.createdAt, startOfMonth)), + ]); + + enriched.gemini = { + anrop_24h: Number(dayAgg[0]?.count ?? 0), + prompt_tokens_24h: Number(dayAgg[0]?.promptTokens ?? 0), + output_tokens_24h: Number(dayAgg[0]?.outputTokens ?? 0), + total_tokens_24h: Number(dayAgg[0]?.totalTokens ?? 0), + total_tokens_manad: Number(monthAgg[0]?.totalTokens ?? 0), + kostnad_usd_mikrocent_24h: Number(dayAgg[0]?.costMicrocents ?? 0), + andel_pa_aamos: 0.0, + aamos_agreement: null, + }; + } catch { + enriched.gemini = geminiDefaults; + } + if ( enriched.wall && typeof enriched.wall === "object" &&