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

View File

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

View File

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