fix: remove files and memory when user clean thread (#2524)

Signed-off-by: James <james@jan.ai>
Co-authored-by: James <james@jan.ai>
This commit is contained in:
NamH 2024-03-28 13:54:38 +07:00 committed by GitHub
parent 54ba41000a
commit 1f8dc893ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,7 +1,11 @@
import { useCallback } from 'react'
import { import {
ChatCompletionRole, ChatCompletionRole,
ExtensionTypeEnum, ExtensionTypeEnum,
ConversationalExtension, ConversationalExtension,
fs,
joinPath,
} from '@janhq/core' } from '@janhq/core'
import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useAtom, useAtomValue, useSetAtom } from 'jotai'
@ -12,10 +16,11 @@ import { toaster } from '@/containers/Toast'
import { extensionManager } from '@/extension/ExtensionManager' import { extensionManager } from '@/extension/ExtensionManager'
import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom'
import { import {
chatMessages,
cleanChatMessageAtom as cleanChatMessagesAtom, cleanChatMessageAtom as cleanChatMessagesAtom,
deleteChatMessageAtom as deleteChatMessagesAtom, deleteChatMessageAtom as deleteChatMessagesAtom,
getCurrentChatMessagesAtom,
} from '@/helpers/atoms/ChatMessage.atom' } from '@/helpers/atoms/ChatMessage.atom'
import { import {
threadsAtom, threadsAtom,
@ -26,39 +31,63 @@ import {
export default function useDeleteThread() { export default function useDeleteThread() {
const [threads, setThreads] = useAtom(threadsAtom) const [threads, setThreads] = useAtom(threadsAtom)
const setCurrentPrompt = useSetAtom(currentPromptAtom) const messages = useAtomValue(chatMessages)
const messages = useAtomValue(getCurrentChatMessagesAtom) const janDataFolderPath = useAtomValue(janDataFolderPathAtom)
const setCurrentPrompt = useSetAtom(currentPromptAtom)
const setActiveThreadId = useSetAtom(setActiveThreadIdAtom) const setActiveThreadId = useSetAtom(setActiveThreadIdAtom)
const deleteMessages = useSetAtom(deleteChatMessagesAtom) const deleteMessages = useSetAtom(deleteChatMessagesAtom)
const cleanMessages = useSetAtom(cleanChatMessagesAtom) const cleanMessages = useSetAtom(cleanChatMessagesAtom)
const deleteThreadState = useSetAtom(deleteThreadStateAtom) const deleteThreadState = useSetAtom(deleteThreadStateAtom)
const updateThreadLastMessage = useSetAtom(updateThreadStateLastMessageAtom) const updateThreadLastMessage = useSetAtom(updateThreadStateLastMessageAtom)
const cleanThread = async (threadId: string) => { const cleanThread = useCallback(
if (threadId) { async (threadId: string) => {
const thread = threads.filter((c) => c.id === threadId)[0]
cleanMessages(threadId) cleanMessages(threadId)
const thread = threads.find((c) => c.id === threadId)
if (!thread) return
if (thread) { const updatedMessages = (messages[threadId] ?? []).filter(
await extensionManager (msg) => msg.role === ChatCompletionRole.System
.get<ConversationalExtension>(ExtensionTypeEnum.Conversational) )
?.writeMessages(
threadId,
messages.filter((msg) => msg.role === ChatCompletionRole.System)
)
thread.metadata = { // remove files
...thread.metadata, try {
lastMessage: undefined, const threadFolderPath = await joinPath([
} janDataFolderPath,
await extensionManager 'threads',
.get<ConversationalExtension>(ExtensionTypeEnum.Conversational) threadId,
?.saveThread(thread) ])
updateThreadLastMessage(threadId, undefined) const threadFilesPath = await joinPath([threadFolderPath, 'files'])
const threadMemoryPath = await joinPath([threadFolderPath, 'memory'])
await fs.rm(threadFilesPath)
await fs.rm(threadMemoryPath)
} catch (err) {
console.warn('Error deleting thread files', err)
} }
}
} await extensionManager
.get<ConversationalExtension>(ExtensionTypeEnum.Conversational)
?.writeMessages(threadId, updatedMessages)
thread.metadata = {
...thread.metadata,
lastMessage: undefined,
}
await extensionManager
.get<ConversationalExtension>(ExtensionTypeEnum.Conversational)
?.saveThread(thread)
updateThreadLastMessage(threadId, undefined)
},
[
janDataFolderPath,
threads,
messages,
cleanMessages,
updateThreadLastMessage,
]
)
const deleteThread = async (threadId: string) => { const deleteThread = async (threadId: string) => {
if (!threadId) { if (!threadId) {