From 9a8098d2d51279df9f3315580388c1eca7596b56 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sun, 21 Jun 2026 00:10:03 +0800 Subject: [PATCH] feat(api): prioritize non-template Codex client models and adjust priority calculation logic - Added `applyCodexClientNonTemplatePriorities` to assign higher priorities to non-template Codex client models dynamically. - Implemented `maxCodexClientTemplatePriority` to set base priority for non-template models relative to template models. - Updated unit tests to validate priority calculation for custom models. --- internal/api/server_test.go | 14 +++++ .../handlers/openai/codex_client_models.go | 57 ++++++++++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/internal/api/server_test.go b/internal/api/server_test.go index 2bf2cd13..80051e46 100644 --- a/internal/api/server_test.go +++ b/internal/api/server_test.go @@ -515,6 +515,9 @@ func TestModelsWithClientVersionReturnsCodexCatalog(t *testing.T) { if got, _ := custom["display_name"].(string); got != "Custom Codex Model" { t.Fatalf("custom display_name = %q, want Custom Codex Model", got) } + if got := int(codexClientTestPriority(custom["priority"])); got != 129 { + t.Fatalf("custom priority = %v, want 129", custom["priority"]) + } if got, _ := custom["description"].(string); got != "Custom model from registry" { t.Fatalf("custom description = %q, want Custom model from registry", got) } @@ -569,6 +572,17 @@ func TestModelsWithClientVersionReturnsCodexCatalog(t *testing.T) { } } +func codexClientTestPriority(raw any) int { + switch value := raw.(type) { + case int: + return value + case float64: + return int(value) + default: + return -1 + } +} + func assertCodexSupportedReasoningLevels(t *testing.T, model map[string]any, want []string) { t.Helper() diff --git a/sdk/api/handlers/openai/codex_client_models.go b/sdk/api/handlers/openai/codex_client_models.go index 01c7eb5c..41d8e120 100644 --- a/sdk/api/handlers/openai/codex_client_models.go +++ b/sdk/api/handlers/openai/codex_client_models.go @@ -67,6 +67,8 @@ func buildCodexClientModels(models []map[string]any) []map[string]any { result = append(result, entry) } + applyCodexClientNonTemplatePriorities(result, templates) + sort.SliceStable(result, func(i, j int) bool { return codexClientModelPriority(result[i]) < codexClientModelPriority(result[j]) }) @@ -74,6 +76,60 @@ func buildCodexClientModels(models []map[string]any) []map[string]any { return result } +func maxCodexClientTemplatePriority(templates map[string]map[string]any) int { + maxPriority := 0 + for _, template := range templates { + priority := codexClientModelPriority(template) + if priority > maxPriority { + maxPriority = priority + } + } + return maxPriority +} + +func applyCodexClientNonTemplatePriorities(result []map[string]any, templates map[string]map[string]any) { + if len(result) == 0 { + return + } + + basePriority := maxCodexClientTemplatePriority(templates) + type nonTemplateEntry struct { + index int + displayName string + slug string + } + + pending := make([]nonTemplateEntry, 0) + for index, entry := range result { + slug := stringModelValue(entry, "slug") + if _, ok := templates[slug]; ok { + continue + } + displayName := stringModelValue(entry, "display_name") + if displayName == "" { + displayName = slug + } + pending = append(pending, nonTemplateEntry{ + index: index, + displayName: displayName, + slug: slug, + }) + } + + sort.SliceStable(pending, func(i, j int) bool { + left := strings.ToLower(pending[i].displayName) + right := strings.ToLower(pending[j].displayName) + if left == right { + return pending[i].slug < pending[j].slug + } + return left < right + }) + + for rank, entry := range pending { + result[entry.index]["priority"] = basePriority + 100*(rank+1) + } +} + func loadCodexClientModelTemplates() (map[string]map[string]any, map[string]any, error) { codexClientModelTemplatesOnce.Do(func() { var payload codexClientModelsPayload @@ -131,7 +187,6 @@ func applyCodexClientModelMetadata(entry map[string]any, id string, model map[st entry["slug"] = id entry["display_name"] = displayName entry["description"] = description - entry["priority"] = 100 entry["prefer_websockets"] = false entry["service_tiers"] = []any{} delete(entry, "apply_patch_tool_type") -- 2.51.2