diff --git a/pkg/cli/cmd.go b/pkg/cli/cmd.go index 8b44358..7be5e4b 100644 --- a/pkg/cli/cmd.go +++ b/pkg/cli/cmd.go @@ -239,6 +239,15 @@ var newCmd = &cobra.Command{ } fmt.Println() + + err = conversation.GenerateTitle() + if err != nil { + Warn("Could not generate title for conversation: %v\n", err) + } + err = store.SaveConversation(&conversation) + if err != nil { + Warn("Could not save conversation after generating title: %v\n", err) + } }, } diff --git a/pkg/cli/conversation.go b/pkg/cli/conversation.go index 7a3d1d0..2cdfa8a 100644 --- a/pkg/cli/conversation.go +++ b/pkg/cli/conversation.go @@ -1,5 +1,10 @@ package cli +import ( + "fmt" + "strings" +) + // FriendlyRole returns a human friendly signifier for the message's role. func (m *Message) FriendlyRole() string { var friendlyRole string @@ -15,3 +20,37 @@ func (m *Message) FriendlyRole() string { } return friendlyRole } + +func (c *Conversation) GenerateTitle() error { + const header = "Generate a short title for the conversation below." + prompt := fmt.Sprintf("%s\n\n---\n\n%s", header, c.FormatForExternalPrompting()) + + messages := []Message{ + { + Role: "user", + OriginalContent: prompt, + }, + } + + model := "gpt-3.5-turbo" // use cheap model to generate title + response, err := CreateChatCompletion(model, messages, 10) + if err != nil { + return err + } + + c.Title = response + return nil +} + +func (c *Conversation) FormatForExternalPrompting() string { + sb := strings.Builder{} + messages, err := store.Messages(c) + if err != nil { + Fatal("Could not retrieve messages for conversation %v", c) + } + for _, message := range messages { + sb.WriteString(fmt.Sprintf("<%s>\n", message.FriendlyRole())) + sb.WriteString(fmt.Sprintf("\"\"\"\n%s\n\"\"\"\n\n", message.OriginalContent)) + } + return sb.String() +}