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.
79 lines
2.2 KiB
Go
79 lines
2.2 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/lmcli"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func RetryCmd(ctx *lmcli.Context) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "retry <conversation>",
|
|
Short: "Retry the last user reply in a conversation",
|
|
Long: `Prompt the conversation from the last user response.`,
|
|
Args: func(cmd *cobra.Command, args []string) error {
|
|
argCount := 1
|
|
if err := cobra.MinimumNArgs(argCount)(cmd, args); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
err := validateGenerationFlags(ctx, cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
shortName := args[0]
|
|
c := cmdutil.LookupConversation(ctx, shortName)
|
|
|
|
// Load the complete thread from the root message
|
|
messages, err := ctx.Conversations.PathToLeaf(c.SelectedRoot)
|
|
if err != nil {
|
|
return fmt.Errorf("Could not retrieve messages for conversation: %s", c.Title)
|
|
}
|
|
|
|
offset, _ := cmd.Flags().GetInt("offset")
|
|
if offset < 0 {
|
|
offset = -offset
|
|
}
|
|
|
|
if offset > len(messages)-1 {
|
|
return fmt.Errorf("Offset %d is before the start of the conversation.", offset)
|
|
}
|
|
|
|
retryFromIdx := len(messages) - 1 - offset
|
|
|
|
// decrease retryFromIdx until we hit a user message
|
|
for retryFromIdx >= 0 && messages[retryFromIdx].Role != api.MessageRoleUser {
|
|
retryFromIdx--
|
|
}
|
|
|
|
if messages[retryFromIdx].Role != api.MessageRoleUser {
|
|
return fmt.Errorf("No user messages to retry")
|
|
}
|
|
|
|
fmt.Printf("Idx: %d Message: %v\n", retryFromIdx, messages[retryFromIdx])
|
|
|
|
// Start a new branch at the last user message
|
|
cmdutil.HandleReply(ctx, &messages[retryFromIdx], true)
|
|
return nil
|
|
},
|
|
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
|
compMode := cobra.ShellCompDirectiveNoFileComp
|
|
if len(args) != 0 {
|
|
return nil, compMode
|
|
}
|
|
return ctx.Conversations.ConversationShortNameCompletions(toComplete), compMode
|
|
},
|
|
}
|
|
|
|
cmd.Flags().Int("offset", 0, "Offset from the last message to retry from.")
|
|
|
|
applyGenerationFlags(ctx, cmd)
|
|
return cmd
|
|
}
|