2026-05-04 16:45:59 +08:00

101 lines
2.6 KiB
TypeScript

export const OPENAI_DEFAULT_MAIN_MODEL = 'gpt-5.3-codex'
export const OPENAI_DEFAULT_SONNET_MODEL = 'gpt-5.4'
export const OPENAI_DEFAULT_HAIKU_MODEL = 'gpt-5.4-mini'
export type OpenAIModelCatalogEntry = {
value: string
label: string
description: string
descriptionForModel?: string
}
export const OPENAI_CODEX_MODEL_CATALOG: OpenAIModelCatalogEntry[] = [
{
value: OPENAI_DEFAULT_MAIN_MODEL,
label: 'GPT-5.3 Codex',
description: 'Best for coding and agentic work',
descriptionForModel: 'GPT-5.3 Codex - best for coding and agentic work',
},
{
value: OPENAI_DEFAULT_SONNET_MODEL,
label: 'GPT-5.4',
description: 'Strong general-purpose model',
descriptionForModel: 'GPT-5.4 - strong general-purpose model',
},
{
value: 'gpt-5.5',
label: 'GPT-5.5',
description: 'Latest general-purpose model',
descriptionForModel: 'GPT-5.5 - latest general-purpose model',
},
{
value: OPENAI_DEFAULT_HAIKU_MODEL,
label: 'GPT-5.4 Mini',
description: 'Fastest for quick tasks',
descriptionForModel: 'GPT-5.4 Mini - fastest for quick tasks',
},
]
export function isOpenAIResponsesModel(model: string): boolean {
const normalized = model.trim().toLowerCase()
return normalized.startsWith('gpt-') || /^o\d/.test(normalized)
}
export function resolveOpenAICodexModel(model: string): string {
if (process.env.OPENAI_CODEX_MODEL?.trim()) {
return process.env.OPENAI_CODEX_MODEL.trim()
}
const normalized = model.trim().toLowerCase()
if (isOpenAIResponsesModel(normalized)) {
return model
}
if (normalized.includes('haiku')) {
return (
process.env.OPENAI_CODEX_HAIKU_MODEL?.trim() ||
OPENAI_DEFAULT_HAIKU_MODEL
)
}
if (normalized.includes('sonnet')) {
return (
process.env.OPENAI_CODEX_SONNET_MODEL?.trim() ||
OPENAI_DEFAULT_SONNET_MODEL
)
}
if (normalized.includes('opus')) {
return (
process.env.OPENAI_CODEX_OPUS_MODEL?.trim() || OPENAI_DEFAULT_MAIN_MODEL
)
}
return OPENAI_DEFAULT_MAIN_MODEL
}
export function getOpenAIModelDisplayName(model: string): string | null {
switch (model.trim().toLowerCase()) {
case 'gpt-5.3-codex':
return 'GPT-5.3 Codex'
case 'gpt-5.5':
return 'GPT-5.5'
case 'gpt-5.4':
return 'GPT-5.4'
case 'gpt-5.4-mini':
return 'GPT-5.4 Mini'
case 'gpt-5.2':
return 'GPT-5.2'
case 'gpt-5.2-codex':
return 'GPT-5.2 Codex'
case 'gpt-5.1-codex':
return 'GPT-5.1 Codex'
case 'gpt-5.1-codex-max':
return 'GPT-5.1 Codex Max'
case 'gpt-5.1-codex-mini':
return 'GPT-5.1 Codex Mini'
default:
return null
}
}