From b4e4ff5407b9a74df55fa51db36a12cc3ef400a4 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 06:25:28 +0000 Subject: [PATCH] feat(usage): prioritize auto_model from metadata in usage queries Update usage queries to select auto_model from microdollar_usage_metadata before falling back to requested_model and model. This affects: - src/app/api/profile/usage/route.ts - src/routers/organizations/organization-usage-details-router.ts --- apps/web/src/app/api/profile/usage/route.ts | 20 ++++++++--- .../organization-usage-details-router.ts | 33 ++++++++++++++++--- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/apps/web/src/app/api/profile/usage/route.ts b/apps/web/src/app/api/profile/usage/route.ts index c76272d895..2f4c668951 100644 --- a/apps/web/src/app/api/profile/usage/route.ts +++ b/apps/web/src/app/api/profile/usage/route.ts @@ -3,7 +3,7 @@ import { NextResponse } from 'next/server'; import { getUserFromAuth } from '@/lib/user.server'; import { readDb } from '@/lib/drizzle'; import { timedUsageQuery } from '@/lib/usage-query'; -import { microdollar_usage } from '@kilocode/db/schema'; +import { microdollar_usage, microdollar_usage_metadata, auto_model } from '@kilocode/db/schema'; import { eq, sql, desc, isNull, and, gte } from 'drizzle-orm'; import { getDateThreshold, type Period } from '@/routers/user-router'; @@ -30,7 +30,7 @@ export async function GET(request: NextRequest) { ...(groupByModel && { model: sql< string | null - >`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + >`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, }), total_cost: sql`SUM(${microdollar_usage.cost})::float`, request_count: sql`COUNT(*)::float`, @@ -44,13 +44,17 @@ export async function GET(request: NextRequest) { const groupByClause = [ sql`DATE(${microdollar_usage.created_at})`, ...(groupByModel - ? [sql`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`] + ? [ + sql`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + ] : []), ]; const orderByClause = [ desc(sql`DATE(${microdollar_usage.created_at})`), ...(groupByModel - ? [sql`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`] + ? [ + sql`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + ] : []), ]; @@ -81,6 +85,14 @@ export async function GET(request: NextRequest) { tx .select(selectFields) .from(microdollar_usage) + .leftJoin( + microdollar_usage_metadata, + eq(microdollar_usage_metadata.id, microdollar_usage.id) + ) + .leftJoin( + auto_model, + eq(auto_model.auto_model_id, microdollar_usage_metadata.auto_model_id) + ) .where(and(...conditions)) .groupBy(...groupByClause) .orderBy(...orderByClause) diff --git a/apps/web/src/routers/organizations/organization-usage-details-router.ts b/apps/web/src/routers/organizations/organization-usage-details-router.ts index 6ba7bb8001..7293a0a1c8 100644 --- a/apps/web/src/routers/organizations/organization-usage-details-router.ts +++ b/apps/web/src/routers/organizations/organization-usage-details-router.ts @@ -7,7 +7,12 @@ import { } from '@/routers/organizations/utils'; import { readDb } from '@/lib/drizzle'; import { timedUsageQuery } from '@/lib/usage-query'; -import { microdollar_usage, kilocode_users } from '@kilocode/db/schema'; +import { + microdollar_usage, + kilocode_users, + microdollar_usage_metadata, + auto_model, +} from '@kilocode/db/schema'; import { eq, sum, count, sql, and, gte, lte } from 'drizzle-orm'; import * as z from 'zod'; import { AUTOCOMPLETE_MODEL } from '@/lib/constants'; @@ -170,7 +175,7 @@ export const organizationsUsageDetailsRouter = createTRPCRouter({ datetime: timeBucket.as('datetime'), userName: kilocode_users.google_user_name, userEmail: kilocode_users.google_user_email, - model: sql`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + model: sql`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, provider: microdollar_usage.provider, projectId: microdollar_usage.project_id, costMicrodollars: sum(microdollar_usage.cost), @@ -180,6 +185,14 @@ export const organizationsUsageDetailsRouter = createTRPCRouter({ }) .from(microdollar_usage) .innerJoin(kilocode_users, eq(kilocode_users.id, microdollar_usage.kilo_user_id)) + .leftJoin( + microdollar_usage_metadata, + eq(microdollar_usage_metadata.id, microdollar_usage.id) + ) + .leftJoin( + auto_model, + eq(auto_model.auto_model_id, microdollar_usage_metadata.auto_model_id) + ) .where( and( eq(microdollar_usage.organization_id, organizationId), @@ -191,7 +204,7 @@ export const organizationsUsageDetailsRouter = createTRPCRouter({ timeBucket, kilocode_users.google_user_name, kilocode_users.google_user_email, - sql`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + sql`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, microdollar_usage.provider, microdollar_usage.project_id ) @@ -321,7 +334,7 @@ export const organizationsUsageDetailsRouter = createTRPCRouter({ ...(groupByModel && { model: sql< string | null - >`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + >`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, }), microdollarCost: sum(microdollar_usage.cost), tokenCount: sum( @@ -333,13 +346,23 @@ export const organizationsUsageDetailsRouter = createTRPCRouter({ }) .from(microdollar_usage) .innerJoin(kilocode_users, eq(kilocode_users.id, microdollar_usage.kilo_user_id)) + .leftJoin( + microdollar_usage_metadata, + eq(microdollar_usage_metadata.id, microdollar_usage.id) + ) + .leftJoin( + auto_model, + eq(auto_model.auto_model_id, microdollar_usage_metadata.auto_model_id) + ) .where(and(...whereConditions)) .groupBy( sql`DATE(${microdollar_usage.created_at})`, kilocode_users.google_user_name, kilocode_users.google_user_email, ...(groupByModel - ? [sql`COALESCE(${microdollar_usage.requested_model}, ${microdollar_usage.model})`] + ? [ + sql`COALESCE(${auto_model.auto_model}, ${microdollar_usage.requested_model}, ${microdollar_usage.model})`, + ] : []) ) .orderBy(sql`DATE(${microdollar_usage.created_at}) DESC`)