From d8ca92df884c124bd0e9d7a70b3ebdecd8082263 Mon Sep 17 00:00:00 2001 From: Timothy Carambat <rambat1010@gmail.com> Date: Thu, 4 Jan 2024 15:54:31 -0800 Subject: [PATCH] Onboarding V2 (#502) * WIP onboarding v2 * Welcome screen for onboarding complete * fix home page and WIP create skeleton for llm preference search/options * render llms as options * add search functionality to llm preference & add survey step * fix openai settings undefined & create custom logo onboarding page * add user setup UI * add data handling & privacy onboarding screen * add create workspace onboarding screen * fix survey width in onboarding * create vector database connection onboarding page * add workspace image & all skeleton ui complete * fix navigation buttons and ui tweaks to fit on screen * WIP LLMPreference * LLM Preference screen fully functional * create components for vector db options and fix styling of azure options * remove unneeded comment * vector db connection onboarding screen complete * minor ui tweak to searchbar * user setup page fully working * create workspace onboarding page fully working * useNavigate for navigation between pages * mobile layout, cleanup old files, survey functionality implemented * fix default logo appearing when should be blank & password setup bug fix * Modify flow of onboarding todo: embedding set up * Add embedder setup screen & insert into flow * update embedding back button auto-dismiss toasts on each step * move page defs under imports fix bg color on mobile styling --------- Co-authored-by: shatfield4 <seanhatfield5@gmail.com> --- frontend/src/App.jsx | 1 + .../AzureAiOptions/index.jsx | 94 ++--- .../LocalAiOptions/index.jsx | 120 +++---- .../OpenAiOptions/index.jsx | 60 ++-- .../LLMSelection/AzureAiOptions/index.jsx | 163 +++++---- .../LLMSelection/OpenAiOptions/index.jsx | 8 +- .../src/components/PrivateRoute/index.jsx | 4 +- .../ChromaDBOptions/index.jsx | 51 +++ .../LanceDBOptions/index.jsx | 9 + .../PineconeDBOptions/index.jsx | 55 +++ .../QDrantDBOptions/index.jsx | 38 ++ .../WeaviateDBOptions/index.jsx | 38 ++ .../media/illustrations/create-workspace.png | Bin 0 -> 18405 bytes .../Steps/AppearanceSetup/index.jsx | 145 -------- .../Steps/CreateFirstWorkspace/index.jsx | 68 ---- .../Steps/EmbeddingSelection/index.jsx | 136 ------- .../Steps/LLMSelection/index.jsx | 183 ---------- .../Steps/MultiUserSetup/index.jsx | 117 ------ .../Steps/PasswordProtection/index.jsx | 103 ------ .../Steps/UserModeSelection/index.jsx | 47 --- .../Steps/UserQuestionnaire/index.jsx | 240 ------------- .../Steps/VectorDatabaseConnection/index.jsx | 310 ---------------- .../OnboardingFlow/OnboardingModal/index.jsx | 136 ------- .../Steps/CreateWorkspace/index.jsx | 99 ++++++ .../OnboardingFlow/Steps/CustomLogo/index.jsx | 136 +++++++ .../Steps/DataHandling/index.jsx | 52 ++- .../EmbeddingPreference/EmbedderItem.jsx | 39 ++ .../Steps/EmbeddingPreference/index.jsx | 180 ++++++++++ .../pages/OnboardingFlow/Steps/Home/index.jsx | 41 +++ .../OnboardingFlow/Steps/Home/l_group.png | Bin 0 -> 74247 bytes .../OnboardingFlow/Steps/Home/r_group.png | Bin 0 -> 81768 bytes .../Steps/LLMPreference/LLMItem.jsx | 39 ++ .../Steps/LLMPreference/index.jsx | 211 +++++++++++ .../OnboardingFlow/Steps/Survey/index.jsx | 297 ++++++++++++++++ .../OnboardingFlow/Steps/UserSetup/index.jsx | 336 ++++++++++++++++++ .../VectorDatabaseItem.jsx | 37 ++ .../Steps/VectorDatabaseConnection/index.jsx | 182 ++++++++++ .../src/pages/OnboardingFlow/Steps/index.jsx | 130 +++++++ frontend/src/pages/OnboardingFlow/index.jsx | 66 +--- frontend/src/utils/paths.js | 30 +- server/prisma/seed.js | 13 +- 41 files changed, 2223 insertions(+), 1791 deletions(-) create mode 100644 frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx create mode 100644 frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx create mode 100644 frontend/src/media/illustrations/create-workspace.png delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/AppearanceSetup/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/VectorDatabaseConnection/index.jsx delete mode 100644 frontend/src/pages/OnboardingFlow/OnboardingModal/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/CreateWorkspace/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/CustomLogo/index.jsx rename frontend/src/pages/OnboardingFlow/{OnboardingModal => }/Steps/DataHandling/index.jsx (87%) create mode 100644 frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/EmbedderItem.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Home/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Home/l_group.png create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Home/r_group.png create mode 100644 frontend/src/pages/OnboardingFlow/Steps/LLMPreference/LLMItem.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/Survey/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/UserSetup/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/VectorDatabaseItem.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx create mode 100644 frontend/src/pages/OnboardingFlow/Steps/index.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7224f2e9c..8007b5ad1 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -120,6 +120,7 @@ export default function App() { {/* Onboarding Flow */} <Route path="/onboarding" element={<OnboardingFlow />} /> + <Route path="/onboarding/:step" element={<OnboardingFlow />} /> </Routes> <ToastContainer /> </PfpProvider> diff --git a/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx b/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx index e7767900a..c782c51f3 100644 --- a/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx +++ b/frontend/src/components/EmbeddingSelection/AzureAiOptions/index.jsx @@ -1,53 +1,55 @@ export default function AzureAiOptions({ settings }) { return ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Azure Service Endpoint - </label> - <input - type="url" - name="AzureOpenAiEndpoint" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="https://my-azure.openai.azure.com" - defaultValue={settings?.AzureOpenAiEndpoint} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Azure Service Endpoint + </label> + <input + type="url" + name="AzureOpenAiEndpoint" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="https://my-azure.openai.azure.com" + defaultValue={settings?.AzureOpenAiEndpoint} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Key - </label> - <input - type="password" - name="AzureOpenAiKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="Azure OpenAI API Key" - defaultValue={settings?.AzureOpenAiKey ? "*".repeat(20) : ""} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Key + </label> + <input + type="password" + name="AzureOpenAiKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="Azure OpenAI API Key" + defaultValue={settings?.AzureOpenAiKey ? "*".repeat(20) : ""} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Embedding Deployment Name - </label> - <input - type="text" - name="AzureOpenAiEmbeddingModelPref" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="Azure OpenAI embedding model deployment name" - defaultValue={settings?.AzureOpenAiEmbeddingModelPref} - required={true} - autoComplete="off" - spellCheck={false} - /> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Embedding Deployment Name + </label> + <input + type="text" + name="AzureOpenAiEmbeddingModelPref" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="Azure OpenAI embedding model deployment name" + defaultValue={settings?.AzureOpenAiEmbeddingModelPref} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> </div> - </> + </div> ); } diff --git a/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx b/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx index 2b976e142..6f81712c1 100644 --- a/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx +++ b/frontend/src/components/EmbeddingSelection/LocalAiOptions/index.jsx @@ -10,72 +10,72 @@ export default function LocalAiOptions({ settings }) { const [apiKey, setApiKey] = useState(settings?.LocalAiApiKey); return ( - <> + <div className="w-full flex flex-col gap-y-4"> <div className="w-full flex items-center gap-4"> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - LocalAI Base URL - </label> - <input - type="url" - name="EmbeddingBasePath" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="http://localhost:8080/v1" - defaultValue={settings?.EmbeddingBasePath} - onChange={(e) => setBasePathValue(e.target.value)} - onBlur={() => setBasePath(basePathValue)} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - <LocalAIModelSelection - settings={settings} - apiKey={apiKey} - basePath={basePath} - /> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Max embedding chunk length - </label> - <input - type="number" - name="EmbeddingModelMaxChunkLength" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="1000" - min={1} - onScroll={(e) => e.target.blur()} - defaultValue={settings?.EmbeddingModelMaxChunkLength} - required={false} - autoComplete="off" - /> - </div> - </div> - <div className="w-full flex items-center gap-4"> - <div className="flex flex-col w-60"> - <div className="flex flex-col gap-y-1 mb-4"> - <label className="text-white text-sm font-semibold block"> - Local AI API Key + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + LocalAI Base URL </label> - <p className="text-xs italic text-white/60"> - optional API key to use if running LocalAI with API keys. - </p> + <input + type="url" + name="EmbeddingBasePath" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="http://localhost:8080/v1" + defaultValue={settings?.EmbeddingBasePath} + onChange={(e) => setBasePathValue(e.target.value)} + onBlur={() => setBasePath(basePathValue)} + required={true} + autoComplete="off" + spellCheck={false} + /> </div> - - <input - type="password" - name="LocalAiApiKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="sk-mysecretkey" - defaultValue={settings?.LocalAiApiKey ? "*".repeat(20) : ""} - autoComplete="off" - spellCheck={false} - onChange={(e) => setApiKeyValue(e.target.value)} - onBlur={() => setApiKey(apiKeyValue)} + <LocalAIModelSelection + settings={settings} + apiKey={apiKey} + basePath={basePath} /> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Max embedding chunk length + </label> + <input + type="number" + name="EmbeddingModelMaxChunkLength" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="1000" + min={1} + onScroll={(e) => e.target.blur()} + defaultValue={settings?.EmbeddingModelMaxChunkLength} + required={false} + autoComplete="off" + /> + </div> + </div> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <div className="flex flex-col gap-y-1 mb-4"> + <label className="text-white text-sm font-semibold flex items-center gap-x-2"> + Local AI API Key{" "} + <p className="!text-xs !italic !font-thin">optional</p> + </label> + </div> + + <input + type="password" + name="LocalAiApiKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="sk-mysecretkey" + defaultValue={settings?.LocalAiApiKey ? "*".repeat(20) : ""} + autoComplete="off" + spellCheck={false} + onChange={(e) => setApiKeyValue(e.target.value)} + onBlur={() => setApiKey(apiKeyValue)} + /> + </div> </div> </div> - </> + </div> ); } diff --git a/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx b/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx index f38f7c445..dd00d67ab 100644 --- a/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx +++ b/frontend/src/components/EmbeddingSelection/OpenAiOptions/index.jsx @@ -1,34 +1,36 @@ export default function OpenAiOptions({ settings }) { return ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Key - </label> - <input - type="password" - name="OpenAiKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="OpenAI API Key" - defaultValue={settings?.OpenAiKey ? "*".repeat(20) : ""} - required={true} - autoComplete="off" - spellCheck={false} - /> + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Key + </label> + <input + type="password" + name="OpenAiKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="OpenAI API Key" + defaultValue={settings?.OpenAiKey ? "*".repeat(20) : ""} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Model Preference + </label> + <select + disabled={true} + className="cursor-not-allowed bg-zinc-900 border border-gray-500 text-white text-sm rounded-lg block w-full p-2.5" + > + <option disabled={true} selected={true}> + text-embedding-ada-002 + </option> + </select> + </div> </div> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Model Preference - </label> - <select - disabled={true} - className="cursor-not-allowed bg-zinc-900 border border-gray-500 text-white text-sm rounded-lg block w-full p-2.5" - > - <option disabled={true} selected={true}> - text-embedding-ada-002 - </option> - </select> - </div> - </> + </div> ); } diff --git a/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx b/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx index 297865101..ce54d3d60 100644 --- a/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx +++ b/frontend/src/components/LLMSelection/AzureAiOptions/index.jsx @@ -1,87 +1,92 @@ export default function AzureAiOptions({ settings }) { return ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Azure Service Endpoint - </label> - <input - type="url" - name="AzureOpenAiEndpoint" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="https://my-azure.openai.azure.com" - defaultValue={settings?.AzureOpenAiEndpoint} - required={true} - autoComplete="off" - spellCheck={false} - /> + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Azure Service Endpoint + </label> + <input + type="url" + name="AzureOpenAiEndpoint" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="https://my-azure.openai.azure.com" + defaultValue={settings?.AzureOpenAiEndpoint} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Key + </label> + <input + type="password" + name="AzureOpenAiKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="Azure OpenAI API Key" + defaultValue={settings?.AzureOpenAiKey ? "*".repeat(20) : ""} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Chat Deployment Name + </label> + <input + type="text" + name="AzureOpenAiModelPref" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="Azure OpenAI chat model deployment name" + defaultValue={settings?.AzureOpenAiModelPref} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> </div> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Key - </label> - <input - type="password" - name="AzureOpenAiKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="Azure OpenAI API Key" - defaultValue={settings?.AzureOpenAiKey ? "*".repeat(20) : ""} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Chat Model Token Limit + </label> + <select + name="AzureOpenAiTokenLimit" + defaultValue={settings?.AzureOpenAiTokenLimit || 4096} + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + required={true} + > + <option value={4096}>4,096 (gpt-3.5-turbo)</option> + <option value={16384}>16,384 (gpt-3.5-16k)</option> + <option value={8192}>8,192 (gpt-4)</option> + <option value={32768}>32,768 (gpt-4-32k)</option> + <option value={128000}>128,000 (gpt-4-turbo)</option> + </select> + </div> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Chat Deployment Name - </label> - <input - type="text" - name="AzureOpenAiModelPref" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="Azure OpenAI chat model deployment name" - defaultValue={settings?.AzureOpenAiModelPref} - required={true} - autoComplete="off" - spellCheck={false} - /> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Embedding Deployment Name + </label> + <input + type="text" + name="AzureOpenAiEmbeddingModelPref" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="Azure OpenAI embedding model deployment name" + defaultValue={settings?.AzureOpenAiEmbeddingModelPref} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + <div className="flex-flex-col w-60"></div> </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Chat Model Token Limit - </label> - <select - name="AzureOpenAiTokenLimit" - defaultValue={settings?.AzureOpenAiTokenLimit || 4096} - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - required={true} - > - <option value={4096}>4,096 (gpt-3.5-turbo)</option> - <option value={16384}>16,384 (gpt-3.5-16k)</option> - <option value={8192}>8,192 (gpt-4)</option> - <option value={32768}>32,768 (gpt-4-32k)</option> - <option value={128000}>128,000 (gpt-4-turbo)</option> - </select> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Embedding Deployment Name - </label> - <input - type="text" - name="AzureOpenAiEmbeddingModelPref" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="Azure OpenAI embedding model deployment name" - defaultValue={settings?.AzureOpenAiEmbeddingModelPref} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - </> + </div> ); } diff --git a/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx b/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx index fd2f87665..cbd83edb9 100644 --- a/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx +++ b/frontend/src/components/LLMSelection/OpenAiOptions/index.jsx @@ -6,7 +6,7 @@ export default function OpenAiOptions({ settings }) { const [openAIKey, setOpenAIKey] = useState(settings?.OpenAiKey); return ( - <> + <div className="flex gap-x-4"> <div className="flex flex-col w-60"> <label className="text-white text-sm font-semibold block mb-4"> API Key @@ -25,7 +25,7 @@ export default function OpenAiOptions({ settings }) { /> </div> <OpenAIModelSelection settings={settings} apiKey={openAIKey} /> - </> + </div> ); } @@ -87,7 +87,7 @@ function OpenAIModelSelection({ apiKey, settings }) { <option key={model} value={model} - selected={settings.OpenAiModelPref === model} + selected={settings?.OpenAiModelPref === model} > {model} </option> @@ -102,7 +102,7 @@ function OpenAIModelSelection({ apiKey, settings }) { <option key={model.id} value={model.id} - selected={settings.OpenAiModelPref === model.id} + selected={settings?.OpenAiModelPref === model.id} > {model.id} </option> diff --git a/frontend/src/components/PrivateRoute/index.jsx b/frontend/src/components/PrivateRoute/index.jsx index 464064632..165141bbb 100644 --- a/frontend/src/components/PrivateRoute/index.jsx +++ b/frontend/src/components/PrivateRoute/index.jsx @@ -89,7 +89,7 @@ export function AdminRoute({ Component }) { if (isAuthd === null) return <FullScreenLoader />; if (shouldRedirectToOnboarding) { - return <Navigate to={paths.onboarding()} />; + return <Navigate to={paths.onboarding.home()} />; } const user = userFromStorage(); @@ -110,7 +110,7 @@ export function ManagerRoute({ Component }) { if (isAuthd === null) return <FullScreenLoader />; if (shouldRedirectToOnboarding) { - return <Navigate to={paths.onboarding()} />; + return <Navigate to={paths.onboarding.home()} />; } const user = userFromStorage(); diff --git a/frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx new file mode 100644 index 000000000..ae7af68fb --- /dev/null +++ b/frontend/src/components/VectorDBSelection/ChromaDBOptions/index.jsx @@ -0,0 +1,51 @@ +export default function ChromaDBOptions({ settings }) { + return ( + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Chroma Endpoint + </label> + <input + type="url" + name="ChromaEndpoint" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="http://localhost:8000" + defaultValue={settings?.ChromaEndpoint} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Header + </label> + <input + name="ChromaApiHeader" + autoComplete="off" + type="text" + defaultValue={settings?.ChromaApiHeader} + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="X-Api-Key" + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Key + </label> + <input + name="ChromaApiKey" + autoComplete="off" + type="password" + defaultValue={settings?.ChromaApiKey ? "*".repeat(20) : ""} + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="sk-myApiKeyToAccessMyChromaInstance" + /> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx new file mode 100644 index 000000000..942a3666d --- /dev/null +++ b/frontend/src/components/VectorDBSelection/LanceDBOptions/index.jsx @@ -0,0 +1,9 @@ +export default function LanceDBOptions() { + return ( + <div className="w-full h-10 items-center justify-center flex"> + <p className="text-sm font-base text-white text-opacity-60"> + There is no configuration needed for LanceDB. + </p> + </div> + ); +} diff --git a/frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx new file mode 100644 index 000000000..5491f758c --- /dev/null +++ b/frontend/src/components/VectorDBSelection/PineconeDBOptions/index.jsx @@ -0,0 +1,55 @@ +export default function PineconeDBOptions({ settings }) { + return ( + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Pinecone DB API Key + </label> + <input + type="password" + name="PineConeKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="Pinecone API Key" + defaultValue={settings?.PineConeKey ? "*".repeat(20) : ""} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Pinecone Index Environment + </label> + <input + type="text" + name="PineConeEnvironment" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="us-gcp-west-1" + defaultValue={settings?.PineConeEnvironment} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Pinecone Index Name + </label> + <input + type="text" + name="PineConeIndex" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="my-index" + defaultValue={settings?.PineConeIndex} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx new file mode 100644 index 000000000..e1e9d90f6 --- /dev/null +++ b/frontend/src/components/VectorDBSelection/QDrantDBOptions/index.jsx @@ -0,0 +1,38 @@ +export default function QDrantDBOptions({ settings }) { + return ( + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + QDrant API Endpoint + </label> + <input + type="url" + name="QdrantEndpoint" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="http://localhost:6633" + defaultValue={settings?.QdrantEndpoint} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Key + </label> + <input + type="password" + name="QdrantApiKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="wOeqxsYP4....1244sba" + defaultValue={settings?.QdrantApiKey} + autoComplete="off" + spellCheck={false} + /> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx b/frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx new file mode 100644 index 000000000..5d7494ed1 --- /dev/null +++ b/frontend/src/components/VectorDBSelection/WeaviateDBOptions/index.jsx @@ -0,0 +1,38 @@ +export default function WeaviateDBOptions({ settings }) { + return ( + <div className="w-full flex flex-col gap-y-4"> + <div className="w-full flex items-center gap-4"> + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Weaviate Endpoint + </label> + <input + type="url" + name="WeaviateEndpoint" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="http://localhost:8080" + defaultValue={settings?.WeaviateEndpoint} + required={true} + autoComplete="off" + spellCheck={false} + /> + </div> + + <div className="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + API Key + </label> + <input + type="password" + name="WeaviateApiKey" + className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" + placeholder="sk-123Abcweaviate" + defaultValue={settings?.WeaviateApiKey} + autoComplete="off" + spellCheck={false} + /> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/media/illustrations/create-workspace.png b/frontend/src/media/illustrations/create-workspace.png new file mode 100644 index 0000000000000000000000000000000000000000..8e31174e5d1d7543adb75ec1ee7ec1ac6182944e GIT binary patch literal 18405 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 M07*qoM6N<$g0<u3rT_o{ literal 0 HcmV?d00001 diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/AppearanceSetup/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/AppearanceSetup/index.jsx deleted file mode 100644 index 30e87b0ac..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/AppearanceSetup/index.jsx +++ /dev/null @@ -1,145 +0,0 @@ -import React, { memo, useEffect, useState } from "react"; -import System from "@/models/system"; -import AnythingLLM from "@/media/logo/anything-llm.png"; -import useLogo from "@/hooks/useLogo"; -import { Plus } from "@phosphor-icons/react"; -import showToast from "@/utils/toast"; - -function AppearanceSetup({ prevStep, nextStep }) { - const { logo: _initLogo, setLogo: _setLogo } = useLogo(); - const [logo, setLogo] = useState(""); - const [isDefaultLogo, setIsDefaultLogo] = useState(true); - - useEffect(() => { - async function logoInit() { - setLogo(_initLogo || ""); - const _isDefaultLogo = await System.isDefaultLogo(); - setIsDefaultLogo(_isDefaultLogo); - } - logoInit(); - }, [_initLogo]); - - const handleFileUpload = async (event) => { - const file = event.target.files[0]; - if (!file) return false; - - const objectURL = URL.createObjectURL(file); - setLogo(objectURL); - - const formData = new FormData(); - formData.append("logo", file); - const { success, error } = await System.uploadLogo(formData); - if (!success) { - showToast(`Failed to upload logo: ${error}`, "error"); - setLogo(_initLogo); - return; - } - - const logoURL = await System.fetchLogo(); - _setLogo(logoURL); - - showToast("Image uploaded successfully.", "success"); - setIsDefaultLogo(false); - }; - - const handleRemoveLogo = async () => { - setLogo(""); - setIsDefaultLogo(true); - - const { success, error } = await System.removeCustomLogo(); - if (!success) { - console.error("Failed to remove logo:", error); - showToast(`Failed to remove logo: ${error}`, "error"); - const logoURL = await System.fetchLogo(); - setLogo(logoURL); - setIsDefaultLogo(false); - return; - } - - const logoURL = await System.fetchLogo(); - _setLogo(logoURL); - - showToast("Image successfully removed.", "success"); - }; - - return ( - <div className="w-full"> - <div className="flex flex-col w-full px-8 py-4"> - <div className="flex flex-col gap-y-2"> - <h2 className="text-white text-sm font-medium">Custom Logo</h2> - <p className="text-sm font-base text-white/60"> - Upload your custom logo to make your chatbot yours. - </p> - </div> - <div className="flex md:flex-row flex-col items-center"> - <img - src={logo} - alt="Uploaded Logo" - className="w-48 h-48 object-contain mr-6" - hidden={isDefaultLogo} - onError={(e) => (e.target.src = AnythingLLM)} - /> - <div className="flex flex-row gap-x-8"> - <label className="mt-5 hover:opacity-60" hidden={!isDefaultLogo}> - <input - id="logo-upload" - type="file" - accept="image/*" - className="hidden" - onChange={handleFileUpload} - /> - <div - className="w-80 py-4 bg-zinc-900/50 rounded-2xl border-2 border-dashed border-white border-opacity-60 justify-center items-center inline-flex cursor-pointer" - htmlFor="logo-upload" - > - <div className="flex flex-col items-center justify-center"> - <div className="rounded-full bg-white/40"> - <Plus className="w-6 h-6 text-black/80 m-2" /> - </div> - <div className="text-white text-opacity-80 text-sm font-semibold py-1"> - Add a custom logo - </div> - <div className="text-white text-opacity-60 text-xs font-medium py-1"> - Recommended size: 800 x 200 - </div> - </div> - </div> - </label> - <button - onClick={handleRemoveLogo} - className="text-white text-base font-medium hover:text-opacity-60" - > - Delete - </button> - </div> - </div> - </div> - <div className="flex w-full justify-between items-center px-6 py-4 space-x-6 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <div className="flex gap-2"> - <button - onClick={() => nextStep("user_mode_setup")} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Skip - </button> - <button - onClick={() => nextStep("user_mode_setup")} - type="button" - className="border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Continue - </button> - </div> - </div> - </div> - ); -} -export default memo(AppearanceSetup); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx deleted file mode 100644 index d2624ef6a..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/CreateFirstWorkspace/index.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { memo } from "react"; -import { useNavigate } from "react-router-dom"; -import paths from "@/utils/paths"; -import Workspace from "@/models/workspace"; - -function CreateFirstWorkspace({ prevStep }) { - const navigate = useNavigate(); - - const handleCreate = async (e) => { - e.preventDefault(); - const form = new FormData(e.target); - const { workspace, error } = await Workspace.new({ - name: form.get("name"), - onboardingComplete: true, - }); - if (!!workspace) { - navigate(paths.home()); - } else { - alert(error); - } - }; - - return ( - <div> - <form onSubmit={handleCreate} className="flex flex-col w-full"> - <div className="flex flex-col w-full md:px-8 py-12"> - <div className="space-y-6 flex h-full w-96"> - <div className="w-full flex flex-col gap-y-4"> - <div> - <label - htmlFor="name" - className="block mb-2 text-sm font-medium text-white" - > - Workspace name - </label> - <input - name="name" - type="text" - className="bg-zinc-900 border border-gray-500 text-white text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5" - placeholder="My workspace" - minLength={4} - required={true} - autoComplete="off" - /> - </div> - </div> - </div> - </div> - <div className="flex w-full justify-end items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <button - type="submit" - className="border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Finish - </button> - </div> - </form> - </div> - ); -} -export default memo(CreateFirstWorkspace); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx deleted file mode 100644 index 98e1262a0..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/EmbeddingSelection/index.jsx +++ /dev/null @@ -1,136 +0,0 @@ -import React, { memo, useEffect, useState } from "react"; -import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; -import OpenAiLogo from "@/media/llmprovider/openai.png"; -import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; -import LocalAiLogo from "@/media/llmprovider/localai.png"; -import System from "@/models/system"; -import PreLoader from "@/components/Preloader"; -import LLMProviderOption from "@/components/LLMSelection/LLMProviderOption"; -import OpenAiOptions from "@/components/EmbeddingSelection/OpenAiOptions"; -import AzureAiOptions from "@/components/EmbeddingSelection/AzureAiOptions"; -import LocalAiOptions from "@/components/EmbeddingSelection/LocalAiOptions"; -import NativeEmbeddingOptions from "@/components/EmbeddingSelection/NativeEmbeddingOptions"; - -function EmbeddingSelection({ nextStep, prevStep, currentStep }) { - const [embeddingChoice, setEmbeddingChoice] = useState("native"); - const [settings, setSettings] = useState(null); - const [loading, setLoading] = useState(true); - const updateChoice = (selection) => { - setEmbeddingChoice(selection); - }; - - useEffect(() => { - async function fetchKeys() { - const _settings = await System.keys(); - setSettings(_settings); - setEmbeddingChoice(_settings?.EmbeddingEngine || "native"); - setLoading(false); - } - fetchKeys(); - }, [currentStep]); - - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const data = {}; - const formData = new FormData(form); - for (var [key, value] of formData.entries()) data[key] = value; - const { error } = await System.updateSystem(data); - if (error) { - alert(`Failed to save LLM settings: ${error}`, "error"); - return; - } - nextStep("vector_database"); - return; - }; - - if (loading) - return ( - <div className="w-full h-full flex justify-center items-center p-20"> - <PreLoader /> - </div> - ); - - return ( - <div className="w-full"> - <form onSubmit={handleSubmit} className="flex flex-col w-full"> - <div className="flex flex-col w-full px-1 md:px-8 py-4"> - <div className="text-white text-sm font-medium pb-4"> - Embedding Provider - </div> - <div className="w-full flex md:flex-wrap overflow-x-scroll gap-4 max-w-[752px]"> - <input - hidden={true} - name="EmbeddingEngine" - value={embeddingChoice} - /> - <LLMProviderOption - name="AnythingLLM Embedder" - value="native" - description="Use the built-in embedding engine for AnythingLLM. Zero setup!" - checked={embeddingChoice === "native"} - image={AnythingLLMIcon} - onClick={updateChoice} - /> - <LLMProviderOption - name="OpenAI" - value="openai" - link="openai.com" - description="The standard option for most non-commercial use." - checked={embeddingChoice === "openai"} - image={OpenAiLogo} - onClick={updateChoice} - /> - <LLMProviderOption - name="Azure OpenAI" - value="azure" - link="azure.microsoft.com" - description="The enterprise option of OpenAI hosted on Azure services." - checked={embeddingChoice === "azure"} - image={AzureOpenAiLogo} - onClick={updateChoice} - /> - <LLMProviderOption - name="LocalAI" - value="localai" - link="localai.io" - description="Self hosted LocalAI embedding engine." - checked={embeddingChoice === "localai"} - image={LocalAiLogo} - onClick={updateChoice} - /> - </div> - <div className="mt-4 flex flex-wrap gap-4 max-w-[752px]"> - {embeddingChoice === "native" && <NativeEmbeddingOptions />} - {embeddingChoice === "openai" && ( - <OpenAiOptions settings={settings} /> - )} - {embeddingChoice === "azure" && ( - <AzureAiOptions settings={settings} /> - )} - {embeddingChoice === "localai" && ( - <LocalAiOptions settings={settings} /> - )} - </div> - </div> - <div className="flex w-full justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <button - type="submit" - className="border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Continue - </button> - </div> - </form> - </div> - ); -} - -export default memo(EmbeddingSelection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx deleted file mode 100644 index 850dea3c2..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/LLMSelection/index.jsx +++ /dev/null @@ -1,183 +0,0 @@ -import React, { memo, useEffect, useState } from "react"; -import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; -import OpenAiLogo from "@/media/llmprovider/openai.png"; -import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; -import AnthropicLogo from "@/media/llmprovider/anthropic.png"; -import GeminiLogo from "@/media/llmprovider/gemini.png"; -import OllamaLogo from "@/media/llmprovider/ollama.png"; -import LMStudioLogo from "@/media/llmprovider/lmstudio.png"; -import LocalAiLogo from "@/media/llmprovider/localai.png"; -import System from "@/models/system"; -import PreLoader from "@/components/Preloader"; -import LLMProviderOption from "@/components/LLMSelection/LLMProviderOption"; -import OpenAiOptions from "@/components/LLMSelection/OpenAiOptions"; -import AzureAiOptions from "@/components/LLMSelection/AzureAiOptions"; -import AnthropicAiOptions from "@/components/LLMSelection/AnthropicAiOptions"; -import LMStudioOptions from "@/components/LLMSelection/LMStudioOptions"; -import LocalAiOptions from "@/components/LLMSelection/LocalAiOptions"; -import NativeLLMOptions from "@/components/LLMSelection/NativeLLMOptions"; -import GeminiLLMOptions from "@/components/LLMSelection/GeminiLLMOptions"; -import OllamaLLMOptions from "@/components/LLMSelection/OllamaLLMOptions"; - -function LLMSelection({ nextStep, prevStep, currentStep }) { - const [llmChoice, setLLMChoice] = useState("openai"); - const [settings, setSettings] = useState(null); - const [loading, setLoading] = useState(true); - - const updateLLMChoice = (selection) => { - setLLMChoice(selection); - }; - - useEffect(() => { - async function fetchKeys() { - const _settings = await System.keys(); - setSettings(_settings); - setLLMChoice(_settings?.LLMProvider || "openai"); - setLoading(false); - } - - if (currentStep === "llm_preference") { - fetchKeys(); - } - }, []); - - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const data = {}; - const formData = new FormData(form); - for (var [key, value] of formData.entries()) data[key] = value; - const { error } = await System.updateSystem(data); - if (error) { - alert(`Failed to save LLM settings: ${error}`, "error"); - return; - } - nextStep("embedding_preferences"); - }; - - if (loading) - return ( - <div className="w-full h-full flex justify-center items-center p-20"> - <PreLoader /> - </div> - ); - - return ( - <div> - <form onSubmit={handleSubmit} className="flex flex-col w-full"> - <div className="flex flex-col w-full px-1 md:px-8 py-4"> - <div className="text-white text-sm font-medium pb-4"> - LLM Providers - </div> - <div className="w-full flex md:flex-wrap overflow-x-scroll gap-4 max-w-[752px]"> - <input hidden={true} name="LLMProvider" value={llmChoice} /> - <LLMProviderOption - name="OpenAI" - value="openai" - link="openai.com" - description="The standard option for most non-commercial use." - checked={llmChoice === "openai"} - image={OpenAiLogo} - onClick={updateLLMChoice} - /> - <LLMProviderOption - name="Azure OpenAI" - value="azure" - link="azure.microsoft.com" - description="The enterprise option of OpenAI hosted on Azure services." - checked={llmChoice === "azure"} - image={AzureOpenAiLogo} - onClick={updateLLMChoice} - /> - <LLMProviderOption - name="Anthropic Claude 2" - value="anthropic" - link="anthropic.com" - description="A friendly AI Assistant hosted by Anthropic. Provides chat services only!" - checked={llmChoice === "anthropic"} - image={AnthropicLogo} - onClick={updateLLMChoice} - /> - <LLMProviderOption - name="Google Gemini" - value="gemini" - link="ai.google.dev" - description="Google's largest and most capable AI model" - checked={llmChoice === "gemini"} - image={GeminiLogo} - onClick={updateLLMChoice} - /> - <LLMProviderOption - name="LM Studio" - value="lmstudio" - link="lmstudio.ai" - description="Discover, download, and run thousands of cutting edge LLMs in a few clicks." - checked={llmChoice === "lmstudio"} - image={LMStudioLogo} - onClick={updateLLMChoice} - /> - <LLMProviderOption - name="Local AI" - value="localai" - link="localai.io" - description="Run LLMs locally on your own machine." - checked={llmChoice === "localai"} - image={LocalAiLogo} - onClick={updateLLMChoice} - /> - <LLMProviderOption - name="Ollama" - value="ollama" - link="ollama.ai" - description="Run LLMs locally on your own machine." - checked={llmChoice === "ollama"} - image={OllamaLogo} - onClick={updateLLMChoice} - /> - {!window.location.hostname.includes("useanything.com") && ( - <LLMProviderOption - name="Custom Llama Model" - value="native" - description="Use a downloaded custom Llama model for chatting on this AnythingLLM instance." - checked={llmChoice === "native"} - image={AnythingLLMIcon} - onClick={updateLLMChoice} - /> - )} - </div> - <div className="mt-4 flex flex-wrap gap-4 max-w-[752px]"> - {llmChoice === "openai" && <OpenAiOptions settings={settings} />} - {llmChoice === "azure" && <AzureAiOptions settings={settings} />} - {llmChoice === "anthropic" && ( - <AnthropicAiOptions settings={settings} /> - )} - {llmChoice === "gemini" && <GeminiLLMOptions settings={settings} />} - {llmChoice === "lmstudio" && ( - <LMStudioOptions settings={settings} /> - )} - {llmChoice === "localai" && <LocalAiOptions settings={settings} />} - {llmChoice === "ollama" && <OllamaLLMOptions settings={settings} />} - {llmChoice === "native" && <NativeLLMOptions settings={settings} />} - </div> - </div> - <div className="flex w-full justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <button - type="submit" - className="border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Continue - </button> - </div> - </form> - </div> - ); -} - -export default memo(LLMSelection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx deleted file mode 100644 index 71310abfc..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/MultiUserSetup/index.jsx +++ /dev/null @@ -1,117 +0,0 @@ -import React, { useState, memo } from "react"; -import System from "@/models/system"; -import { AUTH_TIMESTAMP, AUTH_TOKEN, AUTH_USER } from "@/utils/constants"; -import debounce from "lodash.debounce"; - -// Multi-user mode step -function MultiUserSetup({ nextStep, prevStep }) { - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const formData = new FormData(form); - const data = { - username: formData.get("username"), - password: formData.get("password"), - }; - const { success, error } = await System.setupMultiUser(data); - if (!success) { - alert(error); - return; - } - - // Auto-request token with credentials that was just set so they - // are not redirected to login after completion. - const { user, token } = await System.requestToken(data); - window.localStorage.setItem(AUTH_USER, JSON.stringify(user)); - window.localStorage.setItem(AUTH_TOKEN, token); - window.localStorage.removeItem(AUTH_TIMESTAMP); - - nextStep("data_handling"); - }; - - const setNewUsername = (e) => setUsername(e.target.value); - const setNewPassword = (e) => setPassword(e.target.value); - const handleUsernameChange = debounce(setNewUsername, 500); - const handlePasswordChange = debounce(setNewPassword, 500); - return ( - <div> - <form onSubmit={handleSubmit}> - <div className="flex flex-col w-full md:px-8 py-4"> - <div className="space-y-6 flex h-full w-96"> - <div className="w-full flex flex-col gap-y-4"> - <div> - <label - htmlFor="name" - className="block mb-2 text-sm font-medium text-white" - > - Admin account username - </label> - <input - name="username" - type="text" - className="bg-zinc-900 border border-gray-500 text-white text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5" - placeholder="Your admin username" - minLength={6} - required={true} - autoComplete="off" - onChange={handleUsernameChange} - /> - </div> - <div> - <label - htmlFor="name" - className="block mb-2 text-sm font-medium text-white" - > - Admin account password - </label> - <input - name="password" - type="password" - className="bg-zinc-900 border border-gray-500 text-white text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5" - placeholder="Your admin password" - minLength={8} - required={true} - autoComplete="off" - onChange={handlePasswordChange} - /> - </div> - <p className="w-96 text-white text-opacity-80 text-xs font-base"> - Username must be at least 6 characters long. Password must be at - least 8 characters long. - </p> - </div> - </div> - </div> - <div className="flex w-full justify-between items-center px-6 py-4 space-x-6 border-t rounded-b border-gray-500/50"> - <div className="w-96 text-white text-opacity-80 text-xs font-base"> - By default, you will be the only admin. As an admin you will need to - create accounts for all new users or admins. Do not lose your - password as only admins can reset passwords. - </div> - <div className="flex gap-2"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <button - type="submit" - className="border px-4 py-2 rounded-lg text-sm items-center flex gap-x-2 - border-slate-200 text-slate-800 bg-slate-200 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow - disabled:border-gray-400 disabled:text-slate-800 disabled:bg-gray-400 disabled:cursor-not-allowed" - disabled={!(!!username && !!password)} - > - Continue - </button> - </div> - </div> - </form> - </div> - ); -} -export default memo(MultiUserSetup); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx deleted file mode 100644 index 4504288e6..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/PasswordProtection/index.jsx +++ /dev/null @@ -1,103 +0,0 @@ -import React, { memo, useState } from "react"; -import System from "@/models/system"; -import { AUTH_TIMESTAMP, AUTH_TOKEN, AUTH_USER } from "@/utils/constants"; -import debounce from "lodash.debounce"; - -function PasswordProtection({ nextStep, prevStep }) { - const [password, setPassword] = useState(""); - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const formData = new FormData(form); - const { error } = await System.updateSystemPassword({ - usePassword: true, - newPassword: formData.get("password"), - }); - - if (error) { - alert(`Failed to set password: ${error}`, "error"); - return; - } - - // Auto-request token with password that was just set so they - // are not redirected to login after completion. - const { token } = await System.requestToken({ - password: formData.get("password"), - }); - window.localStorage.removeItem(AUTH_USER); - window.localStorage.removeItem(AUTH_TIMESTAMP); - window.localStorage.setItem(AUTH_TOKEN, token); - - nextStep("data_handling"); - return; - }; - - const handleSkip = () => { - nextStep("data_handling"); - }; - - const setNewPassword = (e) => setPassword(e.target.value); - const handlePasswordChange = debounce(setNewPassword, 500); - return ( - <div className="w-full"> - <form className="flex flex-col w-full" onSubmit={handleSubmit}> - <div className="flex flex-col w-full px-1 md:px-8 py-4"> - <div className="w-full flex flex-col gap-y-2 my-5"> - <div className="w-80"> - <div className="flex flex-col mb-3 "> - <label - htmlFor="password" - className="block font-medium text-white" - > - New Password - </label> - <p className="text-slate-300 text-xs"> - must be at least 8 characters. - </p> - </div> - <input - onChange={handlePasswordChange} - name="password" - type="text" - className="bg-zinc-900 text-white text-sm rounded-lg focus:border-blue-500 block w-full p-2.5 placeholder-white placeholder-opacity-60 focus:ring-blue-500" - placeholder="Your Instance Password" - minLength={8} - required={true} - autoComplete="off" - /> - </div> - </div> - </div> - <div className="flex w-full justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - - <div className="flex gap-2"> - <button - onClick={handleSkip} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Skip - </button> - <button - type="submit" - disabled={!password} - className="border px-4 py-2 rounded-lg text-sm items-center flex gap-x-2 - border-slate-200 text-slate-800 bg-slate-200 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow - disabled:border-gray-400 disabled:text-slate-800 disabled:bg-gray-400 disabled:cursor-not-allowed" - > - Continue - </button> - </div> - </div> - </form> - </div> - ); -} -export default memo(PasswordProtection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx deleted file mode 100644 index b78c32533..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserModeSelection/index.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React, { memo } from "react"; - -// How many people will be using your instance step -function UserModeSelection({ nextStep, prevStep }) { - const justMeClicked = () => { - nextStep("password_protection"); - }; - - const myTeamClicked = () => { - nextStep("multi_user_mode"); - }; - - return ( - <div> - <div className="flex flex-col justify-center items-center px-20 py-14"> - <div className="w-80 text-white text-center text-2xl font-base"> - How many people will be using your instance? - </div> - <div className="flex gap-4 justify-center my-8"> - <button - onClick={justMeClicked} - className="transition-all duration-200 border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Just Me - </button> - <button - onClick={myTeamClicked} - className="transition-all duration-200 border border-slate-200 px-5 py-2.5 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - My Team - </button> - </div> - </div> - <div className="flex w-full justify-between items-center p-6 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar transition-all duration-300" - > - Back - </button> - </div> - </div> - ); -} - -export default memo(UserModeSelection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx deleted file mode 100644 index a0cb97fd7..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/UserQuestionnaire/index.jsx +++ /dev/null @@ -1,240 +0,0 @@ -import { COMPLETE_QUESTIONNAIRE } from "@/utils/constants"; -import paths from "@/utils/paths"; -import { CheckCircle, Circle } from "@phosphor-icons/react"; -import React, { memo } from "react"; - -async function sendQuestionnaire({ email, useCase, comment }) { - if (import.meta.env.DEV) return; - return fetch(`https://onboarding-wxich7363q-uc.a.run.app`, { - method: "POST", - body: JSON.stringify({ - email, - useCase, - comment, - sourceId: "0VRjqHh6Vukqi0x0Vd0n/m8JuT7k8nOz", - }), - }) - .then(() => { - window.localStorage.setItem(COMPLETE_QUESTIONNAIRE, true); - console.log(`✅ Questionnaire responses sent.`); - }) - .catch((error) => { - console.error(`sendQuestionnaire`, error.message); - }); -} - -function UserQuestionnaire({ nextStep, prevStep }) { - const handleSubmit = async (e) => { - e.preventDefault(); - const form = e.target; - const formData = new FormData(form); - nextStep("create_workspace"); - - await sendQuestionnaire({ - email: formData.get("email"), - useCase: formData.get("use_case") || "other", - comment: formData.get("comment") || null, - }); - return; - }; - - const handleSkip = () => { - nextStep("create_workspace"); - }; - - if (!!window?.localStorage?.getItem(COMPLETE_QUESTIONNAIRE)) { - return ( - <div className="w-full"> - <div className="w-full flex items-center justify-center px-1 md:px-8 py-4"> - <div className="w-auto flex flex-col gap-y-1 items-center"> - <CheckCircle size={60} className="text-green-500" /> - <p className="text-zinc-300">Thank you for your feedback!</p> - <a - href={paths.mailToMintplex()} - className="text-blue-400 underline text-xs" - > - team@mintplexlabs.com - </a> - </div> - </div> - - <div className="flex w-full justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - - <div className="flex gap-2"> - <button - onClick={handleSkip} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Skip - </button> - <button - type="submit" - className="border px-4 py-2 rounded-lg text-sm items-center flex gap-x-2 - border-slate-200 text-slate-800 bg-slate-200 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow - disabled:border-gray-400 disabled:text-slate-800 disabled:bg-gray-400 disabled:cursor-not-allowed" - > - Continue - </button> - </div> - </div> - </div> - ); - } - - return ( - <div className="w-full"> - <form className="flex flex-col w-full" onSubmit={handleSubmit}> - <div className="flex flex-col w-full px-1 md:px-8 py-4"> - <div className="w-full flex flex-col gap-y-2 my-5"> - <div className="w-80"> - <div className="flex flex-col mb-3 "> - <label htmlFor="email" className="block font-medium text-white"> - What is your email? - </label> - </div> - <input - name="email" - type="email" - className="bg-zinc-900 text-white text-sm rounded-lg focus:border-blue-500 block w-full p-2.5 placeholder-white placeholder-opacity-60 focus:ring-blue-500" - placeholder="you@gmail.com" - required={true} - autoComplete="off" - /> - </div> - </div> - - <div className="w-full flex flex-col gap-y-2 my-5"> - <div className="w-full"> - <div className="flex flex-col mb-3 "> - <label - htmlFor="use_case" - className="block font-medium text-white" - > - How are you planning to use AnythingLLM? - </label> - </div> - - <div className="flex flex-col gap-y-2"> - <div class="flex items-center ps-4 border border-zinc-400 rounded group radio-container hover:bg-blue-400/10"> - <input - id="bordered-radio-1" - type="radio" - value="business" - name="use_case" - class="sr-only peer" - /> - <Circle - weight="fill" - className="fill-transparent border border-gray-300 rounded-full peer-checked:fill-blue-500 peer-checked:border-none" - /> - <label - for="bordered-radio-1" - class="w-full py-4 ms-2 text-sm font-medium text-gray-300" - > - For my business - </label> - </div> - <div class="flex items-center ps-4 border border-zinc-400 rounded group radio-container hover:bg-blue-400/10"> - <input - id="bordered-radio-2" - type="radio" - value="personal" - name="use_case" - class="sr-only peer" - /> - <Circle - weight="fill" - className="fill-transparent border border-gray-300 rounded-full peer-checked:fill-blue-500 peer-checked:border-none" - /> - <label - for="bordered-radio-2" - class="w-full py-4 ms-2 text-sm font-medium text-gray-300" - > - For personal use - </label> - </div> - <div class="flex items-center ps-4 border border-zinc-400 rounded group radio-container hover:bg-blue-400/10"> - <input - id="bordered-radio-3" - type="radio" - value="other" - name="use_case" - class="sr-only peer" - /> - <Circle - weight="fill" - className="fill-transparent border border-gray-300 rounded-full peer-checked:fill-blue-500 peer-checked:border-none" - /> - <label - for="bordered-radio-3" - class="w-full py-4 ms-2 text-sm font-medium text-gray-300" - > - I'm not sure yet - </label> - </div> - </div> - </div> - </div> - - <div className="w-full flex flex-col gap-y-2 my-5"> - <div className="w-full"> - <div className="flex flex-col mb-3 "> - <label - htmlFor="comments" - className="block font-medium text-white" - > - Any comments for the team? - </label> - </div> - <textarea - name="comment" - rows={5} - className="bg-zinc-900 text-white text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5" - placeholder="If you have any questions or comments right now, you can leave them here and we will get back to you. You can also email team@mintplexlabs.com" - wrap="soft" - autoComplete="off" - /> - </div> - </div> - </div> - - <div className="flex w-full justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - - <div className="flex gap-2"> - <button - onClick={handleSkip} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Skip - </button> - <button - type="submit" - className="border px-4 py-2 rounded-lg text-sm items-center flex gap-x-2 - border-slate-200 text-slate-800 bg-slate-200 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow - disabled:border-gray-400 disabled:text-slate-800 disabled:bg-gray-400 disabled:cursor-not-allowed" - > - Continue - </button> - </div> - </div> - </form> - </div> - ); -} -export default memo(UserQuestionnaire); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/VectorDatabaseConnection/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/VectorDatabaseConnection/index.jsx deleted file mode 100644 index 16ee9aa53..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/VectorDatabaseConnection/index.jsx +++ /dev/null @@ -1,310 +0,0 @@ -import React, { memo, useEffect, useState } from "react"; - -import VectorDBOption from "@/components/VectorDBOption"; -import ChromaLogo from "@/media/vectordbs/chroma.png"; -import PineconeLogo from "@/media/vectordbs/pinecone.png"; -import LanceDbLogo from "@/media/vectordbs/lancedb.png"; -import WeaviateLogo from "@/media/vectordbs/weaviate.png"; -import QDrantLogo from "@/media/vectordbs/qdrant.png"; -import System from "@/models/system"; -import PreLoader from "@/components/Preloader"; - -function VectorDatabaseConnection({ nextStep, prevStep, currentStep }) { - const [vectorDB, setVectorDB] = useState("lancedb"); - const [settings, setSettings] = useState({}); - const [loading, setLoading] = useState(true); - - useEffect(() => { - async function fetchKeys() { - const _settings = await System.keys(); - setSettings(_settings); - setVectorDB(_settings?.VectorDB || "lancedb"); - setLoading(false); - } - if (currentStep === "vector_database") { - fetchKeys(); - } - }, [currentStep]); - - const updateVectorChoice = (selection) => { - setVectorDB(selection); - }; - - const handleSubmit = async (e, formElement) => { - e.preventDefault(); - const form = formElement || e.target; - const data = {}; - const formData = new FormData(form); - for (var [key, value] of formData.entries()) data[key] = value; - const { error } = await System.updateSystem(data); - if (error) { - alert(`Failed to save settings: ${error}`, "error"); - return; - } - nextStep("appearance"); - return; - }; - - if (loading) - return ( - <div className="w-full h-full flex justify-center items-center p-20"> - <PreLoader /> - </div> - ); - - return ( - <div> - <form onSubmit={handleSubmit} className="flex flex-col w-full"> - <div className="flex flex-col w-full px-1 md:px-8 py-4"> - <div className="text-white text-sm font-medium pb-4"> - Select your preferred vector database provider - </div> - <div className="w-full flex md:flex-wrap overflow-x-scroll gap-4 max-w-[752px]"> - <input hidden={true} name="VectorDB" value={vectorDB} /> - <VectorDBOption - name="Chroma" - value="chroma" - link="trychroma.com" - description="Open source vector database you can host yourself or on the cloud." - checked={vectorDB === "chroma"} - image={ChromaLogo} - onClick={updateVectorChoice} - /> - <VectorDBOption - name="Pinecone" - value="pinecone" - link="pinecone.io" - description="100% cloud-based vector database for enterprise use cases." - checked={vectorDB === "pinecone"} - image={PineconeLogo} - onClick={updateVectorChoice} - /> - <VectorDBOption - name="QDrant" - value="qdrant" - link="qdrant.tech" - description="Open source local and distributed cloud vector database." - checked={vectorDB === "qdrant"} - image={QDrantLogo} - onClick={updateVectorChoice} - /> - <VectorDBOption - name="Weaviate" - value="weaviate" - link="weaviate.io" - description="Open source local and cloud hosted multi-modal vector database." - checked={vectorDB === "weaviate"} - image={WeaviateLogo} - onClick={updateVectorChoice} - /> - <VectorDBOption - name="LanceDB" - value="lancedb" - link="lancedb.com" - description="100% local vector DB that runs on the same instance as AnythingLLM." - checked={vectorDB === "lancedb"} - image={LanceDbLogo} - onClick={updateVectorChoice} - /> - </div> - <div className="mt-4 flex flex-wrap gap-4 max-w-[752px]"> - {vectorDB === "pinecone" && ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Pinecone DB API Key - </label> - <input - type="password" - name="PineConeKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="Pinecone API Key" - defaultValue={settings?.PineConeKey ? "*".repeat(20) : ""} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Pinecone Index Environment - </label> - <input - type="text" - name="PineConeEnvironment" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="us-gcp-west-1" - defaultValue={settings?.PineConeEnvironment} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Pinecone Index Name - </label> - <input - type="text" - name="PineConeIndex" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="my-index" - defaultValue={settings?.PineConeIndex} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - </> - )} - - {vectorDB === "chroma" && ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Chroma Endpoint - </label> - <input - type="url" - name="ChromaEndpoint" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="http://localhost:8000" - defaultValue={settings?.ChromaEndpoint} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Header - </label> - <input - name="ChromaApiHeader" - autoComplete="off" - type="text" - defaultValue={settings?.ChromaApiHeader} - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="X-Api-Key" - /> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Key - </label> - <input - name="ChromaApiKey" - autoComplete="off" - type="password" - defaultValue={settings?.ChromaApiKey ? "*".repeat(20) : ""} - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="sk-myApiKeyToAccessMyChromaInstance" - /> - </div> - </> - )} - - {vectorDB === "lancedb" && ( - <div className="w-full h-10 items-center justify-center flex"> - <p className="text-sm font-base text-white text-opacity-60"> - There is no configuration needed for LanceDB. - </p> - </div> - )} - - {vectorDB === "qdrant" && ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - QDrant API Endpoint - </label> - <input - type="url" - name="QdrantEndpoint" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="http://localhost:6633" - defaultValue={settings?.QdrantEndpoint} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Key - </label> - <input - type="password" - name="QdrantApiKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="wOeqxsYP4....1244sba" - defaultValue={settings?.QdrantApiKey} - autoComplete="off" - spellCheck={false} - /> - </div> - </> - )} - - {vectorDB === "weaviate" && ( - <> - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - Weaviate Endpoint - </label> - <input - type="url" - name="WeaviateEndpoint" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="http://localhost:8080" - defaultValue={settings?.WeaviateEndpoint} - required={true} - autoComplete="off" - spellCheck={false} - /> - </div> - - <div className="flex flex-col w-60"> - <label className="text-white text-sm font-semibold block mb-4"> - API Key - </label> - <input - type="password" - name="WeaviateApiKey" - className="bg-zinc-900 text-white placeholder-white placeholder-opacity-60 text-sm rounded-lg focus:border-white block w-full p-2.5" - placeholder="sk-123Abcweaviate" - defaultValue={settings?.WeaviateApiKey} - autoComplete="off" - spellCheck={false} - /> - </div> - </> - )} - </div> - </div> - <div className="flex w-full justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <button - type="submit" - className="border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Continue - </button> - </div> - </form> - </div> - ); -} - -export default memo(VectorDatabaseConnection); diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/index.jsx b/frontend/src/pages/OnboardingFlow/OnboardingModal/index.jsx deleted file mode 100644 index 9815a7e80..000000000 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/index.jsx +++ /dev/null @@ -1,136 +0,0 @@ -import React, { useState } from "react"; -import { X } from "@phosphor-icons/react"; -import LLMSelection from "./Steps/LLMSelection"; -import VectorDatabaseConnection from "./Steps/VectorDatabaseConnection"; -import AppearanceSetup from "./Steps/AppearanceSetup"; -import UserModeSelection from "./Steps/UserModeSelection"; -import PasswordProtection from "./Steps/PasswordProtection"; -import MultiUserSetup from "./Steps/MultiUserSetup"; -import CreateFirstWorkspace from "./Steps/CreateFirstWorkspace"; -import EmbeddingSelection from "./Steps/EmbeddingSelection"; -import DataHandling from "./Steps/DataHandling"; -import UserQuestionnaire from "./Steps/UserQuestionnaire"; - -const DIALOG_ID = "onboarding-modal"; - -const STEPS = { - llm_preference: { - title: "LLM Preference", - description: - "These are the credentials and settings for your preferred LLM chat & embedding provider.", - component: LLMSelection, - }, - embedding_preferences: { - title: "Embedding Preference", - description: "Choose a provider for embedding files and text.", - component: EmbeddingSelection, - }, - vector_database: { - title: "Vector Database", - description: - "These are the credentials and settings for how your AnythingLLM instance will function.", - component: VectorDatabaseConnection, - }, - appearance: { - title: "Appearance", - description: - "Customize the appearance of your AnythingLLM instance.\nFind more customization options on the appearance settings page.", - component: AppearanceSetup, - }, - user_mode_setup: { - title: "User Mode Setup", - description: "Choose how many people will be using your instance.", - component: UserModeSelection, - }, - password_protection: { - title: "Password Protect", - description: - "Protect your instance with a password. It is important to save this password as it cannot be recovered.", - component: PasswordProtection, - }, - multi_user_mode: { - title: "Multi-User Mode", - description: - "Setup your instance to support your team by activating multi-user mode.", - component: MultiUserSetup, - }, - data_handling: { - title: "Data Handling", - description: - "We are committed to transparency and control when it comes to your personal data.", - component: DataHandling, - }, - user_questionnaire: { - title: "A little about yourself", - description: - "We use information about how you use AnythingLLM to make our product better.", - component: UserQuestionnaire, - }, - create_workspace: { - title: "Create Workspace", - description: "To get started, create a new workspace.", - component: CreateFirstWorkspace, - }, -}; - -export const OnboardingModalId = DIALOG_ID; -export default function OnboardingModal({ setModalVisible }) { - const [currentStep, setCurrentStep] = useState("llm_preference"); - const [history, setHistory] = useState(["llm_preference"]); - - function hideModal() { - setModalVisible(false); - } - - const nextStep = (stepKey) => { - setCurrentStep(stepKey); - setHistory([...history, stepKey]); - }; - - const prevStep = () => { - const currentStepIdx = history.indexOf(currentStep); - if (currentStepIdx === -1 || currentStepIdx === 0) { - setCurrentStep("llm_preference"); - setHistory(["llm_preference"]); - return hideModal(); - } - - const prevStep = history[currentStepIdx - 1]; - const _history = [...history].slice(0, currentStepIdx); - setCurrentStep(prevStep); - setHistory(_history); - }; - - const { component: StepComponent, ...step } = STEPS[currentStep]; - return ( - <dialog id={DIALOG_ID} className="bg-transparent outline-none"> - <div className="relative max-h-full"> - <div className="relative bg-main-gradient rounded-2xl shadow border-2 border-slate-300/10"> - <div className="flex items-start justify-between px-6 py-4 border-b rounded-t border-gray-500/50"> - <div className="flex flex-col gap-2"> - <h3 className="text-xl font-semibold text-white">{step.title}</h3> - <p className="text-sm font-base text-white text-opacity-60 whitespace-pre"> - {step.description || ""} - </p> - </div> - - <button - onClick={hideModal} - type="button" - className="text-gray-400 bg-transparent rounded-lg text-sm p-1.5 ml-auto inline-flex items-center hover:border-white/60 bg-sidebar-button hover:bg-menu-item-selected-gradient hover:border-slate-100 hover:border-opacity-50 border-transparent border" - > - <X className="text-gray-300 text-lg" /> - </button> - </div> - <div className="space-y-6 flex h-full w-full justify-center"> - <StepComponent - currentStep={currentStep} - nextStep={nextStep} - prevStep={prevStep} - /> - </div> - </div> - </div> - </dialog> - ); -} diff --git a/frontend/src/pages/OnboardingFlow/Steps/CreateWorkspace/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/CreateWorkspace/index.jsx new file mode 100644 index 000000000..aa53c87fc --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/CreateWorkspace/index.jsx @@ -0,0 +1,99 @@ +import React, { useEffect, useRef, useState } from "react"; +import illustration from "@/media/illustrations/create-workspace.png"; +import paths from "@/utils/paths"; +import showToast from "@/utils/toast"; +import { useNavigate } from "react-router-dom"; +import Workspace from "@/models/workspace"; + +const TITLE = "Create your first workspace"; +const DESCRIPTION = + "Create your first workspace and get started with AnythingLLM."; + +export default function CreateWorkspace({ + setHeader, + setForwardBtn, + setBackBtn, +}) { + const [workspaceName, setWorkspaceName] = useState(""); + const navigate = useNavigate(); + const createWorkspaceRef = useRef(); + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setBackBtn({ showing: false, disabled: false, onClick: handleBack }); + }, []); + + useEffect(() => { + if (workspaceName.length > 3) { + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + } else { + setForwardBtn({ showing: true, disabled: true, onClick: handleForward }); + } + }, [workspaceName]); + + const handleCreate = async (e) => { + e.preventDefault(); + const form = new FormData(e.target); + const { workspace, error } = await Workspace.new({ + name: form.get("name"), + onboardingComplete: true, + }); + if (!!workspace) { + showToast( + "Workspace created successfully! Taking you to home...", + "success" + ); + await new Promise((resolve) => setTimeout(resolve, 1000)); + navigate(paths.home()); + } else { + showToast(`Failed to create workspace: ${error}`, "error"); + } + }; + + function handleForward() { + createWorkspaceRef.current.click(); + } + + function handleBack() { + navigate(paths.onboarding.survey()); + } + + return ( + <form + onSubmit={handleCreate} + className="w-full flex items-center justify-center flex-col gap-y-2" + > + <img src={illustration} alt="Create workspace" /> + <div className="flex flex-col gap-y-4 w-full max-w-[600px]"> + {" "} + <div className="w-full mt-4"> + <label + htmlFor="name" + className="block mb-3 text-sm font-medium text-white" + > + Workspace Name + </label> + <input + name="name" + type="text" + className="bg-zinc-900 text-white text-sm rounded-lg block w-full p-2.5" + placeholder="My Workspace" + minLength={4} + required={true} + autoComplete="off" + onChange={(e) => setWorkspaceName(e.target.value)} + /> + <div className="mt-4 text-white text-opacity-80 text-xs font-base -mb-2"> + Workspace name must be at least 4 characters. + </div> + </div> + </div> + <button + type="submit" + ref={createWorkspaceRef} + hidden + aria-hidden="true" + ></button> + </form> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/CustomLogo/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/CustomLogo/index.jsx new file mode 100644 index 000000000..bb421bc39 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/CustomLogo/index.jsx @@ -0,0 +1,136 @@ +import useLogo from "@/hooks/useLogo"; +import System from "@/models/system"; +import showToast from "@/utils/toast"; +import { Plus } from "@phosphor-icons/react"; +import React, { useState, useEffect } from "react"; +import AnythingLLM from "@/media/logo/anything-llm.png"; +import paths from "@/utils/paths"; +import { useNavigate } from "react-router-dom"; + +const TITLE = "Custom Logo"; +const DESCRIPTION = + "Upload your custom logo to make your chatbot yours. Optional."; + +export default function CustomLogo({ setHeader, setForwardBtn, setBackBtn }) { + const navigate = useNavigate(); + function handleForward() { + navigate(paths.onboarding.userSetup()); + } + + function handleBack() { + navigate(paths.onboarding.vectorDatabase()); + } + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + setBackBtn({ showing: true, disabled: false, onClick: handleBack }); + }, []); + + const { logo: _initLogo, setLogo: _setLogo } = useLogo(); + const [logo, setLogo] = useState(""); + const [isDefaultLogo, setIsDefaultLogo] = useState(true); + + useEffect(() => { + async function logoInit() { + setLogo(_initLogo || ""); + const _isDefaultLogo = await System.isDefaultLogo(); + setIsDefaultLogo(_isDefaultLogo); + } + logoInit(); + }, [_initLogo]); + + const handleFileUpload = async (event) => { + const file = event.target.files[0]; + if (!file) return false; + + const objectURL = URL.createObjectURL(file); + setLogo(objectURL); + + const formData = new FormData(); + formData.append("logo", file); + const { success, error } = await System.uploadLogo(formData); + if (!success) { + showToast(`Failed to upload logo: ${error}`, "error"); + setLogo(_initLogo); + return; + } + + const logoURL = await System.fetchLogo(); + _setLogo(logoURL); + + showToast("Image uploaded successfully.", "success", { clear: true }); + setIsDefaultLogo(false); + }; + + const handleRemoveLogo = async () => { + setLogo(""); + setIsDefaultLogo(true); + + const { success, error } = await System.removeCustomLogo(); + if (!success) { + console.error("Failed to remove logo:", error); + showToast(`Failed to remove logo: ${error}`, "error"); + const logoURL = await System.fetchLogo(); + setLogo(logoURL); + setIsDefaultLogo(false); + return; + } + + const logoURL = await System.fetchLogo(); + _setLogo(logoURL); + + showToast("Image successfully removed.", "success", { clear: true }); + }; + + return ( + <div className="flex items-center w-full"> + <div className="flex gap-x-8 flex-col w-full"> + {isDefaultLogo ? ( + <label className="mt-5 hover:opacity-60 w-full flex justify-center transition-all duration-300"> + <input + id="logo-upload" + type="file" + accept="image/*" + className="hidden" + onChange={handleFileUpload} + /> + <div + className="max-w-[600px] w-full h-64 max-h-[600px] py-4 bg-zinc-900/50 rounded-2xl border-2 border-dashed border-white border-opacity-60 justify-center items-center inline-flex cursor-pointer" + htmlFor="logo-upload" + > + <div className="flex flex-col items-center justify-center"> + <div className="rounded-full bg-white/40"> + <Plus className="w-6 h-6 text-black/80 m-2" /> + </div> + <div className="text-white text-opacity-80 text-sm font-semibold py-1"> + Add a custom logo + </div> + <div className="text-white text-opacity-60 text-xs font-medium py-1"> + Recommended size: 800 x 200 + </div> + </div> + </div> + </label> + ) : ( + <div className="w-full flex justify-center"> + <img + src={logo} + alt="Uploaded Logo" + className="w-48 h-48 object-contain mr-6" + hidden={isDefaultLogo} + onError={(e) => (e.target.src = AnythingLLM)} + /> + </div> + )} + + <button + onClick={handleRemoveLogo} + className="text-white text-base font-medium hover:text-opacity-60 mt-8" + > + Remove logo + </button> + </div> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/DataHandling/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx similarity index 87% rename from frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/DataHandling/index.jsx rename to frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx index 81b93c5dc..db285f128 100644 --- a/frontend/src/pages/OnboardingFlow/OnboardingModal/Steps/DataHandling/index.jsx +++ b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx @@ -1,4 +1,4 @@ -import React, { memo, useEffect, useState } from "react"; +import PreLoader from "@/components/Preloader"; import System from "@/models/system"; import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; import OpenAiLogo from "@/media/llmprovider/openai.png"; @@ -13,8 +13,13 @@ import PineconeLogo from "@/media/vectordbs/pinecone.png"; import LanceDbLogo from "@/media/vectordbs/lancedb.png"; import WeaviateLogo from "@/media/vectordbs/weaviate.png"; import QDrantLogo from "@/media/vectordbs/qdrant.png"; -import PreLoader from "@/components/Preloader"; +import React, { useState, useEffect } from "react"; +import paths from "@/utils/paths"; +import { useNavigate } from "react-router-dom"; +const TITLE = "Data Handling & Privacy"; +const DESCRIPTION = + "We are committed to transparency and control when it comes to your personal data."; const LLM_SELECTION_PRIVACY = { openai: { name: "OpenAI", @@ -151,26 +156,36 @@ const EMBEDDING_ENGINE_PRIVACY = { }, }; -function DataHandling({ nextStep, prevStep, currentStep }) { +export default function DataHandling({ setHeader, setForwardBtn, setBackBtn }) { const [llmChoice, setLLMChoice] = useState("openai"); const [loading, setLoading] = useState(true); const [vectorDb, setVectorDb] = useState("pinecone"); const [embeddingEngine, setEmbeddingEngine] = useState("openai"); + const navigate = useNavigate(); useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + setBackBtn({ showing: false, disabled: false, onClick: handleBack }); async function fetchKeys() { const _settings = await System.keys(); - setLLMChoice(_settings?.LLMProvider); - setVectorDb(_settings?.VectorDB); - setEmbeddingEngine(_settings?.EmbeddingEngine); + setLLMChoice(_settings?.LLMProvider || "openai"); + setVectorDb(_settings?.VectorDB || "pinecone"); + setEmbeddingEngine(_settings?.EmbeddingEngine || "openai"); setLoading(false); } - if (currentStep === "data_handling") { - fetchKeys(); - } + fetchKeys(); }, []); + function handleForward() { + navigate(paths.onboarding.survey()); + } + + function handleBack() { + navigate(paths.onboarding.userSetup()); + } + if (loading) return ( <div className="w-full h-full flex justify-center items-center p-20"> @@ -179,7 +194,7 @@ function DataHandling({ nextStep, prevStep, currentStep }) { ); return ( - <div className="max-w-[750px]"> + <div className="w-full flex items-center justify-center flex-col gap-y-6"> <div className="p-8 flex flex-col gap-8"> <div className="flex flex-col gap-y-2 border-b border-zinc-500/50 pb-4"> <div className="text-white text-base font-bold">LLM Selection</div> @@ -239,23 +254,6 @@ function DataHandling({ nextStep, prevStep, currentStep }) { </ul> </div> </div> - <div className="flex w-[650px] justify-between items-center px-6 py-4 space-x-2 border-t rounded-b border-gray-500/50"> - <button - onClick={prevStep} - type="button" - className="px-4 py-2 rounded-lg text-white hover:bg-sidebar" - > - Back - </button> - <button - onClick={() => nextStep("user_questionnaire")} - className="border border-slate-200 px-4 py-2 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow" - > - Continue - </button> - </div> </div> ); } - -export default memo(DataHandling); diff --git a/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/EmbedderItem.jsx b/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/EmbedderItem.jsx new file mode 100644 index 000000000..b37b645f9 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/EmbedderItem.jsx @@ -0,0 +1,39 @@ +export default function EmbedderItem({ + name, + value, + image, + description, + checked, + onClick, +}) { + return ( + <div + onClick={() => onClick(value)} + className={`w-full hover:bg-white/10 p-2 rounded-md hover:cursor-pointer ${ + checked && "bg-white/10" + }`} + > + <input + type="checkbox" + value={value} + className="peer hidden" + checked={checked} + readOnly={true} + formNoValidate={true} + /> + <div className="flex gap-x-4 items-center"> + <img + src={image} + alt={`${name} logo`} + className="w-10 h-10 rounded-md" + /> + <div className="flex flex-col gap-y-1"> + <div className="text-sm font-semibold">{name}</div> + <div className="mt-2 text-xs text-white tracking-wide"> + {description} + </div> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx new file mode 100644 index 000000000..c78d3f443 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx @@ -0,0 +1,180 @@ +import { MagnifyingGlass } from "@phosphor-icons/react"; +import { useEffect, useState, useRef } from "react"; +import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; +import OpenAiLogo from "@/media/llmprovider/openai.png"; +import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; +import LocalAiLogo from "@/media/llmprovider/localai.png"; +import NativeEmbeddingOptions from "@/components/EmbeddingSelection/NativeEmbeddingOptions"; +import OpenAiOptions from "@/components/EmbeddingSelection/OpenAiOptions"; +import AzureAiOptions from "@/components/EmbeddingSelection/AzureAiOptions"; +import LocalAiOptions from "@/components/EmbeddingSelection/LocalAiOptions"; +import EmbedderItem from "./EmbedderItem"; +import System from "@/models/system"; +import paths from "@/utils/paths"; +import showToast from "@/utils/toast"; +import { useNavigate } from "react-router-dom"; + +const TITLE = "Embedding Preference"; +const DESCRIPTION = + "AnythingLLM can work with many embedding models. This will be the model which turns documents into vectors."; + +export default function EmbeddingPreference({ + setHeader, + setForwardBtn, + setBackBtn, +}) { + const [searchQuery, setSearchQuery] = useState(""); + const [filteredEmbedders, setFilteredEmbedders] = useState([]); + const [selectedEmbedder, setSelectedEmbedder] = useState(null); + const [settings, setSettings] = useState(null); + const formRef = useRef(null); + const hiddenSubmitButtonRef = useRef(null); + const isHosted = window.location.hostname.includes("useanything.com"); + const navigate = useNavigate(); + + useEffect(() => { + async function fetchKeys() { + const _settings = await System.keys(); + setSettings(_settings); + setSelectedEmbedder(_settings?.EmbeddingEngine || "native"); + } + fetchKeys(); + }, []); + + const EMBEDDERS = [ + { + name: "AnythingLLM Embedder", + value: "native", + logo: AnythingLLMIcon, + options: <NativeEmbeddingOptions settings={settings} />, + description: + "Use the built-in embedding engine for AnythingLLM. Zero setup!", + }, + { + name: "OpenAI", + value: "openai", + logo: OpenAiLogo, + options: <OpenAiOptions settings={settings} />, + description: "The standard option for most non-commercial use.", + }, + { + name: "Azure OpenAI", + value: "azure", + logo: AzureOpenAiLogo, + options: <AzureAiOptions settings={settings} />, + description: "The enterprise option of OpenAI hosted on Azure services.", + }, + { + name: "Local AI", + value: "localai", + logo: LocalAiLogo, + options: <LocalAiOptions settings={settings} />, + description: "Run embedding models locally on your own machine.", + }, + ]; + + function handleForward() { + if (hiddenSubmitButtonRef.current) { + hiddenSubmitButtonRef.current.click(); + } + } + + function handleBack() { + navigate(paths.onboarding.llmPreference()); + } + + const handleSubmit = async (e) => { + e.preventDefault(); + const form = e.target; + const data = {}; + const formData = new FormData(form); + data.EmbeddingEngine = selectedEmbedder; + for (var [key, value] of formData.entries()) data[key] = value; + + const { error } = await System.updateSystem(data); + if (error) { + showToast(`Failed to save embedding settings: ${error}`, "error"); + return; + } + showToast("Embedder settings saved successfully.", "success", { + clear: true, + }); + navigate(paths.onboarding.vectorDatabase()); + }; + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + setBackBtn({ showing: true, disabled: false, onClick: handleBack }); + }, []); + + useEffect(() => { + if (searchQuery.trim() === "") { + setFilteredEmbedders(EMBEDDERS); + } else { + const lowercasedQuery = searchQuery.toLowerCase(); + const filtered = EMBEDDERS.filter((embedder) => + embedder.name.toLowerCase().includes(lowercasedQuery) + ); + setFilteredEmbedders(filtered); + } + }, [searchQuery]); + + return ( + <div> + <form ref={formRef} onSubmit={handleSubmit} className="w-full"> + <div className="w-full relative border-slate-300/40 shadow border-2 rounded-lg text-white"> + <div className="w-full p-4 absolute top-0 rounded-t-lg bg-accent/50"> + <div className="w-full flex items-center sticky top-0 z-20"> + <MagnifyingGlass + size={16} + weight="bold" + className="absolute left-4 z-30 text-white" + /> + <input + type="text" + placeholder="Search Embedding providers" + className="bg-zinc-600 z-20 pl-10 rounded-full w-full px-4 py-1 text-sm border-2 border-slate-300/40 outline-none focus:border-white text-white" + onChange={(e) => setSearchQuery(e.target.value)} + autoComplete="off" + onKeyDown={(e) => { + if (e.key === "Enter") e.preventDefault(); + }} + /> + </div> + </div> + <div className="px-4 pt-[70px] flex flex-col gap-y-1 max-h-[390px] overflow-y-auto no-scroll pb-4"> + {filteredEmbedders.map((embedder) => { + if (embedder.value === "native" && isHosted) { + return null; + } + + return ( + <EmbedderItem + key={embedder.name} + name={embedder.name} + value={embedder.value} + image={embedder.logo} + description={embedder.description} + checked={selectedEmbedder === embedder.value} + onClick={() => setSelectedEmbedder(embedder.value)} + /> + ); + })} + </div> + </div> + <div className="mt-4 flex flex-col gap-y-1"> + {selectedEmbedder && + EMBEDDERS.find((embedder) => embedder.value === selectedEmbedder) + ?.options} + </div> + <button + type="submit" + ref={hiddenSubmitButtonRef} + hidden + aria-hidden="true" + ></button> + </form> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/Home/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/Home/index.jsx new file mode 100644 index 000000000..7b31e2ac3 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/Home/index.jsx @@ -0,0 +1,41 @@ +import paths from "@/utils/paths"; +import LGroupImg from "./l_group.png"; +import RGroupImg from "./r_group.png"; +import AnythingLLMLogo from "@/media/logo/anything-llm.png"; +import { useNavigate } from "react-router-dom"; + +export default function OnboardingHome() { + const navigate = useNavigate(); + return ( + <> + <div className="relative w-screen h-screen flex overflow-hidden bg-[#2C2F35] md:bg-main-gradient"> + <div + className="hidden md:block fixed bottom-10 left-10 w-[320px] h-[320px] bg-no-repeat bg-contain" + style={{ backgroundImage: `url(${LGroupImg})` }} + ></div> + + <div + className="hidden md:block fixed top-10 right-10 w-[320px] h-[320px] bg-no-repeat bg-contain" + style={{ backgroundImage: `url(${RGroupImg})` }} + ></div> + + <div className="relative flex justify-center items-center m-auto"> + <div className="flex flex-col justify-center items-center"> + <p className="text-zinc-300 font-thin text-[24px]">Welcome to</p> + <img + src={AnythingLLMLogo} + alt="AnythingLLM" + className="md:h-[50px] flex-shrink-0 max-w-[300px]" + /> + <button + onClick={() => navigate(paths.onboarding.llmPreference())} + className="animate-pulse w-full md:max-w-[350px] md:min-w-[300px] text-center py-3 bg-white text-black font-semibold text-sm my-10 rounded-md hover:bg-gray-200" + > + Get started + </button> + </div> + </div> + </div> + </> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/Home/l_group.png b/frontend/src/pages/OnboardingFlow/Steps/Home/l_group.png new file mode 100644 index 0000000000000000000000000000000000000000..2981196a33208cdb5c6fa0a39b562176d42642e0 GIT binary patch literal 74247 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%0A(FT{J!U09>2gLD>^s%RjpGMP(%WBM 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 literal 0 HcmV?d00001 diff --git a/frontend/src/pages/OnboardingFlow/Steps/Home/r_group.png b/frontend/src/pages/OnboardingFlow/Steps/Home/r_group.png new file mode 100644 index 0000000000000000000000000000000000000000..fc50fd52c875578c55fa4e18d2143d0265ade213 GIT binary patch literal 81768 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
vxd}6cOXAIUReaUw(PY9h6V;B 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 LnP1gHdIA3fMIK&* literal 0 HcmV?d00001 diff --git a/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/LLMItem.jsx b/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/LLMItem.jsx new file mode 100644 index 000000000..b6db5d130 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/LLMItem.jsx @@ -0,0 +1,39 @@ +export default function LLMItem({ + name, + value, + image, + description, + checked, + onClick, +}) { + return ( + <div + onClick={() => onClick(value)} + className={`w-full hover:bg-white/10 p-2 rounded-md hover:cursor-pointer ${ + checked && "bg-white/10" + }`} + > + <input + type="checkbox" + value={value} + className="peer hidden" + checked={checked} + readOnly={true} + formNoValidate={true} + /> + <div className="flex gap-x-4 items-center"> + <img + src={image} + alt={`${name} logo`} + className="w-10 h-10 rounded-md" + /> + <div className="flex flex-col gap-y-1"> + <div className="text-sm font-semibold">{name}</div> + <div className="mt-2 text-xs text-white tracking-wide"> + {description} + </div> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx new file mode 100644 index 000000000..24d561ed6 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx @@ -0,0 +1,211 @@ +import { MagnifyingGlass } from "@phosphor-icons/react"; +import { useEffect, useState, useRef } from "react"; +import OpenAiLogo from "@/media/llmprovider/openai.png"; +import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; +import AnthropicLogo from "@/media/llmprovider/anthropic.png"; +import GeminiLogo from "@/media/llmprovider/gemini.png"; +import OllamaLogo from "@/media/llmprovider/ollama.png"; +import LMStudioLogo from "@/media/llmprovider/lmstudio.png"; +import LocalAiLogo from "@/media/llmprovider/localai.png"; +import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png"; +import OpenAiOptions from "@/components/LLMSelection/OpenAiOptions"; +import AzureAiOptions from "@/components/LLMSelection/AzureAiOptions"; +import AnthropicAiOptions from "@/components/LLMSelection/AnthropicAiOptions"; +import LMStudioOptions from "@/components/LLMSelection/LMStudioOptions"; +import LocalAiOptions from "@/components/LLMSelection/LocalAiOptions"; +import NativeLLMOptions from "@/components/LLMSelection/NativeLLMOptions"; +import GeminiLLMOptions from "@/components/LLMSelection/GeminiLLMOptions"; +import OllamaLLMOptions from "@/components/LLMSelection/OllamaLLMOptions"; +import LLMItem from "./LLMItem"; +import System from "@/models/system"; +import paths from "@/utils/paths"; +import showToast from "@/utils/toast"; +import { useNavigate } from "react-router-dom"; + +const TITLE = "LLM Preference"; +const DESCRIPTION = + "AnythingLLM can work with many LLM providers. This will be the service which handles chatting."; + +export default function LLMPreference({ + setHeader, + setForwardBtn, + setBackBtn, +}) { + const [searchQuery, setSearchQuery] = useState(""); + const [filteredLLMs, setFilteredLLMs] = useState([]); + const [selectedLLM, setSelectedLLM] = useState(null); + const [settings, setSettings] = useState(null); + const formRef = useRef(null); + const hiddenSubmitButtonRef = useRef(null); + const isHosted = window.location.hostname.includes("useanything.com"); + const navigate = useNavigate(); + + useEffect(() => { + async function fetchKeys() { + const _settings = await System.keys(); + setSettings(_settings); + setSelectedLLM(_settings?.LLMProvider || "openai"); + } + fetchKeys(); + }, []); + + const LLMS = [ + { + name: "OpenAI", + value: "openai", + logo: OpenAiLogo, + options: <OpenAiOptions settings={settings} />, + description: "The standard option for most non-commercial use.", + }, + { + name: "Azure OpenAI", + value: "azure", + logo: AzureOpenAiLogo, + options: <AzureAiOptions settings={settings} />, + description: "The enterprise option of OpenAI hosted on Azure services.", + }, + { + name: "Anthropic", + value: "anthropic", + logo: AnthropicLogo, + options: <AnthropicAiOptions settings={settings} />, + description: "A friendly AI Assistant hosted by Anthropic.", + }, + { + name: "Gemini", + value: "gemini", + logo: GeminiLogo, + options: <GeminiLLMOptions settings={settings} />, + description: "Google's largest and most capable AI model", + }, + { + name: "Ollama", + value: "ollama", + logo: OllamaLogo, + options: <OllamaLLMOptions settings={settings} />, + description: "Run LLMs locally on your own machine.", + }, + { + name: "LM Studio", + value: "lmstudio", + logo: LMStudioLogo, + options: <LMStudioOptions settings={settings} />, + description: + "Discover, download, and run thousands of cutting edge LLMs in a few clicks.", + }, + { + name: "Local AI", + value: "localai", + logo: LocalAiLogo, + options: <LocalAiOptions settings={settings} />, + description: "Run LLMs locally on your own machine.", + }, + { + name: "Native", + value: "native", + logo: AnythingLLMIcon, + options: <NativeLLMOptions settings={settings} />, + description: + "Use a downloaded custom Llama model for chatting on this AnythingLLM instance.", + }, + ]; + + function handleForward() { + if (hiddenSubmitButtonRef.current) { + hiddenSubmitButtonRef.current.click(); + } + } + + function handleBack() { + navigate(paths.onboarding.home()); + } + + const handleSubmit = async (e) => { + e.preventDefault(); + const form = e.target; + const data = {}; + const formData = new FormData(form); + data.LLMProvider = selectedLLM; + for (var [key, value] of formData.entries()) data[key] = value; + + const { error } = await System.updateSystem(data); + if (error) { + showToast(`Failed to save LLM settings: ${error}`, "error"); + return; + } + showToast("LLM settings saved successfully.", "success", { clear: true }); + navigate(paths.onboarding.embeddingPreference()); + }; + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + setBackBtn({ showing: true, disabled: false, onClick: handleBack }); + }, []); + + useEffect(() => { + if (searchQuery.trim() === "") { + setFilteredLLMs(LLMS); + } else { + const lowercasedQuery = searchQuery.toLowerCase(); + const filtered = LLMS.filter((llm) => + llm.name.toLowerCase().includes(lowercasedQuery) + ); + setFilteredLLMs(filtered); + } + }, [searchQuery]); + + return ( + <div> + <form ref={formRef} onSubmit={handleSubmit} className="w-full"> + <div className="w-full relative border-slate-300/40 shadow border-2 rounded-lg text-white"> + <div className="w-full p-4 absolute top-0 rounded-t-lg bg-accent/50"> + <div className="w-full flex items-center sticky top-0 z-20"> + <MagnifyingGlass + size={16} + weight="bold" + className="absolute left-4 z-30 text-white" + /> + <input + type="text" + placeholder="Search LLM providers" + className="bg-zinc-600 z-20 pl-10 rounded-full w-full px-4 py-1 text-sm border-2 border-slate-300/40 outline-none focus:border-white text-white" + onChange={(e) => setSearchQuery(e.target.value)} + autoComplete="off" + onKeyDown={(e) => { + if (e.key === "Enter") e.preventDefault(); + }} + /> + </div> + </div> + <div className="px-4 pt-[70px] flex flex-col gap-y-1 max-h-[390px] overflow-y-auto no-scroll pb-4"> + {filteredLLMs.map((llm) => { + if (llm.value === "native" && isHosted) return null; + return ( + <LLMItem + key={llm.name} + name={llm.name} + value={llm.value} + image={llm.logo} + description={llm.description} + checked={selectedLLM === llm.value} + onClick={() => setSelectedLLM(llm.value)} + /> + ); + })} + </div> + </div> + <div className="mt-4 flex flex-col gap-y-1"> + {selectedLLM && + LLMS.find((llm) => llm.value === selectedLLM)?.options} + </div> + <button + type="submit" + ref={hiddenSubmitButtonRef} + hidden + aria-hidden="true" + ></button> + </form> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/Survey/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/Survey/index.jsx new file mode 100644 index 000000000..35b2f67d0 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/Survey/index.jsx @@ -0,0 +1,297 @@ +import { COMPLETE_QUESTIONNAIRE } from "@/utils/constants"; +import paths from "@/utils/paths"; +import { CheckCircle } from "@phosphor-icons/react"; +import React, { useState, useEffect, useRef } from "react"; +import { useNavigate } from "react-router-dom"; + +const TITLE = "Welcome to AnythingLLM"; +const DESCRIPTION = "Help us make AnythingLLM built for your needs. Optional."; + +async function sendQuestionnaire({ email, useCase, comment }) { + if (import.meta.env.DEV) return; + return fetch(`https://onboarding-wxich7363q-uc.a.run.app`, { + method: "POST", + body: JSON.stringify({ + email, + useCase, + comment, + sourceId: "0VRjqHh6Vukqi0x0Vd0n/m8JuT7k8nOz", + }), + }) + .then(() => { + window.localStorage.setItem(COMPLETE_QUESTIONNAIRE, true); + console.log(`✅ Questionnaire responses sent.`); + }) + .catch((error) => { + console.error(`sendQuestionnaire`, error.message); + }); +} + +export default function Survey({ setHeader, setForwardBtn, setBackBtn }) { + const [selectedOption, setSelectedOption] = useState(""); + const formRef = useRef(null); + const navigate = useNavigate(); + const submitRef = useRef(null); + + function handleForward() { + if (!!window?.localStorage?.getItem(COMPLETE_QUESTIONNAIRE)) { + navigate(paths.onboarding.createWorkspace()); + return; + } + if (submitRef.current) { + submitRef.current.click(); + } + } + + function skipSurvey() { + navigate(paths.onboarding.createWorkspace()); + } + + function handleBack() { + navigate(paths.onboarding.dataHandling()); + } + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + setBackBtn({ showing: true, disabled: false, onClick: handleBack }); + }, []); + + const handleSubmit = async (e) => { + e.preventDefault(); + const form = e.target; + const formData = new FormData(form); + + await sendQuestionnaire({ + email: formData.get("email"), + useCase: formData.get("use_case") || "other", + comment: formData.get("comment") || null, + }); + + navigate(paths.onboarding.createWorkspace()); + }; + + if (!!window?.localStorage?.getItem(COMPLETE_QUESTIONNAIRE)) { + return ( + <div className="w-full flex justify-center items-center py-40"> + <div className="w-full flex items-center justify-center px-1 md:px-8 py-4"> + <div className="w-auto flex flex-col gap-y-1 items-center"> + <CheckCircle size={60} className="text-green-500" /> + <p className="text-white text-lg">Thank you for your feedback!</p> + <a + href={paths.mailToMintplex()} + className="text-sky-400 underline text-xs" + > + team@mintplexlabs.com + </a> + </div> + </div> + </div> + ); + } + + return ( + <div className="w-full flex justify-center"> + <form onSubmit={handleSubmit} ref={formRef} className=""> + <div className="md:min-w-[400px]"> + <label htmlFor="email" className="text-white text-base font-medium"> + What's your email?{" "} + </label> + <input + name="email" + type="email" + placeholder="you@gmail.com" + required={true} + className="mt-2 bg-zinc-900 text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight w-full h-11 p-2.5 bg-zinc-900 rounded-lg" + /> + </div> + + <div className="mt-8"> + <label + className="text-white text-base font-medium" + htmlFor="use_case" + > + What will you use AnythingLLM for?{" "} + </label> + <div className="mt-2 gap-y-3 flex flex-col"> + <label + className={`transition-all duration-300 w-full h-11 p-2.5 bg-white/10 rounded-lg flex justify-start items-center gap-2.5 cursor-pointer border border-transparent ${ + selectedOption === "business" + ? "border-white border-opacity-40" + : "" + } hover:border-white/60`} + > + <input + type="radio" + name="use_case" + value={"business"} + checked={selectedOption === "business"} + onChange={(e) => setSelectedOption(e.target.value)} + className="hidden" + /> + <div + className={`w-4 h-4 rounded-full border-2 border-white mr-2 ${ + selectedOption === "business" ? "bg-white" : "" + }`} + ></div> + <div className="text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight"> + For my business + </div> + </label> + <label + className={`transition-all duration-300 w-full h-11 p-2.5 bg-white/10 rounded-lg flex justify-start items-center gap-2.5 cursor-pointer border border-transparent ${ + selectedOption === "personal" + ? "border-white border-opacity-40" + : "" + } hover:border-white/60`} + > + <input + type="radio" + name="use_case" + value={"personal"} + checked={selectedOption === "personal"} + onChange={(e) => setSelectedOption(e.target.value)} + className="hidden" + /> + <div + className={`w-4 h-4 rounded-full border-2 border-white mr-2 ${ + selectedOption === "personal" ? "bg-white" : "" + }`} + ></div> + <div className="text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight"> + For personal use + </div> + </label> + <label + className={`transition-all duration-300 w-full h-11 p-2.5 bg-white/10 rounded-lg flex justify-start items-center gap-2.5 cursor-pointer border border-transparent ${ + selectedOption === "education" + ? "border-white border-opacity-40" + : "" + } hover:border-white/60`} + > + <input + type="radio" + name="use_case" + value={"education"} + checked={selectedOption === "education"} + onChange={(e) => setSelectedOption(e.target.value)} + className="hidden" + /> + <div + className={`w-4 h-4 rounded-full border-2 border-white mr-2 ${ + selectedOption === "education" ? "bg-white" : "" + }`} + ></div> + <div className="text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight"> + For my education + </div> + </label> + <label + className={`transition-all duration-300 w-full h-11 p-2.5 bg-white/10 rounded-lg flex justify-start items-center gap-2.5 cursor-pointer border border-transparent ${ + selectedOption === "side_hustle" + ? "border-white border-opacity-40" + : "" + } hover:border-white/60`} + > + <input + type="radio" + name="use_case" + value={"side_hustle"} + checked={selectedOption === "side_hustle"} + onChange={(e) => setSelectedOption(e.target.value)} + className="hidden" + /> + <div + className={`w-4 h-4 rounded-full border-2 border-white mr-2 ${ + selectedOption === "side_hustle" ? "bg-white" : "" + }`} + ></div> + <div className="text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight"> + For my side-hustle + </div> + </label> + <label + className={`transition-all duration-300 w-full h-11 p-2.5 bg-white/10 rounded-lg flex justify-start items-center gap-2.5 cursor-pointer border border-transparent ${ + selectedOption === "job" ? "border-white border-opacity-40" : "" + } hover:border-white/60`} + > + <input + type="radio" + name="use_case" + value={"job"} + checked={selectedOption === "job"} + onChange={(e) => setSelectedOption(e.target.value)} + className="hidden" + /> + <div + className={`w-4 h-4 rounded-full border-2 border-white mr-2 ${ + selectedOption === "job" ? "bg-white" : "" + }`} + ></div> + <div className="text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight"> + For my job + </div> + </label> + <label + className={`transition-all duration-300 w-full h-11 p-2.5 bg-white/10 rounded-lg flex justify-start items-center gap-2.5 cursor-pointer border border-transparent ${ + selectedOption === "other" + ? "border-white border-opacity-40" + : "" + } hover:border-white/60`} + > + <input + type="radio" + name="use_case" + value={"other"} + checked={selectedOption === "other"} + onChange={(e) => setSelectedOption(e.target.value)} + className="hidden" + /> + <div + className={`w-4 h-4 rounded-full border-2 border-white mr-2 ${ + selectedOption === "other" ? "bg-white" : "" + }`} + ></div> + <div className="text-white text-sm font-medium font-['Plus Jakarta Sans'] leading-tight"> + Other + </div> + </label> + </div> + </div> + + <div className="mt-8"> + <label htmlFor="comment" className="text-white text-base font-medium"> + Any comments for the team?{" "} + <span className="text-neutral-400 text-base font-light"> + (Optional) + </span> + </label> + <textarea + name="comment" + rows={5} + className="mt-2 bg-zinc-900 text-white text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5" + placeholder="If you have any questions or comments right now, you can leave them here and we will get back to you. You can also email team@mintplexlabs.com" + wrap="soft" + autoComplete="off" + /> + </div> + <button + type="submit" + ref={submitRef} + hidden + aria-hidden="true" + ></button> + + <div className="w-full flex items-center justify-center"> + <button + type="button" + onClick={skipSurvey} + className="text-white text-base font-medium text-opacity-30 hover:text-opacity-100 mt-8" + > + Skip Survey + </button> + </div> + </form> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/UserSetup/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/UserSetup/index.jsx new file mode 100644 index 000000000..500a483a1 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/UserSetup/index.jsx @@ -0,0 +1,336 @@ +import System from "@/models/system"; +import showToast from "@/utils/toast"; +import React, { useState, useEffect, useRef } from "react"; +import debounce from "lodash.debounce"; +import paths from "@/utils/paths"; +import { useNavigate } from "react-router-dom"; +import { AUTH_TIMESTAMP, AUTH_TOKEN, AUTH_USER } from "@/utils/constants"; + +const TITLE = "User Setup"; +const DESCRIPTION = "Configure your user settings."; + +export default function UserSetup({ setHeader, setForwardBtn, setBackBtn }) { + const [selectedOption, setSelectedOption] = useState(""); + const [singleUserPasswordValid, setSingleUserPasswordValid] = useState(false); + const [multiUserLoginValid, setMultiUserLoginValid] = useState(false); + const [enablePassword, setEnablePassword] = useState(false); + const myTeamSubmitRef = useRef(null); + const justMeSubmitRef = useRef(null); + const navigate = useNavigate(); + + function handleForward() { + if (selectedOption === "just_me" && enablePassword) { + justMeSubmitRef.current?.click(); + } else if (selectedOption === "just_me" && !enablePassword) { + navigate(paths.onboarding.dataHandling()); + } else if (selectedOption === "my_team") { + myTeamSubmitRef.current?.click(); + } + } + + function handleBack() { + navigate(paths.onboarding.customLogo()); + } + + useEffect(() => { + let isDisabled = true; + if (selectedOption === "just_me") { + isDisabled = !singleUserPasswordValid; + } else if (selectedOption === "my_team") { + isDisabled = !multiUserLoginValid; + } + + setForwardBtn({ + showing: true, + disabled: isDisabled, + onClick: handleForward, + }); + }, [selectedOption, singleUserPasswordValid, multiUserLoginValid]); + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setBackBtn({ showing: true, disabled: false, onClick: handleBack }); + }, []); + + return ( + <div className="w-full flex items-center justify-center flex-col gap-y-6"> + <div className="flex flex-col border rounded-lg border-white/20 p-8 items-center gap-y-4 w-full max-w-[600px]"> + <div className=" text-white text-sm font-semibold md:-ml-44"> + How many people will be using your instance? + </div> + <div className="flex flex-col md:flex-row gap-6 w-full justify-center"> + <button + onClick={() => setSelectedOption("just_me")} + className={`${ + selectedOption === "just_me" + ? "text-sky-400 border-sky-400/70" + : "text-white border-white/40" + } min-w-[230px] h-11 p-4 rounded-[10px] border-2 justify-center items-center gap-[100px] inline-flex hover:border-sky-400/70 hover:text-sky-400 transition-all duration-300`} + > + <div className="text-center text-sm font-bold">Just me</div> + </button> + <button + onClick={() => setSelectedOption("my_team")} + className={`${ + selectedOption === "my_team" + ? "text-sky-400 border-sky-400/70" + : "text-white border-white/40" + } min-w-[230px] h-11 p-4 rounded-[10px] border-2 justify-center items-center gap-[100px] inline-flex hover:border-sky-400/70 hover:text-sky-400 transition-all duration-300`} + > + <div className="text-center text-sm font-bold">My team</div> + </button> + </div> + </div> + {selectedOption === "just_me" && ( + <JustMe + setSingleUserPasswordValid={setSingleUserPasswordValid} + enablePassword={enablePassword} + setEnablePassword={setEnablePassword} + justMeSubmitRef={justMeSubmitRef} + navigate={navigate} + /> + )} + {selectedOption === "my_team" && ( + <MyTeam + setMultiUserLoginValid={setMultiUserLoginValid} + myTeamSubmitRef={myTeamSubmitRef} + navigate={navigate} + /> + )} + </div> + ); +} + +const JustMe = ({ + setSingleUserPasswordValid, + enablePassword, + setEnablePassword, + justMeSubmitRef, + navigate, +}) => { + const [itemSelected, setItemSelected] = useState(false); + const [password, setPassword] = useState(""); + const handleSubmit = async (e) => { + e.preventDefault(); + const form = e.target; + const formData = new FormData(form); + const { error } = await System.updateSystemPassword({ + usePassword: true, + newPassword: formData.get("password"), + }); + + if (error) { + showToast(`Failed to set password: ${error}`, "error"); + return; + } + + showToast("Password set successfully!", "success", { clear: true }); + + // Auto-request token with password that was just set so they + // are not redirected to login after completion. + const { token } = await System.requestToken({ + password: formData.get("password"), + }); + window.localStorage.removeItem(AUTH_USER); + window.localStorage.removeItem(AUTH_TIMESTAMP); + window.localStorage.setItem(AUTH_TOKEN, token); + + navigate(paths.onboarding.dataHandling()); + }; + + const setNewPassword = (e) => setPassword(e.target.value); + const handlePasswordChange = debounce(setNewPassword, 500); + + function handleYes() { + setItemSelected(true); + setEnablePassword(true); + } + + function handleNo() { + setItemSelected(true); + setEnablePassword(false); + } + + useEffect(() => { + if (enablePassword && itemSelected && password.length >= 8) { + setSingleUserPasswordValid(true); + } else if (!enablePassword && itemSelected) { + setSingleUserPasswordValid(true); + } else { + setSingleUserPasswordValid(false); + } + }); + return ( + <div className="w-full flex items-center justify-center flex-col gap-y-6"> + <div className="flex flex-col border rounded-lg border-white/20 p-8 items-center gap-y-4 w-full max-w-[600px]"> + <div className=" text-white text-sm font-semibold md:-ml-56"> + Would you like to set up a password? + </div> + <div className="flex flex-col md:flex-row gap-6 w-full justify-center"> + <button + onClick={handleYes} + className={`${ + enablePassword && itemSelected + ? "text-sky-400 border-sky-400/70" + : "text-white border-white/40" + } min-w-[230px] h-11 p-4 rounded-[10px] border-2 justify-center items-center gap-[100px] inline-flex hover:border-sky-400/70 hover:text-sky-400 transition-all duration-300`} + > + <div className="text-center text-sm font-bold">Yes</div> + </button> + <button + onClick={handleNo} + className={`${ + !enablePassword && itemSelected + ? "text-sky-400 border-sky-400/70" + : "text-white border-white/40" + } min-w-[230px] h-11 p-4 rounded-[10px] border-2 justify-center items-center gap-[100px] inline-flex hover:border-sky-400/70 hover:text-sky-400 transition-all duration-300`} + > + <div className="text-center text-sm font-bold">No</div> + </button> + </div> + {enablePassword && ( + <form className="w-full mt-4" onSubmit={handleSubmit}> + <label + htmlFor="name" + className="block mb-3 text-sm font-medium text-white" + > + Instance Password + </label> + <input + name="password" + type="password" + className="bg-zinc-900 text-white text-sm rounded-lg block w-full p-2.5" + placeholder="Your admin password" + minLength={6} + required={true} + autoComplete="off" + onChange={handlePasswordChange} + /> + <div className="mt-4 text-white text-opacity-80 text-xs font-base -mb-2"> + Passwords must be at least 8 characters. + <br /> + <i> + It's important to save this password because there is no + recovery method. + </i>{" "} + </div> + <button + type="submit" + ref={justMeSubmitRef} + hidden + aria-hidden="true" + ></button> + </form> + )} + </div> + </div> + ); +}; + +const MyTeam = ({ setMultiUserLoginValid, myTeamSubmitRef, navigate }) => { + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + + const handleSubmit = async (e) => { + e.preventDefault(); + const form = e.target; + const formData = new FormData(form); + const data = { + username: formData.get("username"), + password: formData.get("password"), + }; + const { success, error } = await System.setupMultiUser(data); + if (!success) { + showToast(`Error: ${error}`, "error"); + return; + } + + showToast("Multi-user login enabled.", "success", { clear: true }); + navigate(paths.onboarding.dataHandling()); + + // Auto-request token with credentials that was just set so they + // are not redirected to login after completion. + const { user, token } = await System.requestToken(data); + window.localStorage.setItem(AUTH_USER, JSON.stringify(user)); + window.localStorage.setItem(AUTH_TOKEN, token); + window.localStorage.removeItem(AUTH_TIMESTAMP); + }; + + const setNewUsername = (e) => setUsername(e.target.value); + const setNewPassword = (e) => setPassword(e.target.value); + const handleUsernameChange = debounce(setNewUsername, 500); + const handlePasswordChange = debounce(setNewPassword, 500); + + useEffect(() => { + if (username.length >= 6 && password.length >= 8) { + setMultiUserLoginValid(true); + } else { + setMultiUserLoginValid(false); + } + }, [username, password]); + return ( + <div className="w-full flex items-center justify-center border max-w-[600px] rounded-lg border-white/20"> + <form onSubmit={handleSubmit}> + <div className="flex flex-col w-full md:px-8 px-2 py-4"> + <div className="space-y-6 flex h-full w-full"> + <div className="w-full flex flex-col gap-y-4"> + <div> + <label + htmlFor="name" + className="block mb-3 text-sm font-medium text-white" + > + Admin account username + </label> + <input + name="username" + type="text" + className="bg-zinc-900 text-white text-sm rounded-lg block w-full p-2.5" + placeholder="Your admin username" + minLength={6} + required={true} + autoComplete="off" + onChange={handleUsernameChange} + /> + </div> + <div className="mt-4"> + <label + htmlFor="name" + className="block mb-3 text-sm font-medium text-white" + > + Admin account password + </label> + <input + name="password" + type="password" + className="bg-zinc-900 text-white text-sm rounded-lg block w-full p-2.5" + placeholder="Your admin password" + minLength={8} + required={true} + autoComplete="off" + onChange={handlePasswordChange} + /> + </div> + <p className="w-96 text-white text-opacity-80 text-xs font-base"> + Username must be at least 6 characters long. Password must be at + least 8 characters long. + </p> + </div> + </div> + </div> + <div className="flex w-full justify-between items-center px-6 py-4 space-x-6 border-t rounded-b border-gray-500/50"> + <div className=" text-white text-opacity-80 text-xs font-base"> + By default, you will be the only admin. Once onboarding is completed + you can create and invite others to be users or admins. Do not lose + your password as only admins can reset passwords. + </div> + </div> + <button + type="submit" + ref={myTeamSubmitRef} + hidden + aria-hidden="true" + ></button> + </form> + </div> + ); +}; diff --git a/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/VectorDatabaseItem.jsx b/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/VectorDatabaseItem.jsx new file mode 100644 index 000000000..4ecd304f7 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/VectorDatabaseItem.jsx @@ -0,0 +1,37 @@ +export default function VectorDatabaseItem({ + name, + value, + image, + description, + checked, + onClick, +}) { + return ( + <div + onClick={() => onClick(value)} + className={`w-full hover:bg-white/10 p-2 rounded-md hover:cursor-pointer ${ + checked ? "bg-white/10" : "" + }`} + > + <input + type="checkbox" + value={value} + className="peer hidden" + checked={checked} + readOnly={true} + formNoValidate={true} + /> + <div className="flex gap-x-4 items-center"> + <img + src={image} + alt={`${name} logo`} + className="w-10 h-10 rounded-md" + /> + <div className="flex flex-col gap-y-1"> + <div className="text-sm font-semibold">{name}</div> + <div className="text-xs text-white tracking-wide">{description}</div> + </div> + </div> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx new file mode 100644 index 000000000..17accbab0 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/VectorDatabaseConnection/index.jsx @@ -0,0 +1,182 @@ +import React, { useEffect, useState, useRef } from "react"; +import { MagnifyingGlass } from "@phosphor-icons/react"; +import ChromaLogo from "@/media/vectordbs/chroma.png"; +import PineconeLogo from "@/media/vectordbs/pinecone.png"; +import LanceDbLogo from "@/media/vectordbs/lancedb.png"; +import WeaviateLogo from "@/media/vectordbs/weaviate.png"; +import QDrantLogo from "@/media/vectordbs/qdrant.png"; +import System from "@/models/system"; +import VectorDatabaseItem from "./VectorDatabaseItem"; +import paths from "@/utils/paths"; +import PineconeDBOptions from "@/components/VectorDBSelection/PineconeDBOptions"; +import ChromaDBOptions from "@/components/VectorDBSelection/ChromaDBOptions"; +import QDrantDBOptions from "@/components/VectorDBSelection/QDrantDBOptions"; +import WeaviateDBOptions from "@/components/VectorDBSelection/WeaviateDBOptions"; +import LanceDBOptions from "@/components/VectorDBSelection/LanceDBOptions"; +import showToast from "@/utils/toast"; +import { useNavigate } from "react-router-dom"; + +const TITLE = "Vector Database Connection"; +const DESCRIPTION = + "These are the credentials and settings for your vector database of choice."; + +export default function VectorDatabaseConnection({ + setHeader, + setForwardBtn, + setBackBtn, +}) { + const [searchQuery, setSearchQuery] = useState(""); + const [filteredVDBs, setFilteredVDBs] = useState([]); + const [selectedVDB, setSelectedVDB] = useState(null); + const [settings, setSettings] = useState(null); + const formRef = useRef(null); + const hiddenSubmitButtonRef = useRef(null); + const navigate = useNavigate(); + + useEffect(() => { + async function fetchKeys() { + const _settings = await System.keys(); + setSettings(_settings); + setSelectedVDB(_settings?.VectorDB || "lancedb"); + } + fetchKeys(); + }, []); + + const VECTOR_DBS = [ + { + name: "LanceDB", + value: "lancedb", + logo: LanceDbLogo, + options: <LanceDBOptions />, + description: + "100% local vector DB that runs on the same instance as AnythingLLM.", + }, + { + name: "Chroma", + value: "chroma", + logo: ChromaLogo, + options: <ChromaDBOptions settings={settings} />, + description: + "Open source vector database you can host yourself or on the cloud.", + }, + { + name: "Pinecone", + value: "pinecone", + logo: PineconeLogo, + options: <PineconeDBOptions settings={settings} />, + description: "100% cloud-based vector database for enterprise use cases.", + }, + { + name: "QDrant", + value: "qdrant", + logo: QDrantLogo, + options: <QDrantDBOptions settings={settings} />, + description: "Open source local and distributed cloud vector database.", + }, + { + name: "Weaviate", + value: "weaviate", + logo: WeaviateLogo, + options: <WeaviateDBOptions settings={settings} />, + description: + "Open source local and cloud hosted multi-modal vector database.", + }, + ]; + + function handleForward() { + if (hiddenSubmitButtonRef.current) { + hiddenSubmitButtonRef.current.click(); + } + } + + function handleBack() { + navigate(paths.onboarding.embeddingPreference()); + } + + const handleSubmit = async (e) => { + e.preventDefault(); + const form = e.target; + const data = {}; + const formData = new FormData(form); + data.VectorDB = selectedVDB; + for (var [key, value] of formData.entries()) data[key] = value; + const { error } = await System.updateSystem(data); + if (error) { + showToast(`Failed to save Vector Database settings: ${error}`, "error"); + return; + } + showToast("Vector Database settings saved successfully.", "success", { + clear: true, + }); + navigate(paths.onboarding.customLogo()); + }; + + useEffect(() => { + setHeader({ title: TITLE, description: DESCRIPTION }); + setForwardBtn({ showing: true, disabled: false, onClick: handleForward }); + setBackBtn({ showing: true, disabled: false, onClick: handleBack }); + }, []); + + useEffect(() => { + if (searchQuery.trim() === "") { + setFilteredVDBs(VECTOR_DBS); + } else { + const lowercasedQuery = searchQuery.toLowerCase(); + const filtered = VECTOR_DBS.filter((vdb) => + vdb.name.toLowerCase().includes(lowercasedQuery) + ); + setFilteredVDBs(filtered); + } + }, [searchQuery]); + + return ( + <> + <form ref={formRef} onSubmit={handleSubmit} className="w-full"> + <div className="w-full relative border-slate-300/40 shadow border-2 rounded-lg text-white pb-4"> + <div className="w-full p-4 absolute top-0 rounded-t-lg bg-accent/50"> + <div className="w-full flex items-center sticky top-0 z-20"> + <MagnifyingGlass + size={16} + weight="bold" + className="absolute left-4 z-30 text-white" + /> + <input + type="text" + placeholder="Search vector databases" + className="bg-zinc-600 z-20 pl-10 rounded-full w-full px-4 py-1 text-sm border-2 border-slate-300/40 outline-none focus:border-white text-white" + onChange={(e) => setSearchQuery(e.target.value)} + autoComplete="off" + onKeyDown={(e) => { + if (e.key === "Enter") e.preventDefault(); + }} + /> + </div> + </div> + <div className="px-4 pt-[70px] flex flex-col gap-y-1 max-h-[390px] overflow-y-auto no-scroll"> + {filteredVDBs.map((vdb) => ( + <VectorDatabaseItem + key={vdb.name} + name={vdb.name} + value={vdb.value} + image={vdb.logo} + description={vdb.description} + checked={selectedVDB === vdb.value} + onClick={setSelectedVDB} + /> + ))} + </div> + </div> + <div className="mt-4 flex flex-col gap-y-1"> + {selectedVDB && + VECTOR_DBS.find((vdb) => vdb.value === selectedVDB)?.options} + </div> + <button + type="submit" + ref={hiddenSubmitButtonRef} + hidden + aria-hidden="true" + ></button> + </form> + </> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/Steps/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/index.jsx new file mode 100644 index 000000000..3f218d531 --- /dev/null +++ b/frontend/src/pages/OnboardingFlow/Steps/index.jsx @@ -0,0 +1,130 @@ +import { ArrowLeft, ArrowRight } from "@phosphor-icons/react"; +import { lazy, useState } from "react"; +import { isMobile } from "react-device-detect"; +const OnboardingSteps = { + home: lazy(() => import("./Home")), + "llm-preference": lazy(() => import("./LLMPreference")), + "embedding-preference": lazy(() => import("./EmbeddingPreference")), + "vector-database": lazy(() => import("./VectorDatabaseConnection")), + "custom-logo": lazy(() => import("./CustomLogo")), + "user-setup": lazy(() => import("./UserSetup")), + "data-handling": lazy(() => import("./DataHandling")), + survey: lazy(() => import("./Survey")), + "create-workspace": lazy(() => import("./CreateWorkspace")), +}; + +export default OnboardingSteps; + +export function OnboardingLayout({ children }) { + const [header, setHeader] = useState({ + title: "", + description: "", + }); + const [backBtn, setBackBtn] = useState({ + showing: false, + disabled: true, + onClick: () => null, + }); + const [forwardBtn, setForwardBtn] = useState({ + showing: false, + disabled: true, + onClick: () => null, + }); + + if (isMobile) { + return ( + <div className="w-screen h-screen overflow-y-auto bg-[#2C2F35] overflow-hidden"> + <div className="flex flex-col"> + <div className="w-full relative py-10 px-2"> + <div className="flex flex-col w-fit mx-auto gap-y-1 mb-[55px]"> + <h1 className="text-white font-semibold text-center text-2xl"> + {header.title} + </h1> + <p className="text-zinc-400 text-base text-center"> + {header.description} + </p> + </div> + {children(setHeader, setBackBtn, setForwardBtn)} + </div> + <div className="flex w-full justify-center gap-x-4 pb-20"> + <div className="flex justify-center items-center"> + {backBtn.showing && ( + <button + disabled={backBtn.disabled} + onClick={backBtn.onClick} + className="group p-2 rounded-lg border-2 border-zinc-300 disabled:border-zinc-600 h-fit w-fit disabled:not-allowed hover:bg-zinc-100 disabled:hover:bg-transparent" + > + <ArrowLeft + className="text-white group-hover:text-black group-disabled:text-gray-500" + size={30} + /> + </button> + )} + </div> + + <div className="flex justify-center items-center"> + {forwardBtn.showing && ( + <button + disabled={forwardBtn.disabled} + onClick={forwardBtn.onClick} + className="group p-2 rounded-lg border-2 border-zinc-300 disabled:border-zinc-600 h-fit w-fit disabled:not-allowed hover:bg-zinc-100 disabled:hover:bg-transparent" + > + <ArrowRight + className="text-white group-hover:text-black group-disabled:text-gray-500" + size={30} + /> + </button> + )} + </div> + </div> + </div> + </div> + ); + } + + return ( + <div className="w-screen overflow-y-auto bg-[#2C2F35] md:bg-main-gradient flex justify-center overflow-hidden"> + <div className="flex w-1/5 h-screen justify-center items-center"> + {backBtn.showing && ( + <button + disabled={backBtn.disabled} + onClick={backBtn.onClick} + className="group p-2 rounded-lg border-2 border-zinc-300 disabled:border-zinc-600 h-fit w-fit disabled:not-allowed hover:bg-zinc-100 disabled:hover:bg-transparent" + > + <ArrowLeft + className="text-white group-hover:text-black group-disabled:text-gray-500" + size={30} + /> + </button> + )} + </div> + + <div className="w-full md:w-3/5 relative h-full py-10"> + <div className="flex flex-col w-fit mx-auto gap-y-1 mb-[55px]"> + <h1 className="text-white font-semibold text-center text-2xl"> + {header.title} + </h1> + <p className="text-zinc-400 text-base text-center"> + {header.description} + </p> + </div> + {children(setHeader, setBackBtn, setForwardBtn)} + </div> + + <div className="flex w-1/5 h-screen justify-center items-center"> + {forwardBtn.showing && ( + <button + disabled={forwardBtn.disabled} + onClick={forwardBtn.onClick} + className="group p-2 rounded-lg border-2 border-zinc-300 disabled:border-zinc-600 h-fit w-fit disabled:not-allowed hover:bg-zinc-100 disabled:hover:bg-transparent" + > + <ArrowRight + className="text-white group-hover:text-black group-disabled:text-gray-500" + size={30} + /> + </button> + )} + </div> + </div> + ); +} diff --git a/frontend/src/pages/OnboardingFlow/index.jsx b/frontend/src/pages/OnboardingFlow/index.jsx index 106f7cbae..c46b3c0bc 100644 --- a/frontend/src/pages/OnboardingFlow/index.jsx +++ b/frontend/src/pages/OnboardingFlow/index.jsx @@ -1,57 +1,21 @@ -import React, { useEffect, useState } from "react"; -import OnboardingModal, { OnboardingModalId } from "./OnboardingModal"; -import useLogo from "@/hooks/useLogo"; -import { isMobile } from "react-device-detect"; +import React from "react"; +import OnboardingSteps, { OnboardingLayout } from "./Steps"; +import { useParams } from "react-router-dom"; export default function OnboardingFlow() { - const { logo } = useLogo(); - const [modalVisible, setModalVisible] = useState(false); - - useEffect(() => { - if (modalVisible) { - document.getElementById(OnboardingModalId)?.showModal(); - } - }, [modalVisible]); - - function showModal() { - setModalVisible(true); - } - - if (isMobile) { - return ( - <div className="w-screen h-full bg-sidebar flex items-center justify-center"> - <div className="w-fit p-20 py-24 border-2 border-slate-300/10 rounded-2xl bg-main-gradient shadow-lg"> - <div className="text-white text-2xl font-base text-center"> - Welcome to - </div> - <img src={logo} alt="logo" className="w-80 mx-auto m-3 mb-11" /> - <div className="flex justify-center items-center"> - <p className="text-white text-sm italic text-center"> - Please use a desktop browser to continue onboarding. - </p> - </div> - </div> - </div> - ); - } + const { step } = useParams(); + const StepPage = OnboardingSteps[step || "home"]; + if (step === "home" || !step) return <StepPage />; return ( - <div className="w-screen h-full bg-sidebar flex items-center justify-center"> - <div className="w-fit p-20 py-24 border-2 border-slate-300/10 rounded-2xl bg-main-gradient shadow-lg"> - <div className="text-white text-2xl font-base text-center"> - Welcome to - </div> - <img src={logo} alt="logo" className="w-80 mx-auto m-3 mb-11" /> - <div className="flex justify-center items-center"> - <button - className="border border-slate-200 px-5 py-2.5 rounded-lg text-slate-800 bg-slate-200 text-sm items-center flex gap-x-2 hover:text-white hover:bg-transparent focus:ring-gray-800 font-semibold shadow animate-pulse" - onClick={showModal} - > - Get Started - </button> - </div> - </div> - {modalVisible && <OnboardingModal setModalVisible={setModalVisible} />} - </div> + <OnboardingLayout> + {(setHeader, setBackBtn, setForwardBtn) => ( + <StepPage + setHeader={setHeader} + setBackBtn={setBackBtn} + setForwardBtn={setForwardBtn} + /> + )} + </OnboardingLayout> ); } diff --git a/frontend/src/utils/paths.js b/frontend/src/utils/paths.js index 7a0c7bb70..547a3b3f3 100644 --- a/frontend/src/utils/paths.js +++ b/frontend/src/utils/paths.js @@ -7,8 +7,34 @@ export default { login: () => { return "/login"; }, - onboarding: () => { - return "/onboarding"; + onboarding: { + home: () => { + return "/onboarding"; + }, + survey: () => { + return "/onboarding/survey"; + }, + llmPreference: () => { + return "/onboarding/llm-preference"; + }, + embeddingPreference: () => { + return "/onboarding/embedding-preference"; + }, + vectorDatabase: () => { + return "/onboarding/vector-database"; + }, + customLogo: () => { + return "/onboarding/custom-logo"; + }, + userSetup: () => { + return "/onboarding/user-setup"; + }, + dataHandling: () => { + return "/onboarding/data-handling"; + }, + createWorkspace: () => { + return "/onboarding/create-workspace"; + }, }, github: () => { return "https://github.com/Mintplex-Labs/anything-llm"; diff --git a/server/prisma/seed.js b/server/prisma/seed.js index 71d1e63d6..829b812ab 100644 --- a/server/prisma/seed.js +++ b/server/prisma/seed.js @@ -1,12 +1,13 @@ -const { PrismaClient } = require('@prisma/client'); +const { PrismaClient } = require("@prisma/client"); const prisma = new PrismaClient(); async function main() { const settings = [ - { label: 'multi_user_mode', value: 'false' }, - { label: 'users_can_delete_workspaces', value: 'false' }, - { label: 'limit_user_messages', value: 'false' }, - { label: 'message_limit', value: '25' }, + { label: "multi_user_mode", value: "false" }, + { label: "users_can_delete_workspaces", value: "false" }, + { label: "limit_user_messages", value: "false" }, + { label: "message_limit", value: "25" }, + { label: "logo_filename", value: "anything-llm.png" }, ]; for (let setting of settings) { @@ -24,7 +25,7 @@ async function main() { } main() - .catch(e => { + .catch((e) => { console.error(e); process.exit(1); })