Some checks failed
CI / validate (push) Has been cancelled
Co-authored-by: multica-agent <github@multica.ai>
61 lines
3.0 KiB
TypeScript
61 lines
3.0 KiB
TypeScript
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<AlphaUsageRow[]>(
|
|
`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<Array<{ created_at: string }>>(
|
|
`ai_quota_events?select=created_at&user_id=eq.${user.id}&created_at=gte.${encodeURIComponent(today.toISOString())}`,
|
|
),
|
|
stageTwoDatabase<Array<{ id: string; title: string }>>(
|
|
`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<Array<{ id: string; title: string }>>(`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<AlphaRoundRow[]>(
|
|
`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<string, AlphaUsageRow[]>()
|
|
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)
|
|
}
|
|
})
|