fix: remove OpenAI unknown model fallback

This commit is contained in:
shaw
2026-05-04 11:43:00 +08:00
parent d9e68f2ca1
commit df722c9a6e
10 changed files with 214 additions and 137 deletions
@@ -38,6 +38,29 @@ var codexModelMap = map[string]string{
"gpt-5.2-medium": "gpt-5.2",
"gpt-5.2-high": "gpt-5.2",
"gpt-5.2-xhigh": "gpt-5.2",
"gpt-5": "gpt-5.4",
"gpt-5-mini": "gpt-5.4",
"gpt-5-nano": "gpt-5.4",
"gpt-5.1": "gpt-5.4",
"gpt-5.1-codex": "gpt-5.3-codex",
"gpt-5.1-codex-max": "gpt-5.3-codex",
"gpt-5.1-codex-mini": "gpt-5.3-codex",
"gpt-5.2-codex": "gpt-5.2",
"codex-mini-latest": "gpt-5.3-codex",
"gpt-5-codex": "gpt-5.3-codex",
}
var codexVersionModelPrefixes = []struct {
prefix string
target string
}{
{prefix: "gpt-5.3-codex-spark", target: "gpt-5.3-codex-spark"},
{prefix: "gpt-5.3-codex", target: "gpt-5.3-codex"},
{prefix: "gpt-5.4-mini", target: "gpt-5.4-mini"},
{prefix: "gpt-5.4-nano", target: "gpt-5.4-nano"},
{prefix: "gpt-5.5", target: "gpt-5.5"},
{prefix: "gpt-5.4", target: "gpt-5.4"},
{prefix: "gpt-5.2", target: "gpt-5.2"},
}
type codexTransformResult struct {
@@ -447,8 +470,19 @@ func normalizeCodexModel(model string) string {
if model == "" {
return "gpt-5.4"
}
if mapped, ok := normalizeKnownCodexModel(model); ok {
return mapped
}
return model
}
func normalizeKnownCodexModel(model string) (string, bool) {
model = strings.TrimSpace(model)
if model == "" {
return "", false
}
if isOpenAIImageGenerationModel(model) {
return model
return model, true
}
modelID := model
@@ -457,41 +491,58 @@ func normalizeCodexModel(model string) string {
modelID = parts[len(parts)-1]
}
if mapped := getNormalizedCodexModel(modelID); mapped != "" {
return mapped
key := codexModelLookupKey(modelID)
if key == "" {
return "", false
}
if mapped := getNormalizedCodexModel(key); mapped != "" {
return mapped, true
}
for _, item := range codexVersionModelPrefixes {
if key == item.prefix {
return item.target, true
}
suffix, ok := strings.CutPrefix(key, item.prefix+"-")
if ok && isKnownCodexModelSuffix(suffix) {
return item.target, true
}
}
return "", false
}
normalized := strings.ToLower(modelID)
func codexModelLookupKey(modelID string) string {
modelID = strings.TrimSpace(modelID)
if modelID == "" {
return ""
}
if strings.Contains(modelID, "/") {
parts := strings.Split(modelID, "/")
modelID = parts[len(parts)-1]
}
return strings.ToLower(strings.Join(strings.Fields(modelID), "-"))
}
if strings.Contains(normalized, "gpt-5.5") || strings.Contains(normalized, "gpt 5.5") {
return "gpt-5.5"
}
if strings.Contains(normalized, "gpt-5.4-mini") || strings.Contains(normalized, "gpt 5.4 mini") {
return "gpt-5.4-mini"
}
if strings.Contains(normalized, "gpt-5.4") || strings.Contains(normalized, "gpt 5.4") {
return "gpt-5.4"
}
if strings.Contains(normalized, "gpt-5.2") || strings.Contains(normalized, "gpt 5.2") {
return "gpt-5.2"
}
if strings.Contains(normalized, "gpt-5.3-codex-spark") || strings.Contains(normalized, "gpt 5.3 codex spark") {
return "gpt-5.3-codex-spark"
}
if strings.Contains(normalized, "gpt-5.3-codex") || strings.Contains(normalized, "gpt 5.3 codex") {
return "gpt-5.3-codex"
}
if strings.Contains(normalized, "gpt-5.3") || strings.Contains(normalized, "gpt 5.3") {
return "gpt-5.3-codex"
}
if strings.Contains(normalized, "codex") {
return "gpt-5.3-codex"
}
if strings.Contains(normalized, "gpt-5") || strings.Contains(normalized, "gpt 5") {
return "gpt-5.4"
func isKnownCodexModelSuffix(suffix string) bool {
switch suffix {
case "none", "minimal", "low", "medium", "high", "xhigh":
return true
}
return isCodexDateSuffix(suffix)
}
return "gpt-5.4"
func isCodexDateSuffix(suffix string) bool {
parts := strings.Split(suffix, "-")
if len(parts) != 3 || len(parts[0]) != 4 || len(parts[1]) != 2 || len(parts[2]) != 2 {
return false
}
for _, part := range parts {
for _, r := range part {
if r < '0' || r > '9' {
return false
}
}
}
return true
}
func isCodexSparkModel(model string) bool {
@@ -789,18 +840,13 @@ func SupportsVerbosity(model string) bool {
}
func getNormalizedCodexModel(modelID string) string {
if modelID == "" {
key := codexModelLookupKey(modelID)
if key == "" {
return ""
}
if mapped, ok := codexModelMap[modelID]; ok {
if mapped, ok := codexModelMap[key]; ok {
return mapped
}
lower := strings.ToLower(modelID)
for key, value := range codexModelMap {
if strings.ToLower(key) == lower {
return value
}
}
return ""
}