mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2024-11-13 02:00:10 +01:00
Add ability for owner to reset just the workspace vector DB (#1094)
* Add ability for owner to reset just the workspace vector DB * explicit border none
This commit is contained in:
parent
102689a77a
commit
a8e731f548
@ -173,6 +173,14 @@ const Workspace = {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
wipeVectorDb: async function (slug) {
|
||||||
|
return await fetch(`${API_BASE}/workspace/${slug}/reset-vector-db`, {
|
||||||
|
method: "DELETE",
|
||||||
|
headers: baseHeaders(),
|
||||||
|
})
|
||||||
|
.then((res) => res.ok)
|
||||||
|
.catch(() => false);
|
||||||
|
},
|
||||||
uploadFile: async function (slug, formData) {
|
uploadFile: async function (slug, formData) {
|
||||||
const response = await fetch(`${API_BASE}/workspace/${slug}/upload`, {
|
const response = await fetch(`${API_BASE}/workspace/${slug}/upload`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
import { useState } from "react";
|
||||||
|
import Workspace from "@/models/workspace";
|
||||||
|
import showToast from "@/utils/toast";
|
||||||
|
|
||||||
|
export default function ResetDatabase({ workspace }) {
|
||||||
|
const [deleting, setDeleting] = useState(false);
|
||||||
|
|
||||||
|
const resetVectorDatabase = async () => {
|
||||||
|
if (
|
||||||
|
!window.confirm(
|
||||||
|
`You are about to reset this workspace's vector database. This will remove all vector embeddings currently embedded.\n\nThe original source files will remain untouched. This action is irreversible.`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
setDeleting(true);
|
||||||
|
const success = await Workspace.wipeVectorDb(workspace.slug);
|
||||||
|
if (!success) {
|
||||||
|
showToast("Workspace vector database could not be reset!", "error", {
|
||||||
|
clear: true,
|
||||||
|
});
|
||||||
|
setDeleting(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
showToast("Workspace vector database was reset!", "success", {
|
||||||
|
clear: true,
|
||||||
|
});
|
||||||
|
setDeleting(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
disabled={deleting}
|
||||||
|
onClick={resetVectorDatabase}
|
||||||
|
type="button"
|
||||||
|
className="border-none w-fit transition-all duration-300 border border-transparent rounded-lg whitespace-nowrap text-sm px-5 py-2.5 focus:z-10 bg-red-500/25 text-red-200 hover:text-white hover:bg-red-600 disabled:bg-red-600 disabled:text-red-200 disabled:animate-pulse"
|
||||||
|
>
|
||||||
|
{deleting ? "Clearing vectors..." : "Reset Workspace Vector Database"}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
@ -5,6 +5,7 @@ import { useRef, useState } from "react";
|
|||||||
import VectorDBIdentifier from "./VectorDBIdentifier";
|
import VectorDBIdentifier from "./VectorDBIdentifier";
|
||||||
import MaxContextSnippets from "./MaxContextSnippets";
|
import MaxContextSnippets from "./MaxContextSnippets";
|
||||||
import DocumentSimilarityThreshold from "./DocumentSimilarityThreshold";
|
import DocumentSimilarityThreshold from "./DocumentSimilarityThreshold";
|
||||||
|
import ResetDatabase from "./ResetDatabase";
|
||||||
|
|
||||||
export default function VectorDatabase({ workspace }) {
|
export default function VectorDatabase({ workspace }) {
|
||||||
const [hasChanges, setHasChanges] = useState(false);
|
const [hasChanges, setHasChanges] = useState(false);
|
||||||
@ -43,6 +44,7 @@ export default function VectorDatabase({ workspace }) {
|
|||||||
workspace={workspace}
|
workspace={workspace}
|
||||||
setHasChanges={setHasChanges}
|
setHasChanges={setHasChanges}
|
||||||
/>
|
/>
|
||||||
|
<ResetDatabase workspace={workspace} />
|
||||||
{hasChanges && (
|
{hasChanges && (
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
|
@ -266,6 +266,47 @@ function workspaceEndpoints(app) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
app.delete(
|
||||||
|
"/workspace/:slug/reset-vector-db",
|
||||||
|
[validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],
|
||||||
|
async (request, response) => {
|
||||||
|
try {
|
||||||
|
const { slug = "" } = request.params;
|
||||||
|
const user = await userFromSession(request, response);
|
||||||
|
const VectorDb = getVectorDbClass();
|
||||||
|
const workspace = multiUserMode(response)
|
||||||
|
? await Workspace.getWithUser(user, { slug })
|
||||||
|
: await Workspace.get({ slug });
|
||||||
|
|
||||||
|
if (!workspace) {
|
||||||
|
response.sendStatus(400).end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await DocumentVectors.deleteForWorkspace(workspace.id);
|
||||||
|
await Document.delete({ workspaceId: Number(workspace.id) });
|
||||||
|
|
||||||
|
await EventLogs.logEvent(
|
||||||
|
"workspace_vectors_reset",
|
||||||
|
{
|
||||||
|
workspaceName: workspace?.name || "Unknown Workspace",
|
||||||
|
},
|
||||||
|
response.locals?.user?.id
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await VectorDb["delete-namespace"]({ namespace: slug });
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e.message);
|
||||||
|
}
|
||||||
|
response.sendStatus(200).end();
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.message, e);
|
||||||
|
response.sendStatus(500).end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
app.get(
|
app.get(
|
||||||
"/workspaces",
|
"/workspaces",
|
||||||
[validatedRequest, flexUserRoleValid([ROLES.all])],
|
[validatedRequest, flexUserRoleValid([ROLES.all])],
|
||||||
|
Loading…
Reference in New Issue
Block a user