Add null check before calling .map() on the API response in getChatList(). When the fetch fails silently or returns null, the function now gracefully returns an empty array instead of crashing with 'Cannot read property map of null'.
1246 lines
23 KiB
TypeScript
1246 lines
23 KiB
TypeScript
import { WEBUI_API_BASE_URL } from '$lib/constants';
|
|
import { getTimeRange } from '$lib/utils';
|
|
|
|
export const createNewChat = async (token: string, chat: object, folderId: string | null) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/new`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
authorization: `Bearer ${token}`
|
|
},
|
|
body: JSON.stringify({
|
|
chat: chat,
|
|
folder_id: folderId ?? null
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const unarchiveAllChats = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/unarchive/all`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err.detail;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const importChats = async (token: string, chats: object[]) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/import`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
authorization: `Bearer ${token}`
|
|
},
|
|
body: JSON.stringify({
|
|
chats
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getChatList = async (
|
|
token: string = '',
|
|
page: number | null = null,
|
|
include_pinned: boolean = false,
|
|
include_folders: boolean = false
|
|
) => {
|
|
let error = null;
|
|
const searchParams = new URLSearchParams();
|
|
|
|
if (page !== null) {
|
|
searchParams.append('page', `${page}`);
|
|
}
|
|
|
|
if (include_folders) {
|
|
searchParams.append('include_folders', 'true');
|
|
}
|
|
|
|
if (include_pinned) {
|
|
searchParams.append('include_pinned', 'true');
|
|
}
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/?${searchParams.toString()}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
if (!res) {
|
|
return [];
|
|
}
|
|
|
|
return res.map((chat) => ({
|
|
...chat,
|
|
time_range: getTimeRange(chat.updated_at)
|
|
}));
|
|
};
|
|
|
|
export const getChatListByUserId = async (
|
|
token: string = '',
|
|
userId: string,
|
|
page: number = 1,
|
|
filter?: object
|
|
) => {
|
|
let error = null;
|
|
|
|
const searchParams = new URLSearchParams();
|
|
|
|
searchParams.append('page', `${page}`);
|
|
|
|
if (filter) {
|
|
Object.entries(filter).forEach(([key, value]) => {
|
|
if (value !== undefined && value !== null) {
|
|
searchParams.append(key, value.toString());
|
|
}
|
|
});
|
|
}
|
|
|
|
const res = await fetch(
|
|
`${WEBUI_API_BASE_URL}/chats/list/user/${userId}?${searchParams.toString()}`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
}
|
|
)
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res.map((chat) => ({
|
|
...chat,
|
|
time_range: getTimeRange(chat.updated_at)
|
|
}));
|
|
};
|
|
|
|
export const getArchivedChatList = async (
|
|
token: string = '',
|
|
page: number = 1,
|
|
filter?: object
|
|
) => {
|
|
let error = null;
|
|
|
|
const searchParams = new URLSearchParams();
|
|
searchParams.append('page', `${page}`);
|
|
|
|
if (filter) {
|
|
Object.entries(filter).forEach(([key, value]) => {
|
|
if (value !== undefined && value !== null) {
|
|
searchParams.append(key, value.toString());
|
|
}
|
|
});
|
|
}
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/archived?${searchParams.toString()}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res.map((chat) => ({
|
|
...chat,
|
|
time_range: getTimeRange(chat.updated_at)
|
|
}));
|
|
};
|
|
|
|
export const getAllChats = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/all`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getChatListBySearchText = async (token: string, text: string, page: number = 1) => {
|
|
let error = null;
|
|
|
|
const searchParams = new URLSearchParams();
|
|
searchParams.append('text', text);
|
|
searchParams.append('page', `${page}`);
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/search?${searchParams.toString()}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res.map((chat) => ({
|
|
...chat,
|
|
time_range: getTimeRange(chat.updated_at)
|
|
}));
|
|
};
|
|
|
|
export const getChatsByFolderId = async (token: string, folderId: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/folder/${folderId}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getChatListByFolderId = async (token: string, folderId: string, page: number = 1) => {
|
|
let error = null;
|
|
|
|
const searchParams = new URLSearchParams();
|
|
if (page !== null) {
|
|
searchParams.append('page', `${page}`);
|
|
}
|
|
|
|
const res = await fetch(
|
|
`${WEBUI_API_BASE_URL}/chats/folder/${folderId}/list?${searchParams.toString()}`,
|
|
{
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
}
|
|
)
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getAllArchivedChats = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/all/archived`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getAllUserChats = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/all/db`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getAllTags = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/all/tags`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getPinnedChatList = async (token: string = '') => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/pinned`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res.map((chat) => ({
|
|
...chat,
|
|
time_range: getTimeRange(chat.updated_at)
|
|
}));
|
|
};
|
|
|
|
export const getChatListByTagName = async (token: string = '', tagName: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/tags`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
},
|
|
body: JSON.stringify({
|
|
name: tagName
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res.map((chat) => ({
|
|
...chat,
|
|
time_range: getTimeRange(chat.updated_at)
|
|
}));
|
|
};
|
|
|
|
export const getChatById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err.detail;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getChatByShareId = async (token: string, share_id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/share/${share_id}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getChatPinnedStatusById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/pinned`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
if ('detail' in err) {
|
|
error = err.detail;
|
|
} else {
|
|
error = err;
|
|
}
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const toggleChatPinnedStatusById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/pin`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
if ('detail' in err) {
|
|
error = err.detail;
|
|
} else {
|
|
error = err;
|
|
}
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const cloneChatById = async (token: string, id: string, title?: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/clone`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
},
|
|
body: JSON.stringify({
|
|
...(title && { title: title })
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
if ('detail' in err) {
|
|
error = err.detail;
|
|
} else {
|
|
error = err;
|
|
}
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const cloneSharedChatById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/clone/shared`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
if ('detail' in err) {
|
|
error = err.detail;
|
|
} else {
|
|
error = err;
|
|
}
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const shareChatById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/share`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const updateChatFolderIdById = async (token: string, id: string, folderId?: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/folder`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
},
|
|
body: JSON.stringify({
|
|
folder_id: folderId
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const archiveChatById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/archive`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const deleteSharedChatById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/share`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const updateChatById = async (token: string, id: string, chat: object) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
},
|
|
body: JSON.stringify({
|
|
chat: chat
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const deleteChatById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err.detail;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const getTagsById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/tags`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const addTagById = async (token: string, id: string, tagName: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/tags`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
},
|
|
body: JSON.stringify({
|
|
name: tagName
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err.detail;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const deleteTagById = async (token: string, id: string, tagName: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/tags`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
},
|
|
body: JSON.stringify({
|
|
name: tagName
|
|
})
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
export const deleteTagsById = async (token: string, id: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/tags/all`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const deleteAllChats = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err.detail;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const archiveAllChats = async (token: string) => {
|
|
let error = null;
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/archive/all`, {
|
|
method: 'POST',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err.detail;
|
|
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
export const exportChatStats = async (token: string, page: number = 1, params: object = {}) => {
|
|
let error = null;
|
|
|
|
const searchParams = new URLSearchParams();
|
|
searchParams.append('page', `${page}`);
|
|
|
|
if (params) {
|
|
for (const [key, value] of Object.entries(params)) {
|
|
searchParams.append(key, `${value}`);
|
|
}
|
|
}
|
|
|
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/stats/export?${searchParams.toString()}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
...(token && { authorization: `Bearer ${token}` })
|
|
}
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.ok) throw await res.json();
|
|
return res.json();
|
|
})
|
|
.then((json) => {
|
|
return json;
|
|
})
|
|
.catch((err) => {
|
|
error = err;
|
|
console.error(err);
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
export const downloadChatStats = async (
|
|
token: string = '',
|
|
chat_id: string | null = null,
|
|
start_time: number | null = null,
|
|
end_time: number | null = null
|
|
): Promise<[Response | null, AbortController]> => {
|
|
const controller = new AbortController();
|
|
let error = null;
|
|
|
|
let url = `${WEBUI_API_BASE_URL}/chats/stats/export?stream=true`;
|
|
if (chat_id) url += `&chat_id=${chat_id}`;
|
|
if (start_time) url += `&start_time=${start_time}`;
|
|
if (end_time) url += `&end_time=${end_time}`;
|
|
|
|
const res = await fetch(url, {
|
|
signal: controller.signal,
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${token}`
|
|
}
|
|
}).catch((err) => {
|
|
console.error(err);
|
|
error = err;
|
|
return null;
|
|
});
|
|
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
|
|
return [res, controller];
|
|
};
|