Matt Low
0384c7cb66
This refactor splits out all conversation concerns into a new `conversation` package. There is now a split between `conversation` and `api`s representation of `Message`, the latter storing the minimum information required for interaction with LLM providers. There is necessary conversation between the two when making LLM calls.
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.mlow.ca/mlow/lmcli/pkg/api"
|
|
cmdutil "git.mlow.ca/mlow/lmcli/pkg/cmd/util"
|
|
"git.mlow.ca/mlow/lmcli/pkg/conversation"
|
|
"git.mlow.ca/mlow/lmcli/pkg/lmcli"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func NewCmd(ctx *lmcli.Context) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "new [message]",
|
|
Short: "Start a new conversation",
|
|
Long: `Start a new conversation with the Large Language Model.`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
err := validateGenerationFlags(ctx, cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
input := inputFromArgsOrEditor(args, "# Start a new conversation below\n", "")
|
|
if input == "" {
|
|
return fmt.Errorf("No message was provided.")
|
|
}
|
|
|
|
messages := []conversation.Message{{
|
|
Role: api.MessageRoleUser,
|
|
Content: input,
|
|
}}
|
|
|
|
conversation, messages, err := ctx.Conversations.StartConversation(messages...)
|
|
if err != nil {
|
|
return fmt.Errorf("Could not start a new conversation: %v", err)
|
|
}
|
|
|
|
cmdutil.HandleReply(ctx, &messages[len(messages)-1], true)
|
|
|
|
title, err := cmdutil.GenerateTitle(ctx, messages)
|
|
if err != nil {
|
|
lmcli.Warn("Could not generate title for conversation %s: %v\n", conversation.ShortName.String, err)
|
|
}
|
|
|
|
conversation.Title = title
|
|
err = ctx.Conversations.UpdateConversation(conversation)
|
|
if err != nil {
|
|
lmcli.Warn("Could not save conversation title: %v\n", err)
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
applyGenerationFlags(ctx, cmd)
|
|
return cmd
|
|
}
|