import { WEBUI_API_BASE_URL } from '$lib/constants'; export const createNewKnowledge = async ( token: string, name: string, description: string, accessGrants: object[] ) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/create`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ name: name, description: description, access_grants: accessGrants }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; export const getKnowledgeBases = async (token: string = '', page: number | null = null) => { let error = null; const searchParams = new URLSearchParams(); if (page) searchParams.append('page', page.toString()); const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 searchKnowledgeBases = async ( token: string = '', query: string | null = null, viewOption: string | null = null, page: number | null = null ) => { let error = null; const searchParams = new URLSearchParams(); if (query) searchParams.append('query', query); if (viewOption) searchParams.append('view_option', viewOption); if (page) searchParams.append('page', page.toString()); const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/search?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 searchKnowledgeFiles = async ( token: string, query?: string | null, viewOption?: string | null, orderBy?: string | null, direction?: string | null, page: number = 1, includeContent: boolean = false ) => { let error = null; const searchParams = new URLSearchParams(); if (query) searchParams.append('query', query); if (viewOption) searchParams.append('view_option', viewOption); if (orderBy) searchParams.append('order_by', orderBy); if (direction) searchParams.append('direction', direction); searchParams.append('page', page.toString()); if (includeContent) searchParams.append('include_content', 'true'); const res = await fetch( `${WEBUI_API_BASE_URL}/knowledge/search/files?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 getKnowledgeById = async (token: string, id: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 searchKnowledgeFilesById = async ( token: string, id: string, query?: string | null, viewOption?: string | null, orderBy?: string | null, direction?: string | null, page: number = 1, directoryId?: string | null, includeContent: boolean = false ) => { let error = null; const searchParams = new URLSearchParams(); if (query) searchParams.append('query', query); if (viewOption) searchParams.append('view_option', viewOption); if (orderBy) searchParams.append('order_by', orderBy); if (direction) searchParams.append('direction', direction); searchParams.append('page', page.toString()); // directoryId: undefined = don't filter, null = root, string = specific dir if (directoryId !== undefined) { searchParams.append('directory_id', directoryId ?? ''); } if (includeContent) searchParams.append('include_content', 'true'); const res = await fetch( `${WEBUI_API_BASE_URL}/knowledge/${id}/files?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 getPendingKnowledgeFiles = async (token: string, id: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/files/pending`, { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return []; }); if (error) { throw error; } return res; }; export const streamPendingKnowledgeFiles = async (token: string, id: string) => { const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/files/pending?stream=true`, { method: 'GET', headers: { Accept: 'text/event-stream', authorization: `Bearer ${token}` } }); if (!res.ok) { throw new Error('Failed to stream pending files'); } return res; }; type KnowledgeUpdateForm = { name?: string; description?: string; data?: object; access_grants?: object[]; }; export const updateKnowledgeById = async (token: string, id: string, form: KnowledgeUpdateForm) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/update`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ name: form?.name ? form.name : undefined, description: form?.description ? form.description : undefined, data: form?.data ? form.data : undefined, access_grants: form.access_grants }) }) .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 updateKnowledgeAccessGrants = async ( token: string, id: string, accessGrants: any[] ) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/access/update`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ access_grants: accessGrants }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; export const addFileToKnowledgeById = async ( token: string, id: string, fileId: string, directoryId?: string | null ) => { let error = null; const body: Record = { file_id: fileId }; if (directoryId) body.directory_id = directoryId; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/file/add`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify(body) }) .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 updateFileFromKnowledgeById = async (token: string, id: string, fileId: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/file/update`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ file_id: fileId }) }) .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 removeFileFromKnowledgeById = async (token: string, id: string, fileId: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/file/remove`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ file_id: fileId }) }) .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 resetKnowledgeById = async (token: string, id: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/reset`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 syncKnowledgeDiff = async ( token: string, id: string, manifest: Array<{ filename: string; path: string; checksum: string; size: number }> ) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/sync/diff`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ manifest }) }) .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 syncKnowledgeCleanup = async ( token: string, id: string, fileIds: string[], dirIds: string[] = [] ) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/sync/cleanup`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ file_ids: fileIds, dir_ids: dirIds }) }) .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 deleteKnowledgeById = async (token: string, id: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/delete`, { method: 'DELETE', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 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 reindexKnowledgeFiles = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/reindex`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; export const exportKnowledgeById = async (token: string, id: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/export`, { method: 'GET', headers: { authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.blob(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; // ── Directory API ─────────────────────────────────────────────────── export const createKnowledgeDirectory = async ( token: string, id: string, name: string, parentId?: string | null ) => { let error = null; const body: Record = { name }; if (parentId) body.parent_id = parentId; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/dirs/create`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify(body) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; export const updateKnowledgeDirectory = async ( token: string, id: string, dirId: string, form: { name?: string; parent_id?: string | null } ) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/dirs/${dirId}/update`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify(form) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; export const deleteKnowledgeDirectory = async ( token: string, id: string, dirId: string, moveFiles: boolean = true ) => { let error = null; const searchParams = new URLSearchParams(); searchParams.append('move_files', moveFiles.toString()); const res = await fetch( `${WEBUI_API_BASE_URL}/knowledge/${id}/dirs/${dirId}/delete?${searchParams.toString()}`, { method: 'DELETE', headers: { Accept: 'application/json', authorization: `Bearer ${token}` } } ) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; }; export const moveFileInKnowledge = async ( token: string, id: string, fileId: string, directoryId?: string | null ) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/${id}/file/move`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, body: JSON.stringify({ file_id: fileId, directory_id: directoryId ?? null }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { error = err.detail; console.error(err); return null; }); if (error) { throw error; } return res; };