feat: new message branch
This commit is contained in:
parent
e7f7f8509e
commit
e34d4be6f2
@ -103,6 +103,7 @@ const resources = {
|
|||||||
'suggestions.title': 'Suggested Questions',
|
'suggestions.title': 'Suggested Questions',
|
||||||
'add.assistant.title': 'Add Assistant',
|
'add.assistant.title': 'Add Assistant',
|
||||||
'message.new.context': 'New Context',
|
'message.new.context': 'New Context',
|
||||||
|
'message.new.branch': 'New Branch',
|
||||||
'assistant.search.placeholder': 'Search'
|
'assistant.search.placeholder': 'Search'
|
||||||
},
|
},
|
||||||
files: {
|
files: {
|
||||||
@ -369,6 +370,7 @@ const resources = {
|
|||||||
'suggestions.title': '建议的问题',
|
'suggestions.title': '建议的问题',
|
||||||
'add.assistant.title': '添加智能体',
|
'add.assistant.title': '添加智能体',
|
||||||
'message.new.context': '清除上下文',
|
'message.new.context': '清除上下文',
|
||||||
|
'message.new.branch': '新分支',
|
||||||
'assistant.search.placeholder': '搜索'
|
'assistant.search.placeholder': '搜索'
|
||||||
},
|
},
|
||||||
files: {
|
files: {
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import {
|
|||||||
CheckOutlined,
|
CheckOutlined,
|
||||||
DeleteOutlined,
|
DeleteOutlined,
|
||||||
EditOutlined,
|
EditOutlined,
|
||||||
|
ForkOutlined,
|
||||||
MenuOutlined,
|
MenuOutlined,
|
||||||
QuestionCircleOutlined,
|
QuestionCircleOutlined,
|
||||||
SaveOutlined,
|
SaveOutlined,
|
||||||
@ -71,6 +72,10 @@ const MessageItem: FC<Props> = ({ message, index, showMenu, onDeleteMessage }) =
|
|||||||
[setModel]
|
[setModel]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const onNewBranch = useCallback(() => {
|
||||||
|
EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index)
|
||||||
|
}, [index])
|
||||||
|
|
||||||
const getUserName = useCallback(() => {
|
const getUserName = useCallback(() => {
|
||||||
if (isLocalAi && message.role !== 'user') return APP_NAME
|
if (isLocalAi && message.role !== 'user') return APP_NAME
|
||||||
if (message.role === 'assistant') return upperFirst(model?.name || model?.id)
|
if (message.role === 'assistant') return upperFirst(model?.name || model?.id)
|
||||||
@ -174,6 +179,13 @@ const MessageItem: FC<Props> = ({ message, index, showMenu, onDeleteMessage }) =
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
</SelectModelDropdown>
|
</SelectModelDropdown>
|
||||||
)}
|
)}
|
||||||
|
{isAssistantMessage && (
|
||||||
|
<Tooltip title={t('chat.message.new.branch')} mouseEnterDelay={0.8}>
|
||||||
|
<ActionButton onClick={onNewBranch}>
|
||||||
|
<ForkOutlined />
|
||||||
|
</ActionButton>
|
||||||
|
</Tooltip>
|
||||||
|
)}
|
||||||
<Popconfirm
|
<Popconfirm
|
||||||
title={t('message.message.delete.content')}
|
title={t('message.message.delete.content')}
|
||||||
okButtonProps={{ danger: true }}
|
okButtonProps={{ danger: true }}
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { useAssistant } from '@renderer/hooks/useAssistant'
|
|||||||
import { useProviderByAssistant } from '@renderer/hooks/useProvider'
|
import { useProviderByAssistant } from '@renderer/hooks/useProvider'
|
||||||
import { getTopic, TopicManager } from '@renderer/hooks/useTopic'
|
import { getTopic, TopicManager } from '@renderer/hooks/useTopic'
|
||||||
import { fetchChatCompletion, fetchMessagesSummary } from '@renderer/services/api'
|
import { fetchChatCompletion, fetchMessagesSummary } from '@renderer/services/api'
|
||||||
|
import { getDefaultTopic } from '@renderer/services/assistant'
|
||||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/event'
|
import { EVENT_NAMES, EventEmitter } from '@renderer/services/event'
|
||||||
import {
|
import {
|
||||||
deleteMessageFiles,
|
deleteMessageFiles,
|
||||||
@ -13,7 +14,7 @@ import {
|
|||||||
import { Assistant, Message, Model, Topic } from '@renderer/types'
|
import { Assistant, Message, Model, Topic } from '@renderer/types'
|
||||||
import { getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils'
|
import { getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils'
|
||||||
import { t } from 'i18next'
|
import { t } from 'i18next'
|
||||||
import { last, reverse } from 'lodash'
|
import { last, reverse, take } from 'lodash'
|
||||||
import { FC, useCallback, useEffect, useRef, useState } from 'react'
|
import { FC, useCallback, useEffect, useRef, useState } from 'react'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ const Messages: FC<Props> = ({ assistant, topic, setActiveTopic }) => {
|
|||||||
const [lastMessage, setLastMessage] = useState<Message | null>(null)
|
const [lastMessage, setLastMessage] = useState<Message | null>(null)
|
||||||
const provider = useProviderByAssistant(assistant)
|
const provider = useProviderByAssistant(assistant)
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
const containerRef = useRef<HTMLDivElement>(null)
|
||||||
const { updateTopic } = useAssistant(assistant.id)
|
const { updateTopic, addTopic } = useAssistant(assistant.id)
|
||||||
|
|
||||||
const onSendMessage = useCallback(
|
const onSendMessage = useCallback(
|
||||||
(message: Message) => {
|
(message: Message) => {
|
||||||
@ -116,10 +117,18 @@ const Messages: FC<Props> = ({ assistant, topic, setActiveTopic }) => {
|
|||||||
status: 'success',
|
status: 'success',
|
||||||
type: 'clear'
|
type: 'clear'
|
||||||
} as Message)
|
} 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())
|
return () => unsubscribes.forEach((unsub) => unsub())
|
||||||
}, [assistant, messages, provider, topic, autoRenameTopic, updateTopic, onSendMessage])
|
}, [addTopic, assistant, autoRenameTopic, messages, onSendMessage, setActiveTopic, topic, updateTopic])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
runAsyncFunction(async () => {
|
runAsyncFunction(async () => {
|
||||||
|
|||||||
@ -16,5 +16,6 @@ export const EVENT_NAMES = {
|
|||||||
SHOW_CHAT_SETTINGS: 'SHOW_CHAT_SETTINGS',
|
SHOW_CHAT_SETTINGS: 'SHOW_CHAT_SETTINGS',
|
||||||
SHOW_TOPIC_SIDEBAR: 'SHOW_TOPIC_SIDEBAR',
|
SHOW_TOPIC_SIDEBAR: 'SHOW_TOPIC_SIDEBAR',
|
||||||
SWITCH_TOPIC_SIDEBAR: 'SWITCH_TOPIC_SIDEBAR',
|
SWITCH_TOPIC_SIDEBAR: 'SWITCH_TOPIC_SIDEBAR',
|
||||||
NEW_CONTEXT: 'NEW_CONTEXT'
|
NEW_CONTEXT: 'NEW_CONTEXT',
|
||||||
|
NEW_BRANCH: 'NEW_BRANCH'
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user