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 | 118 +++--- .../OpenAiOptions/index.jsx | 60 ++-- .../LLMSelection/AzureAiOptions/index.jsx | 159 +++++---- .../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, 2220 insertions(+), 1788 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 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> - </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="flex flex-col w-60"> + <label className="text-white text-sm font-semibold block mb-4"> + Max embedding chunk length </label> - <p className="text-xs italic text-white/60"> - optional API key to use if running LocalAI with API keys. - </p> + <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)} - /> + <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> + <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"> - 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"> + 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"> - 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="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"> - 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 className="flex-flex-col w-60"></div> </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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 UWUimbz`(%Z>FVdQ&MBb@0JY=hrT_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 zcmeAS@N?(olHy`uVBq!ia0y~yU`%FUU_8XZ#=yW})wE(20|NtRfk$L90|U1(2s1Lw znj^u$z`$4><nF|<?wrg^1_lO}bVpxD28NCO+<y{T85kAkc)B=-R4~5zTe%_aW}$pX z>b>{X*>CTL?oE8n#?d9y$>QNDBCg}gpyHV2#O$?jgY6<7kG_phemb|9Ncp!MRut%& zQU7FvMpR;Tnv##BvRC5G<Vlx$R61HZ9w~L*@@QDHBPsJu#)941wWqh={c`iuoHI7h z>)!8umG@=!b@ScvwdI!H^Hl3+s-G_sbd$<dalO7i{=5Bj#%=nCJ#ufA)wh302<rYW zzSO3Dd)}QLh1~BZ3%E(W6!p7)|L?mG%%|VI?I@95QEki+>fqC7;K8%)>9M`#>pxl7 zU;S>^=WV)YGSl+Q3gVKAZO#+jI>en`r+@mF(Y5l3#Ye7HMK{Y!ExyVKU*32^{g_~6 zTR>U8uX~I4b(Sg4x2zrqg`{@;7m{hMWKn+>e^vjWuEVd0_7BFZIsZPEmjCzRa)FQ3 z!HOl}I<fWPOo<2hEf(&}i>qFk6=f;de(Jr|qI<2ckJxT$UB`93`_HaV^X8x4@cNRa zR*%p6qqFz(J4!u$@I9rj|FnNy`J673gKU9QU%&0Jig4ewZuh$zKi)7c3V$%&)Z#L4 z(>rJLe^2fIR=c~(gKU#g_5Pt5^T>b4{q4t>SKRiTAU;ESgVm0YPHnT5_Zn&L-mYeS zU6yD6@r6Hb%PQHwl;8E6|Lf#`&98Ny3ih~HxnBJG{%_s?&&@lE9D43`HO@ZQ@v|`E z-TxmP2bA|lOlho4e!iD4<^KCMZ?5mWc>S`;!u@5B)BpcGzvWR+g3TrEwsrfB89x5L zd;h*y-JSVmVISgU94nSg?^+knzj%XsVVC`*2jBJz)JXh|-|<o3K4zz`n}OU*QOE1| zf2#jI|67LTf9(5<uLbJAJh%UJzK+FB>SeaW`-<!QKjzC9F5bX@fI-1OVaddE7Oe6g zTjn{vs=IYJ&r;#v0_I2jhdh*PdtY3h|BJce?(6#%%69}T=NFa#J-NRAuzl4p;rS;P zZxT0nZgI(jpY7qPgYQ@U{<$Hh_r-B{1-X|`7f8$hOn(>uC-A_#<9ClvHEEoa$?|yO zIg`DQtLqN@esu47+P3*B3;Zv>N?>_3G0rY3Pe5n6{i{DB{?-Zm>i$;m```ZaD#tP9 zxtX6%+upr@|AU`Zy6FEG7Ln$cPJ5c?{oy%KQg-?4sr@g$FHv~N{^Kr4Y2>bVYm&Ue z49h;uyvFm*L%DYC%VX|#Z~nc_6L@rd?!<zZzjoiNy=xDO(9Pa^KL>pIuzXMGn}5=G zg_Y;Zy_y?&=kouKJhk<U-_^gC?@h3|6uJC$V)QGnIz~6Cms<k-|LN!aQ`jHPf2{PF z^4!2rdR*@JAH|65f41xQ`ujgl*#8fc$XpWaa{sTb{ezF+gV*)%>znrXwfpIcC7V4j zeyT9KYs;(LTXO1zyvvh+c4B$UzAV%1F}W1EM33i}-tVO%E*9$+NW8o<(VpkZ#oQ0w zbp=JKpzu;D%`DcmOgAhkk#>`MIYn^(?l;d(_H-wK<#uXj{crYeKbqH;!t!{cpM2@h zGk-ojZ4~Trx0*f0ZUW=SoDa$K`Ry)w#2cTgHK{X9nR7t;Wlu2M(}`|Yu`M%XkN+#* z0#<83+w8~DT@&4^Dpy7vOPp2-GTr29eq5i)rA%e7+ROhfPFIu!_mnK_+`rD|lE?Bs z1DWKh`=V{5jw#PA^jh8K=6=*;dB5A~iX{`>q+Wixm?7C;VwM?m%j^=flf<+4Zstcl z(x-kpa<}8K@?1Zq7l-wii5^py=r1wrJofdd^4z>60lrw#<G%9Ba|@-e2lbRxX;xgA zQ2i1VsfALyPbT_lx2B2|etf!vIe$qwL$7d!@?5_z>xFmUwEeCJ`RPp1tOL^5CHucD zxB$}QE2aLy&FZa+dF_E0#&R!vF7J@7S`zG?X>IcTA}DY!o5+cnT*_4czqEhf`{SH@ zCZ5yioo(l4_4Y{Zlt0rmcNH?_gFTYE(C%DzMK|N_JWwz#o}%_)kA0uNrcCCN%dUGK zu^(HSt2{Tc>-Im!<L_&FN^YIJ&3kvp%j6~D3}1WBDEF3hbrkLY;;oec(meZ$^SlGj z_LfYbG@!Be%fS~bBy=B7Jg2eqr@;T_zZoL^CATu~d@;PF-Fyrb4nd!$8MYl2S=iq< z?W0Hf<WE+Q3ojq{SU%;`w7)kZ-3{bkzPbEjmBdSvNjJVc1ZOO@jaMC8F7%$h?Pk@g zVqV*`TGP#H^OgR0ofG}6JALI1Kv5MaG>@}spS)w`lFRNhYL6u<<;VCMUYfZ?@9)ve zoX0`QI*!Y4OQH1_P;A{(OE3Il0@7yZbzI{3zMB_8e%tJ6^W^ox`tnSZ9(SwSDdi7T zL8b9#KMrN7{*qZI=WD%K_7PP4^aTB5ll%IZ<(|j#iAC#Gy37uHD9`o$WFa%HV3(g= z+2@IVih`-f4cGj-=xcZ>QuSx)i$d;u9?K_a{OsBLxuQu~qTl3_hw@&XD<|KZ^nnV& z#$%s*+^t$&MBH;aEau%ZyA-)Bqx4ArgWlsAeI>s*&OQZ4yjS~a<wS8lZmG;Am)(ly zeza&bzch2{#{~-}`dNSEvtd8AZg-#c2REz5Q*@FeSRLfRL9sF1s@?FXb5lV~gXN{0 z%R#Y!*&|VN&;4rix|hjIHv3%iHGFqK`X%Fni$-!UeS|08`D1v=V|m9TcF(^_@=X`h zZ7$7J{U+J&905)daa?g-c{UmuON_l%Z(+8QkX?MfV##HXR8!VI@7r!xn_GVVPEzLU zFWIG;<1?%0cw{fwr)ydkr`lZ7ZaPsfSPP03%_UpTS@1lXlWNoS(Ib7zj~hNsd0!;^ zzc7GPxTjZq)S-L7d%%(AHp#5%^<q$dTBa#;n@zd5<X0vrSM&t^c{6FgjHLBXkL5G> z?0qmd3uJ}l(!%F=J(kb8WR=WwS~G(Mln7Oecf|L_bxris><qqLaH&^$$Ha4Hs`^JW z6#GklW!P-ZT@udp_0g4W>!fr0Ci=;LoY1S=3d%^YUH<OalDj0><D|l|AGt3;LW^C% zkv`{!+X22r)4X=M%q5_5rNg}KTc+k8P$YTI`jFKn+GBEQ<uZ##_s4vDCZ4lV?0MHU z(NA&W534Qq_K<?_<W&*n-V!OzwGI5%c7Iep?|7EJ#Mm?Txqr5@O#d>8my8Pv=YI4^ zpMJyWn1{h7kLA4;O#N$H!7(HheGDWr<<Ej%_q>0>y&!K#E(d3zNt0FzObe>m{}JpG zA>oS0SzQzTRG0EA{P61nsnc%cI2J0ZJl9Fc`!*;if?`Ksdf`4$GB@^ol*1)s?_qT* zQ>AO&mOq-aKt7(VvfX(%r;P+C$(^)zeEDD-Nc6MGuO4@+sVaRJjue_6^+=y~?5c?J z+_I{`^UHSB{k`jNb^DiRgwvLd(|a9^+Lu<Uy^k)8PJGDPCf#*9wITTflhU6}6Z?EW zTRd$s{rIMO$9a?f+3mf?A^K*r(fx;O>}nq$YoFh?p7r97rTr8A?0;_kpw9I8_4W1f z?{?pnFWcAm`rS9*b@Ssnw;g9u_^;-a-;>~0&!MPRnHakzLhYw-$LsRNC-$y>IPXwx zXLPVn_vV=|o?H5Eo0wxWvtIs?leYdr?{mkePgD!>a#`ska+&M5^xWM->K&GKn#Lzr z1^KJ5w27@)@JeNgui@JeJ+I7HAs439CY>_u+!GkS)PG}wlApZv#p%xBTr0MHzxZn% z|I7BA+AW<YjX!?)R$lWz_xQu(F&+G+(jU0Z?fwWg8ux(;-?=J$Tvq#1-{?GeZE}!* z$ByeCCEl5HWjsu|#l0Y6pW=Zqu2MGF|9(uH7&^IRHgDkPar|p7ucqF}`sQ-})N8Yx zd0uod^Cem8a&$?^mPy2U?@N}6WY_qyFoZSZl<U5SEC)i~OMhMdDxyI4_6g;>6xpd+ z4Ueuf1<NnE9h}zt(rsy?=-S2J>%wB|o3?*1ZhHOxPvd@e>A&ppIstO~zZhO(c6qY@ z%f_-l&vYNYe*bH-{j-K2i~n7F)U?a<$al{TuVY*-*knY{rzG(_wUKnr_Io_3X?}Cy zla)&aHoZ@aIM2gWr#<Dw?5{!h+T|Wi(DI*Zcb(gQ>er{2zd4-oay4G^YV{+ZYw|CC z@nmuL1-s2$ac<4FS?o=#ejQ&?5c76Vzu1qJ+xI?Zw`0&}N(|6@+?lI9H|~@5hf8`k zb9{Cs8hrbg@T$zt>&kw4E{12{RdU~a*?p~QNy@X%<Sn1{d5#-f=sIpmUEAoh-DT1- z1tWvoYXU5EGa9BZZjn}9qMUHlyGqfq!-3hjok4j0ri!1HeAk!WygAEX=wYDBY~93_ zD!c_wtLL~aT(!&ar*`Y)&zTytmPp$@h>@^=%F9^cc%{{Tb%nds%Pj(xFOMgz;hmpe z^Y?CE(z)ov9Ql6zQz};pO*vLDHTq}r?hRAjjPH5gzj967q~ghMN3o0pUj^3$Ib<d_ z?R~ap>CxGL*7_FoNV1wUt_w|(*%JHj)y_bMi_>)vh5T6@u<THm|9jE<IWM_e6F#df zOi7ZB=$-Xx;>VV0-+2Bf^xyuk=p%4nJ@5~I|EnzJ-Y-Rg5-P#BX1K_PCA?|8!7Fb6 z>X7YCuLDu(2`x6e87H*b^_~9P+~;e)<sY9C=N%dIrJ++9*|^hnzL%Xy(h*+MTF$M+ zW3W=@(ycXzR#liPJg{;&|GjO$>4BtJqa}|-s_%Sq7ivgd!T9t-(5V}{rYrNmf6Q0h z#Cf99N#IO}!*#_y_r9M0y=}tZW&K+|KJEyU%Um+O{f6(u-?ja`r)Nz2arxbIPpd;q z9vG&UoOLX8W>{7IpjPdm*GtAN)ygv$9x~*qT+zdm(!+gZ2VYgh+{IB&XV-K1GYO<r zX00}=uILuMF-yj4&m>Qy<(lqnF=<B+8>CEF<9~Yllev|0C3TZew%_*quwxp3z&h2b z>)B&gx~T9AHlO_U#&T!S{Ryupn4XyZJMVe^f!YbP`8n&ImFG@$tJ<l#TT@8WVBbGI z^Gc_SrWYB+UEg#o3#e)E_Agd!?{K`7)o^N8-p~G(3>IFeb@_8dy)FATX<pXY!_;W= zrp=~A?eMM`hfQHCc;9!~v#edgB(&_P+=;$7KO#OQeGXYIe#AI1=+ry5)H^|ed=D3` zk9B*<!ycV<p(dhrQr+IIv)>;svWXPG642JWZ|by<jMu}~I9L4tTE6$U)tm{7jAcAE zuS|5aauwNjZ>eki+}~#t-ux}*ldq3pb+dK6;v?|YVDGF@<y8lH9rW%`S}^CJq2=F0 zi+QwIL>o?+E}2@hdHRth`E7?SKjwUSdZ4qJjb(LF=+Xwo`Pn{Geu-%W%ASjQpVnpg zFOjK0R@V1kl3rj|=b943YpJJ%qibAaBSda7%$9NM6?zhq7ABDpsdxI{iXAa`O#iXW znQ$YWN4dAe>*RO8LrHVe43>F*XH=I9U&Rr2;liz*f~{Sua|4qEG9n(_+$DB?ioexP zodC&XmZF<dGlh4$9GF(W`6!=IN>6{DNTTH?`>8omPL50DwGQ;&@>#AJa%Rn^9Wgyd zU8Npc3pf&fG%23a;$JmYEOc(MbywBdJ#0s(KWB>4@;K^{DEQnw(`12Ykyoc<)JKWS zRiAR-*L<&j$YSDIZ@2Q}m2DIKtSuXbg)6Sahew36NF2G$xKKQgrOv5RVjko4lRSrw z6(R}@57#|XO*E1<Gn#rqT5PL+^ZUs^bsL-_zMJmneV}BWvi!{MEs3cS(Uq!qi}KfI z<s8}g)JbrkQe=10mctK~6~t^`o%XN&_`X=;;lB<&ElGP;@Bga=d8W_*^m&qfn(CE1 z5r-cu|9|9?aA$YQ?-$DsKwMRMSg~Q_{Y3V}uPjSv=4q{#?0LVQ?Ny7_v8pZaxF<G= z-V@u=;FIlJ6<T*}k}T7KqUO?nhPHx!5mk~IRjb0LJmECpi=NIKtuw_WpiOnHOG}r- ziD{K=?_Mltbv~rlrsdD(DRQoVM%=j$k^gR%-ba^w(wL@S?0eL_@4#R0@<j$2!lmbb zobeJ`U;n#Sr}VHzy$`6x&@)Ng^n};@C9Au|zsT`TaPaW2_?WW8LtV}7wbjloDpOUb zwX9upBw}({2-}HiMP2=CZ9Ww<F3D!xb2Oi+%%d{s@S@zg#fondQbnHMSt1rZZ=P1I z%G5MY_MM`qCfG6GKd^$$aZOofpybYkh__8ER$aG9PO-_+Js;e#_O(Q>kj^QW--Zip zor?U;tZMjWCT}`l(eiMjpQb9as&_g=@|zF7W^?|#Gq@J7$kEx(sBO@`J-Q<Bm*^9h zS*%_nhd)eVi(YYPS@MItM{S!Dc=xBAp3>#}##y(^<HNE9HEl-M5RV;lXZA#`)V?Ce zZSbb^(=vg?=q=lptzHrFXOr(!W!~bjIX7>xg)y}RoH`)3<y5d<?qr*d^K>eUY&M;~ z^JY)u!|NX}TsA+<c{2Ut)xYISCdQRLx+*f^m%4s;z0n?%Pde(+32QqKZn|vZAo|10 z!ENUf?dOfJDlf@hoOeB<`_DXiA=yl}NbjAwy~*dUeqbx&;I%PM`!sc%;s=gqNA)-L z3{7HX%Us&$X&!xiI>6sYbn}je`k)dIwg(*2xyyP&ej7}cU8qxVaxo|4xfI>#gOi_l z_qnL#yK+7;d35AJiqP+uA6NL-vn)OiYHJsnwk~Hlw(jwMy}!2-7fUX?e)x^V67|fQ z6`ZpeU(bA{xbDPmiJ*zg1$O&bJk>pRscYR-N1-oT_6r5pu<|FI%DS{xU`oe{J?9T7 zF@`rSUY8VlT;sE!Ldu$=Qw+zvFY@rO?76^HWBq93I*B8Ux)(Lf9ipt-xMoRiINf|G zSSlkxu5`t=2=hx_AN%-^?KyWNzJIx7f61)Qg9^Je1J;WPGzlDN?U0)2=_=T?Tz$XP z%r2WJ8$=@Pq_0VN9zN+OF4?nv!R;j19b#H%FP+#O%NIE9PnSIR2LAKy4Qwsk%Z@fY zv+QTv5OKHii_%>_mh4-)KT}ozdv%`B=ry{fuqyXU>0Ggl3v2I$tL(89eXah1Vfor+ zihn`PVv|X84t&1C%N{aW>#A{vcLE0=^N}#YIXzMl;s-mjz8_J@m?54fv9`(cbs*Dm z1&v_II&D_vQ&uzD)L-UBFyCSbQH<Su&v4G%iJPaqwKy{0XYtfDy;Uc|r>>ni?de9= zZ<hN)1D*w_ZQIkIy0tpW^7#=hD~$qB*SGhGaD~qQP4m4DY!KGg+%%~*=PrkV*TdH) z3wWBNGYjm*ZX8WMk)~iT&bH%@P>oDuYPUWARo4Egmo$|tCvz}w-y`;LgV}D?1*eX% ztF6^qx3MZ{;-|#mz@?>grY*8`3ST7{%r*bOUdd@vr}`G3^g8=J%v0iNMb4zWu8D3| zQ=jaeP+N91ZL#Ao{=Z9^0*%+4+0QfY&F{w?9a}dzZS1)gdG2h5(2FH=f)*}zVCk6U zpshZkXs1@M;;HF}viBu>&5T?eB9ZdQI$*WXEIsa%^ElM!KddU4v`)r~Z-Qq-8)Ns* zC4SBSzW<qL>u;ufbAQU-(^k(+q8HS}NNsoSFS&K{ky`V{4>unPbZiq!{vgA`u9#ps z-^I7UhSPBWKabOjk)qS0zxm(#VKk>=y8gm#YW>-@&vT?I!y4=-v~ArHY8iEEX-oh5 z3W+0L4PQDAY-8ryellS8s*5d|kKe4$-@3Najj2R;#_7i6ot{z0Aic~z_l^hOYjnSK zL}yw|>e8)ioazi4+9GdA%eUr4EtK)Mo8FXPcbWH~p}ke+<(#Ovpuzyox}1O$3zme< z2r%w>s2=^nY|hF1TI?Bjr7ui%)XKK86?T|+-}LY0GLytdrj?V=M<{x>o;Z2KphUhx zN9XbHuy4w}U$!pV!@OQqK}~1AwodxP)7~;MlP2h@Xujz!_%@T(jp6O1fXts3&FpMj z9ruQcWw9i;ILcYw-omDHd5S`4>g8$LS5lo<{XJulVHqB_s^=Dy&tdf$6+#o5+p86L zrOO3AEMc`jkS^MKSdG=YVohVmvd+!MYI~M*f<~GG*>9RUUP`Z7;_tWTe8MFr^@d*u z#I-NTY-7E^R?|3@!C|Y?Le8jfRSo<{)i)n@xFx|jq4zx7T-MAwz0;bHyFZ+|bf%Qa z*Zan#HRVr(1T&*Q<m}9d$`qe2dZnH5q?J%*SWRSIFYBIbNmEO;53O6>-&JAS>YoG} z3OjW&U+O~qFA0Y0jtLtM%{{d0%Ldz!sV}1r+MJpd+@N=v`NHH_HXhxiHL_09-TO{< zZ-~13TX8y%d+yTAsdM)}|FGxEjb-^FcNQ#?dXW7=TXmZKZ|>aJmAOAt=VednD_tsM zn7Oi3_whk~+dh*^r+qG^-#MvlqFZ3Lu3aa{iZ3Gg@zf1MpEuMc{D@haev)Cg&36Yz zi<|dnea~Usw&wBT3P~wN5ARFIGF7ey`MqSl`F-a6FzXv-t=sr->?)3Wy0~%M#4ZO- zpP5SnCTN`xv->7>^oYWo3GdX;c_`QFcH9-&*S*eRjj`CY+~5U_xB9HL19-dp=4*ex z6477Tk>|M3@d$(Rfi0)@C$3#s!ER<FvLW!=Mx7>>TZ&5+S1n%U&;0MyRfR*VYF5T_ z`Z5@MP5!y@Z98-335&4K2`m|lf3S&|dxcNC^^twqKOf0Z$&#tE^Q-Jva!>p&_uvU< zkI5x(pBl5)_xCGJStSZK9c!s5o8+gvHqc&rF-y<EEv9Rx{cPIMSJ829a%qrY$J1zc zL)TqLCaO-nzd%)Ot^a4f*H^mcPdlyoGgpI6DoAX{u^qw*$Hn&6?$2u~HHf@WYP6&v z^ir+<+WJ#Z^Pk+Va{H=0SO3oOvKPOdK23D{B{jift8ReRR^NOV1xJ|;TT6KQ4Vio{ z9f^J(<zSZaZ&vk#&s--yWdF=Q5*ns4JMGXezMPW=7bMO_KQ+v_JJnbJnio6wtY_wb zou`&&RGy6FZMMF#=emt@;C#^pvmXs&Ka{W4#YygCeev(Q_N5DAPeY|${5Qx(MI2M^ zEz$C<W$vH8jd6wN(hN(f$vT`JemS-A`Hh|%r@f2_Gj!mc^sTluzqOKs<x>9TUsEnR z?r=+J@R4%vO0?h=ncP;@ao*-c{M6%8ix$t@oI2M{%-2;p;*5Nq<;tzPhr%EJ_+pv! zS##>0&V!~2wleZZ+@)SVRocqT&oD**!X<_Y8mrebD!g7}oH<d}v$urp;7ZmF)0TY9 z-*}|q_{7YaCR3_irxXfIXz<Yee`qmx1G6$i_S|i+wn;4&ao+B8>}iRsQpi4qwQ83A zp^mf87s-kQ8m|cBE2&>#rI#!H(j@51{U~$R{Vg?{PAMo%U!a+AxGA?al%tU40Z&9^ z?t%*s;&+-w?eVbl`FG`n3A_3G>rtmde%tm(pL@2+HoL=Yo@j#U(H2IBZ3{d?*1lX9 z@pvK2bN8xGf(v5XC*4omyt&)CWvjBh1?NoJ3iWL(+@)SFUG`xA(~I|3`QKj1s5QS( zd0ox5B3YAGj+WHPe-*BLn=Phxd$QfJF78Li^f=ijE3cTkZjXKEk@evbGin#8YzkP+ z_R?=+s@T&djNPW%2f`L!-5yd}aeC3I%U7yb%da@nx5_!v?6#fBh9nm0cl>_SKRmHZ zkZP=0!rrJhcSFxogRIvcj2#?#lQ&P}o$=x71&J<wF_BjnHn#Mg*?#Q<NA{}BtIy6` zny)c^=DQ?y?Tf7s=EkkkkM!8{xaOyoEyKb6GNmc5E+M@>UNr};+u4(4FU=~RsM>Ig zx!FVI8pr&~gKe*qI8vPLZrDAaW%9X1C{~k?%jx-)wux?5xhi470q$wH>*6L(So4I@ zJ6$(o(}k_q1f6qFPF1X_=DEFT&yUK>MyYb%hM$U0`uwb`j#=cW_SYdPsQdI~8QCov zCm#CTdK=hW!*<c_W`n59RC7KJ`_n;}Y^t0lyy^@LtuHiTRS7>*5V6?cQ2y#_kE3ai zgPQMN5EFb@Y(3}60fo|*H1l@{rC){!ukw{Ya7}4yD4$b=(FzqwN4Dsk-}!HCCv9L^ zsqjo;m3OvL@g0F0Y29Y)HM0N2KKQ04J)5DPyx{idN_JguZ?oW;b&nWRW@<KXiCV5J z)boyi<&2=sp|?Cu=BF)>Seo#v%_}72qpS0gJf^cw>q9SXsXK7_lVtnrJJ&h-bERe< ze%hZO)NgX>ddHKpj49r?r4}qW5VVv3)C7@V-&AJKdXX5sp6AX+&Sfh9l%!rN))voL z^M37Yrrce7H++jUbkI!hY`dC1`AzL>bMf^&Yb`S$34ajvuU(nFdd02Hd4IwWc=;~k zbbE5btvBz6mgv=)S0}FF7PMzb(ih>l?iznx{=kQhrLM2I*Up&2EAq6x<2ZZbM2+ZU z$^!i*TAscS8Y6DC9r9H;+`OS@L4(MX=URn6hfhkmE_S^xmobSk+Rty7o8{kWmYRCH z5tBJD+XSAoJAJTK)a#R7@f8W)6F)c~H60Q<rKvjg^Y%XtM;<K-&~jy2aK1I+^t}6x zp=B=4^A82h<6p_q!j#t+R5bgAg2tlBJo=Z?mtOv3cF8J1K6A-tH<#YUalcvSJenx# zkS)9H$fVNdR23ejMIG0pc8NMH^^us!7PBI7XVpYGZg1bn1CQoOg++aie74n4P~$_? z)ANijP0rpAR;3HQPKk4Vn0jl`%|0uG6|3aEyqbO5j(8nWF)fMT#h_(Ad4>48)3aRH z)M_odqtYbPU1gsizKqSyLH^|xLDz1Tl2=7$tPNkUnzm0pS$=&Ahw+!(Uy7HDQ&qQa zH(bmXbFxd|%{<1oK!#VQu}zFiLt4xqXw=PSXWPn?yh{C0$Ud1yscU;W^Y3!&rcSK% z{CRZCirNYF>(m6En{jW;Iizx7?o{q8PtS6ln=&)jv{GU6;c0o(rmGkwd}rn|3}=v) z4_1HKf3tC-n^o$OJg)nz-?GFhXeuPE;j(5sTbQu+r=nxu8!c|*nB$D=HcqTF+}ZN; zs^NX+rtHR0o9zvDJ9hJQ`$zmddbA++*yg9MGw1zr>U5Bf=8v2hY4ChY&EBMk>i#UN zOjwfLR&QHVvUHA=*UHMi!m`s2A2+La-(cGP>5j^q?O$7Y>-@YRi6ZJ)B~$;w>$Bue zE?Oy^xy)N8{lqTLLzyjF+;1FYwyoQ=`zG7cCcm4y49rtbNgA*FxniE+*3%((opK)v ztt<*xIQ?+;SMROeZMWGc=kGWqVJwu;da-CD&jR6@7n$N$_iBnY6k952s(ZVg<Z?Zq zxqvTfR%6GSca~<o)*sxeCam}*xtZIM!){jo>7^Z!S>3NiZiOxB4PUC<65LnBIHlTA zf33l^g&S9CKb)S($aYufSNM_XVT&Y9TNbGKta9IQATII*uiTRCBYYoyZ_ZjL{ZG;= z=(5u0AcfwlEl=4$`h3jkynM_}k~KeNQfTV5zexovj6FWS$TRtyxMZTA_DcRqUfu%j zvB$5r%;42nXW7%EE)-Nb`ON;0SNW&@x5~c7cJH3ubsz7hrW4f~>r)EER<CPyHqxEg zRug_z+O%TQfjdkFneTj;3*WeP_w3D?_wR^BJU6~$R$4hV==Iq~N42<>$ET(CO|@?N zx%NjQYvHB-NmW16mh<(PT+&o|Y5dLPs{UDvixW0ZQc+;PuikmmT6kM#;>XIKIl2-I z0`nzS>D+DGs;2u|VCC$b1F!FYSX=P#k7~pju^*lGKg<p0zi&RfTx-3_-;zo#vy?xk zVJc>?Os1GK=Po{%TD7n4@b^0|w!al-@3#KId;i<oEgLs>{x1Li;QPP7>knq_4Eec) z>q%<<!+XE4d5Wd&SUbbL^=X=l!sAt*QAWaZUdk@{a^eZ+CjOIu9@MRkK5|h@?qx}^ z2+s+-$H%HSU3<r{V8sUKgqs3-GyUhvy-3{bvz@U|(%@)-?7UyQ>|e<k3h%1@&8IVs zdq>4f&Z++0@_s(gZa$FT*m|bdC`$X%l4wolOxNfMllRN~c^GcXwz`hB{M|j?V#f9L zm$x5CvATLRGiFkvkk7*>y8gSo%sD(x&%4qR6TEW9?=ZVRD^~8vskiC6k#3{((PR14 z3MT!p6-nktCw^pGr+D=If=*tA?uoOCLUa$Gnx>+_+qh7EQ`wEDhi~}KU=Z`)^Gy0g z{o9B4?lH>A$Q(L&a86o#b!F$YhZ~u~INOZ+c+8hn<XCVUL_{w%%71Mx7sR3X=ifg& znRCx~?5}V5{;l~cf4}WdHd!Cz`&k@PKSF;lJ2O?<Max~P;QW&xhi;iwY8<`gba#Sh zc}>RC_0GZvHZs;MnYeG-k-RPorJS5!A5zvB$sJ8ooT6aZ;+&!OFW~ISsax0mEKLje znX>dl8kcl&;*DLqe%*MT`1?-kjr;aXZsxq3UVCtDbo{a1<@;HT_Lp8;Tcgg;^XLJy z*c?40o?l7c3Tv*XZRX4PsQ&)%@96jnwt0UKO`lup^WgNZ`T_=PalJ!ZuiG50luh5! zzczm5j5jCP*%)qr$auf`z3hU$HTug_b@DoX{rQoxMp%}ya!Igzj^yS!CI@He%Cd1~ zzx85R*w(K6NAToQPn84V%M|ZU3%kL3dFoM93z2<)J_r}Qe0coDfyPTo8#$V4Hq>{& zyZiIatsP=NROJtyb#UvPGlS)W*=M1|HJ^eVpL|_=zE+TL?(9P|`wZfB9zOUWpch-q zqG$i9h4r)8eP3}=htJ8YiegQi4tL~kl@DI^xQbKtN_>paDLoeTMO!nYqn6qWEZ#QJ z&8k-<b&ZV3l=+`qMO+LRZn2#CH2M5G2OaOHEDOR9hew#t6q{Gt?4bGc?u|Q*+Wj`~ zVuXJ4O%cm<+RM&<B)j$E6z+`=f2SxIdL3EDJn1~!MAKh6vd<erc4r(hKIvXj{@Hkb z^VJ%;Ni)xi7rclu4wtXy-C=d|0M{|uBbhVP&z`h=HnU|C>%}~^yvtS33PSH5n)r3w zHPI`}D%7rVeyCnDF;48!zPnrHswO2U><`mn3~QVG&qe2&$J57C!nRhV{R}?jb4B~X zga(brcHf>zXKq!Rab8@)Jg>aq_fP+=ms-W*gA%vAa($+Gz<t@_$~DY(CJF41?(VXg zsw7Z)^81HB>GRaiRhiAdoMhO3JnpyKO}@yLTW{Uk;(N6J>C%Jwm+wwwT2a)wCN*{Y zulYu751vek%~I|ynblEy>|fNco{M^~ryjb0G(ks1*PDZ5OaH{nnUNK<7VfyUz-Zc$ z_W^sR)a|I(h-i#{;h^!OL;Y^cJG=jx5xV@U8^TW={GS)Mt84Px*snfp&9jzpJGN#v z-V{_YdQtRn$K|!TpX#-AuPAp0^sg4Z_v=r3qSeiYtE=4e75&Y(zc{t^`i(8l)t~on zNsCsPd+*|`^5#G3VJpAcGj9oB`ou!@@9z(y-TJk6-2Y5;t6JGvd#vVs_5zNAg7m0V z-L37j0vKC%hB-Zz|K2Igc%t&;tdrt7`%YT%_R9twT-v_w;lqb#es)ez)O~kw?(7XS z-ZO4lvt`O0|JSd!*Yex`x%OW~?EAY1;&s338*YZ%rT>f#*UviYdOB%K&HC!JdF(m2 zcK#8lJ0Abz^||29uJeCxH-9mC|DXLwJ~_`8JLkH&{B`B6Z`rG-Yrl6rrhQ$mT)9Qx zaeow-!FrL{ueNqS`zjwlH=CFF>5`j*2*a9ipJ%aG^LSk?J@!162dzJ0ZwS!IJzP4C zZw6oPp~JH(wDyabvx#XPY{+47c&aM+)2VZ^e0=rQ?2YC5GCx#UW?a~Ndwy`?((cBW z3-kZxS^Ph~U;6!-=@z$lvP|Fq*MHN)G{<eH;_tLCQD)j&xQx+ZZSmC8r-gXqzsKHp zFTS&^y6^bv`X~MmR`2_oyUD|M^_O?y`(CVhVz*}cOzZI0;D8S&9_P1+MQX=Pi#E7Y z;_q?v<lDBg1xwVG+1-7ek5uw#u3xO7@%N*2h4S2@Q+Zu1YB!q{9skUestZx}5u713 zg{QI9``;{vfJYkJJ9>9-+{^o1FP1S~)Vls-*Rsi)cWa(~*WM{w*|KHbzL&Wb7a4Eg zy~*`Xb{FURzsxi4?@eBtx4X#Y>G`iy9e@5{oAGJ(ulg&QWr9bYepQ?A?_%F9`R@F* zg8YlkkEP}QKimGyY_*Ud|NGjn-Uf614ywPdc~S80Q0fia?*XBGj7L|U?zoU6FByI% zaCOgFi)DAU#aWqccW>-tzNh+mhwLrp!q+uZLGwtSzj`jNSvKLYcdANcw?^RQ>9hWv zzGl17q2k1%>?etLWv8~5e(k(|pvJ7&?o#N3!fo~J(@)RT@qc>!UhSK$1wW(raq~^f zTa>*~spzA4{12Twzn;#Y^m9U@f8^;$^K{m)Vp!(UyXm=Af99*QAD7nu)!y;@O!}Ow z_U+E;Ki^x=TVMCN{LoMLc<tBDQ!oCPdv|x);lFzslJbr?w6E*okFB1&=Jd0SgBLC| zx+OTwi0Z1;xY#Jzwkq0hw(jGwJ*891AIw!a=b^keMn(7Ww4>^bTR8V5dCa<$-IOQb zqbZ{6?aJ)3(WRY_=hH*;ZRHQ{Jk>Ud*Ky)V7d^apcD&lde+&#;gL%x(#V$F%|22ET z{m34<J9i}HKJH9^`R@F`{S9L6LLnDYj_Y;Wm~4O8x9QG?ABS$&`K)ngTzylq=2iVa z0U4X$mdgvC8I(`Ex3Bv1kMbIOU$bo@>%(Tgv;DqwfsCz&?%dT$mw#T{zD@r|=Wdz! z3BMRtZ%JVdYpPf_Wqn3@XxYqtJGZS{F-^!$aYfn7{4bLICBIg_G|rQBx=<GTL?h@& z%AaW;mhCV&BceWmZz`kCzR0?XFJ7&Vd)xM)IOc0DN70UY_OR18H_Ut<wBy^d_eZYo z^frj!dCA(~U7nqLwfx`T9^K3j936r<yfh2`2uDm@E7+)$ym`^WDdzj*&!&Gl+W${P z=l$I!tY1xvUoEq*mz?)w+xvL#fYV16&wP8|+N>g;_bKn$n#bJJ<yKEw{J_6y_b(y$ zXMqg+YSr>)rzhXGdbmW2E9TqA-z=B@yuJII0W=(QYtp73LtXnKKePMA7uUaay|P+; z4TF(K+x?V7v-B%NCfm)~{!`RvqrsxuW6Lrtp79^Pxwpdb&8E+%C+w~Na_@8ew1>HM zB_FruHx%dpP(HV-Bw^dD#8+#M9*+Od@#VL<>zsmyAfW_Xn{8pULVN<aYnIL_vVC2| zDfW2%7u(`nr>nQWycz#<`Gt!@cPtqARvzxXUT6C@rdrqJ)U3?+-==38-Q_8LqW<Ze z<^IC!zO&yZuKiZppj(lz^|5is+23vvrn4#)Oa3R=UGmV^Rh_K=wRBt0;Tm?+KNZ=m zj{MJ$rtSVZvFkNM&-u&Ve9LxDXKXm_{F9sCUMB72@6at_bMMax>z?`G?vbMU{=Xl~ z8@6jrKbP=ons-FqtL+*8p89Ke_aE$7`?#&uz37JBg!w%4AAg)+XT0=LXTSS#nHwAD zuRU{keU04vzwh>!f8E^Fy1!gs{^vIN4GoL$sIBuWFtz8|x~n8L&XW7*qo?7{i|bVU zcgE)2luCV8b-FUFGdXx=sBpQFec*Wx2X(fqOM~s+t@oGxv=uZ%Hlr&wM<>wWnrQTa zmr-`sM*P1S7^D9kZsWJ)T9_XE#C1>2n?qMuKa^<`ZM|7E<L=&_)8?O!|K5Jka>m?- zT}sxgCGzes+I#=+)H9;Rk9G>b<G54zod40a`#=9P{k_r7Ft4UIb?r?42|P?~Yn(lw zuiGoP@2h@2$G(^Q|IL5!s{FsDo^sL8lQns-&gK8r+7Wpw;N48_>+ySd#OGH9FaEcw ztfhMUK9=Bg-rp+E&Y5oBTzrvjd1E&BtW`ZhhBJ#^9oZUvsLfT{@6-9xf;0crH0Jv; zK0dT<qMx$huRh=DhkV`5C!e>-4SUoty>J%q_I>BKP7Cl(dvYP{ME<rli)B~*InUX0 zN+sx|^x>jyXXnQ5pVFItC-MEY@M1Buc>n&o)6og<*qH8hU$T5%@V@-N={ml537dH? zDl=K<SM&S)|MFjsul(HMhgaPbe=h$YQzo6lEmaixLBe~5me0>!+yAS+IA_mv`fPE* zKUsSg@q3@<NhruNHZE|N`J3ccUjI7Ynk{TY$$z;W$Di+i*dH#rw2Cw59A6$Yf5{ye zx!jyN-`8=)rdVIn{Hml|C30<TQRr3I++7Ra?5%6qwpQ}U!kd2Cnp4E{kG8xx3yQ_w zB>BBO`?B>vZi~5<rYpy4Bj$R^V4v6i>j^VH^=x`_UP0{eg``yVKi)r&ut&56@&)hJ zuYP{X)%;J~gRHB&P5$1w9mghgQayft^`ET<J3nmLtadkKT6yOEy}a!6f9GC!7%*+F zTDaWNyZ_(lA6{7f&OGF|a>cK`dwF<{t#W>*D>;G7BH(vta$``~=fl+p+ikyB?s#GS z{^x0f%CE13gA-Yu96$a!xSm<=-S0mI582Jb<=fx7&kw0Aoc;0d!q466{p@;S#um>- z8a!_|8E^<}OV`_eM?c55_~*6Vt1~_vSTKigqECOHwG_8W<k`RXdrN++fI5AP6aEXu ze4id{@h5^UdD>b54}l3b^-jO7zkV=0CBXICpTpmVL+;cwA=&ePqt7jO=={jj*KyQ* zZ}meaox26M?PvR_RqQAa=gM5FDEH4fzsT+yXT^#)zeMl+z8fF<@-$aMOx=_HKV~yF z?9DHGIr-14>4}e**KM*i5x+Y7$A#tlOx*-$tYWwS+Wo(|c%zLl+ZFDP1$#bEw|l@< z>DQ1{cJoOIfBpaK&82$^rdGYUV<Nu)XO)MA?*gy;*%fs=>Sx!){@kt|UVi(wxI^3J zr4M!ndCfnyU`<6%#Xp{qyxmidB*<>P8>8|nR5SSZn;j*OkMS=5yFGtrhyU&u)9)Ak zy?Z@z$wWWS*!t_c=e}W4_?Gd}@Opgy(yJno8iH@kj0|1goQeFx+pQ7s&xil2`X<+d zXD1t(=^EV7JHL|S+QiK*iLVb;Mp%ir+TUI@+b6N?JzvMp^>ai&mp)u+FLUR}i+^hW z1iq!)$4_^ZxWZrmeZKpyPb=7WJ;;B<_wC`K`rq|S-mQ*j{JFE!%)nUg`j3lD`)<xn ze-Zru#s0>+ed1GE&li8Zu(;v<pMyg8G}Qm^e!u4Ny9@fqi?3}w|M`~ih1|T&^G*A; zG(rz2ZF??NuN?Dx^4o3O*1Jp)W@kGY|84$pgQ@_P{3EX<x1??@ZO%N(r=21k(>v>u zz51p$-N2BI_2=VDg#VmR00n^M%8zXqs};X}iT`k3Xjj+5t)I?cP0;j=*x}pw@%@j4 zGQ|+hi7&E3HcdNJe5>dw>+$({xvi<WXI^F5HP>zRP>7jdSoremeTKW&D)}FubAP9{ zci$J!h<Eo_{&+I+<FTdg4^MrS?{et*cX%$t?f>uptCyayV?7zMT*yJosN3Mp`Yn^h z%jY#duY0$jTlMRM_n+fx-&fD6e;Ok?|Kq8jeT{jx(vv>Tmydn-=Fqd`PsQFhS*N@z z?(D9ND4sK2KhLLp(x#;`?5SVb3WXUzZctOzsmNcu_MBJ16=8-|Z@*<biWRp6MedU7 zbDukVO=<mqiA9$x-+z65UH`C$^4>Ege|K%}3O`pWcJRhSp}!SBzW(13v*i7$i5t3f zG!vy~ZJ5-g)_&uUhU(F}U<HlG6)zuUeB4l(H~rUBqdJpQd*{i%S-Hk|vF6G4eeY)9 zNvIPldhzGoR{c65snka|D!%&fVV|b=p=(j-&Duxi37@p(1sfU?UMXEZro6uObN!p@ zhoAWWynpb=`oH;xzsK*hPIiyeRaUL&{v3bc*RkJ?_TP#({CSh#BF3r5{d`$O-FyDD zb6tYx^q89t`~P>JVX=Q>b6C^^mSyX!oX;KG;liXVzB%FMZ`H=S&fCwfwcg-iEcnf{ zea7|3cK4I6E<X?Oy{z*po%=aS^@Nx5c2+@$!}_`FFP~W)^j=r{w?)b0WA@CmzQ`9d z?~>MgsBN3`mscWl$@H0Xj{N#>C-8yqfwOsD&5z9gHa;siPnC4lzjZ=~Ay8oBrVPJF zr=7PI1)V8rePw&)@Q(xSj8EQv-d*?TTs`}F&Hj~}1;iP=PW)ctl{Cq^f6pymc7q=7 zKgS*%PPf1QA#%FTx%$85hZ=XkkDa)8-NFA))tmD!$x8>aa~}NiD750o@BiH9AHVT# zD7dhLXOE!I-}vVZe~b5XxBtJ=J1yTny2AG&>%7Z*>wkVvd@TJ>|09c4eB1kaexLeZ z>Zes^8g59B|HFKP%TDciTS3j7>c6ue+}r<8eOb-UNwO012cA81HJ`-sj`hZkJ7-({ zy?>S1G<I(E&k*<BSmRi;Z1wZ+8`f2Ch?nAOc<teNbJKa2$-kO}FKP8``LKSM;KB7f zf4nc>_qhJkX>+?8W;dyqsS5d`yW?u^K0IB0SNCkykHEU=y2;<_Pc7WerjxtSq-}Ws zk9}G76#pyg^@;*76)dH$*xk6b;#*#qZ+$@(hiPGkrL|2$!D%tu=%Rl~w<A}3PCoGH zT6jX;`?8rlK1-9B-yO={C#fbb-<VqEGyjLhm;L_>QxB$oHo16h>-B?=>;LU%t$8H< zAmQox-3tmBE*{*}?!4TD?@r3iM_2P(diVdRZ+bU-A9Kcu<8Sn)&Hv~7#{RGLLIt@A z)1RMn{@;5)rtNpqQTHFQGE5frJDtN~Dp@~WFnvDhW~<HJSv9scw<6DcUopESkg2kD z+s2Jcb#61BXRJ?f(Cpil&%kuzC-a%Y)W0{ke4hG>bAr3Cg1Y_t$IVOj|G7B-E8nXA z-An%G&wIXZ@%$g(Ucavsa+7+Q?Zeo?IIrl~W&alT4*OrLPilRevj0otR+Y2_l~YYF zH@?Lia5YcSf0@N`aq>)EBM))QJ*+=@#C$IIuFbexUB8ZbTAdxU_K!ciKc9Gfj@?@E zebI-6J-2qBb^b7Ed%^ses>kIH^Pg{#QTTVezu|)K$$NaWwC_}R|F~%XyT0w{F+B@j zcJB0Cy+7NMUp22ze#ekMjp0|pF5WNa?3wQ_UVn0{fMO8yl~d~#%M|z2zWf>YZ{zz3 z>z8tC9*MU5Y{@>wZX#b;URBwn3MRSCDO$W{PqQi|`1n3?^X#2>B+t0Nsi-#lxm%b` z$}$0=pr~@^PRV;qbiZ<jOq3K}SA5~xzB96)Q#C)=UevGqGJki^ul=vOY7WQR?7VsL ze1C(@rR$R<I_A3m`Mgfs{^hUF?)4v^+y7BE@?m+LQnRJOAVx*R>z|iVQ>4>NPW#DR zy9G|^zS2-E*>uizPKj64p{W@+HzvJEFtk3y`oS*eVR749@9@8B{XA^#=JPL_*?gY7 z=G9#Hdje}7J=jvnalQWGWR=sWf3hi`RsD0~``^@v+&2f3M7P~z`w*l0+FmYL*zqd! z=QH!Q_w3~TyZfI{8T->tEyvaO|A;>LDsay#ZtpwZgwEc(6VCk0EfHpTaaZd!XVr%1 z4nL<qEZX`h{`5ST)3=Y#ESY_U$&zsc$I*D-OR;@lr#or6O2x?UoqICmLHAGj30#}5 zly3asDSxZbY1W0FJNM_8Rn{K6YiG*z$s=C-*SXjCnTsQ8xhoaeDlU~i^;eetmnrQx zH=T#!)TWSiED7Fz)}jl3$awTxMSs?1t5{g3HK{Y3^(OCT>tjqYy3e#a`mYDa^*%iC zBa!2H%#YMuKC$pUU5g?f<#4hcxVi6JTSQE}cKdf3iTYI^IwW(NmhSxfB6!EgRrx&A zJ{Ucb{-3n6>$ytQj*oNiU)fmEd-}0y{PH#yp%*WHrZezAUb000<fqd0=M!(7*Yexc zd~dfV)9-yPeIM7}ZTYfvTJYgE)5HHH{5-DhXMUFUm%BV<-}(G*M;|9g-k{_otYs|D zhj`N#fByVt<xc-kulw%y96sCkL3Uk%d~u}R*2cf;_rLYM|H}ZH>vsU{I;@|*T=w4y zH}jvS*H6zcnfvd$^{m>}@!>g#{m<^*R5nE*%|69WUTJ3|`}FNcBY3P!)|`J<FhOAY zlHV3h0)FP(6UsJploef1y*KH8G-t{7t;}_z;eTE=+jo81a8i0npyT#Zy@<tj1^@qq z&v?t@cc^R0+wfXty~(UTOf8R1r)Hiy^0({n{CD}EUaT(sbko0JqlZSThxvY<lApYc z2Qt6MtdmIHShQC!J#mvk)aAazZ||<*R66$jq+!6ROa2*U!W+Jx-<quZEbGb?n;n%! z(_WkUZr-XEAA0MlxwijA_s`DE?u`EfpQNq*dw%)-vcJFgUH$uS#_31xci;E#c`JMW zd))M2?7Ms4iRab)IP4FqtQkHjym?W?KimF|)z{y#{QKwZ`g#A~QEB_%;q8xnqxmH* zR2$gj7th_|Ew-vg<ni*S0U<4)B^=H$oVhlm%h_i4y9-kl@|{o2|F62Ctx}3j`SzQ0 zR<Y-b?Y6DCyg_W|ji2|7&T%$uT6Fkr+w2|1pF19|;f{}Rl5_j;>V=UE|DF;7`vb3H zCHrj{C&xUwb!+k8y=xMfZp2rMJkXBUo5k6>v$}#q_9Nf%L-{VdCYijSvbc`*j>)qv zmsjPzu@=(yNV(f-=DclM|HXSdEsT7Bt~q$S+i8Er<M<2F>-WF@`|cClr6<SlybnHi z@bkhtzYo{m|Jx_6_ql)f9lN`Xwa2c;Y)ja~oz11+(>M8;=jVwJ<9X!zPdzpX>|VcK zbp7csuRljst`=uHx94W;{*$H8U(1~HJkG1WNZuw()c>bdiK5B0La_jy)p|MsL9?cK zJzOwPKue`HYMFfn8(UXl*1=<XzR7{Fk9?nz$CUIx^IT^+(_{}vk!%0`w#^Nlv!(q; z!LfCzrZN7k0Ux{zPcY<|w3SCZFq1ecD_`DsbJF(G!+$1zIRER<F2w@w$`<CE25-bd zR!*^cqF(!cmw?~oqSms#Gp)RG71n;fBy+3w!22zi<k%`^?$a?$xVU-dc43A;6Tf(y z+dZnUd$#ua{_p8`-dD%e?!W%@$2<j>e|s2u?EYJDN`C%Ydi#1!xU!MPr;v}Y%O`wu zm-rzpyzFZD5~VM-%|AEU95Q?*-}A@(-qIc`nJM)yivw5A{k7rGVXL3)-kNC{ieKfN zW!DthaMjN3omgrzL42xf{E8oME|tz-_9XPEz}=#7dFMm?_bi?Tom#08HCgf4u7ssu z_x^nsoo2-AU3!o~wd1osU!>!<!Xw60*VRjveJh<?rnn$ThH+s`-W07<^+lXoUMtV% z*$Z#G&C2lgeAzi~*9D6$X4QT*-te0@zje=sg)8PK$#R?TikaTJeSZG~Ul*Y>L6K+P zC12k;@2^*`?e{(3Ebg$%O<Yjae?zc0zSqb;hLusxIC0vc&|1aohDoAvQ=E^P#;j4- z)>tI}^kUHJ`+Ft6c$?Q<`~Rm$I;tvQ-<~CJ&C6r!?|R;N9aA>l`i-9Rr@z1Tmp!R$ zwE56gd(2*|A>zOmXU4vh&hM_T|Gs(>AG68-Q@c()(9JSwaCr5muC#~syNr9wck@CY z&YAi*O=`bYFa0skU!$g#^Xa_HK9$9@W{6At{4ADK_3unU{5iX2!5V!kk(mbh5ARP~ z^oTK2lIghB+tf(co7OYU+dJR+9Np}(`Sj1_+g61HKMdbiy=HdIfB)Z$Yv%5$J>$E) zK8LBh|Nf7Rx8iZ`zhsVX+p2b-pKIE^8xz~t==dy@Na5QsJ>mFIwF`Ms>Ho^@W-F`g zXJ4|4)0%xVZ`2|k{_h4k_c;tUvI$SBFSWewe8WaOxa!A5s~H;vp2yeDI@g)Y!PAtr zmEpek-nZtHYo2|dUH2`=@Q0_J*pk21zP)F^U;aG(j_+~f#FPF4-74z8isWolcD(-` zT6ZTan$5xT$Abdix&sWwe$r75GCk8SJzL79wVJcV$U^AG`{|EZ<SQQTocIsajPZK) zL_YCn)ut6Ptip><p6B<RZE~Swaob6wT%CQ#g&0>G8+f!F&)DH+^DQi{&)+D;C(H8l z{C7tltc<lhaLb~clTBleYt4tL{%Q=RTdL)Dt?r-sR#DKQwr=zJ|9pD;KHR<;xv)XP zR6C|ZzPjkSnvdP@lh;y0bRHk>KXhvTjbjOazAT^RWxy+*`RIT}md*dA4RT@UYs@wV zH1A#h@>p3~M?&aUUe2?cU3XsztGsSKFOvD;)|?9ELbgtx(^KxP6#pOuURf38(YTS} zxLSaN)ch0QbGEiP*nX_z-1^2dB0{G@x7_8d2hZx7qSHU;%;cF|d3kMaM!<>ZA5PDA z-#=Y<N8p8e$zPWoPRuxeF#PdO(K;hNo`v_m$o{O|^e1HRou94qdH(H<$yZnteW9U8 zLc99A{J*&|Ucu@gA6~C7{uFzh;qr!8N}pFSoOy1&^NYtn4#i)Gzwv*UUfO-d*Q`c4 zH6eB<=UK(>=xy2i%<pM_tb1`lVQShs4vB3WQX{oj&vVm}d-*14-g{3G2B%*iBGQT& zLMBHTPE66{ewfKQi#1LxkE#3r$7K<RmF8Z}5uDT|y_Qq`GVcnFo$1fF=R3`~^<kgF z^dskzv+Y~mzSsSaZ<qRb;4S-yAJ5*O5!3jrD;aCC|Kr~Izu!0WpLQ1I;<nWP?(y#k z!x8y^?FZxM?9>TMpQ-Ze+k4JEMiTyYzs()5%)Z;#cemC1V*0bc;p>8at*;B4=E=Cq zUgE@VwLgn5q-|NHeUQN*zCBR*#kTElb=PKU)Ha+xCCT&b`l;%U`4io&vZw6l)19~Q z=b_D;8iFcRb+-5&=#n|bx!?_3`>}vojcig|K1ka>x?S+=#<OpHTiOr0tiH*3_PvdF zW+<~?nf}3)VrjNN$1Q%JTHcUW&FB#>ci{g8bLP6ovjcYcU0^zNu>OzguFvKFrAo`^ z_p@^sPIQtDWO&tk{y*cJe~b4sPrm=hT+80b?((^v8XtP^Kbgz^u&$_pf7$<k;hU0@ zvJIKH7hC$Qv*9Xy+sOUt>G=eE?P(jg>h0d}dma0+b3be3qe}0u^0&+~QeLqzFl51% z=~1HV+<YHJEln)>=%G9}@=<fslRj;2iL(oH4qG*)#W-9zmb$5{mubSw;NA~EZ|&4P z#FG}WY1^yJ;^%j)<O=?8-Y@^=%)OsIe{b?W|7$qe#g`%8^26@W`E^z?)!~it?mK=R zlwb8j@Oz=_!MV>1-mCw!()qW1Kj&QL!wIUtB_H2p%=uUU&n)NfV)^!W#q|tjS8{dV zzAgVh;s3hWqBR!Y-|qkK3i8<|YbIaGtGoNeYWvkY>z@^`vRQH0cFW%4i7|6qPwsuW z<nYfV|ErBMj3z6jOgo<&**~qzjND-+cO^mB(b6S%>va$1xvF02!B1X(n&ukCD0tw( z^{UNN7t3*dZu^o`Ia#2cpT}xPY5OkDpoqN7-*@cXd-svz<-O<Y56wR!=kHj2^y~5+ zTR%NFdiVd=`PTfj>hRY8cP>4W-p~2MzEU{q=@q7#|32?$zxzqS|61wiW`;vb{U4Nn zKG|Y+|AVi=-^cfb&mZ&n_jK<6`}Py|gdYC+_WB;d=@uWit+HP|Gc5iGi{w0yb$K^$ z-079}KlHZc*VCBBt)<ot8&3TEc|qfZR(SGLzO~mFX7=;w|H#l<1WtU@eo8)BoqsXL z+;RG09-Hk=-r0vjUPlE#JC|<rd0x=|r^<6et?%AhcJ60y^rlyrcYHs2zwmM4^Qr>j zaPRa@@Amxa&8yfSYCN~?^y=B?54?$YeSPD7=xpl+v;Qvr&-LQf;<ZIC_L~Y?)Shr$ zmo-@_)#X2T^}|d5U#)L{e}C<y?$Y1W>-cu1&p-LJ?G{t(+3R(+KTfg#>O6B)C_MgO z$lKlGTlefNl{@_F+63l@HS_jYTw?KFY*Fd3VBa#Ob*p~~KFwXfV#Q}hg9iJkBg%V& zG<IpedLH@V2V2(ZHB6!(*Lmt@mn-<NS)b%*pLuuh>D{mYWR-kb*QMC4`=fXMU#1^t zPiXf?M_U)X{Cc0qS?5>9=J|h5R@k+iPJZ|=?Ydm+(fY6EpVB9&NVLiuZk)PjWsF3G zb7Ao1Z<ZBr?EgzUOqc7Gw<`@?cE0v#<Wc*X!AcC-2M_IB{*UA9!#BK6|5=59JX)Sm z`o8jM{Ir>G-`I)paTW<z)TKPUWBXl1zis=QB!S$1-UHKWRqQ9{&M?ks+<UXXc23}B z59PU`tF{$ve%f5MGV+J{o_3`rmy(1(Mm6akR9UaOZ61>#U+>bXmLLDiynBCer}ynd zqpYjzAN*O`{_w-PdvBD4cl^vYf3UFpuYgs(&d<v=`Za&$TW9b8{@%hqv$Or{u_yLV zzwrMTEBXKRK99b*-v7hb_c5x~KWk6;WdHBGu4_o|c22h5|1wvefB*6Qul$1QH@pvb zm)Asm`DXv;{ie_}q7yC}T>X1Azf${6tFaZQ+B&{z^MB1)rF@yM<lQ6X7yDPd75*e` z$^R|CY32G=^P*pxh^(5cexj7?wP)mwZT4F~Rco$IvAdJXC;h&#_Q_ej?bmnyR-gOZ zzQ(-2yt{R?Q;^L0h#S0aMbbrgHg5C!#$~*|e2(M2htoV)te4YxucQ5t-95^3ozLW= z)=wTBpI6CE$mIHG8MmVNsK4@Qk%ARAS+{rmo_*pM<2}~pWsh3fH_c1E#jxPivR?}| zn^pZ*cd7q)l3em;hQ0my@0Q-K6QBRf{E|L%f&Jx{x@Xh#Yo4&pX?Su|WU4^0T>Ej| zo<A3S3i%^_H+?Xwov`1mzR*`m`{?C+o6kRLZI>^6*RJ~W{JHtNzZleg{X9P>>WAIh z!}>cr*Y2DhG5g(vJEikq9z9*~u=GAlxxMhTUe5<78(jAPmp1r2zh3CW`F{Zxiw~?X zh^TUCt9sP=+jiNxdY>a5e=DoS_daj%@8+)jcWb|yqHC)4t_Ockmpl|&Gfl$I(0XU7 zFyFj?Kdiciwr|%zaPZ)n>WYF}zK%OIEMiN!a}9W{*KH1WTfadf<buJ0$tS8W_$tk= z^NsrMo4@m)-v8penuqx<rmZW_DJrlRIP>j}qU&FQtGC)aV!x_bm)@DCe@WQA{Zm!d zqjU4j5}pQ5Jjijbefo^&CXYKN?wHu};V7d|#0$+&o_~rBl{PRgUHdiipQqmP#0`4# zS&wU0BpEyv&TWVhUs}ge@=qz}#<m5G%dQA^GA78)baGwAr{KBVf1>%0lYSktN*>~p zQ#`kR;mD0P7CtzEsYWQMcZWp%Q{DXf>$%_Gq>EYnT<~Ynae=4$wJTayerh!P-PEf+ zUz+jowd#q}|JnF=UEb97XLH@omZJv~Z?L`nbIfD4T-mw!yu^gQ`uE%auYH|*nqifm zT1?gD=zw2+l0GSMm+L=G-thZ!y?w^lbCHkl+W*fCHJ_y3H)}Tc!8wK(6VA2PeiQ%C zsFQCmd|m7R=lMMM??^A0bNy+4CHJ|o4(;|wldn#Cw*T+x%A1a>h4yqSt(p7ndFQ16 zdUx*Be|28w-CMPK(xYu&#%nT_HfVT<@-HamShJp8<YoAIR)2k|pUnI3-rv5X>*tF9 z#Y=add%(iXR&jU!$z74B4tV_UvM`-kc%I{?WY6JK_fM_<BUSDEqsUrv@3N;pDi!-b z@#`=A<Gn9XgL6e@?BB%F`9_&1EWG9|JUIEy_X)i0Ulx4Xr@7YdZ*2bmdHbuc9OwDb zykzMkpY{cl3TviTxaDYd%B;J%G2-O2+pCOzOuB6J{^{R?cW;-x`(zq(X4;mBa}PgV zRsY~!p3nEG^nH1KuUyq9dq=D90%z2v&sptb690c;`@yyMf2kgAdva8L)8F9#4cqMg zT>g0T-n=YlPP0XOT<gt#wI`m5d^^A8=KsI@dvq&zgqO<&X~#ZTXuhBI#h+C6Wqyup z!tw%2grCj-y|zoyQ(P~;`Dv2hx!9h|Ct1FIpC9<<#KH(}j!gxd4?Q~9&T%cv$XSlB zPGy1+Z`8$GGin51Sl|2R_kMldf0o_ylg}65RG9yF^8C|&-cKb@Y}oXE=?Uj|)3+{W z`#mSOM1;NBbjrM%^hVwLNsMCAZx#hyzI<8d|4e({j^>(^=_YU9c1_$mf%`h|A%^q1 z-{-zHe?R-etGD@k|Lv`RJ3a5uoAX<Y`h_cMOy(taw@FMpaJfQrveVkT5xZAdJZgOB z;xe`HWa9UE^?G${Bsiyci{`wKYkGMs&0CoLmALVq&+>Tz&;PE@+feo($nN{I?FXMt zJzg{`D71SW*N*Mt|AgW#CA5PzC8m5hDJQUmD_yQqAdjKYZ2FIbU;e1>`lFlQEa`hF zGve}9rf2(qYi~*qpK5*g#=^P9{1=NP`K7)@FM7WD%_5J&*<8o$7OQNvlHpqI$)Rwd z>ig9IIi~A7b%G3KIA6J6jK2SEuSM(0{z!#yB6hb~xk6O)XVw<Ztvp?`-Eo;zX{2Rl zfMlXm&f+Efxt~5o1n2q$r0(4Q$x-wFq6^ET{zd=uD@^lSJ)h^=_Nnz}Ikq;XM`pO5 zl)P5^U(-DA=gRFd`Sr1F<qsMQc28Kj;h<cy$@75cx=S<muWmDrY~@|@K0o|4t1jR7 z!|ROf|HPf)e|YJz|BIHb3>W@%&p&e2c>c%uXDu^#mv4Od@b&-f89DEs`1L#zP|@@G zqwQZYL#|)bMU3Oz7Rz_f4<-Ix5$gL>mi>j<_7_|Kznp)3=IeQU5etjgN&WcrJmK5U z{}Cb{kK8x?yRg{*(IL%6Q#UWFy+2d_UeQte6~;@yO^CK}&)~4Ud3)hJP43>WAB1ms zi93H&4A>d}Yu)y}r+o#!=B0_<yI(Q4Kg`qiUeu3Ou|F)u?wn8zwYl(DuJrd7k@-?m z-mV^P`kZerC>=>YscO^k$$!(NQ_gcYO#I(ixBS*Ki%<QY|5mF0&)!uxsb2mgbADws z?}=Dhv7opl4uw<4|1UWez?#KTaM9vX<I`zRJ|`t!NnF9R(DrWiyVVc&cRmk}*ZH%m z%l%Gmq(alJE^hPc|L>kBRPA8jJNxga`%~xbKDlT0`#;61|D`4~ecda0{on%w?i{1g z$gF~k4O*w?tc(BKCtvcevpwOV|Ec(|Cbl=4cklnEFR}BGf4bGBBR`Lro0lh;#kZ8q z4ee=XKkwWfr6&Ggs_ydj;G+8%4jZ!tE?Ra}*=WMsnUhwXY}uJ#bge_4vF?EC*Sa+A zrDv}%I8$|Z`qZEkPEJ$S+IIM^OP5&~6r*tPD1+0(#evV656soA(5_zcc<bQ|H93o) z;-ZYYSts{D*?#nJx59tjW>%j?_ul+yD309YZuk7{g@n@wB`3&<YW!8O2$s5KbnTS~ z%h|qlzZ5u~#EKl-zrQ<BWXBy{@>j?_|F7+r6Tx%#JTt#o^xo|4|6lqCu0&ogR(G%d zC;WYVovqEEZ}!|%v#zp5iN%?SwO_h-FhuD=Jkw9lw^A`hvKubAWIGss+V%eL<qe;I z*)wgv*UJ=k&vxUXz4!lr-(t1n@Y{g4UZ;I?LS@1jzN`+ta(wm9;=nsCk0&s4F&az} zEZ2yeaq@ZBs>u%;4o{mUR#dU@iJIS^cc+){aZO79<NDu?bJ>kwrVK~V2hE;Z)=|GI zKb_$*+wnBnXWJ$#Xx%^EFs(k6PtjW8sb#Fdilwb;v)P^hx$Y6$mQ|NJOKncdAr||c ze`fEBQ2xI!ul`W|hAEd{vhcV02O9_c-n)XQ`?mF(6`As8thpZ5yrxW-_dcJ0@Z^!^ zkoP(VRAYCP@S07!?f79qL+Zbq_uH<%|10J5XPr$r>+f?{H-2>A$E)|h^S%6=IT34G z&qUR6itQ<hxfz`knbL0FB$_Ap@9=%E>H9w3et6+$=XAd#dxR{1^zV0S-~a#pt*?__ zWhZB|pPRd%sr%`v{0q%5Q-r_2tL1E4k!8Q8cGk-BiJbnWl`gwpZqKhNST7o%#_Hr3 zbgRJriJISqzkh3dc9it4(q-UzB(Yl8aA82RR<|c(W4xZ~?Yb5E**tnW6SujouE@C6 z`Eh%rR_K*4j~b`d`z={sCD`#`VP?dQz@C63y)k{d|II#G{oKE4QSbhv=5tR5WF<?j z;+|P>?MYR~ofnZSwtQiD>^_l|X~tX2*A)-fCYLn4iQ#W=|8U}Q{fSQs+Lku<KYr|I z`SB#*YTcaulGYY)%oy}+gREwrSbeZO(PLZR83qnEWyh<6s}+kkZFz7g`+i69db6qn zp8giUzvLgd_x=ypwu%W;OTKn4pHpO2Qo5Pv)3zD+8*d)`ta3`YX_4G1)61J{Hkai` zsy>U2=J1)cwq4UmtGj5%TE|b`H|Au1vMc|oBC8yKZg&07&o@4G7#2M9|FTu6tReMc z{+rcRSEl4Gt?}Bqg+Y1#b34snUmWWAm;7<A3V6Of?q9G|RI!)pXQn6dw(VxAk?a-s zqwoK+&HsLVt*>@bhoHp6t=*d@+_CgcK5Zg(YG+pHQHkg5hgmN$2H%K2U&D6z`|>$g z&d#mB^4m+_{>!ecJC~%p6TjvE<1Cr~H}=K{_uuEz3O-ox?{b#%3)8!1lgiw+`1Gk& z2R3cUJGhD?y6WGX{J+)_XZO5)_e^$v<*dB_?fn-5zka%~c>Th)Z;Q{VZshpa_wq{Q z(eix(ky1f3RQhEWWUY6r`*UK-#cv<4S$}MZdT+$X9e$vb^Ref$de=`0mpAqbiu9#0 zEy&#ISks`<w$7<Q`?b$iW~KM5C77P_6in$BYA%woyrnSn<Oc2+77xB3IB72v7?$U( z{a?l-Yq7Z2|7SlJ{85i{iZ9$CT65gJ_F~l4`7bg)9i4D3;`)cey^9MLZ~63i`cLD} zrFYxApZ=M^_s)+0_HO>ff^eC04=znre{k>a`dyuSYhNyZXt7b~j{Roo{{qYQf6jmK z;hA{jGxj+ZtLI$g)%o<aM3e7&l8NGpm24-%M3VlUke9mWwZ`SU-FMB3U-EzA7v8?L z@aE?Dpt%zbr@sHY-v0j2Q(KQG)YtQQ@8`Rzx$^Jc=NVh)oZPW+#wX+G6{qK(_BU!e z5q*TQQnzm5$8*mkPxckauBe(&I(eOc%khI+Y!#a)A2RoR=;6bdv0Y$)U-VbTww|b~ z^H&_1czzaB_NgSs*@vHHue3KP6F;io%&r~56k*Pk`Kg}8R^XGqW8}4Xx09xy;<K-d ztNnjwovV0Z!XM|C=I=}QJ?1Z)#lE<(=TInX`>jVCr4}eD&QFNZV>YbNoqyK3G$npV zwfX*zf5u<_ZT&2JILWR(eE+wz=XTAQ^wMIMu>0wBJIO|gl6K?51yl9o9gHTODqr5^ zsw}KntSjXfDYNN7_wMZnm^UW5a2PXhj!*x4EB{B@m#6df#SCN28$m08pB}yTA?!oe zNiA+^|1Xkfty2Of&dB?GVp<~K^%K{dt`~OPNm>4T_dOOl>r1SxbsN?xFWy$Q=s;vk zK;%oiR^Fp&d8y)@fov(+9%2i>-q8p&N<Eb*=kim$%g<$9!w${=TFzC8pY$IG7%rRr z>3rsn-={ZUJvMule(i}S#ub9uOEq2EdbC5A3(j0^$h7o*hId=4W6{IZr%{YX{O@f3 zS9;7p&DXFeM(^Q7_x*8<ojud57#DZ=^spH$zNvYzN#JOy$j&<!Ijs|3D#V<fnV3E6 z%ApBs*JQ7+%4JwEGuUMxpP8B2!)M`j`p*wnZe4PJLf+$Fwx$h}9&>7HFR<qjdpZ4j zj<-k#i?!g+br0NreOMk<Ih*~++&xqI_*_mmt$SQ3tL>25s>vX@;9PKIYS&w{{0s)i zjqGe|v~P;O4{73G@n`#r!2S9w|7>oWmMN?HU+$>7aE1SCZ+Wfq*&DCSTJ&(!uT8zJ z3%2z3aBJ@2%h5i=Q{Kw9W?F|X-}_7d_C8NAddVapFLx#}{kM=!%~#%QToZ0-eK(eL z`R4yG@pK=<wcoyfS4Vu1DeV2VeLb7>IgYMH?s30W=Ik#L{l?Gt=emsyhi}6Fd!IK% zok`iXbf3$tpOMZJ+9Dd0Ty7?WrZ2ssxN>gZ<?k1S7EKm9_Fr#%iy}kv!==Br%(&WU zc`{MXvCT1Hod=uNOtmdD!@T-_Di&T`6`y+1>-EIc+g~a}pKVt9zxG_lX{E}V&L{Vq z-cS7G?`ZyT@+Bj;(-TtfiP*&#Da>@fW?}MRedbr6T#f|~ol6g`x+whi{!gW|eD53V z@8myhd-a>Wz2N1e<chDiq-W0(Ic?yv^ma~kj(>&Y#;m|wM=l9poBTocYRv<N__g0A zPYcV~>>mHW>bZK|96mn2LqTT$tG3m5zq4I$cR0j~<+D=TvV=8vr(I=vHgiJns=Yl8 z*IzPaymnj?tKDjvmB_o)<{r;mBat-W!)w1Yyw;T#Ue4xq>2QsWlCIL*M~}?>-p-8_ zQ{Z025#)Efl1nZ%zTH^qKXa5H<DSm%i%!{_i2N>mvj6pqNm0HV{XV=&W)u^BvD{5# zDQmRK=g6gxOTVph_V~Bs)1TkFx6fNv5u|zP&`#|+TREod+p|4CXCL#_c`BQZ&#ZH+ ztnM}h1O~J)T>8W!eecN9Sxay5uX#4T=F{%>c@;8pbw_+}$i8Wxs$%HWUq1i$p0^E0 znNn9@*!#+xA-B!6Vrr9vJCEejO)IRPJIu6r>vbV%?mc;>?Vp1^l7zN(Jzim~QgloA z!Xqn()E?7E{L5!wet1=QQU257gOUw1#T&jZ?hN~HtNls;_Rghid}^ld<EgIyv|jXN z;nVw1KcuL~FN^eE%)7w#&cPWs=d60Ean>%)!ND${`?Q1lM5ctc@`~R-?|+^gelJKh zUH4FqS@Y-T>u=RKc}6)Xz2A9x_Hz~KPR1>31eV2IW7JZ}+>*0;BU^){*|u#?H^sVB zt!!mpUYkB&PV2J5kB_GpFLAnJePT;W_3!wdrqN}7k!m0BeOmd+OHg~Ey`HJVC9%s< zo3sL=D@x)85>HH9I5mBp_QaooT<%{Pe}?~hCJ+#y&HMX}&Pn@txs?fVIX~B5Zem>Z z<bKq#Q~sh{+&4rNJcB-jq#sM{ZU5?>#mUXY6E$hm!Cbex)T48w_dox0Ja|9nDf#CN z=k32o3jI9d_2zYF??OK9$DIXU3?2m)EJZw-UeV_q4}L27{!G`NZNbSDCySRau8G^V z9`w&)@c6W=@7f0)bH*(?aiRK2ygA+yMLSB)bGgqD3Wz@GF1;f6n5X8VY1WCcf1@XT zJ^6CQ_fK<Q8i&r7XJwf-f8lqo6}ka8KXppEK0aun{Yihb(c8b1PSvMP>U*;$G=9dZ z6Gk6JR&?D-x{{UZ=e<Po-fTXh$GoKy$tyZd4zFdDOp{27TYXj0?)%mLgWt}D&N!cE z-4K_s+Gfs?fWMp@0;cL;f7zBE%Qz`XdyT2Z)7@vbpYWbKw{l9;p8D5fb>Ftvb1ysR z6!+%sZ{`V$<j*uelu8t+WO}hJ^ON=|?tt&C+8d_DhlX7?U-C4t_}Yr*$wBAVzdn`2 z6H<ET&HLVcF|Cphy6^uqne}#6MfTU{kDrTv@{Io%_II)7`n{7>4HD1y{OL9bXsuoO zWd4C?r8+;qPf)xrS-kY-fo#)FmFukL2wppQ&L%;2Mc0$(n?9-3EB>{5|KZ(-2a(~0 z-H!Wo1tPq;a+mcQwckHt+L<Vw(Xh2}wXD6F{zsl7sYg5e_uJUC9KOB%uxClkJhwRA zd+esxGolx=2y}f6J;i5g@%#Iyo|{+dE(n~Ow$<xX<l^^p=6KBAq&Br>|GI-g5wDJ) z*dKX))7l+-&#aynWNmc!m~qC;7t^LHKCnOiiNCk1_T-azd+v+<%Kx8ilrgz^%CX_r z`y}bGZ>voi8rmN32;4exo#>Tg6GFKxB;uA%PuL*nvUufnv;SgCy{7(r7Jn|jZ?1(c zV}{XMG5JY%9V$P$am;-&=f<lSYm2Tdh~CftQc5lABuBx?zimAZ$J3`MM`j=Tq<YzA zmF&Ce5dpmd*D84<yv#y)ywtLoY_s?#UgzBI%bsJw9bguJL1F45leLGn=6DuQ`OhY+ z_&-!s#{J*kN81zbBrUTtIAXTO<&Rr(HZM<>n3%6suFI?I<!nEB7_J0}ESRNpDlo|A zYgC)@%SpY-hbH)`9=c@ZIJxl5%CtH2jzn$!x^?D_4GJs%toSnHnz>4)(sB{@?A4w3 zZyQh97})OM(EBg&W9U)o9rl(t^IsUPKJIUQwf6PYASD^U(w~#~`IdBli|kwTI!@ER zuK&~wef92{+phoGY7?!!-r&^#&L{V`9WQ)(|M!ep(+VF)zDTJ_;JD6eKfPz`qg(A$ z8Thv}R`mD&7MgI4FFBftp`_)ivi6+cT+^!=biBB^dnPAJ^BSv!l)ap>DmnW3m2DbJ zRIk07pmB<0?I!b<ovJKa^_m)L*4i?Y%BR$ryvnRi=AH0FH?t*e)}~<oiEH#3B$(1z z+b%rIT>EI^`5(r2HqDJna6eY{tn5I?qzfsVW0x=f(`_*4dgqh*S*e;oWuEY6o4Zcd zHxQe3A|{SMaA{)Bb4iQW+pblVwe&_rs_HHjnqhil!RwCJTMhGtp8Yw!ch5S}EY3-1 zmmihCdRVSHo@+(x;b|K=@73O#l~tL|u;PsU_3f9Gj#W+i=_w~w86wtRTNiZcK`7(i zSs~VW^$Cf>4O8k<Yfsu4UeSNZp?X+b@>)YED_4*j%jL6ACMO&gG&%L3^ND<6#pY{) zpYHP-=qYb8DLmS<=FPR@gC5?id4$B)uF#qMM_Y?)@|T;ZCK$1QcTb53nq}}bnvt8A zr}4?&z93VznFedOuvxFpSROW)|Jde-sq$j`&;DAH6srAt&(z}%%hzTo{F@k3k-@*% zw_5gOH~)dKxeTf6;x(C1JT$4>x?f4>v;2d_OqB*-(;s;{N=`X_WXrjXDgVXhy8J6P zYwO?o>3!~wEcSV<6T+Hq1ne{GS+$_Csj$vVLyAp#%fUt#`%^sDUd+4#o%@4k1cj{@ zz1j1)#*#NtQhu&!W@;}pL*D82EkPeHugZ^6e-O4IYRfWVe%_l)rXF*cT50dLYg^Bz zv;Dp^SeJa{tX>pmz22XH%2&Bb6BU%#oov!(J~Xj%i>S=jPZ=6wH`O;SohHQik*EEW z<kSDHC+ipUT~9ytmg$(UqSc$I#*dC1A`><o4LCaa<<jh{jTdHo<;c~}bvPZ?^7TVS zfpwm;{FVidTc0kdX<A{;_3B&BX3Hy4n`&N1g<M;^M$BMt=WUnLZ&EFrrpYfd-D7h5 z#uvq#&&*_{RxM(5w39MSRXSvp=5UTP^Fz?zBc~29gw`JYu=5&|Oh$W|+YOr&=>dAu zdkUm^__l)Gmh#DdiH<7o$>6QCoVe1RHx%_<Te5iDv-7iAT9$>pFRn73tWuHBnZCPt z`Zbv-kNifbrHPLwctuayE-K$KrAqckQ!6Xe&zN5^*O~fxrnjExw_#m<Qhd9Zh|X3k zFTeXwa;La!I*a(^1sh1LxV=GFZtcH<B&TgXoqbaOR@W(|KIr%oYQwZCOy1NX{-`Zq zX9?R{A3bfaKnI7$L<TmFg}Un(|2fP(;r|4;)EXJ@f6=Qor?6@DUY^E%IYF1(QS_3< z>)8$m?H?7U+)Gbp>DIBXeYQN6@rGZqNI+<>=d$wC&#k6y3YvAz^>yU0)h!LLdW<<v z|6<Ks&CsO2S%vYHKHKSi3O`NG-<Z?!J|$G)Q9-e6|McH#2TvEST6A$;$(e$U`xbJ{ z44SkkJ9wRfuHKxq;A9?-^$$C(1-d4F4*Ys|()GZ9y!Gl6>sxYkZkt{(+f&PO%~$Zp zyIqQk7o6ClHZRmLFRaL#@w0$srNz$ouXLB5cyGdA`GWaSkxJs+xgiIlqXL=dbMm`h zxwiD`qr+1iBlR+j{7Ri-Zi#RtUEBCa<=S_-<tvQ#J08dt(PD7mlBzKL8_IEH<EuEA zbyEcIuzNlf`7Ubepg*mXH(pjxeY)JU>t+`<*lSr-Pw4TamOkCqo;E+5>%BmQi?u>j z#*Sroq?Tt)`ERDLKDqwg@{%=QA9t;4Zc+$YC8VIt^76>NMIR&i)g7<&#<=<CE-PB} zY?rFRPC1Qvzou}zPBnYdb}FiJf$?EMlZ3f}U#Bk#Yuzw?DZi$s$3m~;Mycy1pKqA7 zJ%@4IXP@h(UWad0UpRI0{Yf#$l<4$=97TaHj->)~LnioCiGKKKT*=L(@v~NY7Dw{b zsXen>I5%~*uuOG~(KyxK$;Ml`@)QHF;6kMm&Rzp<1(Q|h9-WH%DQ;nX>i>p6o3$1g z&9a#H$2mDu`lEV=V2eY6;^o~!J5;pF8I^BzGOX%$UNZTjiq^t~XFqeVvOaptYno_r z$a0Q@F8eg~wZzn4*KcH=Jmtzu6Q7$}3cg%Z?XT?+JCf4Q?D8*6qH*K0$<z9Lg7Qyy zZIkO`@>kuf)E_1lBi8cp--O4auZuVA_4kUIKl6LzHi19Sj&IAKp|q_p<cgc_QPt-{ zZ+xYUzW#~&Fg5;zx67JW@+Qo41PkJOdlG(K6fU{)UDVq5XZnQZz<>Rd>H|t!w0MKJ zZA;ae+25NGt&zy{EKz{j(I+G>`Jx-c*KfXQ$5v#mGz?*7Fbfw;QC!cW!<(5BXEuL| z8N-(8?>r1H+Au%cR4mS-d12z>Ph0sJXKeCe{vPpaQe~!xp5x(Dj<O3lQrVn@T{k6K zZSu{Q4g7V>Scz{(tbvp_M^;6g&OJS4(do$^KSQSd2%K`joADom6dxzg_0)|Mih?HQ z{O?S?_Wh*4msy`khCzeUE9Lz;8}3y(C^*jcnty7~FU5L`tLtxEP@UiQN4!BZ-cRD` z{wv+n{x8|lCAj3K^tAeaZzf$>VifbGO<QfH!SO66ha0a&qFanRQzgU}-6+_pCeTvY z!qI%&QkrvRllr~cKcDg}h^vpP2xH>>R?F(JqOyNw@Rq3SAq{V*bJ}>Vn);F{=V^nl z_*MQCO=DT3BiT0I`CSKve(zZmyjIg8q_M(XYwefzlU9#c{Cu#uZbvbf-Hlh$?>w?S zm^AqsY*$!aJj$~0&Xx5Zw;9%mJiB&r%BFfzwi6NEA-`j0S_*ID=y`eGMpnm&(>}I< zC;8Me#s4M>{}=Hr{<Hmw{r#k%9{1DrN`)<Hp$=1y&u#H)K9h1vV8aXNwRdl*X!)8% z7z#*Vuz4)A;N1r!&J2OiT}mF8t|fIig#I$)zbUwIp{{3y%pI|%CuY`X3U2e)VP-IC zm?N}~yUWItouf4B#I^X)@St-n_bqcKc}+~&>=z=n)XSqJEB8U8UAq`d9>bM}mbFHX zXD@TUsCezO+4N}a)Tn1g|9nfA9nk#iR*>EBq2OMiW~%a52APiEb3~srAIo~aL1N~K z8r6A8zg(xeysNPJdA#k9_&m3t>U;;fG_Ien`sr`>Z;M`MhgMcgt1nk<%#A3mE@`<g z(Ic7)CoV1Lm{HZZg<*;4<&;}Cn?zN#Y(8F5Trx2_u<PLdzQ|V#q?TR&rtJSHCENTL zo3qEM+PM>o<UgPMo%5^3`0uqcizm0==YHA0`ubkQkG_?@xepeXyeN=oVe^tM^RH)e ziA_DAmU(yMg<{(uueWSsWY|=!JzaZi!^J<F)=l<S<}{X4<vAJTDSzVWw#l{1)BCOG z<$Zl~nD2ep79PfF6C_TEJ@@qFXjo_7nE0@8)3urJrzqYGext=bTPn6=#U>T+4{9CW zOB<aUU)p%Z?eyW<Vmme2I#^#m>i+D_?Ta%b{*}(2ulck665AS)i+iTO$vT$g8F{Ak ze)7H@Z)W}%lVCm&Fn#-6sn<?RZm39iNjsLuX-X^#R6cZdu1i_VF~NSGj1!(LUqlv6 zifm@8%ZX^X($F`r=6rqg?))E%H#EqF>76_E_nSn0_$TqpzrW->`xpDQj`Ok>!^cmT zM0fn2|9?8)2F)Yv(^Ml5?(}C^Ec=7;$+2`hR%`iR^&zDSKYYYEG!g|4?&NLAIsUA~ z=eb&Ps4H*FRt3k62R2UpexdX$-;}^BN*B`;GEP(_o#OIghzVXX$!THZL%r*vg6pQ( zXdb-!(6O<L)krcfz2opz6@i5eot5fOkDo~0+;r_JbHMcXIw$w<5i4D_O6hc1JkO## z>lOO5xQe_}qt+em(hy4U$=02ccxkHppY>T4Ub-y-;xgT;lip37Z|uJ*QTmYMCdDEl zjvFr;KH7Gz_kEGI>}>b-gzqcu+ct;t|GTZgowT91VHM*H7LDH@_!??0@)du-PSA2+ zE1&bc)bz}WCw1!Y(q3;}-@f*A_=4S~!N)Eo%$_A#X^_<ro>j(R`s`$rLdzc2B~PbM zK3VG?*`D%xmbJFTQ^rl37H$)=FuWNz!JSY2_54dt;RzbA8$YSdj<A}kyC!p;n1En; zq{8BtZ>E*>P1iM$(6W}06!^M+(*m2QRKv+HO)j$p_%D)~A9FvF`C;R<|A(e3t-KH< zl)-pA>ingOuBRUIVJ8ZEi(conDNTGlF~dQ~P9#k${<MT<#lPuZGOV&|c9~pO`OLt~ zp%8icQ20#Ih0*43jAG7yE3DhWfBGI{;d{objBB~Kc|F)wa{kZW{c$_W|NY(6|32*9 z`hMp{Kin^d3LbW1`(BXyziMCK!<W}SH?+4Ggk0rb6x9Co`W0CRqqO25roO$p**&Ja z*ZN%a7VZ8uOJ#FHj9yQd?4nJx{yaTk*qyEUaq4=@crl@mep<#tJjtQoW`)c&cslFS zLwl3lpvXs)#G`xu%z3?!?U4{)z}9vj=MNVq6>1(=U-{bWq|J#>`~lpdeGOmBnRm`z z`=&8K#_8v)lZR}WdT(W|k~4CDdbld=b?Bv&vH_xYy0%lJ6#DO$9BkyRw6@gv^&{c= zmdX<zXQY?EY!`lLd~xMd>A7}O@=b3yFaLiqemVF3Ps|*%cb~fy%PRLfMe_SYdpWl+ zjj#1gv|8_Ha$H~j;bIrxTGNUq>8Nc7t9R=Cxn2MCz>fxIo=Gn<P6bVNxFb}s>U9IF zS#-`bVb9Rt#v5ilzj<qMnXR^Jq9|L_CJn9Z$95i9{U30jTE=>@{Yyajr__V%=k5!N zn|6QUwg)vevEln(il{tMOo{#Ib?cW`W62${%PZXFcB+)ff9g+n|M#?XWn4hREJ?xI z{R@4fy+3VveQJ7i%Zl1#QCpTu-hbCC(&!eE8L7Q0!0B}tpZwL}9n+(xUVRkBxMZ<| zdxp{zokQzy9BJBkDdf)6x$7UDjsH=->N786cfCPj{oMoAlHvcn>R!G$cd<@E?((cZ z3pqBj%<ZyY=f)N}IqvA{C-L|AjRX!~u)2_S)LQFIp~pwwrH7ZLKP=sxvu1+Su}2e} zHoteZFe>dgvd@xUqV-qCeCxywZ>QLsrm<v**{=Tbr`ErA&XY+EXZEu+rv^W55s&;Q zec<{jv3RAQ&o6C`h}h?AAyJk8^fAZJ_2my3J6|o{wrr)uh1Xh%4vHb7V%l!yUp}bt za`CuNJM8G)T)$MHBWUSGPPx?5)cJ25Bqn`L)V>#Y+CXDMe(XQ9`R5o`@Tg1goH~t# zS+d`{sb;$$$CKS+9Frwh-7;EMt-FNz=9W*)Ru?}+x&=?GSY01hdG+VyH_=9w66Y>2 zoA|mxY8{i6<IkuEy7N+Z_B^^e?R3xePnD{ghyUzN`LzD&V^QV*ufu}3Sf#0^=(ZKC zb;?dpyDVG9wxB)5Y>iIA8r}U?iv0gqJ+<7>cB5j`o-Ga?m75aTP8A4s>$5*rNwqW5 zojh;Lk%ET*i`VqqsN~tUyWN#o*1o2U({Ji&hPafh(m#w**VT)zh;2BrV_E;xeM$^c zXMYETZ>o*De*CHR)=IYLZ2R99P5O2Az4^BDyZ6h^@G-x0U(MHiTa%~V%^MsawneS| zBfzw0d;Qiq2eS;@kG^4;_O8luH@o|0yHoq;f11y?|B9e-vyso7J<+!#*)HjdI`)<X z&oF%%r4Y2nYrzA~J8TJ_y^%r<W!#?i_a+FKRh$nk=UKR_rSidE*0o%kuI>UHm$sSp zKk8=dF@5a6t>(1V${3SHhnpU3X5wDSap<eyp<<p>2h=~Ub;$9ZQ~GmzkN91;h~Fx% zdnPyNbIjYEl>3BR?d+ZQsFwwMP976`6Ss#aT3oN0`Q8Js7r&<-zinYHR9=3#XsgSk zr~MY3$v0nK>tlWwdt-0G(VrR16OB*b@$Hg-cem;1Ls|AK?F@_mm~&mZSfa6@ChekK zx`b3>E_*I#x-tKSusajQX0M4koUOUwMD+ruY{sT-rXIb5sb0qB>mGJSZiw1)ls{ef zeroo`X{SG3U8OzIO~+sU_>ygFqn#KEwoKJ}E!%sPgDqi!Zp5nkoByV<cuf6VcQVRo z&mV0~h73+g?yVwuGy7O9ZnH7xa?ep0<lVN~w>nmu=gHJYJF`m9%~R#C_iwKF_~&r{ zfotdTHZ+Bw4!t3=qabYE_1$s}hp#WRY=3d{>q^DIi^l&#r_b%}-e9zBcFu*L+Wn7M z;#s?Y+P%5Im$Uu%dFTC6J)h#`9&Hf~u#<kZhT*~$zGF;H(_B+NKS&P}OR2i*y=a-T z%$8+~+2$L3S(CbP>pjzotx@KiRVO#JnSFnF^H9ze;jTSXO4C^Pn>Hq$HohXZb`zsX z+ZoO83;XhK9n!i#M=V-m(cv)BEQcK*+`spq@G@|`+RCNgXyB^tbgeXNwxRmlQ&*C7 zxphtltWsWDV4<@-^|ILei&N59Sb51$o5f=K;^XF*&&=jj{}8;hw}A6cCEvNH4eiFy zvkLa_kyom*ouia6rPCtyrrN)xz3Vi-FI@2du=-3f2jLitgn5U4p6-8iRNMc+n+J0D z_I|Bo|I^-fG<@El-|d%^4JwyB_4)eYT$at&oaIyHGF$^Bw3-6v{Z!TZ`|GA}Xa#Rr zQO4ycx!{Wo2Tpw7uq<X;eXDLpi!0MyhO7;LvL>8jopSj8naO7(*d!wSLidXwKG}At zVVVNtmfGr-GR~!DD=HFvrPnH2_Slxy%*@{>a&6P80};LqRc&@B1Om7NW-ND%lz22- zDb#Ip;51)V`Gy3erQZGf+sgFg4n24rdv5OSh2I}ABzl^EEL1(vZmD>Czsgjj!k?GV zJuCS)dH?I+CsX6MJ#X1oUdLDRFO~no<&!LXy&u04zR$7wuXVxqYvLywKWT^k`>V+P zmUEAp@m1q@49gxr>*S0)QR<L$P^zs}t?bLcjO9CCO(}KWvZkkWR!EeQq|O?FS$iDY z4yWAZGnt_^|G%$$@UuOt@{g`Fg{fXyyG!i+p|u+fR++3|ba2~|YB42IvoF5*FZVpp zmhA`b>TnCrmFV`2-sm+$V58RcS=$_EFMG3DZ61?Tz3d@X^NA<^udpi+DU8+TzQ4s$ zc*gnoY7sq~5?zM(e?A;w{HPUmVD&s{_698nmYa8z^=3@*2~WABoGZW3=2&-w?3(QQ zoo||7ACi|g_*lQAB`>*soy{k=JNtjnDNd{rd?2d%KX&GU&9cR@j*c1ivv<CgF|v8S zdD#NzD^dP8WOg+Qd};hs=zC90!i$O5)$qcK3k;eWPwqb|p1WaN%a&Ia&*E%_pXUDR zb+umgN2)7?_vy+A@mp4>FL7<!+xE***JXwJhd70sUp{gqM$KOMcC+)R!w=hj<tVRL z=Dszd^@GLU)0rL)-wKyS->!HXy1ub@ZSD+xv3vSFH-*@)O`62Y_O#-eh{{#2seir; zwl<#c<CwPEgp=7PSt_yBuIb*Rf}iEKCAIyN^O&CN#gq!y_a8XB{*T^ny`s5$gr4l5 zJTZe;=~m5I>n$_aa;~@P|M7I8_|4Y`GOkaZmG}8brgFL6M7Q8>u7*cDvbQEHub(p| z<?JVmfVCD3JB;3j)txOfs(iL9DQQE>yp&l+XLfy&{*%<rI&(U2_GPi{DW4a7<@)8} z<YL;Aa!;#`wVuJ<e^#M|Uo-10pG2vzoty3(_A~#HnVvG=adpbie~*;=A8)<BUvSq; zwu<>5iZ*_!OZ<M_ef5p`3x)bW`iLqXUG`^EO+pdVgPjdm-gCEWC@FAvhqGv>YwC-w zULeEAmwqmN?}GOAwYG2O)jtwd|1Z?D@@nAP2dB!FE+>~NT^7vsetu5*fHUW^2NN&t z^^#+_vSgvp`A<rhm$zNB_KQpj+9qQVkRK+&`aU#5um9xwcP%TVwsB2A&1sSnxS}rc zwDRQ*HM2gjTyk0*b+O3Gxyw=LBDYKO#5`sR|0O1UUenj>D%`H|*&mjx_<EUQvZb%K zxSIXV<A+Y4J}0%W;O#8t2bBzamu~KuzPe&lLeTt^KFs&D&Q05pB|m%R4}*q-HalaL zY~8jkP-LttNNln5yk}MJbx@OS&Ux_)i}(qfCw#m#RXslN)BTk!TNIQ{ek~DP!4<%} z`O1qw&es%<H@iuk4E8&9j5#AOH)ol-LQct%T5cDMm^U0NPdQ5bm?j>5T|wICa}00m z#%qtbzBn{{zUz_ToxW`9g^uzR+b7~7k<)!opV?Bo`B(H?wZi9hzNwllY$uH5ncp6{ zemJw)%!BO|x7vKhnO721tG>zgE}B|tRC-x6uJY{bgx`l)XIW-f?2D;V_?F$q8gu;2 zCGmyE49bh6UY)x6{?%)PIZs+%PL8}Kq*2$opx2c({kJ8v!fnYwNtgYfw6wV9oK4@b zu~u+h%wM+Sx7&2J=ehpeetTizgMS{16Dky}YNr-D-$<ReW!>ZO$Zc}3;{2Sy_i}CA z(^4&It{Tu9D$BS<;M6Jexr^2oB+T%LW_FKC*|g?LSdr+5qTQXpKS`|K@!HDDv#HGR zt##It&_{C?6c@z!&A)wcTe{z#k9}JlOn*neUa-uqGSsd~_Ud=(hix4xH(ln$#9Pcf zbanYX2I<|_57wT2dTF=nA*0SkItwfWf;f-9>X6WQUt*S}K38&1Ud41nRc?t(C#zTX zFv(mp5711RH;c{1=KqP^{x<tR-(=c#k}YQ6uXY)Q@NC|5bN-aCJ#^ysm-bBpXX~7H zEl`_#&?!oljk$&S@X0WXrH<A|HwZO_wQu`*a);29sKo0HeqwLJ_9%LlX8x4mNw<=^ zwJoVdWRKSA-B;CqMwhyTUeA5F;elzo+`jE$(L%b;-&b%oihFIcy~%&GN?rc2gYDXv z)|FEdMJDySKl<g;)%IC1^ZBn5F~gYZ!_tR7)^EN!N9;7~+DYvS?`{jQzeo{ad@9#@ z=jeX}-y_G$Gdc2>SZA?&{5?M>V%phPO@UMHD##X8Dasv5`zFV`|5WlbhMV`}_x<X< z>BKg9#>&a;VgGhJ>anCU9^YZNSX{QD+2fdM$CgRwUpfXW%)Y|mE?Te2T_;vobv1Ho zfDB{7g$J^^Hj$#Q4@_mu(&%64cTn~iSMkJxRR_*rsjp#sYjk3h$*m=yK1%J=dGFi3 zefg=w6Jph0-#QS+Dr22-s^zl(-)qat@9dj?>D06-qE|{6oUtj8E{uPgl^WMJW3gg$ z%$LNQvVZNT%hfA2+^N~PWJgpJzuKkAeLtmGv^CltR@PRZdM&W|&+~5`&p$7}+p6h% zxa6guVdXkziHJs~rS+BCH>WB$d_LNK?}p!3o)i1`zdUnVZBsP2lFji`D*|L$*i24( zvK;u7`Xl@80mk1t<zZ*Uq)utPmP(P;pUJ7qd*e}LS%YHM$HY?;q=i*yesk5H+nQ)4 z`6uK5re4j@2781#jxsEY_n5~cu{OQsOTfn?E=P3)c>}jz6|B@QU|sPnyhudYe|q2# zAJz_yNX3b2@5Mqq6IhdW#>Z5=DZFJ<elBvV_xt*z8DF?&dNfE~Fp1b38y514;eU>W z_0E|kC-y3S+mXZ7w*LyR;Z3#!dR>bGHmz^I-1{`&EWPs8;g)`5i=~?i8s1ba{VYEJ zOsbvtr}x6I7(&=tH(Yl)I_G-lw5Q6u;*%CTwau{S+p5O%+Cj<xQvWA`=sT0AoL5ZD zv5}AZ=EBUS%*`MpT*0>Ds*UJ@pEg>#Qj%c|ny<W$tz9IyIIeA1FIV58D8a8R&JPy` zvN7y<Z?)z?&}YT;7b|bp$!t8~q<mAzb<djL(+Z!TtZ7rZ*0S0y<W8M6zb(&m`6>=u zf$Hln^X<atKMwZPzp9b;dir0MqfUB7m(>klhKeeFRNE`k_q%HUx~72CNepvOGj*;! z5f<QbQj1^PK}`G3t$i%k&*!a}WXt_YKRh_)<(3C0_X~Lh+BGX(*;E{z$M|4J>$LNQ z8f)I3d05M7Zm~vS!IW;c1qTlud+a_<{Pbe`{R*WyHc_(MPG7B1KYT(>V9r8=h*f<D zd7UhEM7%kC(*tF9ADq5Iob%n!nJe9wD&*K_O`WRV<RkfRw#)pElPBx$yt}`N|3-?) z`URKOgx#<CbN1YHdMdtX;g&;FR2nV3<COL<eEcZ6|4`CKj@3dd<_Jy^@mMdKvFee< zLb0-ou64<44yA>^QkR@28UIQ3v)F-M*FUYFXjp$~AB*QS`<Yd)ae3{9FK2I`F!ywl z+5F4zcCJ1bb>A-d)A~CiizX)K{@0gUYM{cE$#ONy(Vf$L#)oP5uRTe4)+Lo`W-7X+ z)@@l~=)MaIdh09Z-#&J1;a9Ho3GweHOj2Lfqr3ENvb%uI(|U#}Thpvp>V&_RV*54C zSIv8M#i>j|9%kPkzNeQh5oOnBTDtG>-{^;%6AU-citox|%;@);;s1_%Q-zZn*P*E< zDjF+Fq-!^S;8=S0=ijH-_uSg4DkgGAc=go42Pd~4ka_Y$U|UJDg}{oO{nxLp3bB|_ zp2LxCcG{lh&AW>2?C<xbWNM$9dpzr<>M}L`o86Xd2fOV(^R|A;o;bba<)`Z>UsXPM zYQJ0a%;_K6ayL&%WQUzi<5;$eFZ$QxiHB4tuQ{~o{Vt~b#Tz3YNbH&UUc`+1pu@eS z2!Z+0)1<#gJ&;ndV&r9<zjL|**Ge8O-`RX8<9amyG;1Y^oxBpUYF?khYLPYX%X5tu zJq|rz{QFC4YDd>+rxi;QfA<Ti{eSJB@Hm3kwMA{NmUiBA#(%HNHvGw`Tdfq(JpXRH zeA~$suhXekFVe4i^Rs9%YZbX^xjsp_`Cj4dkA_WCc9n11X}ER)hlCc>vV9_xR1d1I z%9i_EAQ*H@<h)z^1vU+}@`>8Zxu1TX?fmEP-Qxb$LLI+q6rS#v?$ObkDzH(2JAFT+ z|3!<ea~`ERQI{VkC?weVhwf=+3$#gb=adq=;*jyg-({=e@wt+#9(Lx$oNYhRuhMBX zq2}hMuIMS^o06YCU*Y@IrsoPz`0L`}f06xOTlFd~{OJ^_cs|Ylc-_{>X^lRy9v3Dq zP>K}WbJN22gEd>KT#%ZMNa~B88(GuSV!QqF*SLk2Yg{_>vtZVyzG54tNm5QnF0wKv z3hX?6@|oJ4{bjsj+S@u5wXONHW_bB<zV({lS*mCu*y^X;k?_jzkNvtnwT8)^@@>1X z$Nt#B9=>Gz%SG?{1vMofhgA4_P7dR2HP2sk+<to4`_CNL9XX%eigMMjC^-CsbMM-@ z*;gX!{~S0~f1Fd~YG`nW&Zmd%GqqQ(ZBX%WUKaGa@UoTj!XT*yOu9-JPqH6ca8f(J zhe3CRk|)F0I}I$U4sW*H3_Vn68~NI&aoUthwmn~h3=f}A*{ia8*<DYmQ~}q6Z2M0+ zrCYuVRS%Hbf5p}7&bIXC<pN8u8mh)mdoL`ct-SPw%ifb0ot-)+&0n*+rhlvU`75zs zxg6GCeO?~B@{iV}GtO#rf4A)3^WjEvqj>$TEDK5Au8+I5)ENQ~xVhx*-;>K{IMsGH zUr-#M$nJB^?~l~~Je>GZ?Z^JSO`QUbH|rzKu0_Um$L&evImE>Bcz?%&Bj=aCKU1|l zRE=eJG)HtagY;~N%e>!nUfo|D&U9wWevWH}5{zpSzW<rLZJ&I=PyhL`TKcDcPicO( zBvfUhLKd60qtW>ZD{AK~)8IJ4)UZ)+Q(I=E3Ge(nDW9gkeD1Yj	uH$BtR`F<AtQ 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 VDU5!*ih+TF!PC{xWt~$(698piG==~G 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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 IbxsLQ07V{Ng8%>k 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); }) -- GitLab