From b49f963a6c3b888b38c2c03e60532ad66eefbc2a Mon Sep 17 00:00:00 2001
From: paychex-ssmithrand
<108530706+paychex-ssmithrand@users.noreply.github.com>
Date: Tue, 2 Jan 2024 11:25:18 -0500
Subject: [PATCH] Merge upstream (#9)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* documentation update: mongodb (#1347)
* update dotenv.md
add details about the MONGO_URI connection string format
* update mongodb.md
add details about the MONGO_URI connection string format
* chore: Get the latest of all github actions (#1335)
* refactor(api): Central Logging 📜 (#1348)
* WIP: initial logging changes
add several transports in ~/config/winston
omit messages in logs, truncate long strings
add short blurb in dotenv for debug logging
GoogleClient: using logger
OpenAIClient: using logger, handleOpenAIErrors
Adding typedef for payload message
bumped winston and using winston-daily-rotate-file
moved config for server paths to ~/config dir
Added `DEBUG_LOGGING=true` to .env.example
* WIP: Refactor logging statements in code
* WIP: Refactor logging statements and import configurations
* WIP: Refactor logging statements and import configurations
* refactor: broadcast Redis initialization message with `info` not `debug`
* refactor: complete Refactor logging statements and import configurations
* chore: delete unused tools
* fix: circular dependencies due to accessing logger
* refactor(handleText): handle booleans and write tests
* refactor: redact sensitive values, better formatting
* chore: improve log formatting, avoid passing strings to 2nd arg
* fix(ci): fix jest tests due to logger changes
* refactor(getAvailablePluginsController): cache plugins as they are static and avoids async addOpenAPISpecs call every time
* chore: update docs
* chore: update docs
* chore: create separate meiliSync logger, clean up logs to avoid being unnecessarily verbose
* chore: spread objects where they are commonly logged to allow string truncation
* chore: improve error log formatting
* fix: Add error handling for missing role in OpenAIClient.js (#1352)
* feat: Google Gemini ❇️ (#1355)
* refactor: add gemini-pro to google Models list; use defaultModels for central model listing
* refactor(SetKeyDialog): create useMultipleKeys hook to use for Azure, export `isJson` from utils, use EModelEndpoint
* refactor(useUserKey): change variable names to make keyName setting more clear
* refactor(FileUpload): allow passing container className string
* feat(GoogleClient): Gemini support
* refactor(GoogleClient): alternate stream speed for Gemini models
* feat(Gemini): styling/settings configuration for Gemini
* refactor(GoogleClient): substract max response tokens from max context tokens if context is above 32k (I/O max is combined between the two)
* refactor(tokens): correct google max token counts and subtract max response tokens when input/output count are combined towards max context count
* feat(google/initializeClient): handle both local and user_provided credentials and write tests
* fix(GoogleClient): catch if credentials are undefined, handle if serviceKey is string or object correctly, handle no examples passed, throw error if not a Generative Language model and no service account JSON key is provided, throw error if it is a Generative m
odel, but not google API key was provided
* refactor(loadAsyncEndpoints/google): activate Google endpoint if either the service key JSON file is provided in /api/data, or a GOOGLE_KEY is defined.
* docs: updated Google configuration
* fix(ci): Mock import of Service Account Key JSON file (auth.json)
* Update apis_and_tokens.md
* feat: increase max output tokens slider for gemini pro
* refactor(GoogleSettings): handle max and default maxOutputTokens on model change
* chore: add sensitive redact regex
* docs: add warning about data privacy
* Update apis_and_tokens.md
* fix: Avoid Throwing Errors for Unsupported Token Count Endpoints 🪙 (#1356)
* update: docker-compose.yaml 🐋 (#1341)
* fix: Enhance Test Coverage and Fix Compatibility Issues 👷♂️ (#1363)
* refactor: only remove conversation states from localStorage on login/logout but not on refresh
* chore: add debugging log for azure completion url
* chore: add api-key to redact regex
* fix: do not show endpoint selector if endpoint is falsy
* chore: remove logger from genAzureChatCompletion
* feat(ci): mock fetchEventSource
* refactor(ci): mock all model methods in BaseClient.test, as well as mock the implementation for getCompletion in FakeClient
* fix(OpenAIClient): consider chatCompletion if model name includes `gpt` as opposed to `gpt-`
* fix(ChatGPTClient/azureOpenAI): Remove 'model' option for Azure compatibility (cannot be sent in payload body)
* feat(ci): write new test suite that significantly increase test coverage for OpenAIClient and BaseClient by covering most of the real implementation of the `sendMessage` method
- test for the azure edge case where model option is appended to modelOptions, ensuring removal before sent to the azure endpoint
- test for expected azure url being passed to SSE POST request
- test for AZURE_OPENAI_DEFAULT_MODEL being set, but is not included in the URL deployment name as expected
- test getCompletion method to have correct payload
fix(ci/OpenAIClient.test.js): correctly mock hanging/async methods
* refactor(addTitle): allow azure to title as it aborts signal on completion
* 🔄 refactor: Consolidate Ask/Edit Controllers (#1365)
* refactor(Ask/Edit): consolidate ask/edit controllers between the main modules and openAI controllers to reduce repetition of code and increase reusability
* fix(winston/logger): circular dependency issue
* fix(config/scripts): fix script imports
* refactor(indexSync): make not configured message an info log message
* chore: create a rollup script for api/server/index.js to check circular dependencies
* chore: bump @keyv/redis
* Update package.json
* 🍏Update mac_install.md (#1373)
The manual installation guide for mac was very outdated. This brings it up to date with the current method
* 📸 feat: Gemini vision, Improved Logs and Multi-modal Handling (#1368)
* feat: add GOOGLE_MODELS env var
* feat: add gemini vision support
* refactor(GoogleClient): adjust clientOptions handling depending on model
* fix(logger): fix redact logic and redact errors only
* fix(GoogleClient): do not allow non-multiModal messages when gemini-pro-vision is selected
* refactor(OpenAIClient): use `isVisionModel` client property to avoid calling validateVisionModel multiple times
* refactor: better debug logging by correctly traversing, redacting sensitive info, and logging condensed versions of long values
* refactor(GoogleClient): allow response errors to be thrown/caught above client handling so user receives meaningful error message
debug orderedMessages, parentMessageId, and buildMessages result
* refactor(AskController): use model from client.modelOptions.model when saving intermediate messages, which requires for the progress callback to be initialized after the client is initialized
* feat(useSSE): revert to previous model if the model was auto-switched by backend due to message attachments
* docs: update with google updates, notes about Gemini Pro Vision
* fix: redis should not be initialized without USE_REDIS and increase max listeners to 20
* fix: revert `fonts` resolution path in vite.config.ts
* 🚩 fix: Initialize Conversation Only when Necessary Data is Fetched (#1379)
* fix(ChatRoute): only initialize conversation after all data is fetched (models, endpoints, initialConversationQuery if not `new`)
* chore: remove unnecessary packages for rolling up api
* chore: bump data-provider package.json
* ✨ feat: Azure Vision Support & Docs Update (#1389)
* feat(AzureOpenAI): Vision Support
* chore(ci/OpenAIClient.test): update test to reflect Azure now uses chatCompletion method as opposed to getCompletion, while still testing the latter method
* docs: update documentation mainly revolving around Azure setup, but also reformatting the 'Tokens and API' section completely
* docs: add images and links to ai_setup.md
* docs: ai setup reference
* ✨ Release v0.6.5 (#1391)
* ✨ Release v0.6.5
* fix(ci): use dynamic currentDateString
* Update pull_request_template.md (#1417)
* 🧹📚 docs: refactor and clean up (#1392)
* 📑 update mkdocs
* rename docker override file and add to gitignore
* update .env.example - GOOGLE_MODELS
* update index.md
* doc refactor: split installation and configuration in two sub-folders
* doc update: installation guides
* doc update: configuration guides
* doc: new docker override guide
* doc: new beginner's guide for contributions - Thanks @Berry-13
* doc: update documentation_guidelines.md
* doc: update testing.md
* doc: update deployment guides
* doc: update /dev readme
* doc: update general_info
* doc: add 0 value to doc weight
* doc: add index.md to every doc folders
* doc: add weight to index.md and move openrouter from free_ai_apis.md to ai_setup.md
* doc: update toc so they display properly on the right had side in mkdocs
* doc: update pandoranext.md
* doc: index logging_system.md
* doc: update readme.md
* doc: update litellm.md
* doc: update ./dev/readme.md
* doc:🔖 new presets.md
* doc: minor corrections
* doc update: user_auth_system.md and presets.md, doc feat: add mermaid support to mkdocs
* doc update: add screenshots to presets.md
* doc update: add screenshots to - OpenID with AWS Cognito
* doc update: BingAI cookie instruction
* doc update: discord auth
* doc update: facebook auth
* doc: corrections to user_auth_system.md
* doc update: github auth
* doc update: google auth
* doc update: auth clean up
* doc organization: installation
* doc organization: configuration
* doc organization: features+plugins & update:plugins screenshots
* doc organization: deploymend + general_info & update: tech_stack.md
* doc organization: contributions
* doc: minor fixes
* doc: minor fixes
* Update French Translation (#1444)
* 🪪mkdocs: social cards (#1428)
* mkdocs plugins: add plugin for social cards and plugin that allow to exclude a folder
* docs: fix hyperlinks
* mkdocs: social cards (descriptions) for 'contributions' and 'deployment' guides
* mkdocs: social cards (descriptions) for all 'index.md'
* mkdocs: social cards (descriptions) for 'features' and 'plugins'
* mkdocs: social cards (descriptions) for 'general_info'
* mkdocs: social cards (descriptions) for 'configuration'
* mkdocs: social cards (descriptions) for 'installation'
* mkdocs: minor fixes
* update librechat.svg
* update how_to_contribute.md
add reference to the official GitHub documentation
* 🌎: Italian translation update & refactor: translations (#1414)
* italian translation update
* fix: removed some translations
* refactor(Translation)
* feat: allow FWA (#1440)
* 🌎: Update Russian translations (#1413)
* Update Russian localization
* Update Ru.tsx
* fix: russian translation typing errors
* 🐛 fix: Prevent Unnecessary Cloning of Symbols in Log Object (#1455)
fix(api/config/parsers): prevent cloning of unnecessary symbols within log object by using `klona` instead of `klona/full`, handle symbols edge case, log parsing errors, and use spaces instead of tab for cleaner logs
* 🚫🔍 feat: disallow search indexing (#1409)
* feat: disallow search indexing
* Update index.js
* Update .env.example
* added middleware
* 🔥🚀 feat: CDN (Firebase) & feat: account section (#1438)
* localization + api-endpoint
* docs: added firebase documentation
* chore: icons
* chore: SettingsTabs
* feat: account pannel; fix: gear icons
* docs: position update
* feat: firebase
* feat: plugin support
* route
* fixed bugs with firebase and moved a lot of files
* chore(DALLE3): using UUID v4
* feat: support for social strategies; moved '/images' path
* fix: data ignored
* gitignore update
* docs: update firebase guide
* refactor: Firebase
- use singleton pattern for firebase initialization, initially on server start
- reorganize imports, move firebase specific files to own service under Files
- rename modules to remove 'avatar' redundancy
- fix imports based on changes
* ci(DALLE/DALLE3): fix tests to use logger and new expected outputs, add firebase tests
* refactor(loadToolWithAuth): pass userId to tool as field
* feat(images/parse): feat: Add URL Image Basename Extraction
Implement a new module to extract the basename of an image from a given URL. This addition includes the function, which parses the URL and retrieves the basename using the Node.js 'url' and 'path' modules. The function is documented with JSDoc comments for better maintainability and understanding. This feature enhances the application's ability to handle and process image URLs efficiently.
* refactor(addImages): function to use a more specific regular expression for observedImagePath based on the generated image markdown standard across the app
* refactor(DALLE/DALLE3): utilize `getImageBasename` and `this.userId`; fix: pass correct image path to firebase url helper
* fix(addImages): make more general to match any image markdown descriptor
* fix(parse/getImageBasename): test result of this function for an actual image basename
* ci(DALLE3): mock getImageBasename
* refactor(AuthContext): use Recoil atom state for user
* feat: useUploadAvatarMutation, react-query hook for avatar upload
* fix(Toast): stack z-order of Toast over all components (1000)
* refactor(showToast): add optional status field to avoid importing NotificationSeverity on each use of the function
* refactor(routes/avatar): remove unnecessary get route, get userId from req.user.id, require auth on POST request
* chore(uploadAvatar): TODO: remove direct use of Model, `User`
* fix(client): fix Spinner imports
* refactor(Avatar): use react-query hook, Toast, remove unnecessary states, add optimistic UI to upload
* fix(avatar/localStrategy): correctly save local profile picture and cache bust for immediate rendering; fix: firebase init info message (only show once)
* fix: use `includes` instead of `endsWith` for checking manual query of avatar image path in case more queries are appended (as is done in avatar/localStrategy)
---------
Co-authored-by: Danny Avila
* 🧹fix: Handle Abort Message Edge Cases (#1462)
* chore: bump langchain to v0.0.213 from v0.0.186
* fix: handle abort edge cases:
- abort message server-side if response experienced error mid-generation
- attempt to recover message if aborting resulted in error
- if abortKey is not provided, use conversationId if it exists
- if headers were already sent, send an Event stream message
- issue warning for possible Google censor/filter
refactor(streamResponse): for `sendError`, allow passing overrides so that error can include partial generation, improve typing for `sendMessage`
* chore(MessageContent): remove eslint warning for unused `i`, rephrase unfinished message text
* fix(useSSE): avoid invoking cancelHandler if the abort response was 404
* chore(TMessage): remove unnecessary, unused legacy message property `submitting`
* chore(TMessage): remove unnecessary legacy message property `cancelled`
* chore(abortMiddleware): remove unused `errorText` property to avoid confusion
* doc update: firebase.md (#1456)
* 📃 feat: add `list-balances`, `remove-user`, and improve User scripts (#1418)
* Refactoring opening of DB to config/helpers.js
* Adding two user scripts:
- 'delete-user' to remove a user definitely
- 'list-balances' to show the balances of all the users
* Add Russian translation for the new functionality in the settings (#1457)
* 🛠️ fix: Minor Fixes in `Message`, `Ask/EditController`, `OpenAIClient`, and `countTokens` (#1463)
* fix(Message): avoid overwriting unprovided properties
* fix(OpenAIClient): return intermediateReply on user abort
* fix(AskController): do not send/save final message if abort was triggered
* fix(countTokens): avoid fetching remote registry and exclusively use cl100k_base or p50k_base weights for token counting
* refactor(Message/messageSchema): rely on messageSchema for default values when saving messages
* fix(EditController): do not send/save final message if abort was triggered
* fix(config/helpers): fix module resolution error
* update pull_request_template.md (#1466)
add "Translation update" the the PR type choices
* 🌎: Update French Translation (#1472)
* 🌎: Update French Translation
* 🌎: Update French Translation
* 🌎: Update French Translation
* 🌎: Update French Translation
* 🌎: Update Portuguese Translation (#1461)
* 👮feat: moderation text (#1388)
* fixed some bugs and handling errors better
* feat: plugins support
* fix: prettier error message
* moved circular-json-es6 in /api
* docs: added openai moderation text
* fix(gptPlugins): incorrect merge
* discarding changes
* removed circular-json-es6
* fix(OpenAIClient): do not invoke abortCompletion on completion error (#1473)
* Update dev-images.yml
* Update backend-review.yml
---------
Co-authored-by: Fuegovic <32828263+fuegovic@users.noreply.github.com>
Co-authored-by: Ed Burnette
Co-authored-by: Danny Avila <110412045+danny-avila@users.noreply.github.com>
Co-authored-by: Marco Beretta <81851188+Berry-13@users.noreply.github.com>
Co-authored-by: Nikita Dybov
Co-authored-by: Danny Avila
Co-authored-by: Linus Gasser
Co-authored-by: MACHINSOFT <110278369+machinsoft@users.noreply.github.com>
Co-authored-by: Raí Santos <140329135+itzraiss@users.noreply.github.com>
---
.env.example | 25 +
.github/playwright.yml | 4 +-
.github/pull_request_template.md | 5 +-
.github/workflows/backend-review.yml | 40 +
.github/workflows/container.yml | 52 +
.github/workflows/data-provider.yml | 34 +
.github/workflows/deploy.yml | 38 +
.github/workflows/dev-images.yml | 45 +
.github/workflows/frontend-review.yml | 38 +
.github/workflows/latest-images-main.yml | 40 +
.github/workflows/mkdocs.yaml | 27 +
.gitignore | 8 +-
README.md | 104 +-
api/app/bingai.js | 5 +-
api/app/clients/AnthropicClient.js | 38 +-
api/app/clients/BaseClient.js | 91 +-
api/app/clients/ChatGPTClient.js | 6 +
api/app/clients/GoogleClient.js | 196 +-
api/app/clients/OpenAIClient.js | 124 +-
api/app/clients/PluginsClient.js | 74 +-
api/app/clients/TextStream.js | 5 +-
.../agents/CustomAgent/outputParser.js | 50 +-
.../agents/Functions/FunctionsAgent.js | 4 +-
.../clients/callbacks/createStartHandler.js | 27 +-
api/app/clients/chains/runTitleChain.js | 4 +-
api/app/clients/llm/RunManager.js | 25 +-
api/app/clients/memory/summaryBuffer.js | 12 +-
api/app/clients/output_parsers/addImages.js | 10 +-
.../clients/prompts/formatMessages.spec.js | 1 -
api/app/clients/specs/BaseClient.test.js | 40 +-
api/app/clients/specs/FakeClient.js | 14 +-
api/app/clients/specs/OpenAIClient.test.js | 239 +-
api/app/clients/tools/AIPluginTool.js | 238 -
api/app/clients/tools/AzureAiSearch.js | 5 +-
api/app/clients/tools/DALL-E.js | 71 +-
api/app/clients/tools/GoogleSearch.js | 7 +-
api/app/clients/tools/HttpRequestTool.js | 108 -
api/app/clients/tools/StableDiffusion.js | 5 +-
api/app/clients/tools/Wolfram.js | 8 +-
.../clients/tools/dynamic/OpenAPIPlugin.js | 34 +-
api/app/clients/tools/index.js | 4 -
api/app/clients/tools/saveImageFromUrl.js | 5 +-
.../clients/tools/structured/AzureAISearch.js | 5 +-
.../clients/tools/structured/CodeSherpa.js | 4 +-
.../tools/structured/CodeSherpaTools.js | 4 +-
api/app/clients/tools/structured/DALLE3.js | 58 +-
api/app/clients/tools/structured/E2BTools.js | 23 +-
.../tools/structured/StableDiffusion.js | 5 +-
api/app/clients/tools/structured/Wolfram.js | 10 +-
.../tools/structured/specs/DALLE3.spec.js | 83 +-
.../clients/tools/util/handleOpenAIErrors.js | 9 +-
api/app/clients/tools/util/handleTools.js | 29 +-
api/app/clients/tools/util/loadSpecs.js | 37 +-
api/app/titleConvoBing.js | 8 +-
api/cache/banViolation.js | 8 +-
api/cache/keyvMongo.js | 4 +-
api/cache/keyvRedis.js | 13 +-
api/common/enums.js | 2 +
api/config.js | 6 -
api/config/index.js | 5 +
api/config/meiliLogger.js | 78 +
api/config/parsers.js | 182 +
api/config/paths.js | 6 +
api/config/winston.js | 127 +
api/jest.config.js | 8 +-
api/lib/db/indexSync.js | 34 +-
api/models/Balance.js | 29 +-
api/models/Config.js | 6 +-
api/models/Conversation.js | 14 +-
api/models/File.js | 6 +-
api/models/Message.js | 27 +-
api/models/Preset.js | 7 +-
api/models/Prompt.js | 7 +-
api/models/Session.js | 16 +-
api/models/Transaction.js | 2 +-
api/models/checkBalance.js | 1 -
api/models/plugins/mongoMeili.js | 42 +-
api/models/schema/messageSchema.js | 7 +-
api/models/spendTokens.js | 7 +-
api/package.json | 13 +-
api/server/controllers/AskController.js | 131 +-
api/server/controllers/AuthController.js | 16 +-
api/server/controllers/EditController.js | 78 +-
api/server/controllers/ErrorController.js | 8 +-
api/server/controllers/PluginController.js | 14 +-
api/server/controllers/UserController.js | 13 +-
.../controllers/auth/LoginController.js | 7 +-
.../controllers/auth/LogoutController.js | 5 +-
api/server/index.js | 27 +-
api/server/middleware/abortMiddleware.js | 47 +-
api/server/middleware/index.js | 4 +
api/server/middleware/moderateText.js | 39 +
api/server/middleware/noIndex.js | 11 +
api/server/routes/ask/addToCache.js | 3 +-
api/server/routes/ask/askChatGPTBrowser.js | 21 +-
api/server/routes/ask/bingAI.js | 24 +-
api/server/routes/ask/gptPlugins.js | 11 +-
api/server/routes/ask/openAI.js | 150 +-
api/server/routes/assistants/assistants.js | 4 +-
api/server/routes/assistants/chat.js | 5 +-
api/server/routes/config.js | 6 +-
api/server/routes/convos.js | 13 +-
api/server/routes/edit/gptPlugins.js | 23 +-
api/server/routes/edit/openAI.js | 134 +-
api/server/routes/files/avatar.js | 34 +
api/server/routes/files/files.js | 5 +-
api/server/routes/files/images.js | 7 +-
api/server/routes/files/index.js | 1 +
api/server/routes/oauth.js | 8 +-
api/server/routes/presets.js | 14 +-
api/server/routes/search.js | 31 +-
api/server/routes/tokenizer.js | 7 +-
api/server/services/AuthService.js | 20 +-
.../services/Config/loadAsyncEndpoints.js | 6 +-
.../services/Config/loadDefaultModels.js | 27 +-
.../Endpoints/google/initializeClient.js | 22 +-
.../Endpoints/google/initializeClient.spec.js | 84 +
.../services/Endpoints/openAI/addTitle.js | 4 +-
api/server/services/Files/Firebase/images.js | 45 +
api/server/services/Files/Firebase/index.js | 7 +
.../services/Files/Firebase/initialize.js | 42 +
.../Files/images/avatar/firebaseStrategy.js | 29 +
.../Files/images/avatar/localStrategy.js | 32 +
.../Files/images/avatar/uploadAvatar.js | 63 +
api/server/services/Files/images/encode.js | 31 +-
api/server/services/Files/images/index.js | 4 +
api/server/services/Files/images/parse.js | 27 +
api/server/services/Files/save.js | 3 +-
api/server/services/ModelService.js | 44 +-
api/server/services/PluginService.js | 13 +-
api/server/services/Runs/RunMananger.js | 10 +-
api/server/services/UserService.js | 7 +-
api/server/utils/countTokens.js | 10 +-
api/server/utils/crypto.js | 2 +
api/server/utils/handleText.js | 20 +-
api/server/utils/handleText.spec.js | 51 +
api/server/utils/math.js | 3 +-
api/server/utils/sendEmail.js | 11 +-
api/server/utils/streamResponse.js | 30 +-
api/strategies/discordStrategy.js | 68 +-
api/strategies/facebookStrategy.js | 62 +-
api/strategies/githubStrategy.js | 58 +-
api/strategies/googleStrategy.js | 58 +-
api/strategies/joseStrategy.js | 16 +-
api/strategies/jwtStrategy.js | 7 +-
api/strategies/openidStrategy.js | 18 +-
api/test/__mocks__/auth.mock.json | 13 +
api/test/__mocks__/fetchEventSource.js | 27 +
api/test/__mocks__/logger.js | 10 +
api/typedefs.js | 26 +
api/utils/azureUtils.js | 10 +-
api/utils/findMessageContent.js | 4 +-
api/utils/tokens.js | 11 +-
api/utils/tokens.spec.js | 3 +
client/index.html | 1 +
client/package.json | 2 +-
client/src/App.jsx | 2 +-
client/src/common/types.ts | 1 +
client/src/components/Chat/ChatView.tsx | 2 +-
client/src/components/Chat/Footer.tsx | 2 +-
.../components/Chat/Input/HeaderOptions.tsx | 2 +-
.../components/Chat/Input/PopoverButtons.tsx | 28 +-
.../components/Chat/Menus/EndpointsMenu.tsx | 9 +-
.../Chat/Messages/Content/MessageContent.tsx | 4 +-
client/src/components/Endpoints/Icon.tsx | 11 +-
.../components/Endpoints/Settings/Google.tsx | 44 +-
.../Settings/MultiView/GoogleSettings.tsx | 9 +-
.../Input/EndpointMenu/FileUpload.tsx | 3 +
client/src/components/Input/Footer.tsx | 2 +-
.../Input/SetKeyDialog/GoogleConfig.tsx | 54 +-
.../Input/SetKeyDialog/HelpText.tsx | 61 +-
.../Input/SetKeyDialog/InputWithLabel.tsx | 16 +-
.../Input/SetKeyDialog/OpenAIConfig.tsx | 46 +-
.../src/components/Messages/Content/Error.tsx | 13 +-
.../Nav/ExportConversation/ExportModal.jsx | 10 -
client/src/components/Nav/Nav.tsx | 2 +-
client/src/components/Nav/NavLinks.tsx | 2 +-
client/src/components/Nav/Settings.tsx | 21 +-
.../Nav/SettingsTabs/Account/Account.tsx | 18 +
.../Nav/SettingsTabs/Account/Avatar.tsx | 145 +
.../Nav/SettingsTabs/{ => Data}/Data.tsx | 2 +-
.../{ => General}/AutoScrollSwitch.spec.tsx | 0
.../{ => General}/AutoScrollSwitch.tsx | 0
.../{ => General}/ClearChatsButton.spec.tsx | 0
.../SettingsTabs/{ => General}/General.tsx | 2 +-
.../{ => General}/LangSelector.spec.tsx | 0
.../{ => General}/ThemeSelector.spec.tsx | 0
.../src/components/Nav/SettingsTabs/index.ts | 9 +-
client/src/components/svg/GearIcon.tsx | 16 +-
client/src/components/svg/GeminiIcon.tsx | 36 +
client/src/components/svg/UserIcon.tsx | 15 +-
client/src/components/svg/index.ts | 2 +
client/src/data-provider/mutations.ts | 17 +
client/src/hooks/AuthContext.tsx | 10 +-
client/src/hooks/Input/index.ts | 1 +
client/src/hooks/Input/useMultipleKeys.ts | 24 +
client/src/hooks/Input/useUserKey.ts | 19 +-
client/src/hooks/useChatHelpers.ts | 1 -
client/src/hooks/useSSE.ts | 20 +-
client/src/hooks/useToast.ts | 8 +-
client/src/localization/Translation.tsx | 3 +-
client/src/localization/languages/Ar.tsx | 1 -
client/src/localization/languages/Br.tsx | 164 +-
client/src/localization/languages/De.tsx | 1 -
client/src/localization/languages/Eng.tsx | 15 +-
client/src/localization/languages/Fr.tsx | 58 +-
client/src/localization/languages/It.tsx | 233 +-
client/src/localization/languages/Ru.tsx | 215 +-
client/src/localization/languages/Zh.tsx | 1 -
client/src/mobile.css | 9 +
client/src/routes/ChatRoute.tsx | 23 +-
client/src/store/models.ts | 15 +-
client/src/store/user.ts | 6 +-
client/src/utils/json.ts | 9 +
client/vite.config.ts | 2 +-
config/add-balance.js | 35 +-
config/ban-user.js | 35 +-
config/create-user.js | 35 +-
config/delete-user.js | 48 +
config/helpers.js | 30 +
config/list-balances.js | 39 +
config/loader.js | 4 +-
config/packages.js | 4 +-
config/stop-backend.js | 4 +-
config/update.js | 2 +-
config/upgrade.js | 2 +-
docker-compose.override.yml.example | 67 +
docker-compose.yml | 36 +-
docs/assets/LibreChat.svg | 48 +-
docs/contributions/coding_conventions.md | 7 +-
.../contributions/documentation_guidelines.md | 30 +-
docs/contributions/how_to_contribute.md | 69 +
docs/contributions/index.md | 15 +
docs/contributions/testing.md | 57 +-
.../contributions/translation_contribution.md | 5 +
docs/deployment/azure-terraform.md | 5 +
docs/deployment/cloudflare.md | 13 +-
docs/deployment/digitalocean.md | 15 +-
docs/deployment/heroku.md | 15 +-
docs/deployment/hetzner_ubuntu.md | 31 +-
docs/deployment/huggingface.md | 28 +-
docs/deployment/index.md | 18 +
docs/deployment/linode.md | 9 +-
docs/deployment/meilisearch_in_render.md | 7 +-
docs/deployment/ngrok.md | 30 +-
docs/deployment/render.md | 7 +-
docs/dev/README.md | 29 +-
docs/features/bing_jailbreak.md | 10 +-
docs/features/firebase.md | 103 +
docs/features/index.md | 33 +
docs/features/logging_system.md | 43 +
docs/features/manage_your_database.md | 6 +
docs/features/mod_system.md | 34 +-
docs/features/pandoranext.md | 277 +-
docs/features/plugins/azure_ai_search.md | 11 +-
.../plugins/chatgpt_plugins_openapi.md | 55 +-
docs/features/plugins/google_search.md | 10 +-
docs/features/plugins/index.md | 14 +
docs/features/plugins/introduction.md | 28 +-
docs/features/plugins/make_your_own.md | 13 +-
docs/features/plugins/stable_diffusion.md | 14 +-
docs/features/plugins/wolfram.md | 31 +-
docs/features/presets.md | 92 +
docs/features/proxy.md | 32 -
docs/features/third_party.md | 6 +
docs/features/token_usage.md | 13 +
docs/general_info/breaking_changes.md | 11 +-
docs/general_info/index.md | 13 +
docs/general_info/multilingual_information.md | 5 +
docs/general_info/project_origin.md | 5 +
docs/general_info/tech_stack.md | 36 +-
docs/index.md | 25 +-
docs/install/apis_and_tokens.md | 162 -
docs/install/configuration/ai_setup.md | 401 ++
.../{ => configuration}/default_language.md | 8 +-
docs/install/configuration/docker_override.md | 77 +
docs/install/{ => configuration}/dotenv.md | 171 +-
.../{ => configuration}/free_ai_apis.md | 36 +-
docs/install/configuration/index.md | 19 +
docs/install/{ => configuration}/litellm.md | 10 +-
docs/install/{ => configuration}/misc.md | 9 +-
docs/install/{ => configuration}/mongodb.md | 12 +-
.../install/configuration/user_auth_system.md | 578 ++
docs/install/index.md | 27 +
.../{ => installation}/container_install.md | 14 +-
.../docker_compose_install.md | 81 +-
docs/install/installation/index.md | 12 +
.../{ => installation}/linux_install.md | 52 +-
docs/install/installation/mac_install.md | 143 +
.../{ => installation}/windows_install.md | 66 +-
docs/install/mac_install.md | 164 -
docs/install/user_auth_system.md | 262 -
docs/stylesheets/extra.css | 6 -
index.html | 1 +
mkdocs.yml | 116 +-
package-lock.json | 5646 ++++++++++-------
package.json | 7 +-
packages/data-provider/.gitignore | 3 +-
packages/data-provider/package.json | 5 +-
.../data-provider/server-rollup.config.js | 40 +
packages/data-provider/src/api-endpoints.ts | 2 +
packages/data-provider/src/data-service.ts | 4 +
packages/data-provider/src/keys.ts | 1 +
.../src/react-query/react-query-service.ts | 10 +-
packages/data-provider/src/schemas.ts | 113 +-
packages/data-provider/src/types/files.ts | 10 +
306 files changed, 10481 insertions(+), 5714 deletions(-)
create mode 100644 .github/workflows/backend-review.yml
create mode 100644 .github/workflows/container.yml
create mode 100644 .github/workflows/data-provider.yml
create mode 100644 .github/workflows/deploy.yml
create mode 100644 .github/workflows/dev-images.yml
create mode 100644 .github/workflows/frontend-review.yml
create mode 100644 .github/workflows/latest-images-main.yml
create mode 100644 .github/workflows/mkdocs.yaml
delete mode 100644 api/app/clients/tools/AIPluginTool.js
delete mode 100644 api/app/clients/tools/HttpRequestTool.js
delete mode 100644 api/config.js
create mode 100644 api/config/index.js
create mode 100644 api/config/meiliLogger.js
create mode 100644 api/config/parsers.js
create mode 100644 api/config/paths.js
create mode 100644 api/config/winston.js
create mode 100644 api/server/middleware/moderateText.js
create mode 100644 api/server/middleware/noIndex.js
create mode 100644 api/server/routes/files/avatar.js
create mode 100644 api/server/services/Endpoints/google/initializeClient.spec.js
create mode 100644 api/server/services/Files/Firebase/images.js
create mode 100644 api/server/services/Files/Firebase/index.js
create mode 100644 api/server/services/Files/Firebase/initialize.js
create mode 100644 api/server/services/Files/images/avatar/firebaseStrategy.js
create mode 100644 api/server/services/Files/images/avatar/localStrategy.js
create mode 100644 api/server/services/Files/images/avatar/uploadAvatar.js
create mode 100644 api/server/services/Files/images/parse.js
create mode 100644 api/server/utils/handleText.spec.js
create mode 100644 api/test/__mocks__/auth.mock.json
create mode 100644 api/test/__mocks__/fetchEventSource.js
create mode 100644 api/test/__mocks__/logger.js
create mode 100644 client/src/components/Nav/SettingsTabs/Account/Account.tsx
create mode 100644 client/src/components/Nav/SettingsTabs/Account/Avatar.tsx
rename client/src/components/Nav/SettingsTabs/{ => Data}/Data.tsx (98%)
rename client/src/components/Nav/SettingsTabs/{ => General}/AutoScrollSwitch.spec.tsx (100%)
rename client/src/components/Nav/SettingsTabs/{ => General}/AutoScrollSwitch.tsx (100%)
rename client/src/components/Nav/SettingsTabs/{ => General}/ClearChatsButton.spec.tsx (100%)
rename client/src/components/Nav/SettingsTabs/{ => General}/General.tsx (99%)
rename client/src/components/Nav/SettingsTabs/{ => General}/LangSelector.spec.tsx (100%)
rename client/src/components/Nav/SettingsTabs/{ => General}/ThemeSelector.spec.tsx (100%)
create mode 100644 client/src/components/svg/GeminiIcon.tsx
create mode 100644 client/src/hooks/Input/useMultipleKeys.ts
create mode 100644 config/delete-user.js
create mode 100644 config/list-balances.js
create mode 100644 docker-compose.override.yml.example
create mode 100644 docs/contributions/how_to_contribute.md
create mode 100644 docs/contributions/index.md
create mode 100644 docs/deployment/index.md
create mode 100644 docs/features/firebase.md
create mode 100644 docs/features/index.md
create mode 100644 docs/features/logging_system.md
create mode 100644 docs/features/plugins/index.md
create mode 100644 docs/features/presets.md
delete mode 100644 docs/features/proxy.md
create mode 100644 docs/general_info/index.md
delete mode 100644 docs/install/apis_and_tokens.md
create mode 100644 docs/install/configuration/ai_setup.md
rename docs/install/{ => configuration}/default_language.md (80%)
create mode 100644 docs/install/configuration/docker_override.md
rename docs/install/{ => configuration}/dotenv.md (69%)
rename docs/install/{ => configuration}/free_ai_apis.md (56%)
create mode 100644 docs/install/configuration/index.md
rename docs/install/{ => configuration}/litellm.md (92%)
rename docs/install/{ => configuration}/misc.md (92%)
rename docs/install/{ => configuration}/mongodb.md (75%)
create mode 100644 docs/install/configuration/user_auth_system.md
create mode 100644 docs/install/index.md
rename docs/install/{ => installation}/container_install.md (91%)
rename docs/install/{ => installation}/docker_compose_install.md (56%)
create mode 100644 docs/install/installation/index.md
rename docs/install/{ => installation}/linux_install.md (82%)
create mode 100644 docs/install/installation/mac_install.md
rename docs/install/{ => installation}/windows_install.md (73%)
delete mode 100644 docs/install/mac_install.md
delete mode 100644 docs/install/user_auth_system.md
delete mode 100644 docs/stylesheets/extra.css
create mode 100644 packages/data-provider/server-rollup.config.js
diff --git a/.env.example b/.env.example
index 2c97892d616..22b7743e0d0 100644
--- a/.env.example
+++ b/.env.example
@@ -24,6 +24,15 @@ MONGO_URI=mongodb://127.0.0.1:27017/LibreChat
DOMAIN_CLIENT=http://localhost:3080
DOMAIN_SERVER=http://localhost:3080
+NO_INDEX=true
+
+#===============#
+# Debug Logging #
+#===============#
+
+DEBUG_LOGGING=true
+DEBUG_CONSOLE=false
+
#=============#
# Permissions #
#=============#
@@ -84,6 +93,7 @@ CHATGPT_MODELS=text-davinci-002-render-sha
#============#
GOOGLE_KEY=user_provided
+# GOOGLE_MODELS=gemini-pro,gemini-pro-vision,chat-bison,chat-bison-32k,codechat-bison,codechat-bison-32k,text-bison,text-bison-32k,text-unicorn,code-gecko,code-bison,code-bison-32k
# GOOGLE_REVERSE_PROXY=
#============#
@@ -178,6 +188,10 @@ MEILI_MASTER_KEY=DrhYf7zENyR6AlUCKmnz0eYASOQdl6zxH7s7MKFSfFCt
# Moderation #
#========================#
+OPENAI_MODERATION=false
+OPENAI_MODERATION_API_KEY=
+# OPENAI_MODERATION_REVERSE_PROXY=not working with some reverse proxys
+
BAN_VIOLATIONS=true
BAN_DURATION=1000 * 60 * 60 * 2
BAN_INTERVAL=20
@@ -271,6 +285,17 @@ EMAIL_PASSWORD=
EMAIL_FROM_NAME=
EMAIL_FROM=noreply@librechat.ai
+#========================#
+# Firebase CDN #
+#========================#
+
+FIREBASE_API_KEY=
+FIREBASE_AUTH_DOMAIN=
+FIREBASE_PROJECT_ID=
+FIREBASE_STORAGE_BUCKET=
+FIREBASE_MESSAGING_SENDER_ID=
+FIREBASE_APP_ID=
+
#==================================================#
# Others #
#==================================================#
diff --git a/.github/playwright.yml b/.github/playwright.yml
index 87f35fe101c..28eca14d581 100644
--- a/.github/playwright.yml
+++ b/.github/playwright.yml
@@ -36,8 +36,8 @@
# PLAYWRIGHT_BROWSERS_PATH: 0 # Places binaries to node_modules/@playwright/test
# TITLE_CONVO: false
# steps:
-# - uses: actions/checkout@v3
-# - uses: actions/setup-node@v3
+# - uses: actions/checkout@v4
+# - uses: actions/setup-node@v4
# with:
# node-version: 18
# cache: 'npm'
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 94ac8790298..06d2656bd64 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,7 +1,7 @@
# Pull Request Template
-### ⚠️ Before Submitting a PR, read the [Contributing Docs](./CONTRIBUTING.md) in full!
+### ⚠️ Before Submitting a PR, read the [Contributing Docs](https://github.com/danny-avila/LibreChat/blob/main/.github/CONTRIBUTING.md) in full!
## Summary
@@ -15,7 +15,8 @@ Please delete any irrelevant options.
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update
-- [ ] Documentation update
+- [ ] Documentation update
+- [ ] Translation update
## Testing
diff --git a/.github/workflows/backend-review.yml b/.github/workflows/backend-review.yml
new file mode 100644
index 00000000000..fddb6cdac63
--- /dev/null
+++ b/.github/workflows/backend-review.yml
@@ -0,0 +1,40 @@
+name: Backend Unit Tests
+on:
+ workflow_dispatch:
+
+jobs:
+ tests_Backend:
+ name: Run Backend unit tests
+ timeout-minutes: 60
+ runs-on: ubuntu-latest
+ env:
+ MONGO_URI: ${{ secrets.MONGO_URI }}
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ JWT_SECRET: ${{ secrets.JWT_SECRET }}
+ CREDS_KEY: ${{ secrets.CREDS_KEY }}
+ CREDS_IV: ${{ secrets.CREDS_IV }}
+ BAN_VIOLATIONS: ${{ secrets.BAN_VIOLATIONS }}
+ BAN_DURATION: ${{ secrets.BAN_DURATION }}
+ BAN_INTERVAL: ${{ secrets.BAN_INTERVAL }}
+ NODE_ENV: CI
+ steps:
+ - uses: actions/checkout@v4
+ - name: Use Node.js 20.x
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Install Data Provider
+ run: npm run build:data-provider
+
+ - name: Run unit tests
+ run: cd api && npm run test:ci
+
+ - name: Run linters
+ uses: wearerequired/lint-action@v2
+ with:
+ eslint: true
diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml
new file mode 100644
index 00000000000..949d39cfe04
--- /dev/null
+++ b/.github/workflows/container.yml
@@ -0,0 +1,52 @@
+name: Docker Compose Build on Tag
+
+# The workflow is triggered when a tag is pushed
+on:
+ push:
+ tags:
+ - "*"
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ # Check out the repository
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ # Set up Docker
+ - name: Set up Docker
+ uses: docker/setup-buildx-action@v3
+
+ # Log in to GitHub Container Registry
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ # Run docker-compose build
+ - name: Build Docker images
+ run: |
+ cp .env.example .env
+ docker-compose build
+ docker build -f Dockerfile.multi --target api-build -t librechat-api .
+
+ # Get Tag Name
+ - name: Get Tag Name
+ id: tag_name
+ run: echo "TAG_NAME=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
+
+ # Tag it properly before push to github
+ - name: tag image and push
+ run: |
+ docker tag librechat:latest ghcr.io/${{ github.repository_owner }}/librechat:${{ env.TAG_NAME }}
+ docker push ghcr.io/${{ github.repository_owner }}/librechat:${{ env.TAG_NAME }}
+ docker tag librechat:latest ghcr.io/${{ github.repository_owner }}/librechat:latest
+ docker push ghcr.io/${{ github.repository_owner }}/librechat:latest
+ docker tag librechat-api:latest ghcr.io/${{ github.repository_owner }}/librechat-api:${{ env.TAG_NAME }}
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-api:${{ env.TAG_NAME }}
+ docker tag librechat-api:latest ghcr.io/${{ github.repository_owner }}/librechat-api:latest
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-api:latest
diff --git a/.github/workflows/data-provider.yml b/.github/workflows/data-provider.yml
new file mode 100644
index 00000000000..21b8a4e991b
--- /dev/null
+++ b/.github/workflows/data-provider.yml
@@ -0,0 +1,34 @@
+name: Node.js Package
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - 'packages/data-provider/package.json'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 16
+ - run: cd packages/data-provider && npm ci
+ - run: cd packages/data-provider && npm run build
+
+ publish-npm:
+ needs: build
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 16
+ registry-url: 'https://registry.npmjs.org'
+ - run: cd packages/data-provider && npm ci
+ - run: cd packages/data-provider && npm run build
+ - run: cd packages/data-provider && npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000000..5c143b45318
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,38 @@
+name: Deploy_GHRunner_Linux_ACI
+
+on:
+ workflow_dispatch:
+
+env:
+ RUNNER_VERSION: 2.293.0
+ ACI_RESOURCE_GROUP: 'Demo-ACI-GitHub-Runners-RG'
+ ACI_NAME: 'gh-runner-linux-01'
+ DNS_NAME_LABEL: 'gh-lin-01'
+ GH_OWNER: ${{ github.repository_owner }}
+ GH_REPOSITORY: 'LibreChat' #Change here to deploy self hosted runner ACI to another repo.
+
+jobs:
+ deploy-gh-runner-aci:
+ runs-on: ubuntu-latest
+ steps:
+ # checkout the repo
+ - name: 'Checkout GitHub Action'
+ uses: actions/checkout@v4
+
+ - name: 'Login via Azure CLI'
+ uses: azure/login@v1
+ with:
+ creds: ${{ secrets.AZURE_CREDENTIALS }}
+
+ - name: 'Deploy to Azure Container Instances'
+ uses: 'azure/aci-deploy@v1'
+ with:
+ resource-group: ${{ env.ACI_RESOURCE_GROUP }}
+ image: ${{ secrets.REGISTRY_LOGIN_SERVER }}/pwd9000-github-runner-lin:${{ env.RUNNER_VERSION }}
+ registry-login-server: ${{ secrets.REGISTRY_LOGIN_SERVER }}
+ registry-username: ${{ secrets.REGISTRY_USERNAME }}
+ registry-password: ${{ secrets.REGISTRY_PASSWORD }}
+ name: ${{ env.ACI_NAME }}
+ dns-name-label: ${{ env.DNS_NAME_LABEL }}
+ environment-variables: GH_TOKEN=${{ secrets.PAT_TOKEN }} GH_OWNER=${{ env.GH_OWNER }} GH_REPOSITORY=${{ env.GH_REPOSITORY }}
+ location: 'eastus'
diff --git a/.github/workflows/dev-images.yml b/.github/workflows/dev-images.yml
new file mode 100644
index 00000000000..e0149e05e9c
--- /dev/null
+++ b/.github/workflows/dev-images.yml
@@ -0,0 +1,45 @@
+name: Docker Dev Images Build
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ # Check out the repository
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ # Set up Docker
+ - name: Set up Docker
+ uses: docker/setup-buildx-action@v3
+
+ # Log in to GitHub Container Registry
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ # Build Docker images
+ - name: Build Docker images
+ run: |
+ cp .env.example .env
+ docker build -f Dockerfile.multi --target api-build -t librechat-dev-api .
+ docker build -f Dockerfile -t librechat-dev .
+
+ # Tag and push the images to GitHub Container Registry
+ - name: Tag and push images
+ run: |
+ docker tag librechat-dev-api:latest ghcr.io/${{ github.repository_owner }}/librechat-dev-api:${{ github.sha }}
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-dev-api:${{ github.sha }}
+ docker tag librechat-dev-api:latest ghcr.io/${{ github.repository_owner }}/librechat-dev-api:latest
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-dev-api:latest
+
+ docker tag librechat-dev:latest ghcr.io/${{ github.repository_owner }}/librechat-dev:${{ github.sha }}
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-dev:${{ github.sha }}
+ docker tag librechat-dev:latest ghcr.io/${{ github.repository_owner }}/librechat-dev:latest
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-dev:latest
diff --git a/.github/workflows/frontend-review.yml b/.github/workflows/frontend-review.yml
new file mode 100644
index 00000000000..9f479e1b7a0
--- /dev/null
+++ b/.github/workflows/frontend-review.yml
@@ -0,0 +1,38 @@
+#github action to run unit tests for frontend with jest
+name: Frontend Unit Tests
+on:
+ # push:
+ # branches:
+ # - main
+ # - dev
+ # - release/*
+ pull_request:
+ branches:
+ - main
+ - dev
+ - release/*
+ paths:
+ - 'client/**'
+ - 'packages/**'
+jobs:
+ tests_frontend:
+ name: Run frontend unit tests
+ timeout-minutes: 60
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Use Node.js 20.x
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build Client
+ run: npm run frontend:ci
+
+ - name: Run unit tests
+ run: npm run test:ci --verbose
+ working-directory: client
\ No newline at end of file
diff --git a/.github/workflows/latest-images-main.yml b/.github/workflows/latest-images-main.yml
new file mode 100644
index 00000000000..5149cecb0e6
--- /dev/null
+++ b/.github/workflows/latest-images-main.yml
@@ -0,0 +1,40 @@
+name: Docker Compose Build on Main Branch
+
+on:
+ workflow_dispatch: # This line allows manual triggering
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ # Check out the repository
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ # Set up Docker
+ - name: Set up Docker
+ uses: docker/setup-buildx-action@v3
+
+ # Log in to GitHub Container Registry
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ # Run docker-compose build
+ - name: Build Docker images
+ run: |
+ cp .env.example .env
+ docker-compose build
+ docker build -f Dockerfile.multi --target api-build -t librechat-api .
+
+ # Tag and push the images with the 'latest' tag
+ - name: Tag image and push
+ run: |
+ docker tag librechat:latest ghcr.io/${{ github.repository_owner }}/librechat:latest
+ docker push ghcr.io/${{ github.repository_owner }}/librechat:latest
+ docker tag librechat-api:latest ghcr.io/${{ github.repository_owner }}/librechat-api:latest
+ docker push ghcr.io/${{ github.repository_owner }}/librechat-api:latest
diff --git a/.github/workflows/mkdocs.yaml b/.github/workflows/mkdocs.yaml
new file mode 100644
index 00000000000..3b2878fa2a7
--- /dev/null
+++ b/.github/workflows/mkdocs.yaml
@@ -0,0 +1,27 @@
+name: mkdocs
+on:
+ push:
+ branches:
+ - main
+permissions:
+ contents: write
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.x
+ - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
+ - uses: actions/cache@v3
+ with:
+ key: mkdocs-material-${{ env.cache_id }}
+ path: .cache
+ restore-keys: |
+ mkdocs-material-
+ - run: pip install mkdocs-material
+ - run: pip install mkdocs-nav-weight
+ - run: pip install mkdocs-publisher
+ - run: pip install mkdocs-exclude
+ - run: mkdocs gh-deploy --force
diff --git a/.gitignore b/.gitignore
index 14bca1d7584..f360cbba0ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,6 +71,10 @@ config.local.ts
**/storageState.json
junit.xml
+# docker override file
+docker-compose.override.yaml
+docker-compose.override.yml
+
# meilisearch
meilisearch
meilisearch.exe
@@ -78,4 +82,6 @@ data.ms/*
auth.json
/packages/ux-shared/
-/images
\ No newline at end of file
+/images
+
+!client/src/components/Nav/SettingsTabs/Data/
\ No newline at end of file
diff --git a/README.md b/README.md
index 1b223f2fd7f..cfd0d8ffd45 100644
--- a/README.md
+++ b/README.md
@@ -26,10 +26,10 @@
-# Features
+# 📃 Features
- 🖥️ UI matching ChatGPT, including Dark mode, Streaming, and 11-2023 updates
- 💬 Multimodal Chat:
- - Upload and analyze images with GPT-4-Vision 📸
+ - Upload and analyze images with GPT-4 and Gemini Vision 📸
- More filetypes and Assistants API integration in Active Development 🚧
- 🌎 Multilingual UI:
- English, 中文, Deutsch, Español, Français, Italiano, Polski, Português Brasileiro,
@@ -46,7 +46,7 @@
[For a thorough review of our features, see our docs here](https://docs.librechat.ai/features/plugins/introduction.html) 📚
-## All-In-One AI Conversations with LibreChat
+## 🪶 All-In-One AI Conversations with LibreChat
LibreChat brings together the future of assistant AIs with the revolutionary technology of OpenAI's ChatGPT. Celebrating the original styling, LibreChat gives you the ability to integrate multiple AI models. It also integrates and enhances original client features such as conversation and message search, prompt templates and plugins.
With LibreChat, you no longer need to opt for ChatGPT Plus and can instead use free or pay-per-call APIs. We welcome contributions, cloning, and forking to enhance the capabilities of this advanced chatbot platform.
@@ -58,97 +58,20 @@ Click on the thumbnail to open the video☝️
---
-## ⚠️ [Breaking Changes](docs/general_info/breaking_changes.md) ⚠️
-
-**Please read this before updating from a previous version**
+## 📚 Documentation
+For more information on how to use our advanced features, install and configure our software, and access our guidelines and tutorials, please check out our documentation at [docs.librechat.ai](https://docs.librechat.ai)
---
-## Changelog
+## 📝 Changelog
Keep up with the latest updates by visiting the releases page - [Releases](https://github.com/danny-avila/LibreChat/releases)
----
-
-
+
+
+ >
+ );
+}
+
+export default Avatar;
diff --git a/client/src/components/Nav/SettingsTabs/Data.tsx b/client/src/components/Nav/SettingsTabs/Data/Data.tsx
similarity index 98%
rename from client/src/components/Nav/SettingsTabs/Data.tsx
rename to client/src/components/Nav/SettingsTabs/Data/Data.tsx
index 1786095eeda..d7db9969412 100644
--- a/client/src/components/Nav/SettingsTabs/Data.tsx
+++ b/client/src/components/Nav/SettingsTabs/Data/Data.tsx
@@ -5,7 +5,7 @@ import {
} from 'librechat-data-provider/react-query';
import React, { useState, useCallback, useRef } from 'react';
import { useOnClickOutside } from '~/hooks';
-import DangerButton from './DangerButton';
+import DangerButton from '../DangerButton';
export const RevokeKeysButton = ({
showText = true,
diff --git a/client/src/components/Nav/SettingsTabs/AutoScrollSwitch.spec.tsx b/client/src/components/Nav/SettingsTabs/General/AutoScrollSwitch.spec.tsx
similarity index 100%
rename from client/src/components/Nav/SettingsTabs/AutoScrollSwitch.spec.tsx
rename to client/src/components/Nav/SettingsTabs/General/AutoScrollSwitch.spec.tsx
diff --git a/client/src/components/Nav/SettingsTabs/AutoScrollSwitch.tsx b/client/src/components/Nav/SettingsTabs/General/AutoScrollSwitch.tsx
similarity index 100%
rename from client/src/components/Nav/SettingsTabs/AutoScrollSwitch.tsx
rename to client/src/components/Nav/SettingsTabs/General/AutoScrollSwitch.tsx
diff --git a/client/src/components/Nav/SettingsTabs/ClearChatsButton.spec.tsx b/client/src/components/Nav/SettingsTabs/General/ClearChatsButton.spec.tsx
similarity index 100%
rename from client/src/components/Nav/SettingsTabs/ClearChatsButton.spec.tsx
rename to client/src/components/Nav/SettingsTabs/General/ClearChatsButton.spec.tsx
diff --git a/client/src/components/Nav/SettingsTabs/General.tsx b/client/src/components/Nav/SettingsTabs/General/General.tsx
similarity index 99%
rename from client/src/components/Nav/SettingsTabs/General.tsx
rename to client/src/components/Nav/SettingsTabs/General/General.tsx
index 343b36fbecd..48ecd6be006 100644
--- a/client/src/components/Nav/SettingsTabs/General.tsx
+++ b/client/src/components/Nav/SettingsTabs/General/General.tsx
@@ -12,7 +12,7 @@ import {
} from '~/hooks';
import type { TDangerButtonProps } from '~/common';
import AutoScrollSwitch from './AutoScrollSwitch';
-import DangerButton from './DangerButton';
+import DangerButton from '../DangerButton';
import store from '~/store';
import { Dropdown } from '~/components/ui';
diff --git a/client/src/components/Nav/SettingsTabs/LangSelector.spec.tsx b/client/src/components/Nav/SettingsTabs/General/LangSelector.spec.tsx
similarity index 100%
rename from client/src/components/Nav/SettingsTabs/LangSelector.spec.tsx
rename to client/src/components/Nav/SettingsTabs/General/LangSelector.spec.tsx
diff --git a/client/src/components/Nav/SettingsTabs/ThemeSelector.spec.tsx b/client/src/components/Nav/SettingsTabs/General/ThemeSelector.spec.tsx
similarity index 100%
rename from client/src/components/Nav/SettingsTabs/ThemeSelector.spec.tsx
rename to client/src/components/Nav/SettingsTabs/General/ThemeSelector.spec.tsx
diff --git a/client/src/components/Nav/SettingsTabs/index.ts b/client/src/components/Nav/SettingsTabs/index.ts
index 939c90f3b33..73174aa7984 100644
--- a/client/src/components/Nav/SettingsTabs/index.ts
+++ b/client/src/components/Nav/SettingsTabs/index.ts
@@ -1,4 +1,5 @@
-export { default as General } from './General';
-export { ClearChatsButton } from './General';
-export { default as Data } from './Data';
-export { RevokeKeysButton } from './Data';
+export { default as General } from './General/General';
+export { ClearChatsButton } from './General/General';
+export { default as Data } from './Data/Data';
+export { RevokeKeysButton } from './Data/Data';
+export { default as Account } from './Account/Account';
diff --git a/client/src/components/svg/GearIcon.tsx b/client/src/components/svg/GearIcon.tsx
index e5ed475d521..98cc2fab982 100644
--- a/client/src/components/svg/GearIcon.tsx
+++ b/client/src/components/svg/GearIcon.tsx
@@ -1,14 +1,18 @@
import React from 'react';
-export default function GearIcon() {
+interface GearIconProps {
+ className?: string;
+}
+
+const GearIcon: React.FC = ({ className = '' }) => {
return (
);
-}
+};
+
+export default GearIcon;
diff --git a/client/src/components/svg/GeminiIcon.tsx b/client/src/components/svg/GeminiIcon.tsx
new file mode 100644
index 00000000000..783b587fe7b
--- /dev/null
+++ b/client/src/components/svg/GeminiIcon.tsx
@@ -0,0 +1,36 @@
+export default function GeminiIcon({
+ size = 25,
+ className = '',
+}: {
+ size?: number;
+ className?: string;
+}) {
+ return (
+
+ );
+}
diff --git a/client/src/components/svg/UserIcon.tsx b/client/src/components/svg/UserIcon.tsx
index 8f15fadcaf6..e8535e45eb9 100644
--- a/client/src/components/svg/UserIcon.tsx
+++ b/client/src/components/svg/UserIcon.tsx
@@ -1,20 +1,17 @@
-import React from 'react';
-
export default function UserIcon() {
return (
);
diff --git a/client/src/components/svg/index.ts b/client/src/components/svg/index.ts
index 9f8fa359dcc..3ad62c93eea 100644
--- a/client/src/components/svg/index.ts
+++ b/client/src/components/svg/index.ts
@@ -36,6 +36,8 @@ export { default as BingAIMinimalIcon } from './BingAIMinimalIcon';
export { default as PaLMinimalIcon } from './PaLMinimalIcon';
export { default as PaLMIcon } from './PaLMIcon';
export { default as CodeyIcon } from './CodeyIcon';
+export { default as GeminiIcon } from './GeminiIcon';
export { default as GoogleMinimalIcon } from './GoogleMinimalIcon';
export { default as AnthropicMinimalIcon } from './AnthropicMinimalIcon';
export { default as SendMessageIcon } from './SendMessageIcon';
+export { default as UserIcon } from './UserIcon';
diff --git a/client/src/data-provider/mutations.ts b/client/src/data-provider/mutations.ts
index c38ca46c9e6..236c66a9479 100644
--- a/client/src/data-provider/mutations.ts
+++ b/client/src/data-provider/mutations.ts
@@ -12,6 +12,8 @@ import type {
PresetDeleteResponse,
LogoutOptions,
TPreset,
+ UploadAvatarOptions,
+ AvatarUploadResponse,
} from 'librechat-data-provider';
import { dataService, MutationKeys } from 'librechat-data-provider';
@@ -99,3 +101,18 @@ export const useLogoutUserMutation = (
},
});
};
+
+/* Avatar upload */
+export const useUploadAvatarMutation = (
+ options?: UploadAvatarOptions,
+): UseMutationResult<
+ AvatarUploadResponse, // response data
+ unknown, // error
+ FormData, // request
+ unknown // context
+> => {
+ return useMutation([MutationKeys.avatarUpload], {
+ mutationFn: (variables: FormData) => dataService.uploadAvatar(variables),
+ ...(options || {}),
+ });
+};
diff --git a/client/src/hooks/AuthContext.tsx b/client/src/hooks/AuthContext.tsx
index 8cd63833bde..711f433ef2d 100644
--- a/client/src/hooks/AuthContext.tsx
+++ b/client/src/hooks/AuthContext.tsx
@@ -7,6 +7,7 @@ import {
createContext,
useContext,
} from 'react';
+import { useRecoilState } from 'recoil';
import { TUser, TLoginResponse, setTokenHeader, TLoginUser } from 'librechat-data-provider';
import {
useGetUserQuery,
@@ -17,6 +18,7 @@ import { useNavigate } from 'react-router-dom';
import { TAuthConfig, TUserContext, TAuthContext, TResError } from '~/common';
import { useLogoutUserMutation } from '~/data-provider';
import useTimeout from './useTimeout';
+import store from '~/store';
const AuthContext = createContext(undefined);
@@ -27,11 +29,13 @@ const AuthContextProvider = ({
authConfig?: TAuthConfig;
children: ReactNode;
}) => {
- const navigate = useNavigate();
- const [user, setUser] = useState(undefined);
+ const [user, setUser] = useRecoilState(store.user);
const [token, setToken] = useState(undefined);
const [error, setError] = useState(undefined);
const [isAuthenticated, setIsAuthenticated] = useState(false);
+
+ const navigate = useNavigate();
+
const setUserContext = useCallback(
(userContext: TUserContext) => {
const { token, isAuthenticated, user, redirect } = userContext;
@@ -46,7 +50,7 @@ const AuthContextProvider = ({
navigate(redirect, { replace: true });
}
},
- [navigate],
+ [navigate, setUser],
);
const doSetError = useTimeout({ callback: (error) => setError(error as string | undefined) });
diff --git a/client/src/hooks/Input/index.ts b/client/src/hooks/Input/index.ts
index 240b67f5c58..2a4b51e593d 100644
--- a/client/src/hooks/Input/index.ts
+++ b/client/src/hooks/Input/index.ts
@@ -2,3 +2,4 @@ export { default as useUserKey } from './useUserKey';
export { default as useDebounce } from './useDebounce';
export { default as useTextarea } from './useTextarea';
export { default as useRequiresKey } from './useRequiresKey';
+export { default as useMultipleKeys } from './useMultipleKeys';
diff --git a/client/src/hooks/Input/useMultipleKeys.ts b/client/src/hooks/Input/useMultipleKeys.ts
new file mode 100644
index 00000000000..b322bb7003a
--- /dev/null
+++ b/client/src/hooks/Input/useMultipleKeys.ts
@@ -0,0 +1,24 @@
+import { isJson } from '~/utils/json';
+
+export default function useMultipleKeys(setUserKey: React.Dispatch>) {
+ function getMultiKey(name: string, userKey: string) {
+ if (isJson(userKey)) {
+ const newKey = JSON.parse(userKey);
+ return newKey[name];
+ } else {
+ return '';
+ }
+ }
+
+ function setMultiKey(name: string, value: number | string | boolean, userKey: string) {
+ let newKey = {};
+ if (isJson(userKey)) {
+ newKey = JSON.parse(userKey);
+ }
+ newKey[name] = value;
+
+ setUserKey(JSON.stringify(newKey));
+ }
+
+ return { getMultiKey, setMultiKey };
+}
diff --git a/client/src/hooks/Input/useUserKey.ts b/client/src/hooks/Input/useUserKey.ts
index 0d68287176a..fd99bf5a3a6 100644
--- a/client/src/hooks/Input/useUserKey.ts
+++ b/client/src/hooks/Input/useUserKey.ts
@@ -1,4 +1,5 @@
import { useMemo, useCallback } from 'react';
+import { EModelEndpoint } from 'librechat-data-provider';
import {
useUserKeyQuery,
useGetEndpointsQuery,
@@ -10,16 +11,16 @@ const useUserKey = (endpoint: string) => {
const config = endpointsConfig?.[endpoint];
const { azure } = config ?? {};
- let keyEndpoint = endpoint;
+ let keyName = endpoint;
if (azure) {
- keyEndpoint = 'azureOpenAI';
- } else if (keyEndpoint === 'gptPlugins') {
- keyEndpoint = 'openAI';
+ keyName = EModelEndpoint.azureOpenAI;
+ } else if (keyName === EModelEndpoint.gptPlugins) {
+ keyName = EModelEndpoint.openAI;
}
const updateKey = useUpdateUserKeysMutation();
- const checkUserKey = useUserKeyQuery(keyEndpoint);
+ const checkUserKey = useUserKeyQuery(keyName);
const getExpiry = useCallback(() => {
if (checkUserKey.data) {
return checkUserKey.data.expiresAt;
@@ -40,15 +41,15 @@ const useUserKey = (endpoint: string) => {
}, [getExpiry]);
const saveUserKey = useCallback(
- (value: string, expiresAt: number) => {
+ (userKey: string, expiresAt: number) => {
const dateStr = new Date(expiresAt).toISOString();
updateKey.mutate({
- name: keyEndpoint,
- value,
+ name: keyName,
+ value: userKey,
expiresAt: dateStr,
});
},
- [updateKey, keyEndpoint],
+ [updateKey, keyName],
);
return useMemo(
diff --git a/client/src/hooks/useChatHelpers.ts b/client/src/hooks/useChatHelpers.ts
index d5cc37a1594..bb702cb98f8 100644
--- a/client/src/hooks/useChatHelpers.ts
+++ b/client/src/hooks/useChatHelpers.ts
@@ -217,7 +217,6 @@ export default function useChatHelpers(index = 0, paramId: string | undefined) {
messageId: responseMessageId ?? `${isRegenerate ? messageId : fakeMessageId}_`,
conversationId,
unfinished: false,
- submitting: true,
isCreatedByUser: false,
isEdited: isEditOrContinue,
error: false,
diff --git a/client/src/hooks/useSSE.ts b/client/src/hooks/useSSE.ts
index d5e0742e9db..e5258511c7f 100644
--- a/client/src/hooks/useSSE.ts
+++ b/client/src/hooks/useSSE.ts
@@ -64,7 +64,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
messageId: message?.overrideParentMessageId + '_',
plugin: plugin ?? null,
plugins: plugins ?? [],
- submitting: true,
// unfinished: true
},
]);
@@ -79,7 +78,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
messageId: message?.messageId + '_',
plugin: plugin ?? null,
plugins: plugins ?? [],
- submitting: true,
// unfinished: true
},
]);
@@ -136,7 +134,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
...initialResponse,
parentMessageId: message?.overrideParentMessageId ?? null,
messageId: message?.overrideParentMessageId + '_',
- submitting: true,
},
]);
} else {
@@ -147,7 +144,6 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
...initialResponse,
parentMessageId: message?.messageId,
messageId: message?.messageId + '_',
- submitting: true,
},
]);
}
@@ -172,7 +168,7 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
const finalHandler = (data: TResData, submission: TSubmission) => {
const { requestMessage, responseMessage, conversation } = data;
- const { messages, isRegenerate = false } = submission;
+ const { messages, conversation: submissionConvo, isRegenerate = false } = submission;
// update the messages
if (isRegenerate) {
@@ -199,6 +195,11 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
...conversation,
};
+ // Revert to previous model if the model was auto-switched by backend due to message attachments
+ if (conversation.model?.includes('vision') && !submissionConvo.model?.includes('vision')) {
+ update.model = submissionConvo?.model;
+ }
+
setStorage(update);
return update;
});
@@ -233,6 +234,7 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
const abortConversation = (conversationId = '', submission: TSubmission) => {
console.log(submission);
const { endpoint } = submission?.conversation || {};
+ let res: Response;
fetch(`/api/ask/${endpoint}/abort`, {
method: 'POST',
@@ -244,9 +246,15 @@ export default function useSSE(submission: TSubmission | null, index = 0) {
abortKey: conversationId,
}),
})
- .then((response) => response.json())
+ .then((response) => {
+ res = response;
+ return response.json();
+ })
.then((data) => {
console.log('aborted', data);
+ if (res.status === 404) {
+ return setIsSubmitting(false);
+ }
cancelHandler(data, submission);
})
.catch((error) => {
diff --git a/client/src/hooks/useToast.ts b/client/src/hooks/useToast.ts
index 716526768d8..92f7bbfe17b 100644
--- a/client/src/hooks/useToast.ts
+++ b/client/src/hooks/useToast.ts
@@ -25,6 +25,7 @@ export default function useToast(showDelay = 100) {
severity = NotificationSeverity.SUCCESS,
showIcon = true,
duration = 3000, // default duration for the toast to be visible
+ status,
}: TShowToast) => {
// Clear existing timeouts
if (showTimerRef.current !== null) {
@@ -36,7 +37,12 @@ export default function useToast(showDelay = 100) {
// Timeout to show the toast
showTimerRef.current = window.setTimeout(() => {
- setToast({ open: true, message, severity, showIcon });
+ setToast({
+ open: true,
+ message,
+ severity: (status as NotificationSeverity) ?? severity,
+ showIcon,
+ });
// Hides the toast after the specified duration
hideTimerRef.current = window.setTimeout(() => {
setToast((prevToast) => ({ ...prevToast, open: false }));
diff --git a/client/src/localization/Translation.tsx b/client/src/localization/Translation.tsx
index e9826af8f41..e353be293bc 100644
--- a/client/src/localization/Translation.tsx
+++ b/client/src/localization/Translation.tsx
@@ -57,8 +57,7 @@ if (!String.prototype.format) {
// input: language code in string
// returns an object of translated strings in the language
export const getTranslations = (langCode: string) => {
- const language = languageMap[langCode] || English;
- return language;
+ return languageMap[langCode] || English;
};
// input: language code in string & phrase key in string
diff --git a/client/src/localization/languages/Ar.tsx b/client/src/localization/languages/Ar.tsx
index 85d8f5de5fb..424f9f2b0cd 100644
--- a/client/src/localization/languages/Ar.tsx
+++ b/client/src/localization/languages/Ar.tsx
@@ -262,5 +262,4 @@ export default {
com_nav_search_placeholder: 'بحث في الرسائل',
com_nav_setting_general: 'عام',
com_nav_setting_data: 'تحكم في البيانات',
- com_nav_language: 'اللغة',
};
diff --git a/client/src/localization/languages/Br.tsx b/client/src/localization/languages/Br.tsx
index 830b9e8fca9..8c8a0eaa80c 100644
--- a/client/src/localization/languages/Br.tsx
+++ b/client/src/localization/languages/Br.tsx
@@ -6,16 +6,16 @@ export default {
com_ui_example_quantum_computing: 'Explique a computação quântica em termos simples',
com_ui_example_10_year_old_b_day:
'Tem alguma ideia criativa para o aniversário de uma criança de 10 anos?',
- com_ui_example_http_in_js: 'Como fazer uma requisição HTTP em Javascript?',
+ com_ui_example_http_in_js: 'Como faço uma solicitação HTTP em Javascript?',
com_ui_capabilities: 'Capacidades',
- com_ui_capability_remember: 'Lembra do que o usuário disse anteriormente na conversa',
+ com_ui_capability_remember: 'Lembra o que o usuário disse anteriormente na conversa',
com_ui_capability_correction: 'Permite que o usuário forneça correções de acompanhamento',
com_ui_capability_decline_requests: 'Treinado para recusar pedidos inadequados',
com_ui_limitations: 'Limitações',
com_ui_limitation_incorrect_info: 'Pode ocasionalmente gerar informações incorretas',
com_ui_limitation_harmful_biased:
'Pode ocasionalmente produzir instruções prejudiciais ou conteúdo tendencioso',
- com_ui_limitation_limited_2021: 'Conhecimento limitado do mundo e dos eventos após 2021',
+ com_ui_limitation_limited_2021: 'Conhecimento limitado do mundo e eventos após 2021',
com_ui_input: 'Entrada',
com_ui_close: 'Fechar',
com_ui_model: 'Modelo',
@@ -30,10 +30,12 @@ export default {
com_ui_of: 'de',
com_ui_entries: 'Entradas',
com_ui_pay_per_call: 'Todas as conversas de IA em um só lugar. Pague por chamada e não por mês',
+ com_ui_new_footer: 'Todas as conversas de IA em um só lugar.',
com_ui_enter: 'Entrar',
com_ui_submit: 'Enviar',
com_ui_upload_success: 'Arquivo carregado com sucesso',
- com_ui_upload_invalid: 'Arquivo inválido para upload',
+ com_ui_upload_error: 'Houve um erro ao carregar seu arquivo',
+ com_ui_upload_invalid: 'Arquivo inválido para upload. Deve ser uma imagem que não exceda 2 MB',
com_ui_cancel: 'Cancelar',
com_ui_save: 'Salvar',
com_ui_copy_to_clipboard: 'Copiar para a área de transferência',
@@ -48,47 +50,51 @@ export default {
com_ui_revoke_info: 'Revogar todas as credenciais fornecidas pelo usuário',
com_ui_confirm_action: 'Confirmar Ação',
com_ui_chats: 'chats',
- com_ui_delete: 'Deletar',
- com_ui_delete_conversation: 'Deletar chat?',
- com_ui_delete_conversation_confirm: 'Isso irá deletar',
+ com_ui_delete: 'Excluir',
+ com_ui_delete_conversation: 'Excluir chat?',
+ com_ui_delete_conversation_confirm: 'Isso irá excluir',
+ com_ui_preview: 'Visualizar',
+ com_ui_upload: 'Carregar',
+ com_ui_connect: 'Conectar',
com_auth_error_login:
'Não foi possível fazer login com as informações fornecidas. Por favor, verifique suas credenciais e tente novamente.',
com_auth_error_login_rl:
- 'Muitas tentativas de login em um curto espaço de tempo. Por favor, tente novamente mais tarde.',
- com_auth_error_login_ban: 'Sua conta foi temporariamente banida por violações do nosso serviço.',
+ 'Muitas tentativas de login em um curto período de tempo. Por favor, tente novamente mais tarde.',
+ com_auth_error_login_ban:
+ 'Sua conta foi temporariamente banida devido a violações de nosso serviço.',
com_auth_error_login_server:
- 'Houve um erro interno do servidor. Por favor, espere alguns momentos e tente novamente.',
+ 'Houve um erro interno do servidor. Por favor, aguarde alguns momentos e tente novamente.',
com_auth_no_account: 'Não tem uma conta?',
com_auth_sign_up: 'Inscrever-se',
com_auth_sign_in: 'Entrar',
- com_auth_google_login: 'Entrar com Google',
- com_auth_facebook_login: 'Entrar com Facebook',
- com_auth_github_login: 'Entrar com Github',
- com_auth_discord_login: 'Entrar com Discord',
+ com_auth_google_login: 'Login com Google',
+ com_auth_facebook_login: 'Login com Facebook',
+ com_auth_github_login: 'Login com Github',
+ com_auth_discord_login: 'Login com Discord',
com_auth_email: 'Email',
com_auth_email_required: 'Email é obrigatório',
- com_auth_email_min_length: 'Email deve ter pelo menos 6 caracteres',
- com_auth_email_max_length: 'Email não deve ser maior que 120 caracteres',
- com_auth_email_pattern: 'Você deve digitar um endereço de email válido',
+ com_auth_email_min_length: 'O email deve ter pelo menos 6 caracteres',
+ com_auth_email_max_length: 'O email não deve ter mais de 120 caracteres',
+ com_auth_email_pattern: 'Você deve inserir um endereço de email válido',
com_auth_email_address: 'Endereço de email',
com_auth_password: 'Senha',
com_auth_password_required: 'Senha é obrigatória',
- com_auth_password_min_length: 'Senha deve ter pelo menos 8 caracteres',
- com_auth_password_max_length: 'Senha deve ter menos de 128 caracteres',
+ com_auth_password_min_length: 'A senha deve ter pelo menos 8 caracteres',
+ com_auth_password_max_length: 'A senha deve ter menos de 128 caracteres',
com_auth_password_forgot: 'Esqueceu a senha?',
- com_auth_password_confirm: 'Confirmar senha',
- com_auth_password_not_match: 'Senhas não coincidem',
+ com_auth_password_confirm: 'Confirme a senha',
+ com_auth_password_not_match: 'As senhas não coincidem',
com_auth_continue: 'Continuar',
com_auth_create_account: 'Crie sua conta',
com_auth_error_create: 'Houve um erro ao tentar registrar sua conta. Por favor, tente novamente.',
com_auth_full_name: 'Nome completo',
com_auth_name_required: 'Nome é obrigatório',
- com_auth_name_min_length: 'Nome deve ter pelo menos 3 caracteres',
- com_auth_name_max_length: 'Nome deve ter menos de 80 caracteres',
+ com_auth_name_min_length: 'O nome deve ter pelo menos 3 caracteres',
+ com_auth_name_max_length: 'O nome deve ter menos de 80 caracteres',
com_auth_username: 'Nome de usuário (opcional)',
com_auth_username_required: 'Nome de usuário é obrigatório',
- com_auth_username_min_length: 'Nome de usuário deve ter pelo menos 2 caracteres',
- com_auth_username_max_length: 'Nome de usuário deve ter menos de 20 caracteres',
+ com_auth_username_min_length: 'O nome de usuário deve ter pelo menos 2 caracteres',
+ com_auth_username_max_length: 'O nome de usuário deve ter menos de 20 caracteres',
com_auth_already_have_account: 'Já tem uma conta?',
com_auth_login: 'Login',
com_auth_reset_password: 'Redefina sua senha',
@@ -99,8 +105,8 @@ export default {
com_auth_reset_password_email_sent:
'Um email foi enviado para você com mais instruções para redefinir sua senha.',
com_auth_error_reset_password:
- 'Houve um problema ao redefinir sua senha. Não foi encontrado nenhum usuário com o endereço de email fornecido. Por favor, tente novamente.',
- com_auth_reset_password_success: 'Redefinição de Senha com Sucesso',
+ 'Houve um problema para redefinir sua senha. Não foi encontrado nenhum usuário com o endereço de email fornecido. Por favor, tente novamente.',
+ com_auth_reset_password_success: 'Redefinição de Senha Bem-sucedida',
com_auth_login_with_new_password: 'Agora você pode fazer login com sua nova senha.',
com_auth_error_invalid_reset_token: 'Este token de redefinição de senha não é mais válido.',
com_auth_click_here: 'Clique aqui',
@@ -108,14 +114,16 @@ export default {
com_auth_submit_registration: 'Enviar registro',
com_auth_welcome_back: 'Bem-vindo de volta',
com_endpoint_open_menu: 'Abrir Menu',
- com_endpoint_bing_enable_sydney: 'Ativar Sydney',
- com_endpoint_bing_to_enable_sydney: 'Para ativar Sydney',
+ com_endpoint_bing_enable_sydney: 'Habilitar Sydney',
+ com_endpoint_bing_to_enable_sydney: 'Para habilitar Sydney',
com_endpoint_bing_jailbreak: 'Jailbreak',
com_endpoint_bing_context_placeholder:
- 'Bing pode usar até 7k tokens para "contexto", que ele pode referenciar para a conversa. O limite específico não é conhecido, mas pode gerar erros se exceder 7k tokens',
+ 'O Bing pode usar até 7k tokens para \'contexto\', que ele pode referenciar para a conversa. O limite específico não é conhecido, mas pode ocorrer erros ao exceder 7k tokens',
com_endpoint_bing_system_message_placeholder:
- 'AVISO: O uso indevido deste recurso pode fazer com que você seja BANIDO de usar o Bing! Clique em "Mensagem do Sistema" para obter instruções completas e a mensagem padrão se omitida, que é o preset "Sydney" que é considerado seguro.',
+ 'AVISO: O uso indevido deste recurso pode fazer com que você seja BANIDO de usar o Bing! Clique em \'System Message\' para obter instruções completas e a mensagem padrão se omitida, que é o preset \'Sydney\' que é considerado seguro.',
com_endpoint_system_message: 'Mensagem do Sistema',
+ com_endpoint_message: 'Mensagem',
+ com_endpoint_message_not_appendable: 'Edite sua mensagem ou Regenere.',
com_endpoint_default_blank: 'padrão: em branco',
com_endpoint_default_false: 'padrão: falso',
com_endpoint_default_creative: 'padrão: criativo',
@@ -128,46 +136,46 @@ export default {
com_endpoint_google_temp:
'Valores mais altos = mais aleatório, enquanto valores mais baixos = mais focado e determinístico. Recomendamos alterar isso ou Top P, mas não ambos.',
com_endpoint_google_topp:
- 'Top-p muda como o modelo seleciona tokens para a saída. Tokens são selecionados dos mais K (veja o parâmetro topK) prováveis para os menos até que a soma de suas probabilidades seja igual ao valor de top-p.',
+ 'Top-p muda como o modelo seleciona tokens para saída. Os tokens são selecionados do mais K (veja o parâmetro topK) provável ao menos até que a soma de suas probabilidades seja igual ao valor de top-p.',
com_endpoint_google_topk:
- 'Top-k muda como o modelo seleciona tokens para a saída. Um top-k de 1 significa que o token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-k de 3 significa que o próximo token é selecionado entre os 3 tokens mais prováveis (usando temperatura).',
+ 'Top-k muda como o modelo seleciona tokens para saída. Um top-k de 1 significa que o token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-k de 3 significa que o próximo token é selecionado entre os 3 tokens mais prováveis (usando temperatura).',
com_endpoint_google_maxoutputtokens:
'Número máximo de tokens que podem ser gerados na resposta. Especifique um valor menor para respostas mais curtas e um valor maior para respostas mais longas.',
com_endpoint_google_custom_name_placeholder: 'Defina um nome personalizado para o Google',
com_endpoint_prompt_prefix_placeholder:
- 'Defina instruções ou contexto personalizados. Ignorado se vazio.',
+ 'Defina instruções personalizadas ou contexto. Ignorado se vazio.',
com_endpoint_custom_name: 'Nome Personalizado',
com_endpoint_prompt_prefix: 'Prefixo do Prompt',
com_endpoint_temperature: 'Temperatura',
com_endpoint_default: 'padrão',
com_endpoint_top_p: 'Top P',
com_endpoint_top_k: 'Top K',
- com_endpoint_max_output_tokens: 'Tokens Máximos de Saída',
+ com_endpoint_max_output_tokens: 'Max Output Tokens',
com_endpoint_openai_temp:
'Valores mais altos = mais aleatório, enquanto valores mais baixos = mais focado e determinístico. Recomendamos alterar isso ou Top P, mas não ambos.',
com_endpoint_openai_max:
'Os tokens máximos para gerar. O comprimento total dos tokens de entrada e dos tokens gerados é limitado pelo comprimento do contexto do modelo.',
com_endpoint_openai_topp:
- 'Uma alternativa à amostragem com temperatura, chamada de amostragem de núcleo, onde o modelo considera os resultados dos tokens com massa de probabilidade top_p. Então 0.1 significa que apenas os tokens que compõem os 10% de massa de probabilidade mais alta são considerados. Recomendamos alterar isso ou temperatura, mas não ambos.',
+ 'Uma alternativa para amostragem com temperatura, chamada amostragem de núcleo, onde o modelo considera os resultados dos tokens com massa de probabilidade top_p. Então 0.1 significa que apenas os tokens que compõem a massa de probabilidade dos 10% principais são considerados. Recomendamos alterar isso ou a temperatura, mas não ambos.',
com_endpoint_openai_freq:
'Número entre -2.0 e 2.0. Valores positivos penalizam novos tokens com base em sua frequência existente no texto até agora, diminuindo a probabilidade do modelo de repetir a mesma linha literalmente.',
com_endpoint_openai_pres:
'Número entre -2.0 e 2.0. Valores positivos penalizam novos tokens com base em se eles aparecem no texto até agora, aumentando a probabilidade do modelo de falar sobre novos tópicos.',
- com_endpoint_openai_custom_name_placeholder: 'Defina um nome personalizado para o ChatGPT',
+ com_endpoint_openai_custom_name_placeholder: 'Defina um nome personalizado para ChatGPT',
com_endpoint_openai_prompt_prefix_placeholder:
'Defina instruções personalizadas para incluir na Mensagem do Sistema. Padrão: nenhum',
com_endpoint_anthropic_temp:
'Varia de 0 a 1. Use temp mais próximo de 0 para analítico / múltipla escolha, e mais próximo de 1 para tarefas criativas e gerativas. Recomendamos alterar isso ou Top P, mas não ambos.',
com_endpoint_anthropic_topp:
- 'Top-p muda como o modelo seleciona tokens para a saída. Tokens são selecionados dos mais K (veja o parâmetro topK) prováveis para os menos até que a soma de suas probabilidades seja igual ao valor de top-p.',
+ 'Top-p muda como o modelo seleciona tokens para saída. Os tokens são selecionados do mais K (veja o parâmetro topK) provável ao menos até que a soma de suas probabilidades seja igual ao valor de top-p.',
com_endpoint_anthropic_topk:
- 'Top-k muda como o modelo seleciona tokens para a saída. Um top-k de 1 significa que o token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-k de 3 significa que o próximo token é selecionado entre os 3 tokens mais prováveis (usando temperatura).',
+ 'Top-k muda como o modelo seleciona tokens para saída. Um top-k de 1 significa que o token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-k de 3 significa que o próximo token é selecionado entre os 3 tokens mais prováveis (usando temperatura).',
com_endpoint_anthropic_maxoutputtokens:
'Número máximo de tokens que podem ser gerados na resposta. Especifique um valor menor para respostas mais curtas e um valor maior para respostas mais longas.',
- com_endpoint_anthropic_custom_name_placeholder: 'Defina um nome personalizado para o Anthropic',
+ com_endpoint_anthropic_custom_name_placeholder: 'Defina um nome personalizado para Anthropic',
com_endpoint_frequency_penalty: 'Penalidade de Frequência',
com_endpoint_presence_penalty: 'Penalidade de Presença',
- com_endpoint_plug_use_functions: 'Usar Funções',
+ com_endpoint_plug_use_functions: 'Use Funções',
com_endpoint_plug_skip_completion: 'Pular Conclusão',
com_endpoint_disabled_with_tools: 'desativado com ferramentas',
com_endpoint_disabled_with_tools_placeholder: 'Desativado com Ferramentas Selecionadas',
@@ -176,61 +184,89 @@ export default {
com_endpoint_import: 'Importar',
com_endpoint_set_custom_name:
'Defina um nome personalizado, caso você possa encontrar este preset',
+ com_endpoint_preset_delete_confirm: 'Você tem certeza de que deseja excluir este preset?',
+ com_endpoint_preset_clear_all_confirm:
+ 'Você tem certeza de que deseja excluir todos os seus presets?',
+ com_endpoint_preset_import: 'Preset Importado!',
+ com_endpoint_preset_import_error:
+ 'Houve um erro ao importar seu preset. Por favor, tente novamente.',
+ com_endpoint_preset_save_error: 'Houve um erro ao salvar seu preset. Por favor, tente novamente.',
+ com_endpoint_preset_delete_error:
+ 'Houve um erro ao excluir seu preset. Por favor, tente novamente.',
+ com_endpoint_preset_default_removed: 'não é mais o preset padrão.',
+ com_endpoint_preset_default_item: 'Padrão:',
+ com_endpoint_preset_default_none: 'Nenhum preset padrão ativo.',
+ com_endpoint_preset_title: 'Preset',
+ com_endpoint_preset_saved: 'Salvo!',
+ com_endpoint_preset_default: 'é agora o preset padrão.',
com_endpoint_preset: 'preset',
com_endpoint_presets: 'presets',
+ com_endpoint_preset_selected: 'Preset Ativo!',
+ com_endpoint_preset_selected_title: 'Ativo!',
com_endpoint_preset_name: 'Nome do Preset',
com_endpoint_new_topic: 'Novo Tópico',
com_endpoint: 'Endpoint',
- com_endpoint_hide: 'Ocultar',
+ com_endpoint_hide: 'Esconder',
com_endpoint_show: 'Mostrar',
com_endpoint_examples: ' Presets',
com_endpoint_completion: 'Conclusão',
com_endpoint_agent: 'Agente',
- com_endpoint_show_what_settings: 'Mostrar Configurações de {0}',
+ com_endpoint_show_what_settings: 'Mostrar {0} Configurações',
com_endpoint_save: 'Salvar',
com_endpoint_export: 'Exportar',
com_endpoint_save_as_preset: 'Salvar como Preset',
com_endpoint_presets_clear_warning:
- 'Tem certeza de que deseja limpar todos os presets? Isso é irreversível.',
+ 'Você tem certeza de que deseja limpar todos os presets? Isso é irreversível.',
com_endpoint_not_implemented: 'Não implementado',
com_endpoint_no_presets: 'Ainda não há presets, use o botão de configurações para criar um',
com_endpoint_not_available: 'Nenhum endpoint disponível',
com_endpoint_view_options: 'Ver Opções',
com_endpoint_save_convo_as_preset: 'Salvar Conversa como Preset',
com_endpoint_my_preset: 'Meu Preset',
- com_endpoint_agent_model: 'Modelo de Agente (Recomendado: GPT-3.5)',
+ com_endpoint_agent_model: 'Modelo do Agente (Recomendado: GPT-3.5)',
com_endpoint_completion_model: 'Modelo de Conclusão (Recomendado: GPT-4)',
- com_endpoint_func_hover: 'Ativar o uso de Plugins como Funções OpenAI',
+ com_endpoint_func_hover: 'Habilitar uso de Plugins como Funções OpenAI',
com_endpoint_skip_hover:
- 'Ativar a omissão da etapa de conclusão, que revisa a resposta final e as etapas geradas',
- com_endpoint_config_key: 'Definir Chave de API',
- com_endpoint_config_key_for: 'Definir Chave de API para',
+ 'Habilitar a etapa de conclusão de pulo, que revisa a resposta final e as etapas geradas',
+ com_endpoint_config_key: 'Definir Chave API',
+ com_endpoint_config_placeholder: 'Defina sua Chave no menu Cabeçalho para conversar.',
+ com_endpoint_config_key_for: 'Definir Chave API para',
com_endpoint_config_key_name: 'Chave',
- com_endpoint_config_value: 'Digite o valor para',
- com_endpoint_config_key_name_placeholder: 'Defina a chave de API primeiro',
+ com_endpoint_config_value: 'Insira valor para',
+ com_endpoint_config_key_name_placeholder: 'Defina a chave API primeiro',
com_endpoint_config_key_encryption: 'Sua chave será criptografada e excluída em',
com_endpoint_config_key_expiry: 'o tempo de expiração',
+ com_endpoint_config_click_here: 'Clique Aqui',
+ com_endpoint_config_google_service_key: 'Chave da Conta de Serviço do Google',
+ com_endpoint_config_google_cloud_platform: '(do Google Cloud Platform)',
+ com_endpoint_config_google_api_key: 'Chave API do Google',
+ com_endpoint_config_google_gemini_api: '(API Gemini)',
+ com_endpoint_config_google_api_info:
+ 'Para obter sua chave API de Linguagem Generativa (para Gemini),',
com_endpoint_config_key_import_json_key: 'Importar Chave JSON da Conta de Serviço.',
com_endpoint_config_key_import_json_key_success:
- 'Chave JSON da Conta de Serviço Importada com Sucesso',
+ 'Chave JSON da Conta de Serviço importada com sucesso',
com_endpoint_config_key_import_json_key_invalid:
- 'Chave JSON da Conta de Serviço Inválida, Você importou o arquivo correto?',
+ 'Chave JSON da Conta de Serviço inválida, você importou o arquivo correto?',
com_endpoint_config_key_get_edge_key: 'Para obter seu token de acesso para o Bing, faça login em',
com_endpoint_config_key_get_edge_key_dev_tool:
'Use as ferramentas de desenvolvimento ou uma extensão enquanto estiver logado no site para copiar o conteúdo do cookie _U. Se isso falhar, siga estas',
com_endpoint_config_key_edge_instructions: 'instruções',
- com_endpoint_config_key_edge_full_key_string: 'para fornecer as strings completas dos cookies.',
+ com_endpoint_config_key_edge_full_key_string: 'para fornecer as strings completas do cookie.',
com_endpoint_config_key_chatgpt:
- 'Para obter seu token de acesso para o ChatGPT "Versão Gratuita", faça login em',
- com_endpoint_config_key_chatgpt_then_visit: 'depois visite',
+ 'Para obter seu token de acesso para o ChatGPT \'Versão Gratuita\', faça login em',
+ com_endpoint_config_key_chatgpt_then_visit: 'então visite',
com_endpoint_config_key_chatgpt_copy_token: 'Copie o token de acesso.',
com_endpoint_config_key_google_need_to: 'Você precisa',
- com_endpoint_config_key_google_vertex_ai: 'Ativar o Vertex AI',
- com_endpoint_config_key_google_vertex_api: 'API no Google Cloud, depois',
+ com_endpoint_config_key_google_vertex_ai: 'Habilitar Vertex AI',
+ com_endpoint_config_key_google_vertex_api: 'API no Google Cloud, então',
+ com_endpoint_config_key_google_service_account: 'Crie uma Conta de Serviço',
com_endpoint_config_key_google_vertex_api_role:
- 'Certifique-se de clicar em "Criar e Continuar" para dar pelo menos a função de "Usuário do Vertex AI". Por último, crie uma chave JSON para importar aqui.',
- com_nav_welcome_message: 'Como eu posso ajudar hoje?',
- com_nav_auto_scroll: 'Auto-rolar para o mais recente ao abrir',
+ 'Certifique-se de clicar em \'Criar e Continuar\' para dar pelo menos a função \'Usuário do Vertex AI\'. Por último, crie uma chave JSON para importar aqui.',
+ com_nav_welcome_message: 'Como posso ajudá-lo hoje?',
+ com_nav_auto_scroll: 'Auto-rolagem para o Mais Novo ao Abrir',
+ com_nav_profile_picture: 'Foto de Perfil',
+ com_nav_change_picture: 'Mudar foto',
com_nav_plugin_store: 'Loja de plugins',
com_nav_plugin_search: 'Pesquisar plugins',
com_nav_plugin_auth_error:
@@ -259,9 +295,13 @@ export default {
com_nav_clear_conversation: 'Limpar conversas',
com_nav_clear_conversation_confirm_message:
'Tem certeza de que deseja limpar todas as conversas? Isso é irreversível.',
- com_nav_help_faq: 'Ajuda e FAQ',
+ com_nav_help_faq: 'Ajuda & FAQ',
com_nav_settings: 'Configurações',
com_nav_search_placeholder: 'Pesquisar mensagens',
com_nav_setting_general: 'Geral',
com_nav_setting_data: 'Controles de dados',
+ com_nav_setting_account: 'Conta',
+ com_nav_language: 'Idioma',
+ com_nav_lang_auto: 'Detecção automática',
+ com_nav_lang_brazilian_portuguese: 'Português Brasileiro',
};
diff --git a/client/src/localization/languages/De.tsx b/client/src/localization/languages/De.tsx
index 7abf98e87c0..ec6fa99d015 100644
--- a/client/src/localization/languages/De.tsx
+++ b/client/src/localization/languages/De.tsx
@@ -201,5 +201,4 @@ export default {
com_nav_settings: 'Einstellungen',
com_nav_search_placeholder: 'Durchsuche Nachrichten',
com_nav_setting_general: 'Generell',
- com_nav_lang_german: 'Deutsch',
};
diff --git a/client/src/localization/languages/Eng.tsx b/client/src/localization/languages/Eng.tsx
index 8b3db4a56d2..8a431707bcb 100644
--- a/client/src/localization/languages/Eng.tsx
+++ b/client/src/localization/languages/Eng.tsx
@@ -33,7 +33,8 @@ export default {
com_ui_enter: 'Enter',
com_ui_submit: 'Submit',
com_ui_upload_success: 'Successfully uploaded file',
- com_ui_upload_invalid: 'Invalid file for upload',
+ com_ui_upload_error: 'There was an error uploading your file',
+ com_ui_upload_invalid: 'Invalid file for upload. Must be an image not exceeding 2 MB',
com_ui_cancel: 'Cancel',
com_ui_save: 'Save',
com_ui_copy_to_clipboard: 'Copy to clipboard',
@@ -51,6 +52,9 @@ export default {
com_ui_delete: 'Delete',
com_ui_delete_conversation: 'Delete chat?',
com_ui_delete_conversation_confirm: 'This will delete',
+ com_ui_preview: 'Preview',
+ com_ui_upload: 'Upload',
+ com_ui_connect: 'Connect',
com_auth_error_login:
'Unable to login with the information provided. Please check your credentials and try again.',
com_auth_error_login_rl:
@@ -227,6 +231,12 @@ export default {
com_endpoint_config_key_name_placeholder: 'Set API key first',
com_endpoint_config_key_encryption: 'Your key will be encrypted and deleted at',
com_endpoint_config_key_expiry: 'the expiry time',
+ com_endpoint_config_click_here: 'Click Here',
+ com_endpoint_config_google_service_key: 'Google Service Account Key',
+ com_endpoint_config_google_cloud_platform: '(from Google Cloud Platform)',
+ com_endpoint_config_google_api_key: 'Google API Key',
+ com_endpoint_config_google_gemini_api: '(Gemini API)',
+ com_endpoint_config_google_api_info: 'To get your Generative Language API key (for Gemini),',
com_endpoint_config_key_import_json_key: 'Import Service Account JSON Key.',
com_endpoint_config_key_import_json_key_success: 'Successfully Imported Service Account JSON Key',
com_endpoint_config_key_import_json_key_invalid:
@@ -247,6 +257,8 @@ export default {
'Make sure to click \'Create and Continue\' to give at least the \'Vertex AI User\' role. Lastly, create a JSON key to import here.',
com_nav_welcome_message: 'How can I help you today?',
com_nav_auto_scroll: 'Auto-scroll to Newest on Open',
+ com_nav_profile_picture: 'Profile Picture',
+ com_nav_change_picture: 'Change picture',
com_nav_plugin_store: 'Plugin store',
com_nav_plugin_search: 'Search plugins',
com_nav_plugin_auth_error:
@@ -280,6 +292,7 @@ export default {
com_nav_search_placeholder: 'Search messages',
com_nav_setting_general: 'General',
com_nav_setting_data: 'Data controls',
+ com_nav_setting_account: 'Account',
com_nav_language: 'Language',
com_nav_lang_auto: 'Auto detect',
com_nav_lang_english: 'English',
diff --git a/client/src/localization/languages/Fr.tsx b/client/src/localization/languages/Fr.tsx
index a97aea8c478..db1072e2aa9 100644
--- a/client/src/localization/languages/Fr.tsx
+++ b/client/src/localization/languages/Fr.tsx
@@ -28,14 +28,17 @@ export default {
com_ui_prompt_templates: 'Modèles de prompt',
com_ui_hide_prompt_templates: 'Masquer les modèles de prompt',
com_ui_showing: 'Affichage',
- com_ui_of: 'de',
- com_ui_entries: 'Entrées',
+ com_ui_of: 'des',
+ com_ui_entries: 'entrées',
com_ui_pay_per_call:
'Toutes les conversations IA au même endroit. Payez à la demande et non par mois',
+ com_ui_new_footer: 'Toutes les conversations IA au même endroit.',
com_ui_enter: 'Entrer',
com_ui_submit: 'Soumettre',
- com_ui_upload_success: 'Fichier téléchargé avec succès',
- com_ui_upload_invalid: 'Fichier invalide pour le téléchargement',
+ com_ui_upload_success: 'Fichier téléversé avec succès',
+ com_ui_upload_error: 'Une erreur s\'est produite lors du téléversement de votre fichier',
+ com_ui_upload_invalid:
+ 'Fichier invalide pour le téléversement. Doit être une image ne dépassant pas 2 Mo',
com_ui_cancel: 'Annuler',
com_ui_save: 'Sauvegarder',
com_ui_copy_to_clipboard: 'Copier dans le presse-papier',
@@ -54,6 +57,9 @@ export default {
com_ui_delete: 'Supprimer',
com_ui_delete_conversation: 'Supprimer la discussions?',
com_ui_delete_conversation_confirm: 'Cela supprimera',
+ com_ui_preview: 'Aperçu',
+ com_ui_upload: 'Téléverser',
+ com_ui_connect: 'Connecter',
com_auth_error_login:
'Impossible de se connecter avec les informations fournies. Veuillez vérifier vos identifiants et réessayer.',
com_auth_error_login_rl:
@@ -62,7 +68,7 @@ export default {
'Votre compte a été temporairement banni en raison de violations de notre service.',
com_auth_error_login_server:
'Une erreur interne du serveur s\'est produite. Veuillez patienter quelques instants et réessayer.',
- com_auth_no_account: 'Vous n\'avez pas de compte ?',
+ com_auth_no_account: 'Vous n\'avez pas de compte?',
com_auth_sign_up: 'S\'inscrire',
com_auth_sign_in: 'Se connecter',
com_auth_google_login: 'Se connecter avec Google',
@@ -79,7 +85,7 @@ export default {
com_auth_password_required: 'Le mot de passe est obligatoire',
com_auth_password_min_length: 'Le mot de passe doit comporter au moins 8 caractères',
com_auth_password_max_length: 'Le mot de passe doit être inférieur à 128 caractères',
- com_auth_password_forgot: 'Mot de passe oublié ?',
+ com_auth_password_forgot: 'Mot de passe oublié?',
com_auth_password_confirm: 'Confirmer le mot de passe',
com_auth_password_not_match: 'Les mots de passe ne correspondent pas',
com_auth_continue: 'Continuer',
@@ -121,8 +127,10 @@ export default {
com_endpoint_bing_context_placeholder:
'Bing peut utiliser jusqu\'à 7k jetons pour le "contexte", qu\'il peut référencer pour la conversation. La limite spécifique n\'est pas connue mais peut entraîner des erreurs dépassant les 7k jetons',
com_endpoint_bing_system_message_placeholder:
- 'AVERTISSEMENT : L\'abus de cette fonctionnalité peut vous faire BANNIR de l\'utilisation de Bing ! Cliquez sur "Message système" pour obtenir les instructions complètes et le message par défaut si omis, qui est le préréglage "Sydney" qui est considéré comme sûr.',
+ 'AVERTISSEMENT : L\'abus de cette fonctionnalité peut vous faire BANNIR de l\'utilisation de Bing! Cliquez sur "Message système" pour obtenir les instructions complètes et le message par défaut si omis, qui est le préréglage "Sydney" qui est considéré comme sûr.',
com_endpoint_system_message: 'Message système',
+ com_endpoint_message: 'Message',
+ com_endpoint_message_not_appendable: 'Editer votre message ou regénerer.',
com_endpoint_default_blank: 'par défaut : vide',
com_endpoint_default_false: 'par défaut : faux',
com_endpoint_default_creative: 'par défaut : créatif',
@@ -183,8 +191,25 @@ export default {
com_endpoint_import: 'Importer',
com_endpoint_set_custom_name:
'Définir un nom personnalisé, au cas où vous trouveriez ce préréglage',
+ com_endpoint_preset_delete_confirm: 'Êtes-vous sûr de vouloir supprimer ce préréglage?',
+ com_endpoint_preset_clear_all_confirm: 'Êtes-vous sûr de vouloir supprimer tous vos préréglages?',
+ com_endpoint_preset_import: 'Préréglage importé!',
+ com_endpoint_preset_import_error:
+ 'Il y a eu une erreur lors de l\'importation de votre préréglage. Veuillez réessayer.',
+ com_endpoint_preset_save_error:
+ 'Il y a eu une erreur lors de la sauvegarde de votre préréglage. Veuillez réessayer.',
+ com_endpoint_preset_delete_error:
+ 'Il y a eu une erreur lors de la suppression de votre préréglage. Veuillez réessayer.',
+ com_endpoint_preset_default_removed: 'n\'est plus le préréglage par défaut.',
+ com_endpoint_preset_default_item: 'Par défaut :',
+ com_endpoint_preset_default_none: 'Aucun préréglage par défaut actif.',
+ com_endpoint_preset_title: 'Préréglage',
+ com_endpoint_preset_saved: 'Enregistré!',
+ com_endpoint_preset_default: 'est maintenant le préréglage par défaut.',
com_endpoint_preset: 'préréglage',
com_endpoint_presets: 'préréglages',
+ com_endpoint_preset_selected: 'Préréglage actif!',
+ com_endpoint_preset_selected_title: 'Actif!',
com_endpoint_preset_name: 'Nom du préréglage',
com_endpoint_new_topic: 'Nouveau sujet',
com_endpoint: 'Endpoint',
@@ -198,9 +223,10 @@ export default {
com_endpoint_export: 'Exporter',
com_endpoint_save_as_preset: 'Enregistrer comme préréglage',
com_endpoint_presets_clear_warning:
- 'Etes-vous sûr de vouloir effacer tous les préréglages ? Cette action est irréversible.',
+ 'Etes-vous sûr de vouloir effacer tous les préréglages? Cette action est irréversible.',
com_endpoint_not_implemented: 'Non implémenté',
- com_endpoint_no_presets: 'Aucun préréglage',
+ com_endpoint_no_presets:
+ 'Aucun préréglage pour l\'instant, utilisez le bouton paramètres pour en créer un',
com_endpoint_not_available: 'Aucun endpoint disponible',
com_endpoint_view_options: 'Voir les options',
com_endpoint_save_convo_as_preset: 'Enregistrer la conversation comme préréglage',
@@ -211,12 +237,20 @@ export default {
com_endpoint_skip_hover:
'Activer le saut de l\'étape de complétion, qui examine la réponse finale et les étapes générées',
com_endpoint_config_key: 'Définir la clé API',
+ com_endpoint_config_placeholder: 'Définissez votre clé dans le menu En-tête pour discuter.',
com_endpoint_config_key_for: 'Définir la clé API pour',
com_endpoint_config_key_name: 'Clé',
com_endpoint_config_value: 'Entrez la valeur pour',
com_endpoint_config_key_name_placeholder: 'Définir d\'abord la clé API',
com_endpoint_config_key_encryption: 'Votre clé sera cryptée et supprimée à',
- com_endpoint_config_key_expiry: 'l\'heure d\'expiration',
+ com_endpoint_config_key_expiry: 'le délai d\'expiration',
+ com_endpoint_config_click_here: 'Cliquez ici',
+ com_endpoint_config_google_service_key: 'Clé de compte de service Google',
+ com_endpoint_config_google_cloud_platform: '(de Google Cloud Platform)',
+ com_endpoint_config_google_api_key: 'Clé API Google',
+ com_endpoint_config_google_gemini_api: '(API Gemini)',
+ com_endpoint_config_google_api_info:
+ 'Pour obtenir votre clé API de langage génératif (pour Gemini),',
com_endpoint_config_key_import_json_key: 'Importez la clé JSON du compte de service.',
com_endpoint_config_key_import_json_key_success:
'Clé JSON du compte de service importé avec succès',
@@ -238,7 +272,10 @@ export default {
com_endpoint_config_key_google_service_account: 'Créer un compte de service',
com_endpoint_config_key_google_vertex_api_role:
'Assurez-vous de cliquer \'Créer et continuer\' pour donner au moins le role \'Utilisateur de Vertex AI\'. Finalement, créez une clé JSON à importer ici.',
+ com_nav_welcome_message: 'Comment puis-je vous aider aujourd\'hui?',
com_nav_auto_scroll: 'Défilement automatique jusqu\'au plus récent à l\'ouverture',
+ com_nav_profile_picture: 'Photo de profil',
+ com_nav_change_picture: 'Changer de photo',
com_nav_plugin_store: 'Boutique de plugins',
com_nav_plugin_search: 'Rechercher des plugins',
com_nav_plugin_auth_error:
@@ -272,4 +309,5 @@ export default {
com_nav_search_placeholder: 'Rechercher des messages',
com_nav_setting_general: 'Général',
com_nav_setting_data: 'Contrôles des données',
+ com_nav_setting_account: 'Compte',
};
diff --git a/client/src/localization/languages/It.tsx b/client/src/localization/languages/It.tsx
index 9c274f54133..175b7820dbb 100644
--- a/client/src/localization/languages/It.tsx
+++ b/client/src/localization/languages/It.tsx
@@ -3,17 +3,18 @@
export default {
com_ui_examples: 'Esempi',
com_ui_new_chat: 'Nuova Chat',
- com_ui_example_quantum_computing: 'Spiega il computing quantistico in termini semplici',
- com_ui_example_10_year_old_b_day: 'Hai idee creative per il compleanno di un bambino di 10 anni?',
+ com_ui_example_quantum_computing: 'Spiega l\'informatica quantistica in termini semplici',
+ com_ui_example_10_year_old_b_day:
+ 'Hai qualche idea creativa per il compleanno di un bambino di 10 anni?',
com_ui_example_http_in_js: 'Come faccio una richiesta HTTP in Javascript?',
com_ui_capabilities: 'Funzionalità',
- com_ui_capability_remember: 'Ricorda cosa ha detto l\'utente precedentemente nella conversazione',
- com_ui_capability_correction: 'Permette all\'utente di fornire correzioni di follow-up',
+ com_ui_capability_remember: 'Ricorda cosa ha detto l\'utente prima nella conversazione',
+ com_ui_capability_correction: 'Permette all\'utente di fornire correzioni successive',
com_ui_capability_decline_requests: 'Addestrato a rifiutare richieste inappropriate',
com_ui_limitations: 'Limitazioni',
- com_ui_limitation_incorrect_info: 'Può occasionalmente generare informazioni scorrette',
+ com_ui_limitation_incorrect_info: 'Può occasionalmente generare informazioni errate',
com_ui_limitation_harmful_biased:
- 'Può occasionalmente produrre istruzioni dannose o contenuti faziosi',
+ 'Può occasionalmente produrre istruzioni dannose o contenuti di parte',
com_ui_limitation_limited_2021: 'Conoscenza limitata del mondo e degli eventi dopo il 2021',
com_ui_input: 'Input',
com_ui_close: 'Chiudi',
@@ -21,19 +22,19 @@ export default {
com_ui_select_model: 'Seleziona un modello',
com_ui_use_prompt: 'Usa prompt',
com_ui_prev: 'Prec',
- com_ui_next: 'Succ',
- com_ui_stop: 'Stop',
+ com_ui_next: 'Successivo',
+ com_ui_stop: 'Ferma',
com_ui_prompt_templates: 'Modelli di prompt',
com_ui_hide_prompt_templates: 'Nascondi modelli di prompt',
com_ui_showing: 'Mostra',
com_ui_of: 'di',
com_ui_entries: 'Voci',
com_ui_pay_per_call:
- 'Tutte le conversazioni AI in un unico posto. Paga per chiamata e non per mese',
- com_ui_new_footer: 'Tutte le conversazioni AI in un unico posto.',
+ 'Tutte le conversazioni IA in un unico luogo. Paga per chiamata, non per mese',
+ com_ui_new_footer: 'Tutte le conversazioni IA in un unico luogo.',
com_ui_enter: 'Inserisci',
com_ui_submit: 'Invia',
- com_ui_upload_success: 'File caricato con successo',
+ com_ui_upload_success: 'File caricato correttamente',
com_ui_upload_invalid: 'File non valido per il caricamento',
com_ui_cancel: 'Annulla',
com_ui_save: 'Salva',
@@ -52,45 +53,49 @@ export default {
com_ui_delete: 'Elimina',
com_ui_delete_conversation: 'Eliminare la chat?',
com_ui_delete_conversation_confirm: 'Questo eliminerà',
+ com_ui_preview: 'Anteprima',
+ com_ui_upload: 'Carica',
+ com_ui_connect: 'Connetti',
com_auth_error_login:
- 'Impossibile accedere con le informazioni fornite. Si prega di controllare le credenziali e riprovare.',
+ 'Impossibile accedere con le informazioni fornite. Per favore controlla le tue credenziali e riprova.',
com_auth_error_login_rl:
- 'Troppo tentativi di accesso in uno breve lasso di tempo. Per favore riprova più tardi.',
+ 'Troppi tentativi di accesso in breve tempo. Per favore riprova più tardi.',
com_auth_error_login_ban:
- 'Il tuo account è stato temporaneamente bloccato dovuto a violazioni del nostro servizio.',
+ 'Il tuo account è stato temporaneamente bloccato a causa della violazione del nostro servizio.',
com_auth_error_login_server:
- 'C\'è stato un errore interno del server. Si prega di attendere qualche istante e riprovare.',
+ 'Si è verificato un errore interno del server. Attendi qualche istante e riprova.',
com_auth_no_account: 'Non hai un account?',
- com_auth_sign_up: 'Iscriviti',
+ com_auth_sign_up: 'Registrati',
com_auth_sign_in: 'Accedi',
com_auth_google_login: 'Accedi con Google',
com_auth_facebook_login: 'Accedi con Facebook',
com_auth_github_login: 'Accedi con Github',
com_auth_discord_login: 'Accedi con Discord',
com_auth_email: 'Email',
- com_auth_email_required: 'Email obbligatoria',
- com_auth_email_min_length: 'L\'email deve avere almeno 6 caratteri',
+ com_auth_email_required: 'L\'email è obbligatoria',
+ com_auth_email_min_length: 'L\'email deve essere lunga almeno 6 caratteri',
com_auth_email_max_length: 'L\'email non dovrebbe essere più lunga di 120 caratteri',
com_auth_email_pattern: 'Devi inserire un indirizzo email valido',
com_auth_email_address: 'Indirizzo email',
com_auth_password: 'Password',
com_auth_password_required: 'La password è obbligatoria',
- com_auth_password_min_length: 'La password deve avere almeno 8 caratteri',
- com_auth_password_max_length: 'La password deve essere più breve di 128 caratteri',
+ com_auth_password_min_length: 'La password deve essere lunga almeno 8 caratteri',
+ com_auth_password_max_length: 'La password deve essere più corta di 128 caratteri',
com_auth_password_forgot: 'Password dimenticata?',
com_auth_password_confirm: 'Conferma password',
- com_auth_password_not_match: 'Le password non coincidono',
+ com_auth_password_not_match: 'Le password non corrispondono',
com_auth_continue: 'Continua',
com_auth_create_account: 'Crea il tuo account',
- com_auth_error_create: 'C\'è stato un errore nel tentativo di registrarti. Per favore riprova.',
+ com_auth_error_create:
+ 'Si è verificato un errore nel tentativo di registrare il tuo account. Per favore riprova.',
com_auth_full_name: 'Nome completo',
com_auth_name_required: 'Il nome è obbligatorio',
- com_auth_name_min_length: 'Il nome deve avere almeno 3 caratteri',
- com_auth_name_max_length: 'Il nome deve essere più breve di 80 caratteri',
- com_auth_username: 'Nome utente (opzionale)',
+ com_auth_name_min_length: 'Il nome deve essere lungo almeno 3 caratteri',
+ com_auth_name_max_length: 'Il nome deve essere più corto di 80 caratteri',
+ com_auth_username: 'Nome utente (facoltativo)',
com_auth_username_required: 'Il nome utente è obbligatorio',
- com_auth_username_min_length: 'Il nome utente deve avere almeno 2 caratteri',
- com_auth_username_max_length: 'Il nome utente deve essere più breve di 20 caratteri',
+ com_auth_username_min_length: 'Il nome utente deve essere lungo almeno 2 caratteri',
+ com_auth_username_max_length: 'Il nome utente deve essere più corto di 20 caratteri',
com_auth_already_have_account: 'Hai già un account?',
com_auth_login: 'Accedi',
com_auth_reset_password: 'Reimposta la tua password',
@@ -99,42 +104,44 @@ export default {
com_auth_to_reset_your_password: 'per reimpostare la tua password.',
com_auth_reset_password_link_sent: 'Email inviata',
com_auth_reset_password_email_sent:
- 'Ti è stata inviata una email con ulteriori istruzioni per reimpostare la password.',
+ 'Ti è stata inviata un\'email con ulteriori istruzioni per reimpostare la tua password.',
com_auth_error_reset_password:
- 'C\'è stato un problema nel reimpostare la password. Non è stato trovato nessun utente con l\'indirizzo email fornito. Per favore riprova.',
- com_auth_reset_password_success: 'Password reimpostata con successo',
+ 'Si è verificato un problema durante il reset della password. Non è stato trovato nessun utente con l\'indirizzo email fornito. Per favore riprova.',
+ com_auth_reset_password_success: 'Reset password avvenuto con successo',
com_auth_login_with_new_password: 'Ora puoi accedere con la tua nuova password.',
- com_auth_error_invalid_reset_token: 'Questo token di reimpostazione password non è più valido.',
+ com_auth_error_invalid_reset_token: 'Questo token di reset password non è più valido.',
com_auth_click_here: 'Clicca qui',
- com_auth_to_try_again: 'per provare di nuovo.',
+ com_auth_to_try_again: 'per riprovare.',
com_auth_submit_registration: 'Invia registrazione',
- com_auth_welcome_back: 'Ben tornato',
- com_endpoint_open_menu: 'Apri menu',
+ com_auth_welcome_back: 'Bentornato',
+ com_endpoint_open_menu: 'Apri il menu',
com_endpoint_bing_enable_sydney: 'Abilita Sydney',
com_endpoint_bing_to_enable_sydney: 'Per abilitare Sydney',
- com_endpoint_bing_jailbreak: 'Forza protezioni',
+ com_endpoint_bing_jailbreak: 'Jailbreak',
com_endpoint_bing_context_placeholder:
- 'Bing può usare fino a 7k token per "contesto", che può referenziare per la conversazione. Il limite specifico non è noto ma potrebbe andare in errore superando i 7k token',
+ 'Bing può usare fino a 7k token per "contesto", che può fare riferimento per la conversazione. Il limite specifico non è noto ma può dare errori superando i 7k token',
com_endpoint_bing_system_message_placeholder:
- 'ATTENZIONE: L\'abuso di questa funzione può farti BANNARE dall\'uso di Bing! Clicca su \'Messaggio di sistema\' per le istruzioni complete e il messaggio predefinito se omesso, che è il preset \'Sydney\' che è considerato sicuro.',
+ 'ATTENZIONE: L\'abuso di questa funzione può farti BLOCCARE da Bing! Fai clic su "Messaggio di sistema" per le istruzioni complete e il messaggio predefinito se omesso, che è il preset "Sydney" considerato sicuro.',
com_endpoint_system_message: 'Messaggio di sistema',
- com_endpoint_default_blank: 'predefinito: vuoto',
- com_endpoint_default_false: 'predefinito: falso',
- com_endpoint_default_creative: 'predefinito: creativo',
- com_endpoint_default_empty: 'predefinito: vuoto',
- com_endpoint_default_with_num: 'predefinito: {0}',
+ com_endpoint_message: 'Messaggio',
+ com_endpoint_message_not_appendable: 'Modifica il tuo messaggio o Rigenera.',
+ com_endpoint_default_blank: 'default: vuoto',
+ com_endpoint_default_false: 'default: falso',
+ com_endpoint_default_creative: 'default: creativo',
+ com_endpoint_default_empty: 'default: vuoto',
+ com_endpoint_default_with_num: 'default: {0}',
com_endpoint_context: 'Contesto',
- com_endpoint_tone_style: 'Stile tono',
+ com_endpoint_tone_style: 'Stile del tono',
com_endpoint_token_count: 'Conteggio token',
com_endpoint_output: 'Output',
com_endpoint_google_temp:
- 'Valori più alti = più casuali, mentre valori più bassi = più mirati e deterministici. Consigliamo di modificare questo o Top P ma non entrambi.',
+ 'Valori più alti = più casuali, mentre valori più bassi = più focalizzati e deterministici. Si consiglia di modificare questo o Top P ma non entrambi.',
com_endpoint_google_topp:
- 'Top-p cambia come il modello seleziona i token per l\'output. I token sono selezionati dai K più probabili (vedi parametro topK) ai meno probabili finché la somma delle loro probabilità equivale al valore top-p.',
+ 'Top-p cambia come il modello seleziona i token per l\'output. I token vengono selezionati dai più probabili K (vedi parametro topK) ai meno probabili fino a che la somma delle loro probabilità eguaglia il valore top-p.',
com_endpoint_google_topk:
- 'Top-k cambia come il modello seleziona i token per l\'output. Un top-k di 1 significa che il token selezionato è il più probabile tra tutti i token nel vocabolario del modello (anche chiamato decodifica greedy), mentre un top-k di 3 significa che il token successivo è selezionato tra i 3 token più probabili (usando temperature).',
+ 'Top-k cambia come il modello seleziona i token per l\'output. Un top-k di 1 significa che il token selezionato è il più probabile tra tutti i token nel vocabolario del modello (chiamato anche decodifica avida), mentre un top-k di 3 significa che il token successivo viene selezionato tra i 3 token più probabili (usando la temperatura).',
com_endpoint_google_maxoutputtokens:
- 'Numero massimo di token che possono essere generati nella risposta. Specifica un valore più basso per risposte più corte e un valore più alto per risposte più lunghe.',
+ 'Numero massimo di token che possono essere generati nella risposta. Specifica un valore inferiore per risposte più brevi e un valore superiore per risposte più lunghe.',
com_endpoint_google_custom_name_placeholder: 'Imposta un nome personalizzato per Google',
com_endpoint_prompt_prefix_placeholder:
'Imposta istruzioni o contesto personalizzati. Ignorato se vuoto.',
@@ -146,41 +153,57 @@ export default {
com_endpoint_top_k: 'Top K',
com_endpoint_max_output_tokens: 'Token output massimi',
com_endpoint_openai_temp:
- 'Valori più alti = più casuali, mentre valori più bassi = più mirati e deterministici. Consigliamo di modificare questo o Top P ma non entrambi.',
+ 'Valori più alti = più casuali, mentre valori più bassi = più focalizzati e deterministici. Si consiglia di modificare questo o Top P ma non entrambi.',
com_endpoint_openai_max:
- 'Il numero massimo di token da generare. La lunghezza totale di token di input e token generati è limitata dalla lunghezza di contesto del modello.',
+ 'Il numero massimo di token da generare. La lunghezza totale dei token di input e generati è limitata dalla lunghezza di contesto del modello.',
com_endpoint_openai_topp:
- 'Un\'alternativa al campionamento con temperatura, chiamata nucleus sampling, dove il modello considera i risultati dei token con la massa di probabilità top_p. Quindi 0.1 significa che vengono considerati solo i token che comprendono il 10% della massa di probabilità in cima.',
+ 'Un\'alternativa al campionamento con temperatura, chiamata nucleus sampling, dove il modello considera i risultati dei token con massa di probabilità top_p. Quindi 0.1 significa che vengono considerati solo i token che comprendono il 10% della massa di probabilità.',
com_endpoint_openai_freq:
- 'Numero tra -2.0 e 2.0. Valori positivi penalizzano nuovi token in base alla loro frequenza esistente nel testo finora, diminuendo la probabilità del modello di ripetere la stessa frase parola per parola.',
+ 'Numero tra -2.0 e 2.0. Valori positivi penalizzano i nuovi token in base alla loro frequenza esistente nel testo finora, diminuendo la probabilità del modello di ripetere la stessa riga verbatim.',
com_endpoint_openai_pres:
- 'Numero tra -2.0 e 2.0. Valori positivi penalizzano nuovi token in base al fatto che appaiano nel testo finora, aumentando la probabilità del modello di parlare di nuovi argomenti.',
+ 'Numero tra -2.0 e 2.0. Valori positivi penalizzano i nuovi token in base al fatto che appaiano nel testo finora, aumentando la probabilità del modello di parlare di nuovi argomenti.',
com_endpoint_openai_custom_name_placeholder: 'Imposta un nome personalizzato per ChatGPT',
com_endpoint_openai_prompt_prefix_placeholder:
- 'Imposta istruzioni personalizzate da includere nel Messaggio di sistema. Predefinito: nessuna',
+ 'Imposta istruzioni personalizzate da includere nel Messaggio di sistema. Predefinito: nessuno',
com_endpoint_anthropic_temp:
- 'Intervallo da 0 a 1. Usa temperature più vicine a 0 per compiti analitici/a scelta multipla e più vicine a 1 per compiti creativi e generativi. Consigliamo di modificare questo o Top P ma non entrambi.',
+ 'Varia da 0 a 1. Usa una temp più vicina a 0 per compiti analitici / a scelta multipla, e più vicina a 1 per compiti creativi e generativi. Si consiglia di modificare questo o Top P ma non entrambi.',
com_endpoint_anthropic_topp:
- 'Top-p cambia come il modello seleziona i token per l\'output. I token sono selezionati dai K più probabili (vedi parametro topK) ai meno probabili finché la somma delle loro probabilità equivale al valore top-p.',
+ 'Top-p cambia come il modello seleziona i token per l\'output. I token vengono selezionati dai più probabili K (vedi parametro topK) ai meno probabili fino a che la somma delle loro probabilità eguaglia il valore top-p.',
com_endpoint_anthropic_topk:
- 'Top-k cambia come il modello seleziona i token per l\'output. Un top-k di 1 significa che il token selezionato è il più probabile tra tutti i token nel vocabolario del modello (anche chiamato decodifica greedy), mentre un top-k di 3 significa che il token successivo è selezionato tra i 3 token più probabili (usando temperature).',
+ 'Top-k cambia come il modello seleziona i token per l\'output. Un top-k di 1 significa che il token selezionato è il più probabile tra tutti i token nel vocabolario del modello (chiamato anche decodifica avida), mentre un top-k di 3 significa che il token successivo viene selezionato tra i 3 token più probabili (usando la temperatura).',
com_endpoint_anthropic_maxoutputtokens:
- 'Numero massimo di token che possono essere generati nella risposta. Specifica un valore più basso per risposte più corte e un valore più alto per risposte più lunghe.',
+ 'Numero massimo di token che possono essere generati nella risposta. Specifica un valore inferiore per risposte più brevi e un valore superiore per risposte più lunghe.',
com_endpoint_anthropic_custom_name_placeholder: 'Imposta un nome personalizzato per Anthropic',
- com_endpoint_frequency_penalty: 'Penalità frequenza',
- com_endpoint_presence_penalty: 'Penalità presenza',
- com_endpoint_plug_use_functions: 'Abilita uso Plugin come funzioni OpenAI',
- com_endpoint_plug_skip_completion: 'Salta fase Completamento',
+ com_endpoint_frequency_penalty: 'Penalità di frequenza',
+ com_endpoint_presence_penalty: 'Penalità di presenza',
+ com_endpoint_plug_use_functions: 'Usa funzioni',
+ com_endpoint_plug_skip_completion: 'Salta completamento',
com_endpoint_disabled_with_tools: 'disabilitato con strumenti',
- com_endpoint_disabled_with_tools_placeholder: 'Disabilitato con Strumenti Selezionati',
+ com_endpoint_disabled_with_tools_placeholder: 'Disabilitato con strumenti selezionati',
com_endpoint_plug_set_custom_instructions_for_gpt_placeholder:
- 'Imposta le istruzioni personalizzate da includere nel Messaggio di sistema. Predefinito: nessuna',
+ 'Imposta istruzioni personalizzate da includere nel Messaggio di sistema. Predefinito: nessuno',
com_endpoint_import: 'Importa',
com_endpoint_set_custom_name:
'Imposta un nome personalizzato, nel caso tu possa trovare questo preset',
+ com_endpoint_preset_delete_confirm: 'Sei sicuro di voler eliminare questo preset?',
+ com_endpoint_preset_clear_all_confirm: 'Sei sicuro di voler eliminare tutti i tuoi preset?',
+ com_endpoint_preset_import: 'Preset importato!',
+ com_endpoint_preset_import_error:
+ 'Si è verificato un errore durante l\'importazione del tuo preset. Per favore riprova.',
+ com_endpoint_preset_save_error:
+ 'Si è verificato un errore durante il salvataggio del tuo preset. Per favore riprova.',
+ com_endpoint_preset_delete_error:
+ 'Si è verificato un errore durante l\'eliminazione del tuo preset. Per favore riprova.',
+ com_endpoint_preset_default_removed: 'non è più il preset predefinito.',
+ com_endpoint_preset_default_item: 'Predefinito:',
+ com_endpoint_preset_default_none: 'Nessun preset predefinito attivo.',
+ com_endpoint_preset_title: 'Preset',
+ com_endpoint_preset_saved: 'Salvato!',
+ com_endpoint_preset_default: 'è ora il preset predefinito.',
com_endpoint_preset: 'preset',
com_endpoint_presets: 'preset',
com_endpoint_preset_selected: 'Preset attivo!',
+ com_endpoint_preset_selected_title: 'Attivo!',
com_endpoint_preset_name: 'Nome preset',
com_endpoint_new_topic: 'Nuovo argomento',
com_endpoint: 'Endpoint',
@@ -194,59 +217,68 @@ export default {
com_endpoint_export: 'Esporta',
com_endpoint_save_as_preset: 'Salva come preset',
com_endpoint_presets_clear_warning:
- 'Sei sicuro di voler cancellare tutti i preset? Questa azione sarà irreversibile.',
+ 'Sei sicuro di voler cancellare tutti i preset? Questa operazione è irreversibile.',
com_endpoint_not_implemented: 'Non implementato',
- com_endpoint_no_presets: 'Nessun preset ancora',
+ com_endpoint_no_presets: 'Nessun preset ancora, usa il pulsante impostazioni per crearne uno',
com_endpoint_not_available: 'Nessun endpoint disponibile',
- com_endpoint_clear_all: 'Cancella tutto',
- com_endpoint_view_options: 'Visualizza opzioni',
+ com_endpoint_view_options: 'Opzioni di visualizzazione',
com_endpoint_save_convo_as_preset: 'Salva conversazione come preset',
- com_endpoint_my_preset: 'Il mio preimpostato',
- com_endpoint_agent_model: 'Modello Agente (Consigliato: GPT-3.5)',
- com_endpoint_completion_model: 'Modello Completamento (Consigliato: GPT-4)',
- com_endpoint_func_hover: 'Abilitare l\'uso dei Plugin come funzioni OpenAI',
+ com_endpoint_my_preset: 'Il mio preset',
+ com_endpoint_agent_model: 'Modello agente (Consigliato: GPT-3.5)',
+ com_endpoint_completion_model: 'Modello completamento (Consigliato: GPT-4)',
+ com_endpoint_func_hover: 'Abilita l\'uso di plugin come funzioni OpenAI',
com_endpoint_skip_hover:
- 'Abilita la possibilità di saltare la fase di completamento, che rivede la risposta finale e le fasi generate',
- com_endpoint_config_key: 'Imposta Chiave API',
- com_endpoint_config_key_for: 'Imposta Chiave API per',
+ 'Abilita il salto del passaggio di completamento, che rivede la risposta finale e i passaggi generati',
+ com_endpoint_config_key: 'Imposta chiave API',
+ com_endpoint_config_placeholder: 'Imposta la tua Chiave nel menu Header per chattare.',
+ com_endpoint_config_key_for: 'Imposta chiave API per',
com_endpoint_config_key_name: 'Chiave',
com_endpoint_config_value: 'Inserisci valore per',
- com_endpoint_config_key_name_placeholder: 'Prima imposta una chiave API',
+ com_endpoint_config_key_name_placeholder: 'Imposta prima la chiave API',
com_endpoint_config_key_encryption: 'La tua chiave verrà crittografata ed eliminata al',
- com_endpoint_config_key_expiry: 'il tempo di scadenza',
- com_endpoint_config_key_import_json_key: 'Importa la chiave JSON dell\'account di servizio',
+ com_endpoint_config_key_expiry: 'tempo di scadenza',
+ com_endpoint_config_click_here: 'Clicca qui',
+ com_endpoint_config_google_service_key: 'Chiave account servizio Google',
+ com_endpoint_config_google_cloud_platform: '(da Google Cloud Platform)',
+ com_endpoint_config_google_api_key: 'Chiave API Google',
+ com_endpoint_config_google_gemini_api: '(API Gemini)',
+ com_endpoint_config_google_api_info:
+ 'Per ottenere la tua chiave API Linguaggio Generativo (per Gemini),',
+ com_endpoint_config_key_import_json_key: 'Importa chiave JSON account di servizio.',
com_endpoint_config_key_import_json_key_success:
- 'Chiave JSON dell\'account di servizio importata correttamente',
+ 'Chiave JSON account di servizio importata con successo',
com_endpoint_config_key_import_json_key_invalid:
- 'Chiave JSON del Service Account non valida, hai importato il file corretto?',
- com_endpoint_config_key_get_edge_key: 'Per ottenere il token di accesso per Bing, accedi a',
+ 'Chiave JSON account di servizio non valida, hai importato il file corretto?',
+ com_endpoint_config_key_get_edge_key: 'Per ottenere il tuo token di accesso per Bing, accedi a',
com_endpoint_config_key_get_edge_key_dev_tool:
- 'Usa gli strumenti di sviluppo o un\'estensione mentre sei loggato nel sito per copiare il contenuto del cookie _U. Se ciò fallisce, segui queste',
- com_endpoint_config_key_edge_instructions: 'Istruzioni',
- com_endpoint_config_key_edge_full_key_string: 'per fornire la stringa di cookie complete.',
+ 'Usa gli strumenti di sviluppo o un\'estensione mentre sei loggato nel sito per copiare il contenuto del cookie _U. Se questo non funziona, segui queste',
+ com_endpoint_config_key_edge_instructions: 'istruzioni',
+ com_endpoint_config_key_edge_full_key_string: 'per fornire le stringhe complete dei cookie.',
com_endpoint_config_key_chatgpt:
- 'Per ottenere il tuo token di accesso per ChatGPT \'Versione gratuita\', accedi a',
+ 'Per ottenere il tuo token di accesso Per ChatGPT "Versione gratuita", accedi a',
com_endpoint_config_key_chatgpt_then_visit: 'poi visita',
com_endpoint_config_key_chatgpt_copy_token: 'Copia token di accesso.',
com_endpoint_config_key_google_need_to: 'Devi',
com_endpoint_config_key_google_vertex_ai: 'Abilitare Vertex AI',
com_endpoint_config_key_google_vertex_api: 'API su Google Cloud, poi',
- com_endpoint_config_key_google_service_account: 'Crea un account di servizio',
+ com_endpoint_config_key_google_service_account: 'Creare un account di servizio',
com_endpoint_config_key_google_vertex_api_role:
- 'Assicurati di fare clic su \'Crea e continua\' per dare almeno il ruolo \'Utente Vertex AI\'. Infine, crea una chiave JSON da importare qui.',
+ 'Assicurati di fare clic su "Crea e continua" per dare almeno il ruolo "Vertex AI User". Infine, crea una chiave JSON da importare qui.',
com_nav_welcome_message: 'Come posso aiutarti oggi?',
- com_nav_auto_scroll: 'Scorrimento automatico',
+ com_nav_auto_scroll: 'Scorri automaticamente al Più recente all\'apertura',
+ com_nav_profile_picture: 'Immagine del profilo',
+ com_nav_change_picture: 'Cambia immagine',
com_nav_plugin_store: 'Negozio dei plugin',
com_nav_plugin_search: 'Cerca plugin',
com_nav_plugin_auth_error:
- 'Si è verificato un errore durante il tentativo di autenticare questo plugin. Per favore, riprova.',
- com_nav_export_filename: 'Nome del file',
+ 'Si è verificato un errore durante il tentativo di autenticare questo plugin. Per favore riprova.',
+ com_nav_export_filename: 'Nome file',
com_nav_export_filename_placeholder: 'Imposta il nome del file',
com_nav_export_type: 'Tipo',
- com_nav_export_include_endpoint_options: 'Includi opzioni dell\'endpoint',
+ com_nav_export_include_endpoint_options: 'Includi opzioni endpoint',
com_nav_enabled: 'Abilitato',
com_nav_not_supported: 'Non supportato',
- com_nav_export_all_message_branches: 'Esporta tutti i rami dei messaggi',
+ com_nav_export_all_message_branches: 'Esporta tutti i rami di messaggio',
com_nav_export_recursive_or_sequential: 'Ricorsivo o sequenziale?',
com_nav_export_recursive: 'Ricorsivo',
com_nav_export_conversation: 'Esporta conversazione',
@@ -254,20 +286,19 @@ export default {
com_nav_theme_system: 'Sistema',
com_nav_theme_dark: 'Scuro',
com_nav_theme_light: 'Chiaro',
- com_nav_clear: 'Cancella',
- com_nav_clear_all_chats: 'Cancella tutte le chat',
- com_nav_confirm_clear: 'Conferma la cancellazione',
- com_nav_close_sidebar: 'Chiudi la barra laterale',
- com_nav_open_sidebar: 'Apri la barra laterale',
+ com_nav_clear_all_chats: 'Elimina tutte le chat',
+ com_nav_confirm_clear: 'Conferma eliminazione',
+ com_nav_close_sidebar: 'Chiudi sidebar',
+ com_nav_open_sidebar: 'Apri sidebar',
com_nav_send_message: 'Invia messaggio',
- com_nav_log_out: 'Esci',
+ com_nav_log_out: 'Disconnettiti',
com_nav_user: 'UTENTE',
- com_nav_clear_conversation: 'Cancella conversazioni',
+ com_nav_clear_conversation: 'Elimina conversazioni',
com_nav_clear_conversation_confirm_message:
- 'Sei sicuro di voler cancellare tutte le conversazioni? Questa azione è irreversibile.',
- com_nav_help_faq: 'Aiuto & FAQ',
+ 'Sei sicuro di voler eliminare tutte le conversazioni? Questa operazione è irreversibile.',
+ com_nav_help_faq: 'Aiuto e FAQ',
com_nav_settings: 'Impostazioni',
com_nav_search_placeholder: 'Cerca messaggi',
com_nav_setting_general: 'Generale',
- com_nav_setting_data: 'Controllo dei dati',
+ com_nav_setting_data: 'Controlli dati',
};
diff --git a/client/src/localization/languages/Ru.tsx b/client/src/localization/languages/Ru.tsx
index f852f440504..58309d0764f 100644
--- a/client/src/localization/languages/Ru.tsx
+++ b/client/src/localization/languages/Ru.tsx
@@ -3,10 +3,10 @@
export default {
com_ui_examples: 'Примеры',
com_ui_new_chat: 'Создать чат',
- com_ui_example_quantum_computing: 'Объясните квантовые вычисления простыми словами',
+ com_ui_example_quantum_computing: 'Объясни квантовые вычисления простыми словами',
com_ui_example_10_year_old_b_day:
- 'У вас есть креативные идеи для дня рождения 10-летнего ребенка?',
- com_ui_example_http_in_js: 'Как сделать HTTP-запрос в JavaScript?',
+ 'У тебя есть креативные идеи для дня рождения 10-летнего ребенка?',
+ com_ui_example_http_in_js: 'Как мне сделать HTTP-запрос в JavaScript?',
com_ui_capabilities: 'Возможности',
com_ui_capability_remember: 'Запоминает, что пользователь говорил ранее в разговоре',
com_ui_capability_correction: 'Позволяет пользователю вносить корректировки после ответа',
@@ -18,37 +18,56 @@ export default {
com_ui_limitation_limited_2021: 'Ограниченные знания о мире и событиях после 2021 года',
com_ui_input: 'Ввод',
com_ui_close: 'Закрыть',
- com_ui_clear: 'Очистить',
- com_ui_revoke: 'Отозвать',
- com_ui_revoke_info: 'Отозвать все предоставленные пользователем учетные данные',
com_ui_model: 'Модель',
com_ui_select_model: 'Выберите модель',
- com_ui_use_prompt: 'Использовать подсказку',
+ com_ui_use_prompt: 'Использовать промт',
com_ui_prev: 'Предыдущий',
com_ui_next: 'Следующий',
+ com_ui_stop: 'Остановить генерацию',
+ com_ui_prompt_templates: 'Шаблоны промтов',
+ com_ui_hide_prompt_templates: 'Скрыть шаблоны промтов',
+ com_ui_showing: 'Показано',
+ com_ui_of: 'из',
+ com_ui_entries: 'записей',
+ com_ui_pay_per_call: 'Все AI-разговоры в одном месте. Оплачивайте за вызовы, а не за месяц',
+ com_ui_new_footer: 'Все AI-разговоры в одном месте.',
+ com_ui_enter: 'Ввести',
+ com_ui_submit: 'Отправить',
+ com_ui_upload_success: 'Файл успешно загружен',
+ com_ui_upload_invalid: 'Недопустимый файл для загрузки',
com_ui_cancel: 'Отмена',
com_ui_save: 'Сохранить',
- com_ui_submit: 'Отправить',
+ com_ui_copy_to_clipboard: 'Копировать в буфер обмена',
+ com_ui_copied_to_clipboard: 'Скопировано в буфер обмена',
+ com_ui_regenerate: 'Повторная генерация',
+ com_ui_continue: 'Продолжить',
+ com_ui_edit: 'Редактировать',
+ com_ui_success: 'Успешно',
+ com_ui_all: 'все',
+ com_ui_clear: 'Удалить',
+ com_ui_revoke: 'Отозвать',
+ com_ui_revoke_info: 'Отозвать все предоставленные пользователем учетные данные',
com_ui_confirm_action: 'Подтвердить действие',
+ com_ui_chats: 'чаты',
com_ui_delete: 'Удалить',
+ com_ui_preview: 'Предпросмотр',
+ com_ui_upload: 'Загрузить',
+ com_ui_connect: 'Подключить',
com_ui_delete_conversation: 'Удалить чат?',
com_ui_delete_conversation_confirm: 'Будет удален следующий чат: ',
- com_ui_regenerate: 'Повторная генерация',
- com_ui_stop: 'Остановить генерацию',
- com_ui_continue: 'Продолжить',
- com_ui_prompt_templates: 'Шаблоны подсказок',
- com_ui_hide_prompt_templates: 'Скрыть шаблоны подсказок',
- com_ui_showing: 'Показано',
- com_ui_of: 'из',
- com_ui_all: 'все',
- com_ui_entries: 'записей',
- com_ui_pay_per_call: 'Все AI-разговоры в одном месте. Оплачивайте за звонки, а не за месяц',
com_auth_error_login:
'Не удалось войти с предоставленной информацией. Пожалуйста, проверьте ваши учетные данные и попробуйте снова.',
- com_auth_no_account: 'Еще нет аккаунта?',
+ com_auth_error_login_rl:
+ 'Слишком много попыток входа в систему за короткий промежуток времени. Пожалуйста, повторите попытку позже.',
+ com_auth_error_login_ban:
+ 'Ваша учетная запись была временно заблокирована в связи с нарушениями нашего сервиса.',
+ com_auth_error_login_server:
+ 'Произошла внутренняя ошибка сервера. Пожалуйста, подождите несколько минут и повторите попытку.',
+ com_auth_no_account: 'Еще не зарегистрированы?',
com_auth_sign_up: 'Зарегистрироваться',
com_auth_sign_in: 'Войти',
com_auth_google_login: 'Войти с помощью Google',
+ com_auth_facebook_login: 'Войти с помощью Facebook',
com_auth_github_login: 'Войти с помощью Github',
com_auth_discord_login: 'Войти с помощью Discord',
com_auth_email: 'Email',
@@ -74,14 +93,14 @@ export default {
com_auth_name_max_length: 'Имя должно быть короче 80 символов',
com_auth_username: 'Имя пользователя (необязательно)',
com_auth_username_required: 'Имя пользователя обязательно',
- com_auth_username_min_length: 'Имя пользователя должно содержать не менее 3 символов',
+ com_auth_username_min_length: 'Имя пользователя должно содержать не менее 2 символов',
com_auth_username_max_length: 'Имя пользователя должно быть не более 20 символов',
- com_auth_already_have_account: 'Уже есть аккаунт?',
+ com_auth_already_have_account: 'Уже зарегистрированы?',
com_auth_login: 'Войти',
com_auth_reset_password: 'Сбросить пароль',
com_auth_click: 'Нажмите',
com_auth_here: 'ЗДЕСЬ',
- com_auth_to_reset: 'ваш пароль.',
+ com_auth_to_reset_your_password: 'чтобы сбросить ваш пароль.',
com_auth_reset_password_link_sent: 'Письмо отправлено',
com_auth_reset_password_email_sent:
'На вашу почту было отправлено письмо с дальнейшими инструкциями по сбросу пароля.',
@@ -95,14 +114,16 @@ export default {
com_auth_submit_registration: 'Отправить регистрацию',
com_auth_welcome_back: 'Добро пожаловать',
com_endpoint_open_menu: 'Открыть меню',
- com_endpoint_bing_enable_sydney: 'Включить Сидней',
- com_endpoint_bing_to_enable_sydney: 'Чтобы включить Сидней',
+ com_endpoint_bing_enable_sydney: 'Включить Sydney',
+ com_endpoint_bing_to_enable_sydney: 'Чтобы включить Sydney',
com_endpoint_bing_jailbreak: 'Jailbreak',
com_endpoint_bing_context_placeholder:
'Bing может использовать до 7 тысяч токенов для "контекста", на который он может ссылаться в разговоре. Точный предел неизвестен, но превышение 7 тысяч токенов может вызвать ошибки.',
com_endpoint_bing_system_message_placeholder:
- 'ПРЕДУПРЕЖДЕНИЕ: Неправильное использование этой функции может привести к БАНу на использование Bing! Нажмите на "Системное сообщение" для получения полных инструкций и значения по умолчанию, которое является предустановкой "Сидней", считающейся безопасной.',
+ 'ПРЕДУПРЕЖДЕНИЕ: Неправильное использование этой функции может привести к БАНУ на использование Bing! Нажмите на "Системное сообщение" для получения полных инструкций и значения по умолчанию, которое является предустановкой "Sydney", считающейся безопасной.',
com_endpoint_system_message: 'Системное сообщение',
+ com_endpoint_message: 'Сообщение',
+ com_endpoint_message_not_appendable: 'Отредактируйте свое сообщение или перегенерируйте.',
com_endpoint_default_blank: 'по умолчанию: пусто',
com_endpoint_default_false: 'по умолчанию: false',
com_endpoint_default_creative: 'по умолчанию: креативный',
@@ -115,21 +136,21 @@ export default {
com_endpoint_google_temp:
'Более высокие значения = более случайные результаты, более низкие значения = более фокусированные и детерминированные результаты. Мы рекомендуем изменять это или Top P, но не оба значения одновременно.',
com_endpoint_google_topp:
- 'Top P изменяет то, как модель выбирает токены для вывода. Токены выбираются из наиболее вероятных (см. параметр topK) до наименее вероятных, пока сумма их вероятностей не достигнет значения top-p.',
+ 'Top-p изменяет то, как модель выбирает токены для вывода. Токены выбираются из наиболее вероятных K (см. параметр topK) до наименее вероятных, пока сумма их вероятностей не достигнет значения top-p.',
com_endpoint_google_topk:
- 'Top K изменяет то, как модель выбирает токены для вывода. Top K равное 1 означает, что выбирается наиболее вероятный токен из всего словаря модели (так называемое жадное декодирование), а Top K равное 3 означает, что следующий токен выбирается из трех наиболее вероятных токенов (с использованием температуры).',
+ 'Top-k изменяет то, как модель выбирает токены для вывода. Top-k равное 1 означает, что выбирается наиболее вероятный токен из всего словаря модели (так называемое жадное декодирование), а Top-k равное 3 означает, что следующий токен выбирается из трех наиболее вероятных токенов (с использованием температуры).',
com_endpoint_google_maxoutputtokens:
- 'Максимальное количество токенов, которые могут быть сгенерированы в ответе. Укажите меньшее значение для более коротких ответов и большее значение для более длинных ответов.',
- com_endpoint_google_custom_name_placeholder: 'Установите пользовательское имя для Google',
- com_endpoint_google_prompt_prefix_placeholder:
- 'Установите пользовательские инструкции или контекст. Игнорируется, если пусто.',
- com_endpoint_custom_name: 'Пользовательское имя',
- com_endpoint_prompt_prefix: 'Префикс подсказки',
+ ' Максимальное количество токенов, которые могут быть сгенерированы в ответе. Укажите меньшее значение для более коротких ответов и большее значение для более длинных ответов.',
+ com_endpoint_google_custom_name_placeholder: 'Задайте кастомное имя для Google',
+ com_endpoint_prompt_prefix_placeholder:
+ 'Задайте пользовательские инструкции или контекст. Игнорируется, если пусто.',
+ com_endpoint_custom_name: 'Кастомное имя',
+ com_endpoint_prompt_prefix: 'Префикс промта',
com_endpoint_temperature: 'Температура',
com_endpoint_default: 'по умолчанию',
com_endpoint_top_p: 'Top P',
com_endpoint_top_k: 'Top K',
- com_endpoint_max_output_tokens: 'Максимальное количество токенов в выводе',
+ com_endpoint_max_output_tokens: 'Максимальное количество выводимых токенов',
com_endpoint_openai_temp:
'Более высокие значения = более случайные результаты, более низкие значения = более фокусированные и детерминированные результаты. Мы рекомендуем изменять это или Top P, но не оба значения одновременно.',
com_endpoint_openai_max:
@@ -140,9 +161,9 @@ export default {
'Число от -2.0 до 2.0. Положительные значения штрафуют новые токены на основе их частоты в тексте до сих пор, уменьшая вероятность модели повторить ту же строку дословно.',
com_endpoint_openai_pres:
'Число от -2.0 до 2.0. Положительные значения штрафуют новые токены на основе того, появляются ли они в тексте до сих пор, увеличивая вероятность модели говорить о новых темах.',
- com_endpoint_openai_custom_name_placeholder: 'Установите пользовательское имя для ChatGPT',
+ com_endpoint_openai_custom_name_placeholder: 'Задайте кастомное имя для ChatGPT',
com_endpoint_openai_prompt_prefix_placeholder:
- 'Установите пользовательские инструкции для включения в системное сообщение. По умолчанию: нет',
+ 'Задайте кастомные промты для включения в системное сообщение. По умолчанию: нет',
com_endpoint_anthropic_temp:
'Диапазон значений от 0 до 1. Используйте значение temp ближе к 0 для аналитических / множественного выбора и ближе к 1 для креативных и генеративных задач. Мы рекомендуем изменять это или Top P, но не оба значения одновременно.',
com_endpoint_anthropic_topp:
@@ -151,18 +172,40 @@ export default {
'Top K изменяет то, как модель выбирает токены для вывода. Top K равное 1 означает, что выбирается наиболее вероятный токен из всего словаря модели (так называемое жадное декодирование), а Top K равное 3 означает, что следующий токен выбирается из трех наиболее вероятных токенов (с использованием температуры).',
com_endpoint_anthropic_maxoutputtokens:
'Максимальное количество токенов, которые могут быть сгенерированы в ответе. Укажите меньшее значение для более коротких ответов и большее значение для более длинных ответов.',
+ com_endpoint_anthropic_custom_name_placeholder: 'Задайте кастомное имя для Anthropic',
com_endpoint_frequency_penalty: 'Штраф за частоту',
com_endpoint_presence_penalty: 'Штраф за присутствие',
com_endpoint_plug_use_functions: 'Использовать функции',
com_endpoint_plug_skip_completion: 'Пропустить завершение',
- com_endpoint_disabled_with_tools: 'отключено с инструментами',
- com_endpoint_disabled_with_tools_placeholder: 'Отключено с выбранными инструментами',
+ com_endpoint_disabled_with_tools: 'отключено с плагинами',
+ com_endpoint_disabled_with_tools_placeholder: 'Отключено при включённых плагинах',
com_endpoint_plug_set_custom_instructions_for_gpt_placeholder:
- 'Установите пользовательские инструкции для включения в системное сообщение. По умолчанию: нет',
- com_endpoint_set_custom_name: 'Установите пользовательское имя, чтобы найти эту предустановку',
- com_endpoint_preset_name: 'Имя предустановки',
+ 'Задайте кастомные инструкции для включения в системное сообщение. По умолчанию: нет',
+ com_endpoint_import: 'Импортировать',
+ com_endpoint_set_custom_name:
+ 'Задайте кастомное имя на случай, если вы сможете найти эту предустановку :)',
+ com_endpoint_preset_delete_confirm: 'Вы уверены, что хотите удалить этот пресет?',
+ com_endpoint_preset_clear_all_confirm: 'Вы уверены, что хотите удалить все ваши пресеты?',
+ com_endpoint_preset_import: 'Пресет Импортирован!',
+ com_endpoint_preset_import_error:
+ 'Произошла ошибка при импорте вашего пресета. Пожалуйста, попробуйте еще раз.',
+ com_endpoint_preset_save_error:
+ 'Произошла ошибка при сохранении вашего пресета. Пожалуйста, попробуйте еще раз.',
+ com_endpoint_preset_delete_error:
+ 'Произошла ошибка при удалении вашего пресета. Пожалуйста, попробуйте еще раз.',
+ com_endpoint_preset_default_removed: 'больше не пресет по умолчанию.',
+ com_endpoint_preset_default_item: 'По умолчанию:',
+ com_endpoint_preset_default_none: 'Нет активных пресетов По умолчанию.',
+ com_endpoint_preset_title: 'Пресет',
+ com_endpoint_preset_saved: 'Сохранено!',
+ com_endpoint_preset_default: 'теперь пресет По умолчаанию.',
+ com_endpoint_preset: 'пресет',
+ com_endpoint_presets: 'пресеты',
+ com_endpoint_preset_selected: 'Пресет Активирован!',
+ com_endpoint_preset_selected_title: 'Активирован!',
+ com_endpoint_preset_name: 'Имя пресета',
com_endpoint_new_topic: 'Новая тема',
- com_endpoint: 'Конечная точка',
+ com_endpoint: 'Эндпоинт',
com_endpoint_hide: 'Скрыть',
com_endpoint_show: 'Показать',
com_endpoint_examples: 'Примеры',
@@ -171,41 +214,68 @@ export default {
com_endpoint_show_what_settings: 'Показать настройки {0}',
com_endpoint_save: 'Сохранить',
com_endpoint_export: 'Экспортировать',
- com_endpoint_import: 'Импортировать',
- com_endpoint_save_as_preset: 'Сохранить как предустановку',
- com_endpoint_not_implemented: 'Не реализовано',
- com_endpoint_no_presets: 'Пока нет предустановок',
- com_endpoint_not_available: 'Нет доступных конечных точек',
- com_endpoint_clear_all: 'Очистить все',
- com_endpoint_view_options: 'Просмотреть параметры',
- com_endpoint_save_convo_as_preset: 'Сохранить разговор как предустановку',
+ com_endpoint_save_as_preset: 'Сохранить как Пресет',
com_endpoint_presets_clear_warning:
- 'Вы уверены, что хотите очистить все предустановки? Эти действия необратимы, и восстановление невозможно.',
- com_endpoint_presets: 'предустановки',
- com_endpoint_my_preset: 'Моя предустановка',
- com_endpoint_config_key: 'Установить ключ API',
- com_endpoint_config_key_for: 'Установить ключ API для',
- com_endpoint_config_key_name: 'Ключ',
- com_endpoint_config_value: 'Введите значение для',
- com_endpoint_config_key_name_placeholder: 'Установите сначала ключ API',
- com_endpoint_config_key_import_json_key: 'Импортировать JSON-ключ учетной записи.',
+ 'Вы уверены, что хотите удалить все пресеты? Это действие необратимо и восстановление невозможно.',
+ com_endpoint_not_implemented: 'Не реализовано',
+ com_endpoint_no_presets: 'Пока нет пресетов, используйте кнопку настроек чтобы создать его',
+ com_endpoint_not_available: 'Нет доступных эндпоинтов',
+ com_endpoint_view_options: 'Просмотреть Настройки',
+ com_endpoint_save_convo_as_preset: 'Сохранить текущий разговор как Пресет',
+ com_endpoint_my_preset: 'Мой Пресет',
com_endpoint_agent_model: 'Модель агента (Рекомендуется: GPT-3.5)',
com_endpoint_completion_model: 'Модель завершения (Рекомендуется: GPT-4)',
- com_endpoint_func_hover: 'Включить использование плагинов в качестве функций OpenAI',
+ com_endpoint_func_hover: 'Включить использование плагинов как функции OpenAI',
com_endpoint_skip_hover:
'Пропустить этап завершения, который проверяет окончательный ответ и сгенерированные шаги',
com_endpoint_config_token: 'Токен конфигурации',
+ com_endpoint_config_key: 'Указать ключ к API',
+ com_endpoint_config_placeholder: 'Укажите ваш ключ к API в меню сверху для начала разговора.',
+ com_endpoint_config_key_for: 'Установить ключ к API для',
+ com_endpoint_config_key_name: 'Ключ',
+ com_endpoint_config_value: 'Введите значение для',
+ com_endpoint_config_key_name_placeholder: 'Сначала укажите ключ к API',
+ com_endpoint_config_key_encryption: 'Ваш ключ зашифрован и будет удалён',
+ com_endpoint_config_key_expiry: 'срок действия',
+ com_endpoint_config_click_here: 'Нажми Здесь',
+ com_endpoint_config_google_service_key: 'Google Service Account Key',
+ com_endpoint_config_google_cloud_platform: '(из Google Cloud Platform)',
+ com_endpoint_config_google_api_key: 'Google API Key',
+ com_endpoint_config_google_gemini_api: '(Gemini API)',
+ com_endpoint_config_google_api_info:
+ 'Чтобы получить ключ к API Generative Language (для Gemini),',
+ com_endpoint_config_key_import_json_key: 'Импортировать Service Account JSON Key.',
+ com_endpoint_config_key_import_json_key_success: 'Успешно Импортирован Service Account JSON Key',
+ com_endpoint_config_key_import_json_key_invalid:
+ 'Некорректный Service Account JSON Key, Вы импортировали верный файл?',
+ com_endpoint_config_key_get_edge_key: 'Чтобы получить ваш токен доступа к Bing, войдите в',
+ com_endpoint_config_key_get_edge_key_dev_tool:
+ 'Пока вы на сайте, используйте dev tools или расширение чтобы скопировать содержимое куки _U. Если не получается, следуйте этим',
+ com_endpoint_config_key_edge_instructions: 'инструкциям',
+ com_endpoint_config_key_edge_full_key_string: 'чтобы получить все строки cookie.',
+ com_endpoint_config_key_chatgpt:
+ 'Чтобы получить токен доступа к "Бесплатной Версии" ChatGPT, войдите в',
+ com_endpoint_config_key_chatgpt_then_visit: 'затем посетите',
+ com_endpoint_config_key_chatgpt_copy_token: 'Скопируйте токен доступа.',
+ com_endpoint_config_key_google_need_to: 'Вам нужно',
+ com_endpoint_config_key_google_vertex_ai: 'Активировать Vertex AI',
+ com_endpoint_config_key_google_vertex_api: 'API в Google Cloud, после',
+ com_endpoint_config_key_google_service_account: 'Создать Service Account',
+ com_endpoint_config_key_google_vertex_api_role:
+ 'Убедитесь что нажали на \'Create and Continue\' чтобы получить как минимум \'Vertex AI User\'. Наконец, создайте JSON-ключ чтобы импортировать его сюда.',
+ com_nav_welcome_message: 'Чем я могу помочь вам сегодня?',
+ com_nav_auto_scroll: 'Автоматически проматывать к самым новым сообщениям при открытии',
com_nav_plugin_store: 'Магазин плагинов',
com_nav_plugin_search: 'Поиск плагинов',
com_nav_plugin_auth_error:
'При попытке аутентификации этого плагина произошла ошибка. Пожалуйста, попробуйте еще раз.',
com_nav_export_filename: 'Имя файла',
- com_nav_export_filename_placeholder: 'Установите имя файла',
+ com_nav_export_filename_placeholder: 'Задайте имя файла',
com_nav_export_type: 'Тип',
- com_nav_export_include_endpoint_options: 'Включить параметры конечной точки',
+ com_nav_export_include_endpoint_options: 'Включить параметры эндпоинта',
com_nav_enabled: 'Включено',
com_nav_not_supported: 'Не поддерживается',
- com_nav_export_all_message_branches: 'Экспортировать все ветви сообщений',
+ com_nav_export_all_message_branches: 'Экспортировать все ветки сообщений',
com_nav_export_recursive_or_sequential: 'Рекурсивно или последовательно?',
com_nav_export_recursive: 'Рекурсивно',
com_nav_export_conversation: 'Экспортировать разговор',
@@ -213,22 +283,25 @@ export default {
com_nav_theme_system: 'Системная',
com_nav_theme_dark: 'Темная',
com_nav_theme_light: 'Светлая',
- com_nav_language: 'Локализация (Альфа)',
+ com_nav_language: 'Локализация',
+ com_nav_setting_account: 'Аккаунт',
+ com_nav_profile_picture: 'Изображение профиля',
+ com_nav_change_picture: 'Изменить изображение',
+ com_nav_lang_auto: 'Автоопределение',
com_nav_clear: 'Очистить',
- com_nav_clear_all_chats: 'Очистить все чаты',
- com_nav_confirm_clear: 'Подтвердить очистку',
- com_nav_auto_scroll: 'Автоматическая прокрутка к новым сообщениям в режиме открытия',
+ com_nav_clear_all_chats: 'Удалить все чаты',
+ com_nav_confirm_clear: 'Подтвердить удаление',
com_nav_close_sidebar: 'Закрыть боковую панель',
com_nav_open_sidebar: 'Открыть боковую панель',
com_nav_send_message: 'Отправить сообщение',
com_nav_log_out: 'Выйти',
com_nav_user: 'ПОЛЬЗОВАТЕЛЬ',
- com_nav_clear_conversation: 'Очистить разговоры',
+ com_nav_clear_conversation: 'Удалить разговоры',
com_nav_clear_conversation_confirm_message:
- 'Вы уверены, что хотите очистить все разговоры? Это действие нельзя отменить.',
- com_nav_help_faq: 'Помощь и часто задаваемые вопросы',
- com_nav_setting_data: 'Управление данными',
+ 'Вы уверены, что хотите удалить все разговоры? Это действие нельзя отменить.',
+ com_nav_help_faq: 'Помощь и ЧаВо',
com_nav_settings: 'Настройки',
com_nav_search_placeholder: 'Поиск сообщений',
com_nav_setting_general: 'Общие',
+ com_nav_setting_data: 'Управление данными',
};
diff --git a/client/src/localization/languages/Zh.tsx b/client/src/localization/languages/Zh.tsx
index 01ef650af9b..ffe8552a842 100644
--- a/client/src/localization/languages/Zh.tsx
+++ b/client/src/localization/languages/Zh.tsx
@@ -246,5 +246,4 @@ export default {
com_nav_search_placeholder: '搜索对话及对话内容',
com_nav_setting_general: '通用',
com_nav_setting_data: '数据管理',
- com_nav_language: '语言',
};
diff --git a/client/src/mobile.css b/client/src/mobile.css
index 17cc9ef5d9f..1643d305f25 100644
--- a/client/src/mobile.css
+++ b/client/src/mobile.css
@@ -121,3 +121,12 @@
.hide-scrollbar::-webkit-scrollbar {
display: none; /* For WebKit browsers */
}
+
+.gemini-gradient {
+ /* Adjust the colors and positioning as necessary to match the image */
+ background-image: radial-gradient(circle at center, #0000ff, #87cefa, #ffffff);
+ /* More styling for demonstration purposes */
+ border-radius: 50%;
+ height: 100px;
+ width: 100px;
+}
\ No newline at end of file
diff --git a/client/src/routes/ChatRoute.tsx b/client/src/routes/ChatRoute.tsx
index 95be81d7959..8bbb371e43e 100644
--- a/client/src/routes/ChatRoute.tsx
+++ b/client/src/routes/ChatRoute.tsx
@@ -1,7 +1,11 @@
import { useRecoilValue } from 'recoil';
import { useEffect, useRef } from 'react';
import { useParams } from 'react-router-dom';
-import { useGetConvoIdQuery, useGetModelsQuery } from 'librechat-data-provider/react-query';
+import {
+ useGetConvoIdQuery,
+ useGetModelsQuery,
+ useGetEndpointsQuery,
+} from 'librechat-data-provider/react-query';
import { useNewConvo, useConfigOverride } from '~/hooks';
import ChatView from '~/components/Chat/ChatView';
import useAuthRedirect from './useAuthRedirect';
@@ -21,12 +25,23 @@ export default function ChatRoute() {
const initialConvoQuery = useGetConvoIdQuery(conversationId ?? '', {
enabled: isAuthenticated && conversationId !== 'new',
});
+ const endpointsQuery = useGetEndpointsQuery({ enabled: isAuthenticated && modelsQueryEnabled });
useEffect(() => {
- if (conversationId === 'new' && modelsQuery.data && !hasSetConversation.current) {
+ if (
+ conversationId === 'new' &&
+ endpointsQuery.data &&
+ modelsQuery.data &&
+ !hasSetConversation.current
+ ) {
newConversation({ modelsData: modelsQuery.data });
hasSetConversation.current = true;
- } else if (initialConvoQuery.data && modelsQuery.data && !hasSetConversation.current) {
+ } else if (
+ initialConvoQuery.data &&
+ endpointsQuery.data &&
+ modelsQuery.data &&
+ !hasSetConversation.current
+ ) {
newConversation({
template: initialConvoQuery.data,
modelsData: modelsQuery.data,
@@ -34,7 +49,7 @@ export default function ChatRoute() {
hasSetConversation.current = true;
}
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [initialConvoQuery.data, modelsQuery.data]);
+ }, [initialConvoQuery.data, modelsQuery.data, endpointsQuery.data]);
if (!isAuthenticated) {
return null;
diff --git a/client/src/store/models.ts b/client/src/store/models.ts
index c05dd0c55b5..53c1b5e1b25 100644
--- a/client/src/store/models.ts
+++ b/client/src/store/models.ts
@@ -1,10 +1,13 @@
import { atom } from 'recoil';
-import { TModelsConfig, EModelEndpoint, openAIModels } from 'librechat-data-provider';
+import { EModelEndpoint, defaultModels } from 'librechat-data-provider';
+import type { TModelsConfig } from 'librechat-data-provider';
const fitlerAssistantModels = (str: string) => {
return /gpt-4|gpt-3\\.5/i.test(str) && !/vision|instruct/i.test(str);
};
+const openAIModels = defaultModels[EModelEndpoint.openAI];
+
const modelsConfig = atom({
key: 'models',
default: {
@@ -14,14 +17,8 @@ const modelsConfig = atom({
[EModelEndpoint.azureOpenAI]: openAIModels,
[EModelEndpoint.bingAI]: ['BingAI', 'Sydney'],
[EModelEndpoint.chatGPTBrowser]: ['text-davinci-002-render-sha'],
- [EModelEndpoint.google]: ['chat-bison', 'text-bison', 'codechat-bison'],
- [EModelEndpoint.anthropic]: [
- 'claude-1',
- 'claude-1-100k',
- 'claude-instant-1',
- 'claude-instant-1-100k',
- 'claude-2',
- ],
+ [EModelEndpoint.google]: defaultModels[EModelEndpoint.google],
+ [EModelEndpoint.anthropic]: defaultModels[EModelEndpoint.anthropic],
},
});
diff --git a/client/src/store/user.ts b/client/src/store/user.ts
index 04864d34263..d86bdc23730 100644
--- a/client/src/store/user.ts
+++ b/client/src/store/user.ts
@@ -1,9 +1,9 @@
import { atom } from 'recoil';
-import { TPlugin } from 'librechat-data-provider';
+import type { TUser, TPlugin } from 'librechat-data-provider';
-const user = atom({
+const user = atom({
key: 'user',
- default: null,
+ default: undefined,
});
const availableTools = atom({
diff --git a/client/src/utils/json.ts b/client/src/utils/json.ts
index f601b0df950..fb89377ed67 100644
--- a/client/src/utils/json.ts
+++ b/client/src/utils/json.ts
@@ -1,3 +1,12 @@
+export function isJson(str: string) {
+ try {
+ JSON.parse(str);
+ } catch (e) {
+ return false;
+ }
+ return true;
+}
+
export function formatJSON(json: string) {
try {
return JSON.stringify(JSON.parse(json), null, 2);
diff --git a/client/vite.config.ts b/client/vite.config.ts
index 90d55faec17..b5030bd55d4 100644
--- a/client/vite.config.ts
+++ b/client/vite.config.ts
@@ -56,7 +56,7 @@ export default defineConfig({
resolve: {
alias: {
'~': path.join(__dirname, 'src/'),
- $fonts: resolve('/fonts'),
+ $fonts: resolve('public/fonts'),
},
},
});
diff --git a/config/add-balance.js b/config/add-balance.js
index ed2e6128983..75b9b4cda9a 100644
--- a/config/add-balance.js
+++ b/config/add-balance.js
@@ -1,34 +1,11 @@
-const connectDb = require('../api/lib/db/connectDb');
-const { askQuestion, silentExit } = require('./helpers');
-const User = require('../api/models/User');
-const Transaction = require('../api/models/Transaction');
+const path = require('path');
+require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
+const { askQuestion, silentExit, connectWithTimeout } = require('./helpers');
+const Transaction = require('~/models/Transaction');
+const User = require('~/models/User');
(async () => {
- /**
- * Connect to the database
- * - If it takes a while, we'll warn the user
- */
- // Warn the user if this is taking a while
- let timeout = setTimeout(() => {
- console.orange(
- 'This is taking a while... You may need to check your connection if this fails.',
- );
- timeout = setTimeout(() => {
- console.orange('Still going... Might as well assume the connection failed...');
- timeout = setTimeout(() => {
- console.orange('Error incoming in 3... 2... 1...');
- }, 13000);
- }, 10000);
- }, 5000);
- // Attempt to connect to the database
- try {
- console.orange('Warming up the engines...');
- await connectDb();
- clearTimeout(timeout);
- } catch (e) {
- console.error(e);
- silentExit(1);
- }
+ await connectWithTimeout();
/**
* Show the welcome / help menu
diff --git a/config/ban-user.js b/config/ban-user.js
index 45e628aeca4..a2c01a1cefa 100644
--- a/config/ban-user.js
+++ b/config/ban-user.js
@@ -1,34 +1,11 @@
-const connectDb = require('../api/lib/db/connectDb');
-const { askQuestion, silentExit } = require('./helpers');
-const banViolation = require('../api/cache/banViolation');
-const User = require('../api/models/User');
+const path = require('path');
+require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
+const { askQuestion, silentExit, connectWithTimeout } = require('./helpers');
+const banViolation = require('~/cache/banViolation');
+const User = require('~/models/User');
(async () => {
- /**
- * Connect to the database
- * - If it takes a while, we'll warn the user
- */
- // Warn the user if this is taking a while
- let timeout = setTimeout(() => {
- console.orange(
- 'This is taking a while... You may need to check your connection if this fails.',
- );
- timeout = setTimeout(() => {
- console.orange('Still going... Might as well assume the connection failed...');
- timeout = setTimeout(() => {
- console.orange('Error incoming in 3... 2... 1...');
- }, 13000);
- }, 10000);
- }, 5000);
- // Attempt to connect to the database
- try {
- console.orange('Warming up the engines...');
- await connectDb();
- clearTimeout(timeout);
- } catch (e) {
- console.error(e);
- silentExit(1);
- }
+ await connectWithTimeout();
console.purple('---------------------');
console.purple('Ban a user account!');
diff --git a/config/create-user.js b/config/create-user.js
index c854b137a96..cd0c7132559 100644
--- a/config/create-user.js
+++ b/config/create-user.js
@@ -1,34 +1,11 @@
-const connectDb = require('../api/lib/db/connectDb');
-const { registerUser } = require('../api/server/services/AuthService');
-const { askQuestion, silentExit } = require('./helpers');
-const User = require('../api/models/User');
+const path = require('path');
+require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
+const { registerUser } = require('~/server/services/AuthService');
+const { askQuestion, silentExit, connectWithTimeout } = require('./helpers');
+const User = require('~/models/User');
(async () => {
- /**
- * Connect to the database
- * - If it takes a while, we'll warn the user
- */
- // Warn the user if this is taking a while
- let timeout = setTimeout(() => {
- console.orange(
- 'This is taking a while... You may need to check your connection if this fails.',
- );
- timeout = setTimeout(() => {
- console.orange('Still going... Might as well assume the connection failed...');
- timeout = setTimeout(() => {
- console.orange('Error incoming in 3... 2... 1...');
- }, 13000);
- }, 10000);
- }, 5000);
- // Attempt to connect to the database
- try {
- console.orange('Warming up the engines...');
- await connectDb();
- clearTimeout(timeout);
- } catch (e) {
- console.error(e);
- silentExit(1);
- }
+ await connectWithTimeout();
/**
* Show the welcome / help menu
diff --git a/config/delete-user.js b/config/delete-user.js
new file mode 100644
index 00000000000..fe7efe057d3
--- /dev/null
+++ b/config/delete-user.js
@@ -0,0 +1,48 @@
+const path = require('path');
+require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
+const { connectWithTimeout, askQuestion, silentExit } = require('./helpers');
+const User = require('~/models/User');
+
+(async () => {
+ await connectWithTimeout();
+
+ /**
+ * Show the welcome / help menu
+ */
+ console.purple('---------------');
+ console.purple('Deleting a user');
+ console.purple('---------------');
+
+ let email = '';
+ if (process.argv.length >= 3) {
+ email = process.argv[2];
+ } else {
+ email = await askQuestion('Email:');
+ }
+ let user = await User.findOne({ email: email });
+ if (user !== null) {
+ if ((await askQuestion(`Delete user ${user}?`)) === 'y') {
+ user = await User.findOneAndDelete({ _id: user._id });
+ if (user !== null) {
+ console.yellow(`Deleted user ${user}`);
+ } else {
+ console.yellow(`Couldn't delete user with email ${email}`);
+ }
+ }
+ } else {
+ console.yellow(`Didn't find user with email ${email}`);
+ }
+
+ silentExit(0);
+})();
+
+process.on('uncaughtException', (err) => {
+ if (!err.message.includes('fetch failed')) {
+ console.error('There was an uncaught error:');
+ console.error(err);
+ }
+
+ if (!err.message.includes('fetch failed')) {
+ process.exit(1);
+ }
+});
diff --git a/config/helpers.js b/config/helpers.js
index 6bc6ed0ef2a..2b634612d4a 100644
--- a/config/helpers.js
+++ b/config/helpers.js
@@ -6,6 +6,8 @@ const fs = require('fs');
const path = require('path');
const readline = require('readline');
const { execSync } = require('child_process');
+require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
+const connectDb = require('~/lib/db/connectDb');
const askQuestion = (query) => {
const rl = readline.createInterface({
@@ -43,6 +45,33 @@ const silentExit = (code = 0) => {
process.exit(code);
};
+async function connectWithTimeout() {
+ /**
+ * Connect to the database
+ * - If it takes a while, we'll warn the user
+ */
+ let timeout = setTimeout(() => {
+ console.orange(
+ 'This is taking a while... You may need to check your connection if this fails.',
+ );
+ timeout = setTimeout(() => {
+ console.orange('Still going... Might as well assume the connection failed...');
+ timeout = setTimeout(() => {
+ console.orange('Error incoming in 3... 2... 1...');
+ }, 13000);
+ }, 10000);
+ }, 5000);
+ // Attempt to connect to the database
+ try {
+ console.orange('Warming up the engines...');
+ await connectDb();
+ clearTimeout(timeout);
+ } catch (e) {
+ console.error(e);
+ silentExit(1);
+ }
+}
+
// Set the console colours
console.orange = (msg) => console.log('\x1b[33m%s\x1b[0m', msg);
console.green = (msg) => console.log('\x1b[32m%s\x1b[0m', msg);
@@ -58,5 +87,6 @@ module.exports = {
askQuestion,
silentExit,
isDockerRunning,
+ connectWithTimeout,
deleteNodeModules,
};
diff --git a/config/list-balances.js b/config/list-balances.js
new file mode 100644
index 00000000000..670aba6e5d9
--- /dev/null
+++ b/config/list-balances.js
@@ -0,0 +1,39 @@
+const path = require('path');
+require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
+const { connectWithTimeout, silentExit } = require('./helpers');
+const Balance = require('~/models/Balance');
+const User = require('~/models/User');
+
+(async () => {
+ await connectWithTimeout();
+
+ /**
+ * Show the welcome / help menu
+ */
+ console.purple('-----------------------------');
+ console.purple('Show the balance of all users');
+ console.purple('-----------------------------');
+
+ let users = await User.find({});
+ for (const user of users) {
+ let balance = await Balance.findOne({ user: user._id });
+ if (balance !== null) {
+ console.green(`User ${user.name} has a balance of ${balance.tokenCredits}`);
+ } else {
+ console.yellow(`User ${user.name} has no balance`);
+ }
+ }
+
+ silentExit(0);
+})();
+
+process.on('uncaughtException', (err) => {
+ if (!err.message.includes('fetch failed')) {
+ console.error('There was an uncaught error:');
+ console.error(err);
+ }
+
+ if (!err.message.includes('fetch failed')) {
+ process.exit(1);
+ }
+});
diff --git a/config/loader.js b/config/loader.js
index c0e3413528b..a29ca19a0a4 100644
--- a/config/loader.js
+++ b/config/loader.js
@@ -1,7 +1,7 @@
-const dotenv = require('dotenv');
-const path = require('path');
const fs = require('fs');
+const path = require('path');
const crypto = require('crypto');
+const dotenv = require('dotenv');
/**
* This class is responsible for loading the environment variables
diff --git a/config/packages.js b/config/packages.js
index 7e4b0f011bc..0b457a7bfe8 100644
--- a/config/packages.js
+++ b/config/packages.js
@@ -1,6 +1,6 @@
-const { execSync } = require('child_process');
-const path = require('path');
const fs = require('fs');
+const path = require('path');
+const { execSync } = require('child_process');
const { deleteNodeModules } = require('./helpers');
diff --git a/config/stop-backend.js b/config/stop-backend.js
index e863a03eeec..8e8f23dbdc2 100644
--- a/config/stop-backend.js
+++ b/config/stop-backend.js
@@ -1,7 +1,5 @@
-// eslint-disable-next-line
-const helpers = require('./helpers');
-const { exec } = require('child_process');
const { promisify } = require('util');
+const { exec } = require('child_process');
const isWindows = process.platform === 'win32';
const execAsync = promisify(exec);
diff --git a/config/update.js b/config/update.js
index 5a36326f23a..fd947eda393 100644
--- a/config/update.js
+++ b/config/update.js
@@ -1,5 +1,5 @@
-const { execSync } = require('child_process');
const path = require('path');
+const { execSync } = require('child_process');
const { askQuestion, isDockerRunning, deleteNodeModules, silentExit } = require('./helpers');
const config = {
diff --git a/config/upgrade.js b/config/upgrade.js
index d0477de50c0..c954cf0452a 100644
--- a/config/upgrade.js
+++ b/config/upgrade.js
@@ -1,8 +1,8 @@
/**
* Upgrade script
*/
-const dotenv = require('dotenv');
const fs = require('fs');
+const dotenv = require('dotenv');
const { exit } = require('process');
// Suppress default warnings
diff --git a/docker-compose.override.yml.example b/docker-compose.override.yml.example
new file mode 100644
index 00000000000..4d05fd6bf89
--- /dev/null
+++ b/docker-compose.override.yml.example
@@ -0,0 +1,67 @@
+version: '3.4'
+
+# # TO USE THIS FILE, FIRST UNCOMMENT THE FOLLOWING LINE ('services:')
+
+# services:
+
+# # THEN UNCOMMENT ONLY THE SECTION OR SECTIONS CONTAINING THE CHANGES YOU WANT TO APPLY
+# # SAVE THIS FILE AS 'docker-compose.override.yaml'
+# # AND USE THE 'docker-compose build' & 'docker-compose up -d' COMMANDS AS YOU WOULD NORMALLY DO
+
+# # BUILD FROM LATEST IMAGE
+# api:
+# image: ghcr.io/danny-avila/librechat-dev:latest
+
+# # BUILD FROM LATEST IMAGE (NUMBERED RELEASE)
+# api:
+# image: ghcr.io/danny-avila/librechat:latest
+
+# # BUILD FROM LATEST API IMAGE
+# api:
+# image: ghcr.io/danny-avila/librechat-dev-api:latest
+
+# # BUILD FROM LATEST API IMAGE (NUMBERED RELEASE)
+# api:
+# image: ghcr.io/danny-avila/librechat-api:latest
+
+# # ADD MONGO-EXPRESS
+# mongo-express:
+# image: mongo-express
+# container_name: mongo-express
+# environment:
+# ME_CONFIG_MONGODB_SERVER: mongodb
+# ME_CONFIG_BASICAUTH_USERNAME: admin
+# ME_CONFIG_BASICAUTH_PASSWORD: password
+# ports:
+# - '8081:8081'
+# depends_on:
+# - mongodb
+# restart: always
+
+# # USE MONGODB V4.4.18 - FOR OLDER CPU WITHOUT AVX SUPPORT
+# mongodb:
+# image: mongo:4.4.18
+
+# # DISABLE THE MONGODB CONTAINER - YOU NEED TO SET AN ALTERNATIVE MONGODB URI IN THE .ENV FILE
+# api:
+# environment:
+# - MONGO_URI=${MONGO_URI}
+# mongodb:
+# image: tianon/true
+# command: ""
+# entrypoint: ""
+
+# # EXPOSE MONGODB PORTS - USE CAREFULLY, THIS MAKES YOUR DATABASE VULNERABLE TO ATTACKS
+# mongodb:
+# ports:
+# - 27018:27017
+
+# # DISABLE MEILISEARCH
+# meilisearch:
+# profiles:
+# - donotstart
+
+# # EXPOSE MEILISEARCH PORTS - DO NOT USE THE DEFAULT VALUE FOR THE MASTER KEY IF YOU DO THIS
+# meilisearch:
+# ports:
+# - 7700:7700
diff --git a/docker-compose.yml b/docker-compose.yml
index b4f09301238..5f7fb0b77f2 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,44 +1,32 @@
version: "3.4"
+# Do not edit this file directly. Use a ‘docker-compose.override.yaml’ file if you can.
+# Refer to `docker-compose.override.yaml.example’ for some sample configurations.
+
services:
- # client:
- # image: nginx-client
- # build:
- # context: .
- # target: nginx-client
- # restart: always
- # ports:
- # - 3080:80
- # volumes:
- # - /client/node_modules
- # depends_on:
- # - api
api:
container_name: LibreChat
ports:
- - 3080:3080 # Change it to 9000:3080 to use nginx
+ - 3080:3080
depends_on:
- mongodb
- image: librechat # Comment this & uncomment below to build from docker hub image
- build: # ^------
- context: . # ^------
- target: node # ^------v
- # image: ghcr.io/danny-avila/librechat:latest # Uncomment this & comment above to build from docker hub image
+ image: librechat
+ build:
+ context: .
+ target: node
restart: always
user: "${UID}:${GID}"
- extra_hosts: # if you are running APIs on docker you need access to, you will need to uncomment this line and next
+ extra_hosts:
- "host.docker.internal:host-gateway"
env_file:
- .env
environment:
- HOST=0.0.0.0
- MONGO_URI=mongodb://mongodb:27017/LibreChat
- # - CHATGPT_REVERSE_PROXY=http://host.docker.internal:8080/api/conversation # if you are hosting your own chatgpt reverse proxy with docker
- # - OPENAI_REVERSE_PROXY=http://host.docker.internal:8070/v1/chat/completions # if you are hosting your own chatgpt reverse proxy with docker
- MEILI_HOST=http://meilisearch:7700
- MEILI_HTTP_ADDR=meilisearch:7700
volumes:
- - /app/client/node_modules # node_modules mapping necessary for module persistence
+ - /app/client/node_modules
- /app/api/node_modules
- ./api:/app/api
- ./.env:/app/.env
@@ -47,8 +35,6 @@ services:
- ./images:/app/client/public/images
mongodb:
container_name: chat-mongodb
- # ports: # Uncomment this to access mongodb from outside docker, not safe in deployment
- # - 27018:27017
image: mongo
restart: always
user: "${UID}:${GID}"
@@ -59,8 +45,6 @@ services:
container_name: chat-meilisearch
image: getmeili/meilisearch:v1.5
restart: always
- # ports: # Uncomment this to access meilisearch from outside docker
- # - 7700:7700 # if exposing these ports, make sure your master key is not the default value
env_file:
- .env
user: "${UID}:${GID}"
diff --git a/docs/assets/LibreChat.svg b/docs/assets/LibreChat.svg
index 75e3835313f..36a536d654b 100644
--- a/docs/assets/LibreChat.svg
+++ b/docs/assets/LibreChat.svg
@@ -1,34 +1,32 @@
-
-
-
diff --git a/docs/contributions/coding_conventions.md b/docs/contributions/coding_conventions.md
index 5965dc33f3f..a75c3bd2103 100644
--- a/docs/contributions/coding_conventions.md
+++ b/docs/contributions/coding_conventions.md
@@ -1,3 +1,8 @@
+---
+title: 🧑💻 Code Standards and Conventions
+description: This guide covers the best practices for JavaScript coding, such as following the Airbnb Style Guide, using CommonJS modules, structuring the API using Express, Mongoose, and services, and testing and documenting the code using Jest, Supertest, Playwright, JSDoc, and TypeScript.
+weight: -7
+---
# Coding Conventions
## Node.js API Server
@@ -63,7 +68,7 @@ Defines Mongoose models to represent data entities and their relationships.
### 4. Database Access (MongoDB and Mongoose)
-- Use Mongoose (https://mongoosejs.com) as the MongoDB ODM.
+- Use Mongoose ([https://mongoosejs.com](https://mongoosejs.com)) as the MongoDB ODM.
- Create separate model files for each entity and ensure clear separation of concerns.
- Use Mongoose schema validation to enforce data integrity.
- Handle database connections efficiently and avoid connection leaks.
diff --git a/docs/contributions/documentation_guidelines.md b/docs/contributions/documentation_guidelines.md
index 6a01376979f..a3d05d688ac 100644
--- a/docs/contributions/documentation_guidelines.md
+++ b/docs/contributions/documentation_guidelines.md
@@ -1,28 +1,42 @@
+---
+title: 📝 Documentation Guidelines
+description: Learn how to write and format documentation for LibreChat.
+weight: -9
+---
# Documentation Guidelines
This document explains how to write and format documentation for LibreChat.
## New Documents
- Use lowercase letters and underscores to name new documents (e.g. `documentation_guidelines.md`).
-- For new features, create new documentation and place it in the relevant folder/sub-folder under [docs](../docs/).
- - If the feature adds new functionality, add it to the feature section of the main [README.md](../../README.md).
-- When you create a new document, **add it to both table of contents:**
- - [README.md](../../README.md)
- - [mkdocs.yml](../../mkdocs.yml)
+- For new features, create new documentation and place it in the relevant folder/sub-folder under `../docs`.
+ - If the feature adds new functionality, add it to the feature section of the main `README.md` as well as in `../docs/index.md`.
+- When you create a new document, **you need to add it to two table of contents:**
+ - in `README.md`
+ - and in the `index.md` file in the folder where your doc is located
-## Formatting
+## Markdown Formatting
- Use `#`, `##`, and `###` for headings and subheadings.
- Use `#` for the title of the document.
- Use `##` for the main sections of the document.
- Use `###` for the sub-sections within a section.
-- Use `**` to make text bold to highlight important information (not in place of a heading).
+- Use `**` to make text **bold** to highlight important information (do not use in place of a heading).
- Use relative paths for links to other documents.
- You can use HTML to add more features to a document.
+- By default the title indexed by mkdocs will be the first heading. You can override this by adding metadata at the top of your document:
+```bash
+---
+title: Document Title
+description: This description will be used in social cards
+weight: 0
+---
+```
+- Setting the weight in the document metadata will influence its position in the table of contents. Lowest weight are placed first. Not setting it will default to `0`. When multiple docs have the same weight it sorts in alphabetical order.
## Important Notes
- **⚠️Keep it organized and structured⚠️**
- Do not add unrelated information to an existing document. Create a new one if needed.
-- All assets should be uploaded in the document from GitHub's webui:
+- All assets should be uploaded in the document from GitHub's webui
- **Before submitting a PR, double-check on GitHub that everything is properly displayed and that all links work correctly.**

diff --git a/docs/contributions/how_to_contribute.md b/docs/contributions/how_to_contribute.md
new file mode 100644
index 00000000000..5b71da5b585
--- /dev/null
+++ b/docs/contributions/how_to_contribute.md
@@ -0,0 +1,69 @@
+---
+title: 🙌 Beginner's Guide to Contributions
+description: Learn how to use GitHub Desktop, VS Code extensions, and Git rebase to contribute in a quick and easy way.
+weight: -10
+---
+# How to Contribute in a Quick and Easy Way
+> **❗Note:** If you are not familiar with the concept of repo, PR (pull request), fork and branch, start by looking at the official GitHub documentation on the subject:
+[https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models)
+
+## Installation of Tools
+
+1. [Git](https://git-scm.com/downloads) is essential, the first thing to download.
+2. [Git LFS](https://git-lfs.com/) can be useful for uploading files with larger sizes.
+3. [Github Desktop](https://desktop.github.com/) - I use it only for UI; I don't recommend using it for pushing or other actions.
+
+## How to Use?
+
+This will be a somewhat raw text, but I'll try to be as clear as possible.
+
+I recommend installing the following extensions in VS Code:
+
+- [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
+- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
+- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
+
+### Example of a Pull Request (PR)
+
+Let's say I want to add another page for an API Panel.
+
+1. Open GitHub and select Danny's fork.
+2. First, make sure that the main branch is clean with no commits and up to date.
+ 
+3. Open "View all my branches" and create a new branch with a descriptive name for your task. For example: "ApiPanel."
+4. In GitHub Desktop, select the branch you just created.
+ 
+5. Start modifying the code, and when you finish a part, commit the changes.
+Example of commits:
+- commit1: Created the frontend
+- commit2: Fixed a bug in variable export
+- commit3: Removed unnecessary comments and added translation support
+- and so on...
+
+## Testing
+
+While testing the code, if you're working with the frontend, it might be frustrating to run `npm run frontend` and `npm run backend` every time. Instead, use `npm run frontend:dev` to see real-time changes on port 3090 (really!).
+
+> Note: You must run `npm run frontend` once before you can use `npm run frontend:dev`
+
+### How?
+
+- `git add *` adds all files to be committed.
+- `git commit -m "name-of-your-commit"` creates a commit.
+- `git push` uploads the changes.
+
+Before doing all this, I recommend using GitHub Desktop to see what you've changed.
+ 
+
+If `git commit` fails due to ESLint errors, read the error message and understand what's wrong. It could be an unused variable or other issues.
+
+### Possible Various Problems
+
+If you have the main branch with many commits and don't know what to do, follow this simple guide:
+
+⚠️ Please do this only when you have no active PRs or when you're not working on the project:
+
+1. Do a pull origin and in the terminal write `git log` to identify how many commits you are behind.
+2. Use `git rebase -i HEAD~2`, where 2 represents the number of commits you need to go back. If you need to go back 100 commits, use `git rebase -i HEAD~100`.
+3. In the editor, change the "pick" for the two commits to "drop," save with "esc," then type `:wq` and press "Enter."
+4. Finally, run `git push --force origin main`.
diff --git a/docs/contributions/index.md b/docs/contributions/index.md
new file mode 100644
index 00000000000..4362b1df092
--- /dev/null
+++ b/docs/contributions/index.md
@@ -0,0 +1,15 @@
+---
+title: Contributing to LibreChat
+description: "🙌 How to contribute to LibreChat: Get started, Documentation and code standards, Translate the app into different languages, Test the app during development, Ensure the security of the app, Stay updated with the project roadmap"
+weight: 5
+---
+# Contributing to LibreChat
+
+ * 🙌 [Beginner's Guide to Contributions](./how_to_contribute.md)
+ * 🚸 [Contributor Guidelines](https://github.com/danny-avila/LibreChat/blob/main/.github/CONTRIBUTING.md)
+ * 📝 [Documentation Guidelines](documentation_guidelines.md)
+ * 🌍 [Contribute a Translation](translation_contribution.md)
+ * 🧑💻 [Code Standards and Conventions](coding_conventions.md)
+ * 🧪 [Testing During Development](testing.md)
+ * 🔐 [Security](https://github.com/danny-avila/LibreChat/blob/main/.github/SECURITY.md)
+ * 🛣️ [Project Roadmap](https://github.com/users/danny-avila/projects/2)
\ No newline at end of file
diff --git a/docs/contributions/testing.md b/docs/contributions/testing.md
index ed0f2d6387a..eeac51916b4 100644
--- a/docs/contributions/testing.md
+++ b/docs/contributions/testing.md
@@ -1,60 +1,23 @@
-# Locally test the app during development
-
-### Run the app
-
-#### Option 1: Run the app using Docker
-
-For reproducibility and ease of use, you can use
-the provided docker-compose file:
-
-1. Comment out the portion pointing at the already built image
-
- ```yaml
- image: chatgptclone/app:0.3.3
- ```
-
-2. Uncomment the portion pointing at the local source code
-
- ```yaml
- # image: node-api
- # build:
- # context: .
- # target: node-api
- ```
-
-3. Build your local source code for the `node-api` target
+---
+title: 🧪 Testing During Development
+description: How to locally test the app during development.
+weight: -6
+---
- ```shell
- docker build `
- --target=node-api `
- -t node-api `
- .
- ```
-
-4. Docker-compose up
-
- ```shell
- docker-compose up
- ```
-
-#### Option 2: Run the app by installing on your machine
-
-1. Install the prerequisites on your machine.
- See [section above](#install-the-prerequisites-on-your-machine).
+# Locally test the app during development
-2. Run the app on your machine.
- See [section above](#run-the-app).
+## WIP
-### Run the tests
+## Run the tests
-1. Install the global dependencies
+#### 1. Install the global dependencies
```shell
npm ci
npx playwright install --with-deps
```
-2. Run tests
+#### 2. Run tests
```shell
npx playwright test
diff --git a/docs/contributions/translation_contribution.md b/docs/contributions/translation_contribution.md
index 97bc4c49699..e33a9ef8af1 100644
--- a/docs/contributions/translation_contribution.md
+++ b/docs/contributions/translation_contribution.md
@@ -1,3 +1,8 @@
+---
+title: 🌍 Contribute a Translation
+description: How to add a new language to LibreChat.
+weight: -8
+---
# How to add a new language to LibreChat 🌍
## Minimum Requirements:
diff --git a/docs/deployment/azure-terraform.md b/docs/deployment/azure-terraform.md
index fca5473dc52..76768683c64 100644
--- a/docs/deployment/azure-terraform.md
+++ b/docs/deployment/azure-terraform.md
@@ -1,3 +1,8 @@
+---
+title: ⚡ Azure
+description: How to deploy LibreChat in Azure using Terraform.
+weight: -6
+---
# Azure deployment
There are different ways of how a deployment can be done in Azure.
diff --git a/docs/deployment/cloudflare.md b/docs/deployment/cloudflare.md
index b3c3d18c357..c9a44dfb1cd 100644
--- a/docs/deployment/cloudflare.md
+++ b/docs/deployment/cloudflare.md
@@ -1,3 +1,8 @@
+---
+title: ☁️ Cloudflare
+description: How to setup a domain with Cloudflare and use Cloudflare Tunnels to securely expose your local web servers or services to the internet.
+weight: -7
+---
# Cloudflare
@@ -5,12 +10,12 @@
## Google Domains and Cloudflare
-- buy a domain at https://domains.google.com/
-- register a Cloudflare account at https://dash.cloudflare.com/sign-up
+- buy a domain at **[https://domains.google.com/](https://domains.google.com)**
+- register a Cloudflare account at **[https://dash.cloudflare.com/sign-up](https://dash.cloudflare.com/sign-up)**
- click on `add site` and add your domain
- select `Free` and tap `continue` twice
- copy the 2 Cloudflare's nameservers
-- go to https://domains.google.com/registrar/ and select your domain
+- go to **[https://domains.google.com/registrar/](https://domains.google.com/registrar)** and select your domain
- in the dns tab select `Custom name servers`
- click on `Switch to these settings` and enter the two Cloudflare nameservers that you copied before, then save
- return to the cloudflare tab and tap on `Done, check nameservers`, then `finish later` and `Check nameservers` (this process can take about 5 minutes)
@@ -69,7 +74,7 @@ Here's a straightforward guide on how to install it!
### Installation Steps
-1. Go to `https://dash.cloudflare.com/`.
+1. Go to **[https://dash.cloudflare.com/](https://dash.cloudflare.com/)**.
2. On the left side, click on **Zero Trust**.
3. Provide a casual name (which you can change later).
4. Select the free plan and proceed to payment (if you choose the free plan, you will not be charged).
diff --git a/docs/deployment/digitalocean.md b/docs/deployment/digitalocean.md
index 2f7e45854ec..640b4b3b0d9 100644
--- a/docs/deployment/digitalocean.md
+++ b/docs/deployment/digitalocean.md
@@ -1,3 +1,8 @@
+---
+title: 🌊 DigitalOcean ✨(Recommended)
+description: These instructions are designed for someone starting from scratch for a Docker Installation on a remote Ubuntu server using one of the cheapest tiers (6 USD/mo)
+weight: -10
+---
# Digital Ocean (Ubuntu/Docker) Setup
>These instructions are designed for someone starting from scratch for a Docker Installation on a remote Ubuntu server. You can skip to any point that is useful for you. There are probably more efficient/scalable ways, but this guide works really great for my personal use case.
@@ -303,14 +308,14 @@ cd LibreChat/
```
### **2. Create a global environment file.**
-The default values are enough to get you started and running the app.
+The default values are enough to get you started and running the app, allowing you to provide your credentials from the web app.
```bash
# Copies the example file as your global env file
cp .env.example .env
```
-However, it's highly recommended you use environment variables for any sensitive credentials until we remove use of localStorage for passing credentials from the frontend
+However, if you'd like to provide any credentials for all users of your instance to consume, you can add them to the .env file as follows:
```bash
nano .env
@@ -334,8 +339,8 @@ ALLOW_REGISTRATION=false
```
**Resources:**
-- [Tokens/Apis/etc](../install/apis_and_tokens.md)
-- [User/Auth System](../install/user_auth_system.md)
+- [Tokens/Apis/etc](../install/configuration/ai_setup.md)
+- [User/Auth System](../install/configuration/user_auth_system.md)
### **3. Start docker, and then run the installation/update script**
@@ -362,7 +367,7 @@ It's safe to close the terminal if you wish -- the docker app will continue to r
>If you are setting up a domain to be used with LibreChat, this compose file is using the nginx file located in client/nginx.conf. Instructions on this below in part V.
-### **4. Once the app is running, you can access it at http://yourserverip**
+### **4. Once the app is running, you can access it at `http://yourserverip`**
### Go back to the DigitalOcean droplet page to get your server ip, copy it, and paste it into your browser!
diff --git a/docs/deployment/heroku.md b/docs/deployment/heroku.md
index 29ec9f71728..b3ffe8d6d20 100644
--- a/docs/deployment/heroku.md
+++ b/docs/deployment/heroku.md
@@ -1,3 +1,8 @@
+---
+title: 🌈 Heroku
+description: Instructions for deploying LibreChat on Heroku
+weight: -1
+---
# Heroku Deployment
*To run LibreChat on a server, you can use cloud hosting platforms like Heroku, DigitalOcean, or AWS. In this response, I'll provide instructions for deploying the project on Heroku. Other platforms will have slightly different deployment processes.*
@@ -6,8 +11,8 @@ Heroku only supports running a single process within a Docker container. The Doc
If you want to deploy both these services to Heroku, you will need to create two separate Dockerfiles: one for the API and one for the client. The heroku.yml should be configured separately for each app, and then you need to create and deploy two different Heroku apps.
- - Sign up for a Heroku account: If you don't already have a Heroku account, sign up at https://signup.heroku.com/.
- - Install the Heroku CLI: Download and install the Heroku CLI from https://devcenter.heroku.com/articles/heroku-cli.
+ - Sign up for a Heroku account: If you don't already have a Heroku account, sign up at: **[https://signup.heroku.com](https://signup.heroku.com)**
+ - Install the Heroku CLI: Download and install the Heroku CLI from: **[https://devcenter.heroku.com/articles/heroku-cli](https://devcenter.heroku.com/articles/heroku-cli)**
Here are the steps to deploy on Heroku:
@@ -122,7 +127,7 @@ Remember to replace `your-api-app-name` and `your-client-app-name` with the actu
---
- ⚠️ If you have issues, see this discussion first: https://github.com/danny-avila/LibreChat/discussions/339
+ ⚠️ If you have issues, see this discussion first: **[https://github.com/danny-avila/LibreChat/discussions/339](https://github.com/danny-avila/LibreChat/discussions/339)**
## Using Heroku Dashboard:
@@ -132,7 +137,7 @@ Remember to replace `your-api-app-name` and `your-client-app-name` with the actu
## Setting up MongoDB Atlas:
-Sign up for a MongoDB Atlas account: If you don't have an account, sign up at https://www.mongodb.com/cloud/atlas/signup.
+Sign up for a MongoDB Atlas account: If you don't have an account, sign up at: **[https://www.mongodb.com/cloud/atlas/signup](https://www.mongodb.com/cloud/atlas/signup)**
Create a new cluster: After signing in, create a new cluster by following the on-screen instructions. For a free tier cluster, select the "Shared" option and choose the "M0 Sandbox" tier.
@@ -144,7 +149,7 @@ Get the connection string: Once the cluster is created, click the "Connect" butt
## Deploying MeiliSearch on Heroku:
-Install the Heroku CLI: If you haven't already, download and install the Heroku CLI from https://devcenter.heroku.com/articles/heroku-cli.
+Install the Heroku CLI: If you haven't already, download and install the Heroku CLI from: **[https://devcenter.heroku.com/articles/heroku-cli](https://devcenter.heroku.com/articles/heroku-cli)**
Login to Heroku: Open Terminal and run heroku login. Follow the instructions to log in to your Heroku account.
## Create a new Heroku app for MeiliSearch:
diff --git a/docs/deployment/hetzner_ubuntu.md b/docs/deployment/hetzner_ubuntu.md
index 959e590b4fa..ba851ef6658 100644
--- a/docs/deployment/hetzner_ubuntu.md
+++ b/docs/deployment/hetzner_ubuntu.md
@@ -1,27 +1,32 @@
+---
+title: 🏗️ Hetzner
+description: LibreChat Ubuntu installation from scratch on Hetzner.
+weight: -2
+---
# Hetzner Ubuntu Setup
*These instructions are designed for someone starting from scratch for a Ubuntu Installation. You can skip to any point that is useful for you.*
## Starting from Zero:
-### 1. Login to Hetzner Cloud Console (https://console.hetzner.cloud/projects) and Create a new Ubuntu 20 Project with 4GB Ram. Do not worry about SSH keys *yet*.
+1. Login to Hetzner Cloud Console (**[https://console.hetzner.cloud/projects](https://console.hetzner.cloud/projects)**) and Create a new Ubuntu 20 Project with 4GB Ram. Do not worry about SSH keys *yet*.
Hetzner will email you the root password.
-### 2. Once you have that, you can login with any SSH terminal with:
+2. Once you have that, you can login with any SSH terminal with:
```
ssh root@
```
-### 3. Once you have logged in, immediately create a new, non-root user:
+3. Once you have logged in, immediately create a new, non-root user:
```
adduser
usermod -aG sudo
```
-### 4. Make sure you have done this correctly by double-checking you have sudo permissions:
+4. Make sure you have done this correctly by double-checking you have sudo permissions:
```
getent group sudo | cut -d: -f4
@@ -29,7 +34,7 @@ getent group sudo | cut -d: -f4
Now, quit the terminal connection.
-### 5. Create a local ssh key:
+5. Create a local ssh key:
```
ssh-keygen -t ed25519
@@ -47,13 +52,13 @@ ssh @
When you login, now and going forward, it will ask you for the password for your ssh key now, not your user password. Sudo commands will always want your user password.
-### 6. Add SSH to the universal server firewall and activate it.
+6. Add SSH to the universal server firewall and activate it.
- Run `sudo ufw allow OpenSSH`
- Run `sudo ufw enable`
-### 7. Then, we need to install docker, update the system packages, and reboot the server:
+7. Then, we need to install docker, update the system packages, and reboot the server:
```
sudo apt install docker
sudo apt install docker-compose
@@ -68,9 +73,11 @@ sudo reboot
## Tokens/Apis/etc:
- Make sure you have all the needed variables for the following before moving forward
-### [Get Your API keys and Tokens](../install/apis_and_tokens.md) (Required)
-- You must set up at least one of these tokens or APIs to run the app.
-### [User/Auth System](../install/user_auth_system.md) (Optional)
+
+### [Setup your AI Endpoints](../install/configuration/ai_setup.md) (Required)
+- At least one AI endpoint should be setup for use.
+### [User/Auth System](../install/configuration/user_auth_system.md) (Optional)
+
- How to set up the user/auth system and Google login.
### [Plugins](../features/plugins/introduction.md)
- Optional plugins available to enhance the application.
@@ -79,7 +86,7 @@ sudo reboot
## Using Docker to Install the Service
-### 1. **Recommended: [Docker Install](../install/docker_compose_install.md)**
+### 1. **Recommended: [Docker Install](../install/installation/docker_compose_install.md)**
From the *server* commandline (as your user, not root):
```
@@ -126,7 +133,7 @@ MEILI_HTTP_ADDR=meilisearch
**NOTE: You may need to run these commands with sudo permissions.**
-## Once the app is running, you can access it at http://yourserverip:3080
+## Once the app is running, you can access it at `http://yourserverip:3080`
It is safe to close the terminal -- the docker app will continue to run.
diff --git a/docs/deployment/huggingface.md b/docs/deployment/huggingface.md
index e9391d2aafa..5cdf3ccdc44 100644
--- a/docs/deployment/huggingface.md
+++ b/docs/deployment/huggingface.md
@@ -1,23 +1,23 @@
+---
+title: 🤗 HuggingFace
+description: Easily deploy LibreChat on Hugging Face Spaces
+weight: -9
+---
# Hugging Face Deployment 🤗
->#### ⚠️ Note - Some features are not supported by HuggingFace:
->- Meilisearch
->- Social Logins
-
-> #### ❗Also:
->- You will have to create an online MongoDB Atlas Database to be able to properly deploy
-
## Create and Configure your Database (Required)
The first thing you need is to create a MongoDB Atlas Database and get your connection string.
-Follow the instructions in this document: [Online MongoDB Database](../install/mongodb.md)
+Follow the instructions in this document: **[Online MongoDB Database](../install/configuration/mongodb.md)**
## Getting Started
-**1.** Login or Create an account on [Hugging Face](https://huggingface.co/)
+**1.** Login or Create an account on **[Hugging Face](https://huggingface.co/)**
+
+**2.** Visit **[https://huggingface.co/spaces/LibreChat/template](https://huggingface.co/spaces/LibreChat/template)** and click on `Duplicate this Space` to copy the LibreChat template into your profile.
-**2.** Visit [[https://huggingface.co/spaces/LibreChat/template](https://huggingface.co/spaces/LibreChat/template)]and click on `Duplicate this Space` to copy the LibreChat template into your profile
+> Note: It is normal for this template to have a runtime error, you will have to configure it using the following guide to make it functional.

@@ -42,12 +42,12 @@ You will need to fill these values:
| JWT_SECRET | * see bellow |
| JWT_REFRESH_SECRET | * see bellow |
-> ⬆️ **Leave the value field blank for any endpoints that you wish to disable.**
+> ⬆️ **Leave the value field blank for any endpoints that you wish to disable.**
->⚠️ setting the API keys and token to `user_provided` allows you to provide them safely from the webUI
+> ⚠️ setting the API keys and token to `user_provided` allows you to provide them safely from the webUI
->* For `CREDS_KEY`, `CREDS_IV` and `JWT_SECRET` use this tool: [https://replit.com/@daavila/crypto#index.js](https://replit.com/@daavila/crypto#index.js).
->* Run the tool a second time and use the new `JWT_SECRET` value for the `JWT_REFRESH_SECRET`
+> * For `CREDS_KEY`, `CREDS_IV` and `JWT_SECRET` use this tool: **[https://replit.com/@daavila/crypto#index.js](https://replit.com/@daavila/crypto#index.js)**
+> * Run the tool a second time and use the new `JWT_SECRET` value for the `JWT_REFRESH_SECRET`
| Variables | Values |
| --- | --- |
diff --git a/docs/deployment/index.md b/docs/deployment/index.md
new file mode 100644
index 00000000000..780456bc6cd
--- /dev/null
+++ b/docs/deployment/index.md
@@ -0,0 +1,18 @@
+---
+title: Deployment
+description: 🌐 Step-by-step guides on how to deploy LibreChat on various cloud platforms.
+weight: 3
+---
+
+# Deployment
+
+ * 🌊 [DigitalOcean (✨Recommended)](digitalocean.md)
+ * 🤗 [HuggingFace](huggingface.md)
+ * 🐧 [Linode](linode.md)
+ * ☁️ [Cloudflare](cloudflare.md)
+ * ⚡ [Azure](azure-terraform.md)
+ * 🪨 [Ngrok](ngrok.md)
+ * ⏹️ [Render](render.md)
+ * 🔎 [Meilisearch in Render](meilisearch_in_render.md)
+ * 🏗️ [Hetzner](hetzner_ubuntu.md)
+ * 🌈 [Heroku](heroku.md)
\ No newline at end of file
diff --git a/docs/deployment/linode.md b/docs/deployment/linode.md
index 58d89bb40d2..96f8f775839 100644
--- a/docs/deployment/linode.md
+++ b/docs/deployment/linode.md
@@ -1,3 +1,8 @@
+---
+title: 🐧 Linode
+description: How to deploy LibreChat on Linode.
+weight: -8
+---
# Linode
@@ -5,7 +10,7 @@
⚠️**Note: Payment is required**
## Create a Linode Account and a Linode Server
-- Go to the Linode website (https://www.linode.com/) and click on the "Sign Up" or "Get Started" button.
+- Go to the Linode website (**[https://www.linode.com/](https://www.linode.com/)**) and click on the "Sign Up" or "Get Started" button.
- Follow the instructions to create a new account by providing your personal details and payment information.
- Once your account is created, you will have access to the Linode Cloud Manager.
- Click on the "Create" button to create a new Linode server.
@@ -21,7 +26,7 @@
sudo apt update
sudo apt install docker.io && apt install docker-compose
```
-## [Install LibreChat](../install/docker_compose_install.md)
+## [Install LibreChat](../install/installation/docker_compose_install.md)
## Install and Setup NGINX Proxy Manager:
diff --git a/docs/deployment/meilisearch_in_render.md b/docs/deployment/meilisearch_in_render.md
index 142e4acc35c..3e24c71b54d 100644
--- a/docs/deployment/meilisearch_in_render.md
+++ b/docs/deployment/meilisearch_in_render.md
@@ -1,8 +1,13 @@
+---
+title: 🔎 Meilisearch in Render
+description: Setup Meilisearch on Render (for use with the Render deployment guide)
+weight: -3
+---
# Utilize Meilisearch by running LibreChat on Render
## Create a new account or a new project on Render
-**1.** Visit [https://render.com/](https://render.com/) and click on `Start Free` to create an account and sign in
+**1.** Visit **[https://render.com/](https://render.com/)** and click on `Start Free` to create an account and sign in
**2.** Access your control panel
diff --git a/docs/deployment/ngrok.md b/docs/deployment/ngrok.md
index 4b85acceeaf..2c0b7167393 100644
--- a/docs/deployment/ngrok.md
+++ b/docs/deployment/ngrok.md
@@ -1,47 +1,51 @@
+---
+title: 🪨 Ngrok
+description: Use Ngrok to tunnel your local server to the internet.
+weight: -5
+---
# Ngrok Installation
To use Ngrok for tunneling your local server to the internet, follow these steps:
## Sign up
-1. Go to https://ngrok.com/ and sign up for an account.
+1. Go to **[https://ngrok.com/](https://ngrok.com/)** and sign up for an account.
## Docker Installation 🐳
-1. Copy your auth token from https://dashboard.ngrok.com/get-started/your-authtoken.
+1. Copy your auth token from: **[https://dashboard.ngrok.com/get-started/your-authtoken](https://dashboard.ngrok.com/get-started/your-authtoken)**
2. Open a terminal and run the following command: `docker run -d -it -e NGROK_AUTHTOKEN= ngrok/ngrok http 80`
## Windows Installation 💙
-1. Download the ZIP file from https://ngrok.com/download.
+1. Download the ZIP file from: **[https://ngrok.com/download](https://ngrok.com/download)**
2. Extract the contents of the ZIP file using 7zip or WinRar.
-3.
-4. Run `ngrok.exe`.
-5. Copy your auth token from https://dashboard.ngrok.com/get-started/your-authtoken.
-6. In the `ngrok.exe` terminal, run the following command: `ngrok config add-authtoken `
-7. If you haven't done so already, start LibreChat normally.
-8. In the `ngrok.exe` terminal, run the following command: `ngrok http 3080`
+3. Run `ngrok.exe`.
+4. Copy your auth token from: **[https://dashboard.ngrok.com/get-started/your-authtoken](https://dashboard.ngrok.com/get-started/your-authtoken)**
+5. In the `ngrok.exe` terminal, run the following command: `ngrok config add-authtoken `
+6. If you haven't done so already, start LibreChat normally.
+7. In the `ngrok.exe` terminal, run the following command: `ngrok http 3080`
You will see a link that can be used to access LibreChat.

## Linux Installation 🐧
-1. Copy the command from https://ngrok.com/download choosing the **correct** architecture.
+1. Copy the command from: **[https://ngrok.com/download](https://ngrok.com/download)** choosing the **correct** architecture.
2. Run the command in the terminal
-3. Copy your auth token from https://dashboard.ngrok.com/get-started/your-authtoken.
+3. Copy your auth token from: **[https://dashboard.ngrok.com/get-started/your-authtoken](https://dashboard.ngrok.com/get-started/your-authtoken)**
4. run the following command: `ngrok config add-authtoken `
5. If you haven't done so already, start LibreChat normally.
6. run the following command: `ngrok http 3080`
## Mac Installation 🍎
-1. Download the ZIP file from https://ngrok.com/download.
+1. Download the ZIP file from: **[https://ngrok.com/download](https://ngrok.com/download)**
2. Extract the contents of the ZIP file using a suitable Mac application like Unarchiver.
3. Open Terminal.
4. Navigate to the directory where you extracted ngrok using the `cd` command.
5. Run ngrok by typing `./ngrok`.
-6. Copy your auth token from https://dashboard.ngrok.com/get-started/your-authtoken.
+6. Copy your auth token from: **[https://dashboard.ngrok.com/get-started/your-authtoken](https://dashboard.ngrok.com/get-started/your-authtoken)**
7. In the terminal where you ran ngrok, enter the following command: `ngrok authtoken `
8. If you haven't done so already, start LibreChat normally.
9. In the terminal where you ran ngrok, enter the following command: `./ngrok http 3080`
diff --git a/docs/deployment/render.md b/docs/deployment/render.md
index 768e9165611..6652f41ee5a 100644
--- a/docs/deployment/render.md
+++ b/docs/deployment/render.md
@@ -1,3 +1,8 @@
+---
+title: ⏹️ Render
+description: How to deploy LibreChat on Render
+weight: -4
+---
# Render Deployment
## Note:
@@ -78,7 +83,7 @@ Also:
The last thing you need is to create a MongoDB Atlas Database and get your connection string.
-Follow the instructions in this document: [Online MongoDB Database](../install/mongodb.md)
+Follow the instructions in this document: [Online MongoDB Database](../install/configuration/mongodb.md)
## Complete the Environment Variables configuration
diff --git a/docs/dev/README.md b/docs/dev/README.md
index 899f415f440..81ae6393120 100644
--- a/docs/dev/README.md
+++ b/docs/dev/README.md
@@ -1,13 +1,23 @@
-# Dev
-This directory contains files used for developer work
+---
+title: Dev Resources
+weight: 6
+---
-### Dockerfile-app:
-- used to build the DockerHub image
-### eslintrc-stripped.js:
+# Dev Resources
+Please consult: **[Contributing to LibreChat](../contributions/index.md)** for more information on the subject.
+
+This directory: **[./docs/dev](https://github.com/danny-avila/LibreChat/tree/main/docs/dev)**, contains files used for developer work.
+
+#### `Dockerfile-app`
+ - used to build the DockerHub image
+
+#### `eslintrc-stripped.js`
- alternate linting rules, used in development
-### meilisearch.yml:
+
+#### `meilisearch.yml`
- Dockerfile for building meilisearch image independently from project
-### single-compose.yml:
+
+#### `single-compose.yml`
- Dockerfile for building app image without meilisearch and mongodb services
- This is useful for deploying on Google, Azure, etc., as a single, leaner container.
- From root dir of the project, run `docker-compose -f ./docs/dev/single-compose.yml up --build`
@@ -15,9 +25,10 @@ This directory contains files used for developer work
- This requires you use a MongoDB Atlas connection string for the `MONGO_URI` env var
- A URI string to a mongodb service accessible to your container is also possible.
- Remote Meilisearch may also be possible in the same manner, but is not tested.
-### deploy-compose.yml:
+
+#### `deploy-compose.yml`
- Similar to above, but with basic configuration for deployment to a cloud provider where multi-container compose works
- - Tested and working on a $6 droplet on DigitalOcean, just by visiting the http://server-ip/9000.
+ - Tested and working on a $6 droplet on DigitalOcean, just by visiting the `http://server-ip/9000`.
- Not a scalable solution, but ideal for quickly hosting on a remote linux server.
- You should adjust `server_name localhost;` to match your domain name, replacing localhost, as needed.
- From root dir of the project, run `docker-compose -f ./docs/dev/deploy-compose.yml up --build`
diff --git a/docs/features/bing_jailbreak.md b/docs/features/bing_jailbreak.md
index 6d01eb2bcbd..a014de476dc 100644
--- a/docs/features/bing_jailbreak.md
+++ b/docs/features/bing_jailbreak.md
@@ -1,3 +1,9 @@
+---
+title: 😈 Bing Jailbreak
+description: Quick overview of the Bing jailbreak and Sydney's system message
+weight: -2
+---
+
# Bing Jailbreak
@@ -26,6 +32,6 @@ using internet slang often. Answer using the same language as the user."
## References
For more info on the Bing Jailbreak and general jailbreaking guidelines:
-https://github.com/waylaidwanderer/node-chatgpt-api
+[https://github.com/waylaidwanderer/node-chatgpt-api](https://github.com/waylaidwanderer/node-chatgpt-api)
-https://www.make-safe-ai.com/is-bing-chat-safe/
+[https://www.make-safe-ai.com/is-bing-chat-safe/](https://www.make-safe-ai.com/is-bing-chat-safe/)
diff --git a/docs/features/firebase.md b/docs/features/firebase.md
new file mode 100644
index 00000000000..fc94b3bce9f
--- /dev/null
+++ b/docs/features/firebase.md
@@ -0,0 +1,103 @@
+---
+title: 🔥 Firebase CDN Setup
+description: This document provides instructions for setting up Firebase CDN for LibreChat
+weight: -6
+---
+
+# Firebase CDN Setup
+
+## Steps to Set Up Firebase
+
+1. Open the [Firebase website](https://firebase.google.com/).
+2. Click on "Get started."
+3. Sign in with your Google account.
+
+### Create a New Project
+
+- Name your project (you can use the same project as Google OAuth).
+
+
+
+- Optionally, you can disable Google Analytics.
+
+
+
+- Wait for 20/30 seconds for the project to be ready, then click on "Continue."
+
+
+
+- Click on "All Products."
+
+
+
+- Select "Storage."
+
+
+
+- Click on "Get Started."
+
+
+
+- Click on "Next."
+
+
+
+- Select your "Cloud Storage location."
+
+
+
+- Return to the Project Overview.
+
+
+
+- Click on "+ Add app" under your project name, then click on "Web."
+
+
+
+- Register the app.
+
+
+
+- Save all this information in a text file.
+
+
+
+- Fill all the `firebaseConfig` variables in the `.env` file.
+
+```bash
+FIREBASE_API_KEY=api_key #apiKey
+FIREBASE_AUTH_DOMAIN=auth_domain #authDomain
+FIREBASE_PROJECT_ID=project_id #projectId
+FIREBASE_STORAGE_BUCKET=storage_bucket #storageBucket
+FIREBASE_MESSAGING_SENDER_ID=messaging_sender_id #messagingSenderId
+FIREBASE_APP_ID=1:your_app_id #appId
+```
+
+- Return one last time to the Project Overview.
+
+
+
+- Select `Storage`
+
+
+
+- Select `Rules` and delete `: if false;` on this line: `allow read, write: if false;`
+
+ - your updated rules should look like this:
+
+ ```bash
+ rules_version = '2';
+ service firebase.storage {
+ match /b/{bucket}/o {
+ match /{allPaths=**} {
+ allow read, write
+ }
+ }
+ }
+ ```
+
+
+
+- Publish your updated rules
+
+
\ No newline at end of file
diff --git a/docs/features/index.md b/docs/features/index.md
new file mode 100644
index 00000000000..9bfda2be25e
--- /dev/null
+++ b/docs/features/index.md
@@ -0,0 +1,33 @@
+---
+title: Features
+description: "✨ In-depth guides about various LibreChat features: plugins, presets, automated moderation, logging..."
+weight: 2
+---
+
+# Features
+
+---
+
+* 🔌[Plugins](./plugins/index.md)
+ * 🔌 [Introduction](./plugins/introduction.md)
+ * 🛠️ [Make Your Own](./plugins/make_your_own.md)
+ * 🧑💼 [Official ChatGPT Plugins](./plugins/chatgpt_plugins_openapi.md)
+ * 🔎 [Google Search](./plugins/google_search.md)
+ * 🖌️ [Stable Diffusion](./plugins/stable_diffusion.md)
+ * 🧠 [Wolfram|Alpha](./plugins/wolfram.md)
+ * ⚡ [Azure AI Search](./plugins/azure_ai_search.md)
+* 🔖 [Presets](./presets.md)
+
+---
+
+* 🔨 [Automated Moderation](./mod_system.md)
+* 🪙 [Token Usage](./token_usage.md)
+* 🔥 [Firebase CDN](./firebase.md)
+* 🍃 [Manage Your Database](./manage_your_database.md)
+* 🪵 [Logging System](./logging_system.md)
+* 📦 [PandoraNext](./pandoranext.md)
+* 😈 [Bing Jailbreak](./bing_jailbreak.md)
+
+---
+
+* ✨ [Third-Party Tools and Contributions](./third_party.md)
\ No newline at end of file
diff --git a/docs/features/logging_system.md b/docs/features/logging_system.md
new file mode 100644
index 00000000000..196849b787d
--- /dev/null
+++ b/docs/features/logging_system.md
@@ -0,0 +1,43 @@
+---
+title: 🪵 Logging System
+weight: -4
+description: This doc explains how to use the logging feature of LibreChat, which saves error and debug logs in the `/api/logs` folder. You can use these logs to troubleshoot issues, monitor your server, and report bugs. You can also disable debug logs if you want to save space.
+---
+
+### General
+
+LibreChat has central logging built into its backend (api).
+
+Log files are saved in `/api/logs`. Error logs are saved by default. Debug logs are enabled by default but can be turned off if not desired.
+
+This allows you to monitor your server through external tools that inspect log files, such as **[the ELK stack](https://aws.amazon.com/what-is/elk-stack/)**.
+
+Debug logs are essential for developer work and fixing issues. If you encounter any problems running LibreChat, reproduce as close as possible, and **[report the issue](https://github.com/danny-avila/LibreChat/issues)** with your logs found in `./api/logs/debug-%DATE%.log`.
+
+Errors logs are also saved in the same location: `./api/logs/error-%DATE%.log`. If you have meilisearch configured, there is a separate log file for this as well.
+
+> Note: Logs are rotated on a 14-day basis, so you will generate 1 error log file, 1 debug log file, and 1 meiliSync log file per 14 days.
+> Errors will also be present in debug log files as well, but provide stack traces and more detail in the error log files.
+
+### Setup
+
+Toggle debug logs with the following environment variable. By default, even if you never set this variable, debug logs will be generated, but you have the option to disable them by setting it to `FALSE`.
+
+Note: it's recommended to disable debug logs in a production environment.
+
+```bash
+DEBUG_LOGGING=TRUE
+```
+
+```bash
+# in a production environment
+DEBUG_LOGGING=FALSE
+```
+
+For verbose server output in the console/terminal, you can also set the following:
+
+```bash
+DEBUG_CONSOLE=TRUE
+```
+
+This is not recommend, however, as the outputs can be quite verbose. It's disabled by default and should be enabled sparingly.
\ No newline at end of file
diff --git a/docs/features/manage_your_database.md b/docs/features/manage_your_database.md
index dc3cc71128f..3de01e21cbc 100644
--- a/docs/features/manage_your_database.md
+++ b/docs/features/manage_your_database.md
@@ -1,3 +1,9 @@
+---
+title: 🍃 Manage Your Database
+description: How to install and configure Mongo Express to securely access and manage your MongoDB database in Docker.
+weight: -5
+---
+
diff --git a/docs/features/mod_system.md b/docs/features/mod_system.md
index 107c61cd355..099c5cb3a45 100644
--- a/docs/features/mod_system.md
+++ b/docs/features/mod_system.md
@@ -1,3 +1,8 @@
+---
+title: 🔨 Automated Moderation
+description: The Automated Moderation System uses a scoring mechanism to track user violations. As users commit actions like excessive logins, registrations, or messaging, they accumulate violation scores. Upon reaching a set threshold, the user and their IP are temporarily banned. This system ensures platform security by monitoring and penalizing rapid or suspicious activities.
+weight: -8
+---
## Automated Moderation System (optional)
The Automated Moderation System uses a scoring mechanism to track user violations. As users commit actions like excessive logins, registrations, or messaging, they accumulate violation scores. Upon reaching a set threshold, the user and their IP are temporarily banned. This system ensures platform security by monitoring and penalizing rapid or suspicious activities.
@@ -29,7 +34,7 @@ The project's current rate limiters are as follows (see below under setup for de
### Setup
-The following are all of the related env variables to make use of and configure the mod system. Note this is also found in the [/.env.example](/.env.example) file, to be set in your own `.env` file.
+The following are all of the related env variables to make use of and configure the mod system. Note this is also found in the [/.env.example](https://github.com/danny-avila/LibreChat/blob/main/.env.example) file, to be set in your own `.env` file.
```bash
BAN_VIOLATIONS=true # Whether or not to enable banning users for violations (they will still be logged)
@@ -64,4 +69,29 @@ MESSAGE_IP_WINDOW=1 # in minutes, determines the window of time for MESSAGE_IP_M
LIMIT_MESSAGE_USER=false # Whether to limit the amount of messages an IP can send per MESSAGE_USER_WINDOW
MESSAGE_USER_MAX=40 # The max amount of messages an IP can send per MESSAGE_USER_WINDOW
MESSAGE_USER_WINDOW=1 # in minutes, determines the window of time for MESSAGE_USER_MAX messages
-```
\ No newline at end of file
+```
+
+## OpenAI moderation text
+
+### OPENAI_MODERATION
+enable or disable OpenAI moderation
+
+Values:
+`true`: OpenAI moderation is enabled
+`false`: OpenAI moderation is disabled
+
+### OPENAI_MODERATION_API_KEY
+Specify your OpenAI moderation API key here
+
+### OPENAI_MODERATION_REVERSE_PROXY
+enable or disable reverse proxy compatibility for OpenAI moderation. Note that it may not work with some reverse proxies
+
+Values:
+`true`: Enable reverse proxy compatibility
+`false`: Disable reverse proxy compatibility
+
+```bash
+OPENAI_MODERATION=true
+OPENAI_MODERATION_API_KEY=sk-1234
+# OPENAI_MODERATION_REVERSE_PROXY=false
+```
diff --git a/docs/features/pandoranext.md b/docs/features/pandoranext.md
index 710da355a57..e639796e4d2 100644
--- a/docs/features/pandoranext.md
+++ b/docs/features/pandoranext.md
@@ -1,3 +1,9 @@
+---
+title: 📦 PandoraNext
+description: How to deploy PandoraNext to enable the `CHATGPT_REVERSE_PROXY` for use with LibreChat.
+weight: -3
+---
+
# PandoraNext Deployment Guide
If you're looking to use the `ChatGPT` Endpoint in LibreChat, setting up a reverse proxy is a essential. PandoraNext offers a robust solution for this purpose. This guide will walk you through deploying PandoraNext to enable the `CHATGPT_REVERSE_PROXY` for use with LibreChat.
@@ -6,151 +12,158 @@ If you're looking to use the `ChatGPT` Endpoint in LibreChat, setting up a rever
You can use it locally in docker or deploy it onthe web for remote access.
-## Deploy Online by Duplicating Hugging Face Space
-
-To deploy PandoraNext online by duplicating the Hugging Face Space, follow these steps:
-
-1. Get your PandoraNext license id here: [PandoraNext Dashboard](https://dash.pandoranext.com/)
-
-2. **Configure `config.json`:**
- Edit the following `config.json`. Specify your `license_id` and `proxy_api_prefix`. For the `proxy_api_prefix`, use at least 8 characters, avoid characters that can't be used in a URL and make sure it's unique.
-
- Here's the `config.json` for your reference:
-
- ```json
- {
- "bind": "0.0.0.0:8181",
- "tls": {
- "enabled": false,
- "cert_file": "",
- "key_file": ""
- },
- "timeout": 600,
- "proxy_url": "",
- "license_id": "",
- "public_share": false,
- "site_password": "",
- "setup_password": "",
- "server_tokens": true,
- "proxy_api_prefix": "",
- "isolated_conv_title": "*",
- "captcha": {
- "provider": "",
- "site_key": "",
- "site_secret": "",
- "site_login": false,
- "setup_login": false,
- "oai_username": false,
- "oai_password": false
- },
- "whitelist": null
- }
- ```
-
-3. **Hugging Face Space:**
- Visit the [PandoraNext LibreChat Space](https://huggingface.co/spaces/LibreChat/PandoraNext) on Hugging Face.
-
-4. **Duplicate the Space:**
- Utilize the available options to duplicate or fork the space into your own Hugging Face account.
-
-5. **Fill the required secrets**
- When asked for the `SECRETS`,
- - for `CONFIG_JSON` use the whole content of the `config.json` you just modified,
- - for `TOKENS_JSON` use the following default `token.json`:
- ```json
- {
- "test-1": {
- "token": "access token / session token / refresh token",
- "shared": true,
- "show_user_info": false
- },
- "test-2": {
- "token": "access token / session token / refresh token",
- "shared": true,
- "show_user_info": true,
- "plus": true
- },
- "test2": {
- "token": "access token / session token / refresh token / share token",
- "password": "12345"
- }
- }
- ```
-6. **Configure LibreChat:**
- In the .env file (or secrets settings if you host LibreChat on Hugging Face), set the `CHATGPT_REVERSE_PROXY` variable using the following format:
-
- ```bash
- CHATGPT_REVERSE_PROXY=http://your_server_domain.com/your_proxy_api_prefix_here/backend-api/conversation
- ```
-
- - Replace `your_server_domain.com` with the domain of your deployed space.
- - you can use this format: `https://username-pandoranext.hf.space` (replace `username` with your Huggingface username)
- - Replace `your_proxy_api_prefix_here` with the `proxy_api_prefix` you have set in your `config.json`.
- - The resulting URL should look similar to:
- `https://username-pandoranext.hf.space/your_proxy_api_prefix_here/backend-api/conversation`
+---
## Deploy Locally Using Docker
For local deployment using Docker, the steps are as follows:
-1. **Clone or Download the Repository:**
- Get the latest release from the [PandoraNext GitHub repository](https://github.com/pandora-next/deploy).
-
- ```bash
- git clone https://github.com/pandora-next/deploy.git
- ```
+### 1. **Clone or Download the Repository:**
+Get the latest release from the [PandoraNext GitHub repository](https://github.com/pandora-next/deploy).
+
+```bash
+git clone https://github.com/pandora-next/deploy.git
+```
+
+### 2. Get your PandoraNext `License ID`
+Visit the **[PandoraNext Dashboard](https://dash.pandoranext.com/)** to get your `license ID`
+
+### 3. **Configure `config.json`:**
+Within the cloned repository, in the `data` folder, edit `config.json`. Specify your `license_id` and `proxy_api_prefix`. For the `proxy_api_prefix`, use at least 8 characters, avoid characters that can't be used in a URL and make sure it's unique.
+
+Here's the `config.json` for your reference:
+
+```json
+{
+"bind": "0.0.0.0:8181",
+"tls": {
+ "enabled": false,
+ "cert_file": "",
+ "key_file": ""
+},
+"timeout": 600,
+"proxy_url": "",
+"license_id": "",
+"public_share": false,
+"site_password": "",
+"setup_password": "",
+"server_tokens": true,
+"proxy_api_prefix": "",
+"isolated_conv_title": "*",
+"captcha": {
+ "provider": "",
+ "site_key": "",
+ "site_secret": "",
+ "site_login": false,
+ "setup_login": false,
+ "oai_username": false,
+ "oai_password": false
+},
+"whitelist": null
+}
+```
+
+### 4. **Set Up the LibreChat `.env` Filer:**
+In the `.env` file within your LibreChat directory, you'll need to set the `CHATGPT_REVERSE_PROXY` variable:
+
+```bash
+CHATGPT_REVERSE_PROXY=http://host.docker.internal:8181/your_proxy_api_prefix_here/backend-api/conversation
+```
+- Replace `your_proxy_api_prefix_here` with the actual proxy API prefix.
+
+### 5. **Start Docker Containers:**
+From the PandoraNext directory, run the following command to launch the Docker containers:
+
+```bash
+docker-compose up -d
+```
+
+---
+
+## Deploy Online on Hugging Face
-2. Get your PandoraNext license id here: [PandoraNext Dashboard](https://dash.pandoranext.com/)
-
-3. **Configure `config.json`:**
- Within the cloned repository, in the `data` folder, edit `config.json`. Specify your `license_id` and `proxy_api_prefix`. For the `proxy_api_prefix`, use at least 8 characters, avoid characters that can't be used in a URL and make sure it's unique.
-
- Here's the `config.json` for your reference:
+To deploy PandoraNext online by duplicating the Hugging Face Space, follow these steps:
- ```json
- {
- "bind": "0.0.0.0:8181",
- "tls": {
- "enabled": false,
- "cert_file": "",
- "key_file": ""
+### 1. Get your PandoraNext `License ID`
+Visit the **[PandoraNext Dashboard](https://dash.pandoranext.com/)** to get your `license ID`
+
+### 2. **Configure `config.json`:**
+Edit the following `config.json`. Specify your `license_id` and `proxy_api_prefix`. For the `proxy_api_prefix`, use at least 8 characters, avoid characters that can't be used in a URL and make sure it's unique.
+
+Here's the `config.json` for your reference:
+
+```json
+{
+"bind": "0.0.0.0:8181",
+"tls": {
+ "enabled": false,
+ "cert_file": "",
+ "key_file": ""
+},
+"timeout": 600,
+"proxy_url": "",
+"license_id": "",
+"public_share": false,
+"site_password": "",
+"setup_password": "",
+"server_tokens": true,
+"proxy_api_prefix": "",
+"isolated_conv_title": "*",
+"captcha": {
+ "provider": "",
+ "site_key": "",
+ "site_secret": "",
+ "site_login": false,
+ "setup_login": false,
+ "oai_username": false,
+ "oai_password": false
+},
+"whitelist": null
+}
+```
+
+### 3. **Hugging Face Space:**
+Visit the [PandoraNext LibreChat Space](https://huggingface.co/spaces/LibreChat/PandoraNext) on Hugging Face.
+
+### 4. **Duplicate the Space:**
+Utilize the available options to duplicate or fork the space into your own Hugging Face account.
+
+### 5. **Fill the required secrets**
+When asked for the `SECRETS`,
+- for `CONFIG_JSON` use the whole content of the `config.json` you just modified,
+- for `TOKENS_JSON` use the following default `token.json`:
+```json
+{
+ "test-1": {
+ "token": "access token / session token / refresh token",
+ "shared": true,
+ "show_user_info": false
},
- "timeout": 600,
- "proxy_url": "",
- "license_id": "",
- "public_share": false,
- "site_password": "",
- "setup_password": "",
- "server_tokens": true,
- "proxy_api_prefix": "",
- "isolated_conv_title": "*",
- "captcha": {
- "provider": "",
- "site_key": "",
- "site_secret": "",
- "site_login": false,
- "setup_login": false,
- "oai_username": false,
- "oai_password": false
+ "test-2": {
+ "token": "access token / session token / refresh token",
+ "shared": true,
+ "show_user_info": true,
+ "plus": true
},
- "whitelist": null
+ "test2": {
+ "token": "access token / session token / refresh token / share token",
+ "password": "12345"
}
- ```
-
-4. **Set Up the LibreChat `.env` Filer:**
- In the `.env` file within your LibreChat directory, you'll need to set the `CHATGPT_REVERSE_PROXY` variable:
+}
+```
- ```bash
- CHATGPT_REVERSE_PROXY=http://host.docker.internal:8181/your_proxy_api_prefix_here/backend-api/conversation
- ```
- - Replace `your_proxy_api_prefix_here` with the actual proxy API prefix.
+### 6. **Configure LibreChat:**
+In the .env file (or secrets settings if you host LibreChat on Hugging Face), set the `CHATGPT_REVERSE_PROXY` variable using the following format:
-4. **Start Docker Containers:**
- From the PandoraNext directory, run the following command to launch the Docker containers:
+```bash
+CHATGPT_REVERSE_PROXY=http://your_server_domain.com/your_proxy_api_prefix_here/backend-api/conversation
+```
- ```bash
- docker-compose up -d
- ```
+- Replace `your_server_domain.com` with the domain of your deployed space.
+ - you can use this format: `https://username-pandoranext.hf.space` (replace `username` with your Huggingface username)
+- Replace `your_proxy_api_prefix_here` with the `proxy_api_prefix` you have set in your `config.json`.
+- The resulting URL should look similar to:
+`https://username-pandoranext.hf.space/your_proxy_api_prefix_here/backend-api/conversation`
## Final Notes
diff --git a/docs/features/plugins/azure_ai_search.md b/docs/features/plugins/azure_ai_search.md
index 865180c632d..0e874204532 100644
--- a/docs/features/plugins/azure_ai_search.md
+++ b/docs/features/plugins/azure_ai_search.md
@@ -1,3 +1,8 @@
+---
+title: ⚡ Azure AI Search
+description: How to configure Azure AI Search for answers to your questions with assistance from GPT.
+weight: -4
+---
# Azure AI Search Plugin
Through the plugins endpoint, you can use Azure AI Search for answers to your questions with assistance from GPT.
@@ -30,7 +35,7 @@ This is the authentication key to use when utilizing the search endpoint. Please
## Create or log in to your account on Azure Portal
-**1.** Visit [https://azure.microsoft.com/en-us/](https://azure.microsoft.com/en-us/) and click on `Get started` or `Try Azure for Free` to create an account and sign in.
+**1.** Visit **[https://azure.microsoft.com/en-us/](https://azure.microsoft.com/en-us/)** and click on `Get started` or `Try Azure for Free` to create an account and sign in.
**2.** Choose pay per use or Azure Free with $200.
@@ -72,7 +77,7 @@ Now select the free option or select your preferred option (may incur charges).

-**2.** Follow the Microsoft tutorial.[https://learn.microsoft.com/en-us/azure/search/search-get-started-portal](https://learn.microsoft.com/en-us/azure/search/search-get-started-portal), after finishing, save the name given to the index somewhere.
+**2.** Follow the Microsoft tutorial: **[https://learn.microsoft.com/en-us/azure/search/search-get-started-portal](https://learn.microsoft.com/en-us/azure/search/search-get-started-portal)**, after finishing, save the name given to the index somewhere.
**3.** Now you have your `AZURE_AI_SEARCH_INDEX_NAME`, copy and save it in a local safe place.
@@ -113,7 +118,7 @@ The following are configuration values that are not required but can be specifie
If there are concerns that the search result data may be too large and exceed the prompt size, consider reducing the size of the search result data by using AZURE_AI_SEARCH_SEARCH_OPTION_TOP and AZURE_AI_SEARCH_SEARCH_OPTION_SELECT.
For details on each parameter, please refer to the following document:
-https://learn.microsoft.com/en-us/rest/api/searchservice/search-documents
+**[https://learn.microsoft.com/en-us/rest/api/searchservice/search-documents](https://learn.microsoft.com/en-us/rest/api/searchservice/search-documents)**
```env
AZURE_AI_SEARCH_API_VERSION=2023-10-01-Preview
diff --git a/docs/features/plugins/chatgpt_plugins_openapi.md b/docs/features/plugins/chatgpt_plugins_openapi.md
index 21d4800922b..7bf8a04a0e4 100644
--- a/docs/features/plugins/chatgpt_plugins_openapi.md
+++ b/docs/features/plugins/chatgpt_plugins_openapi.md
@@ -1,21 +1,30 @@
+---
+title: 🧑💼 Official ChatGPT Plugins
+description: How to add official OpenAI Plugins to LibreChat
+weight: -8
+---
# Using official ChatGPT Plugins / OpenAPI specs
ChatGPT plugins are API integrations for OpenAI models that extend their capabilities. They are structured around three key components: an API, an **OpenAPI specification** (spec for short), and a JSON **Plugin Manifest** file.
-To learn more about them, or how to make your own, read here: [ChatGPT Plugins: Getting Started](https://platform.openai.com/docs/plugins/getting-started).
-
-Thanks to the introduction of [OpenAI Functions](https://openai.com/blog/function-calling-and-other-api-updates) and their utilization in [Langchain](https://js.langchain.com/docs/modules/chains/openai_functions/openapi), it's now possible to directly use OpenAI Plugins through LibreChat, without building any custom langchain tools. The main use case we gain from integrating them to LibreChat is to allow use of plugins with gpt-3.5 models, and without ChatGPT Plus. They also find a great use case when you want to limit your own private API's interactions with chat.openai.com and their servers in favor of a self-hosted LibreChat instance.
-
-### Table of Contents
-- [Intro](#intro)
-- [Adding a Plugin](#adding-a-plugin)
-- [Editing Manifest Files](#editing-manifest-files)
- - [Override Parameter Values](#override-parameter-values)
- - [Add Header Fields](#add-header-fields)
- - [Custom OpenAPI Spec files](#custom-openapi-spec-files)
- - [Plugins with Authentication](#plugins-with-authentication)
-- [Showcase](#showcase)
-- [Disclaimers](#disclaimers)
+To learn more about them, or how to make your own, read here: **[ChatGPT Plugins: Getting Started](https://platform.openai.com/docs/plugins/getting-started)**
+
+Thanks to the introduction of **[OpenAI Functions](https://openai.com/blog/function-calling-and-other-api-updates)** and their utilization in **[Langchain](https://js.langchain.com/docs/modules/chains/openai_functions/openapi)**, it's now possible to directly use OpenAI Plugins through LibreChat, without building any custom langchain tools. The main use case we gain from integrating them to LibreChat is to allow use of plugins with gpt-3.5 models, and without ChatGPT Plus. They also find a great use case when you want to limit your own private API's interactions with chat.openai.com and their servers in favor of a self-hosted LibreChat instance.
+
+
## Intro
@@ -24,11 +33,11 @@ Before continuing, it's important to fully distinguish what a Manifest file is v
### **[Plugin Manifest File:](https://platform.openai.com/docs/plugins/getting-started/plugin-manifest)**
- Usually hosted on the API’s domain as `https://example.com/.well-known/ai-plugin.json`
- The manifest file is required for LLMs to connect with your plugin. If there is no file found, the plugin cannot be installed.
-- Has required properties, and will error if they are missing. Check what they are in the [OpenAI Docs](https://platform.openai.com/docs/plugins/getting-started/plugin-manifest)
+- Has required properties, and will error if they are missing. Check what they are in the **[OpenAI Docs](https://platform.openai.com/docs/plugins/getting-started/plugin-manifest)**
- Has optional properties, specific to LibreChat, that will enable them to work consistently, or for customizing headers/params made by every API call (see below)
### **[OpenAPI Spec](https://platform.openai.com/docs/plugins/getting-started/openapi-definition)**
-- The OpenAPI specification is used to document the API that the plugin will interact with. It is a [universal format](https://www.openapis.org/) meant to standardize API definitions.
+- The OpenAPI specification is used to document the API that the plugin will interact with. It is a **[universal format](https://www.openapis.org/)** meant to standardize API definitions.
- Referenced by the Manifest file in its `api.url` property
- Usually as `https://example.com/openapi.yaml` or `.../swagger.yaml`
- Can be a .yaml or .json file
@@ -45,7 +54,7 @@ Download the Plugin manifest file, or copy the raw JSON data into a new file, an
`api\app\clients\tools\.well-known`
-You should see multiple manifest files that have been tested, or edited, to work with LibreChat. ~~I've renamed them by their `name_for_model` property and it's recommended, but not required, that you do the same.~~ As of v0.5.8, It's **required** to name the manifest JSON file after its `name_for_model` property should you add one yourself.
+You should see multiple manifest files that have been tested, or edited, to work with LibreChat. As of v0.5.8, It's **required** to name the manifest JSON file after its `name_for_model` property should you add one yourself.
After doing so, start/re-start the project server and they should now load in the Plugin store.
@@ -144,7 +153,7 @@ curl -H "Authorization: Bearer ffc5226d1af346c08a98dee7deec9f76" https://example
As of now, LibreChat only supports plugins using Bearer Authentication, like in the example above.
-If your plugin requires authentication, it's necessary to have these fields filled in your manifest file according to [OpenAI definitions](https://platform.openai.com/docs/plugins/getting-started/plugin-manifest), which for Bearer Authentication must follow the schema above.
+If your plugin requires authentication, it's necessary to have these fields filled in your manifest file according to **[OpenAI definitions](https://platform.openai.com/docs/plugins/getting-started/plugin-manifest)**, which for Bearer Authentication must follow the schema above.
Important: Some ChatGPT plugins may use Bearer Auth., but have either stale verification tokens in their manifest, or only support calls from OpenAI servers. Web Pilot is one with the latter case, and thankfully it has a required header field for allowing non-OpenAI origination. See above for editing headers.
@@ -160,16 +169,16 @@ Important: Some ChatGPT plugins may use Bearer Auth., but have either stale veri
## Disclaimers
-Use of ChatGPT Plugins is only possible with official OpenAI models and their use of [Functions](https://platform.openai.com/docs/api-reference/chat/create#chat/create-functions). If you are accessing OpenAI models via reverse proxy through some 3rd party service, function calling may not be supported.
+Use of ChatGPT Plugins is only possible with official OpenAI models and their use of **[Functions](https://platform.openai.com/docs/api-reference/chat/create#chat/create-functions)**. If you are accessing OpenAI models via reverse proxy through some 3rd party service, function calling may not be supported.
-This implementation depends on the [LangChain OpenAPI Chain](https://js.langchain.com/docs/modules/chains/openai_functions/openapi) and general improvements to its use here will have to be made to the LangChainJS library.
+This implementation depends on the **[LangChain OpenAPI Chain](https://js.langchain.com/docs/modules/chains/openai_functions/openapi)** and general improvements to its use here will have to be made to the LangChainJS library.
Custom Langchain Tools are preferred over ChatGPT Plugins/OpenAPI specs as this can be more token-efficient, especially with OpenAI Functions. A better alternative may be to make a Langchain tool modelled after an OpenAPI spec, for which I'll make a guide soon.
LibreChat's implementation is not 1:1 with ChatGPT's, as OpenAI has a robust, exclusive, and restricted authentication pipeline with its models & specific plugins, which are not as limited by context windows and token usage. Furthermore, some of their hosted plugins requiring authentication will not work, especially those with OAuth or stale verification tokens, and some may not be handled by the LLM in the same manner, especially those requiring multi-step API calls.
-Some plugins may detect that the API call does not originate from OpenAI's servers, will either be defunct outside of chat.openai.com or need special handling, and/or editing of their manifest/spec files. This is not to say plugin use will not improve and more closely mirror how ChatGPT handles plugins, but there is still work to this end. In short, some will work perfectly while others may not work at all.
+Some plugins may detect that the API call does not originate from OpenAI's servers, will either be defunct outside of **[chat.openai.com](https://chat.openai.com/)** or need special handling, and/or editing of their manifest/spec files. This is not to say plugin use will not improve and more closely mirror how ChatGPT handles plugins, but there is still work to this end. In short, some will work perfectly while others may not work at all.
-The use of ChatGPT Plugins with LibreChat does not violate OpenAI's [Terms of Service](https://openai.com/policies/terms-of-use). According to their [Service Terms](https://openai.com/policies/service-terms) and [Usage Policies](https://openai.com/policies/usage-policies), the host, in this case OpenAI, is not responsible for the plugins hosted on their site and their usage outside of their platform, chat.openai.com. Furthermore, there is no explicit mention of restrictions on accessing data that is not directly displayed to the user. Therefore, accessing the payload of their plugins for display purposes is not in violation of their Terms of Service.
+The use of ChatGPT Plugins with LibreChat does not violate OpenAI's **[Terms of Service](https://openai.com/policies/terms-of-use)**. According to their **[Service Terms](https://openai.com/policies/service-terms)** and **[Usage Policies](https://openai.com/policies/usage-policies)**, the host, in this case OpenAI, is not responsible for the plugins hosted on their site and their usage outside of their platform, **[chat.openai.com](https://chat.openai.com/)**. Furthermore, there is no explicit mention of restrictions on accessing data that is not directly displayed to the user. Therefore, accessing the payload of their plugins for display purposes is not in violation of their Terms of Service.
-Please note that the ChatGPT Plugins integration is currently in an alpha state, and you may encounter errors. Although preliminary testing has been conducted, not all plugins have been thoroughly tested, and you may find that some I haven't added will not work for any one of the reasons I've mentioned above. Some of the errors may be caused by the plugin itself, and will also not work on https://chat.openai.com/. If you encounter any errors, double checking if they work on the official site is advisable before reporting them as a GitHub issue. I can only speak for the ones I tested and included, and the date of inclusion.
+Please note that the ChatGPT Plugins integration is currently in an alpha state, and you may encounter errors. Although preliminary testing has been conducted, not all plugins have been thoroughly tested, and you may find that some I haven't added will not work for any one of the reasons I've mentioned above. Some of the errors may be caused by the plugin itself, and will also not work on **[chat.openai.com](https://chat.openai.com/)**. If you encounter any errors, double checking if they work on the official site is advisable before reporting them as a GitHub issue. I can only speak for the ones I tested and included, and the date of inclusion.
diff --git a/docs/features/plugins/google_search.md b/docs/features/plugins/google_search.md
index a412bc628f5..0b575414f2c 100644
--- a/docs/features/plugins/google_search.md
+++ b/docs/features/plugins/google_search.md
@@ -1,3 +1,9 @@
+---
+title: 🔎 Google Search
+description: How to set up and use the Google Search Plugin, which allows you to query Google with GPT's help.
+weight: -7
+---
+
# Google Search Plugin
Through the plugins endpoint, you can use google search for answers to your questions with assistance from GPT! To get started, you need to get a Google Custom Search API key, and a Google Custom Search Engine ID. You can then define these as follows in your `.env` file:
```env
@@ -5,9 +11,9 @@ GOOGLE_API_KEY="...."
GOOGLE_CSE_ID="...."
```
-You first need to create a programmable search engine and get the search engine ID: https://developers.google.com/custom-search/docs/tutorial/creatingcse
+You first need to create a programmable search engine and get the search engine ID: **[https://developers.google.com/custom-search/docs/tutorial/creatingcse](https://developers.google.com/custom-search/docs/tutorial/creatingcse)**
-Then you can get the API key, click the "Get a key" button on this page: https://developers.google.com/custom-search/v1/introduction
+Then you can get the API key, click the "Get a key" button on this page: **[https://developers.google.com/custom-search/v1/introduction](https://developers.google.com/custom-search/v1/introduction)**
diff --git a/docs/features/plugins/index.md b/docs/features/plugins/index.md
new file mode 100644
index 00000000000..7eb2d3f1539
--- /dev/null
+++ b/docs/features/plugins/index.md
@@ -0,0 +1,14 @@
+---
+title: Plugins
+description: 🔌 All about plugins, how to make them, how use the official ChatGPT plugins, and how to configure custom plugins.
+weight: -10
+---
+
+# Plugins
+* 🔌 [Introduction](./introduction.md)
+* 🛠️ [Make Your Own](./make_your_own.md)
+* 🧑💼 [Official ChatGPT Plugins](./chatgpt_plugins_openapi.md)
+* 🔎 [Google Search](./google_search.md)
+* 🖌️ [Stable Diffusion](./stable_diffusion.md)
+* 🧠 [Wolfram|Alpha](./wolfram.md)
+* ⚡ [Azure AI Search](./azure_ai_search.md)
\ No newline at end of file
diff --git a/docs/features/plugins/introduction.md b/docs/features/plugins/introduction.md
index 3f1bd376c02..f5533c82bf1 100644
--- a/docs/features/plugins/introduction.md
+++ b/docs/features/plugins/introduction.md
@@ -1,34 +1,34 @@
+---
+title: 🔌 Introduction
+description: This doc introduces the plugins endpoint, which enables you to use different LLMs and tools with more flexibility and control. You can change your settings and plugins on the fly, and use plugins to access various sources of information and assistance.
+weight: -10
+---
# Plugins Endpoint
-
+
+
The plugins endpoint opens the door to prompting LLMs in new ways other than traditional input/output prompting.
-The first step is using chain-of-thought prompting & ["agency"](https://zapier.com/blog/ai-agent/) for using plugins/tools in a fashion mimicing the official ChatGPT Plugins feature.
+The first step is using chain-of-thought prompting & **["agency"](https://zapier.com/blog/ai-agent/)** for using plugins/tools in a fashion mimicing the official ChatGPT Plugins feature.
More than this, you can use this endpoint for changing your conversation settings mid-conversation. Unlike the official ChatGPT site and all other endpoints, you can switch models, presets, and settings mid-convo, even when you have no plugins selected. This is useful if you first want a creative response from GPT-4, and then a deterministic, lower cost response from GPT-3. Soon, you will be able to use Google, HuggingFace, local models, all in this or a similar endpoint in the same modular manner.
-### Roadmap:
-- More plugins and advanced plugin usage (ongoing)
-- **[ChatGPT Plugins/OpenAPI Specs (complete)](./chatgpt_plugins_openapi.md)**
-- More LLMs to choose from for both Thinking and Completion Phases
-- Alternative prompting methods such as Tree-of-Thought
-
## Using Plugins
The LLM process when using Plugins is illustrated below.
-
+
**When you open the settings with the Plugins endpoint selected, you will view the default settings for the Completion Phase.**
Clicking on **"Show Agent Settings"** will allow you to modify parameters for the thinking phase
-
+
---
-
+
- You can specify which plugins you would like to select from by installing/uninstalling them in the Plugin store
- See this guide on how to create your own plugins (WIP)
@@ -53,8 +53,8 @@ Clicking on **"Show Agent Settings"** will allow you to modify parameters for th
- **[Stable Diffusion](./stable_diffusion.md)**
- **[Wolfram](./wolfram.md)**
- **DALL-E** - same setup as above, you just need an OpenAI key, and it's made distinct from your main API key to make Chats but it can be the same one
-- **Zapier** - You need a Zapier account. Get your [API key from here](https://nla.zapier.com/credentials/) after you've made an account
- - Create allowed actions - Follow step 3 in this [getting start guide](https://nla.zapier.com/start/) from Zapier
+- **Zapier** - You need a Zapier account. Get your **[API key from here](https://nla.zapier.com/credentials/)** after you've made an account
+ - Create allowed actions - Follow step 3 in this **[Start Here guide](https://nla.zapier.com/start/)** from Zapier
- ⚠️ NOTE: zapier is known to be finicky with certain actions. I found that writing email drafts is probably the best use of it
- there are improvements that can be made to override the official NLA integration and that is TBD
- **Browser/Scraper** - This is not to be confused with 'browsing' on chat.openai.com (which is technically a plugin suite or multiple plugins)
@@ -63,7 +63,7 @@ Clicking on **"Show Agent Settings"** will allow you to modify parameters for th
- A better solution for 'browsing' is planned but can't guarantuee when
- This plugin is best used in combination with google so it doesn't hallucinate webpages to visit
- **Serpapi** - an alternative to Google search but not as performant in my opinion
- - You can get an API key here: https://serpapi.com/dashboard
+ - You can get an API key here: **[https://serpapi.com/dashboard](https://serpapi.com/dashboard)**
- For free tier, you are limited to 100 queries/month
- With google, you are limited to 100/day for free, which is a better deal, and any after may cost you a few pennies
diff --git a/docs/features/plugins/make_your_own.md b/docs/features/plugins/make_your_own.md
index 565a7cf10eb..e6534e47aff 100644
--- a/docs/features/plugins/make_your_own.md
+++ b/docs/features/plugins/make_your_own.md
@@ -1,14 +1,19 @@
+---
+title: 🛠️ Make Your Own
+description: This doc shows you how to create custom plugins for LibreChat by extending the LangChain `Tool` class. You will learn how to use different APIs and functions with your plugins, and how to integrate them with the LangChain framework.
+weight: -9
+---
# Making your own Plugin
Creating custom plugins for this project involves extending the `Tool` class from the `langchain/tools` module.
**Note:** I will use the word plugin interchangeably with tool, as the latter is specific to LangChain, and we are mainly conforming to the library.
-You are essentially creating DynamicTools in LangChain speak. See the [LangChainJS docs](https://js.langchain.com/docs/modules/agents/tools/dynamic) for more info.
+You are essentially creating DynamicTools in LangChain speak. See the **[LangChainJS docs](https://js.langchain.com/docs/modules/agents/tools/dynamic)** for more info.
This guide will walk you through the process of creating your own custom plugins, using the `StableDiffusionAPI` and `WolframAlphaAPI` tools as examples.
-When using the Functions Agent (the default mode for plugins), tools are converted to [OpenAI functions](https://openai.com/blog/function-calling-and-other-api-updates); in any case, plugins/tools are invoked conditionally based on the LLM generating a specific format that we parse.
+When using the Functions Agent (the default mode for plugins), tools are converted to **[OpenAI functions](https://openai.com/blog/function-calling-and-other-api-updates)**; in any case, plugins/tools are invoked conditionally based on the LLM generating a specific format that we parse.
The most common implementation of a plugin is to make an API call based on the natural language input from the AI, but there is virtually no limit in programmatic use case.
@@ -43,7 +48,7 @@ Remember, the key to creating a custom plugin is to extend the `Tool` class and
**Multi-Input Plugins**
-If you would like to make a plugin that would benefit from multiple inputs from the LLM, instead of a singular input string as we will review, you need to make a LangChain [StructuredTool](https://blog.langchain.dev/structured-tools/) instead. A detailed guide for this is in progress, but for now, you can look at how I've made StructuredTools in this directory: `api\app\clients\tools\structured\`. This guide is foundational to understanding StructuredTools, and it's recommended you continue reading to better understand LangChain tools first. The blog linked above is also helpful once you've read through this guide.
+If you would like to make a plugin that would benefit from multiple inputs from the LLM, instead of a singular input string as we will review, you need to make a LangChain **[StructuredTool](https://blog.langchain.dev/structured-tools/)** instead. A detailed guide for this is in progress, but for now, you can look at how I've made StructuredTools in this directory: `api\app\clients\tools\structured\`. This guide is foundational to understanding StructuredTools, and it's recommended you continue reading to better understand LangChain tools first. The blog linked above is also helpful once you've read through this guide.
---
@@ -127,7 +132,7 @@ class StableDiffusionAPI extends Tool {
The `_call` method is where the main functionality of your plugin is implemented. This method is called when the language model decides to use your plugin. It should take an `input` parameter and return a result.
-> In a basic Tool, the LLM will generate one string value as an input. If your plugin requires multiple inputs from the LLM, read the [StructuredTools](#StructuredTools) section.
+> In a basic Tool, the LLM will generate one string value as an input. If your plugin requires multiple inputs from the LLM, read the **[StructuredTools](#StructuredTools)** section.
```javascript
class StableDiffusionAPI extends Tool {
diff --git a/docs/features/plugins/stable_diffusion.md b/docs/features/plugins/stable_diffusion.md
index 8ae3bd78f17..e9734cc511f 100644
--- a/docs/features/plugins/stable_diffusion.md
+++ b/docs/features/plugins/stable_diffusion.md
@@ -1,12 +1,18 @@
+---
+title: 🖌️ Stable Diffusion
+description: How to set up and configure the Stable Diffusion plugin
+weight: -6
+---
+
# Stable Diffusion Plugin
-To use Stable Diffusion with this project, you will either need to download and install [stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui) or, for a dockerized deployment, you can also use [stable-diffusion-webui-docker](https://github.com/AbdBarho/stable-diffusion-webui-docker)
+To use Stable Diffusion with this project, you will either need to download and install **[AUTOMATIC1111 - Stable Diffusion WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui)** or, for a dockerized deployment, you can also use **[stable-diffusion-webui-docker](https://github.com/AbdBarho/stable-diffusion-webui-docker)**
With the docker deployment you can skip step 2 and step 3, use the setup instructions from their repository instead.
- Note: you need a compatible GPU ("CPU-only" is possible but very slow). Nvidia is recommended, but there is no clear resource on incompatible GPUs. Any decent GPU should work.
-## 1. Follow download and installation instructions from [stable-diffusion-webui readme](https://github.com/AUTOMATIC1111/stable-diffusion-webui)
+## 1. Follow download and installation instructions from **[stable-diffusion-webui readme](https://github.com/AUTOMATIC1111/stable-diffusion-webui)**
## 2. Edit your run script settings
@@ -58,10 +64,10 @@ With the docker deployment you can skip step 2 and step 3, use the setup instruc
### Select the plugins endpoint
-
+
### Open the Plugin store and Install Stable Diffusion
-
+

diff --git a/docs/features/plugins/wolfram.md b/docs/features/plugins/wolfram.md
index b00e8ff22ad..0237e2d515f 100644
--- a/docs/features/plugins/wolfram.md
+++ b/docs/features/plugins/wolfram.md
@@ -1,21 +1,32 @@
+---
+title: 🧠 Wolfram|Alpha
+description: How to set up and configure the Wolfram Alpha plugin
+weight: -5
+---
+
# Wolfram Alpha Plugin
An AppID must be supplied in all calls to the Wolfram|Alpha API.
- Note: Wolfram API calls are limited to 100 calls/day and 2000/month for regular users.
-## 1. Make an account at Wolfram|Alpha
-## 2. Go to the Developer Portal click on "Get an AppID".
-## 3. Configure it in LibreChat
-### Select the plugins endpoint
-
-### Open the Plugin store
-
-### Install Wolfram and Provide your AppID
+### Make an account
+- Visit: **[products.wolframalpha.com/api/](https://products.wolframalpha.com/api/)** to create your account
+
+### Get your AppID
+- Go to the **[Developer Portal](https://developer.wolframalpha.com/portal/myapps/)** click on `Get an AppID`.
+
+### Configure it in LibreChat
+- Select the plugins endpoint
+
+- Open the Plugin store
+
+- Install Wolfram and Provide your AppID

-- Alternatively: you (the admin) can set the value in `\.env` to bypass the prompt: `WOLFRAM_APP_ID=your_app_id`
+> Alternatively: you (the admin) can set the value in `\.env` to bypass the prompt: `WOLFRAM_APP_ID=your_app_id`
+
-## 5. Select the plugin and enjoy!
+### Select the plugin and enjoy!

diff --git a/docs/features/presets.md b/docs/features/presets.md
new file mode 100644
index 00000000000..3f26cd8411f
--- /dev/null
+++ b/docs/features/presets.md
@@ -0,0 +1,92 @@
+---
+title: 🔖 Presets
+description: The "presets" feature in our app is a powerful tool that allows users to save and load predefined settings for their conversations. Users can import and export these presets as JSON files, set a default preset, and share them with others on Discord.
+weight: -9
+---
+# Guide to Using the "Presets" Feature
+
+The "presets" feature in our app is a powerful tool that allows users to save and load predefined settings for their conversations. Users can import and export these presets as JSON files, set a default preset, and share them with others on Discord.
+
+
+
+## Create a Preset:
+
+- Go in the model settings
+
+
+
+- Choose the model, give it a name, some custom instructions, and adjust the parameters if needed
+
+
+
+- Test it
+
+
+
+- Go back in the model advanced settings, and tweak it if needed. When you're happy with the result, click on `Save As Preset` (from the model advanced settings)
+
+
+
+- Give it a proper name, and click save
+
+
+
+- Now you can select it from the preset menu!
+
+
+
+## Parameters Explained:
+
+- **Preset Name:**
+ - This is where you name your preset for easy identification.
+
+- **Endpoint:**
+ - Choose the endpoint, such as openAI, that you want to use for processing the conversation.
+
+- **Model:**
+ - Select the model like `gpt-3.5-turbo` that will be used for generating responses.
+
+- **Custom Name:**
+ - Optionally provide a custom name for your preset. This is the name that will be shown in the UI when using it.
+
+- **Prompt Prefix:**
+ - Define instructions or guidelines that will be displayed before each prompt to guide the user in providing input.
+
+- **Temperature:**
+ - Adjust this parameter to control the randomness of the model's output. A higher value makes the output more random, while a lower value makes it more focused and deterministic.
+
+- **Top P:**
+ - Control the nucleus sampling parameter to influence the diversity of generated text. Lower values make text more focused while higher values increase diversity.
+
+- **Frequency Penalty:**
+ - Use this setting to penalize frequently occurring tokens and promote diversity in responses.
+
+- **Presence Penalty:**
+ - Adjust this parameter to penalize new tokens that are introduced into responses, controlling repetition and promoting consistency.
+
+## Importing/Exporting Presets
+
+You can easily import or export presets as JSON files by clicking on either 'Import' or 'Export' buttons respectively. This allows you to share your customized settings with others or switch between different configurations quickly.
+
+
+
+To export a preset, first go in the preset menu, then click on the button to edit the selected preset
+
+
+
+Then in the bottom of the preset settings you'll have the option to export it.
+
+
+
+
+
+## Setting Default Preset
+
+Choose a preset as default so it loads automatically whenever you start a new conversation. This saves time if you often use specific settings.
+
+
+
+
+## Sharing on Discord
+
+Join us on [discord](https://discord.librechat.ai) and see our **[#presets ](https://discord.com/channels/1086345563026489514/1093249324797935746)** channel where thousands of presets are shared by users worldwide. Check out pinned posts for popular presets!
\ No newline at end of file
diff --git a/docs/features/proxy.md b/docs/features/proxy.md
deleted file mode 100644
index 586fbe58db9..00000000000
--- a/docs/features/proxy.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Proxy
-
-If your server cannot connect to the chatGPT API server by some reason, (eg in China). You can set a environment variable `PROXY`. This will be transmitted to `node-chatgpt-api` interface.
-
-**Warning:** `PROXY` is not `reverseProxyUrl` in `node-chatgpt-api`
-
-## Set up proxy in local environment
-
-- **Option 1:** system level environment
-`export PROXY="http://127.0.0.1:7890"`
-
-- **Option 2:** set in .env file
-`PROXY="http://127.0.0.1:7890"`
-
-**Change `http://127.0.0.1:7890` to your proxy server**
-
-
-## Set up proxy in docker environment
-
-set in docker-compose.yml file, under services - api - environment
-
-```
- api:
- ...
- environment:
- ...
- - "PROXY=http://127.0.0.1:7890"
- # add this line ↑
-```
-
-**Change `http://127.0.0.1:7890` to your proxy server**
-
diff --git a/docs/features/third_party.md b/docs/features/third_party.md
index 888ac190ec6..3161e440402 100644
--- a/docs/features/third_party.md
+++ b/docs/features/third_party.md
@@ -1,3 +1,9 @@
+---
+title: ✨ Third-Party Tools and Contributions
+description: Collection of third-party tools provided by the community
+weight: -2
+---
+
# Third-Party Tools
> ⚠️ Warning: The tools featured here are not officially maintained or supported by the LibreChat team
diff --git a/docs/features/token_usage.md b/docs/features/token_usage.md
index e04ed3ca6be..0dfc835309c 100644
--- a/docs/features/token_usage.md
+++ b/docs/features/token_usage.md
@@ -1,3 +1,8 @@
+---
+title: 🪙 Token Usage
+description: This doc covers how to track and control your token usage for the OpenAI/Plugins endpoints in LibreChat. You will learn how to view your transactions, enable user balances, and add credits to your account.
+weight: -7
+---
# Token Usage
As of v6.0.0, LibreChat accurately tracks token usage for the OpenAI/Plugins endpoints.
@@ -25,6 +30,14 @@ npm run add-balance danny@librechat.ai 1000
This works well to track your own usage for personal use; 1000 credits = $0.001 (1 mill USD)
+## Listing of balances
+
+To see the balances of your users, you can run:
+
+```bash
+npm run list-balances
+```
+
## Notes
- With summarization enabled, you will be blocked from making an API request if the cost of the content that you need to summarize + your messages payload exceeds the current balance
diff --git a/docs/general_info/breaking_changes.md b/docs/general_info/breaking_changes.md
index b46bc2dfaa7..9991d42f6ff 100644
--- a/docs/general_info/breaking_changes.md
+++ b/docs/general_info/breaking_changes.md
@@ -1,4 +1,9 @@
-# ⚠️ **Breaking Changes** ⚠️
+---
+title: ⚠️ Breaking Changes
+description: This doc lists the breaking changes that affect the functionality and compatibility of LibreChat. You should read this doc before updating to a new version of LibreChat, and follow the instructions to resolve any issues.
+weight: -10
+---
+# ⚠️ Breaking Changes
> **Note:**
**If you experience any issues after updating, we recommend clearing your browser cache and cookies.**
@@ -20,7 +25,7 @@ Certain changes in the updates may impact cookies, leading to unexpected behavio
## v0.5.8
-- It's now required to name manifest JSON files (for [ChatGPT Plugins](..\features\plugins\chatgpt_plugins_openapi.md)) in the `api\app\clients\tools\.well-known` directory after their `name_for_model` property should you add one yourself.
+- It's now required to name manifest JSON files (for [ChatGPT Plugins](../features/plugins/chatgpt_plugins_openapi.md)) in the `api\app\clients\tools\.well-known` directory after their `name_for_model` property should you add one yourself.
- This was a recommended convention before, but is now required.
## v0.5.7
@@ -120,7 +125,7 @@ I had to change the environment variable from AZURE_OPENAI_API_KEY to AZURE_API_
---
### Docker
-- The docker-compose file had some change. Review the [new docker instructions](../install/docker_compose_install.md) to make sure you are setup properly. This is still the simplest and most effective method.
+- The docker-compose file had some change. Review the [new docker instructions](../install/installation/docker_compose_install.md) to make sure you are setup properly. This is still the simplest and most effective method.
---
diff --git a/docs/general_info/index.md b/docs/general_info/index.md
new file mode 100644
index 00000000000..1addb356e70
--- /dev/null
+++ b/docs/general_info/index.md
@@ -0,0 +1,13 @@
+---
+title: General Information
+description: 📜 This section contains information about LibreChat, such as its history, purpose, and values. You will also find the details of the tech stack, the code of conduct, and the breaking changes that affect the project.
+weight: 4
+---
+
+# General Information
+
+ * ⚠️ [Breaking Changes](./breaking_changes.md)
+ * 👮 [Code of Conduct](https://github.com/danny-avila/LibreChat/blob/main/.github/CODE_OF_CONDUCT.md)
+ * 🌍 [Multilingual Information](multilingual_information.md)
+ * 🧭 [Origin](project_origin.md)
+ * 🧑💻 [Tech Stack](tech_stack.md)
\ No newline at end of file
diff --git a/docs/general_info/multilingual_information.md b/docs/general_info/multilingual_information.md
index 13ae755365f..5b51c4eea57 100644
--- a/docs/general_info/multilingual_information.md
+++ b/docs/general_info/multilingual_information.md
@@ -1,3 +1,8 @@
+---
+title: 🌍 Multilingual Information
+description: To set up the project, please follow the instructions in the documentation. The documentation is in English only, so you may need to use a translation tool or an AI assistant (e.g. ChatGPT) if you have difficulty understanding it.
+weight: -9
+---
# Multilingual Information
To set up the project, please follow the instructions in the documentation. The documentation is in English only, so you may need to use a translation tool or an AI assistant (e.g. ChatGPT) if you have difficulty understanding it.
diff --git a/docs/general_info/project_origin.md b/docs/general_info/project_origin.md
index d15244cda72..d1dc673238f 100644
--- a/docs/general_info/project_origin.md
+++ b/docs/general_info/project_origin.md
@@ -1,3 +1,8 @@
+---
+title: 🧭 Origin
+description: How it all started...
+weight: -8
+---
# Origin
This project was started early in Feb '23, anticipating the release of the official ChatGPT API from OpenAI, which is now used. It was originally created as a Minimum Viable Product (or MVP) for the [@HackReactor](https://github.com/hackreactor/) Bootcamp. It was built with OpenAI response streaming and most of the UI completed in under 20 hours. During the end of that time, I had most of the UI and basic functionality done. This was created without using any boilerplates or templates, including create-react-app and other toolchains. I didn't follow any 'un-official chatgpt' video tutorials, and simply referenced the official site for the UI. The purpose of the exercise was to learn setting up a full stack project from scratch.
diff --git a/docs/general_info/tech_stack.md b/docs/general_info/tech_stack.md
index 2a4f38d96a4..acb0100b5bf 100644
--- a/docs/general_info/tech_stack.md
+++ b/docs/general_info/tech_stack.md
@@ -1,9 +1,37 @@
+---
+title: 🧑💻 Tech Stack
+description: This doc describes the technologies and frameworks that LibreChat uses.
+weight: -8
+---
# Tech Stack
## This project uses:
-- [node-chatgpt-api](https://github.com/waylaidwanderer/node-chatgpt-api)
-- No React boilerplate/toolchain/clone tutorials, created from scratch with react@latest
-- Use of Tailwind CSS and [shadcn/ui](https://github.com/shadcn/ui) components
-- Docker, useSWR, Redux, Express, MongoDB, [Keyv](https://www.npmjs.com/package/keyv)
+- JavaScript/TypeScript: The project was initially developed entirely in JavaScript (JS). The frontend is in the process of transitioning from JS to TypeScript (TS). The backend is currently in JS, and there are considerations for transitioning it to TS in the future.
+
+- React: The frontend UI is built using React.
+
+- Express.js: The backend server is built using Express.js.
+
+- OpenAI API: The project uses the official ChatGPT API from OpenAI.
+
+- Docker: Docker is used for containerization of the application.
+
+- MongoDB: MongoDB is used as the database for the application.
+
+- npm: npm is used as the package manager.
+
+- Git: Git is used for version control, following a GitFlow workflow.
+
+- ESLint: ESLint is used for linting the codebase.
+
+- Husky: Husky is used for pre-commit checks.
+
+- Playwright: Playwright is used for running integration tests.
+
+- GitHub: GitHub is used for hosting the codebase and managing contributions.
+
+- Discord: Discord is used for community engagement and discussions.
+
+- Various Cloud Deployment Options: The project supports deployment on multiple cloud platforms including DigitalOcean, Azure, Linode, Cloudflare, Ngrok, HuggingFace, and Render.
diff --git a/docs/index.md b/docs/index.md
index 7dbbd55c806..3abf481c36d 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,3 +1,9 @@
+---
+title: Home
+description: 🪶 Introducing LibreChat
+weight: -10
+---
+