@@ -778,12 +778,31 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user
778 if err == nil {
778 if err == nil {
779 slog.Info("generated title with large model")
779 slog.Info("generated title with large model")
781− // Welp, the large model didn't work either.
781+ // Welp, the large model didn't work either. Use the default
782+ // session name and return.
782 slog.Error("error generating title with large model", "err", err)
783 slog.Error("error generating title with large model", "err", err)
784+ saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, defaultSessionName, 0, 0, 0)
786+ slog.Error("failed to save session title and usage", "error", saveErr)
793+ // Actually, we didn't get a response so we can't. Use the default
794+ // session name and return.
795+ slog.Error("response is nil; can't generate title")
796+ saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, defaultSessionName, 0, 0, 0)
798+ slog.Error("failed to save session title and usage", "error", saveErr)
786− title := strings.ReplaceAll(resp.Response.Content.Text(), "\n", " ")
805+ title = strings.ReplaceAll(resp.Response.Content.Text(), "\n", " ")
787 slog.Info("generated title", "title", title)
806 slog.Info("generated title", "title", title)
789 // Remove thinking tags if present.
808 // Remove thinking tags if present.
@@ -808,10 +827,6 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user
812− slog.Error("no model available for cost calculation")
815 modelConfig := model.CatwalkCfg
830 modelConfig := model.CatwalkCfg
816 cost := modelConfig.CostPer1MInCached/1e6*float64(resp.TotalUsage.CacheCreationTokens) +
831 cost := modelConfig.CostPer1MInCached/1e6*float64(resp.TotalUsage.CacheCreationTokens) +
817 modelConfig.CostPer1MOutCached/1e6*float64(resp.TotalUsage.CacheReadTokens) +
832 modelConfig.CostPer1MOutCached/1e6*float64(resp.TotalUsage.CacheReadTokens) +