From 9f0efa56ce40c1f3a410d8d03e78d29a6a9a70a7 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 16 Nov 2023 20:15:45 +0700 Subject: [PATCH] chore: update convo last message --- plugins/inference-plugin/src/index.ts | 2 +- web/helpers/atoms/ChatMessage.atom.ts | 10 +++++++++- web/helpers/atoms/Conversation.atom.ts | 12 ++++++++++++ web/hooks/useGetUserConversations.ts | 1 + web/hooks/useSendChatMessage.ts | 24 +++++++++++++----------- web/screens/Chat/HistoryList/index.tsx | 7 ++++++- web/types/conversation.d.ts | 1 + 7 files changed, 43 insertions(+), 14 deletions(-) diff --git a/plugins/inference-plugin/src/index.ts b/plugins/inference-plugin/src/index.ts index 3ce1e3b4c..5841b7abc 100644 --- a/plugins/inference-plugin/src/index.ts +++ b/plugins/inference-plugin/src/index.ts @@ -105,7 +105,7 @@ export default class JanInferencePlugin implements InferencePlugin { */ private async handleMessageRequest(data: MessageRequest) { const message: ThreadMessage = { - ...data, + threadId: data.threadId, content: "", role: ChatCompletionRole.Assistant, createdAt: new Date().toISOString(), diff --git a/web/helpers/atoms/ChatMessage.atom.ts b/web/helpers/atoms/ChatMessage.atom.ts index 5b0a84bbe..14ad95a80 100644 --- a/web/helpers/atoms/ChatMessage.atom.ts +++ b/web/helpers/atoms/ChatMessage.atom.ts @@ -1,7 +1,11 @@ import { MessageStatus, ThreadMessage } from '@janhq/core' import { atom } from 'jotai' -import { getActiveConvoIdAtom } from './Conversation.atom' +import { + conversationStatesAtom, + getActiveConvoIdAtom, + updateThreadStateLastMessageAtom, +} from './Conversation.atom' /** * Stores all chat messages for all conversations @@ -77,6 +81,8 @@ export const addNewMessageAtom = atom( } newData[currentConvoId] = updatedMessages set(chatMessages, newData) + // Update thread last message + set(updateThreadStateLastMessageAtom, currentConvoId, newMessage.content) } ) @@ -110,6 +116,8 @@ export const updateMessageAtom = atom( } newData[conversationId] = updatedMessages set(chatMessages, newData) + // Update thread last message + set(updateThreadStateLastMessageAtom, conversationId, text) } } ) diff --git a/web/helpers/atoms/Conversation.atom.ts b/web/helpers/atoms/Conversation.atom.ts index d6ca4046a..60748e038 100644 --- a/web/helpers/atoms/Conversation.atom.ts +++ b/web/helpers/atoms/Conversation.atom.ts @@ -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( null, (get, set, conversation: Thread) => { diff --git a/web/hooks/useGetUserConversations.ts b/web/hooks/useGetUserConversations.ts index be210944f..3a6e4eb55 100644 --- a/web/hooks/useGetUserConversations.ts +++ b/web/hooks/useGetUserConversations.ts @@ -25,6 +25,7 @@ const useGetUserConversations = () => { convoStates[convo.id ?? ''] = { hasMore: true, waitingForResponse: false, + lastMessage: convo.messages[0]?.content ?? '', } setConvoMessages(convo.messages, convo.id ?? '') }) diff --git a/web/hooks/useSendChatMessage.ts b/web/hooks/useSendChatMessage.ts index 8ff334b27..676a75c2f 100644 --- a/web/hooks/useSendChatMessage.ts +++ b/web/hooks/useSendChatMessage.ts @@ -6,6 +6,7 @@ import { MessageStatus, PluginType, Thread, + ThreadMessage, events, } from '@janhq/core' import { ConversationalPlugin, InferencePlugin } from '@janhq/core/lib/plugins' @@ -84,14 +85,14 @@ export default function useSendChatMessage() { } const sendChatMessage = async () => { - const convoId = currentConvo?.id - if (!convoId) { + const threadId = currentConvo?.id + if (!threadId) { console.error('No conversation id') return } setCurrentPrompt('') - updateConvWaiting(convoId, true) + updateConvWaiting(threadId, true) const prompt = currentPrompt.trim() const messages: ChatCompletionMessage[] = currentMessages @@ -106,27 +107,28 @@ export default function useSendChatMessage() { content: prompt, } as ChatCompletionMessage, ]) - const newMessage: MessageRequest = { + const messageRequest: MessageRequest = { id: ulid(), - threadId: convoId, + threadId: threadId, messages, } - addNewMessage({ - id: newMessage.id, - threadId: newMessage.threadId, + const threadMessage: ThreadMessage = { + id: messageRequest.id, + threadId: messageRequest.threadId, content: prompt, role: ChatCompletionRole.User, createdAt: new Date().toISOString(), status: MessageStatus.Ready, - }) + } + addNewMessage(threadMessage) // delay randomly from 50 - 100ms // to prevent duplicate message id const delay = Math.floor(Math.random() * 50) + 50 await new Promise((resolve) => setTimeout(resolve, delay)) - events.emit(EventName.OnNewMessageRequest, newMessage) + events.emit(EventName.OnNewMessageRequest, messageRequest) if (!currentConvo?.summary && currentConvo) { const updatedConv: Thread = { ...currentConvo, @@ -136,7 +138,7 @@ export default function useSendChatMessage() { updateConversation(updatedConv) } - updateConvSummary(newMessage) + updateConvSummary(messageRequest) } return { diff --git a/web/screens/Chat/HistoryList/index.tsx b/web/screens/Chat/HistoryList/index.tsx index 6b5e2390c..3d5f47a22 100644 --- a/web/screens/Chat/HistoryList/index.tsx +++ b/web/screens/Chat/HistoryList/index.tsx @@ -17,6 +17,7 @@ import useGetUserConversations from '@/hooks/useGetUserConversations' import { displayDate } from '@/utils/datetime' import { + conversationStatesAtom, getActiveConvoIdAtom, setActiveConvoIdAtom, userConversationsAtom, @@ -24,6 +25,7 @@ import { export default function HistoryList() { const conversations = useAtomValue(userConversationsAtom) + const threadStates = useAtomValue(conversationStatesAtom) const { getUserConversations } = useGetUserConversations() const { activeModel, startModel } = useActiveModel() const { requestCreateConvo } = useCreateConversation() @@ -83,6 +85,7 @@ export default function HistoryList() { ) : ( conversations.map((convo, i) => { + const lastMessage = threadStates[convo.id]?.lastMessage return (
{convo.summary}

{/* TODO: Check latest message update */} - {convo?.messages[0]?.content ?? 'No new message'} + {lastMessage && lastMessage.length > 0 + ? lastMessage + : 'No new message'}

{activeModel && activeConvoId === convo.id && (