Normalize canonical API formats

This commit is contained in:
fawney19
2026-04-29 09:25:19 +08:00
parent 02ad67fe33
commit 07a319259b
171 changed files with 2460 additions and 1962 deletions

View File

@@ -1,45 +1,43 @@
// API 格式常量
export const API_FORMATS = {
// 新模式endpoint signature keyfamily: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) => {