From 4192297a71b835eb7d8002bf8782ab0833f8c930 Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Tue, 27 Oct 2026 10:30:34 -0400 Subject: [PATCH 1/2] fix(doctor): recommend current Anthropic and Google models af doctor suggested claude-3-5-sonnet-20241022 and gemini-1.5-pro as the AI_MODEL for an Anthropic or Google key; both models are retired, so a scaffold that follows the recommendation fails on its first call. Recommend claude-sonnet-5-5 and gemini-3.8-flash, and update the commented examples in the docker .env template. Co-Authored-By: Claude Sonnet 5.5 --- control-plane/internal/cli/doctor.go | 4 ++-- .../internal/cli/doctor_additional_test.go | 22 +++++++++++++++++++ .../templates/docker/.env.example.tmpl | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/control-plane/internal/cli/doctor.go b/control-plane/internal/cli/doctor.go index 45ee98bcd..589c4c4ff 100644 --- a/control-plane/internal/cli/doctor.go +++ b/control-plane/internal/cli/doctor.go @@ -74,9 +74,9 @@ var providerEnvVars = []struct { Model string // suggested default model when this provider is the chosen one }{ {Name: "openrouter", EnvVar: "OPENROUTER_API_KEY", Model: "openrouter/google/gemini-2.5-flash"}, - {Name: "anthropic", EnvVar: "ANTHROPIC_API_KEY", Model: "claude-3-5-sonnet-20241022"}, + {Name: "anthropic", EnvVar: "ANTHROPIC_API_KEY", Model: "claude-sonnet-5-5"}, {Name: "openai", EnvVar: "OPENAI_API_KEY", Model: "gpt-4o"}, - {Name: "google", EnvVar: "GOOGLE_API_KEY", Model: "gemini-1.5-pro"}, + {Name: "google", EnvVar: "GOOGLE_API_KEY", Model: "gemini-3.8-flash"}, } // doctorHarnessProvider describes one CLI `app.harness()` knows how to drive, diff --git a/control-plane/internal/cli/doctor_additional_test.go b/control-plane/internal/cli/doctor_additional_test.go index 00d163e82..0827784f4 100644 --- a/control-plane/internal/cli/doctor_additional_test.go +++ b/control-plane/internal/cli/doctor_additional_test.go @@ -32,6 +32,28 @@ func TestDoctorHelpersAndCommand(t *testing.T) { require.Equal(t, "OPENAI_API_KEY", report.ProviderKeys["openai"].EnvVar) }) + t.Run("recommended models are not retired ones", func(t *testing.T) { + for _, tc := range []struct { + provider string + envVar string + model string + }{ + {"anthropic", "ANTHROPIC_API_KEY", "claude-sonnet-5-5"}, + {"google", "GOOGLE_API_KEY", "gemini-3.8-flash"}, + } { + t.Run(tc.provider, func(t *testing.T) { + for _, p := range providerEnvVars { + t.Setenv(p.EnvVar, "") + } + t.Setenv(tc.envVar, "key") + + report := buildDoctorReport("http://127.0.0.1:1") + require.Equal(t, tc.provider, report.Recommendation.Provider) + require.Equal(t, tc.model, report.Recommendation.AIModel) + }) + } + }) + t.Run("tool and control plane checks cover success and failure", func(t *testing.T) { tool := checkTool("go", "version") require.True(t, tool.Available) diff --git a/control-plane/internal/templates/docker/.env.example.tmpl b/control-plane/internal/templates/docker/.env.example.tmpl index 29e52e091..abe8d206a 100644 --- a/control-plane/internal/templates/docker/.env.example.tmpl +++ b/control-plane/internal/templates/docker/.env.example.tmpl @@ -15,8 +15,8 @@ OPENROUTER_API_KEY=sk-or-v1-... # Must match the provider above. LiteLLM-style model strings. AI_MODEL={{.DefaultModel}} # AI_MODEL=gpt-4o -# AI_MODEL=anthropic/claude-3-5-sonnet-20241022 -# AI_MODEL=gemini/gemini-1.5-pro +# AI_MODEL=anthropic/claude-sonnet-5-5 +# AI_MODEL=gemini/gemini-3.8-flash # --- Optional overrides --- AGENT_NODE_ID={{.NodeID}} From e52a2075f2a043e725954af27e206ccc24831d2a Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Tue, 27 Oct 2026 10:51:00 -0400 Subject: [PATCH 2/2] fix(init): use a current model in the --default-model help example Co-Authored-By: Claude Sonnet 5.5 --- control-plane/internal/cli/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control-plane/internal/cli/init.go b/control-plane/internal/cli/init.go index 36f304679..2eafc6f37 100644 --- a/control-plane/internal/cli/init.go +++ b/control-plane/internal/cli/init.go @@ -493,7 +493,7 @@ Example: // and README.md are intentionally NOT generated — the skill produces them // after the agent has written real reasoners. cmd.Flags().BoolVar(&withDocker, "docker", false, "Also generate a Docker scaffold (Dockerfile, docker-compose.yml, .env.example, .dockerignore)") - cmd.Flags().StringVar(&defaultModel, "default-model", "openrouter/google/gemini-2.5-flash", "Default AI_MODEL string baked into the docker scaffold (LiteLLM-style, e.g. gpt-4o, anthropic/claude-3-5-sonnet-20241022)") + cmd.Flags().StringVar(&defaultModel, "default-model", "openrouter/google/gemini-2.5-flash", "Default AI_MODEL string baked into the docker scaffold (LiteLLM-style, e.g. gpt-4o, anthropic/claude-sonnet-5-5)") // Hidden flags — sensible defaults; only set when you have a real reason. cmd.Flags().StringVar(&controlPlaneImage, "control-plane-image", "agentfield/control-plane:latest", "")