d146e45e2f
Add a Bun script to apply and normalize AGPL copyright headers across the default frontend source files. The script keeps headers idempotent, upgrades existing headers to the 2023-2026 QuantumNous range, and is exposed through `bun run copyright` for future maintenance.
205 lines
6.5 KiB
TypeScript
Vendored
205 lines
6.5 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
|
|
*/
|
|
import { type TFunction } from 'i18next'
|
|
import type { NameRule, ModelStatus, SyncSource } from './types'
|
|
|
|
// ============================================================================
|
|
// Pagination
|
|
// ============================================================================
|
|
|
|
export const DEFAULT_PAGE_SIZE = 20
|
|
|
|
// ============================================================================
|
|
// Name Rule Options
|
|
// ============================================================================
|
|
|
|
export function getNameRuleOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('Exact Match'), value: 0 as NameRule },
|
|
{ label: t('Prefix Match'), value: 1 as NameRule },
|
|
{ label: t('Contains Match'), value: 2 as NameRule },
|
|
{ label: t('Suffix Match'), value: 3 as NameRule },
|
|
] as const
|
|
}
|
|
|
|
export function getNameRuleConfig(
|
|
t: TFunction
|
|
): Record<NameRule, { label: string; color: string; description: string }> {
|
|
return {
|
|
0: {
|
|
label: t('Exact'),
|
|
color: 'green',
|
|
description: t('Match model name exactly'),
|
|
},
|
|
1: {
|
|
label: t('Prefix'),
|
|
color: 'blue',
|
|
description: t('Match models starting with this name'),
|
|
},
|
|
2: {
|
|
label: t('Contains'),
|
|
color: 'orange',
|
|
description: t('Match models containing this name'),
|
|
},
|
|
3: {
|
|
label: t('Suffix'),
|
|
color: 'purple',
|
|
description: t('Match models ending with this name'),
|
|
},
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Model Status
|
|
// ============================================================================
|
|
|
|
export function getModelStatusOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('All Status'), value: 'all' },
|
|
{ label: t('Enabled'), value: 'enabled' },
|
|
{ label: t('Disabled'), value: 'disabled' },
|
|
] as const
|
|
}
|
|
|
|
export function getModelStatusConfig(
|
|
t: TFunction
|
|
): Record<
|
|
ModelStatus,
|
|
{ label: string; variant: 'success' | 'neutral'; showDot?: boolean }
|
|
> {
|
|
return {
|
|
1: { label: t('Enabled'), variant: 'success', showDot: true },
|
|
0: { label: t('Disabled'), variant: 'neutral' },
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Sync Status Options
|
|
// ============================================================================
|
|
|
|
export function getSyncStatusOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('All Sync Status'), value: 'all' },
|
|
{ label: t('Official Sync'), value: 'yes' },
|
|
{ label: t('No Sync'), value: 'no' },
|
|
] as const
|
|
}
|
|
|
|
// ============================================================================
|
|
// Deployment Status
|
|
// ============================================================================
|
|
|
|
export function getDeploymentStatusOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('All Status'), value: 'all' },
|
|
{ label: t('Running'), value: 'running' },
|
|
{ label: t('Completed'), value: 'completed' },
|
|
{ label: t('Failed'), value: 'failed' },
|
|
{ label: t('Deployment requested'), value: 'deployment requested' },
|
|
{ label: t('Termination requested'), value: 'termination requested' },
|
|
{ label: t('Destroyed'), value: 'destroyed' },
|
|
] as const
|
|
}
|
|
|
|
export function getDeploymentStatusConfig(t: TFunction): Record<
|
|
string,
|
|
{
|
|
label: string
|
|
variant: 'success' | 'neutral' | 'warning' | 'danger'
|
|
showDot?: boolean
|
|
}
|
|
> {
|
|
return {
|
|
running: { label: t('Running'), variant: 'success', showDot: true },
|
|
completed: { label: t('Completed'), variant: 'success' },
|
|
failed: { label: t('Failed'), variant: 'danger' },
|
|
error: { label: t('Failed'), variant: 'danger' },
|
|
destroyed: { label: t('Destroyed'), variant: 'danger' },
|
|
'deployment requested': {
|
|
label: t('Deployment requested'),
|
|
variant: 'warning',
|
|
showDot: true,
|
|
},
|
|
'termination requested': {
|
|
label: t('Termination requested'),
|
|
variant: 'warning',
|
|
showDot: true,
|
|
},
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Quota Type
|
|
// ============================================================================
|
|
|
|
export function getQuotaTypeConfig(
|
|
t: TFunction
|
|
): Record<number, { label: string; color: string }> {
|
|
return {
|
|
0: { label: t('Usage-based'), color: 'violet' },
|
|
1: { label: t('Per-call'), color: 'teal' },
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Endpoint Templates
|
|
// ============================================================================
|
|
|
|
export const ENDPOINT_TEMPLATES: Record<
|
|
string,
|
|
{ path: string; method: string }
|
|
> = {
|
|
openai: { path: '/v1/chat/completions', method: 'POST' },
|
|
'openai-response': { path: '/v1/responses', method: 'POST' },
|
|
anthropic: { path: '/v1/messages', method: 'POST' },
|
|
gemini: { path: '/v1beta/models/{model}:generateContent', method: 'POST' },
|
|
'jina-rerank': { path: '/rerank', method: 'POST' },
|
|
'image-generation': { path: '/v1/images/generations', method: 'POST' },
|
|
embeddings: { path: '/v1/embeddings', method: 'POST' },
|
|
}
|
|
|
|
// ============================================================================
|
|
// Sync Locale Options
|
|
// ============================================================================
|
|
|
|
export function getSyncLocaleOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('Chinese'), value: 'zh' },
|
|
{ label: t('English'), value: 'en' },
|
|
{ label: t('Japanese'), value: 'ja' },
|
|
] as const
|
|
}
|
|
|
|
export function getSyncSourceOptions(t: TFunction) {
|
|
return [
|
|
{
|
|
label: t('Official Repository'),
|
|
value: 'official' as SyncSource,
|
|
description: t('Sync from the public upstream metadata repository.'),
|
|
disabled: false,
|
|
},
|
|
{
|
|
label: t('Configuration File'),
|
|
value: 'config' as SyncSource,
|
|
description: t('Upload or reference a local configuration file.'),
|
|
disabled: true,
|
|
},
|
|
] as const
|
|
}
|