From 204a3320766d08dfec95bb32753e372443aedd79 Mon Sep 17 00:00:00 2001 From: I3eg1nner Date: Sat, 6 Jun 2026 12:29:13 +0800 Subject: [PATCH] fix: update Antigravity field from map to array to match remote models.json The remote models.json (router-for-me/models) changed antigravity from a map format to an array format (consistent with all other sections like claude, gemini, etc.). However, the Go struct in staticModelsJSON still expected a map, causing the binary to panic on startup with: " json: cannot unmarshal array into Go struct field --- internal/registry/model_definitions.go | 32 ++++++++++++++++++-------- internal/registry/model_updater.go | 19 +++++++++------ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/internal/registry/model_definitions.go b/internal/registry/model_definitions.go index b7f5edb1..4bffc2e4 100644 --- a/internal/registry/model_definitions.go +++ b/internal/registry/model_definitions.go @@ -14,6 +14,13 @@ type AntigravityModelConfig struct { MaxCompletionTokens int `json:"max_completion_tokens,omitempty"` } +// AntigravityModelEntry represents a single antigravity model entry in models.json. +// Remote models.json uses an array format where each entry carries an id field. +type AntigravityModelEntry struct { + ID string `json:"id"` + *AntigravityModelConfig +} + // staticModelsJSON mirrors the top-level structure of models.json. type staticModelsJSON struct { Claude []*ModelInfo `json:"claude"` @@ -28,7 +35,7 @@ type staticModelsJSON struct { Qwen []*ModelInfo `json:"qwen"` IFlow []*ModelInfo `json:"iflow"` Kimi []*ModelInfo `json:"kimi"` - Antigravity map[string]*AntigravityModelConfig `json:"antigravity"` + Antigravity []*AntigravityModelEntry `json:"antigravity"` } // GetClaudeModels returns the standard Claude model definitions. @@ -92,15 +99,18 @@ func GetKimiModels() []*ModelInfo { } // GetAntigravityModelConfig returns static configuration for antigravity models. -// Keys use upstream model names returned by the Antigravity models endpoint. +// Keys use upstream model names (entry.ID) as returned by the Antigravity models endpoint. func GetAntigravityModelConfig() map[string]*AntigravityModelConfig { data := getModels() if len(data.Antigravity) == 0 { return nil } out := make(map[string]*AntigravityModelConfig, len(data.Antigravity)) - for k, v := range data.Antigravity { - out[k] = cloneAntigravityModelConfig(v) + for _, entry := range data.Antigravity { + if entry == nil || entry.ID == "" { + continue + } + out[entry.ID] = cloneAntigravityModelConfig(entry.AntigravityModelConfig) } return out } @@ -223,11 +233,15 @@ func LookupStaticModelInfo(modelID string) *ModelInfo { } // Check Antigravity static config - if cfg := cloneAntigravityModelConfig(data.Antigravity[modelID]); cfg != nil { - return &ModelInfo{ - ID: modelID, - Thinking: cfg.Thinking, - MaxCompletionTokens: cfg.MaxCompletionTokens, + for _, entry := range data.Antigravity { + if entry != nil && entry.ID == modelID { + if cfg := cloneAntigravityModelConfig(entry.AntigravityModelConfig); cfg != nil { + return &ModelInfo{ + ID: modelID, + Thinking: cfg.Thinking, + MaxCompletionTokens: cfg.MaxCompletionTokens, + } + } } } diff --git a/internal/registry/model_updater.go b/internal/registry/model_updater.go index 84c9d6aa..f2411922 100644 --- a/internal/registry/model_updater.go +++ b/internal/registry/model_updater.go @@ -180,19 +180,24 @@ func validateModelSection(section string, models []*ModelInfo) error { return nil } -func validateAntigravitySection(configs map[string]*AntigravityModelConfig) error { - if len(configs) == 0 { +func validateAntigravitySection(entries []*AntigravityModelEntry) error { + if len(entries) == 0 { return fmt.Errorf("antigravity section is empty") } - for modelID, cfg := range configs { - trimmedID := strings.TrimSpace(modelID) + seen := make(map[string]struct{}, len(entries)) + for i, entry := range entries { + if entry == nil { + return fmt.Errorf("antigravity[%d] is null", i) + } + trimmedID := strings.TrimSpace(entry.ID) if trimmedID == "" { - return fmt.Errorf("antigravity contains empty model id") + return fmt.Errorf("antigravity[%d] has empty id", i) } - if cfg == nil { - return fmt.Errorf("antigravity[%q] is null", trimmedID) + if _, exists := seen[trimmedID]; exists { + return fmt.Errorf("antigravity contains duplicate model id %q", trimmedID) } + seen[trimmedID] = struct{}{} } return nil }