diff --git a/src/lib/components/chat/SettingsModal.svelte b/src/lib/components/chat/SettingsModal.svelte index 35ad9f1a..9da70add 100644 --- a/src/lib/components/chat/SettingsModal.svelte +++ b/src/lib/components/chat/SettingsModal.svelte @@ -21,7 +21,7 @@ import { WEB_UI_VERSION, WEBUI_API_BASE_URL } from '$lib/constants'; import { config, models, settings, user, chats } from '$lib/stores'; - import { splitStream, getGravatarURL } from '$lib/utils'; + import { splitStream, getGravatarURL, getImportOrigin, convertGptChats } from '$lib/utils'; import Advanced from './Settings/Advanced.svelte'; import Modal from '../common/Modal.svelte'; @@ -132,6 +132,9 @@ reader.onload = (event) => { let chats = JSON.parse(event.target.result); console.log(chats); + if (getImportOrigin(chats) == 'gpt') { + chats = convertGptChats(chats); + } importChats(chats); }; diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 129a1d12..2c0906dc 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -192,3 +192,71 @@ export const calculateSHA256 = async (file) => { throw error; } }; + +export const getImportOrigin = (_chats) => { + // Check what external service chat imports are from + if ('mapping' in _chats[0]) { + return 'gpt'; + } + return 'webui'; +} + +const convertGptMessages = (convo) => { + // Parse OpenAI chat messages and create chat dictionary for creating new chats + const mapping = convo["mapping"]; + const messages = []; + let currentId = ""; + + for (let message_id in mapping) { + const message = mapping[message_id]; + currentId = message_id; + if (message["message"] == null || message["message"]["content"]["parts"][0] == "") { + // Skip chat messages with no content + continue; + } else { + const new_chat = { + "id": message_id, + "parentId": messages.length > 0 ? message["parent"] : null, + "childrenIds": message["children"] || [], + "role": message["message"]?.["author"]?.["role"] !== "user" ? "assistant" : "user", + "content": message["message"]?.["content"]?.['parts']?.[0] || "", + "model": '', + "done": true, + "context": null, + } + messages.push(new_chat) + } + } + + let history = {}; + messages.forEach(obj => history[obj.id] = obj); + + const chat = { + "history": { + "currentId": currentId, + "messages": history, // Need to convert this to not a list and instead a json object + }, + "models": [""], + "messages": messages, + "options": {}, + "timestamp": convo["create_time"], + "title": convo["title"], + } + return chat; +} + +export const convertGptChats = (_chats) => { + // Create a list of dictionaries with each conversation from import + const chats = []; + for (let convo of _chats) { + const chat = { + "id": convo["id"], + "user_id": '', + "title": convo["title"], + "chat": convertGptMessages(convo), + "timestamp": convo["timestamp"], + } + chats.push(chat) + } + return chats; +} diff --git a/src/routes/(app)/c/[id]/+page.svelte b/src/routes/(app)/c/[id]/+page.svelte index c0db9c5f..314cc7b6 100644 --- a/src/routes/(app)/c/[id]/+page.svelte +++ b/src/routes/(app)/c/[id]/+page.svelte @@ -696,7 +696,7 @@