diff --git a/internal/csync/slices.go b/internal/csync/slices.go index bc295fc66fa3fcfa8a3e6a7ecf28492b15269200..be723655079ccc6b07f55c3237b706a17bb14d40 100644 --- a/internal/csync/slices.go +++ b/internal/csync/slices.go @@ -8,28 +8,26 @@ import ( // LazySlice is a thread-safe lazy-loaded slice. type LazySlice[K any] struct { inner []K - mu sync.Mutex + wg sync.WaitGroup } // NewLazySlice creates a new slice and runs the [load] function in a goroutine // to populate it. func NewLazySlice[K any](load func() []K) *LazySlice[K] { s := &LazySlice[K]{} - s.mu.Lock() + s.wg.Add(1) go func() { s.inner = load() - s.mu.Unlock() + s.wg.Done() }() return s } // Seq returns an iterator that yields elements from the slice. func (s *LazySlice[K]) Seq() iter.Seq[K] { - s.mu.Lock() - inner := s.inner - s.mu.Unlock() + s.wg.Wait() return func(yield func(K) bool) { - for _, v := range inner { + for _, v := range s.inner { if !yield(v) { return } diff --git a/internal/llm/agent/agent.go b/internal/llm/agent/agent.go index 75f1f545929cc2422461ed0e775775689f8567d2..2c3876ccac9ed028b1714ed96b0c6de0cce007c9 100644 --- a/internal/llm/agent/agent.go +++ b/internal/llm/agent/agent.go @@ -292,7 +292,7 @@ func (a *agent) generateTitle(ctx context.Context, sessionID string, content str Parts: parts, }, }, - make([]tools.BaseTool, 0), + nil, ) var finalResponse *provider.ProviderResponse @@ -745,7 +745,7 @@ func (a *agent) Summarize(ctx context.Context, sessionID string) error { response := a.summarizeProvider.StreamResponse( summarizeCtx, msgsWithPrompt, - make([]tools.BaseTool, 0), + nil, ) var finalResponse *provider.ProviderResponse for r := range response { diff --git a/internal/llm/provider/gemini.go b/internal/llm/provider/gemini.go index 4fa0cff4d17c28da16528d33ff54e2a905521387..b2d1da11148e74362e7b529b9ec78dc1810d0f0d 100644 --- a/internal/llm/provider/gemini.go +++ b/internal/llm/provider/gemini.go @@ -188,9 +188,7 @@ func (g *geminiClient) send(ctx context.Context, messages []message.Message, too Parts: []*genai.Part{{Text: g.providerOptions.systemMessage}}, }, } - if len(tools) > 0 { - config.Tools = g.convertTools(tools) - } + config.Tools = g.convertTools(tools) chat, _ := g.client.Chats.Create(ctx, model.ID, config, history) attempts := 0 @@ -290,9 +288,7 @@ func (g *geminiClient) stream(ctx context.Context, messages []message.Message, t Parts: []*genai.Part{{Text: g.providerOptions.systemMessage}}, }, } - if len(tools) > 0 { - config.Tools = g.convertTools(tools) - } + config.Tools = g.convertTools(tools) chat, _ := g.client.Chats.Create(ctx, model.ID, config, history) attempts := 0 diff --git a/internal/llm/provider/openai_test.go b/internal/llm/provider/openai_test.go index 26c4d85ae35bbf4681719a12b568befccd8012af..ef79803c8a8aa1ee3fe6cb7de8bc8fa86f26c03c 100644 --- a/internal/llm/provider/openai_test.go +++ b/internal/llm/provider/openai_test.go @@ -11,7 +11,6 @@ import ( "github.com/charmbracelet/catwalk/pkg/catwalk" "github.com/charmbracelet/crush/internal/config" - "github.com/charmbracelet/crush/internal/llm/tools" "github.com/charmbracelet/crush/internal/message" "github.com/openai/openai-go" "github.com/openai/openai-go/option" @@ -79,7 +78,7 @@ func TestOpenAIClientStreamChoices(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - eventsChan := client.stream(ctx, messages, []tools.BaseTool{}) + eventsChan := client.stream(ctx, messages, nil) // Collect events - this will panic without the bounds check for event := range eventsChan {