fix: messages re-render on different threads (#4638)

This commit is contained in:
Louis 2025-02-12 16:32:10 +07:00 committed by GitHub
parent 82c45debb7
commit fe3e9ac9d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 10 additions and 19 deletions

View File

@ -143,8 +143,7 @@ export default function ModelHandler() {
return return
} }
// The thread title should not be updated if the message is less than 10 words // No new line character is presented in the title
// And no new line character is present
// And non-alphanumeric characters should be removed // And non-alphanumeric characters should be removed
if (messageContent.includes('\n')) { if (messageContent.includes('\n')) {
messageContent = messageContent.replace(/\n/g, ' ') messageContent = messageContent.replace(/\n/g, ' ')
@ -290,13 +289,7 @@ export default function ModelHandler() {
.catch(() => undefined) .catch(() => undefined)
if (updatedMessage) { if (updatedMessage) {
deleteMessage(message.id) deleteMessage(message.id)
addNewMessage({ addNewMessage(updatedMessage)
...updatedMessage,
metadata: {
...updatedMessage.metadata,
reserve_id: message.id,
},
})
setTokenSpeed((prev) => setTokenSpeed((prev) =>
prev ? { ...prev, message: updatedMessage.id } : undefined prev ? { ...prev, message: updatedMessage.id } : undefined
) )

View File

@ -160,12 +160,7 @@ const ChatBody = memo(
> >
{items.map((virtualRow) => ( {items.map((virtualRow) => (
<div <div
key={ key={messages[virtualRow.index]?.id ?? virtualRow.index}
(messages[virtualRow.index]?.metadata
?.reserve_id as string) ??
messages[virtualRow.index]?.id ??
virtualRow.index
}
data-index={virtualRow.index} data-index={virtualRow.index}
ref={virtualizer.measureElement} ref={virtualizer.measureElement}
> >
@ -175,6 +170,7 @@ const ChatBody = memo(
<ChatItem <ChatItem
{...messages[virtualRow.index]} {...messages[virtualRow.index]}
loadModelError={loadModelError} loadModelError={loadModelError}
index={virtualRow.index}
isCurrentMessage={ isCurrentMessage={
virtualRow.index === messages?.length - 1 virtualRow.index === messages?.length - 1
} }

View File

@ -21,6 +21,7 @@ type Ref = HTMLDivElement
type Props = { type Props = {
loadModelError?: string loadModelError?: string
isCurrentMessage?: boolean isCurrentMessage?: boolean
index: number
} & ThreadMessage } & ThreadMessage
const ChatItem = forwardRef<Ref, Props>((message, ref) => { const ChatItem = forwardRef<Ref, Props>((message, ref) => {
@ -78,6 +79,7 @@ const ChatItem = forwardRef<Ref, Props>((message, ref) => {
{...message} {...message}
content={content} content={content}
status={status} status={status}
index={message.index}
isCurrentMessage={message.isCurrentMessage ?? false} isCurrentMessage={message.isCurrentMessage ?? false}
/> />
</div> </div>

View File

@ -8,10 +8,10 @@ import { MarkdownTextMessage } from './MarkdownTextMessage'
interface Props { interface Props {
text: string text: string
status: string status: string
id: string id: number
} }
const thinkingBlockStateAtom = atom<{ [id: string]: boolean }>({}) const thinkingBlockStateAtom = atom<{ [id: number]: boolean }>({})
const ThinkingBlock = ({ id, text, status }: Props) => { const ThinkingBlock = ({ id, text, status }: Props) => {
const [thinkingState, setThinkingState] = useAtom(thinkingBlockStateAtom) const [thinkingState, setThinkingState] = useAtom(thinkingBlockStateAtom)

View File

@ -27,7 +27,7 @@ import {
import { chatWidthAtom } from '@/helpers/atoms/Setting.atom' import { chatWidthAtom } from '@/helpers/atoms/Setting.atom'
const MessageContainer: React.FC< const MessageContainer: React.FC<
ThreadMessage & { isCurrentMessage: boolean } ThreadMessage & { isCurrentMessage: boolean; index: number }
> = (props) => { > = (props) => {
const isUser = props.role === ChatCompletionRole.User const isUser = props.role === ChatCompletionRole.User
const isSystem = props.role === ChatCompletionRole.System const isSystem = props.role === ChatCompletionRole.System
@ -162,7 +162,7 @@ const MessageContainer: React.FC<
> >
{reasoningSegment && ( {reasoningSegment && (
<ThinkingBlock <ThinkingBlock
id={(props.metadata?.reserve_id as string) ?? props.id} id={props.index}
text={reasoningSegment} text={reasoningSegment}
status={props.status} status={props.status}
/> />