diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index 829f4ff898..56fd106ab1 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -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: { diff --git a/src/renderer/src/pages/home/Messages/Message.tsx b/src/renderer/src/pages/home/Messages/Message.tsx index 69abcfccd0..dfbcf576ae 100644 --- a/src/renderer/src/pages/home/Messages/Message.tsx +++ b/src/renderer/src/pages/home/Messages/Message.tsx @@ -2,6 +2,7 @@ import { CheckOutlined, DeleteOutlined, EditOutlined, + ForkOutlined, MenuOutlined, QuestionCircleOutlined, SaveOutlined, @@ -71,6 +72,10 @@ const MessageItem: FC = ({ 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 = ({ message, index, showMenu, onDeleteMessage }) = )} + {isAssistantMessage && ( + + + + + + )} = ({ assistant, topic, setActiveTopic }) => { const [lastMessage, setLastMessage] = useState(null) const provider = useProviderByAssistant(assistant) const containerRef = useRef(null) - const { updateTopic } = useAssistant(assistant.id) + const { updateTopic, addTopic } = useAssistant(assistant.id) const onSendMessage = useCallback( (message: Message) => { @@ -116,10 +117,18 @@ const Messages: FC = ({ 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 () => { diff --git a/src/renderer/src/services/event.ts b/src/renderer/src/services/event.ts index 8417545494..cdf402e398 100644 --- a/src/renderer/src/services/event.ts +++ b/src/renderer/src/services/event.ts @@ -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' }