on main help sign in
fix: improve lazy slice
commit69752719f067e2cc37aaead6d088c4f8a4b3aec0 authorCarlos Alexandro Becker <caarlos0@users.noreply.github.com> dateThu 24 Jul 2025, 11:50 (1 year ago) parent574ec2e
4 files changed+10−17
internal/csync/slices.go+5−7 internal/llm/agent/agent.go+2−2 internal/llm/provider/gemini.go+2−6 internal/llm/provider/openai_test.go+1−2
internal/csync/slices.go+5−7
@@ -8,28 +8,26 @@ import (
88// LazySlice is a thread-safe lazy-loaded slice.
99type LazySlice[K any] struct {
1010 inner []K
11− mu sync.Mutex
11+ wg sync.WaitGroup
1212}
1313
1414// NewLazySlice creates a new slice and runs the [load] function in a goroutine
1515// to populate it.
1616func NewLazySlice[K any](load func() []K) *LazySlice[K] {
1717 s := &LazySlice[K]{}
18− s.mu.Lock()
18+ s.wg.Add(1)
1919 go func() {
2020 s.inner = load()
21− s.mu.Unlock()
21+ s.wg.Done()
2222 }()
2323 return s
2424}
2525
2626// Seq returns an iterator that yields elements from the slice.
2727func (s *LazySlice[K]) Seq() iter.Seq[K] {
28− s.mu.Lock()
29− inner := s.inner
30− s.mu.Unlock()
28+ s.wg.Wait()
3129 return func(yield func(K) bool) {
32− for _, v := range inner {
30+ for _, v := range s.inner {
3331 if !yield(v) {
3432 return
3533 }
internal/llm/agent/agent.go+2−2
@@ -292,7 +292,7 @@ func (a *agent) generateTitle(ctx context.Context, sessionID string, content str
292292 Parts: parts,
293293 },
294294 },
295− make([]tools.BaseTool, 0),
295+ nil,
296296 )
297297
298298 var finalResponse *provider.ProviderResponse
@@ -745,7 +745,7 @@ func (a *agent) Summarize(ctx context.Context, sessionID string) error {
745745 response := a.summarizeProvider.StreamResponse(
746746 summarizeCtx,
747747 msgsWithPrompt,
748− make([]tools.BaseTool, 0),
748+ nil,
749749 )
750750 var finalResponse *provider.ProviderResponse
751751 for r := range response {
internal/llm/provider/gemini.go+2−6
@@ -188,9 +188,7 @@ func (g *geminiClient) send(ctx context.Context, messages []message.Message, too
188188 Parts: []*genai.Part{{Text: g.providerOptions.systemMessage}},
189189 },
190190 }
191− if len(tools) > 0 {
192− config.Tools = g.convertTools(tools)
193− }
191+ config.Tools = g.convertTools(tools)
194192 chat, _ := g.client.Chats.Create(ctx, model.ID, config, history)
195193
196194 attempts := 0
@@ -290,9 +288,7 @@ func (g *geminiClient) stream(ctx context.Context, messages []message.Message, t
290288 Parts: []*genai.Part{{Text: g.providerOptions.systemMessage}},
291289 },
292290 }
293− if len(tools) > 0 {
294− config.Tools = g.convertTools(tools)
295− }
291+ config.Tools = g.convertTools(tools)
296292 chat, _ := g.client.Chats.Create(ctx, model.ID, config, history)
297293
298294 attempts := 0
internal/llm/provider/openai_test.go+1−2
@@ -11,7 +11,6 @@ import (
1111
1212 "github.com/charmbracelet/catwalk/pkg/catwalk"
1313 "github.com/charmbracelet/crush/internal/config"
14− "github.com/charmbracelet/crush/internal/llm/tools"
1514 "github.com/charmbracelet/crush/internal/message"
1615 "github.com/openai/openai-go"
1716 "github.com/openai/openai-go/option"
@@ -79,7 +78,7 @@ func TestOpenAIClientStreamChoices(t *testing.T) {
7978 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
8079 defer cancel()
8180
82− eventsChan := client.stream(ctx, messages, []tools.BaseTool{})
81+ eventsChan := client.stream(ctx, messages, nil)
8382
8483 // Collect events - this will panic without the bounds check
8584 for event := range eventsChan {