feat: Enhance topic handling and message prompt generation

This commit is contained in:
kangfenmao 2025-02-16 13:41:31 +08:00
parent cbd6a30e14
commit 4ecedcb267
3 changed files with 17 additions and 11 deletions

View File

@ -17,16 +17,18 @@ export function useActiveTopic(_assistant: Assistant, topic?: Topic) {
useEffect(() => { useEffect(() => {
// activeTopic not in assistant.topics // activeTopic not in assistant.topics
const topicTarget = find(assistant.topics, { id: activeTopic?.id }) if (assistant && !find(assistant.topics, { id: activeTopic?.id })) {
// if (assistant && !find(assistant.topics, { id: activeTopic?.id })) { setActiveTopic(assistant.topics[0])
if (assistant) {
setActiveTopic(topicTarget || assistant.topics[0])
} }
}, [activeTopic?.id, assistant]) }, [activeTopic?.id, assistant])
return { activeTopic, setActiveTopic } return { activeTopic, setActiveTopic }
} }
export function useTopic(assistant: Assistant, topicId?: string) {
return assistant?.topics.find((topic) => topic.id === topicId)
}
export function getTopic(assistant: Assistant, topicId: string) { export function getTopic(assistant: Assistant, topicId: string) {
return assistant?.topics.find((topic) => topic.id === topicId) return assistant?.topics.find((topic) => topic.id === topicId)
} }

View File

@ -3,6 +3,7 @@ import db from '@renderer/databases'
import { useAssistant } from '@renderer/hooks/useAssistant' import { useAssistant } from '@renderer/hooks/useAssistant'
import { useModel } from '@renderer/hooks/useModel' import { useModel } from '@renderer/hooks/useModel'
import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings' import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings'
import { useTopic } from '@renderer/hooks/useTopic'
import { fetchChatCompletion } from '@renderer/services/ApiService' import { fetchChatCompletion } from '@renderer/services/ApiService'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import { getMessageModelId } from '@renderer/services/MessagesService' import { getMessageModelId } from '@renderer/services/MessagesService'
@ -43,7 +44,7 @@ const getMessageBackground = (isBubbleStyle: boolean, isAssistantMessage: boolea
const MessageItem: FC<Props> = ({ const MessageItem: FC<Props> = ({
message: _message, message: _message,
topic, topic: _topic,
index, index,
hidePresetMessages, hidePresetMessages,
isGrouped, isGrouped,
@ -59,6 +60,7 @@ const MessageItem: FC<Props> = ({
const { isBubbleStyle } = useMessageStyle() const { isBubbleStyle } = useMessageStyle()
const { showMessageDivider, messageFont, fontSize } = useSettings() const { showMessageDivider, messageFont, fontSize } = useSettings()
const messageContainerRef = useRef<HTMLDivElement>(null) const messageContainerRef = useRef<HTMLDivElement>(null)
const topic = useTopic(assistant, _topic?.id)
const isLastMessage = index === 0 const isLastMessage = index === 0
const isAssistantMessage = message.role === 'assistant' const isAssistantMessage = message.role === 'assistant'
@ -118,12 +120,14 @@ const MessageItem: FC<Props> = ({
useEffect(() => { useEffect(() => {
if (topic && onGetMessages && onSetMessages) { if (topic && onGetMessages && onSetMessages) {
if (message.status === 'sending') { if (message.status === 'sending') {
const _assistant = {
...assistant,
prompt: `${assistant?.prompt || ''}\n${topic?.prompt || ''}`
}
const messages = onGetMessages() const messages = onGetMessages()
const assistantWithModel = message.model ? { ..._assistant, model: message.model } : _assistant const assistantWithModel = message.model ? { ...assistant, model: message.model } : assistant
if (topic.prompt) {
assistantWithModel.prompt = assistantWithModel.prompt
? `${assistantWithModel.prompt}\n${topic.prompt}`
: topic.prompt
}
fetchChatCompletion({ fetchChatCompletion({
message, message,

View File

@ -135,7 +135,7 @@ const Topics: FC<Props> = ({ assistant: _assistant, activeTopic, setActiveTopic
allowClear: true allowClear: true
} }
}) })
if (prompt !== null) updateTopic({ ...topic, prompt }) prompt && updateTopic({ ...topic, prompt: prompt.trim() })
} }
}, },
{ {