diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go index 3b3999200..f410e8e5d 100644 --- a/pkg/agent/agent.go +++ b/pkg/agent/agent.go @@ -131,11 +131,18 @@ func (a *Agent) HasSubAgents() bool { // If model override(s) are set, it returns one of the overrides (randomly for alloy). // Otherwise, it returns a random model from the available models. func (a *Agent) Model() provider.Provider { + var selected provider.Provider + var poolSize int // Check for model override first (set via TUI model switching) if overrides := a.modelOverrides.Load(); overrides != nil && len(*overrides) > 0 { - return (*overrides)[rand.Intn(len(*overrides))] + selected = (*overrides)[rand.Intn(len(*overrides))] + poolSize = len(*overrides) + } else { + selected = a.models[rand.Intn(len(a.models))] + poolSize = len(a.models) } - return a.models[rand.Intn(len(a.models))] + slog.Info("Model selected", "agent", a.name, "model", selected.ID(), "pool_size", poolSize) + return selected } // SetModelOverride sets runtime model override(s) for this agent. diff --git a/pkg/agent/agent_test.go b/pkg/agent/agent_test.go index acec738a7..9eb2f1783 100644 --- a/pkg/agent/agent_test.go +++ b/pkg/agent/agent_test.go @@ -1,8 +1,10 @@ package agent import ( + "bytes" "context" "errors" + "log/slog" "testing" "github.com/stretchr/testify/assert" @@ -139,6 +141,42 @@ func TestModelOverride(t *testing.T) { assert.Equal(t, "openai/gpt-4o", model.ID()) } +func TestModel_LogsSelection(t *testing.T) { + t.Parallel() + + var buf bytes.Buffer + handler := slog.NewTextHandler(&buf, &slog.HandlerOptions{Level: slog.LevelInfo}) + prev := slog.Default() + slog.SetDefault(slog.New(handler)) + t.Cleanup(func() { slog.SetDefault(prev) }) + + model1 := &mockProvider{id: "anthropic/claude-sonnet-4-0"} + model2 := &mockProvider{id: "openai/gpt-4o"} + + a := New("scanner", "test", WithModel(model1), WithModel(model2)) + + // Verify basic selection logging + selected := a.Model() + logOutput := buf.String() + + assert.Contains(t, logOutput, "Model selected") + assert.Contains(t, logOutput, "agent=scanner") + assert.Contains(t, logOutput, selected.ID()) + assert.Contains(t, logOutput, "pool_size=2") + + // Verify override scenario logs correct pool_size + buf.Reset() + override := &mockProvider{id: "google/gemini-2.0-flash"} + a.SetModelOverride(override) + + selected = a.Model() + logOutput = buf.String() + + assert.Equal(t, "google/gemini-2.0-flash", selected.ID()) + assert.Contains(t, logOutput, "google/gemini-2.0-flash") + assert.Contains(t, logOutput, "pool_size=1") +} + func TestModelOverride_ConcurrentAccess(t *testing.T) { t.Parallel()