on main help sign in
fix: handle no content for gemini provider
60d8510Kujtim Hoxha
internal/llm/agent/agent.go+8−2
@@ -395,7 +395,7 @@ func (a *agent) processGeneration(ctx context.Context, sessionID, content string
395 defer log.RecoverPanic("agent.Run", func() {
395 defer log.RecoverPanic("agent.Run", func() {
396 slog.Error("panic while generating title")
396 slog.Error("panic while generating title")
397 })
397 })
398− titleErr := a.generateTitle(context.Background(), sessionID, content)
398+ titleErr := a.generateTitle(ctx, sessionID, content)
399 if titleErr != nil && !errors.Is(titleErr, context.Canceled) && !errors.Is(titleErr, context.DeadlineExceeded) {
399 if titleErr != nil && !errors.Is(titleErr, context.Canceled) && !errors.Is(titleErr, context.DeadlineExceeded) {
400 slog.Error("failed to generate title", "error", titleErr)
400 slog.Error("failed to generate title", "error", titleErr)
401 }
401 }
@@ -996,11 +996,17 @@ func (a *agent) UpdateModel() error {
996 return fmt.Errorf("provider %s not found in config", largeModelCfg.Provider)
996 return fmt.Errorf("provider %s not found in config", largeModelCfg.Provider)
997 }
997 }
998
998
999+ var maxTitleTokens int64 = 40
1000+
1001+ // if the max output is too low for the gemini provider it won't return anything
1002+ if smallModelCfg.Provider == "gemini" {
1003+ maxTitleTokens = 1000
1004+ }
999 // Recreate title provider
1005 // Recreate title provider
1000 titleOpts := []provider.ProviderClientOption{
1006 titleOpts := []provider.ProviderClientOption{
1001 provider.WithModel(config.SelectedModelTypeSmall),
1007 provider.WithModel(config.SelectedModelTypeSmall),
1002 provider.WithSystemMessage(prompt.GetPrompt(prompt.PromptTitle, smallModelProviderCfg.ID)),
1008 provider.WithSystemMessage(prompt.GetPrompt(prompt.PromptTitle, smallModelProviderCfg.ID)),
1003− provider.WithMaxTokens(40),
1009+ provider.WithMaxTokens(maxTitleTokens),
1004 }
1010 }
1005 newTitleProvider, err := provider.NewProvider(smallModelProviderCfg, titleOpts...)
1011 newTitleProvider, err := provider.NewProvider(smallModelProviderCfg, titleOpts...)
1006 if err != nil {
1012 if err != nil {
internal/llm/provider/gemini.go+9
@@ -322,6 +322,7 @@ func (g *geminiClient) stream(ctx context.Context, messages []message.Message, t
322 for _, part := range lastMsg.Parts {
322 for _, part := range lastMsg.Parts {
323 lastMsgParts = append(lastMsgParts, *part)
323 lastMsgParts = append(lastMsgParts, *part)
324 }
324 }
325+
325 for resp, err := range chat.SendMessageStream(ctx, lastMsgParts...) {
326 for resp, err := range chat.SendMessageStream(ctx, lastMsgParts...) {
326 if err != nil {
327 if err != nil {
327 retry, after, retryErr := g.shouldRetry(attempts, err)
328 retry, after, retryErr := g.shouldRetry(attempts, err)
@@ -385,6 +386,9 @@ func (g *geminiClient) stream(ctx context.Context, messages []message.Message, t
385 }
386 }
386 }
387 }
387 }
388 }
389+ } else {
390+ // no content received
391+ break
388 }
392 }
389 }
393 }
390
394
@@ -408,6 +412,11 @@ func (g *geminiClient) stream(ctx context.Context, messages []message.Message, t
408 },
412 },
409 }
413 }
410 return
414 return
415+ } else {
416+ eventChan <- ProviderEvent{
417+ Type: EventError,
418+ Error: errors.New("no content received"),
419+ }
411 }
420 }
412 }
421 }
413 }()
422 }()