/** * Admin Usage API endpoints * Handles admin-level usage logs and statistics retrieval */ import { apiClient } from '../client' import type { UsageLog, UsageQueryParams, PaginatedResponse } from '@/types' // ==================== Types ==================== export interface AdminUsageStatsResponse { total_requests: number total_input_tokens: number total_output_tokens: number total_cache_tokens: number total_tokens: number total_cost: number total_actual_cost: number total_account_cost?: number average_duration_ms: number } export interface SimpleUser { id: number email: string } export interface SimpleApiKey { id: number name: string user_id: number } export interface UsageCleanupFilters { start_time: string end_time: string user_id?: number api_key_id?: number account_id?: number group_id?: number model?: string | null stream?: boolean | null billing_type?: number | null } export interface UsageCleanupTask { id: number status: string filters: UsageCleanupFilters created_by: number deleted_rows: number error_message?: string | null canceled_by?: number | null canceled_at?: string | null started_at?: string | null finished_at?: string | null created_at: string updated_at: string } export interface CreateUsageCleanupTaskRequest { start_date: string end_date: string user_id?: number api_key_id?: number account_id?: number group_id?: number model?: string | null stream?: boolean | null billing_type?: number | null timezone?: string } export interface AdminUsageQueryParams extends UsageQueryParams { user_id?: number } // ==================== API Functions ==================== /** * List all usage logs with optional filters (admin only) * @param params - Query parameters for filtering and pagination * @returns Paginated list of usage logs */ export async function list( params: AdminUsageQueryParams, options?: { signal?: AbortSignal } ): Promise> { const { data } = await apiClient.get>('/admin/usage', { params, signal: options?.signal }) return data } /** * Get usage statistics with optional filters (admin only) * @param params - Query parameters for filtering * @returns Usage statistics */ export async function getStats(params: { user_id?: number api_key_id?: number account_id?: number group_id?: number model?: string stream?: boolean period?: string start_date?: string end_date?: string timezone?: string }): Promise { const { data } = await apiClient.get('/admin/usage/stats', { params }) return data } /** * Search users by email keyword (admin only) * @param keyword - Email keyword to search * @returns List of matching users (max 30) */ export async function searchUsers(keyword: string): Promise { const { data } = await apiClient.get('/admin/usage/search-users', { params: { q: keyword } }) return data } /** * Search API keys by user ID and/or keyword (admin only) * @param userId - Optional user ID to filter by * @param keyword - Optional keyword to search in key name * @returns List of matching API keys (max 30) */ export async function searchApiKeys(userId?: number, keyword?: string): Promise { const params: Record = {} if (userId !== undefined) { params.user_id = userId } if (keyword) { params.q = keyword } const { data } = await apiClient.get('/admin/usage/search-api-keys', { params }) return data } /** * List usage cleanup tasks (admin only) * @param params - Query parameters for pagination * @returns Paginated list of cleanup tasks */ export async function listCleanupTasks( params: { page?: number; page_size?: number }, options?: { signal?: AbortSignal } ): Promise> { const { data } = await apiClient.get>('/admin/usage/cleanup-tasks', { params, signal: options?.signal }) return data } /** * Create a usage cleanup task (admin only) * @param payload - Cleanup task parameters * @returns Created cleanup task */ export async function createCleanupTask(payload: CreateUsageCleanupTaskRequest): Promise { const { data } = await apiClient.post('/admin/usage/cleanup-tasks', payload) return data } /** * Cancel a usage cleanup task (admin only) * @param taskId - Task ID to cancel */ export async function cancelCleanupTask(taskId: number): Promise<{ id: number; status: string }> { const { data } = await apiClient.post<{ id: number; status: string }>( `/admin/usage/cleanup-tasks/${taskId}/cancel` ) return data } export const adminUsageAPI = { list, getStats, searchUsers, searchApiKeys, listCleanupTasks, createCleanupTask, cancelCleanupTask } export default adminUsageAPI