Commit 6fb03671 authored by Timothy J. Baek's avatar Timothy J. Baek
Browse files

fix: openai multi-user issue

parent a96795d7
...@@ -322,175 +322,171 @@ ...@@ -322,175 +322,171 @@
}; };
const sendPromptOpenAI = async (model, userPrompt, parentId, _chatId) => { const sendPromptOpenAI = async (model, userPrompt, parentId, _chatId) => {
if ($settings.OPENAI_API_KEY) { let responseMessageId = uuidv4();
if (models) {
let responseMessageId = uuidv4();
let responseMessage = {
parentId: parentId,
id: responseMessageId,
childrenIds: [],
role: 'assistant',
content: '',
model: model
};
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
if (parentId !== null) {
history.messages[parentId].childrenIds = [
...history.messages[parentId].childrenIds,
responseMessageId
];
}
window.scrollTo({ top: document.body.scrollHeight }); let responseMessage = {
parentId: parentId,
const res = await generateOpenAIChatCompletion(localStorage.token, { id: responseMessageId,
model: model, childrenIds: [],
stream: true, role: 'assistant',
messages: [ content: '',
$settings.system model: model
? { };
role: 'system',
content: $settings.system
}
: undefined,
...messages
]
.filter((message) => message)
.map((message) => ({
role: message.role,
...(message.files
? {
content: [
{
type: 'text',
text: message.content
},
...message.files
.filter((file) => file.type === 'image')
.map((file) => ({
type: 'image_url',
image_url: {
url: file.url
}
}))
]
}
: { content: message.content })
})),
seed: $settings?.options?.seed ?? undefined,
stop: $settings?.options?.stop ?? undefined,
temperature: $settings?.options?.temperature ?? undefined,
top_p: $settings?.options?.top_p ?? undefined,
num_ctx: $settings?.options?.num_ctx ?? undefined,
frequency_penalty: $settings?.options?.repeat_penalty ?? undefined,
max_tokens: $settings?.options?.num_predict ?? undefined
});
if (res && res.ok) { history.messages[responseMessageId] = responseMessage;
const reader = res.body history.currentId = responseMessageId;
.pipeThrough(new TextDecoderStream()) if (parentId !== null) {
.pipeThrough(splitStream('\n')) history.messages[parentId].childrenIds = [
.getReader(); ...history.messages[parentId].childrenIds,
responseMessageId
while (true) { ];
const { value, done } = await reader.read(); }
if (done || stopResponseFlag || _chatId !== $chatId) {
responseMessage.done = true;
messages = messages;
break;
}
try { window.scrollTo({ top: document.body.scrollHeight });
let lines = value.split('\n');
for (const line of lines) {
if (line !== '') {
console.log(line);
if (line === 'data: [DONE]') {
responseMessage.done = true;
messages = messages;
} else {
let data = JSON.parse(line.replace(/^data: /, ''));
console.log(data);
if (responseMessage.content == '' && data.choices[0].delta.content == '\n') {
continue;
} else {
responseMessage.content += data.choices[0].delta.content ?? '';
messages = messages;
}
}
}
}
} catch (error) {
console.log(error);
}
if ($settings.notificationEnabled && !document.hasFocus()) { const res = await generateOpenAIChatCompletion(localStorage.token, {
const notification = new Notification(`OpenAI ${model}`, { model: model,
body: responseMessage.content, stream: true,
icon: '/favicon.png' messages: [
}); $settings.system
} ? {
role: 'system',
content: $settings.system
}
: undefined,
...messages
]
.filter((message) => message)
.map((message) => ({
role: message.role,
...(message.files
? {
content: [
{
type: 'text',
text: message.content
},
...message.files
.filter((file) => file.type === 'image')
.map((file) => ({
type: 'image_url',
image_url: {
url: file.url
}
}))
]
}
: { content: message.content })
})),
seed: $settings?.options?.seed ?? undefined,
stop: $settings?.options?.stop ?? undefined,
temperature: $settings?.options?.temperature ?? undefined,
top_p: $settings?.options?.top_p ?? undefined,
num_ctx: $settings?.options?.num_ctx ?? undefined,
frequency_penalty: $settings?.options?.repeat_penalty ?? undefined,
max_tokens: $settings?.options?.num_predict ?? undefined
});
if ($settings.responseAutoCopy) { if (res && res.ok) {
copyToClipboard(responseMessage.content); const reader = res.body
} .pipeThrough(new TextDecoderStream())
.pipeThrough(splitStream('\n'))
.getReader();
if (autoScroll) { while (true) {
window.scrollTo({ top: document.body.scrollHeight }); const { value, done } = await reader.read();
} if (done || stopResponseFlag || _chatId !== $chatId) {
} responseMessage.done = true;
messages = messages;
break;
}
if ($chatId == _chatId) { try {
chat = await updateChatById(localStorage.token, _chatId, { let lines = value.split('\n');
messages: messages,
history: history for (const line of lines) {
}); if (line !== '') {
await chats.set(await getChatList(localStorage.token)); console.log(line);
} if (line === 'data: [DONE]') {
} else { responseMessage.done = true;
if (res !== null) { messages = messages;
const error = await res.json();
console.log(error);
if ('detail' in error) {
toast.error(error.detail);
responseMessage.content = error.detail;
} else {
if ('message' in error.error) {
toast.error(error.error.message);
responseMessage.content = error.error.message;
} else { } else {
toast.error(error.error); let data = JSON.parse(line.replace(/^data: /, ''));
responseMessage.content = error.error; console.log(data);
if (responseMessage.content == '' && data.choices[0].delta.content == '\n') {
continue;
} else {
responseMessage.content += data.choices[0].delta.content ?? '';
messages = messages;
}
} }
} }
} else {
toast.error(`Uh-oh! There was an issue connecting to ${model}.`);
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`;
} }
} catch (error) {
console.log(error);
}
responseMessage.error = true; if ($settings.notificationEnabled && !document.hasFocus()) {
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`; const notification = new Notification(`OpenAI ${model}`, {
responseMessage.done = true; body: responseMessage.content,
messages = messages; icon: '/favicon.png'
});
} }
stopResponseFlag = false; if ($settings.responseAutoCopy) {
await tick(); copyToClipboard(responseMessage.content);
}
if (autoScroll) { if (autoScroll) {
window.scrollTo({ top: document.body.scrollHeight }); window.scrollTo({ top: document.body.scrollHeight });
} }
}
if (messages.length == 2) { if ($chatId == _chatId) {
window.history.replaceState(history.state, '', `/c/${_chatId}`); chat = await updateChatById(localStorage.token, _chatId, {
await setChatTitle(_chatId, userPrompt); messages: messages,
history: history
});
await chats.set(await getChatList(localStorage.token));
}
} else {
if (res !== null) {
const error = await res.json();
console.log(error);
if ('detail' in error) {
toast.error(error.detail);
responseMessage.content = error.detail;
} else {
if ('message' in error.error) {
toast.error(error.error.message);
responseMessage.content = error.error.message;
} else {
toast.error(error.error);
responseMessage.content = error.error;
}
} }
} else {
toast.error(`Uh-oh! There was an issue connecting to ${model}.`);
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`;
} }
responseMessage.error = true;
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`;
responseMessage.done = true;
messages = messages;
}
stopResponseFlag = false;
await tick();
if (autoScroll) {
window.scrollTo({ top: document.body.scrollHeight });
}
if (messages.length == 2) {
window.history.replaceState(history.state, '', `/c/${_chatId}`);
await setChatTitle(_chatId, userPrompt);
} }
}; };
......
...@@ -340,175 +340,171 @@ ...@@ -340,175 +340,171 @@
}; };
const sendPromptOpenAI = async (model, userPrompt, parentId, _chatId) => { const sendPromptOpenAI = async (model, userPrompt, parentId, _chatId) => {
if ($settings.OPENAI_API_KEY) { let responseMessageId = uuidv4();
if (models) {
let responseMessageId = uuidv4();
let responseMessage = {
parentId: parentId,
id: responseMessageId,
childrenIds: [],
role: 'assistant',
content: '',
model: model
};
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
if (parentId !== null) {
history.messages[parentId].childrenIds = [
...history.messages[parentId].childrenIds,
responseMessageId
];
}
window.scrollTo({ top: document.body.scrollHeight }); let responseMessage = {
parentId: parentId,
const res = await generateOpenAIChatCompletion(localStorage.token, { id: responseMessageId,
model: model, childrenIds: [],
stream: true, role: 'assistant',
messages: [ content: '',
$settings.system model: model
? { };
role: 'system',
content: $settings.system
}
: undefined,
...messages
]
.filter((message) => message)
.map((message) => ({
role: message.role,
...(message.files
? {
content: [
{
type: 'text',
text: message.content
},
...message.files
.filter((file) => file.type === 'image')
.map((file) => ({
type: 'image_url',
image_url: {
url: file.url
}
}))
]
}
: { content: message.content })
})),
seed: $settings?.options?.seed ?? undefined,
stop: $settings?.options?.stop ?? undefined,
temperature: $settings?.options?.temperature ?? undefined,
top_p: $settings?.options?.top_p ?? undefined,
num_ctx: $settings?.options?.num_ctx ?? undefined,
frequency_penalty: $settings?.options?.repeat_penalty ?? undefined,
max_tokens: $settings?.options?.num_predict ?? undefined
});
if (res && res.ok) { history.messages[responseMessageId] = responseMessage;
const reader = res.body history.currentId = responseMessageId;
.pipeThrough(new TextDecoderStream()) if (parentId !== null) {
.pipeThrough(splitStream('\n')) history.messages[parentId].childrenIds = [
.getReader(); ...history.messages[parentId].childrenIds,
responseMessageId
while (true) { ];
const { value, done } = await reader.read(); }
if (done || stopResponseFlag || _chatId !== $chatId) {
responseMessage.done = true;
messages = messages;
break;
}
try { window.scrollTo({ top: document.body.scrollHeight });
let lines = value.split('\n');
for (const line of lines) {
if (line !== '') {
console.log(line);
if (line === 'data: [DONE]') {
responseMessage.done = true;
messages = messages;
} else {
let data = JSON.parse(line.replace(/^data: /, ''));
console.log(data);
if (responseMessage.content == '' && data.choices[0].delta.content == '\n') {
continue;
} else {
responseMessage.content += data.choices[0].delta.content ?? '';
messages = messages;
}
}
}
}
} catch (error) {
console.log(error);
}
if ($settings.notificationEnabled && !document.hasFocus()) { const res = await generateOpenAIChatCompletion(localStorage.token, {
const notification = new Notification(`OpenAI ${model}`, { model: model,
body: responseMessage.content, stream: true,
icon: '/favicon.png' messages: [
}); $settings.system
} ? {
role: 'system',
content: $settings.system
}
: undefined,
...messages
]
.filter((message) => message)
.map((message) => ({
role: message.role,
...(message.files
? {
content: [
{
type: 'text',
text: message.content
},
...message.files
.filter((file) => file.type === 'image')
.map((file) => ({
type: 'image_url',
image_url: {
url: file.url
}
}))
]
}
: { content: message.content })
})),
seed: $settings?.options?.seed ?? undefined,
stop: $settings?.options?.stop ?? undefined,
temperature: $settings?.options?.temperature ?? undefined,
top_p: $settings?.options?.top_p ?? undefined,
num_ctx: $settings?.options?.num_ctx ?? undefined,
frequency_penalty: $settings?.options?.repeat_penalty ?? undefined,
max_tokens: $settings?.options?.num_predict ?? undefined
});
if ($settings.responseAutoCopy) { if (res && res.ok) {
copyToClipboard(responseMessage.content); const reader = res.body
} .pipeThrough(new TextDecoderStream())
.pipeThrough(splitStream('\n'))
.getReader();
if (autoScroll) { while (true) {
window.scrollTo({ top: document.body.scrollHeight }); const { value, done } = await reader.read();
} if (done || stopResponseFlag || _chatId !== $chatId) {
} responseMessage.done = true;
messages = messages;
break;
}
if ($chatId == _chatId) { try {
chat = await updateChatById(localStorage.token, _chatId, { let lines = value.split('\n');
messages: messages,
history: history for (const line of lines) {
}); if (line !== '') {
await chats.set(await getChatList(localStorage.token)); console.log(line);
} if (line === 'data: [DONE]') {
} else { responseMessage.done = true;
if (res !== null) { messages = messages;
const error = await res.json();
console.log(error);
if ('detail' in error) {
toast.error(error.detail);
responseMessage.content = error.detail;
} else {
if ('message' in error.error) {
toast.error(error.error.message);
responseMessage.content = error.error.message;
} else { } else {
toast.error(error.error); let data = JSON.parse(line.replace(/^data: /, ''));
responseMessage.content = error.error; console.log(data);
if (responseMessage.content == '' && data.choices[0].delta.content == '\n') {
continue;
} else {
responseMessage.content += data.choices[0].delta.content ?? '';
messages = messages;
}
} }
} }
} else {
toast.error(`Uh-oh! There was an issue connecting to ${model}.`);
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`;
} }
} catch (error) {
console.log(error);
}
responseMessage.error = true; if ($settings.notificationEnabled && !document.hasFocus()) {
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`; const notification = new Notification(`OpenAI ${model}`, {
responseMessage.done = true; body: responseMessage.content,
messages = messages; icon: '/favicon.png'
});
} }
stopResponseFlag = false; if ($settings.responseAutoCopy) {
await tick(); copyToClipboard(responseMessage.content);
}
if (autoScroll) { if (autoScroll) {
window.scrollTo({ top: document.body.scrollHeight }); window.scrollTo({ top: document.body.scrollHeight });
} }
}
if (messages.length == 2) { if ($chatId == _chatId) {
window.history.replaceState(history.state, '', `/c/${_chatId}`); chat = await updateChatById(localStorage.token, _chatId, {
await setChatTitle(_chatId, userPrompt); messages: messages,
history: history
});
await chats.set(await getChatList(localStorage.token));
}
} else {
if (res !== null) {
const error = await res.json();
console.log(error);
if ('detail' in error) {
toast.error(error.detail);
responseMessage.content = error.detail;
} else {
if ('message' in error.error) {
toast.error(error.error.message);
responseMessage.content = error.error.message;
} else {
toast.error(error.error);
responseMessage.content = error.error;
}
} }
} else {
toast.error(`Uh-oh! There was an issue connecting to ${model}.`);
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`;
} }
responseMessage.error = true;
responseMessage.content = `Uh-oh! There was an issue connecting to ${model}.`;
responseMessage.done = true;
messages = messages;
}
stopResponseFlag = false;
await tick();
if (autoScroll) {
window.scrollTo({ top: document.body.scrollHeight });
}
if (messages.length == 2) {
window.history.replaceState(history.state, '', `/c/${_chatId}`);
await setChatTitle(_chatId, userPrompt);
} }
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment