Something went wrong. Try again.
sloproxy
Something went wrong. Try again.
5.8 kB · 181 lines
Go
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182package registry
import ( "bytes" _ "embed" "encoding/json" "fmt" "math" "strings" "sync"
log "github.com/sirupsen/logrus")
//go:embed models/codex_client_models.jsonvar embeddedCodexClientModelsJSON []byte
type codexClientModelsPayload struct { Models []map[string]any `json:"models"`}
type codexClientModelsStore struct { mu sync.RWMutex data []byte revision uint64}
var codexClientCatalogStore = &codexClientModelsStore{}
func init() { if _, err := loadCodexClientModelsFromBytes(embeddedCodexClientModelsJSON, "embed"); err != nil { log.Warnf("registry: failed to parse embedded codex_client_models.json (Codex client catalog will remain unavailable until a valid remote refresh): %v", err) }}
// GetCodexClientModelsJSON returns the current Codex client model catalog.func GetCodexClientModelsJSON() []byte { data, _ := GetCodexClientModelsSnapshot() return data}
// GetCodexClientModelsRevision returns the current revision of the Codex client model catalog.func GetCodexClientModelsRevision() uint64 { codexClientCatalogStore.mu.RLock() defer codexClientCatalogStore.mu.RUnlock() return codexClientCatalogStore.revision}
// GetCodexClientModelsSnapshot returns a consistent catalog copy and revision.// The revision changes only when validated catalog content changes.func GetCodexClientModelsSnapshot() ([]byte, uint64) { codexClientCatalogStore.mu.RLock() defer codexClientCatalogStore.mu.RUnlock() return append([]byte(nil), codexClientCatalogStore.data...), codexClientCatalogStore.revision}
func loadCodexClientModelsFromBytes(data []byte, source string) (bool, error) { if err := ValidateCodexClientModelsJSON(data); err != nil { return false, fmt.Errorf("%s: %w", source, err) }
cloned := append([]byte(nil), data...) codexClientCatalogStore.mu.Lock() defer codexClientCatalogStore.mu.Unlock() if bytes.Equal(codexClientCatalogStore.data, cloned) { return false, nil } codexClientCatalogStore.data = cloned codexClientCatalogStore.revision++ return true, nil}
// ValidateCodexClientModelsJSON validates the fields required to serve a// complete Codex client model catalog.func ValidateCodexClientModelsJSON(data []byte) error { var payload codexClientModelsPayload if err := json.Unmarshal(data, &payload); err != nil { return fmt.Errorf("decode Codex client model catalog: %w", err) } if len(payload.Models) == 0 { return fmt.Errorf("Codex client model catalog has no models") }
seen := make(map[string]struct{}, len(payload.Models)) for i, model := range payload.Models { slug, err := requiredCodexClientModelString(model, "slug") if err != nil { return fmt.Errorf("Codex client model catalog models[%d]: %w", i, err) } if _, exists := seen[slug]; exists { return fmt.Errorf("Codex client model catalog contains duplicate slug %q", slug) } seen[slug] = struct{}{}
if err = validateCodexClientModel(model); err != nil { return fmt.Errorf("Codex client model catalog model %q: %w", slug, err) } } if _, ok := seen["gpt-5.5"]; !ok { return fmt.Errorf("Codex client model catalog is missing default template %q", "gpt-5.5") } return nil}
func validateCodexClientModel(model map[string]any) error { for _, field := range []string{ "display_name", "description", "base_instructions", "minimal_client_version", "visibility", "default_reasoning_level", } { if _, err := requiredCodexClientModelString(model, field); err != nil { return err } }
contextWindow, err := requiredCodexClientModelInteger(model, "context_window", true) if err != nil { return err } maxContextWindow, err := requiredCodexClientModelInteger(model, "max_context_window", true) if err != nil { return err } if contextWindow > maxContextWindow { return fmt.Errorf("context_window %d exceeds max_context_window %d", contextWindow, maxContextWindow) } if _, err = requiredCodexClientModelInteger(model, "priority", false); err != nil { return err }
levels, ok := model["supported_reasoning_levels"].([]any) if !ok || len(levels) == 0 { return fmt.Errorf("field %q must be a non-empty array", "supported_reasoning_levels") } seenLevels := make(map[string]struct{}, len(levels)) for i, rawLevel := range levels { level, ok := rawLevel.(map[string]any) if !ok { return fmt.Errorf("field %q entry %d must be an object", "supported_reasoning_levels", i) } effort, errEffort := requiredCodexClientModelString(level, "effort") if errEffort != nil { return fmt.Errorf("field %q entry %d: %w", "supported_reasoning_levels", i, errEffort) } if _, exists := seenLevels[effort]; exists { return fmt.Errorf("field %q contains duplicate effort %q", "supported_reasoning_levels", effort) } seenLevels[effort] = struct{}{} } defaultLevel, _ := requiredCodexClientModelString(model, "default_reasoning_level") if _, ok = seenLevels[defaultLevel]; !ok { return fmt.Errorf("default_reasoning_level %q is not listed in supported_reasoning_levels", defaultLevel) } return nil}
func requiredCodexClientModelString(model map[string]any, field string) (string, error) { value, ok := model[field].(string) value = strings.TrimSpace(value) if !ok || value == "" { return "", fmt.Errorf("field %q must be a non-empty string", field) } return value, nil}
func requiredCodexClientModelInteger(model map[string]any, field string, positive bool) (int64, error) { value, ok := model[field].(float64) if !ok || math.IsNaN(value) || math.IsInf(value, 0) || math.Trunc(value) != value || value > math.MaxInt64 { return 0, fmt.Errorf("field %q must be an integer", field) } if positive && value <= 0 { return 0, fmt.Errorf("field %q must be positive", field) } if !positive && value < 0 { return 0, fmt.Errorf("field %q must not be negative", field) } return int64(value), nil}