mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
Normalize canonical API formats
This commit is contained in:
@@ -1,45 +1,43 @@
|
||||
// API 格式常量
|
||||
export const API_FORMATS = {
|
||||
// 新模式:endpoint signature key(family:kind,全小写)
|
||||
CLAUDE: 'claude:chat',
|
||||
CLAUDE_CLI: 'claude:cli',
|
||||
CLAUDE: 'claude:messages',
|
||||
CLAUDE_MESSAGES: 'claude:messages',
|
||||
OPENAI: 'openai:chat',
|
||||
OPENAI_RESPONSES: 'openai:responses',
|
||||
OPENAI_RESPONSES_COMPACT: 'openai:responses:compact',
|
||||
OPENAI_IMAGE: 'openai:image',
|
||||
OPENAI_VIDEO: 'openai:video',
|
||||
GEMINI: 'gemini:chat',
|
||||
GEMINI_CLI: 'gemini:cli',
|
||||
GEMINI: 'gemini:generate_content',
|
||||
GEMINI_GENERATE_CONTENT: 'gemini:generate_content',
|
||||
GEMINI_VIDEO: 'gemini:video',
|
||||
GEMINI_FILES: 'gemini:files',
|
||||
} as const
|
||||
|
||||
export type APIFormat = typeof API_FORMATS[keyof typeof API_FORMATS]
|
||||
|
||||
// API 格式显示名称映射(按品牌分组:Chat 在前,CLI/Video 在后)
|
||||
export const API_FORMAT_LABELS: Record<string, string> = {
|
||||
[API_FORMATS.CLAUDE]: 'Claude Chat',
|
||||
[API_FORMATS.CLAUDE_CLI]: 'Claude CLI',
|
||||
[API_FORMATS.CLAUDE_MESSAGES]: 'Claude Messages',
|
||||
[API_FORMATS.OPENAI]: 'OpenAI Chat',
|
||||
[API_FORMATS.OPENAI_RESPONSES]: 'OpenAI Responses',
|
||||
[API_FORMATS.OPENAI_RESPONSES_COMPACT]: 'OpenAI Responses Compact',
|
||||
[API_FORMATS.OPENAI_IMAGE]: 'OpenAI Image',
|
||||
[API_FORMATS.OPENAI_VIDEO]: 'OpenAI Video',
|
||||
[API_FORMATS.GEMINI]: 'Gemini Chat',
|
||||
[API_FORMATS.GEMINI_CLI]: 'Gemini CLI',
|
||||
[API_FORMATS.GEMINI_GENERATE_CONTENT]: 'Gemini Generate Content',
|
||||
[API_FORMATS.GEMINI_VIDEO]: 'Gemini Video',
|
||||
// legacy 兼容(仅用于展示历史数据)
|
||||
CLAUDE: 'Claude Chat',
|
||||
CLAUDE_CLI: 'Claude CLI',
|
||||
[API_FORMATS.GEMINI_FILES]: 'Gemini Files',
|
||||
CLAUDE: 'Claude Messages',
|
||||
CLAUDE_MESSAGES: 'Claude Messages',
|
||||
OPENAI: 'OpenAI Chat',
|
||||
LEGACY_OPENAI_CLI: 'OpenAI Responses',
|
||||
LEGACY_OPENAI_COMPACT: 'OpenAI Responses Compact',
|
||||
OPENAI_RESPONSES: 'OpenAI Responses',
|
||||
OPENAI_RESPONSES_COMPACT: 'OpenAI Responses Compact',
|
||||
OPENAI_IMAGE: 'OpenAI Image',
|
||||
OPENAI_VIDEO: 'OpenAI Video',
|
||||
GEMINI: 'Gemini Chat',
|
||||
GEMINI_CLI: 'Gemini CLI',
|
||||
GEMINI: 'Gemini Generate Content',
|
||||
GEMINI_GENERATE_CONTENT: 'Gemini Generate Content',
|
||||
GEMINI_VIDEO: 'Gemini Video',
|
||||
GEMINI_FILES: 'Gemini Files',
|
||||
}
|
||||
|
||||
// API 格式缩写映射(用于空间紧凑的显示场景)
|
||||
@@ -49,24 +47,21 @@ export const API_FORMAT_SHORT: Record<string, string> = {
|
||||
[API_FORMATS.OPENAI_RESPONSES_COMPACT]: 'ORC',
|
||||
[API_FORMATS.OPENAI_IMAGE]: 'OI',
|
||||
[API_FORMATS.OPENAI_VIDEO]: 'OV',
|
||||
[API_FORMATS.CLAUDE]: 'C',
|
||||
[API_FORMATS.CLAUDE_CLI]: 'CC',
|
||||
[API_FORMATS.GEMINI]: 'G',
|
||||
[API_FORMATS.GEMINI_CLI]: 'GC',
|
||||
[API_FORMATS.CLAUDE_MESSAGES]: 'CM',
|
||||
[API_FORMATS.GEMINI_GENERATE_CONTENT]: 'G',
|
||||
[API_FORMATS.GEMINI_VIDEO]: 'GV',
|
||||
// legacy 兼容(仅用于展示历史数据)
|
||||
[API_FORMATS.GEMINI_FILES]: 'GF',
|
||||
OPENAI: 'O',
|
||||
LEGACY_OPENAI_CLI: 'OR',
|
||||
LEGACY_OPENAI_COMPACT: 'ORC',
|
||||
OPENAI_RESPONSES: 'OR',
|
||||
OPENAI_RESPONSES_COMPACT: 'ORC',
|
||||
OPENAI_IMAGE: 'OI',
|
||||
OPENAI_VIDEO: 'OV',
|
||||
CLAUDE: 'C',
|
||||
CLAUDE_CLI: 'CC',
|
||||
CLAUDE: 'CM',
|
||||
CLAUDE_MESSAGES: 'CM',
|
||||
GEMINI: 'G',
|
||||
GEMINI_CLI: 'GC',
|
||||
GEMINI_GENERATE_CONTENT: 'G',
|
||||
GEMINI_VIDEO: 'GV',
|
||||
GEMINI_FILES: 'GF',
|
||||
}
|
||||
|
||||
// API 格式排序顺序(统一的显示顺序)
|
||||
@@ -76,11 +71,10 @@ export const API_FORMAT_ORDER: string[] = [
|
||||
API_FORMATS.OPENAI_RESPONSES_COMPACT,
|
||||
API_FORMATS.OPENAI_IMAGE,
|
||||
API_FORMATS.OPENAI_VIDEO,
|
||||
API_FORMATS.CLAUDE,
|
||||
API_FORMATS.CLAUDE_CLI,
|
||||
API_FORMATS.GEMINI,
|
||||
API_FORMATS.GEMINI_CLI,
|
||||
API_FORMATS.CLAUDE_MESSAGES,
|
||||
API_FORMATS.GEMINI_GENERATE_CONTENT,
|
||||
API_FORMATS.GEMINI_VIDEO,
|
||||
API_FORMATS.GEMINI_FILES,
|
||||
]
|
||||
|
||||
// Family 显示名称映射
|
||||
@@ -97,8 +91,11 @@ export const API_FORMAT_KIND_LABELS: Record<string, string> = {
|
||||
responses: 'Responses',
|
||||
'responses:compact': 'Responses Compact',
|
||||
compact: 'Compact',
|
||||
messages: 'Messages',
|
||||
generate_content: 'Generate Content',
|
||||
image: 'Image',
|
||||
video: 'Video',
|
||||
files: 'Files',
|
||||
}
|
||||
|
||||
// Family 排序顺序
|
||||
@@ -113,22 +110,29 @@ export function parseApiFormat(format: string): { family: string; kind: string }
|
||||
|
||||
export function normalizeApiFormatAlias(format: string | null | undefined): string {
|
||||
const raw = format?.trim() ?? ''
|
||||
switch (raw.toLowerCase()) {
|
||||
case 'openai:cli':
|
||||
return API_FORMATS.OPENAI_RESPONSES
|
||||
case 'openai:compact':
|
||||
return API_FORMATS.OPENAI_RESPONSES_COMPACT
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
switch (raw.toUpperCase()) {
|
||||
case 'OPENAI_CLI':
|
||||
case 'CLAUDE':
|
||||
case 'CLAUDE_MESSAGES':
|
||||
return API_FORMATS.CLAUDE_MESSAGES
|
||||
case 'OPENAI':
|
||||
return API_FORMATS.OPENAI
|
||||
case 'OPENAI_RESPONSES':
|
||||
return API_FORMATS.OPENAI_RESPONSES
|
||||
case 'OPENAI_COMPACT':
|
||||
case 'OPENAI_RESPONSES_COMPACT':
|
||||
return API_FORMATS.OPENAI_RESPONSES_COMPACT
|
||||
case 'OPENAI_IMAGE':
|
||||
return API_FORMATS.OPENAI_IMAGE
|
||||
case 'OPENAI_VIDEO':
|
||||
return API_FORMATS.OPENAI_VIDEO
|
||||
case 'GEMINI':
|
||||
case 'GEMINI_GENERATE_CONTENT':
|
||||
return API_FORMATS.GEMINI_GENERATE_CONTENT
|
||||
case 'GEMINI_VIDEO':
|
||||
return API_FORMATS.GEMINI_VIDEO
|
||||
case 'GEMINI_FILES':
|
||||
return API_FORMATS.GEMINI_FILES
|
||||
default:
|
||||
return raw
|
||||
return raw.toLowerCase()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,7 +175,6 @@ export function formatApiFormat(format: string | null | undefined): string {
|
||||
const upper = normalized.toUpperCase()
|
||||
return API_FORMAT_LABELS[normalized]
|
||||
|| API_FORMAT_LABELS[normalized.toLowerCase()]
|
||||
|| API_FORMAT_LABELS[legacyUppercaseApiFormatKey(upper)]
|
||||
|| API_FORMAT_LABELS[upper]
|
||||
|| normalized
|
||||
}
|
||||
@@ -183,22 +186,10 @@ export function formatApiFormatShort(format: string | null | undefined): string
|
||||
const upper = normalized.toUpperCase()
|
||||
return API_FORMAT_SHORT[normalized]
|
||||
|| API_FORMAT_SHORT[normalized.toLowerCase()]
|
||||
|| API_FORMAT_SHORT[legacyUppercaseApiFormatKey(upper)]
|
||||
|| API_FORMAT_SHORT[upper]
|
||||
|| normalized.substring(0, 2)
|
||||
}
|
||||
|
||||
function legacyUppercaseApiFormatKey(value: string): string {
|
||||
switch (value) {
|
||||
case 'OPENAI_CLI':
|
||||
return 'LEGACY_OPENAI_CLI'
|
||||
case 'OPENAI_COMPACT':
|
||||
return 'LEGACY_OPENAI_COMPACT'
|
||||
default:
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
// 工具函数:按标准顺序排序 API 格式数组
|
||||
export function sortApiFormats(formats: string[]): string[] {
|
||||
return [...formats].sort((a, b) => {
|
||||
|
||||
@@ -267,7 +267,7 @@ export const usageApi = {
|
||||
username?: string
|
||||
model?: string
|
||||
provider?: string
|
||||
api_format?: string // API 格式筛选(如 openai:chat, claude:chat)
|
||||
api_format?: string // API 格式筛选(如 openai:chat, claude:messages)
|
||||
status?: string // 'stream' | 'standard' | 'error'
|
||||
limit?: number
|
||||
offset?: number
|
||||
|
||||
Reference in New Issue
Block a user