refactor(messageThunk): 优化消息重发逻辑,分离新旧消息处理

将消息重发逻辑拆分为处理已有消息和新增提及模型消息两部分
简化条件判断,移除冗余代码
This commit is contained in:
icarus 2025-07-04 15:51:42 +08:00
parent 16fbd685c7
commit 6ad4e2129c

View File

@ -1069,48 +1069,30 @@ export const resendMessageThunk =
const resetDataList: Message[] = []
if (assistantMessagesToReset.length === 0) {
// 没有相关的助手消息就创建一个或多个
if (assistantMessagesToReset.length === 0 && !userMessageToResend?.mentions?.length) {
// 没有相关的助手消息且没有提及模型时,使用助手模型创建一条消息
if (userMessageToResend?.mentions?.length) {
console.log('userMessageToResend.mentions', userMessageToResend.mentions)
for (const mention of userMessageToResend.mentions) {
const assistantMessage = createAssistantMessage(assistant.id, topicId, {
askId: userMessageToResend.id,
model: mention,
modelId: mention.id
})
resetDataList.push(assistantMessage)
}
} else {
const assistantMessage = createAssistantMessage(assistant.id, topicId, {
askId: userMessageToResend.id,
model: assistant.model
})
resetDataList.push(assistantMessage)
}
const assistantMessage = createAssistantMessage(assistant.id, topicId, {
askId: userMessageToResend.id,
model: assistant.model
})
resetDataList.push(assistantMessage)
resetDataList.forEach((message) => {
dispatch(newMessagesActions.addMessage({ topicId, message }))
})
}
// 处理存在相关的助手消息的情况
const allBlockIdsToDelete: string[] = []
const messagesToUpdateInRedux: { topicId: string; messageId: string; updates: Partial<Message> }[] = []
// 先处理已有的重传
for (const originalMsg of assistantMessagesToReset) {
const blockIdsToDelete = [...(originalMsg.blocks || [])]
const resetMsg = resetAssistantMessage(originalMsg, {
status: AssistantMessageStatus.PENDING,
updatedAt: new Date().toISOString(),
...(assistantMessagesToReset.length === 1
? {
model:
originalMsg.model && userMessageToResend.mentions?.includes(originalMsg.model)
? originalMsg.model
: assistant.model
}
: {})
updatedAt: new Date().toISOString()
})
resetDataList.push(resetMsg)
@ -1118,6 +1100,20 @@ export const resendMessageThunk =
messagesToUpdateInRedux.push({ topicId, messageId: resetMsg.id, updates: resetMsg })
}
// 再处理新的重传(用户消息提及,但是现有助手消息中不存在提及的模型)
const originModelSet = new Set(assistantMessagesToReset.map((m) => m.model).filter((m) => m !== undefined))
const mentionedModelSet = new Set(userMessageToResend.mentions ?? [])
const newModelSet = new Set([...mentionedModelSet].filter((m) => !originModelSet.has(m)))
for (const model of newModelSet) {
const assistantMessage = createAssistantMessage(assistant.id, topicId, {
askId: userMessageToResend.id,
model: model,
modelId: model.id
})
resetDataList.push(assistantMessage)
dispatch(newMessagesActions.addMessage({ topicId, message: assistantMessage }))
}
messagesToUpdateInRedux.forEach((update) => dispatch(newMessagesActions.updateMessage(update)))
cleanupMultipleBlocks(dispatch, allBlockIdsToDelete)