import { requireStageTwoUser, stageTwoApiError, stageTwoDatabase } from '~/server/utils/stage-two-supabase' import { summarizeAlphaUsage, summarizeRoundObservability, type AlphaRoundRow, type AlphaUsageRow, } from '~/server/utils/alpha-observability' export default defineEventHandler(async (event) => { try { const user = await requireStageTwoUser(event) const since = new Date() since.setUTCDate(since.getUTCDate() - 30) const today = new Date() today.setUTCHours(0, 0, 0, 0) const [usage, quotaEvents, ownedCampaigns] = await Promise.all([ stageTwoDatabase( `ai_usage?select=campaign_id,job_id,request_kind,input_tokens,output_tokens,cost_usd,latency_ms,created_at&user_id=eq.${user.id}&created_at=gte.${encodeURIComponent(since.toISOString())}&order=created_at.desc&limit=1000`, ), stageTwoDatabase>( `ai_quota_events?select=created_at&user_id=eq.${user.id}&created_at=gte.${encodeURIComponent(today.toISOString())}`, ), stageTwoDatabase>( `campaigns?select=id,title&owner_id=eq.${user.id}`, ), ]) const campaignIds = [...new Set(usage.flatMap(row => row.campaign_id ? [row.campaign_id] : []))] const knownCampaignIds = new Set(ownedCampaigns.map(campaign => campaign.id)) const additionalCampaignIds = campaignIds.filter(id => !knownCampaignIds.has(id)) const additionalCampaigns = additionalCampaignIds.length ? await stageTwoDatabase>(`campaigns?select=id,title&id=in.(${additionalCampaignIds.join(',')})`) : [] const campaigns = [...ownedCampaigns, ...additionalCampaigns] const campaignNames = new Map(campaigns.map(campaign => [campaign.id, campaign.title])) const ownedCampaignIds = ownedCampaigns.map(campaign => campaign.id) const rounds = ownedCampaignIds.length ? await stageTwoDatabase( `rounds?select=id,campaign_id,number,status,queued_at,resolved_at,error,created_at&campaign_id=in.(${ownedCampaignIds.join(',')})&status=in.(resolved,failed)&created_at=gte.${encodeURIComponent(since.toISOString())}&order=created_at.desc&limit=1000`, ) : [] const grouped = new Map() for (const row of usage) { const key = row.campaign_id ?? 'coauthor' grouped.set(key, [...(grouped.get(key) ?? []), row]) } return { periodDays: 30, quota: { usedToday: quotaEvents.length, dailyRequestLimit: 60, dailyTokenLimit: 250000 }, totals: summarizeAlphaUsage(usage), rounds: summarizeRoundObservability(usage, rounds, campaignNames), groups: [...grouped].map(([id, rows]) => ({ id, label: id === 'coauthor' ? 'World coauthor' : campaignNames.get(id) ?? 'Private campaign', ...summarizeAlphaUsage(rows), })).sort((left, right) => right.costUsd - left.costUsd), } } catch (error) { stageTwoApiError(error) } })