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/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", "") 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}}