Private
Public Access
1
0

Display generation model in message header and other tweaks

Adjusted `ctrl+t` in chat view to toggle `showDetails` which toggles the
display of system messages, message metadata (generation model), and
tool call details

Modified message selection update logic to skip messages that aren't
shown
This commit is contained in:
2024-09-30 20:21:51 +00:00
parent 5d13c3e056
commit bb48bc9abd
4 changed files with 93 additions and 59 deletions

View File

@@ -16,14 +16,19 @@ import (
// styles
var (
boldStyle = lipgloss.NewStyle().Bold(true)
faintStyle = lipgloss.NewStyle().Faint(true)
boldFaintStyle = lipgloss.NewStyle().Faint(true).Bold(true)
messageHeadingStyle = lipgloss.NewStyle().
MarginTop(1).
MarginBottom(1).
Bold(true)
MarginBottom(1)
userStyle = lipgloss.NewStyle().Faint(true).Foreground(lipgloss.Color("10"))
userStyle = boldFaintStyle.Foreground(lipgloss.Color("10"))
assistantStyle = lipgloss.NewStyle().Faint(true).Foreground(lipgloss.Color("12"))
assistantStyle = boldFaintStyle.Foreground(lipgloss.Color("12"))
systemStyle = boldStyle.Foreground(lipgloss.Color("8"))
messageStyle = lipgloss.NewStyle().
PaddingLeft(2).
@@ -40,13 +45,10 @@ var (
)
func (m *Model) renderMessageHeading(i int, message *api.Message) string {
icon := ""
friendly := message.Role.FriendlyRole()
style := lipgloss.NewStyle().Faint(true).Bold(true)
style := systemStyle
switch message.Role {
case api.MessageRoleSystem:
icon = "⚙️"
case api.MessageRoleUser:
style = userStyle
case api.MessageRoleAssistant:
@@ -54,16 +56,19 @@ func (m *Model) renderMessageHeading(i int, message *api.Message) string {
case api.MessageRoleToolCall:
style = assistantStyle
friendly = api.MessageRoleAssistant.FriendlyRole()
case api.MessageRoleSystem:
case api.MessageRoleToolResult:
icon = "🔧"
}
user := style.Render(icon + friendly)
user := style.Render(friendly)
var prefix string
var suffix string
var prefix, suffix string
faint := lipgloss.NewStyle().Faint(true)
if i == m.selectedMessage {
prefix = "> "
} else {
prefix = " "
}
if i == 0 && len(m.App.RootMessages) > 1 && m.App.Conversation.SelectedRootID != nil {
selectedRootIndex := 0
@@ -73,7 +78,7 @@ func (m *Model) renderMessageHeading(i int, message *api.Message) string {
break
}
}
suffix += faint.Render(fmt.Sprintf(" <%d/%d>", selectedRootIndex+1, len(m.App.RootMessages)))
suffix += faintStyle.Render(fmt.Sprintf(" <%d/%d>", selectedRootIndex+1, len(m.App.RootMessages)))
}
if i > 0 && len(m.App.Messages[i-1].Replies) > 1 {
// Find the selected reply index
@@ -84,20 +89,22 @@ func (m *Model) renderMessageHeading(i int, message *api.Message) string {
break
}
}
suffix += faint.Render(fmt.Sprintf(" <%d/%d>", selectedReplyIndex+1, len(m.App.Messages[i-1].Replies)))
}
if i == m.selectedMessage {
prefix = "> "
} else {
prefix = " "
suffix += faintStyle.Render(fmt.Sprintf(" <%d/%d>", selectedReplyIndex+1, len(m.App.Messages[i-1].Replies)))
}
if message.ID == 0 {
suffix += faint.Render(" (not saved)")
suffix += faintStyle.Render(" (not saved)")
}
return messageHeadingStyle.Render(prefix + user + suffix)
heading := prefix + user + suffix
if message.Metadata.GenerationModel != nil && m.showDetails {
heading += faintStyle.Render(
fmt.Sprintf(" | %s", *message.Metadata.GenerationModel),
)
}
return messageHeadingStyle.Render(heading)
}
// renderMessages renders the message at the given index as it should be shown
@@ -143,7 +150,7 @@ func (m *Model) renderMessage(i int) string {
var toolResults []renderedResult
for _, result := range msg.ToolResults {
if m.showToolResults {
if m.showDetails {
var jsonResult interface{}
err := json.Unmarshal([]byte(result.Result), &jsonResult)
if err != nil {
@@ -206,6 +213,10 @@ func (m *Model) conversationMessagesView() string {
for i, message := range m.App.Messages {
m.messageOffsets[i] = lineCnt
if !m.showDetails && message.Role.IsSystem() {
continue
}
heading := m.renderMessageHeading(i, &message)
sb.WriteString(heading)
sb.WriteString("\n")
@@ -221,6 +232,9 @@ func (m *Model) conversationMessagesView() string {
if m.state == pendingResponse && m.App.Messages[len(m.App.Messages)-1].Role != api.MessageRoleAssistant {
heading := m.renderMessageHeading(-1, &api.Message{
Role: api.MessageRoleAssistant,
Metadata: api.MessageMeta {
GenerationModel: &m.App.Model,
},
})
sb.WriteString(heading)
sb.WriteString("\n")