From 1215b5044c724ea3ce62496867ccb9ab8fbe5459 Mon Sep 17 00:00:00 2001 From: Dan Crosby Date: Fri, 26 Jun 2026 07:46:55 -0700 Subject: [PATCH] Remove retired Gemini fallback models (#8199) * Remove retired Gemini fallback models * Prefer cheaper Gemini fallbacks first --- docs/LLM_MODEL_COMPARISON.md | 2 +- .../go/net/eagle0/admin_server/admin_server.go | 2 +- .../common/llm_integration/GeminiServiceImpl.scala | 11 ++++++----- .../net/eagle0/eagle/library/settings/BUILD.bazel | 2 +- .../eagle/service/GameAdminServiceImpl.scala | 2 +- .../llm_integration/GeminiServiceImplTest.scala | 14 +++++++++++--- .../net/eagle0/eagle/service/LlmResolverTest.scala | 2 +- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/LLM_MODEL_COMPARISON.md b/docs/LLM_MODEL_COMPARISON.md index e6bc24cdc0..61285f845b 100644 --- a/docs/LLM_MODEL_COMPARISON.md +++ b/docs/LLM_MODEL_COMPARISON.md @@ -71,7 +71,7 @@ LLM settings can be changed at runtime via the admin console: 1. Navigate to Admin Console → Settings 2. Change `LlmProvider` to select vendor (gemini, openai, claude) 3. Change the corresponding model name setting: - - `GeminiModelName` (default: gemini-3.1-flash-lite-preview) + - `GeminiModelName` (default: gemini-3.1-flash-lite) - `OpenAiModelName` (default: gpt-4.1-mini) - `ClaudeModelName` (default: claude-3-5-haiku-20241022) diff --git a/src/main/go/net/eagle0/admin_server/admin_server.go b/src/main/go/net/eagle0/admin_server/admin_server.go index 8f7015f791..65350c3002 100644 --- a/src/main/go/net/eagle0/admin_server/admin_server.go +++ b/src/main/go/net/eagle0/admin_server/admin_server.go @@ -1616,7 +1616,7 @@ type SettingInfo struct { var llmProviderOptions = []string{"gemini", "openai", "claude"} var openAiModelOptions = []string{"gpt-4.1-mini", "gpt-5-mini", "gpt-5.1", "gpt-5.2", "gpt-4.1", "gpt-4o", "gpt-4o-mini", "o1", "o1-mini", "o3-mini"} var claudeModelOptions = []string{"claude-3-5-haiku-20241022", "claude-sonnet-4-20250514", "claude-opus-4-20250514", "claude-3-7-sonnet-20250219", "claude-3-5-sonnet-20241022"} -var geminiModelOptions = []string{"gemini-3.1-flash-lite-preview", "gemini-2.5-flash-lite", "gemini-2.5-flash", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-3-pro-preview"} +var geminiModelOptions = []string{"gemini-3.1-flash-lite", "gemini-3.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-flash", "gemini-2.5-pro"} var historyBackendOptions = []string{"env", "sqlite", "postgres"} type SettingsPageData struct { diff --git a/src/main/scala/net/eagle0/common/llm_integration/GeminiServiceImpl.scala b/src/main/scala/net/eagle0/common/llm_integration/GeminiServiceImpl.scala index 229760274c..8b88bb8fde 100644 --- a/src/main/scala/net/eagle0/common/llm_integration/GeminiServiceImpl.scala +++ b/src/main/scala/net/eagle0/common/llm_integration/GeminiServiceImpl.scala @@ -12,20 +12,21 @@ import org.json4s.jvalue2monadic import org.json4s.native.{Json, Serialization} object GeminiServiceImpl { - val defaultModel: String = "gemini-3.1-flash-lite-preview" + val defaultModel: String = "gemini-3.1-flash-lite" private val fallbackModels: Vector[String] = Vector( - "gemini-2.5-flash", + defaultModel, "gemini-2.5-flash-lite", - "gemini-2.0-flash", - "gemini-2.0-flash-lite" + "gemini-2.5-flash", + "gemini-2.5-pro", + "gemini-3.5-flash" ) private lazy val apiKey = ApiKeys.gemini private val baseURL = "https://generativelanguage.googleapis.com/v1beta/models" def fallbackModelNames(configuredModelName: String): Vector[String] = - (configuredModelName +: (fallbackModels :+ defaultModel)).distinct + (configuredModelName +: fallbackModels).distinct private def requestUrl(modelName: String): String = s"$baseURL/$modelName:streamGenerateContent?alt=sse&key=$apiKey" diff --git a/src/main/scala/net/eagle0/eagle/library/settings/BUILD.bazel b/src/main/scala/net/eagle0/eagle/library/settings/BUILD.bazel index 0e2a932cc8..64f66682ef 100644 --- a/src/main/scala/net/eagle0/eagle/library/settings/BUILD.bazel +++ b/src/main/scala/net/eagle0/eagle/library/settings/BUILD.bazel @@ -3659,7 +3659,7 @@ scala_setting_library( name = "gemini_model_name", setting_name = "GeminiModelName", setting_type = "String", - setting_value = "gemini-3.1-flash-lite-preview", + setting_value = "gemini-3.1-flash-lite", visibility = [ "//src/main/scala/net/eagle0/eagle:__subpackages__", "//src/main/scala/net/eagle0/util:__subpackages__", diff --git a/src/main/scala/net/eagle0/eagle/service/GameAdminServiceImpl.scala b/src/main/scala/net/eagle0/eagle/service/GameAdminServiceImpl.scala index f33f76ab0f..5cee840167 100644 --- a/src/main/scala/net/eagle0/eagle/service/GameAdminServiceImpl.scala +++ b/src/main/scala/net/eagle0/eagle/service/GameAdminServiceImpl.scala @@ -379,7 +379,7 @@ class GameAdminServiceImpl( case "gemini" => settingsMap.getOrElse( "GeminiModelName", - currentSettings.getOrElse("GeminiModelName", "gemini-3.1-flash-lite-preview") + currentSettings.getOrElse("GeminiModelName", GeminiServiceImpl.defaultModel) ) case _ => "" } diff --git a/src/test/scala/net/eagle0/common/llm_integration/GeminiServiceImplTest.scala b/src/test/scala/net/eagle0/common/llm_integration/GeminiServiceImplTest.scala index 785196f784..21d05c6f7b 100644 --- a/src/test/scala/net/eagle0/common/llm_integration/GeminiServiceImplTest.scala +++ b/src/test/scala/net/eagle0/common/llm_integration/GeminiServiceImplTest.scala @@ -8,13 +8,21 @@ class GeminiServiceImplTest extends AnyFlatSpec with Matchers { "fallbackModelNames" should "try the configured model before fallback Gemini models" in { GeminiServiceImpl.fallbackModelNames("gemini-2.5-flash-lite") shouldBe Vector( "gemini-2.5-flash-lite", + GeminiServiceImpl.defaultModel, "gemini-2.5-flash", - "gemini-2.0-flash", - "gemini-2.0-flash-lite", - GeminiServiceImpl.defaultModel + "gemini-2.5-pro", + "gemini-3.5-flash" ) } + it should "not include shut down Gemini model names" in { + val modelNames = GeminiServiceImpl.fallbackModelNames("gemini-2.5-flash-lite") + + modelNames should not contain "gemini-2.0-flash" + modelNames should not contain "gemini-2.0-flash-lite" + modelNames should not contain "gemini-3.1-flash-lite-preview" + } + it should "not duplicate the configured model when it is already a fallback" in { GeminiServiceImpl .fallbackModelNames(GeminiServiceImpl.defaultModel) diff --git a/src/test/scala/net/eagle0/eagle/service/LlmResolverTest.scala b/src/test/scala/net/eagle0/eagle/service/LlmResolverTest.scala index 86075750b0..c9b4bf3331 100644 --- a/src/test/scala/net/eagle0/eagle/service/LlmResolverTest.scala +++ b/src/test/scala/net/eagle0/eagle/service/LlmResolverTest.scala @@ -76,7 +76,7 @@ class LlmResolverTest extends AnyFlatSpec with MockFactory { it should "expand Gemini provider keys by fallback model" in { LlmResolver.providerKeysFor("gemini", "gemini-2.5-flash-lite").take(2) shouldBe Vector( "gemini/gemini-2.5-flash-lite", - "gemini/gemini-2.5-flash" + "gemini/gemini-3.1-flash-lite" ) }