/** * Usage tracking API endpoints * Handles usage logs and statistics retrieval */ import { apiClient } from './client' import type { UsageLog, UsageQueryParams, UsageStatsResponse, PaginatedResponse, TrendDataPoint, ModelStat } from '@/types' // ==================== Dashboard Types ==================== export interface UserDashboardStats { total_api_keys: number active_api_keys: number total_requests: number total_input_tokens: number total_output_tokens: number total_cache_creation_tokens: number total_cache_read_tokens: number total_tokens: number total_cost: number // 标准计费 total_actual_cost: number // 实际扣除 today_requests: number today_input_tokens: number today_output_tokens: number today_cache_creation_tokens: number today_cache_read_tokens: number today_tokens: number today_cost: number // 今日标准计费 today_actual_cost: number // 今日实际扣除 average_duration_ms: number rpm: number // 近5分钟平均每分钟请求数 tpm: number // 近5分钟平均每分钟Token数 } export interface TrendParams { start_date?: string end_date?: string granularity?: 'day' | 'hour' } export interface TrendResponse { trend: TrendDataPoint[] start_date: string end_date: string granularity: string } export interface ModelStatsResponse { models: ModelStat[] start_date: string end_date: string } /** * List usage logs with optional filters * @param page - Page number (default: 1) * @param pageSize - Items per page (default: 20) * @param apiKeyId - Filter by API key ID * @returns Paginated list of usage logs */ export async function list( page: number = 1, pageSize: number = 20, apiKeyId?: number ): Promise> { const params: UsageQueryParams = { page, page_size: pageSize } if (apiKeyId !== undefined) { params.api_key_id = apiKeyId } const { data } = await apiClient.get>('/usage', { params }) return data } /** * Get usage logs with advanced query parameters * @param params - Query parameters for filtering and pagination * @returns Paginated list of usage logs */ export async function query( params: UsageQueryParams, config: { signal?: AbortSignal } = {} ): Promise> { const { data } = await apiClient.get>('/usage', { ...config, params }) return data } /** * Get usage statistics for a specific period * @param period - Time period ('today', 'week', 'month', 'year') * @param apiKeyId - Optional API key ID filter * @returns Usage statistics */ export async function getStats( period: string = 'today', apiKeyId?: number ): Promise { const params: Record = { period } if (apiKeyId !== undefined) { params.api_key_id = apiKeyId } const { data } = await apiClient.get('/usage/stats', { params }) return data } /** * Get usage statistics for a date range * @param startDate - Start date (YYYY-MM-DD format) * @param endDate - End date (YYYY-MM-DD format) * @param apiKeyId - Optional API key ID filter * @returns Usage statistics */ export async function getStatsByDateRange( startDate: string, endDate: string, apiKeyId?: number ): Promise { const params: Record = { start_date: startDate, end_date: endDate } if (apiKeyId !== undefined) { params.api_key_id = apiKeyId } const { data } = await apiClient.get('/usage/stats', { params }) return data } /** * Get usage by date range * @param startDate - Start date (YYYY-MM-DD format) * @param endDate - End date (YYYY-MM-DD format) * @param apiKeyId - Optional API key ID filter * @returns Usage logs within date range */ export async function getByDateRange( startDate: string, endDate: string, apiKeyId?: number ): Promise> { const params: UsageQueryParams = { start_date: startDate, end_date: endDate, page: 1, page_size: 100 } if (apiKeyId !== undefined) { params.api_key_id = apiKeyId } const { data } = await apiClient.get>('/usage', { params }) return data } /** * Get detailed usage log by ID * @param id - Usage log ID * @returns Usage log details */ export async function getById(id: number): Promise { const { data } = await apiClient.get(`/usage/${id}`) return data } // ==================== Dashboard API ==================== /** * Get user dashboard statistics * @returns Dashboard statistics for current user */ export async function getDashboardStats(): Promise { const { data } = await apiClient.get('/usage/dashboard/stats') return data } /** * Get user usage trend data * @param params - Query parameters for filtering * @returns Usage trend data for current user */ export async function getDashboardTrend(params?: TrendParams): Promise { const { data } = await apiClient.get('/usage/dashboard/trend', { params }) return data } /** * Get user model usage statistics * @param params - Query parameters for filtering * @returns Model usage statistics for current user */ export async function getDashboardModels(params?: { start_date?: string end_date?: string }): Promise { const { data } = await apiClient.get('/usage/dashboard/models', { params }) return data } export interface BatchApiKeyUsageStats { api_key_id: number today_actual_cost: number total_actual_cost: number } export interface BatchApiKeysUsageResponse { stats: Record } /** * Get batch usage stats for user's own API keys * @param apiKeyIds - Array of API key IDs * @param options - Optional request options * @returns Usage stats map keyed by API key ID */ export async function getDashboardApiKeysUsage( apiKeyIds: number[], options?: { signal?: AbortSignal } ): Promise { const { data } = await apiClient.post( '/usage/dashboard/api-keys-usage', { api_key_ids: apiKeyIds }, { signal: options?.signal } ) return data } export const usageAPI = { list, query, getStats, getStatsByDateRange, getByDateRange, getById, // Dashboard getDashboardStats, getDashboardTrend, getDashboardModels, getDashboardApiKeysUsage } export default usageAPI