Merge branch 'fix/gemini-model-filter-tuned-check' into 'main'

fix(ai): drop TunedModelInfo nil check in model filter

See merge request vikingowl/marktvogt.de!24
This commit is contained in:
2026-04-25 11:12:21 +00:00
2 changed files with 34 additions and 42 deletions

View File

@@ -60,9 +60,6 @@ func filterCompatibleModels(items []*genai.Model) []ModelInfo {
}
out := make([]ModelInfo, 0, len(items))
for _, m := range items {
if m.TunedModelInfo != nil {
continue
}
name := strings.TrimPrefix(m.Name, "models/")
if !strings.HasPrefix(name, "gemini-") {
continue

View File

@@ -7,28 +7,24 @@ import (
"google.golang.org/genai"
)
func makeModel(name string, tuned, thinking bool) *genai.Model {
m := &genai.Model{
func makeModel(name string, thinking bool) *genai.Model {
return &genai.Model{
Name: "models/" + name,
DisplayName: name,
Thinking: thinking,
InputTokenLimit: 32000,
}
if tuned {
m.TunedModelInfo = &genai.TunedModelInfo{}
}
return m
}
func TestFilterCompatibleModels_KeepsGeminiTextFamilies(t *testing.T) {
// SupportedActions intentionally nil — stable text models don't have it populated.
kept := []*genai.Model{
makeModel("gemini-2.5-pro", false, true),
makeModel("gemini-2.5-flash", false, false),
makeModel("gemini-2.5-flash-lite", false, false),
makeModel("gemini-3-flash-preview-04-2026", false, false),
makeModel("gemini-3.1-pro-preview-04-2026", false, true),
makeModel("gemini-3.1-flash-lite-preview-04-2026", false, false),
makeModel("gemini-2.5-pro", true),
makeModel("gemini-2.5-flash", false),
makeModel("gemini-2.5-flash-lite", false),
makeModel("gemini-3-flash-preview-04-2026", false),
makeModel("gemini-3.1-pro-preview-04-2026", true),
makeModel("gemini-3.1-flash-lite-preview-04-2026", false),
}
got := filterCompatibleModels(kept)
if len(got) != len(kept) {
@@ -44,25 +40,24 @@ func TestFilterCompatibleModels_DropsExcludedFamilies(t *testing.T) {
name string
model *genai.Model
}{
{"tts", makeModel("gemini-2.5-flash-preview-tts", false, false)},
{"pro tts", makeModel("gemini-2.5-pro-preview-tts", false, false)},
{"image", makeModel("gemini-2.5-flash-image", false, false)},
{"native audio", makeModel("gemini-2.5-flash-native-audio-preview-12-2025", false, false)},
{"live", makeModel("gemini-2.5-flash-live-preview", false, false)},
{"computer use", makeModel("gemini-2.5-computer-use-preview-10-2025", false, false)},
{"robotics", makeModel("gemini-robotics-er-1.6-preview", false, false)},
{"embedding", makeModel("gemini-embedding-001", false, false)},
{"gemma", makeModel("gemma-3-27b-it", false, false)},
{"gemma nano", makeModel("gemma-3n-e4b-it", false, false)},
{"deep research", makeModel("deep-research-preview-04-2026", false, false)},
{"deep research max", makeModel("deep-research-max-preview-04-2026", false, false)},
{"imagen", makeModel("imagen-3.0-generate-001", false, false)},
{"veo", makeModel("veo-3.1-generate-preview", false, false)},
{"lyria", makeModel("lyria-realtime-exp", false, false)},
{"learnlm", makeModel("learnlm-2.0-flash-experimental", false, false)},
{"gemini 2.0 flash eol", makeModel("gemini-2.0-flash", false, false)},
{"gemini 2.0 flash lite eol", makeModel("gemini-2.0-flash-lite", false, false)},
{"tuned model", makeModel("gemini-2.5-flash", true, false)},
{"tts", makeModel("gemini-2.5-flash-preview-tts", false)},
{"pro tts", makeModel("gemini-2.5-pro-preview-tts", false)},
{"image", makeModel("gemini-2.5-flash-image", false)},
{"native audio", makeModel("gemini-2.5-flash-native-audio-preview-12-2025", false)},
{"live", makeModel("gemini-2.5-flash-live-preview", false)},
{"computer use", makeModel("gemini-2.5-computer-use-preview-10-2025", false)},
{"robotics", makeModel("gemini-robotics-er-1.6-preview", false)},
{"embedding", makeModel("gemini-embedding-001", false)},
{"gemma", makeModel("gemma-3-27b-it", false)},
{"gemma nano", makeModel("gemma-3n-e4b-it", false)},
{"deep research", makeModel("deep-research-preview-04-2026", false)},
{"deep research max", makeModel("deep-research-max-preview-04-2026", false)},
{"imagen", makeModel("imagen-3.0-generate-001", false)},
{"veo", makeModel("veo-3.1-generate-preview", false)},
{"lyria", makeModel("lyria-realtime-exp", false)},
{"learnlm", makeModel("learnlm-2.0-flash-experimental", false)},
{"gemini 2.0 flash eol", makeModel("gemini-2.0-flash", false)},
{"gemini 2.0 flash lite eol", makeModel("gemini-2.0-flash-lite", false)},
}
for _, tc := range cases {
got := filterCompatibleModels([]*genai.Model{tc.model})
@@ -74,8 +69,8 @@ func TestFilterCompatibleModels_DropsExcludedFamilies(t *testing.T) {
func TestFilterCompatibleModels_StableField(t *testing.T) {
items := []*genai.Model{
makeModel("gemini-2.5-flash", false, false),
makeModel("gemini-3-flash-preview-04-2026", false, false),
makeModel("gemini-2.5-flash", false),
makeModel("gemini-3-flash-preview-04-2026", false),
}
got := filterCompatibleModels(items)
if len(got) != 2 {
@@ -91,8 +86,8 @@ func TestFilterCompatibleModels_StableField(t *testing.T) {
func TestFilterCompatibleModels_ThinkingField(t *testing.T) {
items := []*genai.Model{
makeModel("gemini-2.5-pro", false, true),
makeModel("gemini-2.5-flash", false, false),
makeModel("gemini-2.5-pro", true),
makeModel("gemini-2.5-flash", false),
}
got := filterCompatibleModels(items)
if len(got) != 2 {
@@ -111,10 +106,10 @@ func TestFilterCompatibleModels_ThinkingField(t *testing.T) {
func TestFilterCompatibleModels_SortStableFirst(t *testing.T) {
items := []*genai.Model{
makeModel("gemini-3-flash-preview-04-2026", false, false),
makeModel("gemini-2.5-pro", false, true),
makeModel("gemini-3.1-pro-preview-04-2026", false, true),
makeModel("gemini-2.5-flash-lite", false, false),
makeModel("gemini-3-flash-preview-04-2026", false),
makeModel("gemini-2.5-pro", true),
makeModel("gemini-3.1-pro-preview-04-2026", true),
makeModel("gemini-2.5-flash-lite", false),
}
got := filterCompatibleModels(items)
if len(got) != 4 {