Merge remote-tracking branch 'origin/main' into codex/pool-key-bulk-management-20260714

# Conflicts:
#	apps/aether-gateway/src/handlers/admin/request/provider/tasks.rs
#	frontend/src/api/endpoints/pool.ts
This commit is contained in:
MMEXA
2026-07-16 23:43:04 +08:00
1257 changed files with 80521 additions and 35495 deletions
@@ -1,35 +1,15 @@
import type { EndpointHealthDetail } from '@/api/endpoints'
import { compareApiFormats } from '@/api/endpoints/types/api-format'
import { defaultLocale, translateLegacyText, type Locale } from '@/i18n/messages'
// 端点状态枚举
export type EndpointStatus = 'disabled' | 'no_keys' | 'keys_disabled' | 'available'
const ENDPOINT_SORT_ORDER = [
'claude:messages',
'openai:chat',
'openai:responses',
'openai:responses:compact',
'openai:embedding',
'openai:rerank',
'gemini:generate_content',
'gemini:interactions',
'gemini:embedding',
'openai:video',
'gemini:video',
'gemini:files',
'jina:embedding',
'jina:rerank',
'doubao:embedding',
'aliyun:multimodal_embedding',
]
/**
* 端点排序
*/
export function sortEndpoints<T extends { api_format: string }>(endpoints: T[]): T[] {
return [...endpoints].sort((a, b) => {
return ENDPOINT_SORT_ORDER.indexOf(a.api_format) - ENDPOINT_SORT_ORDER.indexOf(b.api_format)
})
return [...endpoints].sort((a, b) => compareApiFormats(a.api_format, b.api_format))
}
/**
@@ -1,5 +1,6 @@
import { ref, computed, watch } from 'vue'
import type { ProviderSummaryQuery } from '@/api/endpoints'
import { API_FORMAT_ORDER, formatApiFormat } from '@/api/endpoints/types/api-format'
import { useI18n } from '@/i18n'
export interface FilterOption {
@@ -25,19 +26,7 @@ export function useProviderFilters(
const apiFormatFilters = computed<FilterOption[]>(() => [
{ value: 'all', label: legacyT('全部格式') },
{ value: 'claude:messages', label: 'Claude Messages' },
{ value: 'openai:chat', label: 'OpenAI Chat' },
{ value: 'openai:responses', label: 'OpenAI Responses' },
{ value: 'openai:responses:compact', label: 'OpenAI Responses Compact' },
{ value: 'openai:embedding', label: 'OpenAI Embedding' },
{ value: 'openai:rerank', label: 'OpenAI Rerank' },
{ value: 'gemini:generate_content', label: 'Gemini Generate Content' },
{ value: 'gemini:interactions', label: 'Gemini Interactions' },
{ value: 'gemini:embedding', label: 'Gemini Embedding' },
{ value: 'jina:embedding', label: 'Jina Embedding' },
{ value: 'jina:rerank', label: 'Jina Rerank' },
{ value: 'doubao:embedding', label: 'Doubao Embedding' },
{ value: 'aliyun:multimodal_embedding', label: 'Aliyun Multimodal Embedding' },
...API_FORMAT_ORDER.map(value => ({ value, label: formatApiFormat(value) })),
])
const modelFilters = computed<FilterOption[]>(() => {