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 → </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