Skip to content

Commit 5b9feaa

Browse files
authored
Merge pull request #2134 from derekmisler/log-selected-model-in-agent-model-for-alloy-obse
Log selected model in Agent.Model() for alloy observability
2 parents 9aed64e + c9b69f9 commit 5b9feaa

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

pkg/agent/agent.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,18 @@ func (a *Agent) HasSubAgents() bool {
131131
// If model override(s) are set, it returns one of the overrides (randomly for alloy).
132132
// Otherwise, it returns a random model from the available models.
133133
func (a *Agent) Model() provider.Provider {
134+
var selected provider.Provider
135+
var poolSize int
134136
// Check for model override first (set via TUI model switching)
135137
if overrides := a.modelOverrides.Load(); overrides != nil && len(*overrides) > 0 {
136-
return (*overrides)[rand.Intn(len(*overrides))]
138+
selected = (*overrides)[rand.Intn(len(*overrides))]
139+
poolSize = len(*overrides)
140+
} else {
141+
selected = a.models[rand.Intn(len(a.models))]
142+
poolSize = len(a.models)
137143
}
138-
return a.models[rand.Intn(len(a.models))]
144+
slog.Info("Model selected", "agent", a.name, "model", selected.ID(), "pool_size", poolSize)
145+
return selected
139146
}
140147

141148
// SetModelOverride sets runtime model override(s) for this agent.

pkg/agent/agent_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package agent
22

33
import (
4+
"bytes"
45
"context"
56
"errors"
7+
"log/slog"
68
"testing"
79

810
"github.com/stretchr/testify/assert"
@@ -139,6 +141,42 @@ func TestModelOverride(t *testing.T) {
139141
assert.Equal(t, "openai/gpt-4o", model.ID())
140142
}
141143

144+
func TestModel_LogsSelection(t *testing.T) {
145+
t.Parallel()
146+
147+
var buf bytes.Buffer
148+
handler := slog.NewTextHandler(&buf, &slog.HandlerOptions{Level: slog.LevelInfo})
149+
prev := slog.Default()
150+
slog.SetDefault(slog.New(handler))
151+
t.Cleanup(func() { slog.SetDefault(prev) })
152+
153+
model1 := &mockProvider{id: "anthropic/claude-sonnet-4-0"}
154+
model2 := &mockProvider{id: "openai/gpt-4o"}
155+
156+
a := New("scanner", "test", WithModel(model1), WithModel(model2))
157+
158+
// Verify basic selection logging
159+
selected := a.Model()
160+
logOutput := buf.String()
161+
162+
assert.Contains(t, logOutput, "Model selected")
163+
assert.Contains(t, logOutput, "agent=scanner")
164+
assert.Contains(t, logOutput, selected.ID())
165+
assert.Contains(t, logOutput, "pool_size=2")
166+
167+
// Verify override scenario logs correct pool_size
168+
buf.Reset()
169+
override := &mockProvider{id: "google/gemini-2.0-flash"}
170+
a.SetModelOverride(override)
171+
172+
selected = a.Model()
173+
logOutput = buf.String()
174+
175+
assert.Equal(t, "google/gemini-2.0-flash", selected.ID())
176+
assert.Contains(t, logOutput, "google/gemini-2.0-flash")
177+
assert.Contains(t, logOutput, "pool_size=1")
178+
}
179+
142180
func TestModelOverride_ConcurrentAccess(t *testing.T) {
143181
t.Parallel()
144182

0 commit comments

Comments
 (0)