From db036a39e684616e34951da131b30140a3b5fe06 Mon Sep 17 00:00:00 2001 From: matdev83 <211248003+matdev83@users.noreply.github.com> Date: Wed, 2 Sep 2026 18:01:58 +0200 Subject: [PATCH 1/2] feat(agy): add gemini-3.8-flash default preference and fallback support --- README.md | 2 +- internal/agy/models.go | 5 ++++- internal/agy/models_test.go | 29 ++++++++++++++++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d40110d..74a7cfc 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ with category `"model"`. Clients can switch models by calling `session/set_confi Unknown model values and unsupported reasoning efforts return an error from `session/set_config_option`. If `AGY_MODEL` is set to an unknown value, the wrapper logs a warning and falls back to the catalog default (preferring -`google/gemini-3.6-flash`, then `google/gemini-3.5-flash`). +`google/gemini-3.8-flash`, then `google/gemini-3.7-flash`, then `google/gemini-3.6-flash`). ## Supported ACP Methods diff --git a/internal/agy/models.go b/internal/agy/models.go index ab6945a..36edf54 100644 --- a/internal/agy/models.go +++ b/internal/agy/models.go @@ -45,6 +45,9 @@ type ModelCatalog struct { } var fallbackModelIDs = []string{ + "gemini-3.8-flash-high", + "gemini-3.8-flash-medium", + "gemini-3.8-flash-low", "gemini-3.7-flash-high", "gemini-3.7-flash-medium", "gemini-3.7-flash-low", @@ -447,7 +450,7 @@ func pickDefaultEffort(native map[string]string) string { } func pickDefaultModel(profiles []ModelProfile) string { - for _, preferred := range []string{"google/gemini-3.7-flash", "google/gemini-3.6-flash", "google/gemini-3.5-flash"} { + for _, preferred := range []string{"google/gemini-3.8-flash", "google/gemini-3.7-flash", "google/gemini-3.6-flash", "google/gemini-3.5-flash"} { for _, profile := range profiles { if profile.CanonicalID == preferred { return preferred diff --git a/internal/agy/models_test.go b/internal/agy/models_test.go index f156380..69e974b 100644 --- a/internal/agy/models_test.go +++ b/internal/agy/models_test.go @@ -86,7 +86,7 @@ func TestModelCatalogFallback(t *testing.T) { if err := catalog.EnsureLoaded(context.Background()); err != nil { t.Fatal(err) } - if got := catalog.DefaultModelID(); got != "google/gemini-3.7-flash" { + if got := catalog.DefaultModelID(); got != "google/gemini-3.8-flash" { t.Fatalf("fallback default = %q", got) } } @@ -121,7 +121,6 @@ func TestModelCatalogRetryAfterTransientFailure(t *testing.T) { } } - func writeModelsScript(t *testing.T, output string) string { t.Helper() dir := t.TempDir() @@ -175,4 +174,28 @@ func TestModelCatalogDiscoverTSVWithPreamble(t *testing.T) { } } - +func TestModelCatalogDiscoverGemini38Flash(t *testing.T) { + output := "Fetching available models...\ngemini-3.8-flash-high\tGemini 3.8 Flash (High)\ngemini-3.8-flash-medium\tGemini 3.8 Flash (Medium)\ngemini-3.8-flash-low\tGemini 3.8 Flash (Low)\n" + script := writeModelsScript(t, output) + catalog := NewStrictModelCatalog(script) + if err := catalog.EnsureLoaded(context.Background()); err != nil { + t.Fatalf("EnsureLoaded failed: %v", err) + } + models := catalog.Models() + if len(models) != 1 { + t.Fatalf("expected 1 canonical model, got %d: %#v", len(models), models) + } + if got := catalog.DefaultModelID(); got != "google/gemini-3.8-flash" { + t.Fatalf("expected default model google/gemini-3.8-flash, got %q", got) + } + for _, effort := range []string{"low", "medium", "high"} { + want := "gemini-3.8-flash-" + effort + if got, err := catalog.ResolveNative("google/gemini-3.8-flash", effort); err != nil || got != want { + t.Fatalf("ResolveNative(google/gemini-3.8-flash, %s) = %q, %v", effort, got, err) + } + } + efforts := catalog.SupportedEfforts("google/gemini-3.8-flash") + if len(efforts) != 3 { + t.Fatalf("expected 3 supported efforts, got %#v", efforts) + } +} From 8f8f8e8942150d2be164f2cfad6412e9e2fa7a09 Mon Sep 17 00:00:00 2001 From: matdev83 <211248003+matdev83@users.noreply.github.com> Date: Wed, 2 Sep 2026 18:04:40 +0200 Subject: [PATCH 2/2] test(agy): use heredoc in writeModelsScript to prevent shell syntax errors on Unix --- internal/agy/models_test.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/internal/agy/models_test.go b/internal/agy/models_test.go index 69e974b..22bbb7f 100644 --- a/internal/agy/models_test.go +++ b/internal/agy/models_test.go @@ -138,11 +138,14 @@ func writeModelsScript(t *testing.T, output string) string { return path } path := filepath.Join(dir, "agy-models.sh") - content := "#!/bin/sh\n" - for _, line := range lines { - content += "echo " + line + "\n" - } - if err := os.WriteFile(path, []byte(content), 0755); err != nil { + var b strings.Builder + b.WriteString("#!/bin/sh\ncat <<'EOF'\n") + if output != "" { + b.WriteString(strings.TrimSuffix(output, "\n")) + b.WriteString("\n") + } + b.WriteString("EOF\n") + if err := os.WriteFile(path, []byte(b.String()), 0755); err != nil { t.Fatal(err) } return path