From b618a5bc98367c6011f6ed2a2d85d1faa90ad500 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 3 Jan 2026 17:54:36 -0800 Subject: [PATCH] fix(sessions): nil pointer dereference (#1759) --- internal/agent/agent.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/internal/agent/agent.go b/internal/agent/agent.go index 830ed73d2a8134c12b3f823c116052c683847c74..4458ec12fb133c9cb728baef3fb474e5a00b5c4a 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -778,12 +778,31 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user if err == nil { slog.Info("generated title with large model") } else { - // Welp, the large model didn't work either. + // Welp, the large model didn't work either. Use the default + // session name and return. slog.Error("error generating title with large model", "err", err) + saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, defaultSessionName, 0, 0, 0) + if saveErr != nil { + slog.Error("failed to save session title and usage", "error", saveErr) + } + return + } + } + + if resp == nil { + // Actually, we didn't get a response so we can't. Use the default + // session name and return. + slog.Error("response is nil; can't generate title") + saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, defaultSessionName, 0, 0, 0) + if saveErr != nil { + slog.Error("failed to save session title and usage", "error", saveErr) } + return } - title := strings.ReplaceAll(resp.Response.Content.Text(), "\n", " ") + // Clean up title. + var title string + title = strings.ReplaceAll(resp.Response.Content.Text(), "\n", " ") slog.Info("generated title", "title", title) // Remove thinking tags if present. @@ -808,10 +827,6 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user } } - if model == nil { - slog.Error("no model available for cost calculation") - return - } modelConfig := model.CatwalkCfg cost := modelConfig.CostPer1MInCached/1e6*float64(resp.TotalUsage.CacheCreationTokens) + modelConfig.CostPer1MOutCached/1e6*float64(resp.TotalUsage.CacheReadTokens) +