diff --git a/internal/registry/model_definitions_test.go b/internal/registry/model_definitions_test.go index 934802fb2c..a99e7987be 100644 --- a/internal/registry/model_definitions_test.go +++ b/internal/registry/model_definitions_test.go @@ -1,6 +1,9 @@ package registry -import "testing" +import ( + "slices" + "testing" +) func TestGetStaticModelDefinitionsByChannelSupportsGeminiInteractions(t *testing.T) { models := GetStaticModelDefinitionsByChannel("gemini-interactions") @@ -42,6 +45,49 @@ func TestGeminiVertexModelsUseFlashLiteReleaseID(t *testing.T) { t.Fatalf("Vertex models do not contain %q", releaseID) } +func TestAntigravityModelsIncludeGemini38Flash(t *testing.T) { + modelsByID := make(map[string]*ModelInfo) + for _, model := range GetAntigravityModels() { + if model != nil { + modelsByID[model.ID] = model + } + } + + tests := []struct { + id string + description string + }{ + {id: "gemini-3.8-flash-high", description: "Gemini 3.8 Flash (High)"}, + {id: "gemini-3.8-flash-medium", description: "Gemini 3.8 Flash (Medium)"}, + } + for _, tt := range tests { + t.Run(tt.id, func(t *testing.T) { + got := modelsByID[tt.id] + if got == nil { + t.Fatalf("Antigravity models do not contain %q", tt.id) + } + if got.OwnedBy != "antigravity" || got.Type != "antigravity" || got.Name != tt.id || got.DisplayName != "Gemini 3.8 Flash" || got.Description != tt.description { + t.Fatalf("Gemini 3.8 Flash identity metadata = %+v", got) + } + if got.ContextLength != 1048576 || got.MaxCompletionTokens != 65536 { + t.Fatalf("Gemini 3.8 Flash token limits = %d/%d, want 1048576/65536", got.ContextLength, got.MaxCompletionTokens) + } + if got.Thinking == nil || got.Thinking.Min != 1 || got.Thinking.Max != 65535 || !got.Thinking.DynamicAllowed { + t.Fatalf("Gemini 3.8 Flash thinking metadata = %+v", got.Thinking) + } + if want := []string{"low", "medium", "high"}; !slices.Equal(got.Thinking.Levels, want) { + t.Fatalf("Gemini 3.8 Flash thinking levels = %v, want %v", got.Thinking.Levels, want) + } + if want := []string{"text", "image", "audio", "video"}; !slices.Equal(got.SupportedInputModalities, want) { + t.Fatalf("Gemini 3.8 Flash input modalities = %v, want %v", got.SupportedInputModalities, want) + } + if want := []string{"text"}; !slices.Equal(got.SupportedOutputModalities, want) { + t.Fatalf("Gemini 3.8 Flash output modalities = %v, want %v", got.SupportedOutputModalities, want) + } + }) + } +} + func TestWithXAIBuiltinsIncludesImage20(t *testing.T) { models := WithXAIBuiltins(nil) for _, model := range models { diff --git a/internal/registry/models/models.json b/internal/registry/models/models.json index 333a071cc0..2fc55de346 100644 --- a/internal/registry/models/models.json +++ b/internal/registry/models/models.json @@ -3445,6 +3445,66 @@ "text" ] }, + { + "id": "gemini-3.8-flash-high", + "object": "model", + "owned_by": "antigravity", + "type": "antigravity", + "display_name": "Gemini 3.8 Flash", + "name": "gemini-3.8-flash-high", + "description": "Gemini 3.8 Flash (High)", + "context_length": 1048576, + "max_completion_tokens": 65536, + "thinking": { + "min": 1, + "max": 65535, + "dynamic_allowed": true, + "levels": [ + "low", + "medium", + "high" + ] + }, + "supportedInputModalities": [ + "text", + "image", + "audio", + "video" + ], + "supportedOutputModalities": [ + "text" + ] + }, + { + "id": "gemini-3.8-flash-medium", + "object": "model", + "owned_by": "antigravity", + "type": "antigravity", + "display_name": "Gemini 3.8 Flash", + "name": "gemini-3.8-flash-medium", + "description": "Gemini 3.8 Flash (Medium)", + "context_length": 1048576, + "max_completion_tokens": 65536, + "thinking": { + "min": 1, + "max": 65535, + "dynamic_allowed": true, + "levels": [ + "low", + "medium", + "high" + ] + }, + "supportedInputModalities": [ + "text", + "image", + "audio", + "video" + ], + "supportedOutputModalities": [ + "text" + ] + }, { "id": "gemini-3-flash", "object": "model",