Update CreateChatCompletion behavior
When the last message in the passed messages slice is an assistant message, treat it as a partial message that is being continued, and include its content in the newly created reply Update TUI code to handle new behavior
This commit is contained in:
@@ -152,6 +152,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
case "ctrl+c":
|
||||
if m.waitingForReply {
|
||||
m.stopSignal <- ""
|
||||
return m, nil
|
||||
} else {
|
||||
return m, tea.Quit
|
||||
}
|
||||
@@ -192,7 +193,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
case msgResponseChunk:
|
||||
chunk := string(msg)
|
||||
last := len(m.messages) - 1
|
||||
if last >= 0 && m.messages[last].Role == models.MessageRoleAssistant {
|
||||
if last >= 0 && m.messages[last].Role.IsAssistant() {
|
||||
m.setMessageContents(last, m.messages[last].Content+chunk)
|
||||
} else {
|
||||
m.addMessage(models.Message{
|
||||
@@ -205,17 +206,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
case msgAssistantReply:
|
||||
// the last reply that was being worked on is finished
|
||||
reply := models.Message(msg)
|
||||
reply.Content = strings.TrimSpace(reply.Content)
|
||||
|
||||
last := len(m.messages) - 1
|
||||
if last < 0 {
|
||||
panic("Unexpected empty messages handling msgReply")
|
||||
panic("Unexpected empty messages handling msgAssistantReply")
|
||||
}
|
||||
m.setMessageContents(last, strings.TrimSpace(m.messages[last].Content))
|
||||
if m.messages[last].Role == models.MessageRoleAssistant {
|
||||
// the last message was an assistant message, so this is a continuation
|
||||
if reply.Role == models.MessageRoleToolCall {
|
||||
// update last message rrole to tool call
|
||||
m.messages[last].Role = models.MessageRoleToolCall
|
||||
}
|
||||
|
||||
if reply.Role.IsAssistant() && m.messages[last].Role.IsAssistant() {
|
||||
// this was a continuation, so replace the previous message with the completed reply
|
||||
m.setMessage(last, reply)
|
||||
} else {
|
||||
m.addMessage(reply)
|
||||
}
|
||||
@@ -496,9 +496,8 @@ func (m *model) handleMessagesKey(msg tea.KeyMsg) tea.Cmd {
|
||||
scrollIntoView(&m.content, offset, 0.1)
|
||||
}
|
||||
case "ctrl+r":
|
||||
// resubmit the conversation with all messages up until and including
|
||||
// the selected message
|
||||
if len(m.messages) == 0 {
|
||||
// resubmit the conversation with all messages up until and including the selected message
|
||||
if m.waitingForReply || len(m.messages) == 0 {
|
||||
return nil
|
||||
}
|
||||
m.messages = m.messages[:m.selectedMessage+1]
|
||||
@@ -543,13 +542,12 @@ func (m *model) handleInputKey(msg tea.KeyMsg) tea.Cmd {
|
||||
return wrapError(err)
|
||||
}
|
||||
|
||||
// ensure all messages up to the one we're about to add are
|
||||
// persistent
|
||||
// ensure all messages up to the one we're about to add are persisted
|
||||
cmd := m.persistConversation()
|
||||
if cmd != nil {
|
||||
return cmd
|
||||
}
|
||||
// persist our new message, returning with any possible errors
|
||||
|
||||
savedReply, err := m.ctx.Store.AddReply(m.conversation, reply)
|
||||
if err != nil {
|
||||
return wrapError(err)
|
||||
|
||||
Reference in New Issue
Block a user