feat: re-generage message

This commit is contained in:
kangfenmao 2024-07-11 21:17:12 +08:00
parent 4cfd7403a1
commit 1bcb20f76a
3 changed files with 29 additions and 8 deletions

View File

@ -14,13 +14,17 @@ import { firstLetter } from '@renderer/utils'
interface Props {
message: Message
index?: number
total?: number
showMenu?: boolean
onDeleteMessage?: (message: Message) => void
}
const MessageItem: FC<Props> = ({ message, showMenu, onDeleteMessage }) => {
const MessageItem: FC<Props> = ({ message, index, showMenu, onDeleteMessage }) => {
const avatar = useAvatar()
const isLastMessage = index === 0
const onCopy = () => {
navigator.clipboard.writeText(message.content)
window.message.success({ content: 'Copied!', key: 'copy-message' })
@ -41,6 +45,11 @@ const MessageItem: FC<Props> = ({ message, showMenu, onDeleteMessage }) => {
EventEmitter.emit(EVENT_NAMES.EDIT_MESSAGE, message)
}
const onRegenerate = () => {
onDeleteMessage?.(message)
setTimeout(() => EventEmitter.emit(EVENT_NAMES.REGENERATE_MESSAGE), 100)
}
return (
<MessageContainer key={message.id}>
<AvatarWrapper>
@ -64,18 +73,23 @@ const MessageItem: FC<Props> = ({ message, showMenu, onDeleteMessage }) => {
</Markdown>
)}
{showMenu && (
<MenusBar className="menubar">
<MenusBar className={`menubar ${isLastMessage && 'show'}`}>
{message.role === 'user' && (
<Tooltip title="Edit" mouseEnterDelay={1}>
<Tooltip title="Edit" mouseEnterDelay={0.8}>
<EditOutlined onClick={onEdit} />
</Tooltip>
)}
<Tooltip title="Copy" mouseEnterDelay={1}>
<Tooltip title="Copy" mouseEnterDelay={0.8}>
<CopyOutlined onClick={onCopy} />
</Tooltip>
<Tooltip title="Delete" mouseEnterDelay={1}>
<Tooltip title="Delete" mouseEnterDelay={0.8}>
<DeleteOutlined onClick={onDelete} />
</Tooltip>
{isLastMessage && (
<Tooltip title="Regenerate" mouseEnterDelay={0.8}>
<SyncOutlined onClick={onRegenerate} />
</Tooltip>
)}
<MessageMetadata>{message.modelId}</MessageMetadata>
{message.usage && (
<>
@ -110,6 +124,9 @@ const MessageContent = styled.div`
justify-content: space-between;
.menubar {
opacity: 0;
&.show {
opacity: 1;
}
}
&:hover {
.menubar {

View File

@ -74,6 +74,9 @@ const Messages: FC<Props> = ({ assistant, topic }) => {
onSendMessage(msg)
setTimeout(() => EventEmitter.emit(EVENT_NAMES.AI_AUTO_RENAME), 100)
}),
EventEmitter.on(EVENT_NAMES.REGENERATE_MESSAGE, async () => {
fetchChatCompletion({ assistant, messages: messages, topic, onResponse: setLastMessage })
}),
EventEmitter.on(EVENT_NAMES.AI_AUTO_RENAME, autoRenameTopic),
EventEmitter.on(EVENT_NAMES.CLEAR_MESSAGES, () => {
setMessages([])
@ -98,8 +101,8 @@ const Messages: FC<Props> = ({ assistant, topic }) => {
return (
<Container id="messages" key={assistant.id} ref={messagesRef}>
{lastMessage && <MessageItem message={lastMessage} />}
{reverse([...messages]).map((message) => (
<MessageItem message={message} key={message.id} showMenu onDeleteMessage={onDeleteMessage} />
{reverse([...messages]).map((message, index) => (
<MessageItem key={message.id} message={message} showMenu index={index} onDeleteMessage={onDeleteMessage} />
))}
<MessageItem message={assistantDefaultMessage} />
</Container>

View File

@ -8,5 +8,6 @@ export const EVENT_NAMES = {
AI_AUTO_RENAME: 'AI_AUTO_RENAME',
CLEAR_MESSAGES: 'CLEAR_MESSAGES',
ADD_ASSISTANT: 'ADD_ASSISTANT',
EDIT_MESSAGE: 'EDIT_MESSAGE'
EDIT_MESSAGE: 'EDIT_MESSAGE',
REGENERATE_MESSAGE: 'REGENERATE_MESSAGE'
}