Переглянути джерело

Add chatGPT chat history Import functionality

Brandon Hulston 1 рік тому
батько
коміт
27d5eb4684

+ 4 - 1
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);
 		};
 

+ 68 - 0
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;
+}

+ 1 - 1
src/routes/(app)/c/[id]/+page.svelte

@@ -696,7 +696,7 @@
 	<div class="min-h-screen w-full flex justify-center">
 		<div class=" py-2.5 flex flex-col justify-between w-full">
 			<div class="max-w-2xl mx-auto w-full px-3 md:px-0 mt-10">
-				<ModelSelector bind:selectedModels disabled={messages.length > 0} />
+				<ModelSelector bind:selectedModels disabled={messages.length > 0 && !selectedModels.includes('')} />
 			</div>
 
 			<div class=" h-full mt-10 mb-32 w-full flex flex-col">