feat: new message branch

This commit is contained in:
kangfenmao 2024-09-16 12:56:00 +08:00
parent e7f7f8509e
commit e34d4be6f2
4 changed files with 28 additions and 4 deletions

View File

@ -103,6 +103,7 @@ const resources = {
'suggestions.title': 'Suggested Questions',
'add.assistant.title': 'Add Assistant',
'message.new.context': 'New Context',
'message.new.branch': 'New Branch',
'assistant.search.placeholder': 'Search'
},
files: {
@ -369,6 +370,7 @@ const resources = {
'suggestions.title': '建议的问题',
'add.assistant.title': '添加智能体',
'message.new.context': '清除上下文',
'message.new.branch': '新分支',
'assistant.search.placeholder': '搜索'
},
files: {

View File

@ -2,6 +2,7 @@ import {
CheckOutlined,
DeleteOutlined,
EditOutlined,
ForkOutlined,
MenuOutlined,
QuestionCircleOutlined,
SaveOutlined,
@ -71,6 +72,10 @@ const MessageItem: FC<Props> = ({ message, index, showMenu, onDeleteMessage }) =
[setModel]
)
const onNewBranch = useCallback(() => {
EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index)
}, [index])
const getUserName = useCallback(() => {
if (isLocalAi && message.role !== 'user') return APP_NAME
if (message.role === 'assistant') return upperFirst(model?.name || model?.id)
@ -174,6 +179,13 @@ const MessageItem: FC<Props> = ({ message, index, showMenu, onDeleteMessage }) =
</Tooltip>
</SelectModelDropdown>
)}
{isAssistantMessage && (
<Tooltip title={t('chat.message.new.branch')} mouseEnterDelay={0.8}>
<ActionButton onClick={onNewBranch}>
<ForkOutlined />
</ActionButton>
</Tooltip>
)}
<Popconfirm
title={t('message.message.delete.content')}
okButtonProps={{ danger: true }}

View File

@ -3,6 +3,7 @@ import { useAssistant } from '@renderer/hooks/useAssistant'
import { useProviderByAssistant } from '@renderer/hooks/useProvider'
import { getTopic, TopicManager } from '@renderer/hooks/useTopic'
import { fetchChatCompletion, fetchMessagesSummary } from '@renderer/services/api'
import { getDefaultTopic } from '@renderer/services/assistant'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/event'
import {
deleteMessageFiles,
@ -13,7 +14,7 @@ import {
import { Assistant, Message, Model, Topic } from '@renderer/types'
import { getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils'
import { t } from 'i18next'
import { last, reverse } from 'lodash'
import { last, reverse, take } from 'lodash'
import { FC, useCallback, useEffect, useRef, useState } from 'react'
import styled from 'styled-components'
@ -32,7 +33,7 @@ const Messages: FC<Props> = ({ assistant, topic, setActiveTopic }) => {
const [lastMessage, setLastMessage] = useState<Message | null>(null)
const provider = useProviderByAssistant(assistant)
const containerRef = useRef<HTMLDivElement>(null)
const { updateTopic } = useAssistant(assistant.id)
const { updateTopic, addTopic } = useAssistant(assistant.id)
const onSendMessage = useCallback(
(message: Message) => {
@ -116,10 +117,18 @@ const Messages: FC<Props> = ({ assistant, topic, setActiveTopic }) => {
status: 'success',
type: 'clear'
} as Message)
}),
EventEmitter.on(EVENT_NAMES.NEW_BRANCH, async (index: number) => {
const _topic = getDefaultTopic()
_topic.name = topic.name
await db.topics.add({ id: _topic.id, messages: take(messages, messages.length - index) })
addTopic(_topic)
setActiveTopic(_topic)
autoRenameTopic()
})
]
return () => unsubscribes.forEach((unsub) => unsub())
}, [assistant, messages, provider, topic, autoRenameTopic, updateTopic, onSendMessage])
}, [addTopic, assistant, autoRenameTopic, messages, onSendMessage, setActiveTopic, topic, updateTopic])
useEffect(() => {
runAsyncFunction(async () => {

View File

@ -16,5 +16,6 @@ export const EVENT_NAMES = {
SHOW_CHAT_SETTINGS: 'SHOW_CHAT_SETTINGS',
SHOW_TOPIC_SIDEBAR: 'SHOW_TOPIC_SIDEBAR',
SWITCH_TOPIC_SIDEBAR: 'SWITCH_TOPIC_SIDEBAR',
NEW_CONTEXT: 'NEW_CONTEXT'
NEW_CONTEXT: 'NEW_CONTEXT',
NEW_BRANCH: 'NEW_BRANCH'
}