Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 23 additions & 9 deletions internal/registry/model_definitions.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand All @@ -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.
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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,
}
}
}
}

Expand Down
19 changes: 12 additions & 7 deletions internal/registry/model_updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}