forked from open-webui/open-webui
Add chatGPT chat history Import functionality
This commit is contained in:
parent
5e32db1c57
commit
27d5eb4684
3 changed files with 73 additions and 2 deletions
|
@ -21,7 +21,7 @@
|
||||||
import { WEB_UI_VERSION, WEBUI_API_BASE_URL } from '$lib/constants';
|
import { WEB_UI_VERSION, WEBUI_API_BASE_URL } from '$lib/constants';
|
||||||
|
|
||||||
import { config, models, settings, user, chats } from '$lib/stores';
|
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 Advanced from './Settings/Advanced.svelte';
|
||||||
import Modal from '../common/Modal.svelte';
|
import Modal from '../common/Modal.svelte';
|
||||||
|
@ -132,6 +132,9 @@
|
||||||
reader.onload = (event) => {
|
reader.onload = (event) => {
|
||||||
let chats = JSON.parse(event.target.result);
|
let chats = JSON.parse(event.target.result);
|
||||||
console.log(chats);
|
console.log(chats);
|
||||||
|
if (getImportOrigin(chats) == 'gpt') {
|
||||||
|
chats = convertGptChats(chats);
|
||||||
|
}
|
||||||
importChats(chats);
|
importChats(chats);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -192,3 +192,71 @@ export const calculateSHA256 = async (file) => {
|
||||||
throw error;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -696,7 +696,7 @@
|
||||||
<div class="min-h-screen w-full flex justify-center">
|
<div class="min-h-screen w-full flex justify-center">
|
||||||
<div class=" py-2.5 flex flex-col justify-between w-full">
|
<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">
|
<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>
|
||||||
|
|
||||||
<div class=" h-full mt-10 mb-32 w-full flex flex-col">
|
<div class=" h-full mt-10 mb-32 w-full flex flex-col">
|
||||||
|
|
Loading…
Reference in a new issue