chore: update convo last message

This commit is contained in:
Louis 2023-11-16 20:15:45 +07:00
parent c5d4163869
commit 9f0efa56ce
7 changed files with 43 additions and 14 deletions

View File

@ -105,7 +105,7 @@ export default class JanInferencePlugin implements InferencePlugin {
*/ */
private async handleMessageRequest(data: MessageRequest) { private async handleMessageRequest(data: MessageRequest) {
const message: ThreadMessage = { const message: ThreadMessage = {
...data, threadId: data.threadId,
content: "", content: "",
role: ChatCompletionRole.Assistant, role: ChatCompletionRole.Assistant,
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),

View File

@ -1,7 +1,11 @@
import { MessageStatus, ThreadMessage } from '@janhq/core' import { MessageStatus, ThreadMessage } from '@janhq/core'
import { atom } from 'jotai' import { atom } from 'jotai'
import { getActiveConvoIdAtom } from './Conversation.atom' import {
conversationStatesAtom,
getActiveConvoIdAtom,
updateThreadStateLastMessageAtom,
} from './Conversation.atom'
/** /**
* Stores all chat messages for all conversations * Stores all chat messages for all conversations
@ -77,6 +81,8 @@ export const addNewMessageAtom = atom(
} }
newData[currentConvoId] = updatedMessages newData[currentConvoId] = updatedMessages
set(chatMessages, newData) set(chatMessages, newData)
// Update thread last message
set(updateThreadStateLastMessageAtom, currentConvoId, newMessage.content)
} }
) )
@ -110,6 +116,8 @@ export const updateMessageAtom = atom(
} }
newData[conversationId] = updatedMessages newData[conversationId] = updatedMessages
set(chatMessages, newData) set(chatMessages, newData)
// Update thread last message
set(updateThreadStateLastMessageAtom, conversationId, text)
} }
} }
) )

View File

@ -71,6 +71,18 @@ export const updateConversationHasMoreAtom = atom(
} }
) )
export const updateThreadStateLastMessageAtom = atom(
null,
(get, set, conversationId: string, lastMessage?: string) => {
const currentState = { ...get(conversationStatesAtom) }
currentState[conversationId] = {
...currentState[conversationId],
lastMessage,
}
set(conversationStatesAtom, currentState)
}
)
export const updateConversationAtom = atom( export const updateConversationAtom = atom(
null, null,
(get, set, conversation: Thread) => { (get, set, conversation: Thread) => {

View File

@ -25,6 +25,7 @@ const useGetUserConversations = () => {
convoStates[convo.id ?? ''] = { convoStates[convo.id ?? ''] = {
hasMore: true, hasMore: true,
waitingForResponse: false, waitingForResponse: false,
lastMessage: convo.messages[0]?.content ?? '',
} }
setConvoMessages(convo.messages, convo.id ?? '') setConvoMessages(convo.messages, convo.id ?? '')
}) })

View File

@ -6,6 +6,7 @@ import {
MessageStatus, MessageStatus,
PluginType, PluginType,
Thread, Thread,
ThreadMessage,
events, events,
} from '@janhq/core' } from '@janhq/core'
import { ConversationalPlugin, InferencePlugin } from '@janhq/core/lib/plugins' import { ConversationalPlugin, InferencePlugin } from '@janhq/core/lib/plugins'
@ -84,14 +85,14 @@ export default function useSendChatMessage() {
} }
const sendChatMessage = async () => { const sendChatMessage = async () => {
const convoId = currentConvo?.id const threadId = currentConvo?.id
if (!convoId) { if (!threadId) {
console.error('No conversation id') console.error('No conversation id')
return return
} }
setCurrentPrompt('') setCurrentPrompt('')
updateConvWaiting(convoId, true) updateConvWaiting(threadId, true)
const prompt = currentPrompt.trim() const prompt = currentPrompt.trim()
const messages: ChatCompletionMessage[] = currentMessages const messages: ChatCompletionMessage[] = currentMessages
@ -106,27 +107,28 @@ export default function useSendChatMessage() {
content: prompt, content: prompt,
} as ChatCompletionMessage, } as ChatCompletionMessage,
]) ])
const newMessage: MessageRequest = { const messageRequest: MessageRequest = {
id: ulid(), id: ulid(),
threadId: convoId, threadId: threadId,
messages, messages,
} }
addNewMessage({ const threadMessage: ThreadMessage = {
id: newMessage.id, id: messageRequest.id,
threadId: newMessage.threadId, threadId: messageRequest.threadId,
content: prompt, content: prompt,
role: ChatCompletionRole.User, role: ChatCompletionRole.User,
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
status: MessageStatus.Ready, status: MessageStatus.Ready,
}) }
addNewMessage(threadMessage)
// delay randomly from 50 - 100ms // delay randomly from 50 - 100ms
// to prevent duplicate message id // to prevent duplicate message id
const delay = Math.floor(Math.random() * 50) + 50 const delay = Math.floor(Math.random() * 50) + 50
await new Promise((resolve) => setTimeout(resolve, delay)) await new Promise((resolve) => setTimeout(resolve, delay))
events.emit(EventName.OnNewMessageRequest, newMessage) events.emit(EventName.OnNewMessageRequest, messageRequest)
if (!currentConvo?.summary && currentConvo) { if (!currentConvo?.summary && currentConvo) {
const updatedConv: Thread = { const updatedConv: Thread = {
...currentConvo, ...currentConvo,
@ -136,7 +138,7 @@ export default function useSendChatMessage() {
updateConversation(updatedConv) updateConversation(updatedConv)
} }
updateConvSummary(newMessage) updateConvSummary(messageRequest)
} }
return { return {

View File

@ -17,6 +17,7 @@ import useGetUserConversations from '@/hooks/useGetUserConversations'
import { displayDate } from '@/utils/datetime' import { displayDate } from '@/utils/datetime'
import { import {
conversationStatesAtom,
getActiveConvoIdAtom, getActiveConvoIdAtom,
setActiveConvoIdAtom, setActiveConvoIdAtom,
userConversationsAtom, userConversationsAtom,
@ -24,6 +25,7 @@ import {
export default function HistoryList() { export default function HistoryList() {
const conversations = useAtomValue(userConversationsAtom) const conversations = useAtomValue(userConversationsAtom)
const threadStates = useAtomValue(conversationStatesAtom)
const { getUserConversations } = useGetUserConversations() const { getUserConversations } = useGetUserConversations()
const { activeModel, startModel } = useActiveModel() const { activeModel, startModel } = useActiveModel()
const { requestCreateConvo } = useCreateConversation() const { requestCreateConvo } = useCreateConversation()
@ -83,6 +85,7 @@ export default function HistoryList() {
</div> </div>
) : ( ) : (
conversations.map((convo, i) => { conversations.map((convo, i) => {
const lastMessage = threadStates[convo.id]?.lastMessage
return ( return (
<div <div
key={i} key={i}
@ -99,7 +102,9 @@ export default function HistoryList() {
<h2 className="line-clamp-1">{convo.summary}</h2> <h2 className="line-clamp-1">{convo.summary}</h2>
<p className="mt-1 line-clamp-2 text-xs"> <p className="mt-1 line-clamp-2 text-xs">
{/* TODO: Check latest message update */} {/* TODO: Check latest message update */}
{convo?.messages[0]?.content ?? 'No new message'} {lastMessage && lastMessage.length > 0
? lastMessage
: 'No new message'}
</p> </p>
{activeModel && activeConvoId === convo.id && ( {activeModel && activeConvoId === convo.id && (
<m.div <m.div

View File

@ -2,4 +2,5 @@ export type ThreadState = {
hasMore: boolean hasMore: boolean
waitingForResponse: boolean waitingForResponse: boolean
error?: Error error?: Error
lastMessage?: string
} }