354 lines
11 KiB
TypeScript
Vendored
354 lines
11 KiB
TypeScript
Vendored
/*
|
|
Copyright (C) 2023-2026 QuantumNous
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
For commercial licensing, please contact support@quantumnous.com
|
|
*/
|
|
/**
|
|
* Shared constants for usage logs feature
|
|
*/
|
|
import type { StatusBadgeProps } from '@/components/status-badge'
|
|
import type { LogStatistics, LogCategory } from './types'
|
|
|
|
// ============================================================================
|
|
// Default Values
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Default log statistics when no data is available
|
|
*/
|
|
export const DEFAULT_LOG_STATS: LogStatistics = {
|
|
quota: 0,
|
|
rpm: 0,
|
|
tpm: 0,
|
|
}
|
|
|
|
/**
|
|
* Default empty logs data
|
|
*/
|
|
export const DEFAULT_LOGS_DATA = {
|
|
items: [],
|
|
total: 0,
|
|
}
|
|
|
|
// ============================================================================
|
|
// Log Type Enum
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Log type enum values
|
|
*/
|
|
export const LOG_TYPE_ENUM = {
|
|
UNKNOWN: 0,
|
|
TOPUP: 1,
|
|
CONSUME: 2,
|
|
MANAGE: 3,
|
|
SYSTEM: 4,
|
|
ERROR: 5,
|
|
REFUND: 6,
|
|
LOGIN: 7,
|
|
} as const
|
|
|
|
/**
|
|
* The log list/stat backend uses type=0 as the "all types" sentinel.
|
|
* Row rendering still displays records with type=0 as "Unknown".
|
|
*/
|
|
export const LOG_TYPE_ALL_VALUE = '0' as const
|
|
|
|
// ============================================================================
|
|
// Time Range Presets
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Quick time range presets for filter dialog
|
|
*/
|
|
export const TIME_RANGE_PRESETS = [
|
|
{ days: 1, label: '24 Hours' },
|
|
{ days: 7, label: '7 Days' },
|
|
{ days: 14, label: '14 Days' },
|
|
{ days: 30, label: '30 Days' },
|
|
] as const
|
|
|
|
// ============================================================================
|
|
// Common Logs Configuration
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Log types configuration for filtering and display
|
|
*/
|
|
export const LOG_TYPES = [
|
|
{ value: 0, label: 'Unknown', color: 'default' },
|
|
{ value: 1, label: 'Top-up', color: 'cyan' },
|
|
{ value: 2, label: 'Consume', color: 'green' },
|
|
{ value: 3, label: 'Manage', color: 'orange' },
|
|
{ value: 4, label: 'System', color: 'purple' },
|
|
{ value: 5, label: 'Error', color: 'red' },
|
|
{ value: 6, label: 'Refund', color: 'blue' },
|
|
{ value: 7, label: 'Login', color: 'teal' },
|
|
] as const
|
|
|
|
/**
|
|
* Log types for DataTableToolbar filters (single select mode)
|
|
* Backend treats type=0 as "all logs" in list/stat endpoints, so the filter
|
|
* must not expose the display-only "Unknown" label for that value.
|
|
*/
|
|
export const LOG_TYPE_FILTERS = [
|
|
{ label: 'All Types', value: LOG_TYPE_ALL_VALUE },
|
|
...LOG_TYPES.filter((type) => type.value !== LOG_TYPE_ENUM.UNKNOWN).map(
|
|
(type) => ({
|
|
label: type.label,
|
|
value: String(type.value),
|
|
})
|
|
),
|
|
] as const
|
|
|
|
// ============================================================================
|
|
// Drawing Logs (MjProxy) Constants
|
|
// ============================================================================
|
|
|
|
/**
|
|
* MjProxy task types
|
|
* Must match backend constants in constant/midjourney.go
|
|
*/
|
|
export const MJ_TASK_TYPES = {
|
|
IMAGINE: 'IMAGINE', // 绘图
|
|
UPSCALE: 'UPSCALE', // 放大
|
|
VIDEO: 'VIDEO', // 视频
|
|
EDITS: 'EDITS', // 编辑
|
|
VARIATION: 'VARIATION', // 变换
|
|
HIGH_VARIATION: 'HIGH_VARIATION', // 强变换
|
|
LOW_VARIATION: 'LOW_VARIATION', // 弱变换
|
|
PAN: 'PAN', // 平移
|
|
DESCRIBE: 'DESCRIBE', // 图生文
|
|
BLEND: 'BLEND', // 图混合
|
|
UPLOAD: 'UPLOAD', // 上传文件
|
|
SHORTEN: 'SHORTEN', // 缩词
|
|
REROLL: 'REROLL', // 重绘
|
|
INPAINT: 'INPAINT', // 局部重绘
|
|
SWAP_FACE: 'SWAP_FACE', // 换脸
|
|
ZOOM: 'ZOOM', // 缩放
|
|
CUSTOM_ZOOM: 'CUSTOM_ZOOM', // 自定义缩放
|
|
MODAL: 'MODAL', // 窗口
|
|
} as const
|
|
|
|
/**
|
|
* MjProxy task status
|
|
*/
|
|
export const MJ_TASK_STATUS = {
|
|
NOT_START: 'NOT_START', // 未启动
|
|
SUBMITTED: 'SUBMITTED', // 队列中
|
|
IN_PROGRESS: 'IN_PROGRESS', // 执行中
|
|
SUCCESS: 'SUCCESS', // 成功
|
|
FAILURE: 'FAILURE', // 失败
|
|
MODAL: 'MODAL', // 窗口等待
|
|
} as const
|
|
|
|
/**
|
|
* MjProxy submit result codes
|
|
*/
|
|
export const MJ_SUBMIT_RESULT_CODES = {
|
|
NOT_SUBMITTED: 0, // 未提交
|
|
SUBMITTED: 1, // 已提交
|
|
WAITING: 21, // 等待中
|
|
DUPLICATE: 22, // 重复任务
|
|
} as const
|
|
|
|
// ============================================================================
|
|
// Task Logs Constants
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Task action types
|
|
* Must match backend constants in constant/task.go
|
|
*/
|
|
export const TASK_ACTIONS = {
|
|
// Suno (uppercase)
|
|
MUSIC: 'MUSIC', // 生成音乐
|
|
LYRICS: 'LYRICS', // 生成歌词
|
|
|
|
// Video generation (camelCase)
|
|
GENERATE: 'generate', // 图生视频
|
|
TEXT_GENERATE: 'textGenerate', // 文生视频
|
|
FIRST_TAIL_GENERATE: 'firstTailGenerate', // 首尾生视频
|
|
REFERENCE_GENERATE: 'referenceGenerate', // 参照生视频
|
|
REMIX_GENERATE: 'remixGenerate', // 视频 Remix
|
|
} as const
|
|
|
|
/**
|
|
* Task status
|
|
*/
|
|
export const TASK_STATUS = {
|
|
NOT_START: 'NOT_START', // 未启动
|
|
SUBMITTED: 'SUBMITTED', // 队列中
|
|
IN_PROGRESS: 'IN_PROGRESS', // 执行中
|
|
SUCCESS: 'SUCCESS', // 成功
|
|
FAILURE: 'FAILURE', // 失败
|
|
QUEUED: 'QUEUED', // 排队中
|
|
UNKNOWN: 'UNKNOWN', // 未知
|
|
} as const
|
|
|
|
/**
|
|
* Task platforms
|
|
*/
|
|
export const TASK_PLATFORMS = {
|
|
SUNO: 'suno',
|
|
KLING: 'kling',
|
|
RUNWAY: 'runway',
|
|
LUMA: 'luma',
|
|
VIGGLE: 'viggle',
|
|
} as const
|
|
|
|
// ============================================================================
|
|
// Status Mappings
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Status mapping configuration type
|
|
*/
|
|
export interface StatusMapping {
|
|
label: string
|
|
variant: StatusBadgeProps['variant']
|
|
}
|
|
|
|
/**
|
|
* MjProxy task type mappings
|
|
*/
|
|
export const MJ_TASK_TYPE_MAPPINGS: Record<string, StatusMapping> = {
|
|
[MJ_TASK_TYPES.IMAGINE]: { label: 'Draw', variant: 'blue' },
|
|
[MJ_TASK_TYPES.UPSCALE]: { label: 'Upscale', variant: 'orange' },
|
|
[MJ_TASK_TYPES.VIDEO]: { label: 'Video', variant: 'orange' },
|
|
[MJ_TASK_TYPES.EDITS]: { label: 'Edit', variant: 'orange' },
|
|
[MJ_TASK_TYPES.VARIATION]: { label: 'Vary', variant: 'violet' },
|
|
[MJ_TASK_TYPES.HIGH_VARIATION]: { label: 'Vary (Strong)', variant: 'violet' },
|
|
[MJ_TASK_TYPES.LOW_VARIATION]: { label: 'Vary (Subtle)', variant: 'violet' },
|
|
[MJ_TASK_TYPES.PAN]: { label: 'Pan', variant: 'cyan' },
|
|
[MJ_TASK_TYPES.DESCRIBE]: { label: 'Describe', variant: 'yellow' },
|
|
[MJ_TASK_TYPES.BLEND]: { label: 'Blend', variant: 'lime' },
|
|
[MJ_TASK_TYPES.UPLOAD]: { label: 'Upload', variant: 'blue' },
|
|
[MJ_TASK_TYPES.SHORTEN]: { label: 'Shorten', variant: 'pink' },
|
|
[MJ_TASK_TYPES.REROLL]: { label: 'Reroll', variant: 'indigo' },
|
|
[MJ_TASK_TYPES.INPAINT]: { label: 'Inpaint', variant: 'teal' },
|
|
[MJ_TASK_TYPES.SWAP_FACE]: { label: 'Swap Face', variant: 'purple' },
|
|
[MJ_TASK_TYPES.ZOOM]: { label: 'Zoom', variant: 'green' },
|
|
[MJ_TASK_TYPES.CUSTOM_ZOOM]: { label: 'Custom Zoom', variant: 'green' },
|
|
}
|
|
|
|
/**
|
|
* MjProxy task status mappings
|
|
*/
|
|
export const MJ_STATUS_MAPPINGS: Record<string, StatusMapping> = {
|
|
[MJ_TASK_STATUS.SUCCESS]: { label: 'Success', variant: 'green' },
|
|
[MJ_TASK_STATUS.NOT_START]: { label: 'Not Started', variant: 'neutral' },
|
|
[MJ_TASK_STATUS.SUBMITTED]: { label: 'Queued', variant: 'yellow' },
|
|
[MJ_TASK_STATUS.IN_PROGRESS]: { label: 'In Progress', variant: 'blue' },
|
|
[MJ_TASK_STATUS.FAILURE]: { label: 'Failed', variant: 'red' },
|
|
[MJ_TASK_STATUS.MODAL]: { label: 'Waiting', variant: 'amber' },
|
|
}
|
|
|
|
/**
|
|
* MjProxy submit result mappings
|
|
*/
|
|
export const MJ_SUBMIT_RESULT_MAPPINGS: Record<string, StatusMapping> = {
|
|
[String(MJ_SUBMIT_RESULT_CODES.SUBMITTED)]: {
|
|
label: 'Submitted',
|
|
variant: 'green',
|
|
},
|
|
[String(MJ_SUBMIT_RESULT_CODES.WAITING)]: {
|
|
label: 'Waiting',
|
|
variant: 'lime',
|
|
},
|
|
[String(MJ_SUBMIT_RESULT_CODES.DUPLICATE)]: {
|
|
label: 'Duplicate',
|
|
variant: 'orange',
|
|
},
|
|
[String(MJ_SUBMIT_RESULT_CODES.NOT_SUBMITTED)]: {
|
|
label: 'Not Submitted',
|
|
variant: 'yellow',
|
|
},
|
|
}
|
|
|
|
/**
|
|
* Task action type mappings
|
|
*/
|
|
export const TASK_ACTION_MAPPINGS: Record<string, StatusMapping> = {
|
|
[TASK_ACTIONS.MUSIC]: { label: 'Generate Music', variant: 'neutral' },
|
|
[TASK_ACTIONS.LYRICS]: { label: 'Generate Lyrics', variant: 'pink' },
|
|
[TASK_ACTIONS.GENERATE]: { label: 'Image to Video', variant: 'blue' },
|
|
[TASK_ACTIONS.TEXT_GENERATE]: { label: 'Text to Video', variant: 'blue' },
|
|
[TASK_ACTIONS.FIRST_TAIL_GENERATE]: {
|
|
label: 'First/Last Frame to Video',
|
|
variant: 'blue',
|
|
},
|
|
[TASK_ACTIONS.REFERENCE_GENERATE]: {
|
|
label: 'Reference Video',
|
|
variant: 'blue',
|
|
},
|
|
[TASK_ACTIONS.REMIX_GENERATE]: {
|
|
label: 'Video Remix',
|
|
variant: 'blue',
|
|
},
|
|
}
|
|
|
|
/**
|
|
* Task status mappings
|
|
*/
|
|
export const TASK_STATUS_MAPPINGS: Record<string, StatusMapping> = {
|
|
[TASK_STATUS.SUCCESS]: { label: 'Success', variant: 'green' },
|
|
[TASK_STATUS.NOT_START]: { label: 'Not Started', variant: 'neutral' },
|
|
[TASK_STATUS.SUBMITTED]: { label: 'Queued', variant: 'yellow' },
|
|
[TASK_STATUS.IN_PROGRESS]: { label: 'In Progress', variant: 'blue' },
|
|
[TASK_STATUS.FAILURE]: { label: 'Failed', variant: 'red' },
|
|
[TASK_STATUS.QUEUED]: { label: 'Queued', variant: 'orange' },
|
|
[TASK_STATUS.UNKNOWN]: { label: 'Unknown', variant: 'neutral' },
|
|
}
|
|
|
|
/**
|
|
* Task platform mappings
|
|
*/
|
|
export const TASK_PLATFORM_MAPPINGS: Record<string, StatusMapping> = {
|
|
[TASK_PLATFORMS.SUNO]: { label: 'suno', variant: 'green' },
|
|
[TASK_PLATFORMS.KLING]: { label: 'kling', variant: 'blue' },
|
|
[TASK_PLATFORMS.RUNWAY]: { label: 'runway', variant: 'violet' },
|
|
[TASK_PLATFORMS.LUMA]: { label: 'luma', variant: 'orange' },
|
|
[TASK_PLATFORMS.VIGGLE]: { label: 'viggle', variant: 'pink' },
|
|
}
|
|
|
|
// ============================================================================
|
|
// Log Category Labels
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Log category display labels
|
|
*/
|
|
export const LOG_CATEGORY_LABELS: Record<LogCategory, string> = {
|
|
common: 'Common',
|
|
drawing: 'Drawing',
|
|
task: 'Task',
|
|
}
|
|
|
|
// ============================================================================
|
|
// Log Type Checkers (Constants)
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Log types that are displayable (have detailed info)
|
|
*/
|
|
export const DISPLAYABLE_LOG_TYPES = [0, 2, 5, 6] as const
|
|
|
|
/**
|
|
* Log types that show timing info
|
|
*/
|
|
export const TIMING_LOG_TYPES = [2, 5] as const
|