diff --git a/.github/workflows/build-and-push-image.yaml b/.github/workflows/build-and-push-image.yaml
deleted file mode 100644
index d3a141d8ae01a6f84567fec562753bb0cfa6d035..0000000000000000000000000000000000000000
--- a/.github/workflows/build-and-push-image.yaml
+++ /dev/null
@@ -1,132 +0,0 @@
-# This Github action is for publishing of the primary image for AnythingLLM
-# It will publish a linux/amd64 and linux/arm64 image at the same time
-# This file should ONLY BY USED FOR `master` BRANCH. 
-# TODO: Update `runs-on` for arm64 when GitHub finally supports
-# native arm environments as QEMU takes around 1 hour to build
-# ref: https://github.com/actions/runner-images/issues/5631 :(
-name: Publish AnythingLLM Primary Docker image (amd64/arm64)
-
-concurrency:
-  group: build-${{ github.ref }}
-  cancel-in-progress: true
-
-on:
-  push:
-    branches: ['master'] # master branch only. Do not modify.
-    paths-ignore:
-      - '**.md'
-      - 'cloud-deployments/**/*'
-      - 'images/**/*'
-      - '.vscode/**/*'
-      - '**/.env.example'
-      - '.github/ISSUE_TEMPLATE/**/*'
-      - 'embed/**/*' # Embed should be published to frontend (yarn build:publish) if any changes are introduced
-      - 'server/utils/agents/aibitat/example/**/*' # Do not push new image for local dev testing of new aibitat images.
-
-jobs:
-  push_multi_platform_to_registries:
-    name: Push Docker multi-platform image to multiple registries
-    runs-on: ubuntu-latest
-    permissions:
-      packages: write
-      contents: read
-    steps:
-      - name: Check out the repo
-        uses: actions/checkout@v4
-
-      - name: Check if DockerHub build needed
-        shell: bash
-        run: |
-          # Check if the secret for USERNAME is set (don't even check for the password)
-          if [[ -z "${{ secrets.DOCKER_USERNAME }}" ]]; then
-            echo "DockerHub build not needed"
-            echo "enabled=false" >> $GITHUB_OUTPUT
-          else
-            echo "DockerHub build needed"
-            echo "enabled=true" >> $GITHUB_OUTPUT
-          fi
-        id: dockerhub
-
-      - name: Set up QEMU
-        uses: docker/setup-qemu-action@v3
-
-      - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v3
-      
-      - name: Log in to Docker Hub
-        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
-        # Only login to the Docker Hub if the repo is mintplex/anythingllm, to allow for forks to build on GHCR
-        if: steps.dockerhub.outputs.enabled == 'true' 
-        with:
-          username: ${{ secrets.DOCKER_USERNAME }}
-          password: ${{ secrets.DOCKER_PASSWORD }}
-      
-      - name: Log in to the Container registry
-        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
-        with:
-          registry: ghcr.io
-          username: ${{ github.actor }}
-          password: ${{ secrets.GITHUB_TOKEN }}
-      
-      - name: Extract metadata (tags, labels) for Docker
-        id: meta
-        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
-        with:
-          images: |
-            ${{ steps.dockerhub.outputs.enabled == 'true' && 'mintplexlabs/anythingllm' || '' }}
-            ghcr.io/${{ github.repository }}
-          tags: |
-            type=raw,value=latest,enable={{is_default_branch}}
-            type=ref,event=branch
-            type=ref,event=tag
-            type=ref,event=pr
-
-      - name: Build and push multi-platform Docker image
-        uses: docker/build-push-action@v6
-        with:
-          context: .
-          file: ./docker/Dockerfile
-          push: true
-          sbom: true
-          provenance: mode=max
-          platforms: linux/amd64,linux/arm64
-          tags: ${{ steps.meta.outputs.tags }}
-          labels: ${{ steps.meta.outputs.labels }}
-          cache-from: type=gha
-          cache-to: type=gha,mode=max
-      
-      # For Docker scout there are some intermediary reported CVEs which exists outside
-      # of execution content or are unreachable by an attacker but exist in image.
-      # We create VEX files for these so they don't show in scout summary. 
-      - name: Collect known and verified CVE exceptions
-        id: cve-list
-        run: |
-          # Collect CVEs from filenames in vex folder
-          CVE_NAMES=""
-          for file in ./docker/vex/*.vex.json; do
-            [ -e "$file" ] || continue
-            filename=$(basename "$file")
-            stripped_filename=${filename%.vex.json}
-            CVE_NAMES+=" $stripped_filename"
-          done
-          echo "CVE_EXCEPTIONS=$CVE_NAMES" >> $GITHUB_OUTPUT
-        shell: bash
-
-      # About VEX attestations https://docs.docker.com/scout/explore/exceptions/
-      # Justifications https://github.com/openvex/spec/blob/main/OPENVEX-SPEC.md#status-justifications
-      - name: Add VEX attestations
-        env:
-          CVE_EXCEPTIONS: ${{ steps.cve-list.outputs.CVE_EXCEPTIONS }}
-        run: |
-          echo $CVE_EXCEPTIONS
-          curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
-          for cve in $CVE_EXCEPTIONS; do
-            for tag in "${{ join(fromJSON(steps.meta.outputs.json).tags, ' ') }}"; do
-              echo "Attaching VEX exception $cve to $tag"
-              docker scout attestation add \
-              --file "./docker/vex/$cve.vex.json" \
-              --predicate-type https://openvex.dev/ns/v0.2.0 \
-              $tag
-            done
-          done
-        shell: bash
diff --git a/.github/workflows/check-translations.yaml b/.github/workflows/check-translations.yaml
deleted file mode 100644
index 1dae48814a4764b4ec93140dd6cf53ff4a2dd97c..0000000000000000000000000000000000000000
--- a/.github/workflows/check-translations.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-# This Github action is for validation of all languages which translations are offered for
-# in the locales folder in `frontend/src`. All languages are compared to the EN translation
-# schema since that is the fallback language setting. This workflow will run on all PRs that
-# modify any files in the translation directory
-name: Verify translations files
-
-concurrency:
-  group: build-${{ github.ref }}
-  cancel-in-progress: true
-
-on:
-  pull_request:
-    types: [opened, synchronize, reopened]
-    paths:
-      - "frontend/src/locales/**.js"
-
-jobs:
-  run-script:
-    runs-on: ubuntu-latest
-
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v2
-
-      - name: Set up Node.js
-        uses: actions/setup-node@v3
-        with:
-          node-version: '18'
-
-      - name: Run verifyTranslations.mjs script
-        run: |
-          cd frontend/src/locales
-          node verifyTranslations.mjs
-
-      - name: Fail job on error
-        if: failure()
-        run: exit 1
diff --git a/.github/workflows/dev-build.yaml b/.github/workflows/dev-build.yaml
deleted file mode 100644
index a7632dfd04a59a5a62804dd4d94d26efe9423adb..0000000000000000000000000000000000000000
--- a/.github/workflows/dev-build.yaml
+++ /dev/null
@@ -1,114 +0,0 @@
-name: AnythingLLM Development Docker image (amd64)
-
-concurrency:
-  group: build-${{ github.ref }}
-  cancel-in-progress: true
-
-on:
-  push:
-    branches: ['558-multi-modal-support'] # put your current branch to create a build. Core team only.
-    paths-ignore:
-      - '**.md'
-      - 'cloud-deployments/*'
-      - 'images/**/*'
-      - '.vscode/**/*'
-      - '**/.env.example'
-      - '.github/ISSUE_TEMPLATE/**/*'
-      - 'embed/**/*' # Embed should be published to frontend (yarn build:publish) if any changes are introduced
-      - 'server/utils/agents/aibitat/example/**/*' # Do not push new image for local dev testing of new aibitat images.
-
-jobs:
-  push_multi_platform_to_registries:
-    name: Push Docker multi-platform image to multiple registries
-    runs-on: ubuntu-latest
-    permissions:
-      packages: write
-      contents: read
-    steps:
-      - name: Check out the repo
-        uses: actions/checkout@v4
-
-      - name: Check if DockerHub build needed
-        shell: bash
-        run: |
-          # Check if the secret for USERNAME is set (don't even check for the password)
-          if [[ -z "${{ secrets.DOCKER_USERNAME }}" ]]; then
-            echo "DockerHub build not needed"
-            echo "enabled=false" >> $GITHUB_OUTPUT
-          else
-            echo "DockerHub build needed"
-            echo "enabled=true" >> $GITHUB_OUTPUT
-          fi
-        id: dockerhub
-
-      - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v3
-      
-      - name: Log in to Docker Hub
-        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
-        # Only login to the Docker Hub if the repo is mintplex/anythingllm, to allow for forks to build on GHCR
-        if: steps.dockerhub.outputs.enabled == 'true' 
-        with:
-          username: ${{ secrets.DOCKER_USERNAME }}
-          password: ${{ secrets.DOCKER_PASSWORD }}
-   
-      - name: Extract metadata (tags, labels) for Docker
-        id: meta
-        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
-        with:
-          images: |
-            ${{ steps.dockerhub.outputs.enabled == 'true' && 'mintplexlabs/anythingllm' || '' }}
-          tags: |
-            type=raw,value=dev
-
-      - name: Build and push multi-platform Docker image
-        uses: docker/build-push-action@v6
-        with:
-          context: .
-          file: ./docker/Dockerfile
-          push: true
-          sbom: true
-          provenance: mode=max
-          platforms: linux/amd64
-          tags: ${{ steps.meta.outputs.tags }}
-          labels: ${{ steps.meta.outputs.labels }}
-          cache-from: type=gha
-          cache-to: type=gha,mode=max
-
-      # For Docker scout there are some intermediary reported CVEs which exists outside
-      # of execution content or are unreachable by an attacker but exist in image.
-      # We create VEX files for these so they don't show in scout summary. 
-      - name: Collect known and verified CVE exceptions
-        id: cve-list
-        run: |
-          # Collect CVEs from filenames in vex folder
-          CVE_NAMES=""
-          for file in ./docker/vex/*.vex.json; do
-            [ -e "$file" ] || continue
-            filename=$(basename "$file")
-            stripped_filename=${filename%.vex.json}
-            CVE_NAMES+=" $stripped_filename"
-          done
-          echo "CVE_EXCEPTIONS=$CVE_NAMES" >> $GITHUB_OUTPUT
-        shell: bash
-
-      # About VEX attestations https://docs.docker.com/scout/explore/exceptions/
-      # Justifications https://github.com/openvex/spec/blob/main/OPENVEX-SPEC.md#status-justifications
-      - name: Add VEX attestations
-        env:
-          CVE_EXCEPTIONS: ${{ steps.cve-list.outputs.CVE_EXCEPTIONS }}
-        run: |
-          echo $CVE_EXCEPTIONS
-          curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
-          for cve in $CVE_EXCEPTIONS; do
-            for tag in "${{ join(fromJSON(steps.meta.outputs.json).tags, ' ') }}"; do
-              echo "Attaching VEX exception $cve to $tag"
-              docker scout attestation add \
-              --file "./docker/vex/$cve.vex.json" \
-              --predicate-type https://openvex.dev/ns/v0.2.0 \
-              $tag
-            done
-          done
-        shell: bash
-
-      
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000000000000000000000000000000000000..6783e17e9232adba661dae54be5f36ed91cb5719
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,94 @@
+{
+  // See https://go.microsoft.com/fwlink/?LinkId=733558
+  // for the documentation about the tasks.json format
+  "version": "2.0.0",
+  "tasks": [
+    {
+      "type": "shell",
+      "options": {
+        "cwd": "${workspaceFolder}/collector",
+        "statusbar": {
+          "color": "#ffea00",
+          "detail": "Runs the collector",
+          "label": "Collector: $(play) run",
+          "running": {
+            "color": "#ffea00",
+            "label": "Collector: $(gear~spin) running"
+          }
+        }
+      },
+      "command": "cd ${workspaceFolder}/collector/ && yarn dev",
+      "runOptions": {
+        "instanceLimit": 1,
+        "reevaluateOnRerun": true
+      },
+      "presentation": {
+        "echo": true,
+        "reveal": "always",
+        "focus": false,
+        "panel": "shared",
+        "showReuseMessage": true,
+        "clear": false
+      },
+      "label": "Collector: run"
+    },
+    {
+      "type": "shell",
+      "options": {
+        "cwd": "${workspaceFolder}/server",
+        "statusbar": {
+          "color": "#ffea00",
+          "detail": "Runs the server",
+          "label": "Server: $(play) run",
+          "running": {
+            "color": "#ffea00",
+            "label": "Server: $(gear~spin) running"
+          }
+        }
+      },
+      "command": "if [ \"${CODESPACES}\" = \"true\" ]; then while ! gh codespace ports -c $CODESPACE_NAME | grep 3001; do sleep 1; done; gh codespace ports visibility 3001:public -c $CODESPACE_NAME; fi & cd ${workspaceFolder}/server/ && yarn dev",
+      "runOptions": {
+        "instanceLimit": 1,
+        "reevaluateOnRerun": true
+      },
+      "presentation": {
+        "echo": true,
+        "reveal": "always",
+        "focus": false,
+        "panel": "shared",
+        "showReuseMessage": true,
+        "clear": false
+      },
+      "label": "Server: run"
+    },
+    {
+      "type": "shell",
+      "options": {
+        "cwd": "${workspaceFolder}/frontend",
+        "statusbar": {
+          "color": "#ffea00",
+          "detail": "Runs the frontend",
+          "label": "Frontend: $(play) run",
+          "running": {
+            "color": "#ffea00",
+            "label": "Frontend: $(gear~spin) running"
+          }
+        }
+      },
+      "command": "cd ${workspaceFolder}/frontend/ && yarn dev",
+      "runOptions": {
+        "instanceLimit": 1,
+        "reevaluateOnRerun": true
+      },
+      "presentation": {
+        "echo": true,
+        "reveal": "always",
+        "focus": false,
+        "panel": "shared",
+        "showReuseMessage": true,
+        "clear": false
+      },
+      "label": "Frontend: run"
+    }
+  ]
+}
diff --git a/collector/utils/extensions/RepoLoader/GitlabRepo/RepoLoader/index.js b/collector/utils/extensions/RepoLoader/GitlabRepo/RepoLoader/index.js
index c909329862a63d9b4e1a56662d90d0bfa39bd71f..7d5c8438cb38330e976b523e50fab0b54b1644d1 100644
--- a/collector/utils/extensions/RepoLoader/GitlabRepo/RepoLoader/index.js
+++ b/collector/utils/extensions/RepoLoader/GitlabRepo/RepoLoader/index.js
@@ -223,10 +223,6 @@ class GitLabRepoLoader {
         const objects = Array.isArray(data)
           ? data.filter((item) => item.type === "blob")
           : []; // only get files, not paths or submodules
-        if (objects.length === 0) {
-          fetching = false;
-          break;
-        }
 
         // Apply ignore path rules to found objects. If any rules match it is an invalid file path.
         console.log(
diff --git a/collector/utils/extensions/YoutubeTranscript/YoutubeLoader/youtube-transcript.js b/collector/utils/extensions/YoutubeTranscript/YoutubeLoader/youtube-transcript.js
index c81c0ec565cc7befdae333b616ffac975cb13f8b..f868875b264e3f20fe970ad7c57dbecfb5e3b68a 100644
--- a/collector/utils/extensions/YoutubeTranscript/YoutubeLoader/youtube-transcript.js
+++ b/collector/utils/extensions/YoutubeTranscript/YoutubeLoader/youtube-transcript.js
@@ -47,10 +47,12 @@ class YoutubeTranscript {
       let transcript = "";
       const chunks = transcriptXML.getElementsByTagName("text");
       for (const chunk of chunks) {
-        transcript += chunk.textContent;
+        // Add space after each text chunk
+        transcript += chunk.textContent + " ";
       }
 
-      return transcript;
+      // Trim extra whitespace
+      return transcript.trim().replace(/\s+/g, " ");
     } catch (e) {
       throw new YoutubeTranscriptError(e);
     }
diff --git a/frontend/src/components/LLMSelection/GeminiLLMOptions/index.jsx b/frontend/src/components/LLMSelection/GeminiLLMOptions/index.jsx
index bcbea0935197aa7eb448f2335dea3809b5030338..0906492de9749cce35654c61854634303b0ca075 100644
--- a/frontend/src/components/LLMSelection/GeminiLLMOptions/index.jsx
+++ b/frontend/src/components/LLMSelection/GeminiLLMOptions/index.jsx
@@ -35,6 +35,7 @@ export default function GeminiLLMOptions({ settings }) {
                   "gemini-1.0-pro",
                   "gemini-1.5-pro-latest",
                   "gemini-1.5-flash-latest",
+                  "gemini-1.5-pro-exp-0801",
                 ].map((model) => {
                   return (
                     <option key={model} value={model}>
diff --git a/frontend/src/components/LLMSelection/OllamaLLMOptions/index.jsx b/frontend/src/components/LLMSelection/OllamaLLMOptions/index.jsx
index 643764cffd743d7cf384d12c429488098726d699..a123e1972d76530fd60416012e605fc41fa1fa54 100644
--- a/frontend/src/components/LLMSelection/OllamaLLMOptions/index.jsx
+++ b/frontend/src/components/LLMSelection/OllamaLLMOptions/index.jsx
@@ -2,8 +2,9 @@ import React, { useEffect, useState } from "react";
 import System from "@/models/system";
 import PreLoader from "@/components/Preloader";
 import { OLLAMA_COMMON_URLS } from "@/utils/constants";
-import { CaretDown, CaretUp } from "@phosphor-icons/react";
+import { CaretDown, CaretUp, Info } from "@phosphor-icons/react";
 import useProviderEndpointAutoDiscovery from "@/hooks/useProviderEndpointAutoDiscovery";
+import { Tooltip } from "react-tooltip";
 
 export default function OllamaLLMOptions({ settings }) {
   const {
@@ -18,15 +19,13 @@ export default function OllamaLLMOptions({ settings }) {
     initialBasePath: settings?.OllamaLLMBasePath,
     ENDPOINTS: OLLAMA_COMMON_URLS,
   });
-
+  const [performanceMode, setPerformanceMode] = useState(
+    settings?.OllamaLLMPerformanceMode || "base"
+  );
   const [maxTokens, setMaxTokens] = useState(
     settings?.OllamaLLMTokenLimit || 4096
   );
 
-  const handleMaxTokensChange = (e) => {
-    setMaxTokens(Number(e.target.value));
-  };
-
   return (
     <div className="w-full flex flex-col gap-y-7">
       <div className="w-full flex items-start gap-[36px] mt-1.5">
@@ -46,7 +45,7 @@ export default function OllamaLLMOptions({ settings }) {
             defaultChecked="4096"
             min={1}
             value={maxTokens}
-            onChange={handleMaxTokensChange}
+            onChange={(e) => setMaxTokens(Number(e.target.value))}
             onScroll={(e) => e.target.blur()}
             required={true}
             autoComplete="off"
@@ -64,7 +63,7 @@ export default function OllamaLLMOptions({ settings }) {
           }}
           className="border-none text-white hover:text-white/70 flex items-center text-sm"
         >
-          {showAdvancedControls ? "Hide" : "Show"} Manual Endpoint Input
+          {showAdvancedControls ? "Hide" : "Show"} advanced settings
           {showAdvancedControls ? (
             <CaretUp size={14} className="ml-1" />
           ) : (
@@ -134,12 +133,57 @@ export default function OllamaLLMOptions({ settings }) {
                 className="underline text-blue-300"
                 href="https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-keep-a-model-loaded-in-memory-or-make-it-unload-immediately"
                 target="_blank"
+                rel="noreferrer"
               >
                 {" "}
                 Learn more &rarr;
               </a>
             </p>
           </div>
+
+          <div className="flex flex-col w-60">
+            <label className="text-white text-sm font-semibold mb-2 flex items-center">
+              Performance Mode
+              <Info
+                size={16}
+                className="ml-2 text-white"
+                data-tooltip-id="performance-mode-tooltip"
+              />
+            </label>
+            <select
+              name="OllamaLLMPerformanceMode"
+              required={true}
+              className="bg-zinc-900 border-gray-500 text-white text-sm rounded-lg block w-full p-2.5"
+              value={performanceMode}
+              onChange={(e) => setPerformanceMode(e.target.value)}
+            >
+              <option value="base">Base (Default)</option>
+              <option value="maximum">Maximum</option>
+            </select>
+            <p className="text-xs leading-[18px] font-base text-white text-opacity-60 mt-2">
+              Choose the performance mode for the Ollama model.
+            </p>
+            <Tooltip
+              id="performance-mode-tooltip"
+              place="bottom"
+              className="tooltip !text-xs max-w-xs"
+            >
+              <p className="text-red-500">
+                <strong>Note:</strong> Only change this setting if you
+                understand its implications on performance and resource usage.
+              </p>
+              <br />
+              <p>
+                <strong>Base:</strong> Ollama automatically limits the context
+                to 2048 tokens, reducing VRAM usage. Suitable for most users.
+              </p>
+              <br />
+              <p>
+                <strong>Maximum:</strong> Uses the full context window (up to
+                Max Tokens). May increase VRAM usage significantly.
+              </p>
+            </Tooltip>
+          </div>
         </div>
       </div>
     </div>
diff --git a/frontend/src/hooks/useGetProvidersModels.js b/frontend/src/hooks/useGetProvidersModels.js
index c56f42fdca0ed34212da3f2cd5ecbc06727786dd..fc0311a592c1df8977b3ddc262a37c5b66379b56 100644
--- a/frontend/src/hooks/useGetProvidersModels.js
+++ b/frontend/src/hooks/useGetProvidersModels.js
@@ -16,6 +16,7 @@ const PROVIDER_DEFAULT_MODELS = {
     "gemini-1.0-pro",
     "gemini-1.5-pro-latest",
     "gemini-1.5-flash-latest",
+    "gemini-1.5-pro-exp-0801",
   ],
   anthropic: [
     "claude-instant-1.2",
diff --git a/frontend/src/locales/it/common.js b/frontend/src/locales/it/common.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b74bd4fdfc8de91eb7b40ed5d289c6698717b30
--- /dev/null
+++ b/frontend/src/locales/it/common.js
@@ -0,0 +1,498 @@
+const TRANSLATIONS = {
+  common: {
+    "workspaces-name": "Nome delle aree di lavoro",
+    error: "errore",
+    success: "successo",
+    user: "Utente",
+    selection: "Selezione del modello",
+    saving: "Salvo...",
+    save: "Salva modifiche",
+    previous: "Pagina precedente",
+    next: "Pagina successiva",
+  },
+
+  // Setting Sidebar menu items.
+  settings: {
+    title: "Impostazioni istanza",
+    system: "Impostazioni generali",
+    invites: "Inviti",
+    users: "Utenti",
+    workspaces: "Aree di lavoro",
+    "workspace-chats": "Chat dell'area di lavoro",
+    customization: "Personalizzazione",
+    "api-keys": "API Sviluppatore",
+    llm: "LLM",
+    transcription: "Trascrizione",
+    embedder: "Embedder",
+    "text-splitting": "Suddivisione di testo & Chunking",
+    "voice-speech": "Voce & discorso",
+    "vector-database": "Database Vettoriale",
+    embeds: "Chat incorporata",
+    "embed-chats": "Storico chat incorporata",
+    security: "Sicurezza",
+    "event-logs": "Log degli eventi",
+    privacy: "Privacy & Dati",
+    "ai-providers": "AI Providers",
+    "agent-skills": "Abilità dell'agente",
+    admin: "Admin",
+    tools: "Strumenti",
+    "experimental-features": "Caratteristiche sperimentali",
+    contact: "Contatta il Supporto",
+  },
+
+  // Page Definitions
+  login: {
+    "multi-user": {
+      welcome: "Benvenuto in",
+      "placeholder-username": "Username",
+      "placeholder-password": "Password",
+      login: "Login",
+      validating: "Verifica in corso...",
+      "forgot-pass": "Password dimenticata",
+      reset: "Reset",
+    },
+    "sign-in": {
+      start: "Accedi al tuo",
+      end: "account.",
+    },
+    "password-reset": {
+      title: "Password Reset",
+      description:
+        "Fornisci le informazioni necessarie qui sotto per reimpostare la tua password.",
+      "recovery-codes": "Codici di recupero",
+      "recovery-code": "Codice di recupero {{index}}",
+      "back-to-login": "Torna al Login",
+    },
+  },
+
+  welcomeMessage: {
+    part1:
+      "Benvenuti in AnythingLLM, AnythingLLM è uno strumento di intelligenza artificiale open source di Mintplex Labs che trasforma qualsiasi cosa in un chatbot addestrato con cui puoi effettuare query e chattare. AnythingLLM è un software BYOK (bring-your-own-keys), quindi non ci sono abbonamenti, commissioni o costi per questo software al di fuori dei servizi che vuoi utilizzare.",
+    part2:
+      "AnythingLLM è il modo più semplice per mettere insieme potenti prodotti di intelligenza artificiale come OpenAi, GPT-4, LangChain, PineconeDB, ChromaDB e altri servizi in un pacchetto ordinato e senza problemi per aumentare la tua produttività di 100 volte.",
+    part3:
+      "AnythingLLM può essere eseguito completamente in locale sulla tua macchina con un overhead minimo, non ti accorgerai nemmeno che c'è! Non serve GPU. Sono disponibili anche installazioni cloud e on-premise.\nL'ecosistema degli strumenti di intelligenza artificiale diventa ogni giorno più potente. AnythingLLM lo rende facile da usare.",
+    githubIssue: "Apri una issue su Github",
+    user1: "Come posso iniziare?!",
+    part4:
+      'È semplice. Tutte le raccolte sono organizzate in contenitori che chiamiamo "Aree di lavoro". Le aree di lavoro sono contenitori di file, documenti, immagini, PDF e altri file che verranno trasformati in qualcosa che gli LLM possono comprendere e utilizzare nella conversazione.\n\nPuoi aggiungere e rimuovere file in qualsiasi momento.',
+    createWorkspace: "Crea la tua prima area di lavoro",
+    user2:
+      "È come Dropbox AI o qualcosa del genere? E le chat? È un chatbot, non è vero?",
+    part5:
+      "AnythingLLM è migliore di un Dropbox più smart.\n\nAnythingLLM offre due modi di comunicare con i tuoi dati:\n\n<i>Query:</i> Le tue chat restituiranno dati o inferenze trovate con i documenti nella tua area di lavoro a cui ha accesso. Aggiungere più documenti all'area di lavoro lo rende più intelligente! \n\n<i>Conversazionale:</i> i tuoi documenti + la cronologia delle chat in corso contribuiscono entrambi alla conoscenza dell'LLM allo stesso tempo. Ottimo per aggiungere informazioni basate su testo in tempo reale o correzioni e incomprensioni che l'LLM potrebbe avere. \n\nPuoi passare da una modalità all'altra \n<i>nel mezzo della chat!</i>",
+    user3: "Wow, sembra fantastico, fammi provare!",
+    part6: "Divertiti!",
+    starOnGithub: "Metti una stella su GitHub",
+    contact: "Contatta Mintplex Labs",
+  },
+
+  "new-workspace": {
+    title: "Nuova area di lavoro",
+    placeholder: "La mia area di lavoro",
+  },
+
+  // Workspace Settings menu items
+  "workspaces—settings": {
+    general: "Impostazioni generali",
+    chat: "Impostazioni Chat",
+    vector: "Database vettoriale",
+    members: "Membri",
+    agent: "Configurazione dell'agente",
+  },
+
+  // General Appearance
+  general: {
+    vector: {
+      title: "Contatore dei vettori",
+      description: "Numero totale di vettori nel tuo database vettoriale.",
+    },
+    names: {
+      description:
+        "Questo cambierà solo il nome visualizzato della tua area di lavoro.",
+    },
+    message: {
+      title: "Messaggi Chat suggeriti",
+      description:
+        "Personalizza i messaggi che verranno suggeriti agli utenti della tua area di lavoro.",
+      add: "Aggiungi un nuovo messaggio",
+      save: "Salva messaggi",
+      heading: "Spiegami",
+      body: "i vantaggi di AnythingLLM",
+    },
+    pfp: {
+      title: "Immagine del profilo dell'assistente",
+      description:
+        "Personalizza l'immagine del profilo dell'assistente per quest'area di lavoro.",
+      image: "Immagine dell'area di lavoro",
+      remove: "Rimuovi immagine dell'area di lavoro",
+    },
+    delete: {
+      title: "Elimina area di lavoro",
+      description:
+        "Elimina quest'area di lavoro e tutti i suoi dati. Ciò eliminerà l'area di lavoro per tutti gli utenti.",
+      delete: "Elimina area di lavoro",
+      deleting: "Eliminazione dell'area di lavoro...",
+      "confirm-start": "Stai per eliminare l'intera",
+      "confirm-end":
+        "area di lavoro. Verranno rimossi tutti gli embeddings vettoriali nel tuo database vettoriale.\n\nI file sorgente originali rimarranno intatti. Questa azione è irreversibile.",
+    },
+  },
+
+  // Chat Settings
+  chat: {
+    llm: {
+      title: "LLM Provider dell'area di lavoro",
+      description:
+        "Il provider LLM e il modello specifici che verranno utilizzati per quest'area di lavoro. Per impostazione predefinita, utilizza il provider LLM e le impostazioni di sistema.",
+      search: "Cerca tutti i provider LLM",
+    },
+    model: {
+      title: "Modello di chat dell'area di lavoro",
+      description:
+        "Il modello di chat specifico che verrà utilizzato per quest'area di lavoro. Se vuoto, utilizzerà l'LLM di sistema.",
+      wait: "-- in attesa dei modelli --",
+    },
+    mode: {
+      title: "Modalità chat",
+      chat: {
+        title: "Chat",
+        "desc-start": "fornirà risposte con la conoscenza generale dell'LLM",
+        and: "e",
+        "desc-end": "contesto documentale associato.",
+      },
+      query: {
+        title: "Query",
+        "desc-start": "fornirà risposte",
+        only: "solo",
+        "desc-end": "se sarà presente un contesto documentale",
+      },
+    },
+    history: {
+      title: "Chat History",
+      "desc-start":
+        "Numero di chat precedenti che verranno incluse nella memoria a breve termine della risposta.",
+      recommend: "Recommend 20. ",
+      "desc-end":
+        "Un numero superiore a 45 potrebbe causare continui errori nella chat, a seconda delle dimensioni del messaggio.",
+    },
+    prompt: {
+      title: "Prompt",
+      description:
+        "Il prompt che verrà utilizzato in quest'area di lavoro. Definisci il contesto e le istruzioni affinché l'IA generi una risposta. Dovresti fornire un prompt elaborato con cura in modo che l'IA possa generare una risposta pertinente e accurata.",
+    },
+    refusal: {
+      title: "Risposta al rifiuto nella modalità di query",
+      "desc-start": "Quando la modalità",
+      query: "query",
+      "desc-end":
+        "è attiva, potresti voler restituire una risposta di rifiuto personalizzata quando non viene trovato alcun contesto.",
+    },
+    temperature: {
+      title: "Temperatura LLM",
+      "desc-start":
+        'Questa impostazione controlla il livello di "creatività" delle risposte dell\'LLM.',
+      "desc-end":
+        "Più alto è il numero, più è creativo. Per alcuni modelli questo può portare a risposte incoerenti se troppo elevato.",
+      hint: "La maggior parte degli LLM ha vari intervalli accettabili di valori validi. Consulta il tuo fornitore LLM per queste informazioni.",
+    },
+  },
+
+  // Vector Database
+  "vector-workspace": {
+    identifier: "Identificatore del database vettoriale",
+    snippets: {
+      title: "Numero massimo di frammenti di contesto",
+      description:
+        "Questa impostazione controlla la quantità massima di frammenti di contesto che verranno inviati all'LLM per ogni chat o query.",
+      recommend: "Raccomandato: 4",
+    },
+    doc: {
+      title: "Soglia di similarità del documento",
+      description:
+        "Punteggio di similarità minimo richiesto affinché una fonte sia considerata correlata alla chat. Più alto è il numero, più la fonte deve essere simile alla chat.",
+      zero: "Nessuna restrizione",
+      low: "Basso (punteggio di similarità ≥ .25)",
+      medium: "Medio (punteggio di similarità ≥ .50)",
+      high: "Alto (punteggio di similarità ≥ .75)",
+    },
+    reset: {
+      reset: "Reimposta database vettoriale",
+      resetting: "Cancellazione vettori...",
+      confirm:
+        "Stai per reimpostare il database vettoriale di quest'area di lavoro. Questa operazione rimuoverà tutti gli embedding vettoriali attualmente incorporati.\n\nI file sorgente originali rimarranno intatti. Questa azione è irreversibile.",
+      error:
+        "Impossibile reimpostare il database vettoriale dell'area di lavoro!",
+      success:
+        "Il database vettoriale dell'area di lavoro è stato reimpostato!",
+    },
+  },
+
+  // Agent Configuration
+  agent: {
+    "performance-warning":
+      "Le prestazioni degli LLM che non supportano esplicitamente la chiamata degli strumenti dipendono in larga misura dalle capacità e dalla precisione del modello. Alcune capacità potrebbero essere limitate o non funzionali.",
+    provider: {
+      title: "Provider LLM dell'agente dell'area di lavoro",
+      description:
+        "Il provider e il modello LLM specifici che verranno utilizzati per l'agente @agent di quest'area di lavoro.",
+    },
+    mode: {
+      chat: {
+        title: "Modello di chat dell'agente dell'area di lavoro",
+        description:
+          "Il modello di chat specifico che verrà utilizzato per l'agente @agent di quest'area di lavoro.",
+      },
+      title: "Modello dell'agente dell'area di lavoro",
+      description:
+        "Il modello LLM specifico che verrà utilizzato per l'agente @agent di quest'area di lavoro.",
+      wait: "-- in attesa dei modelli --",
+    },
+
+    skill: {
+      title: "Abilità predefinite dell'agente",
+      description:
+        "Migliora le capacità naturali dell'agente predefinito con queste abilità predefinite. Questa configurazione si applica a tutte le aree di lavoro.",
+      rag: {
+        title: "RAG e memoria a lungo termine",
+        description:
+          "Consenti all'agente di sfruttare i tuoi documenti locali per rispondere a una query o chiedi all'agente di \"ricordare\" parti di contenuto per il recupero della memoria a lungo termine.",
+      },
+      view: {
+        title: "Visualizza e riepiloga i documenti",
+        description:
+          "Consenti all'agente di elencare e riepilogare il contenuto dei file dell'area di lavoro attualmente incorporati.",
+      },
+      scrape: {
+        title: "Esplora siti Web",
+        description:
+          "Consenti all'agente di visitare ed eseguire lo scraping del contenuto dei siti Web.",
+      },
+      generate: {
+        title: "Genera grafici",
+        description:
+          "Consenti all'agente predefinito di generare vari tipi di grafici dai dati forniti o forniti nella chat.",
+      },
+      save: {
+        title: "Genera e salva file nel browser",
+        description:
+          "Abilita l'agente predefinito per generare e scrivere su file che possono essere salvati e scaricati nel tuo browser.",
+      },
+      web: {
+        title: "Ricerca e navigazione web in tempo reale",
+        "desc-start":
+          "Abilita il tuo agente a cercare sul web per rispondere alle tue domande connettendosi a un provider di ricerca web (SERP).",
+        "desc-end":
+          "La ricerca web durante le sessioni dell'agente non funzionerà finché non verrà impostata.",
+      },
+    },
+  },
+
+  // Workspace Chats
+  recorded: {
+    title: "Chat dell'area di lavoro",
+    description:
+      "Queste sono tutte le chat e i messaggi registrati che sono stati inviati dagli utenti ordinati in base alla data di creazione.",
+    export: "Esporta",
+    table: {
+      id: "Id",
+      by: "Inviato da",
+      workspace: "Area di lavoro",
+      prompt: "Prompt",
+      response: "Risposta",
+      at: "Inviato a",
+    },
+  },
+
+  // Appearance
+  appearance: {
+    title: "Aspetto",
+    description:
+      "Personalizza le impostazioni di aspetto della tua piattaforma.",
+    logo: {
+      title: "Personalizza logo",
+      description:
+        "Carica il tuo logo personalizzato per rendere tuo il chatbot.",
+      add: "Aggiungi un logo personalizzato",
+      recommended: "Dimensioni consigliate: 800 x 200",
+      remove: "Rimuovi",
+      replace: "Sostituisci",
+    },
+    message: {
+      title: "Personalizza messaggi",
+      description:
+        "Personalizza i messaggi automatici visualizzati dai tuoi utenti.",
+      new: "Nuovo",
+      system: "sistema",
+      user: "utente",
+      message: "messaggio",
+      assistant: "Assistente chat AnythingLLM",
+      "double-click": "Fai doppio clic per modificare...",
+      save: "Salva messaggi",
+    },
+    icons: {
+      title: "Icone a piè di pagina personalizzate",
+      description:
+        "Personalizza le icone a piè di pagina visualizzate nella parte inferiore della barra laterale.",
+      icon: "Icona",
+      link: "Collegamento",
+    },
+  },
+
+  // API Keys
+  api: {
+    title: "Chiavi API",
+    description:
+      "Le chiavi API consentono al titolare di accedere e gestire in modo programmatico questa istanza AnythingLLM.",
+    link: "Leggi la documentazione API",
+    generate: "Genera nuova chiave API",
+    table: {
+      key: "Chiave API",
+      by: "Creato da",
+      created: "Creato",
+    },
+  },
+
+  llm: {
+    title: "Preferenza LLM",
+    description:
+      "Queste sono le credenziali e le impostazioni per il tuo provider di chat e embedding LLM preferito. È importante che queste chiavi siano aggiornate e corrette, altrimenti AnythingLLM non funzionerà correttamente.",
+    provider: "Provider LLM",
+  },
+
+  transcription: {
+    title: "Preferenza del modello di trascrizione",
+    description:
+      "Queste sono le credenziali e le impostazioni per il tuo fornitore di modelli di trascrizione preferito. È importante che queste chiavi siano aggiornate e corrette, altrimenti i file multimediali e l'audio non verranno trascritti.",
+    provider: "Provider di trascrizione",
+    "warn-start":
+      "L'utilizzo del modello whisper locale su macchine con RAM o CPU limitate può bloccare AnythingLLM durante l'elaborazione di file multimediali.",
+    "warn-recommend":
+      "Si consigliano almeno 2 GB di RAM e caricare file <10 Mb.",
+    "warn-end":
+      "Il modello integrato verrà scaricato automaticamente al primo utilizzo.",
+  },
+
+  embedding: {
+    title: "Preferenza di embedding",
+    "desc-start":
+      "Quando si utilizza un LLM che non supporta nativamente un motore di embedding, potrebbe essere necessario specificare credenziali aggiuntive per l'embedding del testo.",
+    "desc-end":
+      "L'embedding è il processo di trasformazione del testo in vettori. Queste credenziali sono necessarie per trasformare i file e i prompt in un formato che AnythingLLM può utilizzare per l'elaborazione.",
+    provider: {
+      title: "Provider di embedding",
+      description:
+        "Non è richiesta alcuna configurazione quando si utilizza il motore di embedding nativo di AnythingLLM.",
+    },
+  },
+
+  text: {
+    title: "Preferenze di suddivisione e suddivisione in blocchi del testo",
+    "desc-start":
+      "A volte, potresti voler cambiare il modo predefinito in cui i nuovi documenti vengono suddivisi e spezzettati in blocchi prima di essere inseriti nel tuo database vettoriale.",
+    "desc-end":
+      "Dovresti modificare questa impostazione solo se capisci come funziona la suddivisione del testo e i suoi effetti collaterali.",
+    "warn-start": "Le modifiche qui si applicheranno solo a",
+    "warn-center": "nuovi documenti incorporati",
+    "warn-end": ", non documenti esistenti.",
+    size: {
+      title: "Dimensioni blocco di testo",
+      description:
+        "Questa è la lunghezza massima di caratteri che possono essere presenti in un singolo vettore.",
+      recommend: "La lunghezza massima del modello di embedding è",
+    },
+    overlap: {
+      title: "Sovrapposizione blocco di testo",
+      description:
+        "Questa è la sovrapposizione massima di caratteri che si verifica durante la suddivisione in blocchi tra due porzioni di testo adiacenti.",
+    },
+  },
+
+  // Vector Database
+  vector: {
+    title: "Database vettoriale",
+    description:
+      "Queste sono le credenziali e le impostazioni per il funzionamento della tua istanza AnythingLLM. È importante che queste chiavi siano aggiornate e corrette.",
+    provider: {
+      title: "Provider del database vettoriale",
+      description: "Non è richiesta alcuna configurazione per LanceDB.",
+    },
+  },
+
+  // Embeddable Chat Widgets
+  embeddable: {
+    title: "Widget di chat incorporabili",
+    description:
+      "I widget di chat incorporabili sono interfacce di chat pubbliche che sono collegate a una singola area di lavoro. Queste ti consentono di creare aree di lavoro che puoi poi pubblicare ovunque.",
+    create: "Crea embedding",
+    table: {
+      workspace: "Area di lavoro",
+      chats: "Chat inviate",
+      Active: "Domini attivi",
+    },
+  },
+
+  "embed-chats": {
+    title: "Chat incorporate",
+    description:
+      "Queste sono tutte le chat e i messaggi registrati da qualsiasi embedding che hai pubblicato.",
+    table: {
+      embed: "Incorpora",
+      sender: "Mittente",
+      message: "Messaggio",
+      response: "Risposta",
+      at: "Inviato a",
+    },
+  },
+
+  multi: {
+    title: "Modalità multi-utente",
+    description:
+      "Imposta la tua istanza per supportare il tuo team attivando la modalità multi-utente.",
+    enable: {
+      "is-enable": "La modalità multi-utente è abilitata",
+      enable: "Abilita la modalità multi-utente",
+      description:
+        "Per impostazione predefinita, sarai l'unico amministratore. Come amministratore dovrai creare account per tutti i nuovi utenti o amministratori. Non perdere la tua password poiché solo un utente amministratore può reimpostare le password.",
+      username: "Nome utente account amministratore",
+      password: "Password account amministratore",
+    },
+    password: {
+      title: "Protezione password",
+      description:
+        "Proteggi la tua istanza AnythingLLM con una password. Se la dimentichi, non esiste un metodo di recupero, quindi assicurati di salvare questa password.",
+    },
+    instance: {
+      title: "Protezione password istanza",
+      description:
+        "Per impostazione predefinita, sarai l'unico amministratore. Come amministratore dovrai creare account per tutti i nuovi utenti o amministratori. Non perdere la tua password poiché solo un utente amministratore può reimpostare le password.",
+      password: "Password istanza",
+    },
+  },
+
+  // Event Logs
+  event: {
+    title: "Registro eventi",
+    description:
+      "Visualizza tutte le azioni e gli eventi che si verificano su questa istanza per il monitoraggio.",
+    clear: "Cancella registri eventi",
+    table: {
+      type: "Tipo di evento",
+      user: "Utente",
+      occurred: "Si è verificato alle",
+    },
+  },
+
+  // Privacy & Data-Handling
+  privacy: {
+    title: "Privacy e gestione dei dati",
+    description:
+      "Questa è la tua configurazione per il modo in cui i provider terzi connessi e AnythingLLM gestiscono i tuoi dati.",
+    llm: "Selezione LLM",
+    embedding: "Preferenza di embedding",
+    vector: "Database vettoriale",
+    anonymous: "Telemetria anonima abilitata",
+  },
+};
+
+export default TRANSLATIONS;
diff --git a/frontend/src/locales/pt_BR/common.js b/frontend/src/locales/pt_BR/common.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0f8d495c5ad0d532ac510df6b106dc79d9d97f2
--- /dev/null
+++ b/frontend/src/locales/pt_BR/common.js
@@ -0,0 +1,496 @@
+const TRANSLATIONS = {
+  common: {
+    "workspaces-name": "Nome dos Workspaces",
+    error: "erro",
+    success: "sucesso",
+    user: "Usuário",
+    selection: "Seleção de Modelo",
+    saving: "Salvando...",
+    save: "Salvar alterações",
+    previous: "Página Anterior",
+    next: "Próxima Página",
+  },
+
+  // Setting Sidebar menu items.
+  settings: {
+    title: "Configurações da Instância",
+    system: "Configurações Gerais",
+    invites: "Convites",
+    users: "Usuários",
+    workspaces: "Workspaces",
+    "workspace-chats": "Chats do Workspace",
+    customization: "Customização",
+    "api-keys": "API para Desenvolvedores",
+    llm: "LLM",
+    transcription: "Transcrição",
+    embedder: "Incorporador",
+    "text-splitting": "Divisor de Texto e Fragmentação",
+    "voice-speech": "Voz e Fala",
+    "vector-database": "Banco de Dados Vetorial",
+    embeds: "Incorporar Chat",
+    "embed-chats": "Histórico de Chats Incorporados",
+    security: "Segurança",
+    "event-logs": "Logs de Eventos",
+    privacy: "Privacidade e Dados",
+    "ai-providers": "Provedores de IA",
+    "agent-skills": "Habilidades do Agente",
+    admin: "Admin",
+    tools: "Ferramentas",
+    "experimental-features": "Recursos Experimentais",
+    contact: "Contato com Suporte",
+  },
+
+  // Page Definitions
+  login: {
+    "multi-user": {
+      welcome: "Bem-vindo ao",
+      "placeholder-username": "Nome de Usuário",
+      "placeholder-password": "Senha",
+      login: "Entrar",
+      validating: "Validando...",
+      "forgot-pass": "Esqueceu a senha",
+      reset: "Redefinir",
+    },
+    "sign-in": {
+      start: "Faça login na sua",
+      end: "conta.",
+    },
+    "password-reset": {
+      title: "Redefinição de Senha",
+      description:
+        "Forneça as informações necessárias abaixo para redefinir sua senha.",
+      "recovery-codes": "Códigos de Recuperação",
+      "recovery-code": "Código de Recuperação {{index}}",
+      "back-to-login": "Voltar ao Login",
+    },
+  },
+
+  welcomeMessage: {
+    part1:
+      "Bem-vindo ao AnythingLLM, AnythingLLM é uma ferramenta de IA de código aberto da Mintplex Labs que transforma qualquer coisa em um chatbot treinado que você pode consultar e conversar. AnythingLLM é um software BYOK (bring-your-own-keys | traga suas próprias chaves), portanto, não há assinatura, taxa ou cobranças para este software fora dos serviços que você deseja usar com ele.",
+    part2:
+      "AnythingLLM é a maneira mais fácil de reunir produtos de IA poderosos como OpenAi, GPT-4, LangChain, PineconeDB, ChromaDB e outros serviços em um pacote organizado sem complicações para aumentar sua produtividade em 100x.",
+    part3:
+      "AnythingLLM pode ser executado totalmente localmente em sua máquina com pouca sobrecarga que você nem perceberá que está lá! Não é necessário GPU. A instalação em nuvem e localmente também está disponível.\nO ecossistema de ferramentas de IA fica mais poderoso a cada dia. AnythingLLM facilita o uso.",
+    githubIssue: "Criar uma issue no Github",
+    user1: "Como eu começo?!",
+    part4:
+      'É simples. Todas as coleções são organizadas em grupos que chamamos de "Workspaces". Workspaces são grupos de arquivos, documentos, imagens, PDFs e outros arquivos que serão transformados em algo que os LLMs podem entender e usar em conversas.\n\nVocê pode adicionar e remover arquivos a qualquer momento.',
+    createWorkspace: "Crie seu primeiro workspace",
+    user2:
+      "Isso é como um Dropbox de IA ou algo assim? E quanto a conversar? Não é um chatbot?",
+    part5:
+      "AnythingLLM é mais do que um Dropbox mais inteligente.\n\nAnythingLLM oferece duas maneiras de conversar com seus dados:\n\n<i>Consulta:</i> Seus chats retornarão dados ou inferências encontradas com os documentos em seu workspace ao qual tem acesso. Adicionar mais documentos ao Workspace o torna mais inteligente!\n\n<i>Conversacional:</i> Seus documentos + seu histórico de chat em andamento contribuem para o conhecimento do LLM ao mesmo tempo. Ótimo para adicionar informações em tempo real baseadas em texto ou correções e mal-entendidos que o LLM possa ter.\n\nVocê pode alternar entre qualquer modo \n<i>no meio da conversa!</i>",
+    user3: "Uau, isso soa incrível, deixe-me experimentar já!",
+    part6: "Divirta-se!",
+    starOnGithub: "Dar estrela no GitHub",
+    contact: "Contato Mintplex Labs",
+  },
+
+  "new-workspace": {
+    title: "Novo Workspace",
+    placeholder: "Meu Workspace",
+  },
+
+  // Workspace Settings menu items
+  "workspaces—settings": {
+    general: "Configurações Gerais",
+    chat: "Configurações de Chat",
+    vector: "Banco de Dados Vetorial",
+    members: "Membros",
+    agent: "Configuração do Agente",
+  },
+
+  // General Appearance
+  general: {
+    vector: {
+      title: "Contagem de Vetores",
+      description: "Número total de vetores no seu banco de dados vetorial.",
+    },
+    names: {
+      description: "Isso mudará apenas o nome de exibição do seu workspace.",
+    },
+    message: {
+      title: "Mensagens de Chat Sugeridas",
+      description:
+        "Personalize as mensagens que serão sugeridas aos usuários do seu workspace.",
+      add: "Adicionar nova mensagem",
+      save: "Salvar Mensagens",
+      heading: "Explique para mim",
+      body: "os benefícios do AnythingLLM",
+    },
+    pfp: {
+      title: "Imagem de Perfil do Assistente",
+      description:
+        "Personalize a imagem de perfil do assistente para este workspace.",
+      image: "Imagem do Workspace",
+      remove: "Remover Imagem do Workspace",
+    },
+    delete: {
+      title: "Excluir Workspace",
+      description:
+        "Excluir este workspace e todos os seus dados. Isso excluirá o workspace para todos os usuários.",
+      delete: "Excluir Workspace",
+      deleting: "Excluindo Workspace...",
+      "confirm-start": "Você está prestes a excluir todo o seu",
+      "confirm-end":
+        "workspace. Isso removerá todas as incorporações vetoriais no seu banco de dados vetorial.\n\nOs arquivos de origem originais permanecerão intactos. Esta ação é irreversível.",
+    },
+  },
+
+  // Chat Settings
+  chat: {
+    llm: {
+      title: "Provedor de LLM do Workspace",
+      description:
+        "O provedor e modelo específico de LLM que será usado para este workspace. Por padrão, usa o provedor e as configurações do sistema LLM.",
+      search: "Pesquisar todos os provedores de LLM",
+    },
+    model: {
+      title: "Modelo de Chat do Workspace",
+      description:
+        "O modelo de chat específico que será usado para este workspace. Se vazio, usará a preferência do LLM do sistema.",
+      wait: "-- aguardando modelos --",
+    },
+    mode: {
+      title: "Modo de Chat",
+      chat: {
+        title: "Chat",
+        "desc-start": "fornecerá respostas com o conhecimento geral do LLM",
+        and: "e",
+        "desc-end": "contexto do documento encontrado.",
+      },
+      query: {
+        title: "Consulta",
+        "desc-start": "fornecerá respostas",
+        only: "somente",
+        "desc-end": "se o contexto do documento for encontrado.",
+      },
+    },
+    history: {
+      title: "Histórico de Chat",
+      "desc-start":
+        "O número de chats anteriores que serão incluídos na memória de curto prazo da resposta.",
+      recommend: "Recomendado: 20. ",
+      "desc-end":
+        "Qualquer coisa acima de 45 provavelmente levará a falhas contínuas de chat dependendo do tamanho da mensagem.",
+    },
+    prompt: {
+      title: "Prompt",
+      description:
+        "O prompt que será usado neste workspace. Defina o contexto e as instruções para que a IA gere uma resposta. Você deve fornecer um prompt cuidadosamente elaborado para que a IA possa gerar uma resposta relevante e precisa.",
+    },
+    refusal: {
+      title: "Resposta de Recusa no Modo de Consulta",
+      "desc-start": "Quando estiver no modo",
+      query: "consulta",
+      "desc-end":
+        ", você pode querer retornar uma resposta de recusa personalizada quando nenhum contexto for encontrado.",
+    },
+    temperature: {
+      title: "Temperatura do LLM",
+      "desc-start":
+        'Esta configuração controla o quão "criativas" serão as respostas do seu LLM.',
+      "desc-end":
+        "Quanto maior o número, mais criativa será a resposta. Para alguns modelos, isso pode levar a respostas incoerentes quando configurado muito alto.",
+      hint: "A maioria dos LLMs tem vários intervalos aceitáveis de valores válidos. Consulte seu provedor de LLM para essa informação.",
+    },
+  },
+
+  // Vector Database
+  "vector-workspace": {
+    identifier: "Identificador do Banco de Dados Vetorial",
+    snippets: {
+      title: "Máximo de Trechos de Contexto",
+      description:
+        "Esta configuração controla a quantidade máxima de trechos de contexto que será enviada ao LLM por chat ou consulta.",
+      recommend: "Recomendado: 4",
+    },
+    doc: {
+      title: "Limite de Similaridade de Documentos",
+      description:
+        "A pontuação mínima de similaridade necessária para que uma fonte seja considerada relacionada ao chat. Quanto maior o número, mais semelhante a fonte deve ser ao chat.",
+      zero: "Sem restrição",
+      low: "Baixo (pontuação de similaridade ≥ 0,25)",
+      medium: "Médio (pontuação de similaridade ≥ 0,50)",
+      high: "Alto (pontuação de similaridade ≥ 0,75)",
+    },
+    reset: {
+      reset: "Redefinir Banco de Dados Vetorial",
+      resetting: "Limpando vetores...",
+      confirm:
+        "Você está prestes a redefinir o banco de dados vetorial deste workspace. Isso removerá todas as incorporações vetoriais atualmente embutidas.\n\nOs arquivos de origem originais permanecerão intactos. Esta ação é irreversível.",
+      error: "O banco de dados vetorial do workspace não pôde ser redefinido!",
+      success:
+        "O banco de dados vetorial do workspace foi redefinido com sucesso!",
+    },
+  },
+
+  // Agent Configuration
+  agent: {
+    "performance-warning":
+      "O desempenho dos LLMs que não suportam explicitamente a chamada de ferramentas depende muito das capacidades e da precisão do modelo. Algumas habilidades podem ser limitadas ou não funcionais.",
+    provider: {
+      title: "Provedor de LLM do Agente do Workspace",
+      description:
+        "O provedor e modelo específico de LLM que será usado para o agente @agent deste workspace.",
+    },
+    mode: {
+      chat: {
+        title: "Modelo de Chat do Agente do Workspace",
+        description:
+          "O modelo de chat específico que será usado para o agente @agent deste workspace.",
+      },
+      title: "Modelo do Agente do Workspace",
+      description:
+        "O modelo de LLM específico que será usado para o agente @agent deste workspace.",
+      wait: "-- aguardando modelos --",
+    },
+
+    skill: {
+      title: "Habilidades padrão do agente",
+      description:
+        "Melhore as habilidades naturais do agente padrão com essas habilidades pré-construídas. Esta configuração se aplica a todos os workspaces.",
+      rag: {
+        title: "RAG e memória de longo prazo",
+        description:
+          'Permitir que o agente utilize seus documentos locais para responder a uma consulta ou pedir ao agente para "lembrar" peças de conteúdo para recuperação de memória de longo prazo.',
+      },
+      view: {
+        title: "Visualizar e resumir documentos",
+        description:
+          "Permitir que o agente liste e resuma o conteúdo dos arquivos do workspace atualmente incorporados.",
+      },
+      scrape: {
+        title: "Raspagem de sites",
+        description:
+          "Permitir que o agente visite e raspe o conteúdo de sites.",
+      },
+      generate: {
+        title: "Gerar gráficos",
+        description:
+          "Habilitar o agente padrão para gerar vários tipos de gráficos a partir dos dados fornecidos ou dados no chat.",
+      },
+      save: {
+        title: "Gerar e salvar arquivos no navegador",
+        description:
+          "Habilitar o agente padrão para gerar e gravar arquivos que podem ser salvos e baixados no seu navegador.",
+      },
+      web: {
+        title: "Pesquisa e navegação na web ao vivo",
+        "desc-start":
+          "Permitir que seu agente pesquise na web para responder suas perguntas conectando-se a um provedor de pesquisa na web (SERP).",
+        "desc-end":
+          "A pesquisa na web durante as sessões do agente não funcionará até que isso seja configurado.",
+      },
+    },
+  },
+
+  // Workspace Chats
+  recorded: {
+    title: "Chats do Workspace",
+    description:
+      "Estes são todos os chats e mensagens gravados que foram enviados pelos usuários ordenados por data de criação.",
+    export: "Exportar",
+    table: {
+      id: "Id",
+      by: "Enviado Por",
+      workspace: "Workspace",
+      prompt: "Prompt",
+      response: "Resposta",
+      at: "Enviado Em",
+    },
+  },
+
+  // Appearance
+  appearance: {
+    title: "Aparência",
+    description: "Personalize as configurações de aparência da sua plataforma.",
+    logo: {
+      title: "Personalizar Logo",
+      description:
+        "Envie seu logotipo personalizado para tornar seu chatbot seu.",
+      add: "Adicionar um logotipo personalizado",
+      recommended: "Tamanho recomendado: 800 x 200",
+      remove: "Remover",
+      replace: "Substituir",
+    },
+    message: {
+      title: "Personalizar Mensagens",
+      description:
+        "Personalize as mensagens automáticas exibidas aos seus usuários.",
+      new: "Novo",
+      system: "sistema",
+      user: "usuário",
+      message: "mensagem",
+      assistant: "Assistente de Chat AnythingLLM",
+      "double-click": "Clique duas vezes para editar...",
+      save: "Salvar Mensagens",
+    },
+    icons: {
+      title: "Ícones de Rodapé Personalizados",
+      description:
+        "Personalize os ícones de rodapé exibidos na parte inferior da barra lateral.",
+      icon: "Ícone",
+      link: "Link",
+    },
+  },
+
+  // API Keys
+  api: {
+    title: "Chaves API",
+    description:
+      "As chaves API permitem que o titular acesse e gerencie programaticamente esta instância do AnythingLLM.",
+    link: "Leia a documentação da API",
+    generate: "Gerar Nova Chave API",
+    table: {
+      key: "Chave API",
+      by: "Criado Por",
+      created: "Criado",
+    },
+  },
+
+  llm: {
+    title: "Preferência de LLM",
+    description:
+      "Estas são as credenciais e configurações para seu provedor preferido de chat e incorporação de LLM. É importante que essas chaves estejam atualizadas e corretas, caso contrário, o AnythingLLM não funcionará corretamente.",
+    provider: "Provedor de LLM",
+  },
+
+  transcription: {
+    title: "Preferência de Modelo de Transcrição",
+    description:
+      "Estas são as credenciais e configurações para seu provedor preferido de modelo de transcrição. É importante que essas chaves estejam atualizadas e corretas, caso contrário, os arquivos de mídia e áudio não serão transcritos.",
+    provider: "Provedor de Transcrição",
+    "warn-start":
+      "Usar o modelo whisper local em máquinas com RAM ou CPU limitados pode travar o AnythingLLM ao processar arquivos de mídia.",
+    "warn-recommend":
+      "Recomendamos pelo menos 2GB de RAM e upload de arquivos <10Mb.",
+    "warn-end":
+      "O modelo embutido será baixado automaticamente no primeiro uso.",
+  },
+
+  embedding: {
+    title: "Preferência de Incorporação",
+    "desc-start":
+      "Ao usar um LLM que não suporta nativamente um mecanismo de incorporação - pode ser necessário especificar adicionalmente as credenciais para incorporação de texto.",
+    "desc-end":
+      "A incorporação é o processo de transformar texto em vetores. Essas credenciais são necessárias para transformar seus arquivos e prompts em um formato que o AnythingLLM possa usar para processar.",
+    provider: {
+      title: "Provedor de Incorporação",
+      description:
+        "Não é necessária configuração ao usar o mecanismo de incorporação nativo do AnythingLLM.",
+    },
+  },
+
+  text: {
+    title: "Preferências de Divisão e Fragmentação de Texto",
+    "desc-start":
+      "Às vezes, você pode querer alterar a maneira padrão como novos documentos são divididos e fragmentados antes de serem inseridos em seu banco de dados de vetores.",
+    "desc-end":
+      "Você só deve modificar esta configuração se entender como a divisão de texto funciona e seus efeitos colaterais.",
+    "warn-start": "As alterações aqui se aplicarão apenas a",
+    "warn-center": "documentos recém-incorporados",
+    "warn-end": ", não documentos existentes.",
+    size: {
+      title: "Tamanho do Fragmento de Texto",
+      description:
+        "Este é o comprimento máximo de caracteres que pode estar presente em um único vetor.",
+      recommend: "O comprimento máximo do modelo de incorporação é",
+    },
+
+    overlap: {
+      title: "Sobreposição de Fragmento de Texto",
+      description:
+        "Esta é a sobreposição máxima de caracteres que ocorre durante a fragmentação entre dois fragmentos de texto adjacentes.",
+    },
+  },
+
+  // Vector Database
+  vector: {
+    title: "Banco de Dados Vetorial",
+    description:
+      "Estas são as credenciais e configurações de como sua instância do AnythingLLM funcionará. É importante que essas chaves estejam atualizadas e corretas.",
+    provider: {
+      title: "Provedor de Banco de Dados Vetorial",
+      description: "Não há configuração necessária para o LanceDB.",
+    },
+  },
+
+  // Embeddable Chat Widgets
+  embeddable: {
+    title: "Widgets de Chat Incorporáveis",
+    description:
+      "Os widgets de chat incorporáveis são interfaces de chat públicas vinculadas a um único workspace. Eles permitem que você construa workspaces que você pode publicar para o mundo.",
+    create: "Criar incorporação",
+    table: {
+      workspace: "Workspace",
+      chats: "Chats Enviados",
+      Active: "Domínios Ativos",
+    },
+  },
+
+  "embed-chats": {
+    title: "Incorporar Chats",
+    description:
+      "Estes são todos os chats e mensagens registrados de qualquer incorporação que você publicou.",
+    table: {
+      embed: "Incorporação",
+      sender: "Remetente",
+      message: "Mensagem",
+      response: "Resposta",
+      at: "Enviado Em",
+    },
+  },
+
+  multi: {
+    title: "Modo Multiusuário",
+    description:
+      "Configure sua instância para suportar sua equipe ativando o Modo Multiusuário.",
+    enable: {
+      "is-enable": "Modo Multiusuário está Ativado",
+      enable: "Ativar Modo Multiusuário",
+      description:
+        "Por padrão, você será o único administrador. Como administrador, você precisará criar contas para todos os novos usuários ou administradores. Não perca sua senha, pois apenas um usuário Administrador pode redefinir senhas.",
+      username: "Nome de usuário da conta de Administrador",
+      password: "Senha da conta de Administrador",
+    },
+    password: {
+      title: "Proteção por Senha",
+      description:
+        "Proteja sua instância do AnythingLLM com uma senha. Se você esquecer esta senha, não há método de recuperação, então certifique-se de salvar esta senha.",
+    },
+    instance: {
+      title: "Proteger Instância com Senha",
+      description:
+        "Por padrão, você será o único administrador. Como administrador, você precisará criar contas para todos os novos usuários ou administradores. Não perca sua senha, pois apenas um usuário Administrador pode redefinir senhas.",
+      password: "Senha da instância",
+    },
+  },
+
+  // Event Logs
+  event: {
+    title: "Logs de Eventos",
+    description:
+      "Veja todas as ações e eventos acontecendo nesta instância para monitoramento.",
+    clear: "Limpar Logs de Eventos",
+    table: {
+      type: "Tipo de Evento",
+      user: "Usuário",
+      occurred: "Ocorreu Em",
+    },
+  },
+
+  // Privacy & Data-Handling
+  privacy: {
+    title: "Privacidade e Tratamento de Dados",
+    description:
+      "Esta é a sua configuração de como os provedores de terceiros conectados e o AnythingLLM tratam seus dados.",
+    llm: "Seleção de LLM",
+    embedding: "Preferência de Incorporação",
+    vector: "Banco de Dados Vetorial",
+    anonymous: "Telemetria Anônima Ativada",
+  },
+};
+
+export default TRANSLATIONS;
diff --git a/frontend/src/locales/resources.js b/frontend/src/locales/resources.js
index 55306cf94967a32287c5b87a9ef0805f3041be43..9725e7c3da2a6a437d4900d9757e3b86b686e9f8 100644
--- a/frontend/src/locales/resources.js
+++ b/frontend/src/locales/resources.js
@@ -20,6 +20,8 @@ import Spanish from "./es/common.js";
 import French from "./fr/common.js";
 import Mandarin from "./zh/common.js";
 import Russian from "./ru/common.js";
+import Italian from "./it/common.js";
+import Portuguese from "./pt_BR/common.js";
 
 export const defaultNS = "common";
 export const resources = {
@@ -41,4 +43,10 @@ export const resources = {
   ru: {
     common: Russian,
   },
+  it: {
+    common: Italian,
+  },
+  pt: {
+    common: Portuguese,
+  },
 };
diff --git a/frontend/src/pages/FineTuning/Steps/Introduction/index.jsx b/frontend/src/pages/FineTuning/Steps/Introduction/index.jsx
index 6c3efec005fc9c99a8f5cc1f8350d54632a3f19e..53e7f392c9b5ec3612cedad022a5849031b967c1 100644
--- a/frontend/src/pages/FineTuning/Steps/Introduction/index.jsx
+++ b/frontend/src/pages/FineTuning/Steps/Introduction/index.jsx
@@ -90,7 +90,7 @@ export default function Introduction({ setSettings, setStep }) {
             <p>
               In summary, if you are getting good results with RAG currently,
               creating a fine-tune can squeeze <b>even more performance</b> out
-              of a model. Fine-Tunes are are for improving response quality and
+              of a model. Fine-Tunes are for improving response quality and
               general responses, but they are <b>not for knowledge recall</b> -
               that is what RAG is for! Together, it is a powerful combination.
             </p>
diff --git a/server/models/systemSettings.js b/server/models/systemSettings.js
index afd1e9ed0cc415a5470077fc1b0c34eaa95f54e4..969beb8419f267eacbf8bb8f50750d1afc37e58b 100644
--- a/server/models/systemSettings.js
+++ b/server/models/systemSettings.js
@@ -418,6 +418,7 @@ const SystemSettings = {
       OllamaLLMModelPref: process.env.OLLAMA_MODEL_PREF,
       OllamaLLMTokenLimit: process.env.OLLAMA_MODEL_TOKEN_LIMIT,
       OllamaLLMKeepAliveSeconds: process.env.OLLAMA_KEEP_ALIVE_TIMEOUT ?? 300,
+      OllamaLLMPerformanceMode: process.env.OLLAMA_PERFORMANCE_MODE ?? "base",
 
       // TogetherAI Keys
       TogetherAiApiKey: !!process.env.TOGETHER_AI_API_KEY,
diff --git a/server/utils/AiProviders/gemini/index.js b/server/utils/AiProviders/gemini/index.js
index f2a948428cfcdb52b32e60b92a37a3b3556a3869..b78c8db6ef27e805b2eb6321a27a85eca17aa330 100644
--- a/server/utils/AiProviders/gemini/index.js
+++ b/server/utils/AiProviders/gemini/index.js
@@ -96,7 +96,9 @@ class GeminiLLM {
       case "gemini-1.5-flash-latest":
         return 1_048_576;
       case "gemini-1.5-pro-latest":
-        return 1_048_576;
+        return 2_097_152;
+      case "gemini-1.5-pro-exp-0801":
+        return 2_097_152;
       default:
         return 30_720; // assume a gemini-pro model
     }
@@ -108,6 +110,7 @@ class GeminiLLM {
       "gemini-1.0-pro",
       "gemini-1.5-pro-latest",
       "gemini-1.5-flash-latest",
+      "gemini-1.5-pro-exp-0801",
     ];
     return validModels.includes(modelName);
   }
diff --git a/server/utils/AiProviders/groq/index.js b/server/utils/AiProviders/groq/index.js
index 6b750c2addd2d946e9f6a18d1d62c86e457dd081..d76bddcc461a44b04a579b6ad39e93fbdc5dc7af 100644
--- a/server/utils/AiProviders/groq/index.js
+++ b/server/utils/AiProviders/groq/index.js
@@ -49,7 +49,7 @@ class GroqLLM {
         return 8192;
       case "llama-3.1-70b-versatile":
       case "llama-3.1-8b-instant":
-        return 131072;
+        return 8000;
       case "mixtral-8x7b-32768":
         return 32768;
       default:
diff --git a/server/utils/AiProviders/ollama/index.js b/server/utils/AiProviders/ollama/index.js
index a4e99f7883ab79e3d2705ef2b214cc85fc19bb24..02e780777879175ed0b9f30fa1eb3221ac9ffd59 100644
--- a/server/utils/AiProviders/ollama/index.js
+++ b/server/utils/AiProviders/ollama/index.js
@@ -13,6 +13,7 @@ class OllamaAILLM {
 
     this.basePath = process.env.OLLAMA_BASE_PATH;
     this.model = modelPreference || process.env.OLLAMA_MODEL_PREF;
+    this.performanceMode = process.env.OLLAMA_PERFORMANCE_MODE || "base";
     this.keepAlive = process.env.OLLAMA_KEEP_ALIVE_TIMEOUT
       ? Number(process.env.OLLAMA_KEEP_ALIVE_TIMEOUT)
       : 300; // Default 5-minute timeout for Ollama model loading.
@@ -33,6 +34,10 @@ class OllamaAILLM {
       model: this.model,
       keepAlive: this.keepAlive,
       useMLock: true,
+      // There are currently only two performance settings so if its not "base" - its max context.
+      ...(this.performanceMode === "base"
+        ? {}
+        : { numCtx: this.promptWindowLimit() }),
       temperature,
     });
   }
diff --git a/server/utils/AiProviders/openRouter/index.js b/server/utils/AiProviders/openRouter/index.js
index d9b971b6f63f03a302bced8fff682ae073bc535a..00a176e1ba6ef392fe469b37adffa269587e6bed 100644
--- a/server/utils/AiProviders/openRouter/index.js
+++ b/server/utils/AiProviders/openRouter/index.js
@@ -254,35 +254,48 @@ class OpenRouterLLM {
         }
       }, 500);
 
-      for await (const chunk of stream) {
-        const message = chunk?.choices?.[0];
-        const token = message?.delta?.content;
-        lastChunkTime = Number(new Date());
-
-        if (token) {
-          fullText += token;
-          writeResponseChunk(response, {
-            uuid,
-            sources: [],
-            type: "textResponseChunk",
-            textResponse: token,
-            close: false,
-            error: false,
-          });
-        }
-
-        if (message.finish_reason !== null) {
-          writeResponseChunk(response, {
-            uuid,
-            sources,
-            type: "textResponseChunk",
-            textResponse: "",
-            close: true,
-            error: false,
-          });
-          response.removeListener("close", handleAbort);
-          resolve(fullText);
+      try {
+        for await (const chunk of stream) {
+          const message = chunk?.choices?.[0];
+          const token = message?.delta?.content;
+          lastChunkTime = Number(new Date());
+
+          if (token) {
+            fullText += token;
+            writeResponseChunk(response, {
+              uuid,
+              sources: [],
+              type: "textResponseChunk",
+              textResponse: token,
+              close: false,
+              error: false,
+            });
+          }
+
+          if (message.finish_reason !== null) {
+            writeResponseChunk(response, {
+              uuid,
+              sources,
+              type: "textResponseChunk",
+              textResponse: "",
+              close: true,
+              error: false,
+            });
+            response.removeListener("close", handleAbort);
+            resolve(fullText);
+          }
         }
+      } catch (e) {
+        writeResponseChunk(response, {
+          uuid,
+          sources,
+          type: "abort",
+          textResponse: null,
+          close: true,
+          error: e.message,
+        });
+        response.removeListener("close", handleAbort);
+        resolve(fullText);
       }
     });
   }
diff --git a/server/utils/chats/index.js b/server/utils/chats/index.js
index 2068d35118c773f0674a329f96507d5ce9393eb2..dd0f6076faaeaa9c99dd6fe05afa04999d6ffe2f 100644
--- a/server/utils/chats/index.js
+++ b/server/utils/chats/index.js
@@ -14,17 +14,6 @@ async function grepCommand(message, user = null) {
   const userPresets = await SlashCommandPresets.getUserPresets(user?.id);
   const availableCommands = Object.keys(VALID_COMMANDS);
 
-  // Check if the message starts with any preset command
-  const foundPreset = userPresets.find((p) => message.startsWith(p.command));
-  if (!!foundPreset) {
-    // Replace the preset command with the corresponding prompt
-    const updatedMessage = message.replace(
-      foundPreset.command,
-      foundPreset.prompt
-    );
-    return updatedMessage;
-  }
-
   // Check if the message starts with any built-in command
   for (let i = 0; i < availableCommands.length; i++) {
     const cmd = availableCommands[i];
@@ -34,7 +23,15 @@ async function grepCommand(message, user = null) {
     }
   }
 
-  return message;
+  // Replace all preset commands with their corresponding prompts
+  // Allows multiple commands in one message
+  let updatedMessage = message;
+  for (const preset of userPresets) {
+    const regex = new RegExp(preset.command, "g");
+    updatedMessage = updatedMessage.replace(regex, preset.prompt);
+  }
+
+  return updatedMessage;
 }
 
 async function chatWithWorkspace(
diff --git a/server/utils/helpers/updateENV.js b/server/utils/helpers/updateENV.js
index f04c4c54841ca3c481a5dc99f7bf2dfc564a7c11..7da98f8510165a9ebf48dbf65c09cc313f2e4cf1 100644
--- a/server/utils/helpers/updateENV.js
+++ b/server/utils/helpers/updateENV.js
@@ -102,6 +102,10 @@ const KEY_MAPPING = {
     envKey: "OLLAMA_MODEL_TOKEN_LIMIT",
     checks: [nonZero],
   },
+  OllamaLLMPerformanceMode: {
+    envKey: "OLLAMA_PERFORMANCE_MODE",
+    checks: [],
+  },
   OllamaLLMKeepAliveSeconds: {
     envKey: "OLLAMA_KEEP_ALIVE_TIMEOUT",
     checks: [isInteger],
@@ -582,6 +586,7 @@ function validGeminiModel(input = "") {
     "gemini-1.0-pro",
     "gemini-1.5-pro-latest",
     "gemini-1.5-flash-latest",
+    "gemini-1.5-pro-exp-0801",
   ];
   return validModels.includes(input)
     ? null