feat: add regenerate message button

This commit is contained in:
kangfenmao 2025-02-03 11:18:55 +08:00
parent 089375c822
commit 236f25df8a
2 changed files with 24 additions and 9 deletions

View File

@ -196,6 +196,12 @@ const MessageMenubar: FC<Props> = (props) => {
) )
const onRegenerate = async () => { const onRegenerate = async () => {
await modelGenerating()
const _message: Message = resetAssistantMessage(message, assistantModel)
onEditMessage?.(_message)
}
const onMentionModel = async () => {
await modelGenerating() await modelGenerating()
const selectedModel = await SelectModelPopup.show({ model }) const selectedModel = await SelectModelPopup.show({ model })
if (!selectedModel) return if (!selectedModel) return
@ -228,10 +234,24 @@ const MessageMenubar: FC<Props> = (props) => {
{copied && <CheckOutlined style={{ color: 'var(--color-primary)' }} />} {copied && <CheckOutlined style={{ color: 'var(--color-primary)' }} />}
</ActionButton> </ActionButton>
</Tooltip> </Tooltip>
{isAssistantMessage && (
<Popconfirm
title={t('message.regenerate.confirm')}
okButtonProps={{ danger: true }}
destroyTooltipOnHide
icon={<QuestionCircleOutlined style={{ color: 'red' }} />}
onConfirm={onRegenerate}>
<Tooltip title={t('common.regenerate')} mouseEnterDelay={0.8}>
<ActionButton className="message-action-button">
<SyncOutlined />
</ActionButton>
</Tooltip>
</Popconfirm>
)}
{isAssistantMessage && ( {isAssistantMessage && (
<Tooltip title={t('common.regenerate')} mouseEnterDelay={0.8}> <Tooltip title={t('common.regenerate')} mouseEnterDelay={0.8}>
<ActionButton className="message-action-button" onClick={onRegenerate}> <ActionButton className="message-action-button" onClick={onMentionModel}>
<SyncOutlined /> <i className="iconfont icon-at" style={{ fontSize: 16 }}></i>
</ActionButton> </ActionButton>
</Tooltip> </Tooltip>
)} )}

View File

@ -9,15 +9,14 @@ import { getDefaultTopic } from '@renderer/services/AssistantService'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import { import {
deleteMessageFiles, deleteMessageFiles,
filterMessages,
getAssistantMessage, getAssistantMessage,
getContextCount, getContextCount,
getGroupedMessages, getGroupedMessages,
getUserMessage getUserMessage
} from '@renderer/services/MessagesService' } from '@renderer/services/MessagesService'
import { estimateHistoryTokens } from '@renderer/services/TokenService' import { estimateHistoryTokens } from '@renderer/services/TokenService'
import { Assistant, Message, Model, Topic } from '@renderer/types' import { Assistant, Message, Topic } from '@renderer/types'
import { captureScrollableDiv, runAsyncFunction, uuid } from '@renderer/utils' import { captureScrollableDiv, runAsyncFunction } from '@renderer/utils'
import { t } from 'i18next' import { t } from 'i18next'
import { flatten, last, take } from 'lodash' import { flatten, last, take } from 'lodash'
import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'
@ -162,10 +161,6 @@ const Messages: FC<Props> = ({ assistant, topic, setActiveTopic }) => {
EventEmitter.on(EVENT_NAMES.RECEIVE_MESSAGE, async () => { EventEmitter.on(EVENT_NAMES.RECEIVE_MESSAGE, async () => {
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 (model: Model) => {
const lastUserMessage = last(filterMessages(messages).filter((m) => m.role === 'user'))
lastUserMessage && onSendMessage({ ...lastUserMessage, id: uuid(), model: model, mentions: [model] })
}),
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([])