Compare commits

...
127 Commits
Author SHA1 Message Date
Timothy Jaeryang Baek 7b8f923981 Merge pull request #5711 from open-webui/dev
0.3.30
2024-09-26 04:13:54 +02:00
Timothy J. Baek be41994d40 Update CHANGELOG.md 2024-09-26 04:12:19 +02:00
Timothy J. Baek 5361896411 doc: changelog 2024-09-26 04:11:13 +02:00
Timothy J. Baek c754c53906 refac 2024-09-26 04:05:28 +02:00
Timothy J. Baek 78d6647885 refac 2024-09-26 03:25:44 +02:00
Timothy J. Baek 4eeb669ac3 refac 2024-09-26 03:21:37 +02:00
Timothy J. Baek 26465f3e92 chore: bump 2024-09-26 03:14:06 +02:00
Timothy J. Baek 9d25207b83 refac 2024-09-26 03:13:38 +02:00
Timothy Jaeryang Baek cc19b8049a Merge pull request #5710 from kivvi3412/fix_o1_max_tokens
Fix: o1 input parameter must be max_completion_tokens
2024-09-26 03:03:15 +02:00
Timothy J. Baek 3a163b6392 fix: pip install database save issue 2024-09-26 03:02:08 +02:00
kivvi 405d0561df Fix: o1 input parameter must be max_completion_tokens 2024-09-26 08:49:59 +08:00
Timothy J. Baek ee33b4e2a3 fix: ollama /embed form_data 2024-09-25 22:34:02 +02:00
Timothy J. Baek 888479aaf0 refac: update toast dismiss behaviour 2024-09-25 20:47:04 +02:00
Timothy Jaeryang Baek 82cda6e522 Merge pull request #5699 from open-webui/dev
0.3.29
2024-09-25 15:46:39 +02:00
Timothy J. Baek 119a7f1933 doc: changelog 2024-09-25 15:45:36 +02:00
Timothy J. Baek 6c4445d545 fix: filter outlet issue 2024-09-25 13:44:06 +02:00
Timothy J. Baek 92b1acd6fb fix: RESET_CONFIG_ON_START not working 2024-09-25 01:06:11 +02:00
Timothy J. Baek 1767b64135 fix: 'call' url search param not working 2024-09-25 01:02:48 +02:00
Timothy Jaeryang Baek e030f261d1 Merge pull request #5675 from sp301415/dev
fix: Fix KaTeX Rendering (Followup)
2024-09-24 20:58:22 +02:00
Hwang In Tak d501ece247 fix: Fix KaTeX corner cases 2024-09-25 02:15:53 +09:00
Timothy Jaeryang Baek 534e4c90ca Merge pull request #5674 from open-webui/dev
0.3.28
2024-09-24 18:52:23 +02:00
Timothy J. Baek 40f2c3521b doc: changelog 2024-09-24 18:50:47 +02:00
Timothy J. Baek 07b1327708 fix 2024-09-24 18:32:14 +02:00
Timothy J. Baek 525095b3de fix: websearch not working issue
#5672
2024-09-24 18:25:21 +02:00
Timothy Jaeryang Baek f84513e856 Merge pull request #5673 from open-webui/dev
refac: readme
2024-09-24 18:19:09 +02:00
Timothy J. Baek bf423b8577 refac: readme 2024-09-24 18:18:32 +02:00
Timothy Jaeryang Baek ba20c71963 Merge pull request #5661 from open-webui/dev
0.3.27
2024-09-24 18:13:08 +02:00
Timothy J. Baek 7bbc57f225 doc: changelog 2024-09-24 18:12:47 +02:00
Timothy J. Baek e703e172e2 chore: format 2024-09-24 18:10:14 +02:00
Timothy Jaeryang Baek 3ff52fd1ad Merge pull request #5655 from sp301415/dev
fix: Fix KaTeX Rendering
2024-09-24 17:44:08 +02:00
Timothy J. Baek e19406cdd7 fix 2024-09-24 17:43:43 +02:00
Hwang In Tak 30e65b33f6 fix: Add comments 2024-09-25 00:41:08 +09:00
Hwang In Tak 3f1255b39e fix: Change inline and block delimiters 2024-09-25 00:10:49 +09:00
Timothy J. Baek 71743b25fe chore: format 2024-09-24 16:42:42 +02:00
Timothy Jaeryang Baek c7e93b32c5 Merge pull request #5660 from open-webui/pypi-release
fix: open-webui serve
2024-09-24 16:36:37 +02:00
Timothy J. Baek 3cee507687 fix: dev2 2024-09-24 16:19:24 +02:00
Timothy J. Baek ff651ddc36 fix: dev1 2024-09-24 16:07:49 +02:00
Timothy Jaeryang Baek c0738cef26 Merge pull request #5659 from open-webui/dev
0.3.26
2024-09-24 15:41:42 +02:00
Timothy J. Baek a44e9a8dda refac 2024-09-24 15:41:23 +02:00
Timothy J. Baek 38b9a63fa5 refac 2024-09-24 15:40:37 +02:00
Timothy J. Baek 2d60e42258 doc: changelog 2024-09-24 15:40:01 +02:00
Timothy Jaeryang Baek 60ac69eb27 Merge pull request #5656 from OriginalSimon/dev
i18n: Update Ukrainian translation
2024-09-24 15:33:15 +02:00
Timothy J. Baek 504d910557 fix: no running event loop issue 2024-09-24 15:31:55 +02:00
Hwang In Tak e48d66f918 fix: Remove unnecessary logging 2024-09-24 22:11:05 +09:00
Hwang In Tak 0bfbace9aa fix: Simplify regex 2024-09-24 22:00:01 +09:00
Timothy Jaeryang Baek 019cf8199f Merge pull request #5657 from open-webui/dev
0.3.25
2024-09-24 14:07:23 +02:00
Timothy J. Baek c5f85eed92 doc: changelog 2024-09-24 14:07:13 +02:00
Timothy J. Baek 21719ccdf1 chore: format 2024-09-24 14:05:44 +02:00
Timothy J. Baek 299b3d72cf fix: rate responses 2024-09-24 14:02:41 +02:00
Timothy J. Baek 85e9e231ed fix: image generation 2024-09-24 13:54:34 +02:00
Simon f382a78e31 Update translation.json 2024-09-24 13:47:51 +02:00
Hwang In Tak 377cc427b6 fix: Remove unnecessary logging 2024-09-24 20:40:50 +09:00
Timothy Jaeryang Baek 7ec72679f0 Merge pull request #5599 from open-webui/dev
0.3.24
2024-09-24 13:32:00 +02:00
Timothy J. BaekandMicroDev 31b311c3c9 refac
Co-Authored-By: MicroDev <70126934+microdev1@users.noreply.github.com>
2024-09-24 13:28:00 +02:00
Timothy J. Baek e24ab4c6d2 doc: changelog 2024-09-24 13:23:34 +02:00
Timothy J. Baek 6739983cf1 refac: deprecate interface "stream response" settings for advanced params 2024-09-24 12:49:35 +02:00
Timothy J. Baek ff00815b61 chore: format 2024-09-24 12:41:44 +02:00
Timothy J. Baek 8f6a927be3 enh: update info toast 2024-09-24 12:40:13 +02:00
Timothy J. Baek f6add92702 chore: format 2024-09-24 11:35:51 +02:00
Timothy Jaeryang Baek deedfdceae Merge pull request #5632 from jannikstdl/dev
enh: open PDF citations on the associated page
2024-09-24 11:27:53 +02:00
Timothy J. Baek e268ee5675 enh: audio/x-m4a support 2024-09-24 11:00:47 +02:00
Timothy J. Baek 33d8d818bd fix 2024-09-24 10:54:49 +02:00
Timothy Jaeryang Baek 9a81a37008 Merge pull request #5645 from kivvi3412/main
[feat] Set whether to stream individually for the model
2024-09-24 10:52:00 +02:00
Timothy Jaeryang Baek 8e620b0c2c Merge pull request #5649 from EtiennePerot/temp-file-close
fix: close temporary file after creating it
2024-09-24 10:49:38 +02:00
Hwang In Tak 214546399a fix: fix katex rendering 2024-09-24 16:58:15 +09:00
Etienne Perot fdd27aa321 fix: close temporary file after creating it.
This fixes "The process cannot access the file
because it is being used by another process"
errors on Windows.

The file is still automatically deleted by the
`os.unlink` call later in the function.

Updates #5606
Fixes #5642
2024-09-23 23:22:47 -07:00
kivvi 4ebff2c5ce Merge remote-tracking branch 'origin/main' 2024-09-24 12:29:36 +08:00
kivvi 8266d343bf Merge remote-tracking branch 'origin/main' 2024-09-24 12:29:11 +08:00
kivvi 36ddb19023 Merge remote-tracking branch 'origin/main' 2024-09-24 12:17:40 +08:00
kivvi ebc410d8d4 Merge remote-tracking branch 'origin/main' 2024-09-24 12:17:33 +08:00
kivvi 1772db4712 Merge remote-tracking branch 'origin/main' 2024-09-24 12:14:58 +08:00
kivvi 40d7d7d6dd Set whether to stream responses for this model individually, overriding the global setting 2024-09-24 12:14:51 +08:00
kivvi 0d01ea5f2f Set whether to stream responses for this model individually, overriding the global setting 2024-09-24 11:51:47 +08:00
Timothy J. Baek 822c47c171 fix 2024-09-24 01:35:34 +02:00
Timothy J. Baek fdf02c4e86 fix 2024-09-24 01:12:49 +02:00
Timothy J. Baek 398bc96b1a refac 2024-09-24 01:05:46 +02:00
Timothy J. Baek ad82eae6a9 feat: create new message pair on cmd+shift+enter 2024-09-24 00:57:28 +02:00
Timothy J. Baek d7b64ff447 enh: infinite scroll messages 2024-09-24 00:27:22 +02:00
Timothy J. Baek 93cb2be35d refac 2024-09-23 23:55:18 +02:00
Timothy J. Baek 8f1b9bdf8a refac 2024-09-23 23:52:45 +02:00
Jannik S. f69956bda8 fix: only append link with page attribute if metatada.page is available 2024-09-23 23:43:50 +02:00
Timothy J. Baek e06667ead8 refac 2024-09-23 23:39:33 +02:00
Timothy Jaeryang Baek 35f64cc53f Merge pull request #5640 from open-webui/messages-render-optimisation
refac: messages render optimisation
2024-09-23 23:27:08 +02:00
Timothy J. Baek 12f95555fc fix 2024-09-23 23:23:08 +02:00
Timothy J. Baek 84c1810b6e refac 2024-09-23 23:20:27 +02:00
Timothy J. Baek ba39f9bf56 refac 2024-09-23 17:40:24 +02:00
Jannik Streidl 8eb82265d0 Remove animation import - unsure if animations are desired 2024-09-23 15:50:46 +02:00
Jannik Streidl ac277e8e9e enh: CitationsModal 2024-09-23 15:48:12 +02:00
Timothy J. Baek b1521cacad refac: WIP 2024-09-23 14:24:50 +02:00
Timothy J. Baek 5978e7c9a6 refac: wip 2024-09-23 01:36:46 +02:00
Timothy J. Baek fd5e8b4fcf refac: deprecate messages for history 2024-09-23 00:55:13 +02:00
Timothy Jaeryang Baek 291b6dd744 Merge pull request #5613 from cevheri/dev
Turkish Language Support has been updated
2024-09-22 20:33:29 +02:00
Timothy J. Baek 73ff524a8f refac 2024-09-22 20:31:53 +02:00
cevheri c2b5bf2130 Turkish Language Support has been fixed. 2024-09-22 21:20:43 +03:00
Timothy J. Baek 8532f9da03 fix: many model chat save as copy issue 2024-09-22 20:16:45 +02:00
Timothy Jaeryang Baek 2cfe6830df Merge pull request #5595 from sebdanielsson/dev
feat: Add more variables to prompts
2024-09-22 16:47:51 +02:00
Timothy J. Baek 44355a4bdc enh: 'model' url search param added 2024-09-22 14:52:30 +02:00
Timothy J. Baek 47a858393b fix: hide mobile sidebar after menu button click 2024-09-22 14:50:24 +02:00
Timothy J. Baek d3e80f515d enh: hide pinned chats when searching 2024-09-22 14:49:53 +02:00
Timothy Jaeryang Baek c5b93ca631 Merge pull request #5601 from JamesClarke7283/extend-num-predict-param
fix: Extend num predict param
2024-09-22 14:28:00 +02:00
Timothy J. Baek 3335eee1b9 refac: do not set max for input 2024-09-22 14:27:52 +02:00
Sebastian 29175405a6 Add weekday, timezone, language variables to system prompts 2024-09-22 12:24:05 +02:00
Sebastian d53062a9b0 Add more variables to prompts 2024-09-22 11:49:18 +02:00
James Clarke 96ef15362a Increased max_tokens (num_predict) to 131072, fixes #5600 2024-09-22 05:43:04 +01:00
Timothy J. Baek d6d6098378 refac 2024-09-22 02:57:51 +02:00
Timothy J. Baek 620e629edc refac 2024-09-22 02:57:38 +02:00
Timothy J. Baek c292fd89f9 refac 2024-09-22 02:55:45 +02:00
Timothy J. Baek c346130774 feat: overview favourite response 2024-09-22 02:53:38 +02:00
Timothy J. Baek 768717aaf9 refac 2024-09-22 02:35:25 +02:00
Timothy J. Baek d055e1f888 refac 2024-09-22 02:14:59 +02:00
Timothy J. Baek 5f84145a2d enh: socket full redis support 2024-09-22 02:12:55 +02:00
Timothy J. Baek 47a9395a22 refac: styling 2024-09-22 01:42:18 +02:00
Timothy J. Baek 8dbac0f7e3 enh: show model hash and modified ts 2024-09-21 22:12:41 +02:00
Timothy Jaeryang Baek 6b463164f4 Merge pull request #5584 from open-webui/dev
fix: node tooltip xss issue
2024-09-21 21:44:25 +02:00
Timothy J. BaekandValentino Stillhardt 5f15e9ee68 fix: node tooltip xss issue
Co-Authored-By: Valentino Stillhardt <4715129+Fusseldieb@users.noreply.github.com>
2024-09-21 21:43:54 +02:00
Timothy Jaeryang Baek 54d63ece6f Merge pull request #5583 from open-webui/dev
refac
2024-09-21 21:35:54 +02:00
Timothy J. Baek e35883ca9c fix: openai payload issue 2024-09-21 21:35:00 +02:00
Timothy Jaeryang Baek 19e49e43cb Merge pull request #5578 from aleixdorca/dev
i18n: Update catalan translation.json
2024-09-21 17:37:41 +02:00
Aleix Dorca e429b5548c Update catalan translation.json 2024-09-21 17:27:32 +02:00
Timothy J. Baek 839dacc4a4 refac 2024-09-21 15:53:29 +02:00
Timothy J. Baek 4225591a26 fix 2024-09-21 15:48:52 +02:00
Timothy J. Baek b4adffc3af fix 2024-09-21 15:48:16 +02:00
Timothy J. Baek 8fc178ae91 refac: chat controls size 2024-09-21 15:46:39 +02:00
Timothy J. Baek 580ad46036 refac: speedRate -> playbackRate 2024-09-21 15:42:39 +02:00
Timothy Jaeryang Baek f47dffe6e1 Merge pull request #5576 from open-webui/dev
fix: WEBUI_AUTH=False not working issue
2024-09-21 15:35:55 +02:00
Timothy J. Baek 00f6b4bf09 refac 2024-09-21 15:35:35 +02:00
Timothy J. Baek 9126ceac08 fix: WEBUI_AUTH=False not working issue 2024-09-21 15:33:34 +02:00
93 changed files with 2421 additions and 1128 deletions
+74
View File
@@ -5,6 +5,80 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.3.30] - 2024-09-26
### Fixed
- **🍞 Update Available Toast Dismissal**: Enhanced user experience by ensuring that once the update available notification is dismissed, it won't reappear for 24 hours.
- **📋 Ollama /embed Form Data**: Adjusted the integration inaccuracies in the /embed form data to ensure it perfectly matches with Ollama's specifications.
- **🔧 O1 Max Completion Tokens Issue**: Resolved compatibility issues with OpenAI's o1 models max_completion_tokens param to ensure smooth operation.
- **🔄 Pip Install Database Issue**: Fixed a critical issue where database changes during pip installations were reverting and not saving chat logs, now ensuring data persistence and reliability in chat operations.
- **🏷️ Chat Rename Tab Update**: Fixed the functionality to change the web browser's tab title simultaneously when a chat is renamed, keeping tab titles consistent.
## [0.3.29] - 2023-09-25
### Fixed
- **🔧 KaTeX Rendering Improvement**: Resolved specific corner cases in KaTeX rendering to enhance the display of complex mathematical notation.
- **📞 'Call' URL Parameter Fix**: Corrected functionality for 'call' URL search parameter ensuring reliable activation of voice calls through URL triggers.
- **🔄 Configuration Reset Fix**: Fixed the RESET_CONFIG_ON_START to ensure settings revert to default correctly upon each startup, improving reliability in configuration management.
- **🌍 Filter Outlet Hook Fix**: Addressed issues in the filter outlet hook, ensuring all filter functions operate as intended.
## [0.3.28] - 2024-09-24
### Fixed
- **🔍 Web Search Functionality**: Corrected an issue where the web search option was not functioning properly.
## [0.3.27] - 2024-09-24
### Fixed
- **🔄 Periodic Cleanup Error Resolved**: Fixed a critical RuntimeError related to the 'periodic_usage_pool_cleanup' coroutine, ensuring smooth and efficient performance post-pip install, correcting a persisting issue from version 0.3.26.
- **📊 Enhanced LaTeX Rendering**: Improved rendering for LaTeX content, enhancing clarity and visual presentation in documents and mathematical models.
## [0.3.26] - 2024-09-24
### Fixed
- **🔄 Event Loop Error Resolution**: Addressed a critical error where a missing running event loop caused 'periodic_usage_pool_cleanup' to fail with pip installs. This fix ensures smoother and more reliable updates and installations, enhancing overall system stability.
## [0.3.25] - 2024-09-24
### Fixed
- **🖼️ Image Generation Functionality**: Resolved an issue where image generation was not functioning, restoring full capability for visual content creation.
- **⚖️ Rate Response Corrections**: Addressed a problem where rate responses were not working, ensuring reliable feedback mechanisms are operational.
## [0.3.24] - 2024-09-24
### Added
- **🚀 Rendering Optimization**: Significantly improved message rendering performance, enhancing user experience and webui responsiveness.
- **💖 Favorite Response Feature in Chat Overview**: Users can now mark responses as favorite directly from the chat overview, enhancing ease of retrieval and organization of preferred responses.
- **💬 Create Message Pairs with Shortcut**: Implemented creation of new message pairs using Cmd/Ctrl+Shift+Enter, making conversation editing faster and more intuitive.
- **🌍 Expanded User Prompt Variables**: Added weekday, timezone, and language information variables to user prompts to match system prompt variables.
- **🎵 Enhanced Audio Support**: Now includes support for 'audio/x-m4a' files, broadening compatibility with audio content within the platform.
- **🔏 Model URL Search Parameter**: Added an ability to select a model directly via URL parameters, streamlining navigation and model access.
- **📄 Enhanced PDF Citations**: PDF citations now open at the associated page, streamlining reference checks and document handling.
- **🔧Use of Redis in Sockets**: Enhanced socket implementation to fully support Redis, enabling effective stateless instances suitable for scalable load balancing.
- **🌍 Stream Individual Model Responses**: Allows specific models to have individualized streaming settings, enhancing performance and customization.
- **🕒 Display Model Hash and Last Modified Timestamp for Ollama Models**: Provides critical model details directly in the Models workspace for enhanced tracking.
- **❗ Update Info Notification for Admins**: Ensures administrators receive immediate updates upon login, keeping them informed of the latest changes and system statuses.
### Fixed
- **🗑️ Temporary File Handling On Windows**: Fixed an issue causing errors when accessing a temporary file being used by another process, Tools & Functions should now work as intended.
- **🔓 Authentication Toggle Issue**: Resolved the malfunction where setting 'WEBUI_AUTH=False' did not appropriately disable authentication, ensuring that user experience and system security settings function as configured.
- **🔧 Save As Copy Issue for Many Model Chats**: Resolved an error preventing users from save messages as copies in many model chats.
- **🔒 Sidebar Closure on Mobile**: Resolved an issue where the mobile sidebar remained open after menu engagement, improving user interface responsivity and comfort.
- **🛡️ Tooltip XSS Vulnerability**: Resolved a cross-site scripting (XSS) issue within tooltips, ensuring enhanced security and data integrity during user interactions.
### Changed
- **↩️ Deprecated Interface Stream Response Settings**: Moved to advanced parameters to streamline interface settings and enhance user clarity.
- **⚙️ Renamed 'speedRate' to 'playbackRate'**: Standardizes terminology, improving usability and understanding in media settings.
## [0.3.23] - 2024-09-21 ## [0.3.23] - 2024-09-21
### Added ### Added
+22 -2
View File
@@ -59,11 +59,31 @@ Don't forget to explore our sibling project, [Open WebUI Community](https://open
## How to Install 🚀 ## How to Install 🚀
> [!NOTE] ### Installation via Python pip 🐍
> Please note that for certain Docker environments, additional configurations might be needed. If you encounter any connection issues, our detailed guide on [Open WebUI Documentation](https://docs.openwebui.com/) is ready to assist you.
Open WebUI can be installed using pip, the Python package installer. Before proceeding, ensure you're using **Python 3.11** to avoid compatibility issues.
1. **Install Open WebUI**:
Open your terminal and run the following command to install Open WebUI:
```bash
pip install open-webui
```
2. **Running Open WebUI**:
After installation, you can start Open WebUI by executing:
```bash
open-webui serve
```
This will start the Open WebUI server, which you can access at [http://localhost:8080](http://localhost:8080)
### Quick Start with Docker 🐳 ### Quick Start with Docker 🐳
> [!NOTE]
> Please note that for certain Docker environments, additional configurations might be needed. If you encounter any connection issues, our detailed guide on [Open WebUI Documentation](https://docs.openwebui.com/) is ready to assist you.
> [!WARNING] > [!WARNING]
> When using Docker to install Open WebUI, make sure to include the `-v open-webui:/app/backend/data` in your Docker command. This step is crucial as it ensures your database is properly mounted and prevents any loss of data. > When using Docker to install Open WebUI, make sure to include the `-v open-webui:/app/backend/data` in your Docker command. This step is crucial as it ensures your database is properly mounted and prevents any loss of data.
+1
View File
@@ -52,6 +52,7 @@ def serve(
) )
os.environ["USE_CUDA_DOCKER"] = "false" os.environ["USE_CUDA_DOCKER"] = "false"
os.environ["LD_LIBRARY_PATH"] = ":".join(LD_LIBRARY_PATH) os.environ["LD_LIBRARY_PATH"] = ":".join(LD_LIBRARY_PATH)
import open_webui.main # we need set environment variables before importing main import open_webui.main # we need set environment variables before importing main
uvicorn.run(open_webui.main.app, host=host, port=port, forwarded_allow_ips="*") uvicorn.run(open_webui.main.app, host=host, port=port, forwarded_allow_ips="*")
+1 -1
View File
@@ -360,7 +360,7 @@ def transcribe(
): ):
log.info(f"file.content_type: {file.content_type}") log.info(f"file.content_type: {file.content_type}")
if file.content_type not in ["audio/mpeg", "audio/wav", "audio/ogg"]: if file.content_type not in ["audio/mpeg", "audio/wav", "audio/ogg", "audio/x-m4a"]:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.FILE_NOT_SUPPORTED, detail=ERROR_MESSAGES.FILE_NOT_SUPPORTED,
+9 -1
View File
@@ -543,10 +543,18 @@ class GenerateEmbeddingsForm(BaseModel):
keep_alive: Optional[Union[int, str]] = None keep_alive: Optional[Union[int, str]] = None
class GenerateEmbedForm(BaseModel):
model: str
input: str
truncate: Optional[bool]
options: Optional[dict] = None
keep_alive: Optional[Union[int, str]] = None
@app.post("/api/embed") @app.post("/api/embed")
@app.post("/api/embed/{url_idx}") @app.post("/api/embed/{url_idx}")
async def generate_embeddings( async def generate_embeddings(
form_data: GenerateEmbeddingsForm, form_data: GenerateEmbedForm,
url_idx: Optional[int] = None, url_idx: Optional[int] = None,
user=Depends(get_verified_user), user=Depends(get_verified_user),
): ):
+9 -1
View File
@@ -411,7 +411,15 @@ async def generate_chat_completion(
# Change max_completion_tokens to max_tokens (Backward compatible) # Change max_completion_tokens to max_tokens (Backward compatible)
if "api.openai.com" not in url and not payload["model"].lower().startswith("o1-"): if "api.openai.com" not in url and not payload["model"].lower().startswith("o1-"):
if "max_completion_tokens" in payload: if "max_completion_tokens" in payload:
payload["max_tokens"] = payload.pop("max_completion_tokens") # Remove "max_completion_tokens" from the payload
payload["max_tokens"] = payload["max_completion_tokens"]
del payload["max_completion_tokens"]
else:
if payload["model"].lower().startswith("o1-") and "max_tokens" in payload:
payload["max_completion_tokens"] = payload["max_tokens"]
del payload["max_tokens"]
if "max_tokens" in payload and "max_completion_tokens" in payload:
del payload["max_tokens"]
# Convert the modified body back to JSON # Convert the modified body back to JSON
payload = json.dumps(payload) payload = json.dumps(payload)
+83 -64
View File
@@ -1,6 +1,9 @@
import asyncio import asyncio
import socketio import socketio
import logging
import sys
import time
from open_webui.apps.webui.models.users import Users from open_webui.apps.webui.models.users import Users
from open_webui.env import ( from open_webui.env import (
ENABLE_WEBSOCKET_SUPPORT, ENABLE_WEBSOCKET_SUPPORT,
@@ -8,6 +11,17 @@ from open_webui.env import (
WEBSOCKET_REDIS_URL, WEBSOCKET_REDIS_URL,
) )
from open_webui.utils.utils import decode_token from open_webui.utils.utils import decode_token
from open_webui.apps.socket.utils import RedisDict
from open_webui.env import (
GLOBAL_LOG_LEVEL,
SRC_LOG_LEVELS,
)
logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL)
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["SOCKET"])
if WEBSOCKET_MANAGER == "redis": if WEBSOCKET_MANAGER == "redis":
@@ -34,17 +48,76 @@ else:
) )
app = socketio.ASGIApp(sio, socketio_path="/ws/socket.io")
# Dictionary to maintain the user pool # Dictionary to maintain the user pool
SESSION_POOL = {} if WEBSOCKET_MANAGER == "redis":
USER_POOL = {} SESSION_POOL = RedisDict("open-webui:session_pool", redis_url=WEBSOCKET_REDIS_URL)
USAGE_POOL = {} USER_POOL = RedisDict("open-webui:user_pool", redis_url=WEBSOCKET_REDIS_URL)
USAGE_POOL = RedisDict("open-webui:usage_pool", redis_url=WEBSOCKET_REDIS_URL)
else:
SESSION_POOL = {}
USER_POOL = {}
USAGE_POOL = {}
# Timeout duration in seconds # Timeout duration in seconds
TIMEOUT_DURATION = 3 TIMEOUT_DURATION = 3
async def periodic_usage_pool_cleanup():
while True:
now = int(time.time())
for model_id, connections in list(USAGE_POOL.items()):
# Creating a list of sids to remove if they have timed out
expired_sids = [
sid
for sid, details in connections.items()
if now - details["updated_at"] > TIMEOUT_DURATION
]
for sid in expired_sids:
del connections[sid]
if not connections:
log.debug(f"Cleaning up model {model_id} from usage pool")
del USAGE_POOL[model_id]
else:
USAGE_POOL[model_id] = connections
# Emit updated usage information after cleaning
await sio.emit("usage", {"models": get_models_in_use()})
await asyncio.sleep(TIMEOUT_DURATION)
app = socketio.ASGIApp(
sio,
socketio_path="/ws/socket.io",
)
def get_models_in_use():
# List models that are currently in use
models_in_use = list(USAGE_POOL.keys())
return models_in_use
@sio.on("usage")
async def usage(sid, data):
model_id = data["model"]
# Record the timestamp for the last update
current_time = int(time.time())
# Store the new usage data and task
USAGE_POOL[model_id] = {
**(USAGE_POOL[model_id] if model_id in USAGE_POOL else {}),
sid: {"updated_at": current_time},
}
# Broadcast the usage data to all clients
await sio.emit("usage", {"models": get_models_in_use()})
@sio.event @sio.event
async def connect(sid, environ, auth): async def connect(sid, environ, auth):
user = None user = None
@@ -62,8 +135,7 @@ async def connect(sid, environ, auth):
USER_POOL[user.id] = [sid] USER_POOL[user.id] = [sid]
# print(f"user {user.name}({user.id}) connected with session ID {sid}") # print(f"user {user.name}({user.id}) connected with session ID {sid}")
await sio.emit("user-count", {"count": len(USER_POOL.items())})
await sio.emit("user-count", {"count": len(set(USER_POOL))})
await sio.emit("usage", {"models": get_models_in_use()}) await sio.emit("usage", {"models": get_models_in_use()})
@@ -91,65 +163,12 @@ async def user_join(sid, data):
# print(f"user {user.name}({user.id}) connected with session ID {sid}") # print(f"user {user.name}({user.id}) connected with session ID {sid}")
await sio.emit("user-count", {"count": len(set(USER_POOL))}) await sio.emit("user-count", {"count": len(USER_POOL.items())})
@sio.on("user-count") @sio.on("user-count")
async def user_count(sid): async def user_count(sid):
await sio.emit("user-count", {"count": len(set(USER_POOL))}) await sio.emit("user-count", {"count": len(USER_POOL.items())})
def get_models_in_use():
# Aggregate all models in use
models_in_use = []
for model_id, data in USAGE_POOL.items():
models_in_use.append(model_id)
return models_in_use
@sio.on("usage")
async def usage(sid, data):
model_id = data["model"]
# Cancel previous callback if there is one
if model_id in USAGE_POOL:
USAGE_POOL[model_id]["callback"].cancel()
# Store the new usage data and task
if model_id in USAGE_POOL:
USAGE_POOL[model_id]["sids"].append(sid)
USAGE_POOL[model_id]["sids"] = list(set(USAGE_POOL[model_id]["sids"]))
else:
USAGE_POOL[model_id] = {"sids": [sid]}
# Schedule a task to remove the usage data after TIMEOUT_DURATION
USAGE_POOL[model_id]["callback"] = asyncio.create_task(
remove_after_timeout(sid, model_id)
)
# Broadcast the usage data to all clients
await sio.emit("usage", {"models": get_models_in_use()})
async def remove_after_timeout(sid, model_id):
try:
await asyncio.sleep(TIMEOUT_DURATION)
if model_id in USAGE_POOL:
# print(USAGE_POOL[model_id]["sids"])
USAGE_POOL[model_id]["sids"].remove(sid)
USAGE_POOL[model_id]["sids"] = list(set(USAGE_POOL[model_id]["sids"]))
if len(USAGE_POOL[model_id]["sids"]) == 0:
del USAGE_POOL[model_id]
# Broadcast the usage data to all clients
await sio.emit("usage", {"models": get_models_in_use()})
except asyncio.CancelledError:
# Task was cancelled due to new 'usage' event
pass
@sio.event @sio.event
@@ -158,7 +177,7 @@ async def disconnect(sid):
user_id = SESSION_POOL[sid] user_id = SESSION_POOL[sid]
del SESSION_POOL[sid] del SESSION_POOL[sid]
USER_POOL[user_id].remove(sid) USER_POOL[user_id] = [_sid for _sid in USER_POOL[user_id] if _sid != sid]
if len(USER_POOL[user_id]) == 0: if len(USER_POOL[user_id]) == 0:
del USER_POOL[user_id] del USER_POOL[user_id]
+59
View File
@@ -0,0 +1,59 @@
import json
import redis
class RedisDict:
def __init__(self, name, redis_url):
self.name = name
self.redis = redis.Redis.from_url(redis_url, decode_responses=True)
def __setitem__(self, key, value):
serialized_value = json.dumps(value)
self.redis.hset(self.name, key, serialized_value)
def __getitem__(self, key):
value = self.redis.hget(self.name, key)
if value is None:
raise KeyError(key)
return json.loads(value)
def __delitem__(self, key):
result = self.redis.hdel(self.name, key)
if result == 0:
raise KeyError(key)
def __contains__(self, key):
return self.redis.hexists(self.name, key)
def __len__(self):
return self.redis.hlen(self.name)
def keys(self):
return self.redis.hkeys(self.name)
def values(self):
return [json.loads(v) for v in self.redis.hvals(self.name)]
def items(self):
return [(k, json.loads(v)) for k, v in self.redis.hgetall(self.name).items()]
def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
def clear(self):
self.redis.delete(self.name)
def update(self, other=None, **kwargs):
if other is not None:
for k, v in other.items() if hasattr(other, "items") else other:
self[k] = v
for k, v in kwargs.items():
self[k] = v
def setdefault(self, key, default=None):
if key not in self:
self[key] = default
return self[key]
+13 -8
View File
@@ -188,14 +188,19 @@ async def signin(request: Request, response: Response, form_data: SigninForm):
@router.post("/signup", response_model=SigninResponse) @router.post("/signup", response_model=SigninResponse)
async def signup(request: Request, response: Response, form_data: SignupForm): async def signup(request: Request, response: Response, form_data: SignupForm):
if ( if WEBUI_AUTH:
not request.app.state.config.ENABLE_SIGNUP if (
or not request.app.state.config.ENABLE_LOGIN_FORM not request.app.state.config.ENABLE_SIGNUP
or not WEBUI_AUTH or not request.app.state.config.ENABLE_LOGIN_FORM
): ):
raise HTTPException( raise HTTPException(
status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACCESS_PROHIBITED status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACCESS_PROHIBITED
) )
else:
if Users.get_num_users() != 0:
raise HTTPException(
status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACCESS_PROHIBITED
)
if not validate_email_format(form_data.email.lower()): if not validate_email_format(form_data.email.lower()):
raise HTTPException( raise HTTPException(
+2 -1
View File
@@ -87,7 +87,7 @@ def load_toolkit_module_by_id(toolkit_id, content=None):
# Create a temporary file and use it to define `__file__` so # Create a temporary file and use it to define `__file__` so
# that it works as expected from the module's perspective. # that it works as expected from the module's perspective.
temp_file = tempfile.NamedTemporaryFile(delete=False) temp_file = tempfile.NamedTemporaryFile(delete=False)
temp_file.close()
try: try:
with open(temp_file.name, "w", encoding="utf-8") as f: with open(temp_file.name, "w", encoding="utf-8") as f:
f.write(content) f.write(content)
@@ -131,6 +131,7 @@ def load_function_module_by_id(function_id, content=None):
# Create a temporary file and use it to define `__file__` so # Create a temporary file and use it to define `__file__` so
# that it works as expected from the module's perspective. # that it works as expected from the module's perspective.
temp_file = tempfile.NamedTemporaryFile(delete=False) temp_file = tempfile.NamedTemporaryFile(delete=False)
temp_file.close()
try: try:
with open(temp_file.name, "w", encoding="utf-8") as f: with open(temp_file.name, "w", encoding="utf-8") as f:
f.write(content) f.write(content)
+6
View File
@@ -87,6 +87,12 @@ def save_to_db(data):
db.commit() db.commit()
def reset_config():
with get_db() as db:
db.query(Config).delete()
db.commit()
# When initializing, check if config.json exists and migrate it to the database # When initializing, check if config.json exists and migrate it to the database
if os.path.exists(f"{DATA_DIR}/config.json"): if os.path.exists(f"{DATA_DIR}/config.json"):
data = load_json_config() data = load_json_config()
+11 -12
View File
@@ -84,6 +84,7 @@ log_sources = [
"OPENAI", "OPENAI",
"RAG", "RAG",
"WEBHOOK", "WEBHOOK",
"SOCKET",
] ]
SRC_LOG_LEVELS = {} SRC_LOG_LEVELS = {}
@@ -220,6 +221,12 @@ if FROM_INIT_PY:
else: else:
shutil.copy2(item, dest) shutil.copy2(item, dest)
# Zip the data directory
shutil.make_archive(DATA_DIR.parent / "open_webui_data", "zip", DATA_DIR)
# Remove the old data directory
shutil.rmtree(DATA_DIR)
DATA_DIR = Path(os.getenv("DATA_DIR", OPEN_WEBUI_DIR / "data")) DATA_DIR = Path(os.getenv("DATA_DIR", OPEN_WEBUI_DIR / "data"))
@@ -233,18 +240,6 @@ if FROM_INIT_PY:
).resolve() ).resolve()
RESET_CONFIG_ON_START = (
os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true"
)
if RESET_CONFIG_ON_START:
try:
os.remove(f"{DATA_DIR}/config.json")
with open(f"{DATA_DIR}/config.json", "w") as f:
f.write("{}")
except Exception:
pass
#################################### ####################################
# Database # Database
#################################### ####################################
@@ -264,6 +259,10 @@ if "postgres://" in DATABASE_URL:
DATABASE_URL = DATABASE_URL.replace("postgres://", "postgresql://") DATABASE_URL = DATABASE_URL.replace("postgres://", "postgresql://")
RESET_CONFIG_ON_START = (
os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true"
)
#################################### ####################################
# WEBUI_AUTH (Required for security) # WEBUI_AUTH (Required for security)
#################################### ####################################
+12 -3
View File
@@ -8,6 +8,8 @@ import shutil
import sys import sys
import time import time
import uuid import uuid
import asyncio
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from typing import Optional from typing import Optional
@@ -31,7 +33,7 @@ from open_webui.apps.openai.main import (
from open_webui.apps.openai.main import get_all_models as get_openai_models from open_webui.apps.openai.main import get_all_models as get_openai_models
from open_webui.apps.rag.main import app as rag_app from open_webui.apps.rag.main import app as rag_app
from open_webui.apps.rag.utils import get_rag_context, rag_template from open_webui.apps.rag.utils import get_rag_context, rag_template
from open_webui.apps.socket.main import app as socket_app from open_webui.apps.socket.main import app as socket_app, periodic_usage_pool_cleanup
from open_webui.apps.socket.main import get_event_call, get_event_emitter from open_webui.apps.socket.main import get_event_call, get_event_emitter
from open_webui.apps.webui.internal.db import Session from open_webui.apps.webui.internal.db import Session
from open_webui.apps.webui.main import app as webui_app from open_webui.apps.webui.main import app as webui_app
@@ -77,6 +79,7 @@ from open_webui.config import (
WEBUI_NAME, WEBUI_NAME,
AppConfig, AppConfig,
run_migrations, run_migrations,
reset_config,
) )
from open_webui.constants import ERROR_MESSAGES, TASKS, WEBHOOK_MESSAGES from open_webui.constants import ERROR_MESSAGES, TASKS, WEBHOOK_MESSAGES
from open_webui.env import ( from open_webui.env import (
@@ -90,6 +93,7 @@ from open_webui.env import (
WEBUI_SESSION_COOKIE_SAME_SITE, WEBUI_SESSION_COOKIE_SAME_SITE,
WEBUI_SESSION_COOKIE_SECURE, WEBUI_SESSION_COOKIE_SECURE,
WEBUI_URL, WEBUI_URL,
RESET_CONFIG_ON_START,
) )
from fastapi import ( from fastapi import (
Depends, Depends,
@@ -184,6 +188,11 @@ https://github.com/open-webui/open-webui
@asynccontextmanager @asynccontextmanager
async def lifespan(app: FastAPI): async def lifespan(app: FastAPI):
run_migrations() run_migrations()
if RESET_CONFIG_ON_START:
reset_config()
asyncio.create_task(periodic_usage_pool_cleanup())
yield yield
@@ -851,7 +860,6 @@ async def inspect_websocket(request: Request, call_next):
app.mount("/ws", socket_app) app.mount("/ws", socket_app)
app.mount("/ollama", ollama_app) app.mount("/ollama", ollama_app)
app.mount("/openai", openai_app) app.mount("/openai", openai_app)
@@ -2329,10 +2337,11 @@ async def get_manifest_json():
return { return {
"name": WEBUI_NAME, "name": WEBUI_NAME,
"short_name": WEBUI_NAME, "short_name": WEBUI_NAME,
"description": "Open WebUI is an open, extensible, user-friendly interface for AI that adapts to your workflow.",
"start_url": "/", "start_url": "/",
"display": "standalone", "display": "standalone",
"background_color": "#343541", "background_color": "#343541",
"orientation": "portrait-primary", "orientation": "any",
"icons": [ "icons": [
{ {
"src": "/static/logo.png", "src": "/static/logo.png",
+1 -1
View File
@@ -69,7 +69,7 @@ rank-bm25==0.2.2
faster-whisper==1.0.3 faster-whisper==1.0.3
PyJWT[crypto]==2.9.0 PyJWT[crypto]==2.9.0
authlib==1.3.1 authlib==1.3.2
black==24.8.0 black==24.8.0
langfuse==2.44.0 langfuse==2.44.0
+73 -73
View File
@@ -1,12 +1,12 @@
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.3.23", "version": "0.3.30",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "open-webui", "name": "open-webui",
"version": "0.3.23", "version": "0.3.30",
"dependencies": { "dependencies": {
"@codemirror/lang-javascript": "^6.2.2", "@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-python": "^6.1.6", "@codemirror/lang-python": "^6.1.6",
@@ -1167,9 +1167,9 @@
} }
}, },
"node_modules/@rollup/rollup-android-arm-eabi": { "node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz",
"integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1179,9 +1179,9 @@
] ]
}, },
"node_modules/@rollup/rollup-android-arm64": { "node_modules/@rollup/rollup-android-arm64": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz",
"integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1191,9 +1191,9 @@
] ]
}, },
"node_modules/@rollup/rollup-darwin-arm64": { "node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz",
"integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1203,9 +1203,9 @@
] ]
}, },
"node_modules/@rollup/rollup-darwin-x64": { "node_modules/@rollup/rollup-darwin-x64": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz",
"integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1215,9 +1215,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm-gnueabihf": { "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz",
"integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1227,9 +1227,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm-musleabihf": { "node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz",
"integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -1239,9 +1239,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm64-gnu": { "node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz",
"integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1251,9 +1251,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm64-musl": { "node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz",
"integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1263,9 +1263,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": { "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz",
"integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@@ -1275,9 +1275,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-riscv64-gnu": { "node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz",
"integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@@ -1287,9 +1287,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-s390x-gnu": { "node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz",
"integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@@ -1299,9 +1299,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-x64-gnu": { "node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz",
"integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1311,9 +1311,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-x64-musl": { "node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz",
"integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1323,9 +1323,9 @@
] ]
}, },
"node_modules/@rollup/rollup-win32-arm64-msvc": { "node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz",
"integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1335,9 +1335,9 @@
] ]
}, },
"node_modules/@rollup/rollup-win32-ia32-msvc": { "node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz",
"integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@@ -1347,9 +1347,9 @@
] ]
}, },
"node_modules/@rollup/rollup-win32-x64-msvc": { "node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz",
"integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -7906,9 +7906,9 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
}, },
"node_modules/rollup": { "node_modules/rollup": {
"version": "4.20.0", "version": "4.22.4",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz",
"integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==",
"dependencies": { "dependencies": {
"@types/estree": "1.0.5" "@types/estree": "1.0.5"
}, },
@@ -7920,22 +7920,22 @@
"npm": ">=8.0.0" "npm": ">=8.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.20.0", "@rollup/rollup-android-arm-eabi": "4.22.4",
"@rollup/rollup-android-arm64": "4.20.0", "@rollup/rollup-android-arm64": "4.22.4",
"@rollup/rollup-darwin-arm64": "4.20.0", "@rollup/rollup-darwin-arm64": "4.22.4",
"@rollup/rollup-darwin-x64": "4.20.0", "@rollup/rollup-darwin-x64": "4.22.4",
"@rollup/rollup-linux-arm-gnueabihf": "4.20.0", "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
"@rollup/rollup-linux-arm-musleabihf": "4.20.0", "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
"@rollup/rollup-linux-arm64-gnu": "4.20.0", "@rollup/rollup-linux-arm64-gnu": "4.22.4",
"@rollup/rollup-linux-arm64-musl": "4.20.0", "@rollup/rollup-linux-arm64-musl": "4.22.4",
"@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
"@rollup/rollup-linux-riscv64-gnu": "4.20.0", "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
"@rollup/rollup-linux-s390x-gnu": "4.20.0", "@rollup/rollup-linux-s390x-gnu": "4.22.4",
"@rollup/rollup-linux-x64-gnu": "4.20.0", "@rollup/rollup-linux-x64-gnu": "4.22.4",
"@rollup/rollup-linux-x64-musl": "4.20.0", "@rollup/rollup-linux-x64-musl": "4.22.4",
"@rollup/rollup-win32-arm64-msvc": "4.20.0", "@rollup/rollup-win32-arm64-msvc": "4.22.4",
"@rollup/rollup-win32-ia32-msvc": "4.20.0", "@rollup/rollup-win32-ia32-msvc": "4.22.4",
"@rollup/rollup-win32-x64-msvc": "4.20.0", "@rollup/rollup-win32-x64-msvc": "4.22.4",
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
} }
}, },
@@ -8724,11 +8724,11 @@
} }
}, },
"node_modules/svelte-sonner": { "node_modules/svelte-sonner": {
"version": "0.3.19", "version": "0.3.28",
"resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-0.3.19.tgz", "resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-0.3.28.tgz",
"integrity": "sha512-jpPOgLtHwRaB6Vqo2dUQMv15/yUV/BQWTjKpEqQ11uqRSHKjAYUKZyGrHB2cQsGmyjR0JUzBD58btpgNqINQ/Q==", "integrity": "sha512-K3AmlySeFifF/cKgsYNv5uXqMVNln0NBAacOYgmkQStLa/UoU0LhfAACU6Gr+YYC8bOCHdVmFNoKuDbMEsppJg==",
"peerDependencies": { "peerDependencies": {
"svelte": ">=3 <5" "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0-next.1"
} }
}, },
"node_modules/svelte/node_modules/estree-walker": { "node_modules/svelte/node_modules/estree-walker": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.3.23", "version": "0.3.30",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "npm run pyodide:fetch && vite dev --host", "dev": "npm run pyodide:fetch && vite dev --host",
+1 -1
View File
@@ -76,7 +76,7 @@ dependencies = [
"faster-whisper==1.0.3", "faster-whisper==1.0.3",
"PyJWT[crypto]==2.9.0", "PyJWT[crypto]==2.9.0",
"authlib==1.3.1", "authlib==1.3.2",
"black==24.8.0", "black==24.8.0",
"langfuse==2.44.0", "langfuse==2.44.0",
+271 -189
View File
@@ -5,6 +5,8 @@
import { PaneGroup, Pane, PaneResizer } from 'paneforge'; import { PaneGroup, Pane, PaneResizer } from 'paneforge';
import { getContext, onDestroy, onMount, tick } from 'svelte'; import { getContext, onDestroy, onMount, tick } from 'svelte';
const i18n: Writable<i18nType> = getContext('i18n');
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { page } from '$app/stores'; import { page } from '$app/stores';
@@ -29,7 +31,8 @@
currentChatPage, currentChatPage,
temporaryChatEnabled, temporaryChatEnabled,
mobile, mobile,
showOverview showOverview,
chatTitle
} from '$lib/stores'; } from '$lib/stores';
import { import {
convertMessagesToHistory, convertMessagesToHistory,
@@ -67,11 +70,9 @@
import Navbar from '$lib/components/layout/Navbar.svelte'; import Navbar from '$lib/components/layout/Navbar.svelte';
import ChatControls from './ChatControls.svelte'; import ChatControls from './ChatControls.svelte';
import EventConfirmDialog from '../common/ConfirmDialog.svelte'; import EventConfirmDialog from '../common/ConfirmDialog.svelte';
import EllipsisVertical from '../icons/EllipsisVertical.svelte';
const i18n: Writable<i18nType> = getContext('i18n');
export let chatIdProp = ''; export let chatIdProp = '';
let loaded = false; let loaded = false;
const eventTarget = new EventTarget(); const eventTarget = new EventTarget();
let controlPane; let controlPane;
@@ -89,11 +90,10 @@
let eventConfirmationInputValue = ''; let eventConfirmationInputValue = '';
let eventCallback = null; let eventCallback = null;
let showModelSelector = true; let chatIdUnsubscriber: Unsubscriber | undefined;
let selectedModels = ['']; let selectedModels = [''];
let atSelectedModel: Model | undefined; let atSelectedModel: Model | undefined;
let selectedModelIds = []; let selectedModelIds = [];
$: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels; $: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels;
@@ -103,36 +103,17 @@
let chat = null; let chat = null;
let tags = []; let tags = [];
let title = '';
let prompt = '';
let chatFiles = [];
let files = [];
let messages = [];
let history = { let history = {
messages: {}, messages: {},
currentId: null currentId: null
}; };
// Chat Input
let prompt = '';
let chatFiles = [];
let files = [];
let params = {}; let params = {};
let chatIdUnsubscriber: Unsubscriber | undefined;
$: if (history.currentId !== null) {
let _messages = [];
let currentMessage = history.messages[history.currentId];
while (currentMessage) {
_messages.unshift({ ...currentMessage });
currentMessage =
currentMessage.parentId !== null ? history.messages[currentMessage.parentId] : null;
}
// This is most likely causing the performance issue
messages = _messages;
} else {
messages = [];
}
$: if (chatIdProp) { $: if (chatIdProp) {
(async () => { (async () => {
console.log(chatIdProp); console.log(chatIdProp);
@@ -150,6 +131,7 @@
} }
const showMessage = async (message) => { const showMessage = async (message) => {
const _chatId = JSON.parse(JSON.stringify($chatId));
let _messageId = JSON.parse(JSON.stringify(message.id)); let _messageId = JSON.parse(JSON.stringify(message.id));
let messageChildrenIds = history.messages[_messageId].childrenIds; let messageChildrenIds = history.messages[_messageId].childrenIds;
@@ -169,6 +151,9 @@
if (messageElement) { if (messageElement) {
messageElement.scrollIntoView({ behavior: 'smooth' }); messageElement.scrollIntoView({ behavior: 'smooth' });
} }
await tick();
saveChatHandler(_chatId);
}; };
const chatEventHandler = async (event, cb) => { const chatEventHandler = async (event, cb) => {
@@ -226,7 +211,7 @@
console.log('Unknown message type', data); console.log('Unknown message type', data);
} }
messages = messages; history.messages[event.message_id] = message;
} }
}; };
@@ -289,11 +274,12 @@
if (controlPane && !$mobile) { if (controlPane && !$mobile) {
try { try {
if (value) { if (value) {
controlPane.resize( const currentSize = controlPane.getSize();
parseInt(localStorage.getItem('chat-controls-size') || '35')
? parseInt(localStorage.getItem('chat-controls-size') || '35') if (currentSize === 0) {
: 35 const size = parseInt(localStorage?.chatControlsSize ?? '30');
); controlPane.resize(size ? size : 30);
}
} else { } else {
controlPane.resize(0); controlPane.resize(0);
} }
@@ -307,6 +293,11 @@
showOverview.set(false); showOverview.set(false);
} }
}); });
const chatInput = document.getElementById('chat-textarea');
chatInput?.focus();
chats.subscribe(() => {});
}); });
onDestroy(() => { onDestroy(() => {
@@ -324,11 +315,11 @@
window.history.replaceState(history.state, '', `/`); window.history.replaceState(history.state, '', `/`);
} }
await chatId.set('');
autoScroll = true; autoScroll = true;
title = ''; await chatId.set('');
messages = []; await chatTitle.set('');
history = { history = {
messages: {}, messages: {},
currentId: null currentId: null
@@ -339,6 +330,8 @@
if ($page.url.searchParams.get('models')) { if ($page.url.searchParams.get('models')) {
selectedModels = $page.url.searchParams.get('models')?.split(','); selectedModels = $page.url.searchParams.get('models')?.split(',');
} else if ($page.url.searchParams.get('model')) {
selectedModels = $page.url.searchParams.get('model')?.split(',');
} else if ($settings?.models) { } else if ($settings?.models) {
selectedModels = $settings?.models; selectedModels = $settings?.models;
} else if ($config?.default_models) { } else if ($config?.default_models) {
@@ -367,6 +360,7 @@
if ($page.url.searchParams.get('call') === 'true') { if ($page.url.searchParams.get('call') === 'true') {
showCallOverlay.set(true); showCallOverlay.set(true);
showControls.set(true);
} }
selectedModels = selectedModels.map((modelId) => selectedModels = selectedModels.map((modelId) =>
@@ -407,7 +401,8 @@
(chatContent?.history ?? undefined) !== undefined (chatContent?.history ?? undefined) !== undefined
? chatContent.history ? chatContent.history
: convertMessagesToHistory(chatContent.messages); : convertMessagesToHistory(chatContent.messages);
title = chatContent.title;
chatTitle.set(chatContent.title);
const userSettings = await getUserSettings(localStorage.token); const userSettings = await getUserSettings(localStorage.token);
@@ -423,8 +418,8 @@
autoScroll = true; autoScroll = true;
await tick(); await tick();
if (messages.length > 0) { if (history.currentId) {
history.messages[messages.at(-1).id].done = true; history.messages[history.currentId].done = true;
} }
await tick(); await tick();
@@ -443,8 +438,12 @@
}; };
const createMessagesList = (responseMessageId) => { const createMessagesList = (responseMessageId) => {
if (responseMessageId === null) {
return [];
}
const message = history.messages[responseMessageId]; const message = history.messages[responseMessageId];
if (message.parentId) { if (message?.parentId) {
return [...createMessagesList(message.parentId), message]; return [...createMessagesList(message.parentId), message];
} else { } else {
return [message]; return [message];
@@ -488,11 +487,12 @@
} }
} }
await tick();
if ($chatId == chatId) { if ($chatId == chatId) {
if (!$temporaryChatEnabled) { if (!$temporaryChatEnabled) {
chat = await updateChatById(localStorage.token, chatId, { chat = await updateChatById(localStorage.token, chatId, {
models: selectedModels, models: selectedModels,
messages: messages,
history: history, history: history,
params: params, params: params,
files: chatFiles files: chatFiles
@@ -505,6 +505,8 @@
}; };
const chatActionHandler = async (chatId, actionId, modelId, responseMessageId, event = null) => { const chatActionHandler = async (chatId, actionId, modelId, responseMessageId, event = null) => {
const messages = createMessagesList(responseMessageId);
const res = await chatAction(localStorage.token, actionId, { const res = await chatAction(localStorage.token, actionId, {
model: modelId, model: modelId,
messages: messages.map((m) => ({ messages: messages.map((m) => ({
@@ -563,6 +565,66 @@
}, 1000); }, 1000);
}; };
const createMessagePair = async (userPrompt) => {
prompt = '';
if (selectedModels.length === 0) {
toast.error($i18n.t('Model not selected'));
} else {
const modelId = selectedModels[0];
const model = $models.filter((m) => m.id === modelId).at(0);
const messages = createMessagesList(history.currentId);
const parentMessage = messages.length !== 0 ? messages.at(-1) : null;
const userMessageId = uuidv4();
const responseMessageId = uuidv4();
const userMessage = {
id: userMessageId,
parentId: parentMessage ? parentMessage.id : null,
childrenIds: [responseMessageId],
role: 'user',
content: userPrompt ? userPrompt : `[PROMPT] ${userMessageId}`,
timestamp: Math.floor(Date.now() / 1000)
};
const responseMessage = {
id: responseMessageId,
parentId: userMessageId,
childrenIds: [],
role: 'assistant',
content: `[RESPONSE] ${responseMessageId}`,
done: true,
model: modelId,
modelName: model.name ?? model.id,
modelIdx: 0,
timestamp: Math.floor(Date.now() / 1000)
};
if (parentMessage) {
parentMessage.childrenIds.push(userMessageId);
history.messages[parentMessage.id] = parentMessage;
}
history.messages[userMessageId] = userMessage;
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
await tick();
if (autoScroll) {
scrollToBottom();
}
if (messages.length === 0) {
await initChatHandler();
} else {
await saveChatHandler($chatId);
}
}
};
////////////////////////// //////////////////////////
// Chat functions // Chat functions
////////////////////////// //////////////////////////
@@ -570,6 +632,7 @@
const submitPrompt = async (userPrompt, { _raw = false } = {}) => { const submitPrompt = async (userPrompt, { _raw = false } = {}) => {
let _responses = []; let _responses = [];
console.log('submitPrompt', $chatId); console.log('submitPrompt', $chatId);
const messages = createMessagesList(history.currentId);
selectedModels = selectedModels.map((modelId) => selectedModels = selectedModels.map((modelId) =>
$models.map((m) => m.id).includes(modelId) ? modelId : '' $models.map((m) => m.id).includes(modelId) ? modelId : ''
@@ -663,8 +726,16 @@
parentId: string, parentId: string,
{ modelId = null, modelIdx = null, newChat = false } = {} { modelId = null, modelIdx = null, newChat = false } = {}
) => { ) => {
let _responses: string[] = []; // Create new chat if newChat is true and first user message
if (
newChat &&
history.messages[history.currentId].parentId === null &&
history.messages[history.currentId].role === 'user'
) {
await initChatHandler();
}
let _responses: string[] = [];
// If modelId is provided, use it, else use selected model // If modelId is provided, use it, else use selected model
let selectedModelIds = modelId let selectedModelIds = modelId
? [modelId] ? [modelId]
@@ -709,38 +780,14 @@
} }
await tick(); await tick();
// Create new chat if only one message in messages
if (newChat && messages.length == 2) {
if (!$temporaryChatEnabled) {
chat = await createNewChat(localStorage.token, {
id: $chatId,
title: $i18n.t('New Chat'),
models: selectedModels,
system: $settings.system ?? undefined,
params: params,
messages: messages,
history: history,
tags: [],
timestamp: Date.now()
});
currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage));
await chatId.set(chat.id);
} else {
await chatId.set('local');
}
await tick();
}
const _chatId = JSON.parse(JSON.stringify($chatId)); const _chatId = JSON.parse(JSON.stringify($chatId));
await Promise.all( await Promise.all(
selectedModelIds.map(async (modelId, _modelIdx) => { selectedModelIds.map(async (modelId, _modelIdx) => {
console.log('modelId', modelId); console.log('modelId', modelId);
const model = $models.filter((m) => m.id === modelId).at(0); const model = $models.filter((m) => m.id === modelId).at(0);
if (model) { if (model) {
const messages = createMessagesList(parentId);
// If there are image files, check if model is vision capable // If there are image files, check if model is vision capable
const hasImages = messages.some((message) => const hasImages = messages.some((message) =>
message.files?.some((file) => file.type === 'image') message.files?.some((file) => file.type === 'image')
@@ -839,7 +886,7 @@
}` }`
} }
: undefined, : undefined,
...messages ...createMessagesList(responseMessageId)
] ]
.filter((message) => message?.content?.trim()) .filter((message) => message?.content?.trim())
.map((message) => { .map((message) => {
@@ -890,7 +937,7 @@
} }
]; ];
files.push(...model.info.meta.knowledge); files.push(...model.info.meta.knowledge);
messages = messages; // Trigger Svelte update history.messages[responseMessageId] = responseMessage;
} }
files.push( files.push(
...(userMessage?.files ?? []).filter((item) => ...(userMessage?.files ?? []).filter((item) =>
@@ -911,7 +958,11 @@
await tick(); await tick();
const stream = $settings?.streamResponse ?? true; const stream =
model?.info?.params?.stream_response ??
$settings?.params?.stream_response ??
params?.stream_response ??
true;
const [res, controller] = await generateChatCompletion(localStorage.token, { const [res, controller] = await generateChatCompletion(localStorage.token, {
stream: stream, stream: stream,
model: model.id, model: model.id,
@@ -964,7 +1015,7 @@
const { value, done } = await reader.read(); const { value, done } = await reader.read();
if (done || stopResponseFlag || _chatId !== $chatId) { if (done || stopResponseFlag || _chatId !== $chatId) {
responseMessage.done = true; responseMessage.done = true;
messages = messages; history.messages[responseMessageId] = responseMessage;
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
@@ -1031,7 +1082,7 @@
); );
} }
messages = messages; history.messages[responseMessageId] = responseMessage;
} }
} else { } else {
responseMessage.done = true; responseMessage.done = true;
@@ -1054,7 +1105,8 @@
eval_count: data.eval_count, eval_count: data.eval_count,
eval_duration: data.eval_duration eval_duration: data.eval_duration
}; };
messages = messages;
history.messages[responseMessageId] = responseMessage;
if ($settings.notificationEnabled && !document.hasFocus()) { if ($settings.notificationEnabled && !document.hasFocus()) {
const notification = new Notification(`${model.id}`, { const notification = new Notification(`${model.id}`, {
@@ -1087,13 +1139,6 @@
} }
} }
} }
await chatCompletedHandler(
_chatId,
model.id,
responseMessageId,
createMessagesList(responseMessageId)
);
} else { } else {
if (res !== null) { if (res !== null) {
const error = await res.json(); const error = await res.json();
@@ -1122,11 +1167,18 @@
(status) => status.action !== 'knowledge_search' (status) => status.action !== 'knowledge_search'
); );
} }
messages = messages;
} }
await saveChatHandler(_chatId); await saveChatHandler(_chatId);
history.messages[responseMessageId] = responseMessage;
await chatCompletedHandler(
_chatId,
model.id,
responseMessageId,
createMessagesList(responseMessageId)
);
stopResponseFlag = false; stopResponseFlag = false;
await tick(); await tick();
@@ -1156,10 +1208,11 @@
scrollToBottom(); scrollToBottom();
} }
if (messages.length == 2 && messages.at(1).content !== '' && selectedModels[0] === model.id) { const messages = createMessagesList(responseMessageId);
if (messages.length == 2 && messages.at(-1).content !== '' && selectedModels[0] === model.id) {
window.history.replaceState(history.state, '', `/c/${_chatId}`); window.history.replaceState(history.state, '', `/c/${_chatId}`);
const _title = await generateChatTitle(userPrompt); const title = await generateChatTitle(userPrompt);
await setChatTitle(_chatId, _title); await setChatTitle(_chatId, title);
} }
return _response; return _response;
@@ -1184,7 +1237,7 @@
} }
]; ];
files.push(...model.info.meta.knowledge); files.push(...model.info.meta.knowledge);
messages = messages; // Trigger Svelte update history.messages[responseMessageId] = responseMessage;
} }
files.push( files.push(
...(userMessage?.files ?? []).filter((item) => ...(userMessage?.files ?? []).filter((item) =>
@@ -1205,7 +1258,12 @@
await tick(); await tick();
try { try {
const stream = $settings?.streamResponse ?? true; const stream =
model?.info?.params?.stream_response ??
$settings?.params?.stream_response ??
params?.stream_response ??
true;
const [res, controller] = await generateOpenAIChatCompletion( const [res, controller] = await generateOpenAIChatCompletion(
localStorage.token, localStorage.token,
{ {
@@ -1235,7 +1293,7 @@
}` }`
} }
: undefined, : undefined,
...messages ...createMessagesList(responseMessageId)
] ]
.filter((message) => message?.content?.trim()) .filter((message) => message?.content?.trim())
.map((message, idx, arr) => ({ .map((message, idx, arr) => ({
@@ -1313,7 +1371,7 @@
} }
if (done || stopResponseFlag || _chatId !== $chatId) { if (done || stopResponseFlag || _chatId !== $chatId) {
responseMessage.done = true; responseMessage.done = true;
messages = messages; history.messages[responseMessageId] = responseMessage;
if (stopResponseFlag) { if (stopResponseFlag) {
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
@@ -1368,7 +1426,7 @@
); );
} }
messages = messages; history.messages[responseMessageId] = responseMessage;
} }
if (autoScroll) { if (autoScroll) {
@@ -1377,13 +1435,6 @@
} }
} }
await chatCompletedHandler(
_chatId,
model.id,
responseMessageId,
createMessagesList(responseMessageId)
);
if ($settings.notificationEnabled && !document.hasFocus()) { if ($settings.notificationEnabled && !document.hasFocus()) {
const notification = new Notification(`${model.id}`, { const notification = new Notification(`${model.id}`, {
body: responseMessage.content, body: responseMessage.content,
@@ -1409,7 +1460,14 @@
await saveChatHandler(_chatId); await saveChatHandler(_chatId);
messages = messages; history.messages[responseMessageId] = responseMessage;
await chatCompletedHandler(
_chatId,
model.id,
responseMessageId,
createMessagesList(responseMessageId)
);
stopResponseFlag = false; stopResponseFlag = false;
await tick(); await tick();
@@ -1440,11 +1498,11 @@
scrollToBottom(); scrollToBottom();
} }
const messages = createMessagesList(responseMessageId);
if (messages.length == 2 && selectedModels[0] === model.id) { if (messages.length == 2 && selectedModels[0] === model.id) {
window.history.replaceState(history.state, '', `/c/${_chatId}`); window.history.replaceState(history.state, '', `/c/${_chatId}`);
const title = await generateChatTitle(userPrompt);
const _title = await generateChatTitle(userPrompt); await setChatTitle(_chatId, title);
await setChatTitle(_chatId, _title);
} }
return _response; return _response;
@@ -1492,7 +1550,7 @@
); );
} }
messages = messages; history.messages[responseMessage.id] = responseMessage;
}; };
const stopResponse = () => { const stopResponse = () => {
@@ -1503,7 +1561,7 @@
const regenerateResponse = async (message) => { const regenerateResponse = async (message) => {
console.log('regenerateResponse'); console.log('regenerateResponse');
if (messages.length != 0) { if (history.currentId) {
let userMessage = history.messages[message.parentId]; let userMessage = history.messages[message.parentId];
let userPrompt = userMessage.content; let userPrompt = userMessage.content;
@@ -1521,11 +1579,11 @@
} }
}; };
const continueGeneration = async () => { const continueResponse = async () => {
console.log('continueGeneration'); console.log('continueResponse');
const _chatId = JSON.parse(JSON.stringify($chatId)); const _chatId = JSON.parse(JSON.stringify($chatId));
if (messages.length != 0 && messages.at(-1).done == true) { if (history.currentId && history.messages[history.currentId].done == true) {
const responseMessage = history.messages[history.currentId]; const responseMessage = history.messages[history.currentId];
responseMessage.done = false; responseMessage.done = false;
await tick(); await tick();
@@ -1553,6 +1611,53 @@
} }
}; };
const mergeResponses = async (messageId, responses, _chatId) => {
console.log('mergeResponses', messageId, responses);
const message = history.messages[messageId];
const mergedResponse = {
status: true,
content: ''
};
message.merged = mergedResponse;
history.messages[messageId] = message;
try {
const [res, controller] = await generateMoACompletion(
localStorage.token,
message.model,
history.messages[message.parentId].content,
responses
);
if (res && res.ok && res.body) {
const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks);
for await (const update of textStream) {
const { value, done, citations, error, usage } = update;
if (error || done) {
break;
}
if (mergedResponse.content == '' && value == '\n') {
continue;
} else {
mergedResponse.content += value;
history.messages[messageId] = message;
}
if (autoScroll) {
scrollToBottom();
}
}
await saveChatHandler(_chatId);
} else {
console.error(res);
}
} catch (e) {
console.error(e);
}
};
const generateChatTitle = async (userPrompt) => { const generateChatTitle = async (userPrompt) => {
if ($settings?.title?.auto ?? true) { if ($settings?.title?.auto ?? true) {
const title = await generateTitle( const title = await generateTitle(
@@ -1571,22 +1676,27 @@
} }
}; };
const setChatTitle = async (_chatId, _title) => { const setChatTitle = async (_chatId, title) => {
if (_chatId === $chatId) { if (_chatId === $chatId) {
title = _title; chatTitle.set(title);
} }
if (!$temporaryChatEnabled) { if (!$temporaryChatEnabled) {
chat = await updateChatById(localStorage.token, _chatId, { title: _title }); chat = await updateChatById(localStorage.token, _chatId, { title: title });
currentChatPage.set(1); currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage)); await chats.set(await getChatList(localStorage.token, $currentChatPage));
} }
}; };
const getWebSearchResults = async (model: string, parentId: string, responseId: string) => { const getWebSearchResults = async (
const responseMessage = history.messages[responseId]; model: string,
parentId: string,
responseMessageId: string
) => {
const responseMessage = history.messages[responseMessageId];
const userMessage = history.messages[parentId]; const userMessage = history.messages[parentId];
const messages = createMessagesList(history.currentId);
responseMessage.statusHistory = [ responseMessage.statusHistory = [
{ {
@@ -1595,7 +1705,7 @@
description: $i18n.t('Generating search query') description: $i18n.t('Generating search query')
} }
]; ];
messages = messages; history.messages[responseMessageId] = responseMessage;
const prompt = userMessage.content; const prompt = userMessage.content;
let searchQuery = await generateSearchQuery( let searchQuery = await generateSearchQuery(
@@ -1615,7 +1725,7 @@
action: 'web_search', action: 'web_search',
description: $i18n.t('No search query generated') description: $i18n.t('No search query generated')
}); });
messages = messages; history.messages[responseMessageId] = responseMessage;
return; return;
} }
@@ -1624,7 +1734,7 @@
action: 'web_search', action: 'web_search',
description: $i18n.t(`Searching "{{searchQuery}}"`, { searchQuery }) description: $i18n.t(`Searching "{{searchQuery}}"`, { searchQuery })
}); });
messages = messages; history.messages[responseMessageId] = responseMessage;
const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => { const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => {
console.log(error); console.log(error);
@@ -1652,8 +1762,7 @@
type: 'web_search_results', type: 'web_search_results',
urls: results.filenames urls: results.filenames
}); });
history.messages[responseMessageId] = responseMessage;
messages = messages;
} else { } else {
responseMessage.statusHistory.push({ responseMessage.statusHistory.push({
done: true, done: true,
@@ -1661,7 +1770,7 @@
action: 'web_search', action: 'web_search',
description: 'No search results found' description: 'No search results found'
}); });
messages = messages; history.messages[responseMessageId] = responseMessage;
} }
}; };
@@ -1671,13 +1780,34 @@
}); });
}; };
const initChatHandler = async () => {
if (!$temporaryChatEnabled) {
chat = await createNewChat(localStorage.token, {
id: $chatId,
title: $i18n.t('New Chat'),
models: selectedModels,
system: $settings.system ?? undefined,
params: params,
history: history,
tags: [],
timestamp: Date.now()
});
currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage));
await chatId.set(chat.id);
} else {
await chatId.set('local');
}
await tick();
};
const saveChatHandler = async (_chatId) => { const saveChatHandler = async (_chatId) => {
if ($chatId == _chatId) { if ($chatId == _chatId) {
if (!$temporaryChatEnabled) { if (!$temporaryChatEnabled) {
chat = await updateChatById(localStorage.token, _chatId, { chat = await updateChatById(localStorage.token, _chatId, {
messages: messages,
history: history,
models: selectedModels, models: selectedModels,
history: history,
params: params, params: params,
files: chatFiles files: chatFiles
}); });
@@ -1687,58 +1817,12 @@
} }
} }
}; };
const mergeResponses = async (messageId, responses, _chatId) => {
console.log('mergeResponses', messageId, responses);
const message = history.messages[messageId];
const mergedResponse = {
status: true,
content: ''
};
message.merged = mergedResponse;
messages = messages;
try {
const [res, controller] = await generateMoACompletion(
localStorage.token,
message.model,
history.messages[message.parentId].content,
responses
);
if (res && res.ok && res.body) {
const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks);
for await (const update of textStream) {
const { value, done, citations, error, usage } = update;
if (error || done) {
break;
}
if (mergedResponse.content == '' && value == '\n') {
continue;
} else {
mergedResponse.content += value;
messages = messages;
}
if (autoScroll) {
scrollToBottom();
}
}
await saveChatHandler(_chatId);
} else {
console.error(res);
}
} catch (e) {
console.error(e);
}
};
</script> </script>
<svelte:head> <svelte:head>
<title> <title>
{title {$chatTitle
? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} | ${$WEBUI_NAME}` ? `${$chatTitle.length > 30 ? `${$chatTitle.slice(0, 30)}...` : $chatTitle} | ${$WEBUI_NAME}`
: `${$WEBUI_NAME}`} : `${$WEBUI_NAME}`}
</title> </title>
</svelte:head> </svelte:head>
@@ -1784,17 +1868,16 @@
{/if} {/if}
<Navbar <Navbar
{title}
bind:selectedModels
bind:showModelSelector
shareEnabled={messages.length > 0}
{chat} {chat}
title={$chatTitle}
bind:selectedModels
shareEnabled={!!history.currentId}
{initNewChat} {initNewChat}
/> />
<PaneGroup direction="horizontal" class="w-full h-full"> <PaneGroup direction="horizontal" class="w-full h-full">
<Pane defaultSize={50} class="h-full flex w-full relative"> <Pane defaultSize={50} class="h-full flex w-full relative">
{#if $banners.length > 0 && messages.length === 0 && !$chatId && selectedModels.length <= 1} {#if $banners.length > 0 && !history.currentId && !$chatId && selectedModels.length <= 1}
<div class="absolute top-3 left-0 right-0 w-full z-20"> <div class="absolute top-3 left-0 right-0 w-full z-20">
<div class=" flex flex-col gap-1 w-full"> <div class=" flex flex-col gap-1 w-full">
{#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner} {#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner}
@@ -1833,31 +1916,31 @@
<div class=" h-full w-full flex flex-col {chatIdProp ? 'py-4' : 'pt-2 pb-4'}"> <div class=" h-full w-full flex flex-col {chatIdProp ? 'py-4' : 'pt-2 pb-4'}">
<Messages <Messages
chatId={$chatId} chatId={$chatId}
{selectedModels}
{processing}
bind:history bind:history
bind:messages
bind:autoScroll bind:autoScroll
bind:prompt bind:prompt
bottomPadding={files.length > 0} {selectedModels}
{sendPrompt} {sendPrompt}
{continueGeneration} {showMessage}
{continueResponse}
{regenerateResponse} {regenerateResponse}
{mergeResponses} {mergeResponses}
{chatActionHandler} {chatActionHandler}
{showMessage} bottomPadding={files.length > 0}
/> />
</div> </div>
</div> </div>
<div class=""> <div class="">
<MessageInput <MessageInput
{history}
bind:files bind:files
bind:prompt bind:prompt
bind:autoScroll bind:autoScroll
bind:selectedToolIds bind:selectedToolIds
bind:webSearchEnabled bind:webSearchEnabled
bind:atSelectedModel bind:atSelectedModel
{selectedModels}
availableToolIds={selectedModelIds.reduce((a, e, i, arr) => { availableToolIds={selectedModelIds.reduce((a, e, i, arr) => {
const model = $models.find((m) => m.id === e); const model = $models.find((m) => m.id === e);
if (model?.info?.meta?.toolIds ?? false) { if (model?.info?.meta?.toolIds ?? false) {
@@ -1866,10 +1949,9 @@
return a; return a;
}, [])} }, [])}
transparentBackground={$settings?.backgroundImageUrl ?? false} transparentBackground={$settings?.backgroundImageUrl ?? false}
{selectedModels}
{messages}
{submitPrompt} {submitPrompt}
{stopResponse} {stopResponse}
{createMessagePair}
on:call={async () => { on:call={async () => {
await showControls.set(true); await showControls.set(true);
}} }}
@@ -1879,6 +1961,13 @@
</Pane> </Pane>
<ChatControls <ChatControls
bind:history
bind:chatFiles
bind:params
bind:files
bind:pane={controlPane}
chatId={$chatId}
modelId={selectedModelIds?.at(0) ?? null}
models={selectedModelIds.reduce((a, e, i, arr) => { models={selectedModelIds.reduce((a, e, i, arr) => {
const model = $models.find((m) => m.id === e); const model = $models.find((m) => m.id === e);
if (model) { if (model) {
@@ -1886,16 +1975,9 @@
} }
return a; return a;
}, [])} }, [])}
bind:history
bind:chatFiles
bind:params
bind:files
bind:pane={controlPane}
{submitPrompt} {submitPrompt}
{stopResponse} {stopResponse}
{showMessage} {showMessage}
modelId={selectedModelIds?.at(0) ?? null}
chatId={$chatId}
{eventTarget} {eventTarget}
/> />
</PaneGroup> </PaneGroup>
+12 -6
View File
@@ -115,17 +115,17 @@
{/if} {/if}
{:else} {:else}
<!-- if $showControls --> <!-- if $showControls -->
<PaneResizer class="relative flex w-2 items-center justify-center bg-background"> <PaneResizer class="relative flex w-2 items-center justify-center bg-background group">
<div class="z-10 flex h-7 w-5 items-center justify-center rounded-sm"> <div class="z-10 flex h-7 w-5 items-center justify-center rounded-sm">
<EllipsisVertical /> <EllipsisVertical className="size-4 invisible group-hover:visible" />
</div> </div>
</PaneResizer> </PaneResizer>
<Pane <Pane
bind:pane bind:pane
defaultSize={$showControls defaultSize={$showControls
? parseInt(localStorage.getItem('chat-controls-size') || '35') ? parseInt(localStorage?.chatControlsSize ?? '30')
? parseInt(localStorage.getItem('chat-controls-size') || '35') ? parseInt(localStorage?.chatControlsSize ?? '30')
: 35 : 30
: 0} : 0}
onResize={(size) => { onResize={(size) => {
if (size === 0) { if (size === 0) {
@@ -134,7 +134,7 @@
if (!$showControls) { if (!$showControls) {
showControls.set(true); showControls.set(true);
} }
localStorage.setItem('chat-controls-size', size); localStorage.chatControlsSize = size;
} }
}} }}
> >
@@ -163,6 +163,12 @@
<Overview <Overview
{history} {history}
on:nodeclick={(e) => { on:nodeclick={(e) => {
if (e.detail.node.data.message.favorite) {
history.messages[e.detail.node.data.message.id].favorite = true;
} else {
history.messages[e.detail.node.data.message.id].favorite = null;
}
showMessage(e.detail.node.data.message); showMessage(e.detail.node.data.message);
}} }}
on:close={() => { on:close={() => {
+14 -8
View File
@@ -41,6 +41,7 @@
export let transparentBackground = false; export let transparentBackground = false;
export let submitPrompt: Function; export let submitPrompt: Function;
export let createMessagePair: Function;
export let stopResponse: Function; export let stopResponse: Function;
export let autoScroll = false; export let autoScroll = false;
@@ -61,15 +62,14 @@
let user = null; let user = null;
let chatInputPlaceholder = ''; let chatInputPlaceholder = '';
export let files = []; export let history;
export let prompt = '';
export let files = [];
export let availableToolIds = []; export let availableToolIds = [];
export let selectedToolIds = []; export let selectedToolIds = [];
export let webSearchEnabled = false; export let webSearchEnabled = false;
export let prompt = '';
export let messages = [];
let visionCapableModels = []; let visionCapableModels = [];
$: visionCapableModels = [...(atSelectedModel ? [atSelectedModel] : selectedModels)].filter( $: visionCapableModels = [...(atSelectedModel ? [atSelectedModel] : selectedModels)].filter(
(model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.vision ?? true (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.vision ?? true
@@ -107,7 +107,7 @@
files = [...files, fileItem]; files = [...files, fileItem];
// Check if the file is an audio file and transcribe/convert it to text file // Check if the file is an audio file and transcribe/convert it to text file
if (['audio/mpeg', 'audio/wav', 'audio/ogg'].includes(file['type'])) { if (['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/x-m4a'].includes(file['type'])) {
const res = await transcribeAudio(localStorage.token, file).catch((error) => { const res = await transcribeAudio(localStorage.token, file).catch((error) => {
toast.error(error); toast.error(error);
return null; return null;
@@ -272,7 +272,7 @@
<div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center"> <div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
<div class="flex flex-col max-w-6xl px-2.5 md:px-6 w-full"> <div class="flex flex-col max-w-6xl px-2.5 md:px-6 w-full">
<div class="relative"> <div class="relative">
{#if autoScroll === false && messages.length > 0} {#if autoScroll === false && history?.currentId}
<div <div
class=" absolute -top-12 left-0 right-0 flex justify-center z-30 pointer-events-none" class=" absolute -top-12 left-0 right-0 flex justify-center z-30 pointer-events-none"
> >
@@ -555,6 +555,12 @@
const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
const commandsContainerElement = document.getElementById('commands-container'); const commandsContainerElement = document.getElementById('commands-container');
// Command/Ctrl + Shift + Enter to submit a message pair
if (isCtrlPressed && e.key === 'Enter' && e.shiftKey) {
e.preventDefault();
createMessagePair(prompt);
}
// Check if Ctrl + R is pressed // Check if Ctrl + R is pressed
if (prompt === '' && isCtrlPressed && e.key.toLowerCase() === 'r') { if (prompt === '' && isCtrlPressed && e.key.toLowerCase() === 'r') {
e.preventDefault(); e.preventDefault();
@@ -692,7 +698,7 @@
/> />
<div class="self-end mb-2 flex space-x-1 mr-1"> <div class="self-end mb-2 flex space-x-1 mr-1">
{#if messages.length == 0 || messages.at(-1).done == true} {#if !history?.currentId || history.messages[history.currentId]?.done == true}
<Tooltip content={$i18n.t('Record voice')}> <Tooltip content={$i18n.t('Record voice')}>
<button <button
id="voice-input-button" id="voice-input-button"
@@ -744,7 +750,7 @@
</div> </div>
</div> </div>
<div class="flex items-end w-10"> <div class="flex items-end w-10">
{#if messages.length == 0 || messages.at(-1).done == true} {#if !history.currentId || history.messages[history.currentId]?.done == true}
{#if prompt === ''} {#if prompt === ''}
<div class=" flex items-center mb-1"> <div class=" flex items-center mb-1">
<Tooltip content={$i18n.t('Call')}> <Tooltip content={$i18n.t('Call')}>
@@ -361,7 +361,7 @@
?.at(0) ?? undefined; ?.at(0) ?? undefined;
currentUtterance = new SpeechSynthesisUtterance(content); currentUtterance = new SpeechSynthesisUtterance(content);
currentUtterance.rate = $settings.audio?.tts?.speedRate ?? 1; currentUtterance.rate = $settings.audio?.tts?.playbackRate ?? 1;
if (voice) { if (voice) {
currentUtterance.voice = voice; currentUtterance.voice = voice;
@@ -388,7 +388,7 @@
if (audioElement) { if (audioElement) {
audioElement.src = audio.src; audioElement.src = audio.src;
audioElement.muted = true; audioElement.muted = true;
audioElement.playbackRate = $settings.audio?.tts?.speedRate ?? 1; audioElement.playbackRate = $settings.audio?.tts?.playbackRate ?? 1;
audioElement audioElement
.play() .play()
@@ -1,6 +1,14 @@
<script lang="ts"> <script lang="ts">
import { prompts } from '$lib/stores'; import { prompts } from '$lib/stores';
import { findWordIndices } from '$lib/utils'; import {
findWordIndices,
getUserPosition,
getFormattedDate,
getFormattedTime,
getCurrentDateTime,
getUserTimezone,
getWeekday
} from '$lib/utils';
import { tick, getContext } from 'svelte'; import { tick, getContext } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
@@ -39,8 +47,6 @@
return '{{CLIPBOARD}}'; return '{{CLIPBOARD}}';
}); });
console.log(clipboardText);
const clipboardItems = await navigator.clipboard.read(); const clipboardItems = await navigator.clipboard.read();
let imageUrl = null; let imageUrl = null;
@@ -50,7 +56,6 @@
if (type.startsWith('image/')) { if (type.startsWith('image/')) {
const blob = await item.getType(type); const blob = await item.getType(type);
imageUrl = URL.createObjectURL(blob); imageUrl = URL.createObjectURL(blob);
console.log(`Image URL (${type}): ${imageUrl}`);
} }
} }
} }
@@ -65,7 +70,42 @@
]; ];
} }
text = command.content.replaceAll('{{CLIPBOARD}}', clipboardText); text = text.replaceAll('{{CLIPBOARD}}', clipboardText);
}
if (command.content.includes('{{USER_LOCATION}}')) {
const location = await getUserPosition();
text = text.replaceAll('{{USER_LOCATION}}', String(location));
}
if (command.content.includes('{{USER_LANGUAGE}}')) {
const language = localStorage.getItem('locale') || 'en-US';
text = text.replaceAll('{{USER_LANGUAGE}}', language);
}
if (command.content.includes('{{CURRENT_DATE}}')) {
const date = getFormattedDate();
text = text.replaceAll('{{CURRENT_DATE}}', date);
}
if (command.content.includes('{{CURRENT_TIME}}')) {
const time = getFormattedTime();
text = text.replaceAll('{{CURRENT_TIME}}', time);
}
if (command.content.includes('{{CURRENT_DATETIME}}')) {
const dateTime = getCurrentDateTime();
text = text.replaceAll('{{CURRENT_DATETIME}}', dateTime);
}
if (command.content.includes('{{CURRENT_TIMEZONE}}')) {
const timezone = getUserTimezone();
text = text.replaceAll('{{CURRENT_TIMEZONE}}', timezone);
}
if (command.content.includes('{{CURRENT_WEEKDAY}}')) {
const weekday = getWeekday();
text = text.replaceAll('{{CURRENT_WEEKDAY}}', weekday);
} }
prompt = text; prompt = text;
+176 -215
View File
@@ -7,31 +7,63 @@
import { getChatList, updateChatById } from '$lib/apis/chats'; import { getChatList, updateChatById } from '$lib/apis/chats';
import { copyToClipboard, findWordIndices } from '$lib/utils'; import { copyToClipboard, findWordIndices } from '$lib/utils';
import UserMessage from './Messages/UserMessage.svelte';
import ResponseMessage from './Messages/ResponseMessage.svelte';
import Placeholder from './Messages/Placeholder.svelte'; import Placeholder from './Messages/Placeholder.svelte';
import MultiResponseMessages from './Messages/MultiResponseMessages.svelte'; import Message from './Messages/Message.svelte';
import Loader from '../common/Loader.svelte';
import Spinner from '../common/Spinner.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let chatId = ''; export let chatId = '';
export let readOnly = false; export let user = $_user;
export let prompt;
export let history = {};
export let selectedModels;
let messages = [];
export let sendPrompt: Function; export let sendPrompt: Function;
export let continueGeneration: Function; export let continueResponse: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let mergeResponses: Function; export let mergeResponses: Function;
export let chatActionHandler: Function; export let chatActionHandler: Function;
export let showMessage: Function = () => {}; export let showMessage: Function = () => {};
export let user = $_user; export let readOnly = false;
export let prompt;
export let processing = '';
export let bottomPadding = false; export let bottomPadding = false;
export let autoScroll; export let autoScroll;
export let history = {};
export let messages = [];
export let selectedModels; let messagesCount = 20;
let messagesLoading = false;
const loadMoreMessages = async () => {
// scroll slightly down to disable continuous loading
const element = document.getElementById('messages-container');
element.scrollTop = element.scrollTop + 100;
messagesLoading = true;
messagesCount += 20;
await tick();
messagesLoading = false;
};
$: if (history.currentId) {
let _messages = [];
let message = history.messages[history.currentId];
while (message && _messages.length <= messagesCount) {
_messages.unshift({ ...message });
message = message.parentId !== null ? history.messages[message.parentId] : null;
}
messages = _messages;
} else {
messages = [];
}
$: if (autoScroll && bottomPadding) { $: if (autoScroll && bottomPadding) {
(async () => { (async () => {
@@ -45,56 +77,9 @@
element.scrollTop = element.scrollHeight; element.scrollTop = element.scrollHeight;
}; };
const copyToClipboardWithToast = async (text) => { const updateChatHistory = async () => {
const res = await copyToClipboard(text);
if (res) {
toast.success($i18n.t('Copying to clipboard was successful!'));
}
};
const confirmEditMessage = async (messageId, content, submit = true) => {
if (submit) {
let userPrompt = content;
let userMessageId = uuidv4();
let userMessage = {
id: userMessageId,
parentId: history.messages[messageId].parentId,
childrenIds: [],
role: 'user',
content: userPrompt,
...(history.messages[messageId].files && { files: history.messages[messageId].files }),
models: selectedModels
};
let messageParentId = history.messages[messageId].parentId;
if (messageParentId !== null) {
history.messages[messageParentId].childrenIds = [
...history.messages[messageParentId].childrenIds,
userMessageId
];
}
history.messages[userMessageId] = userMessage;
history.currentId = userMessageId;
await tick();
await sendPrompt(userPrompt, userMessageId);
} else {
history.messages[messageId].content = content;
await tick();
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
}
};
const updateChatMessages = async () => {
await tick(); await tick();
await updateChatById(localStorage.token, chatId, { await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history history: history
}); });
@@ -102,49 +87,6 @@
await chats.set(await getChatList(localStorage.token, $currentChatPage)); await chats.set(await getChatList(localStorage.token, $currentChatPage));
}; };
const confirmEditResponseMessage = async (messageId, content) => {
history.messages[messageId].originalContent = history.messages[messageId].content;
history.messages[messageId].content = content;
await updateChatMessages();
};
const saveNewResponseMessage = async (message, content) => {
const responseMessageId = uuidv4();
const parentId = message.parentId;
const responseMessage = {
...message,
id: responseMessageId,
parentId: parentId,
childrenIds: [],
content: content,
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
};
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
// Append messageId to childrenIds of parent message
if (parentId !== null) {
history.messages[parentId].childrenIds = [
...history.messages[parentId].childrenIds,
responseMessageId
];
}
await updateChatMessages();
};
const rateMessage = async (messageId, rating) => {
history.messages[messageId].annotation = {
...history.messages[messageId].annotation,
rating: rating
};
await updateChatMessages();
};
const showPreviousMessage = async (message) => { const showPreviousMessage = async (message) => {
if (message.parentId !== null) { if (message.parentId !== null) {
let messageId = let messageId =
@@ -243,7 +185,89 @@
} }
}; };
const deleteMessageHandler = async (messageId) => { const rateMessage = async (messageId, rating) => {
history.messages[messageId].annotation = {
...history.messages[messageId].annotation,
rating: rating
};
await updateChatHistory();
};
const editMessage = async (messageId, content, submit = true) => {
if (history.messages[messageId].role === 'user') {
if (submit) {
// New user message
let userPrompt = content;
let userMessageId = uuidv4();
let userMessage = {
id: userMessageId,
parentId: history.messages[messageId].parentId,
childrenIds: [],
role: 'user',
content: userPrompt,
...(history.messages[messageId].files && { files: history.messages[messageId].files }),
models: selectedModels
};
let messageParentId = history.messages[messageId].parentId;
if (messageParentId !== null) {
history.messages[messageParentId].childrenIds = [
...history.messages[messageParentId].childrenIds,
userMessageId
];
}
history.messages[userMessageId] = userMessage;
history.currentId = userMessageId;
await tick();
await sendPrompt(userPrompt, userMessageId);
} else {
// Edit user message
history.messages[messageId].content = content;
await updateChatHistory();
}
} else {
if (submit) {
// New response message
const responseMessageId = uuidv4();
const message = history.messages[messageId];
const parentId = message.parentId;
const responseMessage = {
...message,
id: responseMessageId,
parentId: parentId,
childrenIds: [],
content: content,
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
};
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
// Append messageId to childrenIds of parent message
if (parentId !== null) {
history.messages[parentId].childrenIds = [
...history.messages[parentId].childrenIds,
responseMessageId
];
}
await updateChatHistory();
} else {
// Edit response message
history.messages[messageId].originalContent = history.messages[messageId].content;
history.messages[messageId].content = content;
await updateChatHistory();
}
}
};
const deleteMessage = async (messageId) => {
const messageToDelete = history.messages[messageId]; const messageToDelete = history.messages[messageId];
const parentMessageId = messageToDelete.parentId; const parentMessageId = messageToDelete.parentId;
const childMessageIds = messageToDelete.childrenIds ?? []; const childMessageIds = messageToDelete.childrenIds ?? [];
@@ -278,15 +302,12 @@
showMessage({ id: parentMessageId }); showMessage({ id: parentMessageId });
// Update the chat // Update the chat
await updateChatById(localStorage.token, chatId, { await updateChatHistory();
messages: messages,
history: history
});
}; };
</script> </script>
<div class="h-full flex"> <div class="h-full flex">
{#if messages.length == 0} {#if Object.keys(history?.messages ?? {}).length == 0}
<Placeholder <Placeholder
modelIds={selectedModels} modelIds={selectedModels}
submitPrompt={async (p) => { submitPrompt={async (p) => {
@@ -327,115 +348,55 @@
{:else} {:else}
<div class="w-full pt-2"> <div class="w-full pt-2">
{#key chatId} {#key chatId}
{#each messages as message, messageIdx (message.id)} <div class="w-full">
<div class=" w-full {messageIdx === messages.length - 1 ? ' pb-12' : ''}"> {#if messages.at(0)?.parentId !== null}
<div <Loader
class="flex flex-col justify-between px-5 mb-3 {($settings?.widescreenMode ?? null) on:visible={(e) => {
? 'max-w-full' console.log('visible');
: 'max-w-5xl'} mx-auto rounded-lg group" if (!messagesLoading) {
loadMoreMessages();
}
}}
> >
{#if message.role === 'user'} <div class="w-full flex justify-center py-1 text-xs animate-pulse items-center gap-2">
<UserMessage <Spinner className=" size-4" />
on:delete={() => deleteMessageHandler(message.id)} <div class=" ">Loading...</div>
{user} </div>
{readOnly} </Loader>
{message} {/if}
isFirstMessage={messageIdx === 0}
siblings={message.parentId !== null
? (history.messages[message.parentId]?.childrenIds ?? [])
: (Object.values(history.messages)
.filter((message) => message.parentId === null)
.map((message) => message.id) ?? [])}
{confirmEditMessage}
{showPreviousMessage}
{showNextMessage}
copyToClipboard={copyToClipboardWithToast}
/>
{:else if (history.messages[message.parentId]?.models?.length ?? 1) === 1}
{#key message.id}
<ResponseMessage
{message}
siblings={history.messages[message.parentId]?.childrenIds ?? []}
isLastMessage={messageIdx + 1 === messages.length}
{readOnly}
{updateChatMessages}
{confirmEditResponseMessage}
{saveNewResponseMessage}
{showPreviousMessage}
{showNextMessage}
{rateMessage}
copyToClipboard={copyToClipboardWithToast}
{continueGeneration}
{regenerateResponse}
on:action={async (e) => {
console.log('action', e);
if (typeof e.detail === 'string') {
await chatActionHandler(chatId, e.detail, message.model, message.id);
} else {
const { id, event } = e.detail;
await chatActionHandler(chatId, id, message.model, message.id, event);
}
}}
on:save={async (e) => {
console.log('save', e);
const message = e.detail;
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
}}
/>
{/key}
{:else}
{#key message.parentId}
<MultiResponseMessages
bind:history
isLastMessage={messageIdx + 1 === messages.length}
{messages}
{readOnly}
{chatId}
parentMessage={history.messages[message.parentId]}
{messageIdx}
{updateChatMessages}
{confirmEditResponseMessage}
{rateMessage}
copyToClipboard={copyToClipboardWithToast}
{continueGeneration}
{mergeResponses}
{regenerateResponse}
on:action={async (e) => {
console.log('action', e);
if (typeof e.detail === 'string') {
await chatActionHandler(chatId, e.detail, message.model, message.id);
} else {
const { id, event } = e.detail;
await chatActionHandler(chatId, id, message.model, message.id, event);
}
}}
on:change={async () => {
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
if (autoScroll) {
const element = document.getElementById('messages-container');
autoScroll =
element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
setTimeout(() => {
scrollToBottom();
}, 100);
}
}}
/>
{/key}
{/if}
</div>
</div>
{/each}
{#each messages as message, messageIdx (message.id)}
<Message
{chatId}
bind:history
messageId={message.id}
idx={messageIdx}
{user}
{showPreviousMessage}
{showNextMessage}
{editMessage}
{deleteMessage}
{rateMessage}
{regenerateResponse}
{continueResponse}
{mergeResponses}
{updateChatHistory}
{chatActionHandler}
{readOnly}
on:scroll={() => {
if (autoScroll) {
const element = document.getElementById('messages-container');
autoScroll =
element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
setTimeout(() => {
scrollToBottom();
}, 100);
}
}}
/>
{/each}
</div>
<div class="pb-12" />
{#if bottomPadding} {#if bottomPadding}
<div class=" pb-6" /> <div class=" pb-6" />
{/if} {/if}
@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import { getContext, onMount, tick } from 'svelte'; import { getContext, onMount, tick } from 'svelte';
import Modal from '$lib/components/common/Modal.svelte'; import Modal from '$lib/components/common/Modal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let show = false; export let show = false;
@@ -55,19 +56,28 @@
</div> </div>
{#if document.source?.name} {#if document.source?.name}
<div class="text-sm dark:text-gray-400"> <Tooltip
<a content={$i18n.t('Open file')}
href={document?.metadata?.file_id placement="left"
? `/api/v1/files/${document?.metadata?.file_id}/content` tippyOptions={{ duration: [500, 0], animation: 'perspective' }}
: document.source.name.includes('http') >
? document.source.name <div class="text-sm dark:text-gray-400">
: `#`} <a
target="_blank" class="hover:text-gray-500 hover:dark:text-gray-100 underline"
> href={document?.metadata?.file_id
{document?.metadata?.name ?? document.source.name} ? `/api/v1/files/${document?.metadata?.file_id}/content${document?.metadata?.page !== undefined ? `#page=${document.metadata.page + 1}` : ''}`
</a> : document.source.name.includes('http')
{document?.metadata?.page ? `(page ${document.metadata.page + 1})` : ''} ? document.source.name
</div> : `#`}
target="_blank"
>
{document?.metadata?.name ?? document.source.name}
</a>
{document?.metadata?.page
? `(${$i18n.t('page')} ${document.metadata.page + 1})`
: ''}
</div>
</Tooltip>
{:else} {:else}
<div class="text-sm dark:text-gray-400"> <div class="text-sm dark:text-gray-400">
{$i18n.t('No source available')} {$i18n.t('No source available')}
@@ -20,6 +20,8 @@
export let lang = ''; export let lang = '';
export let code = ''; export let code = '';
let _token = null;
let mermaidHtml = null; let mermaidHtml = null;
let highlightedCode = null; let highlightedCode = null;
@@ -226,7 +228,7 @@ __builtins__.input = input`);
} }
}; };
$: if (token.raw) { const render = async () => {
if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) { if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {
(async () => { (async () => {
await drawMermaidDiagram(); await drawMermaidDiagram();
@@ -242,9 +244,21 @@ __builtins__.input = input`);
// Set a new timeout to debounce the code highlighting // Set a new timeout to debounce the code highlighting
debounceTimeout = setTimeout(highlightCode, 10); debounceTimeout = setTimeout(highlightCode, 10);
} }
};
$: if (token) {
if (JSON.stringify(token) !== JSON.stringify(_token)) {
console.log('hi');
_token = token;
}
}
$: if (_token) {
render();
} }
onMount(async () => { onMount(async () => {
console.log('codeblock', lang, code);
if (document.documentElement.classList.contains('dark')) { if (document.documentElement.classList.contains('dark')) {
mermaid.initialize({ mermaid.initialize({
startOnLoad: true, startOnLoad: true,
@@ -19,7 +19,7 @@
</script> </script>
<!-- {JSON.stringify(tokens)} --> <!-- {JSON.stringify(tokens)} -->
{#each tokens as token, tokenIdx} {#each tokens as token, tokenIdx (tokenIdx)}
{#if token.type === 'hr'} {#if token.type === 'hr'}
<hr /> <hr />
{:else if token.type === 'heading'} {:else if token.type === 'heading'}
@@ -0,0 +1,166 @@
<script lang="ts">
import { toast } from 'svelte-sonner';
import { tick, getContext, onMount, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
const i18n = getContext('i18n');
import { settings } from '$lib/stores';
import { copyToClipboard } from '$lib/utils';
import MultiResponseMessages from './MultiResponseMessages.svelte';
import ResponseMessage from './ResponseMessage.svelte';
import UserMessage from './UserMessage.svelte';
import { updateChatById } from '$lib/apis/chats';
export let chatId;
export let idx = 0;
export let history;
export let messageId;
export let user;
export let updateChatHistory;
export let chatActionHandler;
export let showPreviousMessage;
export let showNextMessage;
export let editMessage;
export let deleteMessage;
export let rateMessage;
export let regenerateResponse;
export let continueResponse;
// MultiResponseMessages
export let mergeResponses;
export let autoScroll = false;
export let readOnly = false;
onMount(() => {
// console.log('message', idx);
});
</script>
<div
class="flex flex-col justify-between px-5 mb-3 w-full {($settings?.widescreenMode ?? null)
? 'max-w-full'
: 'max-w-5xl'} mx-auto rounded-lg group"
>
{#if history.messages[messageId]}
{#if history.messages[messageId].role === 'user'}
<UserMessage
{user}
{history}
{messageId}
isFirstMessage={idx === 0}
siblings={history.messages[messageId].parentId !== null
? (history.messages[history.messages[messageId].parentId]?.childrenIds ?? [])
: (Object.values(history.messages)
.filter((message) => message.parentId === null)
.map((message) => message.id) ?? [])}
{showPreviousMessage}
{showNextMessage}
{editMessage}
on:delete={() => deleteMessage(messageId)}
{readOnly}
/>
{:else if (history.messages[history.messages[messageId].parentId]?.models?.length ?? 1) === 1}
<ResponseMessage
{history}
{messageId}
isLastMessage={messageId === history.currentId}
siblings={history.messages[history.messages[messageId].parentId]?.childrenIds ?? []}
{showPreviousMessage}
{showNextMessage}
{editMessage}
{rateMessage}
{continueResponse}
{regenerateResponse}
on:action={async (e) => {
console.log('action', e);
const message = history.messages[messageId];
if (typeof e.detail === 'string') {
await chatActionHandler(chatId, e.detail, message.model, message.id);
} else {
const { id, event } = e.detail;
await chatActionHandler(chatId, id, message.model, message.id, event);
}
}}
on:update={async (e) => {
console.log('update', e);
updateChatHistory();
}}
on:save={async (e) => {
console.log('save', e);
const message = e.detail;
if (message) {
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
history: history
});
} else {
await updateChatById(localStorage.token, chatId, {
history: history
});
}
}}
{readOnly}
/>
{:else}
<MultiResponseMessages
bind:history
{chatId}
{messageId}
isLastMessage={messageId === history?.currentId}
{rateMessage}
{editMessage}
{continueResponse}
{regenerateResponse}
{mergeResponses}
on:action={async (e) => {
console.log('action', e);
const message = history.messages[messageId];
if (typeof e.detail === 'string') {
await chatActionHandler(chatId, e.detail, message.model, message.id);
} else {
const { id, event } = e.detail;
await chatActionHandler(chatId, id, message.model, message.id, event);
}
}}
on:update={async (e) => {
console.log('update', e);
updateChatHistory();
}}
on:save={async (e) => {
console.log('save', e);
const message = e.detail;
if (message) {
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
history: history
});
} else {
await updateChatById(localStorage.token, chatId, {
history: history
});
}
}}
on:change={async () => {
await tick();
await updateChatById(localStorage.token, chatId, {
history: history
});
dispatch('scroll');
}}
{readOnly}
/>
{/if}
{/if}
</div>
@@ -20,40 +20,39 @@
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let chatId; export let chatId;
export let history; export let history;
export let messages = []; export let messageId;
export let messageIdx;
export let parentMessage;
export let isLastMessage; export let isLastMessage;
export let readOnly = false; export let readOnly = false;
export let updateChatMessages: Function; export let editMessage: Function;
export let confirmEditResponseMessage: Function;
export let rateMessage: Function; export let rateMessage: Function;
export let copyToClipboard: Function; export let continueResponse: Function;
export let continueGeneration: Function;
export let mergeResponses: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let mergeResponses: Function;
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
let currentMessageId; let currentMessageId;
let groupedMessages = {}; let parentMessage;
let groupedMessagesIdx = {}; let groupedMessageIds = {};
let groupedMessageIdsIdx = {};
$: if (parentMessage) { let message = JSON.parse(JSON.stringify(history.messages[messageId]));
initHandler(); $: if (history.messages) {
if (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {
message = JSON.parse(JSON.stringify(history.messages[messageId]));
}
} }
const showPreviousMessage = (modelIdx) => { const showPreviousMessage = (modelIdx) => {
groupedMessagesIdx[modelIdx] = Math.max(0, groupedMessagesIdx[modelIdx] - 1); groupedMessageIdsIdx[modelIdx] = Math.max(0, groupedMessageIdsIdx[modelIdx] - 1);
let messageId = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]].id;
let messageId = groupedMessageIds[modelIdx].messageIds[groupedMessageIdsIdx[modelIdx]];
console.log(messageId); console.log(messageId);
let messageChildrenIds = history.messages[messageId].childrenIds; let messageChildrenIds = history.messages[messageId].childrenIds;
while (messageChildrenIds.length !== 0) { while (messageChildrenIds.length !== 0) {
@@ -66,12 +65,12 @@
}; };
const showNextMessage = (modelIdx) => { const showNextMessage = (modelIdx) => {
groupedMessagesIdx[modelIdx] = Math.min( groupedMessageIdsIdx[modelIdx] = Math.min(
groupedMessages[modelIdx].messages.length - 1, groupedMessageIds[modelIdx].messageIds.length - 1,
groupedMessagesIdx[modelIdx] + 1 groupedMessageIdsIdx[modelIdx] + 1
); );
let messageId = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]].id; let messageId = groupedMessageIds[modelIdx].messageIds[groupedMessageIdsIdx[modelIdx]];
console.log(messageId); console.log(messageId);
let messageChildrenIds = history.messages[messageId].childrenIds; let messageChildrenIds = history.messages[messageId].childrenIds;
@@ -86,33 +85,43 @@
}; };
const initHandler = async () => { const initHandler = async () => {
console.log('multiresponse:initHandler');
await tick(); await tick();
currentMessageId = messages[messageIdx].id;
groupedMessages = parentMessage?.models.reduce((a, model, modelIdx) => { currentMessageId = messageId;
parentMessage = history.messages[messageId].parentId
? history.messages[history.messages[messageId].parentId]
: null;
groupedMessageIds = parentMessage?.models.reduce((a, model, modelIdx) => {
// Find all messages that are children of the parent message and have the same model // Find all messages that are children of the parent message and have the same model
let modelMessages = parentMessage?.childrenIds let modelMessageIds = parentMessage?.childrenIds
.map((id) => history.messages[id]) .map((id) => history.messages[id])
.filter((m) => m?.modelIdx === modelIdx); .filter((m) => m?.modelIdx === modelIdx)
.map((m) => m.id);
if (modelMessages.length === 0) { // Legacy support for messages that don't have a modelIdx
modelMessages = parentMessage?.childrenIds // Find all messages that are children of the parent message and have the same model
if (modelMessageIds.length === 0) {
let modelMessages = parentMessage?.childrenIds
.map((id) => history.messages[id]) .map((id) => history.messages[id])
.filter((m) => m?.model === model); .filter((m) => m?.model === model);
modelMessages.forEach((m) => { modelMessages.forEach((m) => {
m.modelIdx = modelIdx; m.modelIdx = modelIdx;
}); });
modelMessageIds = modelMessages.map((m) => m.id);
} }
return { return {
...a, ...a,
[modelIdx]: { messages: modelMessages } [modelIdx]: { messageIds: modelMessageIds }
}; };
}, {}); }, {});
groupedMessagesIdx = parentMessage?.models.reduce((a, model, modelIdx) => { groupedMessageIdsIdx = parentMessage?.models.reduce((a, model, modelIdx) => {
const idx = groupedMessages[modelIdx].messages.findIndex((m) => m.id === currentMessageId); const idx = groupedMessageIds[modelIdx].messageIds.findIndex((id) => id === messageId);
if (idx !== -1) { if (idx !== -1) {
return { return {
...a, ...a,
@@ -121,39 +130,53 @@
} else { } else {
return { return {
...a, ...a,
[modelIdx]: 0 [modelIdx]: groupedMessageIds[modelIdx].messageIds.length - 1
}; };
} }
}, {}); }, {});
console.log(groupedMessageIds, groupedMessageIdsIdx);
await tick();
}; };
const mergeResponsesHandler = async () => { const mergeResponsesHandler = async () => {
const responses = Object.keys(groupedMessages).map((modelIdx) => { const responses = Object.keys(groupedMessageIds).map((modelIdx) => {
const { messages } = groupedMessages[modelIdx]; const { messageIds } = groupedMessageIds[modelIdx];
return messages[groupedMessagesIdx[modelIdx]].content; const messageId = messageIds[groupedMessageIdsIdx[modelIdx]];
return history.messages[messageId].content;
}); });
mergeResponses(currentMessageId, responses, chatId); mergeResponses(messageId, responses, chatId);
}; };
onMount(async () => { onMount(async () => {
initHandler(); await initHandler();
await tick();
const messageElement = document.getElementById(`message-${messageId}`);
console.log(messageElement);
if (messageElement) {
messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
}); });
</script> </script>
<div> {#if parentMessage}
<div <div>
class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden" <div
id="responses-container-{chatId}-{parentMessage.id}" class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
> id="responses-container-{chatId}-{parentMessage.id}"
{#key currentMessageId} >
{#each Object.keys(groupedMessages) as modelIdx} {#each Object.keys(groupedMessageIds) as modelIdx}
{#if groupedMessagesIdx[modelIdx] !== undefined && groupedMessages[modelIdx].messages.length > 0} {#if groupedMessageIdsIdx[modelIdx] !== undefined && groupedMessageIds[modelIdx].messageIds.length > 0}
<!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y-click-events-have-key-events -->
{@const message = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]]} {@const _messageId =
groupedMessageIds[modelIdx].messageIds[groupedMessageIdsIdx[modelIdx]]}
<div <div
class=" snap-center w-full max-w-full m-1 border {history.messages[currentMessageId] class=" snap-center w-full max-w-full m-1 border {history.messages[messageId]
?.modelIdx == modelIdx ?.modelIdx == modelIdx
? `border-gray-100 dark:border-gray-800 border-[1.5px] ${ ? `border-gray-100 dark:border-gray-800 border-[1.5px] ${
$mobile ? 'min-w-full' : 'min-w-[32rem]' $mobile ? 'min-w-full' : 'min-w-[32rem]'
@@ -162,17 +185,13 @@
$mobile ? 'min-w-full' : 'min-w-80' $mobile ? 'min-w-full' : 'min-w-80'
}`} transition-all p-5 rounded-2xl" }`} transition-all p-5 rounded-2xl"
on:click={() => { on:click={() => {
if (currentMessageId != message.id) { if (messageId != _messageId) {
currentMessageId = message.id; let messageChildrenIds = history.messages[_messageId].childrenIds;
let messageId = message.id;
console.log(messageId);
//
let messageChildrenIds = history.messages[messageId].childrenIds;
while (messageChildrenIds.length !== 0) { while (messageChildrenIds.length !== 0) {
messageId = messageChildrenIds.at(-1); messageId = messageChildrenIds.at(-1);
messageChildrenIds = history.messages[messageId].childrenIds; messageChildrenIds = history.messages[_messageId].childrenIds;
} }
history.currentId = messageId; history.currentId = _messageId;
dispatch('change'); dispatch('change');
} }
}} }}
@@ -180,95 +199,92 @@
{#key history.currentId} {#key history.currentId}
{#if message} {#if message}
<ResponseMessage <ResponseMessage
{message} {history}
siblings={groupedMessages[modelIdx].messages.map((m) => m.id)} messageId={_messageId}
isLastMessage={true} isLastMessage={true}
{updateChatMessages} siblings={groupedMessageIds[modelIdx].messageIds}
{confirmEditResponseMessage}
showPreviousMessage={() => showPreviousMessage(modelIdx)} showPreviousMessage={() => showPreviousMessage(modelIdx)}
showNextMessage={() => showNextMessage(modelIdx)} showNextMessage={() => showNextMessage(modelIdx)}
{readOnly}
{rateMessage} {rateMessage}
{copyToClipboard} {editMessage}
{continueGeneration} {continueResponse}
regenerateResponse={async (message) => { regenerateResponse={async (message) => {
regenerateResponse(message); regenerateResponse(message);
await tick(); await tick();
groupedMessagesIdx[modelIdx] = groupedMessages[modelIdx].messages.length - 1; groupedMessageIdsIdx[modelIdx] =
groupedMessageIds[modelIdx].messageIds.length - 1;
}} }}
on:action={async (e) => { on:action={async (e) => {
dispatch('action', e.detail); dispatch('action', e.detail);
}} }}
on:save={async (e) => { on:update={async (e) => {
console.log('save', e); dispatch('update', e.detail);
const message = e.detail;
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
}} }}
on:save={async (e) => {
dispatch('save', e.detail);
}}
{readOnly}
/> />
{/if} {/if}
{/key} {/key}
</div> </div>
{/if} {/if}
{/each} {/each}
{/key} </div>
</div>
{#if !readOnly && isLastMessage} {#if !readOnly && isLastMessage}
{#if !Object.keys(groupedMessages).find((modelIdx) => { {#if !Object.keys(groupedMessageIds).find((modelIdx) => {
const { messages } = groupedMessages[modelIdx]; const { messageIds } = groupedMessageIds[modelIdx];
return !messages[groupedMessagesIdx[modelIdx]]?.done ?? false; const _messageId = messageIds[groupedMessageIdsIdx[modelIdx]];
})} return !history.messages[_messageId]?.done ?? false;
<div class="flex justify-end"> })}
<div class="w-full"> <div class="flex justify-end">
{#if history.messages[currentMessageId]?.merged?.status} <div class="w-full">
{@const message = history.messages[currentMessageId]?.merged} {#if history.messages[messageId]?.merged?.status}
{@const message = history.messages[messageId]?.merged}
<div class="w-full rounded-xl pl-5 pr-2 py-2"> <div class="w-full rounded-xl pl-5 pr-2 py-2">
<Name> <Name>
Merged Response Merged Response
{#if message.timestamp} {#if message.timestamp}
<span <span
class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5" class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5"
> >
{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))} {dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}
</span> </span>
{/if} {/if}
</Name> </Name>
<div class="mt-1 markdown-prose w-full min-w-full"> <div class="mt-1 markdown-prose w-full min-w-full">
{#if (message?.content ?? '') === ''} {#if (message?.content ?? '') === ''}
<Skeleton /> <Skeleton />
{:else} {:else}
<Markdown id={`merged`} content={message.content ?? ''} /> <Markdown id={`merged`} content={message.content ?? ''} />
{/if} {/if}
</div>
</div> </div>
</div> {/if}
{/if} </div>
</div>
<div class=" flex-shrink-0 text-gray-600 dark:text-gray-500 mt-1"> <div class=" flex-shrink-0 text-gray-600 dark:text-gray-500 mt-1">
<Tooltip content={$i18n.t('Merge Responses')} placement="bottom"> <Tooltip content={$i18n.t('Merge Responses')} placement="bottom">
<button <button
type="button" type="button"
id="merge-response-button" id="merge-response-button"
class="{true class="{true
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" : 'invisible group-hover:visible'} p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
on:click={() => { on:click={() => {
mergeResponsesHandler(); mergeResponsesHandler();
}} }}
> >
<Merge className=" size-5 " /> <Merge className=" size-5 " />
</button> </button>
</Tooltip> </Tooltip>
</div>
</div> </div>
</div> {/if}
{/if} {/if}
{/if} </div>
</div> {/if}
@@ -7,9 +7,8 @@
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
export let messageId = null;
export let show = false;
export let message; export let message;
export let show = false;
let LIKE_REASONS = []; let LIKE_REASONS = [];
let DISLIKE_REASONS = []; let DISLIKE_REASONS = [];
@@ -54,8 +53,10 @@
const submitHandler = () => { const submitHandler = () => {
console.log('submitHandler'); console.log('submitHandler');
message.annotation.reason = selectedReason; if (!selectedReason) {
message.annotation.comment = comment; toast.error($i18n.t('Please select a reason'));
return;
}
dispatch('submit', { dispatch('submit', {
reason: selectedReason, reason: selectedReason,
@@ -69,7 +70,7 @@
<div <div
class=" my-2.5 rounded-xl px-4 py-3 border dark:border-gray-850" class=" my-2.5 rounded-xl px-4 py-3 border dark:border-gray-850"
id="message-feedback-{messageId}" id="message-feedback-{message.id}"
> >
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<div class=" text-sm">{$i18n.t('Tell us more:')}</div> <div class=" text-sm">{$i18n.t('Tell us more:')}</div>
@@ -13,6 +13,7 @@
import { synthesizeOpenAISpeech } from '$lib/apis/audio'; import { synthesizeOpenAISpeech } from '$lib/apis/audio';
import { imageGenerations } from '$lib/apis/images'; import { imageGenerations } from '$lib/apis/images';
import { import {
copyToClipboard as _copyToClipboard,
approximateToHumanReadable, approximateToHumanReadable,
extractParagraphsForAudio, extractParagraphsForAudio,
extractSentencesForAudio, extractSentencesForAudio,
@@ -76,25 +77,30 @@
annotation?: { type: string; rating: number }; annotation?: { type: string; rating: number };
} }
export let message: MessageType; export let history;
export let messageId;
let message: MessageType = JSON.parse(JSON.stringify(history.messages[messageId]));
$: if (history.messages) {
if (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {
message = JSON.parse(JSON.stringify(history.messages[messageId]));
}
}
export let siblings; export let siblings;
export let isLastMessage = true;
export let readOnly = false;
export let updateChatMessages: Function;
export let confirmEditResponseMessage: Function;
export let saveNewResponseMessage: Function = () => {};
export let showPreviousMessage: Function; export let showPreviousMessage: Function;
export let showNextMessage: Function; export let showNextMessage: Function;
export let editMessage: Function;
export let rateMessage: Function; export let rateMessage: Function;
export let copyToClipboard: Function; export let continueResponse: Function;
export let continueGeneration: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let isLastMessage = true;
export let readOnly = false;
let model = null; let model = null;
$: model = $models.find((m) => m.id === message.model); $: model = $models.find((m) => m.id === message.model);
@@ -111,6 +117,13 @@
let showRateComment = false; let showRateComment = false;
const copyToClipboard = async (text) => {
const res = await _copyToClipboard(text);
if (res) {
toast.success($i18n.t('Copying to clipboard was successful!'));
}
};
const playAudio = (idx: number) => { const playAudio = (idx: number) => {
return new Promise<void>((res) => { return new Promise<void>((res) => {
speakingIdx = idx; speakingIdx = idx;
@@ -204,7 +217,7 @@
const blob = await res.blob(); const blob = await res.blob();
const blobUrl = URL.createObjectURL(blob); const blobUrl = URL.createObjectURL(blob);
const audio = new Audio(blobUrl); const audio = new Audio(blobUrl);
audio.playbackRate = $settings.audio?.tts?.speedRate ?? 1; audio.playbackRate = $settings.audio?.tts?.playbackRate ?? 1;
audioParts[idx] = audio; audioParts[idx] = audio;
loadingSpeech = false; loadingSpeech = false;
@@ -228,7 +241,7 @@
console.log(voice); console.log(voice);
const speak = new SpeechSynthesisUtterance(message.content); const speak = new SpeechSynthesisUtterance(message.content);
speak.rate = $settings.audio?.tts?.speedRate ?? 1; speak.rate = $settings.audio?.tts?.playbackRate ?? 1;
console.log(speak); console.log(speak);
@@ -260,11 +273,7 @@
}; };
const editMessageConfirmHandler = async () => { const editMessageConfirmHandler = async () => {
if (editedContent === '') { editMessage(message.id, editedContent ? editedContent : '', false);
editedContent = ' ';
}
confirmEditResponseMessage(message.id, editedContent);
edit = false; edit = false;
editedContent = ''; editedContent = '';
@@ -272,8 +281,8 @@
await tick(); await tick();
}; };
const saveNewMessageHandler = async () => { const saveAsCopyHandler = async () => {
saveNewResponseMessage(message, editedContent); editMessage(message.id, editedContent ? editedContent : '');
edit = false; edit = false;
editedContent = ''; editedContent = '';
@@ -295,12 +304,12 @@
console.log(res); console.log(res);
if (res) { if (res) {
message.files = res.map((image) => ({ const files = res.map((image) => ({
type: 'image', type: 'image',
url: `${image.url}` url: `${image.url}`
})); }));
dispatch('save', message); dispatch('save', { ...message, files: files });
} }
generatingImage = false; generatingImage = false;
@@ -313,6 +322,8 @@
} }
onMount(async () => { onMount(async () => {
console.log('ResponseMessage mounted');
await tick(); await tick();
}); });
</script> </script>
@@ -424,7 +435,7 @@
id="save-new-message-button" id="save-new-message-button"
class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl" class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl"
on:click={() => { on:click={() => {
saveNewMessageHandler(); saveAsCopyHandler();
}} }}
> >
{$i18n.t('Save As Copy')} {$i18n.t('Save As Copy')}
@@ -909,7 +920,7 @@
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
on:click={() => { on:click={() => {
continueGeneration(); continueResponse();
(model?.actions ?? []) (model?.actions ?? [])
.filter((action) => action?.__webui__ ?? false) .filter((action) => action?.__webui__ ?? false)
@@ -1024,12 +1035,17 @@
{#if message.done && showRateComment} {#if message.done && showRateComment}
<RateComment <RateComment
messageId={message.id}
bind:show={showRateComment}
bind:message bind:message
bind:show={showRateComment}
on:submit={(e) => { on:submit={(e) => {
updateChatMessages(); dispatch('save', {
...message,
annotation: {
...message.annotation,
comment: e.detail.comment,
reason: e.detail.reason
}
});
(model?.actions ?? []) (model?.actions ?? [])
.filter((action) => action?.__webui__ ?? false) .filter((action) => action?.__webui__ ?? false)
.forEach((action) => { .forEach((action) => {
@@ -1,38 +1,58 @@
<script lang="ts"> <script lang="ts">
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { toast } from 'svelte-sonner';
import { tick, createEventDispatcher, getContext, onMount } from 'svelte';
import { models, settings } from '$lib/stores';
import { user as _user } from '$lib/stores';
import {
copyToClipboard as _copyToClipboard,
processResponseContent,
replaceTokens
} from '$lib/utils';
import { tick, createEventDispatcher, getContext } from 'svelte';
import Name from './Name.svelte'; import Name from './Name.svelte';
import ProfileImage from './ProfileImage.svelte'; import ProfileImage from './ProfileImage.svelte';
import { models, settings } from '$lib/stores';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
import { user as _user } from '$lib/stores';
import { getFileContentById } from '$lib/apis/files';
import FileItem from '$lib/components/common/FileItem.svelte'; import FileItem from '$lib/components/common/FileItem.svelte';
import { marked } from 'marked';
import { processResponseContent, replaceTokens } from '$lib/utils';
import MarkdownTokens from './Markdown/MarkdownTokens.svelte';
import Markdown from './Markdown.svelte'; import Markdown from './Markdown.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
export let user; export let user;
export let message;
export let siblings;
export let isFirstMessage: boolean;
export let readOnly: boolean;
export let confirmEditMessage: Function; export let history;
export let messageId;
export let siblings;
export let showPreviousMessage: Function; export let showPreviousMessage: Function;
export let showNextMessage: Function; export let showNextMessage: Function;
export let copyToClipboard: Function;
export let editMessage: Function;
export let isFirstMessage: boolean;
export let readOnly: boolean;
let edit = false; let edit = false;
let editedContent = ''; let editedContent = '';
let messageEditTextAreaElement: HTMLTextAreaElement; let messageEditTextAreaElement: HTMLTextAreaElement;
let message = JSON.parse(JSON.stringify(history.messages[messageId]));
$: if (history.messages) {
if (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {
message = JSON.parse(JSON.stringify(history.messages[messageId]));
}
}
const copyToClipboard = async (text) => {
const res = await _copyToClipboard(text);
if (res) {
toast.success($i18n.t('Copying to clipboard was successful!'));
}
};
const editMessageHandler = async () => { const editMessageHandler = async () => {
edit = true; edit = true;
editedContent = message.content; editedContent = message.content;
@@ -46,7 +66,7 @@
}; };
const editMessageConfirmHandler = async (submit = true) => { const editMessageConfirmHandler = async (submit = true) => {
confirmEditMessage(message.id, editedContent, submit); editMessage(message.id, editedContent, submit);
edit = false; edit = false;
editedContent = ''; editedContent = '';
@@ -60,6 +80,10 @@
const deleteMessageHandler = async () => { const deleteMessageHandler = async () => {
dispatch('delete', message.id); dispatch('delete', message.id);
}; };
onMount(() => {
console.log('UserMessage mounted');
});
</script> </script>
<div class=" flex w-full user-message" dir={$settings.chatDirection} id="message-{message.id}"> <div class=" flex w-full user-message" dir={$settings.chatDirection} id="message-{message.id}">
+25 -5
View File
@@ -4,17 +4,19 @@
import ProfileImageBase from '../Messages/ProfileImageBase.svelte'; import ProfileImageBase from '../Messages/ProfileImageBase.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
import Heart from '$lib/components/icons/Heart.svelte';
type $$Props = NodeProps; type $$Props = NodeProps;
export let data: $$Props['data']; export let data: $$Props['data'];
</script> </script>
<div <div
class="px-4 py-3 shadow-md rounded-xl dark:bg-black bg-white border dark:border-gray-900 w-60 h-20" class="px-4 py-3 shadow-md rounded-xl dark:bg-black bg-white border dark:border-gray-900 w-60 h-20 group"
> >
<Tooltip <Tooltip
content={data?.message?.error ? data.message.error.content : data.message.content} content={data?.message?.error ? data.message.error.content : data.message.content}
class="w-full" class="w-full"
allowHTML={false}
> >
{#if data.message.role === 'user'} {#if data.message.role === 'user'}
<div class="flex w-full"> <div class="flex w-full">
@@ -23,8 +25,10 @@
className={'size-5 -translate-y-[1px]'} className={'size-5 -translate-y-[1px]'}
/> />
<div class="ml-2"> <div class="ml-2">
<div class="text-xs text-black dark:text-white font-medium"> <div class=" flex justify-between items-center">
{data?.user?.name ?? 'User'} <div class="text-xs text-black dark:text-white font-medium line-clamp-1">
{data?.user?.name ?? 'User'}
</div>
</div> </div>
{#if data?.message?.error} {#if data?.message?.error}
@@ -42,8 +46,24 @@
/> />
<div class="ml-2"> <div class="ml-2">
<div class="text-xs text-black dark:text-white font-medium"> <div class=" flex justify-between items-center">
{data?.model?.name ?? data?.message?.model ?? 'Assistant'} <div class="text-xs text-black dark:text-white font-medium line-clamp-1">
{data?.model?.name ?? data?.message?.model ?? 'Assistant'}
</div>
<button
class={data?.message?.favorite ? '' : 'invisible group-hover:visible'}
on:click={() => {
data.message.favorite = !(data?.message?.favorite ?? false);
}}
>
<Heart
className="size-3 {data?.message?.favorite
? 'fill-red-500 stroke-red-500'
: 'hover:fill-red-500 hover:stroke-red-500'} "
strokeWidth="2.5"
/>
</button>
</div> </div>
{#if data?.message?.error} {#if data?.message?.error}
@@ -10,6 +10,7 @@
export let params = { export let params = {
// Advanced // Advanced
stream_response: null, // Set stream responses for this model individually
seed: null, seed: null,
stop: null, stop: null,
temperature: null, temperature: null,
@@ -42,6 +43,35 @@
</script> </script>
<div class=" space-y-1 text-xs pb-safe-bottom"> <div class=" space-y-1 text-xs pb-safe-bottom">
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">
{$i18n.t('Stream Chat Response')}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
params.stream_response =
(params?.stream_response ?? null) === null
? true
: params.stream_response
? false
: null;
}}
type="button"
>
{#if params.stream_response === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else if params.stream_response === false}
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{/if}
</button>
</div>
</div>
<div class=" py-0.5 w-full justify-between"> <div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between"> <div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Seed')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Seed')}</div>
@@ -734,7 +764,7 @@
id="steps-range" id="steps-range"
type="range" type="range"
min="-2" min="-2"
max="16000" max="131072"
step="1" step="1"
bind:value={params.max_tokens} bind:value={params.max_tokens}
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700" class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
@@ -746,7 +776,6 @@
type="number" type="number"
class=" bg-transparent text-center w-14" class=" bg-transparent text-center w-14"
min="-2" min="-2"
max="16000"
step="1" step="1"
/> />
</div> </div>
@@ -24,7 +24,7 @@
let voice = ''; let voice = '';
// Audio speed control // Audio speed control
let speechRate = 1; let playbackRate = 1;
const speedOptions = [2, 1.75, 1.5, 1.25, 1, 0.75, 0.5]; const speedOptions = [2, 1.75, 1.5, 1.25, 1, 0.75, 0.5];
const getVoices = async () => { const getVoices = async () => {
@@ -60,7 +60,7 @@
}; };
onMount(async () => { onMount(async () => {
speechRate = $settings.audio?.tts?.speedRate ?? 1; playbackRate = $settings.audio?.tts?.playbackRate ?? 1;
conversationMode = $settings.conversationMode ?? false; conversationMode = $settings.conversationMode ?? false;
speechAutoSend = $settings.speechAutoSend ?? false; speechAutoSend = $settings.speechAutoSend ?? false;
responseAutoPlayback = $settings.responseAutoPlayback ?? false; responseAutoPlayback = $settings.responseAutoPlayback ?? false;
@@ -88,7 +88,7 @@
engine: STTEngine !== '' ? STTEngine : undefined engine: STTEngine !== '' ? STTEngine : undefined
}, },
tts: { tts: {
speedRate: speechRate, playbackRate: playbackRate,
voice: voice !== '' ? voice : undefined, voice: voice !== '' ? voice : undefined,
defaultVoice: $config?.audio?.tts?.voice ?? '', defaultVoice: $config?.audio?.tts?.voice ?? '',
nonLocalVoices: $config.audio.tts.engine === '' ? nonLocalVoices : undefined nonLocalVoices: $config.audio.tts.engine === '' ? nonLocalVoices : undefined
@@ -161,15 +161,15 @@
</div> </div>
<div class=" py-0.5 flex w-full justify-between"> <div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Speed Rate')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Speech Playback Speed')}</div>
<div class="flex items-center relative"> <div class="flex items-center relative">
<select <select
class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right" class="dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
bind:value={speechRate} bind:value={playbackRate}
> >
{#each speedOptions as option} {#each speedOptions as option}
<option value={option} selected={speechRate === option}>{option}x</option> <option value={option} selected={playbackRate === option}>{option}x</option>
{/each} {/each}
</select> </select>
</div> </div>
@@ -45,6 +45,7 @@
let params = { let params = {
// Advanced // Advanced
stream_response: null,
seed: null, seed: null,
temperature: null, temperature: null,
frequency_penalty: null, frequency_penalty: null,
@@ -327,6 +328,7 @@
saveSettings({ saveSettings({
system: system !== '' ? system : undefined, system: system !== '' ? system : undefined,
params: { params: {
stream_response: params.stream_response !== null ? params.stream_response : undefined,
seed: (params.seed !== null ? params.seed : undefined) ?? undefined, seed: (params.seed !== null ? params.seed : undefined) ?? undefined,
stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined, stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
temperature: params.temperature !== null ? params.temperature : undefined, temperature: params.temperature !== null ? params.temperature : undefined,
@@ -36,18 +36,11 @@
let voiceInterruption = false; let voiceInterruption = false;
let hapticFeedback = false; let hapticFeedback = false;
let streamResponse = true;
const toggleSplitLargeChunks = async () => { const toggleSplitLargeChunks = async () => {
splitLargeChunks = !splitLargeChunks; splitLargeChunks = !splitLargeChunks;
saveSettings({ splitLargeChunks: splitLargeChunks }); saveSettings({ splitLargeChunks: splitLargeChunks });
}; };
const toggleStreamResponse = async () => {
streamResponse = !streamResponse;
saveSettings({ streamResponse: streamResponse });
};
const togglesScrollOnBranchChange = async () => { const togglesScrollOnBranchChange = async () => {
scrollOnBranchChange = !scrollOnBranchChange; scrollOnBranchChange = !scrollOnBranchChange;
saveSettings({ scrollOnBranchChange: scrollOnBranchChange }); saveSettings({ scrollOnBranchChange: scrollOnBranchChange });
@@ -165,7 +158,6 @@
userLocation = $settings.userLocation ?? false; userLocation = $settings.userLocation ?? false;
hapticFeedback = $settings.hapticFeedback ?? false; hapticFeedback = $settings.hapticFeedback ?? false;
streamResponse = $settings?.streamResponse ?? true;
defaultModelId = $settings?.models?.at(0) ?? ''; defaultModelId = $settings?.models?.at(0) ?? '';
if ($config?.default_models) { if ($config?.default_models) {
@@ -319,28 +311,6 @@
</div> </div>
</div> </div>
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs">
{$i18n.t('Stream Chat Response')}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
toggleStreamResponse();
}}
type="button"
>
{#if streamResponse === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
{/if}
</button>
</div>
</div>
<div> <div>
<div class=" py-0.5 flex w-full justify-between"> <div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs"> <div class=" self-center text-xs">
+19 -3
View File
@@ -1,16 +1,24 @@
<script lang="ts"> <script lang="ts">
import { createEventDispatcher, onMount } from 'svelte'; import { createEventDispatcher, onDestroy, onMount } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
let loaderElement: HTMLElement; let loaderElement: HTMLElement;
let observer;
let intervalId;
onMount(() => { onMount(() => {
const observer = new IntersectionObserver( observer = new IntersectionObserver(
(entries, observer) => { (entries, observer) => {
entries.forEach((entry) => { entries.forEach((entry) => {
if (entry.isIntersecting) { if (entry.isIntersecting) {
dispatch('visible'); intervalId = setInterval(() => {
dispatch('visible');
}, 100);
// dispatch('visible');
// observer.unobserve(loaderElement); // Stop observing until content is loaded // observer.unobserve(loaderElement); // Stop observing until content is loaded
} else {
clearInterval(intervalId);
} }
}); });
}, },
@@ -23,6 +31,14 @@
observer.observe(loaderElement); observer.observe(loaderElement);
}); });
onDestroy(() => {
observer.disconnect();
if (intervalId) {
clearInterval(intervalId);
}
});
</script> </script>
<div bind:this={loaderElement}> <div bind:this={loaderElement}>
+10 -5
View File
@@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import DOMPurify from 'dompurify';
import { onDestroy } from 'svelte'; import { onDestroy } from 'svelte';
import { marked } from 'marked'; import { marked } from 'marked';
@@ -10,22 +12,25 @@
export let touch = true; export let touch = true;
export let className = 'flex'; export let className = 'flex';
export let theme = ''; export let theme = '';
export let allowHTML = true;
export let tippyOptions = {};
let tooltipElement; let tooltipElement;
let tooltipInstance; let tooltipInstance;
$: if (tooltipElement && content) { $: if (tooltipElement && content) {
if (tooltipInstance) { if (tooltipInstance) {
tooltipInstance.setContent(content); tooltipInstance.setContent(DOMPurify.sanitize(content));
} else { } else {
tooltipInstance = tippy(tooltipElement, { tooltipInstance = tippy(tooltipElement, {
content: content, content: DOMPurify.sanitize(content),
placement: placement, placement: placement,
allowHTML: true, allowHTML: allowHTML,
touch: touch, touch: touch,
...(theme !== '' ? { theme } : { theme: 'dark' }), ...(theme !== '' ? { theme } : { theme: 'dark' }),
arrow: false, arrow: false,
offset: [0, 4] offset: [0, 4],
...tippyOptions
}); });
} }
} else if (tooltipInstance && content === '') { } else if (tooltipInstance && content === '') {
@@ -41,6 +46,6 @@
}); });
</script> </script>
<div bind:this={tooltipElement} aria-label={content} class={className}> <div bind:this={tooltipElement} aria-label={DOMPurify.sanitize(content)} class={className}>
<slot /> <slot />
</div> </div>
+1 -1
View File
@@ -461,7 +461,7 @@
</div> </div>
{/if} {/if}
{#if $pinnedChats.length > 0} {#if !search && $pinnedChats.length > 0}
<div class="pl-2 py-2 flex flex-col space-y-1"> <div class="pl-2 py-2 flex flex-col space-y-1">
<div class=""> <div class="">
<div class="w-full pl-2.5 text-xs text-gray-500 dark:text-gray-500 font-medium pb-1.5"> <div class="w-full pl-2.5 text-xs text-gray-500 dark:text-gray-500 font-medium pb-1.5">
@@ -14,7 +14,15 @@
getChatListByTagName, getChatListByTagName,
updateChatById updateChatById
} from '$lib/apis/chats'; } from '$lib/apis/chats';
import { chatId, chats, mobile, pinnedChats, showSidebar, currentChatPage } from '$lib/stores'; import {
chatId,
chatTitle as _chatTitle,
chats,
mobile,
pinnedChats,
showSidebar,
currentChatPage
} from '$lib/stores';
import ChatMenu from './ChatMenu.svelte'; import ChatMenu from './ChatMenu.svelte';
import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte'; import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
@@ -33,14 +41,18 @@
let chatTitle = chat.title; let chatTitle = chat.title;
const editChatTitle = async (id, _title) => { const editChatTitle = async (id, title) => {
if (_title === '') { if (title === '') {
toast.error($i18n.t('Title cannot be an empty string.')); toast.error($i18n.t('Title cannot be an empty string.'));
} else { } else {
await updateChatById(localStorage.token, id, { await updateChatById(localStorage.token, id, {
title: _title title: title
}); });
if (id === $chatId) {
_chatTitle.set(title);
}
currentChatPage.set(1); currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage)); await chats.set(await getChatList(localStorage.token, $currentChatPage));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned')); await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
@@ -5,7 +5,7 @@
import { flyAndScale } from '$lib/utils/transitions'; import { flyAndScale } from '$lib/utils/transitions';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte'; import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
import { showSettings, activeUserCount, USAGE_POOL } from '$lib/stores'; import { showSettings, activeUserCount, USAGE_POOL, mobile, showSidebar } from '$lib/stores';
import { fade, slide } from 'svelte/transition'; import { fade, slide } from 'svelte/transition';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
@@ -41,6 +41,10 @@
on:click={async () => { on:click={async () => {
await showSettings.set(true); await showSettings.set(true);
show = false; show = false;
if ($mobile) {
showSidebar.set(false);
}
}} }}
> >
<div class=" self-center mr-3"> <div class=" self-center mr-3">
@@ -72,6 +76,10 @@
on:click={() => { on:click={() => {
dispatch('show', 'archived-chat'); dispatch('show', 'archived-chat');
show = false; show = false;
if ($mobile) {
showSidebar.set(false);
}
}} }}
> >
<div class=" self-center mr-3"> <div class=" self-center mr-3">
@@ -86,6 +94,10 @@
on:click={() => { on:click={() => {
goto('/playground'); goto('/playground');
show = false; show = false;
if ($mobile) {
showSidebar.set(false);
}
}} }}
> >
<div class=" self-center mr-3"> <div class=" self-center mr-3">
@@ -112,6 +124,10 @@
on:click={() => { on:click={() => {
goto('/admin'); goto('/admin');
show = false; show = false;
if ($mobile) {
showSidebar.set(false);
}
}} }}
> >
<div class=" self-center mr-3"> <div class=" self-center mr-3">
@@ -0,0 +1,45 @@
<script lang="ts">
import { getContext, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
const i18n = getContext('i18n');
import { WEBUI_VERSION } from '$lib/constants';
import XMark from '../icons/XMark.svelte';
export let version = {
current: WEBUI_VERSION,
latest: WEBUI_VERSION
};
</script>
<div
class="flex items-start bg-[#F1F8FE] dark:bg-[#020C1D] border border-[3371D5] dark:border-[#03113B] text-[#3371D5] dark:text-[#6795EC] rounded-lg px-3.5 py-3 text-xs max-w-80 pr-2 w-full shadow-lg"
>
<div class="flex-1 font-medium">
{$i18n.t(`A new version (v{{LATEST_VERSION}}) is now available.`, {
LATEST_VERSION: version.latest
})}
<a
href="https://github.com/open-webui/open-webui/releases/tag/v{version.latest}"
target="_blank"
class="underline"
>
{$i18n.t('Update for the latest features and improvements.')}</a
>
</div>
<div class=" flex-shrink-0 pl-2">
<button
class=" hover:text-blue-900 dark:hover:text-blue-300 transition"
on:click={() => {
console.log('closeToast');
localStorage.setItem('dismissedUpdateToast', Date.now().toString());
dispatch('closeToast');
}}
>
<XMark />
</button>
</div>
</div>
@@ -55,7 +55,7 @@
const uploadDoc = async (file, tags?: object) => { const uploadDoc = async (file, tags?: object) => {
console.log(file); console.log(file);
// Check if the file is an audio file and transcribe/convert it to text file // Check if the file is an audio file and transcribe/convert it to text file
if (['audio/mpeg', 'audio/wav', 'audio/ogg'].includes(file['type'])) { if (['audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/x-m4a'].includes(file['type'])) {
const transcribeRes = await transcribeAudio(localStorage.token, file).catch((error) => { const transcribeRes = await transcribeAudio(localStorage.token, file).catch((error) => {
toast.error(error); toast.error(error);
return null; return null;
+17 -3
View File
@@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import { marked } from 'marked';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import Sortable from 'sortablejs'; import Sortable from 'sortablejs';
@@ -389,9 +391,21 @@
<div <div
class=" flex-1 self-center {(model?.info?.meta?.hidden ?? false) ? 'text-gray-500' : ''}" class=" flex-1 self-center {(model?.info?.meta?.hidden ?? false) ? 'text-gray-500' : ''}"
> >
<div class=" font-semibold line-clamp-1">{model.name}</div> <Tooltip
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1"> content={marked.parse(
{!!model?.info?.meta?.description ? model?.info?.meta?.description : model.id} model?.ollama?.digest
? `${model?.ollama?.digest} *(${model?.ollama?.modified_at})*`
: ''
)}
className=" w-fit"
placement="top-start"
>
<div class=" font-semibold line-clamp-1">{model.name}</div>
</Tooltip>
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1 text-gray-500">
{!!model?.info?.meta?.description
? model?.info?.meta?.description
: (model?.ollama?.digest ?? model.id)}
</div> </div>
</div> </div>
</a> </a>
+3 -1
View File
@@ -31,7 +31,9 @@ export const SUPPORTED_FILE_TYPE = [
'application/x-javascript', 'application/x-javascript',
'text/markdown', 'text/markdown',
'audio/mpeg', 'audio/mpeg',
'audio/wav' 'audio/wav',
'audio/ogg',
'audio/x-m4a'
]; ];
export const SUPPORTED_FILE_EXTENSIONS = [ export const SUPPORTED_FILE_EXTENSIONS = [
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "دردشات {{user}}", "{{user}}'s Chats": "دردشات {{user}}",
"{{webUIName}} Backend Required": "{{webUIName}} مطلوب", "{{webUIName}} Backend Required": "{{webUIName}} مطلوب",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "يتم استخدام نموذج المهمة عند تنفيذ مهام مثل إنشاء عناوين للدردشات واستعلامات بحث الويب", "A task model is used when performing tasks such as generating titles for chats and web search queries": "يتم استخدام نموذج المهمة عند تنفيذ مهام مثل إنشاء عناوين للدردشات واستعلامات بحث الويب",
"a user": "مستخدم", "a user": "مستخدم",
"About": "عن", "About": "عن",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "خطاء! يبدو أن عنوان URL غير صالح. يرجى التحقق مرة أخرى والمحاولة مرة أخرى.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "خطاء! يبدو أن عنوان URL غير صالح. يرجى التحقق مرة أخرى والمحاولة مرة أخرى.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "خطاء! أنت تستخدم طريقة غير مدعومة (الواجهة الأمامية فقط). يرجى تقديم واجهة WebUI من الواجهة الخلفية.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "خطاء! أنت تستخدم طريقة غير مدعومة (الواجهة الأمامية فقط). يرجى تقديم واجهة WebUI من الواجهة الخلفية.",
"Open file": "",
"Open new chat": "فتح محادثة جديده", "Open new chat": "فتح محادثة جديده",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "آخر", "Other": "آخر",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "الباسورد", "Password": "الباسورد",
"PDF document (.pdf)": "PDF ملف (.pdf)", "PDF document (.pdf)": "PDF ملف (.pdf)",
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)", "PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "نص عادي (.txt)", "Plain text (.txt)": "نص عادي (.txt)",
"Playground": "مكان التجربة", "Playground": "مكان التجربة",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "موقف ايجابي", "Positive attitude": "موقف ايجابي",
"Previous 30 days": "أخر 30 يوم", "Previous 30 days": "أخر 30 يوم",
"Previous 7 days": "أخر 7 أيام", "Previous 7 days": "أخر 7 أيام",
@@ -619,9 +623,9 @@
"Sign up": "تسجيل", "Sign up": "تسجيل",
"Signing in": "جاري الدخول", "Signing in": "جاري الدخول",
"Source": "المصدر", "Source": "المصدر",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "{{error}} خطأ في التعرف على الكلام", "Speech recognition error: {{error}}": "{{error}} خطأ في التعرف على الكلام",
"Speech-to-Text Engine": "محرك تحويل الكلام إلى نص", "Speech-to-Text Engine": "محرك تحويل الكلام إلى نص",
"Speed Rate": "",
"Stop Sequence": "وقف التسلسل", "Stop Sequence": "وقف التسلسل",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -703,6 +707,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "تحديث ونسخ الرابط", "Update and Copy Link": "تحديث ونسخ الرابط",
"Update for the latest features and improvements.": "",
"Update password": "تحديث كلمة المرور", "Update password": "تحديث كلمة المرور",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}'s чатове", "{{user}}'s Chats": "{{user}}'s чатове",
"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд", "{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Моделът на задачите се използва при изпълнение на задачи като генериране на заглавия за чатове и заявки за търсене в мрежата", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Моделът на задачите се използва при изпълнение на задачи като генериране на заглавия за чатове и заявки за търсене в мрежата",
"a user": "потребител", "a user": "потребител",
"About": "Относно", "About": "Относно",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изглежда URL адресът е невалиден. Моля, проверете отново и опитайте пак.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изглежда URL адресът е невалиден. Моля, проверете отново и опитайте пак.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Използвате неподдържан метод (само фронтенд). Моля, сервирайте WebUI от бекенда.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Използвате неподдържан метод (само фронтенд). Моля, сервирайте WebUI от бекенда.",
"Open file": "",
"Open new chat": "Отвори нов чат", "Open new chat": "Отвори нов чат",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Other", "Other": "Other",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Парола", "Password": "Парола",
"PDF document (.pdf)": "PDF документ (.pdf)", "PDF document (.pdf)": "PDF документ (.pdf)",
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)", "PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Plain text (.txt)", "Plain text (.txt)": "Plain text (.txt)",
"Playground": "Плейграунд", "Playground": "Плейграунд",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Позитивна ативност", "Positive attitude": "Позитивна ативност",
"Previous 30 days": "Предыдущите 30 дни", "Previous 30 days": "Предыдущите 30 дни",
"Previous 7 days": "Предыдущите 7 дни", "Previous 7 days": "Предыдущите 7 дни",
@@ -615,9 +619,9 @@
"Sign up": "Регистрация", "Sign up": "Регистрация",
"Signing in": "Вписване", "Signing in": "Вписване",
"Source": "Източник", "Source": "Източник",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Speech recognition error: {{error}}", "Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
"Speech-to-Text Engine": "Speech-to-Text Engine", "Speech-to-Text Engine": "Speech-to-Text Engine",
"Speed Rate": "",
"Stop Sequence": "Stop Sequence", "Stop Sequence": "Stop Sequence",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Обнови и копирай връзка", "Update and Copy Link": "Обнови и копирай връзка",
"Update for the latest features and improvements.": "",
"Update password": "Обновяване на парола", "Update password": "Обновяване на парола",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}র চ্যাটস", "{{user}}'s Chats": "{{user}}র চ্যাটস",
"{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক", "{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "চ্যাট এবং ওয়েব অনুসন্ধান প্রশ্নের জন্য শিরোনাম তৈরি করার মতো কাজগুলি সম্পাদন করার সময় একটি টাস্ক মডেল ব্যবহার করা হয়", "A task model is used when performing tasks such as generating titles for chats and web search queries": "চ্যাট এবং ওয়েব অনুসন্ধান প্রশ্নের জন্য শিরোনাম তৈরি করার মতো কাজগুলি সম্পাদন করার সময় একটি টাস্ক মডেল ব্যবহার করা হয়",
"a user": "একজন ব্যাবহারকারী", "a user": "একজন ব্যাবহারকারী",
"About": "সম্পর্কে", "About": "সম্পর্কে",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "ওহ, মনে হচ্ছে ইউআরএলটা ইনভ্যালিড। দয়া করে আর চেক করে চেষ্টা করুন।", "Oops! Looks like the URL is invalid. Please double-check and try again.": "ওহ, মনে হচ্ছে ইউআরএলটা ইনভ্যালিড। দয়া করে আর চেক করে চেষ্টা করুন।",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "আপনি একটা আনসাপোর্টেড পদ্ধতি (শুধু ফ্রন্টএন্ড) ব্যবহার করছেন। দয়া করে WebUI ব্যাকএন্ড থেকে চালনা করুন।", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "আপনি একটা আনসাপোর্টেড পদ্ধতি (শুধু ফ্রন্টএন্ড) ব্যবহার করছেন। দয়া করে WebUI ব্যাকএন্ড থেকে চালনা করুন।",
"Open file": "",
"Open new chat": "নতুন চ্যাট খুলুন", "Open new chat": "নতুন চ্যাট খুলুন",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "অন্যান্য", "Other": "অন্যান্য",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "পাসওয়ার্ড", "Password": "পাসওয়ার্ড",
"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)", "PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)", "PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "প্লায়েন টেক্সট (.txt)", "Plain text (.txt)": "প্লায়েন টেক্সট (.txt)",
"Playground": "খেলাঘর", "Playground": "খেলাঘর",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "পজিটিভ আক্রমণ", "Positive attitude": "পজিটিভ আক্রমণ",
"Previous 30 days": "পূর্ব ৩০ দিন", "Previous 30 days": "পূর্ব ৩০ দিন",
"Previous 7 days": "পূর্ব ৭ দিন", "Previous 7 days": "পূর্ব ৭ দিন",
@@ -615,9 +619,9 @@
"Sign up": "সাইন আপ", "Sign up": "সাইন আপ",
"Signing in": "সাইন ইন", "Signing in": "সাইন ইন",
"Source": "উৎস", "Source": "উৎস",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}", "Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
"Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন", "Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন",
"Speed Rate": "",
"Stop Sequence": "সিকোয়েন্স থামান", "Stop Sequence": "সিকোয়েন্স থামান",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "আপডেট এবং লিংক কপি করুন", "Update and Copy Link": "আপডেট এবং লিংক কপি করুন",
"Update for the latest features and improvements.": "",
"Update password": "পাসওয়ার্ড আপডেট করুন", "Update password": "পাসওয়ার্ড আপডেট করুন",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+16 -11
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Els xats de {{user}}", "{{user}}'s Chats": "Els xats de {{user}}",
"{{webUIName}} Backend Required": "El Backend de {{webUIName}} és necessari", "{{webUIName}} Backend Required": "El Backend de {{webUIName}} és necessari",
"*Prompt node ID(s) are required for image generation": "*Els identificadors de nodes d'indicacions són necessaris per a la generació d'imatges", "*Prompt node ID(s) are required for image generation": "*Els identificadors de nodes d'indicacions són necessaris per a la generació d'imatges",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un model de tasca s'utilitza quan es realitzen tasques com ara generar títols per a xats i consultes de cerca per a la web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un model de tasca s'utilitza quan es realitzen tasques com ara generar títols per a xats i consultes de cerca per a la web",
"a user": "un usuari", "a user": "un usuari",
"About": "Sobre", "About": "Sobre",
@@ -73,10 +74,10 @@
"AUTOMATIC1111 Api Auth String": "Cadena d'autenticació de l'API d'AUTOMATIC1111", "AUTOMATIC1111 Api Auth String": "Cadena d'autenticació de l'API d'AUTOMATIC1111",
"AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base d'AUTOMATIC1111.", "AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base d'AUTOMATIC1111.",
"Available list": "", "Available list": "Llista de disponibles",
"available!": "disponible!", "available!": "disponible!",
"Azure AI Speech": "", "Azure AI Speech": "Azure AI Speech",
"Azure Region": "", "Azure Region": "Regió d'Azure",
"Back": "Enrere", "Back": "Enrere",
"Bad Response": "Resposta errònia", "Bad Response": "Resposta errònia",
"Banners": "Banners", "Banners": "Banners",
@@ -97,7 +98,7 @@
"Chat Bubble UI": "Chat Bubble UI", "Chat Bubble UI": "Chat Bubble UI",
"Chat Controls": "Controls de xat", "Chat Controls": "Controls de xat",
"Chat direction": "Direcció del xat", "Chat direction": "Direcció del xat",
"Chat Overview": "", "Chat Overview": "Vista general del xat",
"Chats": "Xats", "Chats": "Xats",
"Check Again": "Comprovar-ho de nou", "Check Again": "Comprovar-ho de nou",
"Check for updates": "Comprovar si hi ha actualitzacions", "Check for updates": "Comprovar si hi ha actualitzacions",
@@ -415,7 +416,7 @@
"Model {{modelId}} not found": "No s'ha trobat el model {{modelId}}", "Model {{modelId}} not found": "No s'ha trobat el model {{modelId}}",
"Model {{modelName}} is not vision capable": "El model {{modelName}} no és capaç de visió", "Model {{modelName}} is not vision capable": "El model {{modelName}} no és capaç de visió",
"Model {{name}} is now {{status}}": "El model {{name}} ara és {{status}}", "Model {{name}} is now {{status}}": "El model {{name}} ara és {{status}}",
"Model {{name}} is now at the top": "", "Model {{name}} is now at the top": "El model {{name}} està ara a dalt de tot",
"Model accepts image inputs": "El model accepta entrades d'imatge", "Model accepts image inputs": "El model accepta entrades d'imatge",
"Model created successfully!": "Model creat correctament", "Model created successfully!": "Model creat correctament",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per actualitzar, no es pot continuar.", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per actualitzar, no es pot continuar.",
@@ -428,7 +429,7 @@
"Modelfile Content": "Contingut del Modelfile", "Modelfile Content": "Contingut del Modelfile",
"Models": "Models", "Models": "Models",
"More": "Més", "More": "Més",
"Move to Top": "", "Move to Top": "Moure a dalt de tot",
"Name": "Nom", "Name": "Nom",
"Name Tag": "Etiqueta de nom", "Name Tag": "Etiqueta de nom",
"Name your model": "Posa un nom al teu model", "Name your model": "Posa un nom al teu model",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ui! Sembla que l'URL no és vàlida. Si us plau, revisa-la i torna-ho a provar.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ui! Sembla que l'URL no és vàlida. Si us plau, revisa-la i torna-ho a provar.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Ui! Hi ha hagut un error en la resposta anterior. Torna a provar-ho o contacta amb un administrador", "Oops! There was an error in the previous response. Please try again or contact admin.": "Ui! Hi ha hagut un error en la resposta anterior. Torna a provar-ho o contacta amb un administrador",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ui! Estàs utilitzant un mètode no suportat (només frontend). Si us plau, serveix la WebUI des del backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ui! Estàs utilitzant un mètode no suportat (només frontend). Si us plau, serveix la WebUI des del backend.",
"Open file": "",
"Open new chat": "Obre un xat nou", "Open new chat": "Obre un xat nou",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versió d'Open WebUI (v{{OPEN_WEBUI_VERSION}}) és inferior a la versió requerida (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versió d'Open WebUI (v{{OPEN_WEBUI_VERSION}}) és inferior a la versió requerida (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -474,8 +476,9 @@
"OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.", "OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.",
"or": "o", "or": "o",
"Other": "Altres", "Other": "Altres",
"Output format": "", "Output format": "Format de sortida",
"Overview": "", "Overview": "Vista general",
"page": "",
"Password": "Contrasenya", "Password": "Contrasenya",
"PDF document (.pdf)": "Document PDF (.pdf)", "PDF document (.pdf)": "Document PDF (.pdf)",
"PDF Extract Images (OCR)": "Extreu imatges del PDF (OCR)", "PDF Extract Images (OCR)": "Extreu imatges del PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Text pla (.txt)", "Plain text (.txt)": "Text pla (.txt)",
"Playground": "Zona de jocs", "Playground": "Zona de jocs",
"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:", "Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
"Please select a reason": "",
"Positive attitude": "Actitud positiva", "Positive attitude": "Actitud positiva",
"Previous 30 days": "30 dies anteriors", "Previous 30 days": "30 dies anteriors",
"Previous 7 days": "7 dies anteriors", "Previous 7 days": "7 dies anteriors",
@@ -538,7 +542,7 @@
"Save": "Desar", "Save": "Desar",
"Save & Create": "Desar i crear", "Save & Create": "Desar i crear",
"Save & Update": "Desar i actualitzar", "Save & Update": "Desar i actualitzar",
"Save As Copy": "", "Save As Copy": "Desar com a còpia",
"Save Tag": "Desar l'etiqueta", "Save Tag": "Desar l'etiqueta",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarregr i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarregr i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de",
"Scan": "Escanejar", "Scan": "Escanejar",
@@ -616,11 +620,11 @@
"Sign up": "Registrar-se", "Sign up": "Registrar-se",
"Signing in": "Iniciant sessió", "Signing in": "Iniciant sessió",
"Source": "Font", "Source": "Font",
"Speech Playback Speed": "Velocitat de la parla",
"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}", "Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
"Speech-to-Text Engine": "Motor de veu a text", "Speech-to-Text Engine": "Motor de veu a text",
"Speed Rate": "",
"Stop Sequence": "Atura la seqüència", "Stop Sequence": "Atura la seqüència",
"Stream Chat Response": "", "Stream Chat Response": "Fer streaming de la resposta del xat",
"STT Model": "Model SST", "STT Model": "Model SST",
"STT Settings": "Preferències de STT", "STT Settings": "Preferències de STT",
"Submit": "Enviar", "Submit": "Enviar",
@@ -700,6 +704,7 @@
"Unpin": "Alliberar", "Unpin": "Alliberar",
"Update": "Actualitzar", "Update": "Actualitzar",
"Update and Copy Link": "Actualitzar i copiar l'enllaç", "Update and Copy Link": "Actualitzar i copiar l'enllaç",
"Update for the latest features and improvements.": "",
"Update password": "Actualitzar la contrasenya", "Update password": "Actualitzar la contrasenya",
"Updated at": "Actualitzat", "Updated at": "Actualitzat",
"Upload": "Pujar", "Upload": "Pujar",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "", "{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "Backend {{webUIName}} gikinahanglan", "{{webUIName}} Backend Required": "Backend {{webUIName}} gikinahanglan",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "",
"a user": "usa ka user", "a user": "usa ka user",
"About": "Mahitungod sa", "About": "Mahitungod sa",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! ", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! ",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! ", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! ",
"Open file": "",
"Open new chat": "Ablihi ang bag-ong diskusyon", "Open new chat": "Ablihi ang bag-ong diskusyon",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
@@ -476,6 +478,7 @@
"Other": "", "Other": "",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Password", "Password": "Password",
"PDF document (.pdf)": "", "PDF document (.pdf)": "",
"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)", "PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "Dulaanan", "Playground": "Dulaanan",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -615,9 +619,9 @@
"Sign up": "Pagrehistro", "Sign up": "Pagrehistro",
"Signing in": "", "Signing in": "",
"Source": "Tinubdan", "Source": "Tinubdan",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Sayop sa pag-ila sa tingog: {{error}}", "Speech recognition error: {{error}}": "Sayop sa pag-ila sa tingog: {{error}}",
"Speech-to-Text Engine": "Engine sa pag-ila sa tingog", "Speech-to-Text Engine": "Engine sa pag-ila sa tingog",
"Speed Rate": "",
"Stop Sequence": "Pagkasunod-sunod sa pagsira", "Stop Sequence": "Pagkasunod-sunod sa pagsira",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update for the latest features and improvements.": "",
"Update password": "I-update ang password", "Update password": "I-update ang password",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}s Unterhaltungen", "{{user}}'s Chats": "{{user}}s Unterhaltungen",
"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich", "{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Unterhaltungstitel oder Websuchanfragen generieren.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Unterhaltungstitel oder Websuchanfragen generieren.",
"a user": "ein Benutzer", "a user": "ein Benutzer",
"About": "Über", "About": "Über",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppla! Es scheint, dass die URL ungültig ist. Bitte überprüfen Sie diese und versuchen Sie es erneut.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppla! Es scheint, dass die URL ungültig ist. Bitte überprüfen Sie diese und versuchen Sie es erneut.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Hoppla! Es gab einen Fehler in der vorherigen Antwort. Bitte versuchen Sie es erneut oder kontaktieren Sie den Administrator.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Hoppla! Es gab einen Fehler in der vorherigen Antwort. Bitte versuchen Sie es erneut oder kontaktieren Sie den Administrator.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hoppla! Sie verwenden eine nicht unterstützte Methode (nur Frontend). Bitte stellen Sie die WebUI vom Backend bereit.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hoppla! Sie verwenden eine nicht unterstützte Methode (nur Frontend). Bitte stellen Sie die WebUI vom Backend bereit.",
"Open file": "Datei öffnen",
"Open new chat": "Neuen Chat öffnen", "Open new chat": "Neuen Chat öffnen",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Die installierte Open-WebUI-Version (v{{OPEN_WEBUI_VERSION}}) ist niedriger als die erforderliche Version (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Die installierte Open-WebUI-Version (v{{OPEN_WEBUI_VERSION}}) ist niedriger als die erforderliche Version (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Andere", "Other": "Andere",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "Seite",
"Password": "Passwort", "Password": "Passwort",
"PDF document (.pdf)": "PDF-Dokument (.pdf)", "PDF document (.pdf)": "PDF-Dokument (.pdf)",
"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)", "PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Nur Text (.txt)", "Plain text (.txt)": "Nur Text (.txt)",
"Playground": "Testumgebung", "Playground": "Testumgebung",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Positive Einstellung", "Positive attitude": "Positive Einstellung",
"Previous 30 days": "Vorherige 30 Tage", "Previous 30 days": "Vorherige 30 Tage",
"Previous 7 days": "Vorherige 7 Tage", "Previous 7 days": "Vorherige 7 Tage",
@@ -615,9 +619,9 @@
"Sign up": "Registrieren", "Sign up": "Registrieren",
"Signing in": "Anmeldung", "Signing in": "Anmeldung",
"Source": "Quelle", "Source": "Quelle",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}", "Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}",
"Speech-to-Text Engine": "Sprache-zu-Text-Engine", "Speech-to-Text Engine": "Sprache-zu-Text-Engine",
"Speed Rate": "",
"Stop Sequence": "Stop-Sequenz", "Stop Sequence": "Stop-Sequenz",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "STT-Modell", "STT Model": "STT-Modell",
@@ -699,6 +703,7 @@
"Unpin": "Lösen", "Unpin": "Lösen",
"Update": "Aktualisieren", "Update": "Aktualisieren",
"Update and Copy Link": "Aktualisieren und Link kopieren", "Update and Copy Link": "Aktualisieren und Link kopieren",
"Update for the latest features and improvements.": "",
"Update password": "Passwort aktualisieren", "Update password": "Passwort aktualisieren",
"Updated at": "Aktualisiert am", "Updated at": "Aktualisiert am",
"Upload": "Hochladen", "Upload": "Hochladen",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "", "{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required", "{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "",
"a user": "such user", "a user": "such user",
"About": "Much About", "About": "Much About",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Looks like the URL is invalid. Please double-check and try again.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Looks like the URL is invalid. Please double-check and try again.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.",
"Open file": "",
"Open new chat": "Open new bark", "Open new chat": "Open new bark",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
@@ -476,6 +478,7 @@
"Other": "", "Other": "",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Barkword", "Password": "Barkword",
"PDF document (.pdf)": "", "PDF document (.pdf)": "",
"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)", "PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Plain text (.txt)", "Plain text (.txt)": "Plain text (.txt)",
"Playground": "Playground", "Playground": "Playground",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -617,9 +621,9 @@
"Sign up": "Sign up much join", "Sign up": "Sign up much join",
"Signing in": "", "Signing in": "",
"Source": "Source", "Source": "Source",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error", "Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
"Speech-to-Text Engine": "Speech-to-Text Engine much speak", "Speech-to-Text Engine": "Speech-to-Text Engine much speak",
"Speed Rate": "",
"Stop Sequence": "Stop Sequence much stop", "Stop Sequence": "Stop Sequence much stop",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -701,6 +705,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update for the latest features and improvements.": "",
"Update password": "Update password much change", "Update password": "Update password much change",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "", "{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "", "{{webUIName}} Backend Required": "",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "",
"a user": "", "a user": "",
"About": "", "About": "",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "", "Oops! Looks like the URL is invalid. Please double-check and try again.": "",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "",
"Open file": "",
"Open new chat": "", "Open new chat": "",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
@@ -476,6 +478,7 @@
"Other": "", "Other": "",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "", "Password": "",
"PDF document (.pdf)": "", "PDF document (.pdf)": "",
"PDF Extract Images (OCR)": "", "PDF Extract Images (OCR)": "",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "", "Playground": "",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -615,9 +619,9 @@
"Sign up": "", "Sign up": "",
"Signing in": "", "Signing in": "",
"Source": "", "Source": "",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "", "Speech recognition error: {{error}}": "",
"Speech-to-Text Engine": "", "Speech-to-Text Engine": "",
"Speed Rate": "",
"Stop Sequence": "", "Stop Sequence": "",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update for the latest features and improvements.": "",
"Update password": "", "Update password": "",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "", "{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "", "{{webUIName}} Backend Required": "",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "",
"a user": "", "a user": "",
"About": "", "About": "",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "", "Oops! Looks like the URL is invalid. Please double-check and try again.": "",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "",
"Open file": "",
"Open new chat": "", "Open new chat": "",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
@@ -476,6 +478,7 @@
"Other": "", "Other": "",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "", "Password": "",
"PDF document (.pdf)": "", "PDF document (.pdf)": "",
"PDF Extract Images (OCR)": "", "PDF Extract Images (OCR)": "",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "", "Playground": "",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -615,9 +619,9 @@
"Sign up": "", "Sign up": "",
"Signing in": "", "Signing in": "",
"Source": "", "Source": "",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "", "Speech recognition error: {{error}}": "",
"Speech-to-Text Engine": "", "Speech-to-Text Engine": "",
"Speed Rate": "",
"Stop Sequence": "", "Stop Sequence": "",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update for the latest features and improvements.": "",
"Update password": "", "Update password": "",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}'s Chats", "{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido", "{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modelo de tareas se utiliza cuando se realizan tareas como la generación de títulos para chats y consultas de búsqueda web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modelo de tareas se utiliza cuando se realizan tareas como la generación de títulos para chats y consultas de búsqueda web",
"a user": "un usuario", "a user": "un usuario",
"About": "Sobre nosotros", "About": "Sobre nosotros",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "¡Ups! Parece que la URL no es válida. Vuelva a verificar e inténtelo nuevamente.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "¡Ups! Parece que la URL no es válida. Vuelva a verificar e inténtelo nuevamente.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "¡Oops! Hubo un error en la respuesta anterior. Intente de nuevo o póngase en contacto con el administrador.", "Oops! There was an error in the previous response. Please try again or contact admin.": "¡Oops! Hubo un error en la respuesta anterior. Intente de nuevo o póngase en contacto con el administrador.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "¡Ups! Estás utilizando un método no compatible (solo frontend). Por favor ejecute la WebUI desde el backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "¡Ups! Estás utilizando un método no compatible (solo frontend). Por favor ejecute la WebUI desde el backend.",
"Open file": "",
"Open new chat": "Abrir nuevo chat", "Open new chat": "Abrir nuevo chat",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Otro", "Other": "Otro",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Contraseña", "Password": "Contraseña",
"PDF document (.pdf)": "PDF document (.pdf)", "PDF document (.pdf)": "PDF document (.pdf)",
"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)", "PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Texto plano (.txt)", "Plain text (.txt)": "Texto plano (.txt)",
"Playground": "Patio de juegos", "Playground": "Patio de juegos",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Actitud positiva", "Positive attitude": "Actitud positiva",
"Previous 30 days": "Últimos 30 días", "Previous 30 days": "Últimos 30 días",
"Previous 7 days": "Últimos 7 días", "Previous 7 days": "Últimos 7 días",
@@ -616,9 +620,9 @@
"Sign up": "Crear una cuenta", "Sign up": "Crear una cuenta",
"Signing in": "Iniciando sesión", "Signing in": "Iniciando sesión",
"Source": "Fuente", "Source": "Fuente",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}", "Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}",
"Speech-to-Text Engine": "Motor de voz a texto", "Speech-to-Text Engine": "Motor de voz a texto",
"Speed Rate": "",
"Stop Sequence": "Detener secuencia", "Stop Sequence": "Detener secuencia",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Modelo STT", "STT Model": "Modelo STT",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "Actualizar", "Update": "Actualizar",
"Update and Copy Link": "Actualizar y copiar enlace", "Update and Copy Link": "Actualizar y copiar enlace",
"Update for the latest features and improvements.": "",
"Update password": "Actualizar contraseña", "Update password": "Actualizar contraseña",
"Updated at": "Actualizado en", "Updated at": "Actualizado en",
"Upload": "Subir", "Upload": "Subir",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} چت ها", "{{user}}'s Chats": "{{user}} چت ها",
"{{webUIName}} Backend Required": "بکند {{webUIName}} نیاز است.", "{{webUIName}} Backend Required": "بکند {{webUIName}} نیاز است.",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "یک مدل وظیفه هنگام انجام وظایف مانند تولید عناوین برای چت ها و نمایش های جستجوی وب استفاده می شود.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "یک مدل وظیفه هنگام انجام وظایف مانند تولید عناوین برای چت ها و نمایش های جستجوی وب استفاده می شود.",
"a user": "یک کاربر", "a user": "یک کاربر",
"About": "درباره", "About": "درباره",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "اوه! به نظر می رسد URL نامعتبر است. لطفاً دوباره بررسی کنید و دوباره امتحان کنید.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "اوه! به نظر می رسد URL نامعتبر است. لطفاً دوباره بررسی کنید و دوباره امتحان کنید.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "اوه! شما از یک روش پشتیبانی نشده (فقط frontend) استفاده می کنید. لطفاً WebUI را از بکند اجرا کنید.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "اوه! شما از یک روش پشتیبانی نشده (فقط frontend) استفاده می کنید. لطفاً WebUI را از بکند اجرا کنید.",
"Open file": "",
"Open new chat": "باز کردن گپ جدید", "Open new chat": "باز کردن گپ جدید",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "دیگر", "Other": "دیگر",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "رمز عبور", "Password": "رمز عبور",
"PDF document (.pdf)": "PDF سند (.pdf)", "PDF document (.pdf)": "PDF سند (.pdf)",
"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)", "PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "متن ساده (.txt)", "Plain text (.txt)": "متن ساده (.txt)",
"Playground": "زمین بازی", "Playground": "زمین بازی",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "نظرات مثبت", "Positive attitude": "نظرات مثبت",
"Previous 30 days": "30 روز قبل", "Previous 30 days": "30 روز قبل",
"Previous 7 days": "7 روز قبل", "Previous 7 days": "7 روز قبل",
@@ -615,9 +619,9 @@
"Sign up": "ثبت نام", "Sign up": "ثبت نام",
"Signing in": "ورود", "Signing in": "ورود",
"Source": "منبع", "Source": "منبع",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}", "Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}",
"Speech-to-Text Engine": "موتور گفتار به متن", "Speech-to-Text Engine": "موتور گفتار به متن",
"Speed Rate": "",
"Stop Sequence": "توالی توقف", "Stop Sequence": "توالی توقف",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "به روزرسانی و کپی لینک", "Update and Copy Link": "به روزرسانی و کپی لینک",
"Update for the latest features and improvements.": "",
"Update password": "به روزرسانی رمزعبور", "Update password": "به روزرسانی رمزعبور",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}:n keskustelut", "{{user}}'s Chats": "{{user}}:n keskustelut",
"{{webUIName}} Backend Required": "{{webUIName}} backend vaaditaan", "{{webUIName}} Backend Required": "{{webUIName}} backend vaaditaan",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Tehtävämallia käytetään tehtävien suorittamiseen, kuten otsikoiden luomiseen keskusteluille ja verkkohakukyselyille", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Tehtävämallia käytetään tehtävien suorittamiseen, kuten otsikoiden luomiseen keskusteluille ja verkkohakukyselyille",
"a user": "käyttäjä", "a user": "käyttäjä",
"About": "Tietoja", "About": "Tietoja",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että URL on virheellinen. Tarkista se ja yritä uudelleen.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että URL on virheellinen. Tarkista se ja yritä uudelleen.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hupsista! Käytät ei-tuettua menetelmää. WebUI pitää palvella backendista.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hupsista! Käytät ei-tuettua menetelmää. WebUI pitää palvella backendista.",
"Open file": "",
"Open new chat": "Avaa uusi keskustelu", "Open new chat": "Avaa uusi keskustelu",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Muu", "Other": "Muu",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Salasana", "Password": "Salasana",
"PDF document (.pdf)": "PDF-tiedosto (.pdf)", "PDF document (.pdf)": "PDF-tiedosto (.pdf)",
"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)", "PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Pelkkä teksti (.txt)", "Plain text (.txt)": "Pelkkä teksti (.txt)",
"Playground": "Leikkipaikka", "Playground": "Leikkipaikka",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Positiivinen asenne", "Positive attitude": "Positiivinen asenne",
"Previous 30 days": "Edelliset 30 päivää", "Previous 30 days": "Edelliset 30 päivää",
"Previous 7 days": "Edelliset 7 päivää", "Previous 7 days": "Edelliset 7 päivää",
@@ -615,9 +619,9 @@
"Sign up": "Rekisteröidy", "Sign up": "Rekisteröidy",
"Signing in": "Kirjaudutaan sisään", "Signing in": "Kirjaudutaan sisään",
"Source": "Lähde", "Source": "Lähde",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}", "Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}",
"Speech-to-Text Engine": "Puheentunnistusmoottori", "Speech-to-Text Engine": "Puheentunnistusmoottori",
"Speed Rate": "",
"Stop Sequence": "Lopetussekvenssi", "Stop Sequence": "Lopetussekvenssi",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Päivitä ja kopioi linkki", "Update and Copy Link": "Päivitä ja kopioi linkki",
"Update for the latest features and improvements.": "",
"Update password": "Päivitä salasana", "Update password": "Päivitä salasana",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Discussions de {{user}}", "{{user}}'s Chats": "Discussions de {{user}}",
"{{webUIName}} Backend Required": "Backend {{webUIName}} requis", "{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.",
"a user": "un utilisateur", "a user": "un utilisateur",
"About": "À propos", "About": "À propos",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops ! Il y a eu une erreur dans la réponse précédente. Veuillez réessayer ou contacter l'administrateur.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Oops ! Il y a eu une erreur dans la réponse précédente. Veuillez réessayer ou contacter l'administrateur.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups\u00a0! Vous utilisez une méthode non prise en charge (frontend uniquement). Veuillez servir l'interface Web à partir du backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups\u00a0! Vous utilisez une méthode non prise en charge (frontend uniquement). Veuillez servir l'interface Web à partir du backend.",
"Open file": "",
"Open new chat": "Ouvrir une nouvelle discussion", "Open new chat": "Ouvrir une nouvelle discussion",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Autre", "Other": "Autre",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Mot de passe", "Password": "Mot de passe",
"PDF document (.pdf)": "Document au format PDF (.pdf)", "PDF document (.pdf)": "Document au format PDF (.pdf)",
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Texte simple (.txt)", "Plain text (.txt)": "Texte simple (.txt)",
"Playground": "Aire de jeux", "Playground": "Aire de jeux",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Attitude positive", "Positive attitude": "Attitude positive",
"Previous 30 days": "30 derniers jours", "Previous 30 days": "30 derniers jours",
"Previous 7 days": "7 derniers jours", "Previous 7 days": "7 derniers jours",
@@ -616,9 +620,9 @@
"Sign up": "Inscrivez-vous", "Sign up": "Inscrivez-vous",
"Signing in": "Connexion en cours", "Signing in": "Connexion en cours",
"Source": "Source", "Source": "Source",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}", "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}",
"Speech-to-Text Engine": "Moteur de reconnaissance vocale", "Speech-to-Text Engine": "Moteur de reconnaissance vocale",
"Speed Rate": "",
"Stop Sequence": "Séquence d'arrêt", "Stop Sequence": "Séquence d'arrêt",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Modèle de STT", "STT Model": "Modèle de STT",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "Mise à jour", "Update": "Mise à jour",
"Update and Copy Link": "Mettre à jour et copier le lien", "Update and Copy Link": "Mettre à jour et copier le lien",
"Update for the latest features and improvements.": "",
"Update password": "Mettre à jour le mot de passe", "Update password": "Mettre à jour le mot de passe",
"Updated at": "Mise à jour le", "Updated at": "Mise à jour le",
"Upload": "Télécharger", "Upload": "Télécharger",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Conversations de {{user}}", "{{user}}'s Chats": "Conversations de {{user}}",
"{{webUIName}} Backend Required": "Backend {{webUIName}} requis", "{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
"*Prompt node ID(s) are required for image generation": "*Les ID de noeud du prompt sont nécessaires pour la génération d’images", "*Prompt node ID(s) are required for image generation": "*Les ID de noeud du prompt sont nécessaires pour la génération d’images",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modèle de tâche est utilisé lors de l’exécution de tâches telles que la génération de titres pour les conversations et les requêtes de recherche sur le web.",
"a user": "un utilisateur", "a user": "un utilisateur",
"About": "À propos", "About": "À propos",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oups ! Il semble que l'URL soit invalide. Veuillez vérifier à nouveau et réessayer.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops ! Il y a eu une erreur dans la réponse précédente. Veuillez réessayer ou contacter l'administrateur.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Oops ! Il y a eu une erreur dans la réponse précédente. Veuillez réessayer ou contacter l'administrateur.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups\u00a0! Vous utilisez une méthode non prise en charge (frontend uniquement). Veuillez servir l'interface Web à partir du backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oups\u00a0! Vous utilisez une méthode non prise en charge (frontend uniquement). Veuillez servir l'interface Web à partir du backend.",
"Open file": "",
"Open new chat": "Ouvrir une nouvelle conversation", "Open new chat": "Ouvrir une nouvelle conversation",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La version Open WebUI (v{{OPEN_WEBUI_VERSION}}) est inférieure à la version requise (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La version Open WebUI (v{{OPEN_WEBUI_VERSION}}) est inférieure à la version requise (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Autre", "Other": "Autre",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Mot de passe", "Password": "Mot de passe",
"PDF document (.pdf)": "Document au format PDF (.pdf)", "PDF document (.pdf)": "Document au format PDF (.pdf)",
"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)", "PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Texte simple (.txt)", "Plain text (.txt)": "Texte simple (.txt)",
"Playground": "Playground", "Playground": "Playground",
"Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :", "Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :",
"Please select a reason": "",
"Positive attitude": "Attitude positive", "Positive attitude": "Attitude positive",
"Previous 30 days": "30 derniers jours", "Previous 30 days": "30 derniers jours",
"Previous 7 days": "7 derniers jours", "Previous 7 days": "7 derniers jours",
@@ -616,9 +620,9 @@
"Sign up": "Inscrivez-vous", "Sign up": "Inscrivez-vous",
"Signing in": "Connexion en cours", "Signing in": "Connexion en cours",
"Source": "Source", "Source": "Source",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}", "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}",
"Speech-to-Text Engine": "Moteur de reconnaissance vocale", "Speech-to-Text Engine": "Moteur de reconnaissance vocale",
"Speed Rate": "",
"Stop Sequence": "Séquence d'arrêt", "Stop Sequence": "Séquence d'arrêt",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Modèle de Speech-to-Text", "STT Model": "Modèle de Speech-to-Text",
@@ -700,6 +704,7 @@
"Unpin": "Désépingler", "Unpin": "Désépingler",
"Update": "Mise à jour", "Update": "Mise à jour",
"Update and Copy Link": "Mettre à jour et copier le lien", "Update and Copy Link": "Mettre à jour et copier le lien",
"Update for the latest features and improvements.": "",
"Update password": "Mettre à jour le mot de passe", "Update password": "Mettre à jour le mot de passe",
"Updated at": "Mise à jour le", "Updated at": "Mise à jour le",
"Upload": "Télécharger", "Upload": "Télécharger",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "צ'אטים של {{user}}", "{{user}}'s Chats": "צ'אטים של {{user}}",
"{{webUIName}} Backend Required": "נדרש Backend של {{webUIName}}", "{{webUIName}} Backend Required": "נדרש Backend של {{webUIName}}",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "מודל משימה משמש בעת ביצוע משימות כגון יצירת כותרות עבור צ'אטים ושאילתות חיפוש באינטרנט", "A task model is used when performing tasks such as generating titles for chats and web search queries": "מודל משימה משמש בעת ביצוע משימות כגון יצירת כותרות עבור צ'אטים ושאילתות חיפוש באינטרנט",
"a user": "משתמש", "a user": "משתמש",
"About": "אודות", "About": "אודות",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "אופס! נראה שהכתובת URL אינה תקינה. אנא בדוק שוב ונסה שנית.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "אופס! נראה שהכתובת URL אינה תקינה. אנא בדוק שוב ונסה שנית.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "אופס! אתה משתמש בשיטה לא נתמכת (רק חזית). אנא שרת את ממשק המשתמש האינטרנטי מהשרת האחורי.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "אופס! אתה משתמש בשיטה לא נתמכת (רק חזית). אנא שרת את ממשק המשתמש האינטרנטי מהשרת האחורי.",
"Open file": "",
"Open new chat": "פתח צ'אט חדש", "Open new chat": "פתח צ'אט חדש",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "אחר", "Other": "אחר",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "סיסמה", "Password": "סיסמה",
"PDF document (.pdf)": "מסמך PDF (.pdf)", "PDF document (.pdf)": "מסמך PDF (.pdf)",
"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)", "PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "טקסט פשוט (.txt)", "Plain text (.txt)": "טקסט פשוט (.txt)",
"Playground": "אזור משחקים", "Playground": "אזור משחקים",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "גישה חיובית", "Positive attitude": "גישה חיובית",
"Previous 30 days": "30 הימים הקודמים", "Previous 30 days": "30 הימים הקודמים",
"Previous 7 days": "7 הימים הקודמים", "Previous 7 days": "7 הימים הקודמים",
@@ -616,9 +620,9 @@
"Sign up": "הרשמה", "Sign up": "הרשמה",
"Signing in": "כניסה", "Signing in": "כניסה",
"Source": "מקור", "Source": "מקור",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "שגיאת תחקור שמע: {{error}}", "Speech recognition error: {{error}}": "שגיאת תחקור שמע: {{error}}",
"Speech-to-Text Engine": "מנוע תחקור שמע", "Speech-to-Text Engine": "מנוע תחקור שמע",
"Speed Rate": "",
"Stop Sequence": "סידור עצירה", "Stop Sequence": "סידור עצירה",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "עדכן ושכפל קישור", "Update and Copy Link": "עדכן ושכפל קישור",
"Update for the latest features and improvements.": "",
"Update password": "עדכן סיסמה", "Update password": "עדכן סיסמה",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} की चैट", "{{user}}'s Chats": "{{user}} की चैट",
"{{webUIName}} Backend Required": "{{webUIName}} बैकएंड आवश्यक", "{{webUIName}} Backend Required": "{{webUIName}} बैकएंड आवश्यक",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "चैट और वेब खोज क्वेरी के लिए शीर्षक उत्पन्न करने जैसे कार्य करते समय कार्य मॉडल का उपयोग किया जाता है", "A task model is used when performing tasks such as generating titles for chats and web search queries": "चैट और वेब खोज क्वेरी के लिए शीर्षक उत्पन्न करने जैसे कार्य करते समय कार्य मॉडल का उपयोग किया जाता है",
"a user": "एक उपयोगकर्ता", "a user": "एक उपयोगकर्ता",
"About": "हमारे बारे में", "About": "हमारे बारे में",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "उफ़! ऐसा लगता है कि यूआरएल अमान्य है. कृपया दोबारा जांचें और पुनः प्रयास करें।", "Oops! Looks like the URL is invalid. Please double-check and try again.": "उफ़! ऐसा लगता है कि यूआरएल अमान्य है. कृपया दोबारा जांचें और पुनः प्रयास करें।",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "उफ़! आप एक असमर्थित विधि (केवल फ्रंटएंड) का उपयोग कर रहे हैं। कृपया बैकएंड से WebUI सर्वे करें।", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "उफ़! आप एक असमर्थित विधि (केवल फ्रंटएंड) का उपयोग कर रहे हैं। कृपया बैकएंड से WebUI सर्वे करें।",
"Open file": "",
"Open new chat": "नई चैट खोलें", "Open new chat": "नई चैट खोलें",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "अन्य", "Other": "अन्य",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "पासवर्ड", "Password": "पासवर्ड",
"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)", "PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)", "PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "सादा पाठ (.txt)", "Plain text (.txt)": "सादा पाठ (.txt)",
"Playground": "कार्यक्षेत्र", "Playground": "कार्यक्षेत्र",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "सकारात्मक रवैया", "Positive attitude": "सकारात्मक रवैया",
"Previous 30 days": "पिछले 30 दिन", "Previous 30 days": "पिछले 30 दिन",
"Previous 7 days": "पिछले 7 दिन", "Previous 7 days": "पिछले 7 दिन",
@@ -615,9 +619,9 @@
"Sign up": "साइन अप", "Sign up": "साइन अप",
"Signing in": "साइन इन हो रहा है", "Signing in": "साइन इन हो रहा है",
"Source": "स्रोत", "Source": "स्रोत",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}", "Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}",
"Speech-to-Text Engine": "वाक्-से-पाठ इंजन", "Speech-to-Text Engine": "वाक्-से-पाठ इंजन",
"Speed Rate": "",
"Stop Sequence": "अनुक्रम रोकें", "Stop Sequence": "अनुक्रम रोकें",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "अपडेट करें और लिंक कॉपी करें", "Update and Copy Link": "अपडेट करें और लिंक कॉपी करें",
"Update for the latest features and improvements.": "",
"Update password": "पासवर्ड अपडेट करें", "Update password": "पासवर्ड अपडेट करें",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Razgovori korisnika {{user}}", "{{user}}'s Chats": "Razgovori korisnika {{user}}",
"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban", "{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadatka koristi se pri izvođenju zadataka kao što su generiranje naslova za razgovore i upite za pretraživanje weba", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadatka koristi se pri izvođenju zadataka kao što su generiranje naslova za razgovore i upite za pretraživanje weba",
"a user": "korisnik", "a user": "korisnik",
"About": "O aplikaciji", "About": "O aplikaciji",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Izgleda da je URL nevažeći. Molimo provjerite ponovno i pokušajte ponovo.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Izgleda da je URL nevažeći. Molimo provjerite ponovno i pokušajte ponovo.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Koristite nepodržanu metodu (samo frontend). Molimo poslužite WebUI s backend-a.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Koristite nepodržanu metodu (samo frontend). Molimo poslužite WebUI s backend-a.",
"Open file": "",
"Open new chat": "Otvorite novi razgovor", "Open new chat": "Otvorite novi razgovor",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Ostalo", "Other": "Ostalo",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Lozinka", "Password": "Lozinka",
"PDF document (.pdf)": "PDF dokument (.pdf)", "PDF document (.pdf)": "PDF dokument (.pdf)",
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)", "PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Običan tekst (.txt)", "Plain text (.txt)": "Običan tekst (.txt)",
"Playground": "Igralište", "Playground": "Igralište",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Pozitivan stav", "Positive attitude": "Pozitivan stav",
"Previous 30 days": "Prethodnih 30 dana", "Previous 30 days": "Prethodnih 30 dana",
"Previous 7 days": "Prethodnih 7 dana", "Previous 7 days": "Prethodnih 7 dana",
@@ -616,9 +620,9 @@
"Sign up": "Registracija", "Sign up": "Registracija",
"Signing in": "Prijava", "Signing in": "Prijava",
"Source": "Izvor", "Source": "Izvor",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}", "Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
"Speech-to-Text Engine": "Stroj za prepoznavanje govora", "Speech-to-Text Engine": "Stroj za prepoznavanje govora",
"Speed Rate": "",
"Stop Sequence": "Zaustavi sekvencu", "Stop Sequence": "Zaustavi sekvencu",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "STT model", "STT Model": "STT model",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Ažuriraj i kopiraj vezu", "Update and Copy Link": "Ažuriraj i kopiraj vezu",
"Update for the latest features and improvements.": "",
"Update password": "Ažuriraj lozinku", "Update password": "Ažuriraj lozinku",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Obrolan {{user}}", "{{user}}'s Chats": "Obrolan {{user}}",
"{{webUIName}} Backend Required": "{{webUIName}} Diperlukan Backend", "{{webUIName}} Backend Required": "{{webUIName}} Diperlukan Backend",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan saat melakukan tugas seperti membuat judul untuk obrolan dan kueri penelusuran web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan saat melakukan tugas seperti membuat judul untuk obrolan dan kueri penelusuran web",
"a user": "seorang pengguna", "a user": "seorang pengguna",
"About": "Tentang", "About": "Tentang",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Sepertinya URL tidak valid. Mohon periksa ulang dan coba lagi.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Sepertinya URL tidak valid. Mohon periksa ulang dan coba lagi.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Ups! Ada kesalahan pada respons sebelumnya. Silakan coba lagi atau hubungi admin.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Ups! Ada kesalahan pada respons sebelumnya. Silakan coba lagi atau hubungi admin.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Anda menggunakan metode yang tidak didukung (hanya untuk frontend). Silakan sajikan WebUI dari backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Anda menggunakan metode yang tidak didukung (hanya untuk frontend). Silakan sajikan WebUI dari backend.",
"Open file": "",
"Open new chat": "Buka obrolan baru", "Open new chat": "Buka obrolan baru",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Lainnya", "Other": "Lainnya",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Kata sandi", "Password": "Kata sandi",
"PDF document (.pdf)": "Dokumen PDF (.pdf)", "PDF document (.pdf)": "Dokumen PDF (.pdf)",
"PDF Extract Images (OCR)": "Ekstrak Gambar PDF (OCR)", "PDF Extract Images (OCR)": "Ekstrak Gambar PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Teks biasa (.txt)", "Plain text (.txt)": "Teks biasa (.txt)",
"Playground": "Taman bermain", "Playground": "Taman bermain",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Sikap positif", "Positive attitude": "Sikap positif",
"Previous 30 days": "30 hari sebelumnya", "Previous 30 days": "30 hari sebelumnya",
"Previous 7 days": "7 hari sebelumnya", "Previous 7 days": "7 hari sebelumnya",
@@ -615,9 +619,9 @@
"Sign up": "Daftar", "Sign up": "Daftar",
"Signing in": "Masuk", "Signing in": "Masuk",
"Source": "Sumber", "Source": "Sumber",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Kesalahan pengenalan suara: {{error}}", "Speech recognition error: {{error}}": "Kesalahan pengenalan suara: {{error}}",
"Speech-to-Text Engine": "Mesin Pengenal Ucapan ke Teks", "Speech-to-Text Engine": "Mesin Pengenal Ucapan ke Teks",
"Speed Rate": "",
"Stop Sequence": "Hentikan Urutan", "Stop Sequence": "Hentikan Urutan",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Model STT", "STT Model": "Model STT",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "Memperbarui", "Update": "Memperbarui",
"Update and Copy Link": "Perbarui dan Salin Tautan", "Update and Copy Link": "Perbarui dan Salin Tautan",
"Update for the latest features and improvements.": "",
"Update password": "Perbarui kata sandi", "Update password": "Perbarui kata sandi",
"Updated at": "Diperbarui di", "Updated at": "Diperbarui di",
"Upload": "Unggah", "Upload": "Unggah",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} Chat", "{{user}}'s Chats": "{{user}} Chat",
"{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto", "{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modello di attività viene utilizzato durante l'esecuzione di attività come la generazione di titoli per chat e query di ricerca Web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un modello di attività viene utilizzato durante l'esecuzione di attività come la generazione di titoli per chat e query di ricerca Web",
"a user": "un utente", "a user": "un utente",
"About": "Informazioni", "About": "Informazioni",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Sembra che l'URL non sia valido. Si prega di ricontrollare e riprovare.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Sembra che l'URL non sia valido. Si prega di ricontrollare e riprovare.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Stai utilizzando un metodo non supportato (solo frontend). Si prega di servire la WebUI dal backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Stai utilizzando un metodo non supportato (solo frontend). Si prega di servire la WebUI dal backend.",
"Open file": "",
"Open new chat": "Apri nuova chat", "Open new chat": "Apri nuova chat",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Altro", "Other": "Altro",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Password", "Password": "Password",
"PDF document (.pdf)": "Documento PDF (.pdf)", "PDF document (.pdf)": "Documento PDF (.pdf)",
"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)", "PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Testo normale (.txt)", "Plain text (.txt)": "Testo normale (.txt)",
"Playground": "Terreno di gioco", "Playground": "Terreno di gioco",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Attitudine positiva", "Positive attitude": "Attitudine positiva",
"Previous 30 days": "Ultimi 30 giorni", "Previous 30 days": "Ultimi 30 giorni",
"Previous 7 days": "Ultimi 7 giorni", "Previous 7 days": "Ultimi 7 giorni",
@@ -616,9 +620,9 @@
"Sign up": "Registrati", "Sign up": "Registrati",
"Signing in": "Accesso in corso", "Signing in": "Accesso in corso",
"Source": "Fonte", "Source": "Fonte",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}", "Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}",
"Speech-to-Text Engine": "Motore da voce a testo", "Speech-to-Text Engine": "Motore da voce a testo",
"Speed Rate": "",
"Stop Sequence": "Sequenza di arresto", "Stop Sequence": "Sequenza di arresto",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Aggiorna e copia link", "Update and Copy Link": "Aggiorna e copia link",
"Update for the latest features and improvements.": "",
"Update password": "Aggiorna password", "Update password": "Aggiorna password",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} のチャット", "{{user}}'s Chats": "{{user}} のチャット",
"{{webUIName}} Backend Required": "{{webUIName}} バックエンドが必要です", "{{webUIName}} Backend Required": "{{webUIName}} バックエンドが必要です",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "タスクモデルは、チャットやWeb検索クエリのタイトルの生成などのタスクを実行するときに使用されます", "A task model is used when performing tasks such as generating titles for chats and web search queries": "タスクモデルは、チャットやWeb検索クエリのタイトルの生成などのタスクを実行するときに使用されます",
"a user": "ユーザー", "a user": "ユーザー",
"About": "概要", "About": "概要",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "おっと! URL が無効なようです。もう一度確認してやり直してください。", "Oops! Looks like the URL is invalid. Please double-check and try again.": "おっと! URL が無効なようです。もう一度確認してやり直してください。",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "おっと! サポートされていない方法 (フロントエンドのみ) を使用しています。バックエンドから WebUI を提供してください。", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "おっと! サポートされていない方法 (フロントエンドのみ) を使用しています。バックエンドから WebUI を提供してください。",
"Open file": "",
"Open new chat": "新しいチャットを開く", "Open new chat": "新しいチャットを開く",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "その他", "Other": "その他",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "パスワード", "Password": "パスワード",
"PDF document (.pdf)": "PDF ドキュメント (.pdf)", "PDF document (.pdf)": "PDF ドキュメント (.pdf)",
"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)", "PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "プレーンテキスト (.txt)", "Plain text (.txt)": "プレーンテキスト (.txt)",
"Playground": "プレイグラウンド", "Playground": "プレイグラウンド",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "陽気な態度", "Positive attitude": "陽気な態度",
"Previous 30 days": "前の30日間", "Previous 30 days": "前の30日間",
"Previous 7 days": "前の7日間", "Previous 7 days": "前の7日間",
@@ -614,9 +618,9 @@
"Sign up": "サインアップ", "Sign up": "サインアップ",
"Signing in": "サインイン中", "Signing in": "サインイン中",
"Source": "ソース", "Source": "ソース",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "音声認識エラー: {{error}}", "Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
"Speech-to-Text Engine": "音声テキスト変換エンジン", "Speech-to-Text Engine": "音声テキスト変換エンジン",
"Speed Rate": "",
"Stop Sequence": "ストップシーケンス", "Stop Sequence": "ストップシーケンス",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -698,6 +702,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "リンクの更新とコピー", "Update and Copy Link": "リンクの更新とコピー",
"Update for the latest features and improvements.": "",
"Update password": "パスワードを更新", "Update password": "パスワードを更新",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}-ის ჩათები", "{{user}}'s Chats": "{{user}}-ის ჩათები",
"{{webUIName}} Backend Required": "{{webUIName}} საჭიროა ბექენდი", "{{webUIName}} Backend Required": "{{webUIName}} საჭიროა ბექენდი",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "დავალების მოდელი გამოიყენება ისეთი ამოცანების შესრულებისას, როგორიცაა ჩეთების სათაურების გენერირება და ვებ – ძიების მოთხოვნები", "A task model is used when performing tasks such as generating titles for chats and web search queries": "დავალების მოდელი გამოიყენება ისეთი ამოცანების შესრულებისას, როგორიცაა ჩეთების სათაურების გენერირება და ვებ – ძიების მოთხოვნები",
"a user": "მომხმარებელი", "a user": "მომხმარებელი",
"About": "შესახებ", "About": "შესახებ",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "უი! როგორც ჩანს, მისამართი არასწორია. გთხოვთ, გადაამოწმოთ და ისევ სცადოთ.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "უი! როგორც ჩანს, მისამართი არასწორია. გთხოვთ, გადაამოწმოთ და ისევ სცადოთ.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "უპს! თქვენ იყენებთ მხარდაუჭერელ მეთოდს (მხოლოდ frontend). გთხოვთ, მოემსახუროთ WebUI-ს ბექენდიდან", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "უპს! თქვენ იყენებთ მხარდაუჭერელ მეთოდს (მხოლოდ frontend). გთხოვთ, მოემსახუროთ WebUI-ს ბექენდიდან",
"Open file": "",
"Open new chat": "ახალი მიმოწერის გახსნა", "Open new chat": "ახალი მიმოწერის გახსნა",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "სხვა", "Other": "სხვა",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "პაროლი", "Password": "პაროლი",
"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)", "PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)", "PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "ტექსტი (.txt)", "Plain text (.txt)": "ტექსტი (.txt)",
"Playground": "სათამაშო მოედანი", "Playground": "სათამაშო მოედანი",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "პოზიტიური ანგარიში", "Positive attitude": "პოზიტიური ანგარიში",
"Previous 30 days": "უკან 30 დღე", "Previous 30 days": "უკან 30 დღე",
"Previous 7 days": "უკან 7 დღე", "Previous 7 days": "უკან 7 დღე",
@@ -615,9 +619,9 @@
"Sign up": "რეგისტრაცია", "Sign up": "რეგისტრაცია",
"Signing in": "ავტორიზაცია", "Signing in": "ავტორიზაცია",
"Source": "წყარო", "Source": "წყარო",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "მეტყველების ამოცნობის შეცდომა: {{error}}", "Speech recognition error: {{error}}": "მეტყველების ამოცნობის შეცდომა: {{error}}",
"Speech-to-Text Engine": "ხმოვან-ტექსტური ძრავი", "Speech-to-Text Engine": "ხმოვან-ტექსტური ძრავი",
"Speed Rate": "",
"Stop Sequence": "შეჩერების თანმიმდევრობა", "Stop Sequence": "შეჩერების თანმიმდევრობა",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "განახლება და ბმულის კოპირება", "Update and Copy Link": "განახლება და ბმულის კოპირება",
"Update for the latest features and improvements.": "",
"Update password": "პაროლის განახლება", "Update password": "პაროლის განახლება",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}의 채팅", "{{user}}'s Chats": "{{user}}의 채팅",
"{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.", "{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "작업 모델은 채팅 및 웹 검색 쿼리에 대한 제목 생성 등의 작업 수행 시 사용됩니다.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "작업 모델은 채팅 및 웹 검색 쿼리에 대한 제목 생성 등의 작업 수행 시 사용됩니다.",
"a user": "사용자", "a user": "사용자",
"About": "정보", "About": "정보",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "이런! URL이 잘못된 것 같습니다. 다시 한번 확인하고 다시 시도해주세요.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "이런! URL이 잘못된 것 같습니다. 다시 한번 확인하고 다시 시도해주세요.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "이런! 지원되지 않는 방식(프론트엔드만)을 사용하고 계십니다. 백엔드에서 WebUI를 제공해주세요.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "이런! 지원되지 않는 방식(프론트엔드만)을 사용하고 계십니다. 백엔드에서 WebUI를 제공해주세요.",
"Open file": "",
"Open new chat": "새 채팅 열기", "Open new chat": "새 채팅 열기",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "기타", "Other": "기타",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "비밀번호", "Password": "비밀번호",
"PDF document (.pdf)": "PDF 문서(.pdf)", "PDF document (.pdf)": "PDF 문서(.pdf)",
"PDF Extract Images (OCR)": "PDF 이미지 추출(OCR)", "PDF Extract Images (OCR)": "PDF 이미지 추출(OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "일반 텍스트(.txt)", "Plain text (.txt)": "일반 텍스트(.txt)",
"Playground": "놀이터", "Playground": "놀이터",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "긍정적인 자세", "Positive attitude": "긍정적인 자세",
"Previous 30 days": "이전 30일", "Previous 30 days": "이전 30일",
"Previous 7 days": "이전 7일", "Previous 7 days": "이전 7일",
@@ -615,9 +619,9 @@
"Sign up": "가입", "Sign up": "가입",
"Signing in": "로그인 중", "Signing in": "로그인 중",
"Source": "출처", "Source": "출처",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "음성 인식 오류: {{error}}", "Speech recognition error: {{error}}": "음성 인식 오류: {{error}}",
"Speech-to-Text Engine": "음성-텍스트 변환 엔진", "Speech-to-Text Engine": "음성-텍스트 변환 엔진",
"Speed Rate": "",
"Stop Sequence": "중지 시퀀스", "Stop Sequence": "중지 시퀀스",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "STT 모델", "STT Model": "STT 모델",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "업데이트", "Update": "업데이트",
"Update and Copy Link": "링크 업데이트 및 복사", "Update and Copy Link": "링크 업데이트 및 복사",
"Update for the latest features and improvements.": "",
"Update password": "비밀번호 업데이트", "Update password": "비밀번호 업데이트",
"Updated at": "다음에 업데이트됨", "Updated at": "다음에 업데이트됨",
"Upload": "업로드", "Upload": "업로드",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} susirašinėjimai", "{{user}}'s Chats": "{{user}} susirašinėjimai",
"{{webUIName}} Backend Required": "{{webUIName}} būtinas serveris", "{{webUIName}} Backend Required": "{{webUIName}} būtinas serveris",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Užduočių modelis naudojamas pokalbių pavadinimų ir paieškos užklausų generavimui.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Užduočių modelis naudojamas pokalbių pavadinimų ir paieškos užklausų generavimui.",
"a user": "naudotojas", "a user": "naudotojas",
"About": "Apie", "About": "Apie",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Regis nuoroda nevalidi. Prašau patikrtinkite ir pabandykite iš naujo.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Regis nuoroda nevalidi. Prašau patikrtinkite ir pabandykite iš naujo.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Įvyko klaida. Pabandykite iš naujo arba susisiekite su administratoriumi.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Įvyko klaida. Pabandykite iš naujo arba susisiekite su administratoriumi.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Naudojate nepalaikomą (front-end) web ui rėžimą. Prašau serviruokite WebUI iš back-end", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Naudojate nepalaikomą (front-end) web ui rėžimą. Prašau serviruokite WebUI iš back-end",
"Open file": "",
"Open new chat": "Atverti naują pokalbį", "Open new chat": "Atverti naują pokalbį",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Tortue Chat versija per sena. Reikalinga (v{{REQUIRED_VERSION}}) versija.", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Tortue Chat versija per sena. Reikalinga (v{{REQUIRED_VERSION}}) versija.",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Kita", "Other": "Kita",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Slaptažodis", "Password": "Slaptažodis",
"PDF document (.pdf)": "PDF dokumentas (.pdf)", "PDF document (.pdf)": "PDF dokumentas (.pdf)",
"PDF Extract Images (OCR)": "PDF paveikslėlių skaitymas (OCR)", "PDF Extract Images (OCR)": "PDF paveikslėlių skaitymas (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Grynas tekstas (.txt)", "Plain text (.txt)": "Grynas tekstas (.txt)",
"Playground": "Eksperimentavimo erdvė", "Playground": "Eksperimentavimo erdvė",
"Please carefully review the following warnings:": "Peržiūrėkite šiuos perspėjimus:", "Please carefully review the following warnings:": "Peržiūrėkite šiuos perspėjimus:",
"Please select a reason": "",
"Positive attitude": "Pozityvus elgesys", "Positive attitude": "Pozityvus elgesys",
"Previous 30 days": "Paskutinės 30 dienų", "Previous 30 days": "Paskutinės 30 dienų",
"Previous 7 days": "Paskutinės 7 dienos", "Previous 7 days": "Paskutinės 7 dienos",
@@ -617,9 +621,9 @@
"Sign up": "Sukurti paskyrą", "Sign up": "Sukurti paskyrą",
"Signing in": "Prisijungiama", "Signing in": "Prisijungiama",
"Source": "Šaltinis", "Source": "Šaltinis",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Balso atpažinimo problema: {{error}}", "Speech recognition error: {{error}}": "Balso atpažinimo problema: {{error}}",
"Speech-to-Text Engine": "Balso atpažinimo modelis", "Speech-to-Text Engine": "Balso atpažinimo modelis",
"Speed Rate": "",
"Stop Sequence": "Baigt sekvenciją", "Stop Sequence": "Baigt sekvenciją",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "STT modelis", "STT Model": "STT modelis",
@@ -701,6 +705,7 @@
"Unpin": "Atsemigti", "Unpin": "Atsemigti",
"Update": "Atnaujinti", "Update": "Atnaujinti",
"Update and Copy Link": "Atnaujinti ir kopijuoti nuorodą", "Update and Copy Link": "Atnaujinti ir kopijuoti nuorodą",
"Update for the latest features and improvements.": "",
"Update password": "Atnaujinti slaptažodį", "Update password": "Atnaujinti slaptažodį",
"Updated at": "Atnaujinta", "Updated at": "Atnaujinta",
"Upload": "Atnaujinti", "Upload": "Atnaujinti",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Perbualan {{user}}", "{{user}}'s Chats": "Perbualan {{user}}",
"{{webUIName}} Backend Required": "{{webUIName}} Backend diperlukan", "{{webUIName}} Backend Required": "{{webUIName}} Backend diperlukan",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan semasa melaksanakan tugas seperti menjana tajuk untuk perbualan dan pertanyaan carian web.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan semasa melaksanakan tugas seperti menjana tajuk untuk perbualan dan pertanyaan carian web.",
"a user": "seorang pengguna", "a user": "seorang pengguna",
"About": "Mengenai", "About": "Mengenai",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Maaf, didapati URL tidak sah. Sila semak semula dan cuba lagi.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Maaf, didapati URL tidak sah. Sila semak semula dan cuba lagi.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Maaf, terdapat ralat dalam respons sebelumnya. Sila cuba lagi atau hubungi pentadbir", "Oops! There was an error in the previous response. Please try again or contact admin.": "Maaf, terdapat ralat dalam respons sebelumnya. Sila cuba lagi atau hubungi pentadbir",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Maaf, Anda menggunakan kaedah yang tidak disokong (bahagian 'frontend' sahaja). Sila sediakan WebUI dari 'backend'.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Maaf, Anda menggunakan kaedah yang tidak disokong (bahagian 'frontend' sahaja). Sila sediakan WebUI dari 'backend'.",
"Open file": "",
"Open new chat": "Buka perbualan baru", "Open new chat": "Buka perbualan baru",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) adalah lebih rendah daripada versi yang diperlukan iaitu (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) adalah lebih rendah daripada versi yang diperlukan iaitu (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Lain-lain", "Other": "Lain-lain",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Kata Laluan", "Password": "Kata Laluan",
"PDF document (.pdf)": "Dokumen PDF (.pdf)", "PDF document (.pdf)": "Dokumen PDF (.pdf)",
"PDF Extract Images (OCR)": "Imej Ekstrak PDF (OCR)", "PDF Extract Images (OCR)": "Imej Ekstrak PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Teks biasa (.txt)", "Plain text (.txt)": "Teks biasa (.txt)",
"Playground": "Taman Permainan", "Playground": "Taman Permainan",
"Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:", "Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:",
"Please select a reason": "",
"Positive attitude": "Sikap positif", "Positive attitude": "Sikap positif",
"Previous 30 days": "30 hari sebelumnya", "Previous 30 days": "30 hari sebelumnya",
"Previous 7 days": "7 hari sebelumnya", "Previous 7 days": "7 hari sebelumnya",
@@ -615,9 +619,9 @@
"Sign up": "Daftar", "Sign up": "Daftar",
"Signing in": "Sedang Mendaftar", "Signing in": "Sedang Mendaftar",
"Source": "Sumber", "Source": "Sumber",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Ralat pengecaman pertuturan: {{error}}", "Speech recognition error: {{error}}": "Ralat pengecaman pertuturan: {{error}}",
"Speech-to-Text Engine": "Enjin Ucapan-ke-Teks", "Speech-to-Text Engine": "Enjin Ucapan-ke-Teks",
"Speed Rate": "",
"Stop Sequence": "Jujukan Henti", "Stop Sequence": "Jujukan Henti",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Model STT", "STT Model": "Model STT",
@@ -699,6 +703,7 @@
"Unpin": "Nyahsematkan", "Unpin": "Nyahsematkan",
"Update": "Kemaskini", "Update": "Kemaskini",
"Update and Copy Link": "Kemaskini dan salin pautan", "Update and Copy Link": "Kemaskini dan salin pautan",
"Update for the latest features and improvements.": "",
"Update password": "Kemaskini Kata Laluan", "Update password": "Kemaskini Kata Laluan",
"Updated at": "Dikemaskini pada", "Updated at": "Dikemaskini pada",
"Upload": "Muatnaik", "Upload": "Muatnaik",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}s samtaler", "{{user}}'s Chats": "{{user}}s samtaler",
"{{webUIName}} Backend Required": "{{webUIName}} Backend kreves", "{{webUIName}} Backend Required": "{{webUIName}} Backend kreves",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "En oppgavemodell brukes når du utfører oppgaver som å generere titler for samtaler og websøkeforespørsler", "A task model is used when performing tasks such as generating titles for chats and web search queries": "En oppgavemodell brukes når du utfører oppgaver som å generere titler for samtaler og websøkeforespørsler",
"a user": "en bruker", "a user": "en bruker",
"About": "Om", "About": "Om",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Ser ut som URL-en er ugyldig. Vennligst dobbeltsjekk og prøv igjen.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Ser ut som URL-en er ugyldig. Vennligst dobbeltsjekk og prøv igjen.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops! Det oppstod en feil i forrige svar. Prøv igjen eller kontakt administrator", "Oops! There was an error in the previous response. Please try again or contact admin.": "Oops! Det oppstod en feil i forrige svar. Prøv igjen eller kontakt administrator",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Du bruker en ikke-støttet metode (kun frontend). Vennligst server WebUI fra backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Du bruker en ikke-støttet metode (kun frontend). Vennligst server WebUI fra backend.",
"Open file": "",
"Open new chat": "Åpne ny chat", "Open new chat": "Åpne ny chat",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI-versjon (v{{OPEN_WEBUI_VERSION}}) er lavere enn nødvendig versjon (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI-versjon (v{{OPEN_WEBUI_VERSION}}) er lavere enn nødvendig versjon (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Annet", "Other": "Annet",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Passord", "Password": "Passord",
"PDF document (.pdf)": "PDF-dokument (.pdf)", "PDF document (.pdf)": "PDF-dokument (.pdf)",
"PDF Extract Images (OCR)": "PDF-ekstraktbilder (OCR)", "PDF Extract Images (OCR)": "PDF-ekstraktbilder (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Ren tekst (.txt)", "Plain text (.txt)": "Ren tekst (.txt)",
"Playground": "Lekeplass", "Playground": "Lekeplass",
"Please carefully review the following warnings:": "Vær vennlig å lese gjennom følgende advarsler grundig:", "Please carefully review the following warnings:": "Vær vennlig å lese gjennom følgende advarsler grundig:",
"Please select a reason": "",
"Positive attitude": "Positiv holdning", "Positive attitude": "Positiv holdning",
"Previous 30 days": "Forrige 30 dager", "Previous 30 days": "Forrige 30 dager",
"Previous 7 days": "Forrige 7 dager", "Previous 7 days": "Forrige 7 dager",
@@ -615,9 +619,9 @@
"Sign up": "Registrer deg", "Sign up": "Registrer deg",
"Signing in": "Logger inn", "Signing in": "Logger inn",
"Source": "Kilde", "Source": "Kilde",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}", "Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}",
"Speech-to-Text Engine": "Tale-til-tekst-motor", "Speech-to-Text Engine": "Tale-til-tekst-motor",
"Speed Rate": "",
"Stop Sequence": "Stoppsekvens", "Stop Sequence": "Stoppsekvens",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "STT-modell", "STT Model": "STT-modell",
@@ -699,6 +703,7 @@
"Unpin": "Løsne", "Unpin": "Løsne",
"Update": "Oppdater", "Update": "Oppdater",
"Update and Copy Link": "Oppdater og kopier lenke", "Update and Copy Link": "Oppdater og kopier lenke",
"Update for the latest features and improvements.": "",
"Update password": "Oppdater passord", "Update password": "Oppdater passord",
"Updated at": "Oppdatert", "Updated at": "Oppdatert",
"Upload": "Last opp", "Upload": "Last opp",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}'s Chats", "{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Verlpicht", "{{webUIName}} Backend Required": "{{webUIName}} Backend Verlpicht",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Een taakmodel wordt gebruikt bij het uitvoeren van taken zoals het genereren van titels voor chats en zoekopdrachten op internet", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Een taakmodel wordt gebruikt bij het uitvoeren van taken zoals het genereren van titels voor chats en zoekopdrachten op internet",
"a user": "een gebruiker", "a user": "een gebruiker",
"About": "Over", "About": "Over",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Het lijkt erop dat de URL ongeldig is. Controleer het nogmaals en probeer opnieuw.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Het lijkt erop dat de URL ongeldig is. Controleer het nogmaals en probeer opnieuw.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.",
"Open file": "",
"Open new chat": "Open nieuwe chat", "Open new chat": "Open nieuwe chat",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Andere", "Other": "Andere",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Wachtwoord", "Password": "Wachtwoord",
"PDF document (.pdf)": "PDF document (.pdf)", "PDF document (.pdf)": "PDF document (.pdf)",
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)", "PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Platte tekst (.txt)", "Plain text (.txt)": "Platte tekst (.txt)",
"Playground": "Speeltuin", "Playground": "Speeltuin",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Positieve positie", "Positive attitude": "Positieve positie",
"Previous 30 days": "Vorige 30 dagen", "Previous 30 days": "Vorige 30 dagen",
"Previous 7 days": "Vorige 7 dagen", "Previous 7 days": "Vorige 7 dagen",
@@ -615,9 +619,9 @@
"Sign up": "Registreren", "Sign up": "Registreren",
"Signing in": "Aanmelden", "Signing in": "Aanmelden",
"Source": "Bron", "Source": "Bron",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}", "Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}",
"Speech-to-Text Engine": "Spraak-naar-tekst Engine", "Speech-to-Text Engine": "Spraak-naar-tekst Engine",
"Speed Rate": "",
"Stop Sequence": "Stop Sequentie", "Stop Sequence": "Stop Sequentie",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Update en Kopieer Link", "Update and Copy Link": "Update en Kopieer Link",
"Update for the latest features and improvements.": "",
"Update password": "Wijzig wachtwoord", "Update password": "Wijzig wachtwoord",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} ਦੀਆਂ ਗੱਲਾਂ", "{{user}}'s Chats": "{{user}} ਦੀਆਂ ਗੱਲਾਂ",
"{{webUIName}} Backend Required": "{{webUIName}} ਬੈਕਐਂਡ ਲੋੜੀਂਦਾ ਹੈ", "{{webUIName}} Backend Required": "{{webUIName}} ਬੈਕਐਂਡ ਲੋੜੀਂਦਾ ਹੈ",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "ਚੈਟਾਂ ਅਤੇ ਵੈੱਬ ਖੋਜ ਪੁੱਛਗਿੱਛਾਂ ਵਾਸਤੇ ਸਿਰਲੇਖ ਤਿਆਰ ਕਰਨ ਵਰਗੇ ਕਾਰਜ ਾਂ ਨੂੰ ਕਰਦੇ ਸਮੇਂ ਇੱਕ ਕਾਰਜ ਮਾਡਲ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ", "A task model is used when performing tasks such as generating titles for chats and web search queries": "ਚੈਟਾਂ ਅਤੇ ਵੈੱਬ ਖੋਜ ਪੁੱਛਗਿੱਛਾਂ ਵਾਸਤੇ ਸਿਰਲੇਖ ਤਿਆਰ ਕਰਨ ਵਰਗੇ ਕਾਰਜ ਾਂ ਨੂੰ ਕਰਦੇ ਸਮੇਂ ਇੱਕ ਕਾਰਜ ਮਾਡਲ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾਂਦੀ ਹੈ",
"a user": "ਇੱਕ ਉਪਭੋਗਤਾ", "a user": "ਇੱਕ ਉਪਭੋਗਤਾ",
"About": "ਬਾਰੇ", "About": "ਬਾਰੇ",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "ਓਹੋ! ਲੱਗਦਾ ਹੈ ਕਿ URL ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", "Oops! Looks like the URL is invalid. Please double-check and try again.": "ਓਹੋ! ਲੱਗਦਾ ਹੈ ਕਿ URL ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "ਓਹੋ! ਤੁਸੀਂ ਇੱਕ ਅਣਸਮਰਥਿਤ ਢੰਗ ਵਰਤ ਰਹੇ ਹੋ (ਸਿਰਫ਼ ਫਰੰਟਐਂਡ)। ਕਿਰਪਾ ਕਰਕੇ ਵੈਬਯੂਆਈ ਨੂੰ ਬੈਕਐਂਡ ਤੋਂ ਸਰਵ ਕਰੋ।", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "ਓਹੋ! ਤੁਸੀਂ ਇੱਕ ਅਣਸਮਰਥਿਤ ਢੰਗ ਵਰਤ ਰਹੇ ਹੋ (ਸਿਰਫ਼ ਫਰੰਟਐਂਡ)। ਕਿਰਪਾ ਕਰਕੇ ਵੈਬਯੂਆਈ ਨੂੰ ਬੈਕਐਂਡ ਤੋਂ ਸਰਵ ਕਰੋ।",
"Open file": "",
"Open new chat": "ਨਵੀਂ ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ", "Open new chat": "ਨਵੀਂ ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "ਓਪਨਏਆਈ", "OpenAI": "ਓਪਨਏਆਈ",
@@ -476,6 +478,7 @@
"Other": "ਹੋਰ", "Other": "ਹੋਰ",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "ਪਾਸਵਰਡ", "Password": "ਪਾਸਵਰਡ",
"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)", "PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)", "PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "ਸਧਾਰਨ ਪਾਠ (.txt)", "Plain text (.txt)": "ਸਧਾਰਨ ਪਾਠ (.txt)",
"Playground": "ਖੇਡ ਦਾ ਮੈਦਾਨ", "Playground": "ਖੇਡ ਦਾ ਮੈਦਾਨ",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "ਸਕਾਰਾਤਮਕ ਰਵੱਈਆ", "Positive attitude": "ਸਕਾਰਾਤਮਕ ਰਵੱਈਆ",
"Previous 30 days": "ਪਿਛਲੇ 30 ਦਿਨ", "Previous 30 days": "ਪਿਛਲੇ 30 ਦਿਨ",
"Previous 7 days": "ਪਿਛਲੇ 7 ਦਿਨ", "Previous 7 days": "ਪਿਛਲੇ 7 ਦਿਨ",
@@ -615,9 +619,9 @@
"Sign up": "ਰਜਿਸਟਰ ਕਰੋ", "Sign up": "ਰਜਿਸਟਰ ਕਰੋ",
"Signing in": "ਸਾਈਨ ਇਨ ਕਰ ਰਿਹਾ ਹੈ", "Signing in": "ਸਾਈਨ ਇਨ ਕਰ ਰਿਹਾ ਹੈ",
"Source": "ਸਰੋਤ", "Source": "ਸਰੋਤ",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "ਬੋਲ ਪਛਾਣ ਗਲਤੀ: {{error}}", "Speech recognition error: {{error}}": "ਬੋਲ ਪਛਾਣ ਗਲਤੀ: {{error}}",
"Speech-to-Text Engine": "ਬੋਲ-ਤੋਂ-ਪਾਠ ਇੰਜਣ", "Speech-to-Text Engine": "ਬੋਲ-ਤੋਂ-ਪਾਠ ਇੰਜਣ",
"Speed Rate": "",
"Stop Sequence": "ਰੋਕੋ ਕ੍ਰਮ", "Stop Sequence": "ਰੋਕੋ ਕ੍ਰਮ",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ ਲਿੰਕ ਕਾਪੀ ਕਰੋ", "Update and Copy Link": "ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
"Update for the latest features and improvements.": "",
"Update password": "ਪਾਸਵਰਡ ਅੱਪਡੇਟ ਕਰੋ", "Update password": "ਪਾਸਵਰਡ ਅੱਪਡੇਟ ਕਰੋ",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} - czaty", "{{user}}'s Chats": "{{user}} - czaty",
"{{webUIName}} Backend Required": "Backend {{webUIName}} wymagane", "{{webUIName}} Backend Required": "Backend {{webUIName}} wymagane",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadań jest używany podczas wykonywania zadań, takich jak generowanie tytułów czatów i zapytań wyszukiwania w Internecie", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Model zadań jest używany podczas wykonywania zadań, takich jak generowanie tytułów czatów i zapytań wyszukiwania w Internecie",
"a user": "użytkownik", "a user": "użytkownik",
"About": "O nas", "About": "O nas",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Wygląda na to, że URL jest nieprawidłowy. Sprawdź jeszcze raz i spróbuj ponownie.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Wygląda na to, że URL jest nieprawidłowy. Sprawdź jeszcze raz i spróbuj ponownie.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Używasz nieobsługiwanej metody (tylko interfejs front-end). Proszę obsłużyć interfejs WebUI z poziomu backendu.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Używasz nieobsługiwanej metody (tylko interfejs front-end). Proszę obsłużyć interfejs WebUI z poziomu backendu.",
"Open file": "",
"Open new chat": "Otwórz nowy czat", "Open new chat": "Otwórz nowy czat",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Inne", "Other": "Inne",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Hasło", "Password": "Hasło",
"PDF document (.pdf)": "Dokument PDF (.pdf)", "PDF document (.pdf)": "Dokument PDF (.pdf)",
"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)", "PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Zwykły tekst (.txt)", "Plain text (.txt)": "Zwykły tekst (.txt)",
"Playground": "Plac zabaw", "Playground": "Plac zabaw",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Pozytywne podejście", "Positive attitude": "Pozytywne podejście",
"Previous 30 days": "Poprzednie 30 dni", "Previous 30 days": "Poprzednie 30 dni",
"Previous 7 days": "Poprzednie 7 dni", "Previous 7 days": "Poprzednie 7 dni",
@@ -617,9 +621,9 @@
"Sign up": "Zarejestruj się", "Sign up": "Zarejestruj się",
"Signing in": "Zalogowanie", "Signing in": "Zalogowanie",
"Source": "Źródło", "Source": "Źródło",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}", "Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}",
"Speech-to-Text Engine": "Silnik mowy na tekst", "Speech-to-Text Engine": "Silnik mowy na tekst",
"Speed Rate": "",
"Stop Sequence": "Zatrzymaj sekwencję", "Stop Sequence": "Zatrzymaj sekwencję",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -701,6 +705,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Uaktualnij i skopiuj link", "Update and Copy Link": "Uaktualnij i skopiuj link",
"Update for the latest features and improvements.": "",
"Update password": "Aktualizacja hasła", "Update password": "Aktualizacja hasła",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Chats de {{user}}", "{{user}}'s Chats": "Chats de {{user}}",
"{{webUIName}} Backend Required": "Backend {{webUIName}} necessário", "{{webUIName}} Backend Required": "Backend {{webUIName}} necessário",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao realizar tarefas como gerar títulos para chats e consultas de pesquisa na web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao realizar tarefas como gerar títulos para chats e consultas de pesquisa na web",
"a user": "um usuário", "a user": "um usuário",
"About": "Sobre", "About": "Sobre",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Parece que a URL é inválida. Por favor, verifique novamente e tente de novo.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ops! Parece que a URL é inválida. Por favor, verifique novamente e tente de novo.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Ops! Houve um erro na resposta anterior. Por favor, tente novamente ou entre em contato com o administrador.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Ops! Houve um erro na resposta anterior. Por favor, tente novamente ou entre em contato com o administrador.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Você está usando um método não suportado (somente frontend). Por favor, sirva a WebUI a partir do backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ops! Você está usando um método não suportado (somente frontend). Por favor, sirva a WebUI a partir do backend.",
"Open file": "",
"Open new chat": "Abrir novo chat", "Open new chat": "Abrir novo chat",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "A versão do Open WebUI (v{{OPEN_WEBUI_VERSION}}) é inferior à versão necessária (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "A versão do Open WebUI (v{{OPEN_WEBUI_VERSION}}) é inferior à versão necessária (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Outro", "Other": "Outro",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Senha", "Password": "Senha",
"PDF document (.pdf)": "Documento PDF (.pdf)", "PDF document (.pdf)": "Documento PDF (.pdf)",
"PDF Extract Images (OCR)": "Extrair Imagens do PDF (OCR)", "PDF Extract Images (OCR)": "Extrair Imagens do PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Texto simples (.txt)", "Plain text (.txt)": "Texto simples (.txt)",
"Playground": "Playground", "Playground": "Playground",
"Please carefully review the following warnings:": "Por favor, revise cuidadosamente os seguintes avisos:", "Please carefully review the following warnings:": "Por favor, revise cuidadosamente os seguintes avisos:",
"Please select a reason": "",
"Positive attitude": "Atitude positiva", "Positive attitude": "Atitude positiva",
"Previous 30 days": "Últimos 30 dias", "Previous 30 days": "Últimos 30 dias",
"Previous 7 days": "Últimos 7 dias", "Previous 7 days": "Últimos 7 dias",
@@ -616,9 +620,9 @@
"Sign up": "Inscrever-se", "Sign up": "Inscrever-se",
"Signing in": "Entrando", "Signing in": "Entrando",
"Source": "Fonte", "Source": "Fonte",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}", "Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
"Speech-to-Text Engine": "Motor de Transcrição de Fala", "Speech-to-Text Engine": "Motor de Transcrição de Fala",
"Speed Rate": "",
"Stop Sequence": "Sequência de Parada", "Stop Sequence": "Sequência de Parada",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Modelo STT", "STT Model": "Modelo STT",
@@ -700,6 +704,7 @@
"Unpin": "Desfixar", "Unpin": "Desfixar",
"Update": "Atualizar", "Update": "Atualizar",
"Update and Copy Link": "Atualizar e Copiar Link", "Update and Copy Link": "Atualizar e Copiar Link",
"Update for the latest features and improvements.": "",
"Update password": "Atualizar senha", "Update password": "Atualizar senha",
"Updated at": "Atualizado em", "Updated at": "Atualizado em",
"Upload": "Fazer upload", "Upload": "Fazer upload",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}'s Chats", "{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário", "{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao executar tarefas como gerar títulos para bate-papos e consultas de pesquisa na Web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao executar tarefas como gerar títulos para bate-papos e consultas de pesquisa na Web",
"a user": "um utilizador", "a user": "um utilizador",
"About": "Acerca de", "About": "Acerca de",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Epá! Parece que o URL é inválido. Verifique novamente e tente outra vez.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Epá! Parece que o URL é inválido. Verifique novamente e tente outra vez.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Epá! Você está a usar um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Epá! Você está a usar um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
"Open file": "",
"Open new chat": "Abrir nova conversa", "Open new chat": "Abrir nova conversa",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Outro", "Other": "Outro",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Senha", "Password": "Senha",
"PDF document (.pdf)": "Documento PDF (.pdf)", "PDF document (.pdf)": "Documento PDF (.pdf)",
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)", "PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Texto sem formatação (.txt)", "Plain text (.txt)": "Texto sem formatação (.txt)",
"Playground": "Recreio", "Playground": "Recreio",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Atitude Positiva", "Positive attitude": "Atitude Positiva",
"Previous 30 days": "Últimos 30 dias", "Previous 30 days": "Últimos 30 dias",
"Previous 7 days": "Últimos 7 dias", "Previous 7 days": "Últimos 7 dias",
@@ -616,9 +620,9 @@
"Sign up": "Inscrever-se", "Sign up": "Inscrever-se",
"Signing in": "A entrar", "Signing in": "A entrar",
"Source": "Fonte", "Source": "Fonte",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}", "Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
"Speech-to-Text Engine": "Motor de Fala para Texto", "Speech-to-Text Engine": "Motor de Fala para Texto",
"Speed Rate": "",
"Stop Sequence": "Sequência de Paragem", "Stop Sequence": "Sequência de Paragem",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Modelo STT", "STT Model": "Modelo STT",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Atualizar e Copiar Link", "Update and Copy Link": "Atualizar e Copiar Link",
"Update for the latest features and improvements.": "",
"Update password": "Atualizar senha", "Update password": "Atualizar senha",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Conversațiile lui {{user}}", "{{user}}'s Chats": "Conversațiile lui {{user}}",
"{{webUIName}} Backend Required": "Este necesar backend-ul {{webUIName}}", "{{webUIName}} Backend Required": "Este necesar backend-ul {{webUIName}}",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Un model de sarcină este utilizat pentru realizarea unor sarcini precum generarea de titluri pentru conversații și interogări de căutare pe web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Un model de sarcină este utilizat pentru realizarea unor sarcini precum generarea de titluri pentru conversații și interogări de căutare pe web",
"a user": "un utilizator", "a user": "un utilizator",
"About": "Despre", "About": "Despre",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Se pare că URL-ul este invalid. Vă rugăm să verificați din nou și să încercați din nou.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Se pare că URL-ul este invalid. Vă rugăm să verificați din nou și să încercați din nou.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops! A apărut o eroare în răspunsul anterior. Vă rugăm să încercați din nou sau să contactați administratorul.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Oops! A apărut o eroare în răspunsul anterior. Vă rugăm să încercați din nou sau să contactați administratorul.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Utilizați o metodă nesuportată (doar frontend). Vă rugăm să serviți WebUI din backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Utilizați o metodă nesuportată (doar frontend). Vă rugăm să serviți WebUI din backend.",
"Open file": "",
"Open new chat": "Deschide conversație nouă", "Open new chat": "Deschide conversație nouă",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Versiunea Open WebUI (v{{OPEN_WEBUI_VERSION}}) este mai mică decât versiunea necesară (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Versiunea Open WebUI (v{{OPEN_WEBUI_VERSION}}) este mai mică decât versiunea necesară (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Altele", "Other": "Altele",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Parolă", "Password": "Parolă",
"PDF document (.pdf)": "Document PDF (.pdf)", "PDF document (.pdf)": "Document PDF (.pdf)",
"PDF Extract Images (OCR)": "Extrage Imagini PDF (OCR)", "PDF Extract Images (OCR)": "Extrage Imagini PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Text simplu (.txt)", "Plain text (.txt)": "Text simplu (.txt)",
"Playground": "Teren de Joacă", "Playground": "Teren de Joacă",
"Please carefully review the following warnings:": "Vă rugăm să revizuiți cu atenție următoarele avertismente:", "Please carefully review the following warnings:": "Vă rugăm să revizuiți cu atenție următoarele avertismente:",
"Please select a reason": "",
"Positive attitude": "Atitudine pozitivă", "Positive attitude": "Atitudine pozitivă",
"Previous 30 days": "Ultimele 30 de zile", "Previous 30 days": "Ultimele 30 de zile",
"Previous 7 days": "Ultimele 7 zile", "Previous 7 days": "Ultimele 7 zile",
@@ -616,9 +620,9 @@
"Sign up": "Înregistrare", "Sign up": "Înregistrare",
"Signing in": "Autentificare", "Signing in": "Autentificare",
"Source": "Sursă", "Source": "Sursă",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Eroare de recunoaștere vocală: {{error}}", "Speech recognition error: {{error}}": "Eroare de recunoaștere vocală: {{error}}",
"Speech-to-Text Engine": "Motor de Conversie a Vocii în Text", "Speech-to-Text Engine": "Motor de Conversie a Vocii în Text",
"Speed Rate": "",
"Stop Sequence": "Oprește Secvența", "Stop Sequence": "Oprește Secvența",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Model STT", "STT Model": "Model STT",
@@ -700,6 +704,7 @@
"Unpin": "Anulează Fixarea", "Unpin": "Anulează Fixarea",
"Update": "Actualizează", "Update": "Actualizează",
"Update and Copy Link": "Actualizează și Copiază Link-ul", "Update and Copy Link": "Actualizează și Copiază Link-ul",
"Update for the latest features and improvements.": "",
"Update password": "Actualizează parola", "Update password": "Actualizează parola",
"Updated at": "Actualizat la", "Updated at": "Actualizat la",
"Upload": "Încărcare", "Upload": "Încărcare",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Чаты {{user}}'а", "{{user}}'s Chats": "Чаты {{user}}'а",
"{{webUIName}} Backend Required": "Необходимо подключение к серверу {{webUIName}}", "{{webUIName}} Backend Required": "Необходимо подключение к серверу {{webUIName}}",
"*Prompt node ID(s) are required for image generation": "ID узлов промптов обязательны для генерации изображения", "*Prompt node ID(s) are required for image generation": "ID узлов промптов обязательны для генерации изображения",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач используется при выполнении таких задач, как генерация заголовков для чатов и поисковых запросов в Интернете", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач используется при выполнении таких задач, как генерация заголовков для чатов и поисковых запросов в Интернете",
"a user": "пользователь", "a user": "пользователь",
"About": "О программе", "About": "О программе",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Похоже, что URL-адрес недействителен. Пожалуйста, перепроверьте и попробуйте еще раз.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Похоже, что URL-адрес недействителен. Пожалуйста, перепроверьте и попробуйте еще раз.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Упс! В предыдущем ответе была ошибка. Пожалуйста, повторите попытку или свяжитесь с администратором.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Упс! В предыдущем ответе была ошибка. Пожалуйста, повторите попытку или свяжитесь с администратором.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Вы используете неподдерживаемый метод (только фронтенд). Пожалуйста, обслуживайте веб-интерфейс из бэкенда.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Вы используете неподдерживаемый метод (только фронтенд). Пожалуйста, обслуживайте веб-интерфейс из бэкенда.",
"Open file": "",
"Open new chat": "Открыть новый чат", "Open new chat": "Открыть новый чат",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Версия Open WebUI (v{{OPEN_WEBUI_VERSION}}) ниже требуемой версии (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Версия Open WebUI (v{{OPEN_WEBUI_VERSION}}) ниже требуемой версии (v{{REQUIRED_VERSION}})",
"OpenAI": "Open AI", "OpenAI": "Open AI",
@@ -476,6 +478,7 @@
"Other": "Прочее", "Other": "Прочее",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Пароль", "Password": "Пароль",
"PDF document (.pdf)": "PDF-документ (.pdf)", "PDF document (.pdf)": "PDF-документ (.pdf)",
"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)", "PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Текст в формате .txt", "Plain text (.txt)": "Текст в формате .txt",
"Playground": "Песочница", "Playground": "Песочница",
"Please carefully review the following warnings:": "Пожалуйста, внимательно ознакомьтесь со следующими предупреждениями:", "Please carefully review the following warnings:": "Пожалуйста, внимательно ознакомьтесь со следующими предупреждениями:",
"Please select a reason": "",
"Positive attitude": "Позитивный настрой", "Positive attitude": "Позитивный настрой",
"Previous 30 days": "Предыдущие 30 дней", "Previous 30 days": "Предыдущие 30 дней",
"Previous 7 days": "Предыдущие 7 дней", "Previous 7 days": "Предыдущие 7 дней",
@@ -617,9 +621,9 @@
"Sign up": "Зарегистрироваться", "Sign up": "Зарегистрироваться",
"Signing in": "Вход в систему", "Signing in": "Вход в систему",
"Source": "Источник", "Source": "Источник",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Ошибка распознавания речи: {{error}}", "Speech recognition error: {{error}}": "Ошибка распознавания речи: {{error}}",
"Speech-to-Text Engine": "Система распознавания речи", "Speech-to-Text Engine": "Система распознавания речи",
"Speed Rate": "",
"Stop Sequence": "Последовательность остановки", "Stop Sequence": "Последовательность остановки",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Модель распознавания речи", "STT Model": "Модель распознавания речи",
@@ -701,6 +705,7 @@
"Unpin": "Открепить", "Unpin": "Открепить",
"Update": "Обновить", "Update": "Обновить",
"Update and Copy Link": "Обновить и скопировать ссылку", "Update and Copy Link": "Обновить и скопировать ссылку",
"Update for the latest features and improvements.": "",
"Update password": "Обновить пароль", "Update password": "Обновить пароль",
"Updated at": "Обновлено", "Updated at": "Обновлено",
"Upload": "Загрузить", "Upload": "Загрузить",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Ћаскања корисника {{user}}", "{{user}}'s Chats": "Ћаскања корисника {{user}}",
"{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац", "{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Модел задатка се користи приликом извршавања задатака као што су генерисање наслова за ћаскања и упите за Веб претрагу", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Модел задатка се користи приликом извршавања задатака као што су генерисање наслова за ћаскања и упите за Веб претрагу",
"a user": "корисник", "a user": "корисник",
"About": "О нама", "About": "О нама",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изгледа да је адреса неважећа. Молимо вас да проверите и покушате поново.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изгледа да је адреса неважећа. Молимо вас да проверите и покушате поново.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Користите неподржани метод (само фронтенд). Молимо вас да покренете WebUI са бекенда.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Користите неподржани метод (само фронтенд). Молимо вас да покренете WebUI са бекенда.",
"Open file": "",
"Open new chat": "Покрени ново ћаскање", "Open new chat": "Покрени ново ћаскање",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Остало", "Other": "Остало",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Лозинка", "Password": "Лозинка",
"PDF document (.pdf)": "PDF документ (.pdf)", "PDF document (.pdf)": "PDF документ (.pdf)",
"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)", "PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Обичан текст (.txt)", "Plain text (.txt)": "Обичан текст (.txt)",
"Playground": "Игралиште", "Playground": "Игралиште",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Позитиван став", "Positive attitude": "Позитиван став",
"Previous 30 days": "Претходних 30 дана", "Previous 30 days": "Претходних 30 дана",
"Previous 7 days": "Претходних 7 дана", "Previous 7 days": "Претходних 7 дана",
@@ -616,9 +620,9 @@
"Sign up": "Региструј се", "Sign up": "Региструј се",
"Signing in": "Пријављивање", "Signing in": "Пријављивање",
"Source": "Извор", "Source": "Извор",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Грешка у препознавању говора: {{error}}", "Speech recognition error: {{error}}": "Грешка у препознавању говора: {{error}}",
"Speech-to-Text Engine": "Мотор за говор у текст", "Speech-to-Text Engine": "Мотор за говор у текст",
"Speed Rate": "",
"Stop Sequence": "Секвенца заустављања", "Stop Sequence": "Секвенца заустављања",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -700,6 +704,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Ажурирај и копирај везу", "Update and Copy Link": "Ажурирај и копирај везу",
"Update for the latest features and improvements.": "",
"Update password": "Ажурирај лозинку", "Update password": "Ажурирај лозинку",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}s Chats", "{{user}}'s Chats": "{{user}}s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Backend krävs", "{{webUIName}} Backend Required": "{{webUIName}} Backend krävs",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "En uppgiftsmodell används när du utför uppgifter som att generera titlar för chattar och webbsökningsfrågor", "A task model is used when performing tasks such as generating titles for chats and web search queries": "En uppgiftsmodell används när du utför uppgifter som att generera titlar för chattar och webbsökningsfrågor",
"a user": "en användare", "a user": "en användare",
"About": "Om", "About": "Om",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppsan! Det ser ut som om URL:en är ogiltig. Dubbelkolla gärna och försök igen.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppsan! Det ser ut som om URL:en är ogiltig. Dubbelkolla gärna och försök igen.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hoppsan! Du använder en ej stödd metod (endast frontend). Vänligen servera WebUI från backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hoppsan! Du använder en ej stödd metod (endast frontend). Vänligen servera WebUI från backend.",
"Open file": "",
"Open new chat": "Öppna ny chatt", "Open new chat": "Öppna ny chatt",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Andra", "Other": "Andra",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Lösenord", "Password": "Lösenord",
"PDF document (.pdf)": "PDF-dokument (.pdf)", "PDF document (.pdf)": "PDF-dokument (.pdf)",
"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)", "PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Text (.txt)", "Plain text (.txt)": "Text (.txt)",
"Playground": "Lekplats", "Playground": "Lekplats",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "Positivt inställning", "Positive attitude": "Positivt inställning",
"Previous 30 days": "Föregående 30 dagar", "Previous 30 days": "Föregående 30 dagar",
"Previous 7 days": "Föregående 7 dagar", "Previous 7 days": "Föregående 7 dagar",
@@ -615,9 +619,9 @@
"Sign up": "Registrera dig", "Sign up": "Registrera dig",
"Signing in": "Loggar in", "Signing in": "Loggar in",
"Source": "Källa", "Source": "Källa",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Fel vid taligenkänning: {{error}}", "Speech recognition error: {{error}}": "Fel vid taligenkänning: {{error}}",
"Speech-to-Text Engine": "Tal-till-text-motor", "Speech-to-Text Engine": "Tal-till-text-motor",
"Speed Rate": "",
"Stop Sequence": "Stoppsekvens", "Stop Sequence": "Stoppsekvens",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "Tal-till-text-modell", "STT Model": "Tal-till-text-modell",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Uppdatera och kopiera länk", "Update and Copy Link": "Uppdatera och kopiera länk",
"Update for the latest features and improvements.": "",
"Update password": "Uppdatera lösenord", "Update password": "Uppdatera lösenord",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "การสนทนาของ {{user}}", "{{user}}'s Chats": "การสนทนาของ {{user}}",
"{{webUIName}} Backend Required": "ต้องการ Backend ของ {{webUIName}}", "{{webUIName}} Backend Required": "ต้องการ Backend ของ {{webUIName}}",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "ใช้โมเดลงานเมื่อทำงานเช่นการสร้างหัวข้อสำหรับการสนทนาและการค้นหาเว็บ", "A task model is used when performing tasks such as generating titles for chats and web search queries": "ใช้โมเดลงานเมื่อทำงานเช่นการสร้างหัวข้อสำหรับการสนทนาและการค้นหาเว็บ",
"a user": "ผู้ใช้", "a user": "ผู้ใช้",
"About": "เกี่ยวกับ", "About": "เกี่ยวกับ",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "อุ๊บส์! ดูเหมือนว่า URL ไม่ถูกต้อง กรุณาตรวจสอบและลองใหม่อีกครั้ง", "Oops! Looks like the URL is invalid. Please double-check and try again.": "อุ๊บส์! ดูเหมือนว่า URL ไม่ถูกต้อง กรุณาตรวจสอบและลองใหม่อีกครั้ง",
"Oops! There was an error in the previous response. Please try again or contact admin.": "อุ๊บส์! มีข้อผิดพลาดในคำตอบก่อนหน้า กรุณาลองใหม่อีกครั้งหรือติดต่อผู้ดูแลระบบ", "Oops! There was an error in the previous response. Please try again or contact admin.": "อุ๊บส์! มีข้อผิดพลาดในคำตอบก่อนหน้า กรุณาลองใหม่อีกครั้งหรือติดต่อผู้ดูแลระบบ",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "อุ๊บส์! คุณกำลังใช้วิธีที่ไม่รองรับ (เฉพาะเว็บส่วนหน้า) กรุณาให้บริการ WebUI จากเว็บส่วนแบ็กเอนด์", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "อุ๊บส์! คุณกำลังใช้วิธีที่ไม่รองรับ (เฉพาะเว็บส่วนหน้า) กรุณาให้บริการ WebUI จากเว็บส่วนแบ็กเอนด์",
"Open file": "",
"Open new chat": "เปิดแชทใหม่", "Open new chat": "เปิดแชทใหม่",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "เวอร์ชั่น Open WebUI (v{{OPEN_WEBUI_VERSION}}) ต่ำกว่าเวอร์ชั่นที่ต้องการ (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "เวอร์ชั่น Open WebUI (v{{OPEN_WEBUI_VERSION}}) ต่ำกว่าเวอร์ชั่นที่ต้องการ (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "อื่น ๆ", "Other": "อื่น ๆ",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "รหัสผ่าน", "Password": "รหัสผ่าน",
"PDF document (.pdf)": "เอกสาร PDF (.pdf)", "PDF document (.pdf)": "เอกสาร PDF (.pdf)",
"PDF Extract Images (OCR)": "การแยกรูปภาพจาก PDF (OCR)", "PDF Extract Images (OCR)": "การแยกรูปภาพจาก PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "ไฟล์ข้อความ (.txt)", "Plain text (.txt)": "ไฟล์ข้อความ (.txt)",
"Playground": "สนามทดสอบ", "Playground": "สนามทดสอบ",
"Please carefully review the following warnings:": "โปรดตรวจสอบคำเตือนต่อไปนี้อย่างละเอียด:", "Please carefully review the following warnings:": "โปรดตรวจสอบคำเตือนต่อไปนี้อย่างละเอียด:",
"Please select a reason": "",
"Positive attitude": "ทัศนคติด้านบวก", "Positive attitude": "ทัศนคติด้านบวก",
"Previous 30 days": "30 วันที่ผ่านมา", "Previous 30 days": "30 วันที่ผ่านมา",
"Previous 7 days": "7 วันที่ผ่านมา", "Previous 7 days": "7 วันที่ผ่านมา",
@@ -615,9 +619,9 @@
"Sign up": "สมัครสมาชิก", "Sign up": "สมัครสมาชิก",
"Signing in": "กำลังลงชื่อเข้าใช้", "Signing in": "กำลังลงชื่อเข้าใช้",
"Source": "แหล่งที่มา", "Source": "แหล่งที่มา",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "ข้อผิดพลาดในการรู้จำเสียง: {{error}}", "Speech recognition error: {{error}}": "ข้อผิดพลาดในการรู้จำเสียง: {{error}}",
"Speech-to-Text Engine": "เครื่องมือแปลงเสียงเป็นข้อความ", "Speech-to-Text Engine": "เครื่องมือแปลงเสียงเป็นข้อความ",
"Speed Rate": "",
"Stop Sequence": "หยุดลำดับ", "Stop Sequence": "หยุดลำดับ",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "โมเดลแปลงเสียงเป็นข้อความ", "STT Model": "โมเดลแปลงเสียงเป็นข้อความ",
@@ -699,6 +703,7 @@
"Unpin": "ยกเลิกการปักหมุด", "Unpin": "ยกเลิกการปักหมุด",
"Update": "อัปเดต", "Update": "อัปเดต",
"Update and Copy Link": "อัปเดตและคัดลอกลิงก์", "Update and Copy Link": "อัปเดตและคัดลอกลิงก์",
"Update for the latest features and improvements.": "",
"Update password": "อัปเดตรหัสผ่าน", "Update password": "อัปเดตรหัสผ่าน",
"Updated at": "อัปเดตเมื่อ", "Updated at": "อัปเดตเมื่อ",
"Upload": "อัปโหลด", "Upload": "อัปโหลด",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "", "{{user}}'s Chats": "",
"{{webUIName}} Backend Required": "", "{{webUIName}} Backend Required": "",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "", "A task model is used when performing tasks such as generating titles for chats and web search queries": "",
"a user": "", "a user": "",
"About": "", "About": "",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "", "Oops! Looks like the URL is invalid. Please double-check and try again.": "",
"Oops! There was an error in the previous response. Please try again or contact admin.": "", "Oops! There was an error in the previous response. Please try again or contact admin.": "",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "",
"Open file": "",
"Open new chat": "", "Open new chat": "",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
@@ -476,6 +478,7 @@
"Other": "", "Other": "",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "", "Password": "",
"PDF document (.pdf)": "", "PDF document (.pdf)": "",
"PDF Extract Images (OCR)": "", "PDF Extract Images (OCR)": "",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "", "Playground": "",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "",
"Please select a reason": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -615,9 +619,9 @@
"Sign up": "", "Sign up": "",
"Signing in": "", "Signing in": "",
"Source": "", "Source": "",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "", "Speech recognition error: {{error}}": "",
"Speech-to-Text Engine": "", "Speech-to-Text Engine": "",
"Speed Rate": "",
"Stop Sequence": "", "Stop Sequence": "",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -699,6 +703,7 @@
"Unpin": "", "Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update for the latest features and improvements.": "",
"Update password": "", "Update password": "",
"Updated at": "", "Updated at": "",
"Upload": "", "Upload": "",
+120 -115
View File
@@ -1,37 +1,38 @@
{ {
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' veya süresiz için '-1'.", "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' veya süresiz için '-1'.",
"(Beta)": "(Beta)", "(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(e.g. `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api --api-auth username_password`)": "(örn. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(örn. `sh webui.sh --api`)", "(e.g. `sh webui.sh --api`)": "(örn. `sh webui.sh --api`)",
"(latest)": "(en son)", "(latest)": "(en son)",
"{{ models }}": "{{ models }}", "{{ models }}": "{{ models }}",
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Temel modeli silemezsiniz", "{{ owner }}: You cannot delete a base model": "{{ owner }}: Temel modeli silemezsiniz",
"{{user}}'s Chats": "{{user}} Sohbetleri", "{{user}}'s Chats": "{{user}}'ın Sohbetleri",
"{{webUIName}} Backend Required": "{{webUIName}} Arkayüz Gerekli", "{{webUIName}} Backend Required": "{{webUIName}} Arka-uç Gerekli",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "*Görüntü oluşturma için düğüm kimlikleri gereklidir",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Bir görev modeli, sohbetler ve web arama sorguları için başlık oluşturma gibi görevleri yerine getirirken kullanılır", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Bir görev modeli, sohbetler ve web arama sorguları için başlık oluşturma gibi görevleri yerine getirirken kullanılır",
"a user": "bir kullanıcı", "a user": "bir kullanıcı",
"About": "Hakkında", "About": "Hakkında",
"Account": "Hesap", "Account": "Hesap",
"Account Activation Pending": "Hesap Aktivasyonu Bekleniyor", "Account Activation Pending": "Hesap Aktivasyonu Bekleniyor",
"Accurate information": "Doğru bilgi", "Accurate information": "Doğru bilgi",
"Actions": "", "Actions": "Aksiyonlar",
"Active Users": "Aktif Kullanıcılar", "Active Users": "Aktif Kullanıcılar",
"Add": "Ekle", "Add": "Ekle",
"Add a model id": "Model id ekle", "Add a model id": "Bir model id ekle",
"Add a short description about what this model does": "Bu modelin ne yaptığı hakkında kısa bir açıklama ekle", "Add a short description about what this model does": "Bu modelin ne yaptığı hakkında kısa bir açıklama ekleyin",
"Add a short title for this prompt": "Bu prompt için kısa bir başlık ekleyin", "Add a short title for this prompt": "Bu prompt için kısa bir başlık ekleyin",
"Add a tag": "Bir etiket ekleyin", "Add a tag": "Bir etiket ekleyin",
"Add custom prompt": "Özel prompt ekle", "Add custom prompt": "Özel prompt ekleyin",
"Add Docs": "Dökümanlar Ekle", "Add Docs": "Belgeler Ekle",
"Add Files": "Dosyalar Ekle", "Add Files": "Dosyalar Ekle",
"Add Memory": "Bellek Ekle", "Add Memory": "Bellek Ekle",
"Add message": "Mesaj ekle", "Add message": "Mesaj Ekle",
"Add Model": "Model Ekle", "Add Model": "Model Ekle",
"Add Tag": "", "Add Tag": "Etiket Ekle",
"Add Tags": "Etiketler ekle", "Add Tags": "Etiketler Ekle",
"Add User": "Kullanıcı Ekle", "Add User": "Kullanıcı Ekle",
"Adjusting these settings will apply changes universally to all users.": "Bu ayarları ayarlamak değişiklikleri tüm kullanıcılara evrensel olarak uygular.", "Adjusting these settings will apply changes universally to all users.": "Bu ayarların yapılması, değişiklikleri tüm kullanıcılara evrensel olarak uygulayacaktır.",
"admin": "yönetici", "admin": "yönetici",
"Admin": "Yönetici", "Admin": "Yönetici",
"Admin Panel": "Yönetici Paneli", "Admin Panel": "Yönetici Paneli",
@@ -44,9 +45,9 @@
"All Users": "Tüm Kullanıcılar", "All Users": "Tüm Kullanıcılar",
"Allow": "İzin ver", "Allow": "İzin ver",
"Allow Chat Deletion": "Sohbet Silmeye İzin Ver", "Allow Chat Deletion": "Sohbet Silmeye İzin Ver",
"Allow Chat Editing": "", "Allow Chat Editing": "Soğbet Düzenlemeye İzin Ver",
"Allow non-local voices": "Yerel olmayan seslere izin verin", "Allow non-local voices": "Yerel olmayan seslere izin verin",
"Allow Temporary Chat": "", "Allow Temporary Chat": "Geçici Sohbetlere İzin Ver",
"Allow User Location": "Kullanıcı Konumuna İzin Ver", "Allow User Location": "Kullanıcı Konumuna İzin Ver",
"Allow Voice Interruption in Call": "Aramada Ses Kesintisine İzin Ver", "Allow Voice Interruption in Call": "Aramada Ses Kesintisine İzin Ver",
"alphanumeric characters and hyphens": "alfanumerik karakterler ve tireler", "alphanumeric characters and hyphens": "alfanumerik karakterler ve tireler",
@@ -73,10 +74,10 @@
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 API Kimlik Doğrulama Dizesi", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 API Kimlik Doğrulama Dizesi",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Temel URL", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 Temel URL",
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Temel URL gereklidir.", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Temel URL gereklidir.",
"Available list": "", "Available list": "Mevcut liste",
"available!": "mevcut!", "available!": "mevcut!",
"Azure AI Speech": "", "Azure AI Speech": "Azure AI Konuşma",
"Azure Region": "", "Azure Region": "Azure Bölgesi",
"Back": "Geri", "Back": "Geri",
"Bad Response": "Kötü Yanıt", "Bad Response": "Kötü Yanıt",
"Banners": "Afişler", "Banners": "Afişler",
@@ -94,10 +95,10 @@
"Change Password": "Parola Değiştir", "Change Password": "Parola Değiştir",
"Chat": "Sohbet", "Chat": "Sohbet",
"Chat Background Image": "Sohbet Arka Plan Resmi", "Chat Background Image": "Sohbet Arka Plan Resmi",
"Chat Bubble UI": "Sohbet Balonu UI", "Chat Bubble UI": "Sohbet Balonu Arayüzü",
"Chat Controls": "", "Chat Controls": "Sohbet Kontrolleri",
"Chat direction": "Sohbet Yönü", "Chat direction": "Sohbet Yönü",
"Chat Overview": "", "Chat Overview": "Sohbet Genel Bakış",
"Chats": "Sohbetler", "Chats": "Sohbetler",
"Check Again": "Tekrar Kontrol Et", "Check Again": "Tekrar Kontrol Et",
"Check for updates": "Güncellemeleri kontrol et", "Check for updates": "Güncellemeleri kontrol et",
@@ -115,7 +116,7 @@
"Click here to select a csv file.": "Bir CSV dosyası seçmek için buraya tıklayın.", "Click here to select a csv file.": "Bir CSV dosyası seçmek için buraya tıklayın.",
"Click here to select a py file.": "Bir py dosyası seçmek için buraya tıklayın.", "Click here to select a py file.": "Bir py dosyası seçmek için buraya tıklayın.",
"Click here to select documents.": "Belgeleri seçmek için buraya tıklayın.", "Click here to select documents.": "Belgeleri seçmek için buraya tıklayın.",
"Click here to upload a workflow.json file.": "", "Click here to upload a workflow.json file.": "Bir workflow.json dosyası yüklemek için buraya tıklayın.",
"click here.": "buraya tıklayın.", "click here.": "buraya tıklayın.",
"Click on the user role button to change a user's role.": "Bir kullanıcının rolünü değiştirmek için kullanıcı rolü düğmesine tıklayın.", "Click on the user role button to change a user's role.": "Bir kullanıcının rolünü değiştirmek için kullanıcı rolü düğmesine tıklayın.",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Panoya yazma izni reddedildi. Tarayıcı ayarlarını kontrol ederek gerekli izinleri sağlayabilirsiniz.", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Panoya yazma izni reddedildi. Tarayıcı ayarlarını kontrol ederek gerekli izinleri sağlayabilirsiniz.",
@@ -126,8 +127,8 @@
"ComfyUI": "ComfyUI", "ComfyUI": "ComfyUI",
"ComfyUI Base URL": "ComfyUI Temel URL", "ComfyUI Base URL": "ComfyUI Temel URL",
"ComfyUI Base URL is required.": "ComfyUI Temel URL gerekli.", "ComfyUI Base URL is required.": "ComfyUI Temel URL gerekli.",
"ComfyUI Workflow": "", "ComfyUI Workflow": "ComfyUI İş Akışı",
"ComfyUI Workflow Nodes": "", "ComfyUI Workflow Nodes": "ComfyUI İş Akışı Düğümleri",
"Command": "Komut", "Command": "Komut",
"Concurrent Requests": "Eşzamanlı İstekler", "Concurrent Requests": "Eşzamanlı İstekler",
"Confirm": "Onayla", "Confirm": "Onayla",
@@ -136,17 +137,17 @@
"Connections": "Bağlantılar", "Connections": "Bağlantılar",
"Contact Admin for WebUI Access": "WebUI Erişimi için Yöneticiyle İletişime Geçin", "Contact Admin for WebUI Access": "WebUI Erişimi için Yöneticiyle İletişime Geçin",
"Content": "İçerik", "Content": "İçerik",
"Content Extraction": "", "Content Extraction": "İçerik Çıkarma",
"Context Length": "Bağlam Uzunluğu", "Context Length": "Bağlam Uzunluğu",
"Continue Response": "Yanıta Devam Et", "Continue Response": "Yanıta Devam Et",
"Continue with {{provider}}": "{{provider}} ile devam et", "Continue with {{provider}}": "{{provider}} ile devam et",
"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "", "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Mesaj metninin TTS istekleri için nasıl bölüneceğini kontrol edin. 'Noktalama' cümlelere, 'paragraflar' paragraflara böler ve 'hiçbiri' mesajı tek bir dize olarak tutar.",
"Controls": "", "Controls": "Kontroller",
"Copied": "", "Copied": "Kopyalandı",
"Copied shared chat URL to clipboard!": "Paylaşılan sohbet URL'si panoya kopyalandı!", "Copied shared chat URL to clipboard!": "Paylaşılan sohbet URL'si panoya kopyalandı!",
"Copied to clipboard": "", "Copied to clipboard": "Panoya kopyalandı",
"Copy": "Kopyala", "Copy": "Kopyala",
"Copy Code": "", "Copy Code": "Kodu Kopyala",
"Copy last code block": "Son kod bloğunu kopyala", "Copy last code block": "Son kod bloğunu kopyala",
"Copy last response": "Son yanıtı kopyala", "Copy last response": "Son yanıtı kopyala",
"Copy Link": "Bağlantıyı Kopyala", "Copy Link": "Bağlantıyı Kopyala",
@@ -181,7 +182,7 @@
"Delete chat": "Sohbeti sil", "Delete chat": "Sohbeti sil",
"Delete Chat": "Sohbeti Sil", "Delete Chat": "Sohbeti Sil",
"Delete chat?": "Sohbeti sil?", "Delete chat?": "Sohbeti sil?",
"Delete Doc": "", "Delete Doc": "Belgeyi Sil",
"Delete function?": "Fonksiyonu sil?", "Delete function?": "Fonksiyonu sil?",
"Delete prompt?": "Promptu sil?", "Delete prompt?": "Promptu sil?",
"delete this link": "bu bağlantıyı sil", "delete this link": "bu bağlantıyı sil",
@@ -191,7 +192,7 @@
"Deleted {{name}}": "{{name}} silindi", "Deleted {{name}}": "{{name}} silindi",
"Description": "Açıklama", "Description": "Açıklama",
"Didn't fully follow instructions": "Talimatları tam olarak takip etmedi", "Didn't fully follow instructions": "Talimatları tam olarak takip etmedi",
"Disabled": "", "Disabled": "Devre Dışı",
"Discover a function": "Bir fonksiyon keşfedin", "Discover a function": "Bir fonksiyon keşfedin",
"Discover a model": "Bir model keşfedin", "Discover a model": "Bir model keşfedin",
"Discover a prompt": "Bir prompt keşfedin", "Discover a prompt": "Bir prompt keşfedin",
@@ -203,16 +204,16 @@
"Dismissible": "Reddedilebilir", "Dismissible": "Reddedilebilir",
"Display Emoji in Call": "Aramada Emoji Göster", "Display Emoji in Call": "Aramada Emoji Göster",
"Display the username instead of You in the Chat": "Sohbet'te Siz yerine kullanıcı adını göster", "Display the username instead of You in the Chat": "Sohbet'te Siz yerine kullanıcı adını göster",
"Do not install functions from sources you do not fully trust.": "", "Do not install functions from sources you do not fully trust.": "Tamamen güvenmediğiniz kaynaklardan fonksiyonlar yüklemeyin.",
"Do not install tools from sources you do not fully trust.": "", "Do not install tools from sources you do not fully trust.": "Tamamen güvenmediğiniz kaynaklardan araçlar yüklemeyin.",
"Document": "Belge", "Document": "Belge",
"Documentation": "Dökümantasyon", "Documentation": "Dökümantasyon",
"Documents": "Belgeler", "Documents": "Belgeler",
"does not make any external connections, and your data stays securely on your locally hosted server.": "herhangi bir harici bağlantı yapmaz ve verileriniz güvenli bir şekilde yerel olarak barındırılan sunucunuzda kalır.", "does not make any external connections, and your data stays securely on your locally hosted server.": "herhangi bir harici bağlantı yapmaz ve verileriniz güvenli bir şekilde yerel olarak barındırılan sunucunuzda kalır.",
"Don't Allow": "İzin Verme", "Don't Allow": "İzin Verme",
"Don't have an account?": "Hesabınız yok mu?", "Don't have an account?": "Hesabınız yok mu?",
"don't install random functions from sources you don't trust.": "", "don't install random functions from sources you don't trust.": "Tanımadığınız kaynaklardan rastgele fonksiyonlar yüklemeyin.",
"don't install random tools from sources you don't trust.": "", "don't install random tools from sources you don't trust.": "Tanımadığınız kaynaklardan rastgele araçlar yüklemeyin.",
"Don't like the style": "Tarzını beğenmedim", "Don't like the style": "Tarzını beğenmedim",
"Done": "Tamamlandı", "Done": "Tamamlandı",
"Download": "İndir", "Download": "İndir",
@@ -231,18 +232,18 @@
"Embedding Model Engine": "Gömme Modeli Motoru", "Embedding Model Engine": "Gömme Modeli Motoru",
"Embedding model set to \"{{embedding_model}}\"": "Gömme modeli \"{{embedding_model}}\" olarak ayarlandı", "Embedding model set to \"{{embedding_model}}\"": "Gömme modeli \"{{embedding_model}}\" olarak ayarlandı",
"Enable Community Sharing": "Topluluk Paylaşımını Etkinleştir", "Enable Community Sharing": "Topluluk Paylaşımını Etkinleştir",
"Enable Message Rating": "", "Enable Message Rating": "Mesaj Değerlendirmeyi Etkinleştir",
"Enable New Sign Ups": "Yeni Kayıtları Etkinleştir", "Enable New Sign Ups": "Yeni Kayıtları Etkinleştir",
"Enable Web Search": "Web Aramasını Etkinleştir", "Enable Web Search": "Web Aramasını Etkinleştir",
"Enable Web Search Query Generation": "", "Enable Web Search Query Generation": "Web Arama Sorgusu Oluşturmayı Etkinleştir",
"Enabled": "", "Enabled": "Etkin",
"Engine": "", "Engine": "Motor",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV dosyanızın şu sırayla 4 sütun içerdiğinden emin olun: İsim, E-posta, Şifre, Rol.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV dosyanızın şu sırayla 4 sütun içerdiğinden emin olun: İsim, E-posta, Şifre, Rol.",
"Enter {{role}} message here": "Buraya {{role}} mesajını girin", "Enter {{role}} message here": "Buraya {{role}} mesajını girin",
"Enter a detail about yourself for your LLMs to recall": "LLM'lerinizin hatırlaması için kendiniz hakkında bir bilgi girin", "Enter a detail about yourself for your LLMs to recall": "LLM'lerinizin hatırlaması için kendiniz hakkında bir bilgi girin",
"Enter api auth string (e.g. username:password)": "Api auth dizesini girin (örn. kullanıcı adı:parola)", "Enter api auth string (e.g. username:password)": "Api auth dizesini girin (örn. kullanıcı adı:parola)",
"Enter Brave Search API Key": "Brave Search API Anahtarını Girin", "Enter Brave Search API Key": "Brave Search API Anahtarını Girin",
"Enter CFG Scale (e.g. 7.0)": "", "Enter CFG Scale (e.g. 7.0)": "CFG Ölçeğini Girin (örn. 7.0)",
"Enter Chunk Overlap": "Chunk Örtüşmesini Girin", "Enter Chunk Overlap": "Chunk Örtüşmesini Girin",
"Enter Chunk Size": "Chunk Boyutunu Girin", "Enter Chunk Size": "Chunk Boyutunu Girin",
"Enter Github Raw URL": "Github Raw URL'sini girin", "Enter Github Raw URL": "Github Raw URL'sini girin",
@@ -250,28 +251,28 @@
"Enter Google PSE Engine Id": "Google PSE Engine Id'sini Girin", "Enter Google PSE Engine Id": "Google PSE Engine Id'sini Girin",
"Enter Image Size (e.g. 512x512)": "Görüntü Boyutunu Girin (örn. 512x512)", "Enter Image Size (e.g. 512x512)": "Görüntü Boyutunu Girin (örn. 512x512)",
"Enter language codes": "Dil kodlarını girin", "Enter language codes": "Dil kodlarını girin",
"Enter Model ID": "", "Enter Model ID": "Model ID'sini Girin",
"Enter model tag (e.g. {{modelTag}})": "Model etiketini girin (örn. {{modelTag}})", "Enter model tag (e.g. {{modelTag}})": "Model etiketini girin (örn. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Adım Sayısını Girin (örn. 50)", "Enter Number of Steps (e.g. 50)": "Adım Sayısını Girin (örn. 50)",
"Enter Sampler (e.g. Euler a)": "", "Enter Sampler (e.g. Euler a)": "Örnekleyiciyi Girin (örn. Euler a)",
"Enter Scheduler (e.g. Karras)": "", "Enter Scheduler (e.g. Karras)": "Zamanlayıcıyı Girin (örn. Karras)",
"Enter Score": "Skoru Girin", "Enter Score": "Skoru Girin",
"Enter SearchApi API Key": "", "Enter SearchApi API Key": "Arama-API Anahtarını Girin",
"Enter SearchApi Engine": "", "Enter SearchApi Engine": "Arama-API Motorunu Girin",
"Enter Searxng Query URL": "Searxng Sorgu URL'sini girin", "Enter Searxng Query URL": "Searxng Sorgu URL'sini girin",
"Enter Serper API Key": "Serper API Anahtarını Girin", "Enter Serper API Key": "Serper API Anahtarını Girin",
"Enter Serply API Key": "Serply API Anahtarını Girin", "Enter Serply API Key": "Serply API Anahtarını Girin",
"Enter Serpstack API Key": "Serpstack API Anahtarını Girin", "Enter Serpstack API Key": "Serpstack API Anahtarını Girin",
"Enter stop sequence": "Durdurma dizisini girin", "Enter stop sequence": "Durdurma dizisini girin",
"Enter system prompt": "", "Enter system prompt": "Sistem promptunu girin",
"Enter Tavily API Key": "Tavily API Anahtarını Girin", "Enter Tavily API Key": "Tavily API Anahtarını Girin",
"Enter Tika Server URL": "", "Enter Tika Server URL": "Tika Sunucu URL'sini Girin",
"Enter Top K": "Top K'yı girin", "Enter Top K": "Top K'yı girin",
"Enter URL (e.g. http://127.0.0.1:7860/)": "URL'yi Girin (örn. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "URL'yi Girin (örn. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "URL'yi Girin (e.g. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "URL'yi Girin (e.g. http://localhost:11434)",
"Enter Your Email": "E-postanızı Girin", "Enter Your Email": "E-postanızı Girin",
"Enter Your Full Name": "Tam Adınızı Girin", "Enter Your Full Name": "Tam Adınızı Girin",
"Enter your message": "", "Enter your message": "Mesajınızı girin",
"Enter Your Password": "Parolanızı Girin", "Enter Your Password": "Parolanızı Girin",
"Enter Your Role": "Rolünüzü Girin", "Enter Your Role": "Rolünüzü Girin",
"Error": "Hata", "Error": "Hata",
@@ -296,8 +297,8 @@
"File": "Dosya", "File": "Dosya",
"File Mode": "Dosya Modu", "File Mode": "Dosya Modu",
"File not found.": "Dosya bulunamadı.", "File not found.": "Dosya bulunamadı.",
"File size should not exceed {{maxSize}} MB.": "", "File size should not exceed {{maxSize}} MB.": "Dosya boyutu {{maxSize}} MB'yi aşmamalıdır.",
"Files": "", "Files": "Dosyalar",
"Filter is now globally disabled": "Filtre artık global olarak devre dışı", "Filter is now globally disabled": "Filtre artık global olarak devre dışı",
"Filter is now globally enabled": "Filtre artık global olarak devrede", "Filter is now globally enabled": "Filtre artık global olarak devrede",
"Filters": "Filtreler", "Filters": "Filtreler",
@@ -310,28 +311,28 @@
"Frequency Penalty": "Frekans Cezası", "Frequency Penalty": "Frekans Cezası",
"Function created successfully": "Fonksiyon başarıyla oluşturuldu", "Function created successfully": "Fonksiyon başarıyla oluşturuldu",
"Function deleted successfully": "Fonksiyon başarıyla silindi", "Function deleted successfully": "Fonksiyon başarıyla silindi",
"Function Description (e.g. A filter to remove profanity from text)": "", "Function Description (e.g. A filter to remove profanity from text)": "Fonksiyon Açıklaması (örn. Metinden küfürleri kaldıran bir filtre)",
"Function ID (e.g. my_filter)": "", "Function ID (e.g. my_filter)": "Fonksiyon ID'si (örn. my_filter)",
"Function is now globally disabled": "", "Function is now globally disabled": "Fonksiyon artık global olarak devre dışı",
"Function is now globally enabled": "", "Function is now globally enabled": "Fonksiyon artık global olarak aktif",
"Function Name (e.g. My Filter)": "", "Function Name (e.g. My Filter)": "Fonksiyon Adı (örn. Benim Filtrem)",
"Function updated successfully": "Fonksiyon başarıyla güncellendi", "Function updated successfully": "Fonksiyon başarıyla güncellendi",
"Functions": "Fonksiyonlar", "Functions": "Fonksiyonlar",
"Functions allow arbitrary code execution": "", "Functions allow arbitrary code execution": "Fonksiyonlar keyfi kod yürütülmesine izin verir",
"Functions allow arbitrary code execution.": "", "Functions allow arbitrary code execution.": "Fonksiyonlar keyfi kod yürütülmesine izin verir.",
"Functions imported successfully": "Fonksiyonlar başarıyla içe aktarıldı", "Functions imported successfully": "Fonksiyonlar başarıyla içe aktarıldı",
"General": "Genel", "General": "Genel",
"General Settings": "Genel Ayarlar", "General Settings": "Genel Ayarlar",
"Generate Image": "Görsel Üret", "Generate Image": "Görsel Üret",
"Generating search query": "Arama sorgusu oluşturma", "Generating search query": "Arama sorgusu oluşturma",
"Generation Info": "Üretim Bilgisi", "Generation Info": "Üretim Bilgisi",
"Get up and running with": "", "Get up and running with": "ile çalışmaya başlayın",
"Global": "Global", "Global": "Evrensel",
"Good Response": "İyi Yanıt", "Good Response": "İyi Yanıt",
"Google PSE API Key": "Google PSE API Anahtarı", "Google PSE API Key": "Google PSE API Anahtarı",
"Google PSE Engine Id": "Google PSE Engine Id", "Google PSE Engine Id": "Google PSE Engine Id",
"h:mm a": "h:mm a", "h:mm a": "h:mm a",
"Haptic Feedback": "", "Haptic Feedback": "Dokunsal Geri Bildirim",
"has no conversations.": "hiç konuşması yok.", "has no conversations.": "hiç konuşması yok.",
"Hello, {{name}}": "Merhaba, {{name}}", "Hello, {{name}}": "Merhaba, {{name}}",
"Help": "Yardım", "Help": "Yardım",
@@ -339,7 +340,7 @@
"Hide Model": "Modeli Gizle", "Hide Model": "Modeli Gizle",
"How can I help you today?": "Bugün size nasıl yardımcı olabilirim?", "How can I help you today?": "Bugün size nasıl yardımcı olabilirim?",
"Hybrid Search": "Karma Arama", "Hybrid Search": "Karma Arama",
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "", "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Eylemimin sonuçlarını okuduğumu ve anladığımı kabul ediyorum. Rastgele kod çalıştırmayla ilgili risklerin farkındayım ve kaynağın güvenilirliğini doğruladım.",
"Image Generation (Experimental)": "Görüntü Oluşturma (Deneysel)", "Image Generation (Experimental)": "Görüntü Oluşturma (Deneysel)",
"Image Generation Engine": "Görüntü Oluşturma Motoru", "Image Generation Engine": "Görüntü Oluşturma Motoru",
"Image Settings": "Görüntü Ayarları", "Image Settings": "Görüntü Ayarları",
@@ -371,27 +372,27 @@
"Keyboard shortcuts": "Klavye kısayolları", "Keyboard shortcuts": "Klavye kısayolları",
"Knowledge": "Bilgi", "Knowledge": "Bilgi",
"Language": "Dil", "Language": "Dil",
"large language models, locally.": "", "large language models, locally.": "büyük dil modelleri, yerel olarak.",
"Last Active": "Son Aktivite", "Last Active": "Son Aktivite",
"Last Modified": "Son Düzenleme", "Last Modified": "Son Düzenleme",
"Leave empty for unlimited": "", "Leave empty for unlimited": "",
"Leave empty to use the default prompt, or enter a custom prompt": "", "Leave empty to use the default prompt, or enter a custom prompt": "Varsayılan promptu kullanmak için boş bırakın veya özel bir prompt girin",
"Light": "Açık", "Light": "Açık",
"Listening...": "Dinleniyor...", "Listening...": "Dinleniyor...",
"LLMs can make mistakes. Verify important information.": "LLM'ler hata yapabilir. Önemli bilgileri doğrulayın.", "LLMs can make mistakes. Verify important information.": "LLM'ler hata yapabilir. Önemli bilgileri doğrulayın.",
"Local Models": "Yerel Modeller", "Local Models": "Yerel Modeller",
"LTR": "LTR", "LTR": "Soldan Sağa",
"Made by OpenWebUI Community": "OpenWebUI Topluluğu tarafından yapılmıştır", "Made by OpenWebUI Community": "OpenWebUI Topluluğu tarafından yapılmıştır",
"Make sure to enclose them with": "Değişkenlerinizi şu şekilde biçimlendirin:", "Make sure to enclose them with": "Değişkenlerinizi şu şekilde biçimlendirin:",
"Make sure to export a workflow.json file as API format from ComfyUI.": "", "Make sure to export a workflow.json file as API format from ComfyUI.": "ComfyUI'dan API formatında bir workflow.json dosyası olarak dışa aktardığınızdan emin olun.",
"Manage": "Yönet", "Manage": "Yönet",
"Manage Models": "Modelleri Yönet", "Manage Models": "Modelleri Yönet",
"Manage Ollama Models": "Ollama Modellerini Yönet", "Manage Ollama Models": "Ollama Modellerini Yönet",
"Manage Pipelines": "Pipelineları Yönet", "Manage Pipelines": "Pipelineları Yönet",
"March": "Mart", "March": "Mart",
"Max Tokens (num_predict)": "Maksimum Token (num_predict)", "Max Tokens (num_predict)": "Maksimum Token (num_predict)",
"Max Upload Count": "", "Max Upload Count": "Maksimum Yükleme Sayısı",
"Max Upload Size": "", "Max Upload Size": "Maksimum Yükleme Boyutu",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Aynı anda en fazla 3 model indirilebilir. Lütfen daha sonra tekrar deneyin.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Aynı anda en fazla 3 model indirilebilir. Lütfen daha sonra tekrar deneyin.",
"May": "Mayıs", "May": "Mayıs",
"Memories accessible by LLMs will be shown here.": "LLM'ler tarafından erişilebilen bellekler burada gösterilecektir.", "Memories accessible by LLMs will be shown here.": "LLM'ler tarafından erişilebilen bellekler burada gösterilecektir.",
@@ -400,9 +401,9 @@
"Memory cleared successfully": "Bellek başarıyle temizlendi", "Memory cleared successfully": "Bellek başarıyle temizlendi",
"Memory deleted successfully": "Bellek başarıyla silindi", "Memory deleted successfully": "Bellek başarıyla silindi",
"Memory updated successfully": "Bellek başarıyla güncellendi", "Memory updated successfully": "Bellek başarıyla güncellendi",
"Merge Responses": "", "Merge Responses": "Yanıtları Birleştir",
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Bağlantınızı oluşturduktan sonra gönderdiğiniz mesajlar paylaşılmayacaktır. URL'ye sahip kullanıcılar paylaşılan sohbeti görüntüleyebilecektir.", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Bağlantınızı oluşturduktan sonra gönderdiğiniz mesajlar paylaşılmayacaktır. URL'ye sahip kullanıcılar paylaşılan sohbeti görüntüleyebilecektir.",
"Min P": "", "Min P": "Min P",
"Minimum Score": "Minimum Skor", "Minimum Score": "Minimum Skor",
"Mirostat": "Mirostat", "Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta", "Mirostat Eta": "Mirostat Eta",
@@ -415,8 +416,8 @@
"Model {{modelId}} not found": "{{modelId}} bulunamadı", "Model {{modelId}} not found": "{{modelId}} bulunamadı",
"Model {{modelName}} is not vision capable": "Model {{modelName}} görüntü yeteneğine sahip değil", "Model {{modelName}} is not vision capable": "Model {{modelName}} görüntü yeteneğine sahip değil",
"Model {{name}} is now {{status}}": "{{name}} modeli artık {{status}}", "Model {{name}} is now {{status}}": "{{name}} modeli artık {{status}}",
"Model {{name}} is now at the top": "", "Model {{name}} is now at the top": "{{name}} modeli artık en üstte",
"Model accepts image inputs": "", "Model accepts image inputs": "Model görüntü girdilerini kabul eder",
"Model created successfully!": "Model başarıyla oluşturuldu!", "Model created successfully!": "Model başarıyla oluşturuldu!",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model dosya sistemi yolu algılandı. Güncelleme için model kısa adı gerekli, devam edilemiyor.", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model dosya sistemi yolu algılandı. Güncelleme için model kısa adı gerekli, devam edilemiyor.",
"Model ID": "Model ID", "Model ID": "Model ID",
@@ -428,7 +429,7 @@
"Modelfile Content": "Model Dosyası İçeriği", "Modelfile Content": "Model Dosyası İçeriği",
"Models": "Modeller", "Models": "Modeller",
"More": "Daha Fazla", "More": "Daha Fazla",
"Move to Top": "", "Move to Top": "En Üste Taşı",
"Name": "Ad", "Name": "Ad",
"Name Tag": "Ad Etiketi", "Name Tag": "Ad Etiketi",
"Name your model": "Modelinizi Adlandırın", "Name your model": "Modelinizi Adlandırın",
@@ -465,8 +466,9 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hop! URL geçersiz gibi görünüyor. Lütfen tekrar kontrol edin ve yeniden deneyin.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hop! URL geçersiz gibi görünüyor. Lütfen tekrar kontrol edin ve yeniden deneyin.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Hop! Önceki yanıtta bir hata oluştu. Lütfen tekrar deneyin veya yönetici ile iletişime geçin.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Hop! Önceki yanıtta bir hata oluştu. Lütfen tekrar deneyin veya yönetici ile iletişime geçin.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hop! Desteklenmeyen bir yöntem kullanıyorsunuz (yalnızca önyüz). Lütfen WebUI'yi arkayüzden sunun.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hop! Desteklenmeyen bir yöntem kullanıyorsunuz (yalnızca önyüz). Lütfen WebUI'yi arkayüzden sunun.",
"Open file": "",
"Open new chat": "Yeni sohbet aç", "Open new chat": "Yeni sohbet aç",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open-WebUI sürümü (v{{OPEN_WEBUI_VERSION}}) gerekli sürümden (v{{REQUIRED_VERSION}}) düşük",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
"OpenAI API": "OpenAI API", "OpenAI API": "OpenAI API",
"OpenAI API Config": "OpenAI API Konfigürasyonu", "OpenAI API Config": "OpenAI API Konfigürasyonu",
@@ -474,8 +476,9 @@
"OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.", "OpenAI URL/Key required.": "OpenAI URL/Anahtar gereklidir.",
"or": "veya", "or": "veya",
"Other": "Diğer", "Other": "Diğer",
"Output format": "", "Output format": "Çıktı formatı",
"Overview": "", "Overview": "Genel Bakış",
"page": "",
"Password": "Parola", "Password": "Parola",
"PDF document (.pdf)": "PDF belgesi (.pdf)", "PDF document (.pdf)": "PDF belgesi (.pdf)",
"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)", "PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
@@ -484,8 +487,8 @@
"Permission denied when accessing microphone": "Mikrofona erişim izni reddedildi", "Permission denied when accessing microphone": "Mikrofona erişim izni reddedildi",
"Permission denied when accessing microphone: {{error}}": "Mikrofona erişim izni reddedildi: {{error}}", "Permission denied when accessing microphone: {{error}}": "Mikrofona erişim izni reddedildi: {{error}}",
"Personalization": "Kişiselleştirme", "Personalization": "Kişiselleştirme",
"Pin": "", "Pin": "Sabitle",
"Pinned": "", "Pinned": "Sabitlenmiş",
"Pipeline deleted successfully": "Pipeline başarıyla silindi", "Pipeline deleted successfully": "Pipeline başarıyla silindi",
"Pipeline downloaded successfully": "Pipeline başarıyla güncellendi", "Pipeline downloaded successfully": "Pipeline başarıyla güncellendi",
"Pipelines": "Pipelinelar", "Pipelines": "Pipelinelar",
@@ -493,7 +496,8 @@
"Pipelines Valves": "Pipeline Valvleri", "Pipelines Valves": "Pipeline Valvleri",
"Plain text (.txt)": "Düz metin (.txt)", "Plain text (.txt)": "Düz metin (.txt)",
"Playground": "Oyun Alanı", "Playground": "Oyun Alanı",
"Please carefully review the following warnings:": "", "Please carefully review the following warnings:": "Lütfen aşağıdaki uyarıları dikkatlice inceleyin:",
"Please select a reason": "",
"Positive attitude": "Olumlu yaklaşım", "Positive attitude": "Olumlu yaklaşım",
"Previous 30 days": "Önceki 30 gün", "Previous 30 days": "Önceki 30 gün",
"Previous 7 days": "Önceki 7 gün", "Previous 7 days": "Önceki 7 gün",
@@ -527,24 +531,24 @@
"Reset Vector Storage": "Vektör Depolamayı Sıfırla", "Reset Vector Storage": "Vektör Depolamayı Sıfırla",
"Response AutoCopy to Clipboard": "Yanıtı Panoya Otomatik Kopyala", "Response AutoCopy to Clipboard": "Yanıtı Panoya Otomatik Kopyala",
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Web sitesi izinleri reddedildiğinden yanıt bildirimleri etkinleştirilemiyor. Gerekli erişimi sağlamak için lütfen tarayıcı ayarlarınızı ziyaret edin.", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Web sitesi izinleri reddedildiğinden yanıt bildirimleri etkinleştirilemiyor. Gerekli erişimi sağlamak için lütfen tarayıcı ayarlarınızı ziyaret edin.",
"Response splitting": "", "Response splitting": "Yanıt bölme",
"Role": "Rol", "Role": "Rol",
"Rosé Pine": "Rosé Pine", "Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn", "Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "RTL", "RTL": "Sağdan Sola",
"Run": "", "Run": "Çalıştır",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "", "Run Llama 2, Code Llama, and other models. Customize and create your own.": "Llama 2, Code Llama ve diğer modelleri çalıştırın. Kendinize özgü hale getirin ve kendi modelinizi oluşturun.",
"Running": "Çalışıyor", "Running": "Çalışıyor",
"Save": "Kaydet", "Save": "Kaydet",
"Save & Create": "Kaydet ve Oluştur", "Save & Create": "Kaydet ve Oluştur",
"Save & Update": "Kaydet ve Güncelle", "Save & Update": "Kaydet ve Güncelle",
"Save As Copy": "", "Save As Copy": "Kopya Olarak Kaydet",
"Save Tag": "", "Save Tag": "Etiketi Kaydet",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Sohbet kayıtlarının doğrudan tarayıcınızın depolama alanına kaydedilmesi artık desteklenmemektedir. Lütfen aşağıdaki butona tıklayarak sohbet kayıtlarınızı indirmek ve silmek için bir dakikanızı ayırın. Endişelenmeyin, sohbet günlüklerinizi arkayüze kolayca yeniden aktarabilirsiniz:", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Sohbet kayıtlarının doğrudan tarayıcınızın depolama alanına kaydedilmesi artık desteklenmemektedir. Lütfen aşağıdaki butona tıklayarak sohbet kayıtlarınızı indirmek ve silmek için bir dakikanızı ayırın. Endişelenmeyin, sohbet günlüklerinizi arkayüze kolayca yeniden aktarabilirsiniz:",
"Scan": "Tarama", "Scan": "Tarama",
"Scan complete!": "Tarama tamamlandı!", "Scan complete!": "Tarama tamamlandı!",
"Scan for documents from {{path}}": "{{path}} dizininden belgeleri tarayın", "Scan for documents from {{path}}": "{{path}} dizininden belgeleri tarayın",
"Scroll to bottom when switching between branches": "", "Scroll to bottom when switching between branches": "Dallar arasında geçiş yaparken en alta kaydır",
"Search": "Ara", "Search": "Ara",
"Search a model": "Bir model ara", "Search a model": "Bir model ara",
"Search Chats": "Sohbetleri Ara", "Search Chats": "Sohbetleri Ara",
@@ -555,12 +559,12 @@
"Search Query Generation Prompt": "Arama Sorgusu Üretme Promptu", "Search Query Generation Prompt": "Arama Sorgusu Üretme Promptu",
"Search Result Count": "Arama Sonucu Sayısı", "Search Result Count": "Arama Sonucu Sayısı",
"Search Tools": "Arama Araçları", "Search Tools": "Arama Araçları",
"SearchApi API Key": "", "SearchApi API Key": "Arama-API API Anahtarı",
"SearchApi Engine": "", "SearchApi Engine": "Arama-API Motoru",
"Searched {{count}} sites_one": "Arandı {{count}} sites_one", "Searched {{count}} sites_one": "Arandı {{count}} sites_one",
"Searched {{count}} sites_other": "Arandı {{count}} sites_other", "Searched {{count}} sites_other": "Arandı {{count}} sites_other",
"Searching \"{{searchQuery}}\"": "\"{{searchQuery}}\" aranıyor", "Searching \"{{searchQuery}}\"": "\"{{searchQuery}}\" aranıyor",
"Searching Knowledge for \"{{searchQuery}}\"": "", "Searching Knowledge for \"{{searchQuery}}\"": "\"{{searchQuery}}\" için Bilgi aranıyor",
"Searxng Query URL": "Searxng Sorgu URL'si", "Searxng Query URL": "Searxng Sorgu URL'si",
"See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın", "See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın",
"See what's new": "Yeniliklere göz atın", "See what's new": "Yeniliklere göz atın",
@@ -574,27 +578,27 @@
"Select a tool": "Bir araç seç", "Select a tool": "Bir araç seç",
"Select an Ollama instance": "Bir Ollama örneği seçin", "Select an Ollama instance": "Bir Ollama örneği seçin",
"Select Documents": "Bir Doküman Seç", "Select Documents": "Bir Doküman Seç",
"Select Engine": "", "Select Engine": "Motor Seç",
"Select model": "Model seç", "Select model": "Model seç",
"Select only one model to call": "Arama için sadece bir model seç", "Select only one model to call": "Arama için sadece bir model seç",
"Selected model(s) do not support image inputs": "Seçilen model(ler) görüntü girişlerini desteklemiyor", "Selected model(s) do not support image inputs": "Seçilen model(ler) görüntü girişlerini desteklemiyor",
"Send": "Gönder", "Send": "Gönder",
"Send a Message": "Bir Mesaj Gönder", "Send a Message": "Bir Mesaj Gönder",
"Send message": "Mesaj gönder", "Send message": "Mesaj gönder",
"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "İsteğe `stream_options: { include_usage: true }` gönderir.\nDesteklenen sağlayıcılar, ayarlandığında yanıtta token kullanım bilgilerini döndürecektir.",
"September": "Eylül", "September": "Eylül",
"Serper API Key": "Serper API Anahtarı", "Serper API Key": "Serper API Anahtarı",
"Serply API Key": "Serply API Anahtarı", "Serply API Key": "Serply API Anahtarı",
"Serpstack API Key": "Serpstack API Anahtarı", "Serpstack API Key": "Serpstack API Anahtarı",
"Server connection verified": "Sunucu bağlantısı doğrulandı", "Server connection verified": "Sunucu bağlantısı doğrulandı",
"Set as default": "Varsayılan olarak ayarla", "Set as default": "Varsayılan olarak ayarla",
"Set CFG Scale": "", "Set CFG Scale": "CFG Ölçeğini Ayarla",
"Set Default Model": "Varsayılan Modeli Ayarla", "Set Default Model": "Varsayılan Modeli Ayarla",
"Set embedding model (e.g. {{model}})": "Gömme modelini ayarlayın (örn. {{model}})", "Set embedding model (e.g. {{model}})": "Gömme modelini ayarlayın (örn. {{model}})",
"Set Image Size": "Görüntü Boyutunu Ayarla", "Set Image Size": "Görüntü Boyutunu Ayarla",
"Set reranking model (e.g. {{model}})": "Yeniden sıralama modelini ayarlayın (örn. {{model}})", "Set reranking model (e.g. {{model}})": "Yeniden sıralama modelini ayarlayın (örn. {{model}})",
"Set Sampler": "", "Set Sampler": "Örnekleyiciyi Ayarla",
"Set Scheduler": "", "Set Scheduler": "Zamanlayıcıyı Ayarla",
"Set Steps": "Adımları Ayarla", "Set Steps": "Adımları Ayarla",
"Set Task Model": "Görev Modeli Ayarla", "Set Task Model": "Görev Modeli Ayarla",
"Set Voice": "Ses Ayarla", "Set Voice": "Ses Ayarla",
@@ -615,9 +619,9 @@
"Sign up": "Kaydol", "Sign up": "Kaydol",
"Signing in": "Oturum açma", "Signing in": "Oturum açma",
"Source": "Kaynak", "Source": "Kaynak",
"Speech Playback Speed": "Konuşma Oynatma Hızı",
"Speech recognition error: {{error}}": "Konuşma tanıma hatası: {{error}}", "Speech recognition error: {{error}}": "Konuşma tanıma hatası: {{error}}",
"Speech-to-Text Engine": "Konuşmadan Metne Motoru", "Speech-to-Text Engine": "Konuşmadan Metne Motoru",
"Speed Rate": "",
"Stop Sequence": "Diziyi Durdur", "Stop Sequence": "Diziyi Durdur",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "STT Modeli", "STT Model": "STT Modeli",
@@ -627,8 +631,8 @@
"Success": "Başarılı", "Success": "Başarılı",
"Successfully updated.": "Başarıyla güncellendi.", "Successfully updated.": "Başarıyla güncellendi.",
"Suggested": "Önerilen", "Suggested": "Önerilen",
"Support": "", "Support": "Destek",
"Support this plugin:": "", "Support this plugin:": "Bu eklentiyi destekleyin:",
"System": "Sistem", "System": "Sistem",
"System Prompt": "Sistem Promptu", "System Prompt": "Sistem Promptu",
"Tags": "Etiketler", "Tags": "Etiketler",
@@ -637,14 +641,14 @@
"Tell us more:": "Bize daha fazlasını anlat:", "Tell us more:": "Bize daha fazlasını anlat:",
"Temperature": "Temperature", "Temperature": "Temperature",
"Template": "Şablon", "Template": "Şablon",
"Temporary Chat": "", "Temporary Chat": "Geçici Sohbet",
"Text Completion": "Metin Tamamlama", "Text Completion": "Metin Tamamlama",
"Text-to-Speech Engine": "Metinden Sese Motoru", "Text-to-Speech Engine": "Metinden Sese Motoru",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Geri bildiriminiz için teşekkürler!", "Thanks for your feedback!": "Geri bildiriminiz için teşekkürler!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Bu eklentinin arkasındaki geliştiriciler topluluktan tutkulu gönüllülerdir. Bu eklentinin yararlı olduğunu düşünüyorsanız, gelişimine katkıda bulunmayı düşünün.",
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "", "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "MB cinsinden maksimum dosya boyutu. Dosya boyutu bu sınırı aşarsa, dosya yüklenmeyecektir.",
"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "", "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Sohbette aynı anda kullanılabilecek maksimum dosya sayısı. Dosya sayısı bu sınırı aşarsa, dosyalar yüklenmeyecektir.",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Puan 0.0 (%0) ile 1.0 (%100) arasında bir değer olmalıdır.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Puan 0.0 (%0) ile 1.0 (%100) arasında bir değer olmalıdır.",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "Düşünüyor...", "Thinking...": "Düşünüyor...",
@@ -654,7 +658,7 @@
"This will delete": "Bu silinecek", "This will delete": "Bu silinecek",
"Thorough explanation": "Kapsamlı açıklama", "Thorough explanation": "Kapsamlı açıklama",
"Tika": "", "Tika": "",
"Tika Server URL required.": "", "Tika Server URL required.": "Tika Sunucu URL'si gereklidir.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "İpucu: Her değiştirmeden sonra sohbet girişinde tab tuşuna basarak birden fazla değişken yuvasını art arda güncelleyin.", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "İpucu: Her değiştirmeden sonra sohbet girişinde tab tuşuna basarak birden fazla değişken yuvasını art arda güncelleyin.",
"Title": "Başlık", "Title": "Başlık",
"Title (e.g. Tell me a fun fact)": "Başlık (e.g. Bana ilginç bir bilgi ver)", "Title (e.g. Tell me a fun fact)": "Başlık (e.g. Bana ilginç bir bilgi ver)",
@@ -667,7 +671,7 @@
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "WebUI'ye erişmek için lütfen yöneticiyle iletişime geçin. Yöneticiler kullanıcı durumlarını Yönetici Panelinden yönetebilir.", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "WebUI'ye erişmek için lütfen yöneticiyle iletişime geçin. Yöneticiler kullanıcı durumlarını Yönetici Panelinden yönetebilir.",
"To add documents here, upload them to the \"Documents\" workspace first.": "Buraya belge eklemek için öncelikle bunları \"Belgeler\" çalışma alanına yükleyin.", "To add documents here, upload them to the \"Documents\" workspace first.": "Buraya belge eklemek için öncelikle bunları \"Belgeler\" çalışma alanına yükleyin.",
"to chat input.": "sohbet girişine.", "to chat input.": "sohbet girişine.",
"To select actions here, add them to the \"Functions\" workspace first.": "", "To select actions here, add them to the \"Functions\" workspace first.": "Burada eylemleri seçmek için öncelikle bunları \"İşlevler\" çalışma alanına ekleyin.",
"To select filters here, add them to the \"Functions\" workspace first.": "Filtreleri burada seçmek için öncelikle bunları \"İşlevler\" çalışma alanına ekleyin.", "To select filters here, add them to the \"Functions\" workspace first.": "Filtreleri burada seçmek için öncelikle bunları \"İşlevler\" çalışma alanına ekleyin.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "Araçları burada seçmek için öncelikle bunları \"Araçlar\" çalışma alanına ekleyin.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Araçları burada seçmek için öncelikle bunları \"Araçlar\" çalışma alanına ekleyin.",
"Today": "Bugün", "Today": "Bugün",
@@ -678,13 +682,13 @@
"Tool deleted successfully": "Araç başarıyla silindi", "Tool deleted successfully": "Araç başarıyla silindi",
"Tool imported successfully": "Araç başarıyla içe aktarıldı", "Tool imported successfully": "Araç başarıyla içe aktarıldı",
"Tool updated successfully": "Araç başarıyla güncellendi", "Tool updated successfully": "Araç başarıyla güncellendi",
"Toolkit Description (e.g. A toolkit for performing various operations)": "", "Toolkit Description (e.g. A toolkit for performing various operations)": "Toolkit Açıklaması (örn. Çeşitli işlemleri gerçekleştirmek için bir toolkit)",
"Toolkit ID (e.g. my_toolkit)": "", "Toolkit ID (e.g. my_toolkit)": "Toolkit ID'si (örn. my_toolkit)",
"Toolkit Name (e.g. My ToolKit)": "", "Toolkit Name (e.g. My ToolKit)": "Toolkit Adı (örn. Benim Toolkitim)",
"Tools": "Araçlar", "Tools": "Araçlar",
"Tools are a function calling system with arbitrary code execution": "", "Tools are a function calling system with arbitrary code execution": "Araçlar, keyfi kod yürütme ile bir fonksiyon çağırma sistemine sahiptir",
"Tools have a function calling system that allows arbitrary code execution": "", "Tools have a function calling system that allows arbitrary code execution": "Araçlar, keyfi kod yürütme izni veren bir fonksiyon çağırma sistemine sahiptir",
"Tools have a function calling system that allows arbitrary code execution.": "", "Tools have a function calling system that allows arbitrary code execution.": "Araçlar, keyfi kod yürütme izni veren bir fonksiyon çağırma sistemine sahiptir.",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Ollama'ya erişmede sorun mu yaşıyorsunuz?", "Trouble accessing Ollama?": "Ollama'ya erişmede sorun mu yaşıyorsunuz?",
@@ -692,13 +696,14 @@
"TTS Settings": "TTS Ayarları", "TTS Settings": "TTS Ayarları",
"TTS Voice": "TTS Sesi", "TTS Voice": "TTS Sesi",
"Type": "Tür", "Type": "Tür",
"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (Download) URL'sini Yazın", "Type Hugging Face Resolve (Download) URL": "HuggingFace Çözümleme (İndirme) URL'sini Yazın",
"Uh-oh! There was an issue connecting to {{provider}}.": "Ah! {{provider}}'a bağlanırken bir sorun oluştu.", "Uh-oh! There was an issue connecting to {{provider}}.": "Ah! {{provider}}'a bağlanırken bir sorun oluştu.",
"UI": "UI", "UI": "Arayüz",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "Bilinmeyen dosya türü '{{file_type}}'. Yine de dosya yükleme işlemine devam ediliyor.", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "Bilinmeyen dosya türü '{{file_type}}'. Yine de dosya yükleme işlemine devam ediliyor.",
"Unpin": "", "Unpin": "Sabitlemeyi Kaldır",
"Update": "Güncelle", "Update": "Güncelle",
"Update and Copy Link": "Güncelle ve Bağlantıyı Kopyala", "Update and Copy Link": "Güncelle ve Bağlantıyı Kopyala",
"Update for the latest features and improvements.": "",
"Update password": "Parolayı Güncelle", "Update password": "Parolayı Güncelle",
"Updated at": "Şu tarihte güncellendi:", "Updated at": "Şu tarihte güncellendi:",
"Upload": "Yükle", "Upload": "Yükle",
@@ -726,7 +731,7 @@
"Version": "Sürüm", "Version": "Sürüm",
"Voice": "Ses", "Voice": "Ses",
"Warning": "Uyarı", "Warning": "Uyarı",
"Warning:": "", "Warning:": "Uyarı:",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Uyarı: Gömme modelinizi günceller veya değiştirirseniz, tüm belgeleri yeniden içe aktarmanız gerekecektir.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Uyarı: Gömme modelinizi günceller veya değiştirirseniz, tüm belgeleri yeniden içe aktarmanız gerekecektir.",
"Web": "Web", "Web": "Web",
"Web API": "Web API", "Web API": "Web API",
@@ -744,7 +749,7 @@
"Write a summary in 50 words that summarizes [topic or keyword].": "[Konuyu veya anahtar kelimeyi] özetleyen 50 kelimelik bir özet yazın.", "Write a summary in 50 words that summarizes [topic or keyword].": "[Konuyu veya anahtar kelimeyi] özetleyen 50 kelimelik bir özet yazın.",
"Yesterday": "Dün", "Yesterday": "Dün",
"You": "Sen", "You": "Sen",
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Aynı anda en fazla {{maxCount}} dosya ile sohbet edebilirsiniz.",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Aşağıdaki 'Yönet' düğmesi aracılığıyla bellekler ekleyerek LLM'lerle etkileşimlerinizi kişiselleştirebilir, onları daha yararlı ve size özel hale getirebilirsiniz.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Aşağıdaki 'Yönet' düğmesi aracılığıyla bellekler ekleyerek LLM'lerle etkileşimlerinizi kişiselleştirebilir, onları daha yararlı ve size özel hale getirebilirsiniz.",
"You cannot clone a base model": "Bir temel modeli klonlayamazsınız", "You cannot clone a base model": "Bir temel modeli klonlayamazsınız",
"You have no archived conversations.": "Arşivlenmiş sohbetleriniz yok.", "You have no archived conversations.": "Arşivlenmiş sohbetleriniz yok.",
@@ -752,7 +757,7 @@
"You're a helpful assistant.": "Sen yardımsever bir asistansın.", "You're a helpful assistant.": "Sen yardımsever bir asistansın.",
"You're now logged in.": "Şimdi giriş yaptınız.", "You're now logged in.": "Şimdi giriş yaptınız.",
"Your account status is currently pending activation.": "Hesap durumunuz şu anda etkinleştirilmeyi bekliyor.", "Your account status is currently pending activation.": "Hesap durumunuz şu anda etkinleştirilmeyi bekliyor.",
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Tüm katkınız doğrudan eklenti geliştiricisine gidecektir; Open WebUI herhangi bir yüzde almaz. Ancak seçilen finansman platformunun kendi ücretleri olabilir.",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Youtube Yükleyici Ayarları" "Youtube Loader Settings": "Youtube Yükleyici Ayarları"
} }
+18 -13
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "Чати {{user}}а", "{{user}}'s Chats": "Чати {{user}}а",
"{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}", "{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}",
"*Prompt node ID(s) are required for image generation": "*Для генерації зображення потрібно вказати ідентифікатор(и) вузла(ів)", "*Prompt node ID(s) are required for image generation": "*Для генерації зображення потрібно вказати ідентифікатор(и) вузла(ів)",
"A new version (v{{LATEST_VERSION}}) is now available.": "Нова версія (в{{LATEST_VERSION}}) зараз доступна.",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач використовується при виконанні таких завдань, як генерація заголовків для чатів та пошукових запитів в Інтернеті", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Модель задач використовується при виконанні таких завдань, як генерація заголовків для чатів та пошукових запитів в Інтернеті",
"a user": "користувача", "a user": "користувача",
"About": "Про програму", "About": "Про програму",
@@ -73,10 +74,10 @@
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Рядок авторизації API", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Рядок авторизації API",
"AUTOMATIC1111 Base URL": "URL-адреса AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL-адреса AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "Необхідна URL-адреса AUTOMATIC1111.", "AUTOMATIC1111 Base URL is required.": "Необхідна URL-адреса AUTOMATIC1111.",
"Available list": "", "Available list": "Список доступності",
"available!": "доступно!", "available!": "доступно!",
"Azure AI Speech": "", "Azure AI Speech": "Мовлення Azure AI",
"Azure Region": "", "Azure Region": "Регіон Azure",
"Back": "Назад", "Back": "Назад",
"Bad Response": "Неправильна відповідь", "Bad Response": "Неправильна відповідь",
"Banners": "Прапори", "Banners": "Прапори",
@@ -97,7 +98,7 @@
"Chat Bubble UI": "Чат у вигляді бульбашок", "Chat Bubble UI": "Чат у вигляді бульбашок",
"Chat Controls": "Керування чатом", "Chat Controls": "Керування чатом",
"Chat direction": "Напрям чату", "Chat direction": "Напрям чату",
"Chat Overview": "", "Chat Overview": "Огляд чату",
"Chats": "Чати", "Chats": "Чати",
"Check Again": "Перевірити ще раз", "Check Again": "Перевірити ще раз",
"Check for updates": "Перевірити оновлення", "Check for updates": "Перевірити оновлення",
@@ -415,8 +416,8 @@
"Model {{modelId}} not found": "Модель {{modelId}} не знайдено", "Model {{modelId}} not found": "Модель {{modelId}} не знайдено",
"Model {{modelName}} is not vision capable": "Модель {{modelName}} не здатна бачити", "Model {{modelName}} is not vision capable": "Модель {{modelName}} не здатна бачити",
"Model {{name}} is now {{status}}": "Модель {{name}} тепер має {{status}}", "Model {{name}} is now {{status}}": "Модель {{name}} тепер має {{status}}",
"Model {{name}} is now at the top": "", "Model {{name}} is now at the top": "Модель {{name}} тепер на першому місці",
"Model accepts image inputs": "", "Model accepts image inputs": "Модель приймає зображеня",
"Model created successfully!": "Модель створено успішно!", "Model created successfully!": "Модель створено успішно!",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.",
"Model ID": "ID моделі", "Model ID": "ID моделі",
@@ -428,7 +429,7 @@
"Modelfile Content": "Вміст файлу моделі", "Modelfile Content": "Вміст файлу моделі",
"Models": "Моделі", "Models": "Моделі",
"More": "Більше", "More": "Більше",
"Move to Top": "", "Move to Top": "Перейти до початку",
"Name": "Ім'я", "Name": "Ім'я",
"Name Tag": "Назва тегу", "Name Tag": "Назва тегу",
"Name your model": "Назвіть свою модель", "Name your model": "Назвіть свою модель",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Схоже, що URL-адреса невірна. Будь ласка, перевірте ще раз та спробуйте ще раз.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Схоже, що URL-адреса невірна. Будь ласка, перевірте ще раз та спробуйте ще раз.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Упс! У попередній відповіді сталася помилка. Будь ласка, спробуйте ще раз або зверніться до адміністратора.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Упс! У попередній відповіді сталася помилка. Будь ласка, спробуйте ще раз або зверніться до адміністратора.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Ви використовуєте непідтримуваний метод (тільки для фронтенду). Будь ласка, обслуговуйте WebUI з бекенду.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Ви використовуєте непідтримуваний метод (тільки для фронтенду). Будь ласка, обслуговуйте WebUI з бекенду.",
"Open file": "Відкрити файл",
"Open new chat": "Відкрити новий чат", "Open new chat": "Відкрити новий чат",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI версія (v{{OPEN_WEBUI_VERSION}}) нижча за необхідну версію (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI версія (v{{OPEN_WEBUI_VERSION}}) нижча за необхідну версію (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -474,8 +476,9 @@
"OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.", "OpenAI URL/Key required.": "Потрібен OpenAI URL/ключ.",
"or": "або", "or": "або",
"Other": "Інше", "Other": "Інше",
"Output format": "", "Output format": "Формат відповіді",
"Overview": "", "Overview": "Огляд",
"page": "сторінка",
"Password": "Пароль", "Password": "Пароль",
"PDF document (.pdf)": "PDF документ (.pdf)", "PDF document (.pdf)": "PDF документ (.pdf)",
"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)", "PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Простий текст (.txt)", "Plain text (.txt)": "Простий текст (.txt)",
"Playground": "Майданчик", "Playground": "Майданчик",
"Please carefully review the following warnings:": "Будь ласка, уважно ознайомтеся з наступними попередженнями:", "Please carefully review the following warnings:": "Будь ласка, уважно ознайомтеся з наступними попередженнями:",
"Please select a reason": "",
"Positive attitude": "Позитивне ставлення", "Positive attitude": "Позитивне ставлення",
"Previous 30 days": "Попередні 30 днів", "Previous 30 days": "Попередні 30 днів",
"Previous 7 days": "Попередні 7 днів", "Previous 7 days": "Попередні 7 днів",
@@ -538,7 +542,7 @@
"Save": "Зберегти", "Save": "Зберегти",
"Save & Create": "Зберегти та створити", "Save & Create": "Зберегти та створити",
"Save & Update": "Зберегти та оновити", "Save & Update": "Зберегти та оновити",
"Save As Copy": "", "Save As Copy": "Зберегти як копію",
"Save Tag": "Зберегти тег", "Save Tag": "Зберегти тег",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Збереження журналів чату безпосередньо в сховище вашого браузера більше не підтримується. Будь ласка, завантажте та видаліть журнали чату, натиснувши кнопку нижче. Не хвилюйтеся, ви можете легко повторно імпортувати журнали чату до бекенду через", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Збереження журналів чату безпосередньо в сховище вашого браузера більше не підтримується. Будь ласка, завантажте та видаліть журнали чату, натиснувши кнопку нижче. Не хвилюйтеся, ви можете легко повторно імпортувати журнали чату до бекенду через",
"Scan": "Сканування", "Scan": "Сканування",
@@ -583,7 +587,7 @@
"Send": "Надіслати", "Send": "Надіслати",
"Send a Message": "Надіслати повідомлення", "Send a Message": "Надіслати повідомлення",
"Send message": "Надіслати повідомлення", "Send message": "Надіслати повідомлення",
"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Відправляє `stream_options: { include_usage: true }` у запиті.\nПідтримувані постачальники повернуть інформацію про використання токену у відповіді, якщо вона встановлена.",
"September": "Вересень", "September": "Вересень",
"Serper API Key": "Ключ API Serper", "Serper API Key": "Ключ API Serper",
"Serply API Key": "Ключ API Serply", "Serply API Key": "Ключ API Serply",
@@ -617,11 +621,11 @@
"Sign up": "Зареєструватися", "Sign up": "Зареєструватися",
"Signing in": "Увійдіть в систему", "Signing in": "Увійдіть в систему",
"Source": "Джерело", "Source": "Джерело",
"Speech Playback Speed": "Швидкість відтворення мовлення",
"Speech recognition error: {{error}}": "Помилка розпізнавання мови: {{error}}", "Speech recognition error: {{error}}": "Помилка розпізнавання мови: {{error}}",
"Speech-to-Text Engine": "Система розпізнавання мови", "Speech-to-Text Engine": "Система розпізнавання мови",
"Speed Rate": "",
"Stop Sequence": "Символ зупинки", "Stop Sequence": "Символ зупинки",
"Stream Chat Response": "", "Stream Chat Response": "Відповідь стрім-чату",
"STT Model": "Модель STT ", "STT Model": "Модель STT ",
"STT Settings": "Налаштування STT", "STT Settings": "Налаштування STT",
"Submit": "Надіслати", "Submit": "Надіслати",
@@ -701,6 +705,7 @@
"Unpin": "Відчепити", "Unpin": "Відчепити",
"Update": "Оновлення", "Update": "Оновлення",
"Update and Copy Link": "Оновлення та копіювання посилання", "Update and Copy Link": "Оновлення та копіювання посилання",
"Update for the latest features and improvements.": "Оновіть програми для нових функцій та покращень.",
"Update password": "Оновити пароль", "Update password": "Оновити пароль",
"Updated at": "Оновлено на", "Updated at": "Оновлено на",
"Upload": "Завантажити", "Upload": "Завантажити",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}}'s Chats", "{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend", "{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Mô hình tác vụ được sử dụng khi thực hiện các tác vụ như tạo tiêu đề cho cuộc trò chuyện và truy vấn tìm kiếm trên web", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Mô hình tác vụ được sử dụng khi thực hiện các tác vụ như tạo tiêu đề cho cuộc trò chuyện và truy vấn tìm kiếm trên web",
"a user": "người sử dụng", "a user": "người sử dụng",
"About": "Giới thiệu", "About": "Giới thiệu",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Rất tiếc! URL dường như không hợp lệ. Vui lòng kiểm tra lại và thử lại.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Rất tiếc! URL dường như không hợp lệ. Vui lòng kiểm tra lại và thử lại.",
"Oops! There was an error in the previous response. Please try again or contact admin.": "Rất tiếc! Đã xảy ra lỗi trong phản hồi trước đó. Vui lòng thử lại hoặc liên hệ với quản trị viên.", "Oops! There was an error in the previous response. Please try again or contact admin.": "Rất tiếc! Đã xảy ra lỗi trong phản hồi trước đó. Vui lòng thử lại hoặc liên hệ với quản trị viên.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Rất tiếc! Bạn đang sử dụng một phương thức không được hỗ trợ (chỉ dành cho frontend). Vui lòng cung cấp phương thức cho WebUI từ phía backend.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Rất tiếc! Bạn đang sử dụng một phương thức không được hỗ trợ (chỉ dành cho frontend). Vui lòng cung cấp phương thức cho WebUI từ phía backend.",
"Open file": "",
"Open new chat": "Mở nội dung chat mới", "Open new chat": "Mở nội dung chat mới",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Phiên bản Open WebUI (v{{OPEN_WEBUI_VERSION}}) hiện thấp hơn phiên bản bắt buộc (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Phiên bản Open WebUI (v{{OPEN_WEBUI_VERSION}}) hiện thấp hơn phiên bản bắt buộc (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "Khác", "Other": "Khác",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "Mật khẩu", "Password": "Mật khẩu",
"PDF document (.pdf)": "Tập tin PDF (.pdf)", "PDF document (.pdf)": "Tập tin PDF (.pdf)",
"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)", "PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "Văn bản thô (.txt)", "Plain text (.txt)": "Văn bản thô (.txt)",
"Playground": "Thử nghiệm (Playground)", "Playground": "Thử nghiệm (Playground)",
"Please carefully review the following warnings:": "Vui lòng xem xét cẩn thận các cảnh báo sau:", "Please carefully review the following warnings:": "Vui lòng xem xét cẩn thận các cảnh báo sau:",
"Please select a reason": "",
"Positive attitude": "Thái độ tích cực", "Positive attitude": "Thái độ tích cực",
"Previous 30 days": "30 ngày trước", "Previous 30 days": "30 ngày trước",
"Previous 7 days": "7 ngày trước", "Previous 7 days": "7 ngày trước",
@@ -614,9 +618,9 @@
"Sign up": "Đăng ký", "Sign up": "Đăng ký",
"Signing in": "Đăng nhập", "Signing in": "Đăng nhập",
"Source": "Nguồn", "Source": "Nguồn",
"Speech Playback Speed": "",
"Speech recognition error: {{error}}": "Lỗi nhận dạng giọng nói: {{error}}", "Speech recognition error: {{error}}": "Lỗi nhận dạng giọng nói: {{error}}",
"Speech-to-Text Engine": "Công cụ Nhận dạng Giọng nói", "Speech-to-Text Engine": "Công cụ Nhận dạng Giọng nói",
"Speed Rate": "",
"Stop Sequence": "Trình tự Dừng", "Stop Sequence": "Trình tự Dừng",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "", "STT Model": "",
@@ -698,6 +702,7 @@
"Unpin": "Bỏ ghim", "Unpin": "Bỏ ghim",
"Update": "Cập nhật", "Update": "Cập nhật",
"Update and Copy Link": "Cập nhật và sao chép link", "Update and Copy Link": "Cập nhật và sao chép link",
"Update for the latest features and improvements.": "",
"Update password": "Cập nhật mật khẩu", "Update password": "Cập nhật mật khẩu",
"Updated at": "Cập nhật lúc", "Updated at": "Cập nhật lúc",
"Upload": "", "Upload": "",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} 的对话记录", "{{user}}'s Chats": "{{user}} 的对话记录",
"{{webUIName}} Backend Required": "需要 {{webUIName}} 后端", "{{webUIName}} Backend Required": "需要 {{webUIName}} 后端",
"*Prompt node ID(s) are required for image generation": "*图片生成需要 Prompt node ID", "*Prompt node ID(s) are required for image generation": "*图片生成需要 Prompt node ID",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "任务模型用于执行生成对话标题和联网搜索查询等任务", "A task model is used when performing tasks such as generating titles for chats and web search queries": "任务模型用于执行生成对话标题和联网搜索查询等任务",
"a user": "用户", "a user": "用户",
"About": "关于", "About": "关于",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "糟糕!此链接似乎为无效链接。请检查后重试。", "Oops! Looks like the URL is invalid. Please double-check and try again.": "糟糕!此链接似乎为无效链接。请检查后重试。",
"Oops! There was an error in the previous response. Please try again or contact admin.": "糟糕!之前的回复出现了错误。请重试或联系管理员。", "Oops! There was an error in the previous response. Please try again or contact admin.": "糟糕!之前的回复出现了错误。请重试或联系管理员。",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "糟糕!你正在使用不被支持的方法(仅前端)。请从后端提供 WebUI 服务。", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "糟糕!你正在使用不被支持的方法(仅前端)。请从后端提供 WebUI 服务。",
"Open file": "",
"Open new chat": "打开新对话", "Open new chat": "打开新对话",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "当前 Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低于所需的版本 (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "当前 Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低于所需的版本 (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "其他", "Other": "其他",
"Output format": "输出格式", "Output format": "输出格式",
"Overview": "概述", "Overview": "概述",
"page": "",
"Password": "密码", "Password": "密码",
"PDF document (.pdf)": "PDF 文档 (.pdf)", "PDF document (.pdf)": "PDF 文档 (.pdf)",
"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)", "PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "TXT 文档 (.txt)", "Plain text (.txt)": "TXT 文档 (.txt)",
"Playground": "AI 对话游乐场", "Playground": "AI 对话游乐场",
"Please carefully review the following warnings:": "请仔细阅读以下警告信息:", "Please carefully review the following warnings:": "请仔细阅读以下警告信息:",
"Please select a reason": "",
"Positive attitude": "积极的态度", "Positive attitude": "积极的态度",
"Previous 30 days": "过去 30 天", "Previous 30 days": "过去 30 天",
"Previous 7 days": "过去 7 天", "Previous 7 days": "过去 7 天",
@@ -614,9 +618,9 @@
"Sign up": "注册", "Sign up": "注册",
"Signing in": "正在登录", "Signing in": "正在登录",
"Source": "来源", "Source": "来源",
"Speech Playback Speed": "语音播放速度",
"Speech recognition error: {{error}}": "语音识别错误:{{error}}", "Speech recognition error: {{error}}": "语音识别错误:{{error}}",
"Speech-to-Text Engine": "语音转文本引擎", "Speech-to-Text Engine": "语音转文本引擎",
"Speed Rate": "速率",
"Stop Sequence": "停止序列 (Stop Sequence)", "Stop Sequence": "停止序列 (Stop Sequence)",
"Stream Chat Response": "以流式返回对话响应", "Stream Chat Response": "以流式返回对话响应",
"STT Model": "语音转文本模型", "STT Model": "语音转文本模型",
@@ -698,6 +702,7 @@
"Unpin": "取消置顶", "Unpin": "取消置顶",
"Update": "更新", "Update": "更新",
"Update and Copy Link": "更新和复制链接", "Update and Copy Link": "更新和复制链接",
"Update for the latest features and improvements.": "",
"Update password": "更新密码", "Update password": "更新密码",
"Updated at": "更新于", "Updated at": "更新于",
"Upload": "上传", "Upload": "上传",
+6 -1
View File
@@ -9,6 +9,7 @@
"{{user}}'s Chats": "{{user}} 的對話", "{{user}}'s Chats": "{{user}} 的對話",
"{{webUIName}} Backend Required": "需要 {{webUIName}} 後端", "{{webUIName}} Backend Required": "需要 {{webUIName}} 後端",
"*Prompt node ID(s) are required for image generation": "", "*Prompt node ID(s) are required for image generation": "",
"A new version (v{{LATEST_VERSION}}) is now available.": "",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "執行產生對話標題和網頁搜尋查詢等任務時會使用任務模型", "A task model is used when performing tasks such as generating titles for chats and web search queries": "執行產生對話標題和網頁搜尋查詢等任務時會使用任務模型",
"a user": "一位使用者", "a user": "一位使用者",
"About": "關於", "About": "關於",
@@ -465,6 +466,7 @@
"Oops! Looks like the URL is invalid. Please double-check and try again.": "哎呀!這個 URL 似乎無效。請仔細檢查並再試一次。", "Oops! Looks like the URL is invalid. Please double-check and try again.": "哎呀!這個 URL 似乎無效。請仔細檢查並再試一次。",
"Oops! There was an error in the previous response. Please try again or contact admin.": "哎呀!先前的回應發生錯誤。請重試或聯絡管理員。", "Oops! There was an error in the previous response. Please try again or contact admin.": "哎呀!先前的回應發生錯誤。請重試或聯絡管理員。",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "哎呀!您使用了不支援的方法(僅限前端)。請從後端提供 WebUI。", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "哎呀!您使用了不支援的方法(僅限前端)。請從後端提供 WebUI。",
"Open file": "",
"Open new chat": "開啟新的對話", "Open new chat": "開啟新的對話",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低於所需版本 (v{{REQUIRED_VERSION}})", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低於所需版本 (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
@@ -476,6 +478,7 @@
"Other": "其他", "Other": "其他",
"Output format": "", "Output format": "",
"Overview": "", "Overview": "",
"page": "",
"Password": "密碼", "Password": "密碼",
"PDF document (.pdf)": "PDF 文件 (.pdf)", "PDF document (.pdf)": "PDF 文件 (.pdf)",
"PDF Extract Images (OCR)": "PDF 影像擷取(OCR 光學文字辨識)", "PDF Extract Images (OCR)": "PDF 影像擷取(OCR 光學文字辨識)",
@@ -494,6 +497,7 @@
"Plain text (.txt)": "純文字 (.txt)", "Plain text (.txt)": "純文字 (.txt)",
"Playground": "遊樂場", "Playground": "遊樂場",
"Please carefully review the following warnings:": "請仔細閱讀以下警告:", "Please carefully review the following warnings:": "請仔細閱讀以下警告:",
"Please select a reason": "",
"Positive attitude": "積極的態度", "Positive attitude": "積極的態度",
"Previous 30 days": "過去 30 天", "Previous 30 days": "過去 30 天",
"Previous 7 days": "過去 7 天", "Previous 7 days": "過去 7 天",
@@ -615,9 +619,9 @@
"Sign up": "註冊", "Sign up": "註冊",
"Signing in": "正在登入", "Signing in": "正在登入",
"Source": "來源", "Source": "來源",
"Speech Playback Speed": "語音播放速度",
"Speech recognition error: {{error}}": "語音辨識錯誤:{{error}}", "Speech recognition error: {{error}}": "語音辨識錯誤:{{error}}",
"Speech-to-Text Engine": "語音轉文字 (STT) 引擎", "Speech-to-Text Engine": "語音轉文字 (STT) 引擎",
"Speed Rate": "",
"Stop Sequence": "停止序列", "Stop Sequence": "停止序列",
"Stream Chat Response": "", "Stream Chat Response": "",
"STT Model": "語音轉文字 (STT) 模型", "STT Model": "語音轉文字 (STT) 模型",
@@ -699,6 +703,7 @@
"Unpin": "取消釘選", "Unpin": "取消釘選",
"Update": "更新", "Update": "更新",
"Update and Copy Link": "更新並複製連結", "Update and Copy Link": "更新並複製連結",
"Update for the latest features and improvements.": "",
"Update password": "更新密碼", "Update password": "更新密碼",
"Updated at": "更新於", "Updated at": "更新於",
"Upload": "上傳", "Upload": "上傳",
+2
View File
@@ -19,7 +19,9 @@ export const activeUserCount: Writable<null | number> = writable(null);
export const USAGE_POOL: Writable<null | string[]> = writable(null); export const USAGE_POOL: Writable<null | string[]> = writable(null);
export const theme = writable('system'); export const theme = writable('system');
export const chatId = writable(''); export const chatId = writable('');
export const chatTitle = writable('');
export const chats = writable([]); export const chats = writable([]);
export const pinnedChats = writable([]); export const pinnedChats = writable([]);
+47 -19
View File
@@ -8,23 +8,6 @@ import { TTS_RESPONSE_SPLIT } from '$lib/types';
// Helper functions // Helper functions
////////////////////////// //////////////////////////
const convertLatexToSingleLine = (content) => {
// Patterns to match multiline LaTeX blocks
const patterns = [
/(\$\$\s[\s\S]*?\s\$\$)/g, // Match $$ ... $$
/(\\\[[\s\S]*?\\\])/g, // Match \[ ... \]
/(\\begin\{[a-z]+\}[\s\S]*?\\end\{[a-z]+\})/g // Match \begin{...} ... \end{...}
];
patterns.forEach((pattern) => {
content = content.replace(pattern, (match) => {
return match.replace(/\s*\n\s*/g, ' ').trim();
});
});
return content;
};
export const replaceTokens = (content, char, user) => { export const replaceTokens = (content, char, user) => {
const charToken = /{{char}}/gi; const charToken = /{{char}}/gi;
const userToken = /{{user}}/gi; const userToken = /{{user}}/gi;
@@ -68,7 +51,6 @@ export const sanitizeResponseContent = (content: string) => {
}; };
export const processResponseContent = (content: string) => { export const processResponseContent = (content: string) => {
content = convertLatexToSingleLine(content);
return content.trim(); return content.trim();
}; };
@@ -664,6 +646,15 @@ export const promptTemplate = (
hour12: true hour12: true
}); });
// Get the current weekday
const currentWeekday = getWeekday();
// Get the user's timezone
const currentTimezone = getUserTimezone();
// Get the user's language
const userLanguage = localStorage.getItem('locale') || 'en-US';
// Replace {{CURRENT_DATETIME}} in the template with the formatted datetime // Replace {{CURRENT_DATETIME}} in the template with the formatted datetime
template = template.replace('{{CURRENT_DATETIME}}', `${formattedDate} ${currentTime}`); template = template.replace('{{CURRENT_DATETIME}}', `${formattedDate} ${currentTime}`);
@@ -673,6 +664,15 @@ export const promptTemplate = (
// Replace {{CURRENT_TIME}} in the template with the formatted time // Replace {{CURRENT_TIME}} in the template with the formatted time
template = template.replace('{{CURRENT_TIME}}', currentTime); template = template.replace('{{CURRENT_TIME}}', currentTime);
// Replace {{CURRENT_WEEKDAY}} in the template with the current weekday
template = template.replace('{{CURRENT_WEEKDAY}}', currentWeekday);
// Replace {{CURRENT_TIMEZONE}} in the template with the user's timezone
template = template.replace('{{CURRENT_TIMEZONE}}', currentTimezone);
// Replace {{USER_LANGUAGE}} in the template with the user's language
template = template.replace('{{USER_LANGUAGE}}', userLanguage);
if (user_name) { if (user_name) {
// Replace {{USER_NAME}} in the template with the user's name // Replace {{USER_NAME}} in the template with the user's name
template = template.replace('{{USER_NAME}}', user_name); template = template.replace('{{USER_NAME}}', user_name);
@@ -829,6 +829,34 @@ export const bestMatchingLanguage = (supportedLanguages, preferredLanguages, def
.map((prefLang) => languages.find((lang) => lang.startsWith(prefLang))) .map((prefLang) => languages.find((lang) => lang.startsWith(prefLang)))
.find(Boolean); .find(Boolean);
console.log(languages, preferredLanguages, match, defaultLocale);
return match || defaultLocale; return match || defaultLocale;
}; };
// Get the date in the format YYYY-MM-DD
export const getFormattedDate = () => {
const date = new Date();
return date.toISOString().split('T')[0];
};
// Get the time in the format HH:MM:SS
export const getFormattedTime = () => {
const date = new Date();
return date.toTimeString().split(' ')[0];
};
// Get the current date and time in the format YYYY-MM-DD HH:MM:SS
export const getCurrentDateTime = () => {
return `${getFormattedDate()} ${getFormattedTime()}`;
};
// Get the user's timezone
export const getUserTimezone = () => {
return Intl.DateTimeFormat().resolvedOptions().timeZone;
};
// Get the weekday
export const getWeekday = () => {
const date = new Date();
const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
return weekdays[date.getDay()];
};
+91 -77
View File
@@ -1,14 +1,13 @@
import katex from 'katex'; import katex from 'katex';
const DELIMITER_LIST = [ const DELIMITER_LIST = [
{ left: '$$', right: '$$', display: false }, { left: '$$', right: '$$', display: true },
{ left: '$', right: '$', display: false }, { left: '$', right: '$', display: false },
{ left: '\\pu{', right: '}', display: false }, { left: '\\pu{', right: '}', display: false },
{ left: '\\ce{', right: '}', display: false }, { left: '\\ce{', right: '}', display: false },
{ left: '\\(', right: '\\)', display: false }, { left: '\\(', right: '\\)', display: false },
{ left: '( ', right: ' )', display: false },
{ left: '\\[', right: '\\]', display: true }, { left: '\\[', right: '\\]', display: true },
{ left: '[ ', right: ' ]', display: true } { left: '\\begin{equation}', right: '\\end{equation}', display: true }
]; ];
// const DELIMITER_LIST = [ // const DELIMITER_LIST = [
@@ -28,24 +27,27 @@ function escapeRegex(string) {
function generateRegexRules(delimiters) { function generateRegexRules(delimiters) {
delimiters.forEach((delimiter) => { delimiters.forEach((delimiter) => {
const { left, right } = delimiter; const { left, right, display } = delimiter;
// Ensure regex-safe delimiters // Ensure regex-safe delimiters
const escapedLeft = escapeRegex(left); const escapedLeft = escapeRegex(left);
const escapedRight = escapeRegex(right); const escapedRight = escapeRegex(right);
// Inline pattern - Capture group $1, token content, followed by end delimiter and normal punctuation marks. if (!display) {
// Example: $text$ // For inline delimiters, we match everyting
inlinePatterns.push( inlinePatterns.push(`${escapedLeft}((?:\\\\[^]|[^\\\\])+?)${escapedRight}`);
`${escapedLeft}((?:\\\\.|[^\\\\\\n])*?(?:\\\\.|[^\\\\\\n${escapedRight}]))${escapedRight}` } else {
); // Block delimiters doubles as inline delimiters when not followed by a newline
inlinePatterns.push(`${escapedLeft}(?!\\n)((?:\\\\[^]|[^\\\\])+?)(?!\\n)${escapedRight}`);
// Block pattern - Starts and ends with the delimiter on new lines. Example: blockPatterns.push(`${escapedLeft}\\n((?:\\\\[^]|[^\\\\])+?)\\n${escapedRight}`);
// $$\ncontent here\n$$ }
blockPatterns.push(`${escapedLeft}\n((?:\\\\[^]|[^\\\\])+?)\n${escapedRight}`);
}); });
const inlineRule = new RegExp(`^(${inlinePatterns.join('|')})(?=[\\s?!.,:?!。,:]|$)`, 'u'); // Math formulas can end in special characters
const blockRule = new RegExp(`^(${blockPatterns.join('|')})(?:\n|$)`, 'u'); const inlineRule = new RegExp(
`^(${inlinePatterns.join('|')})(?=[\\s?。,!-\/:-@[-\`{-~]|$)`,
'u'
);
const blockRule = new RegExp(`^(${blockPatterns.join('|')})(?=[\\s?。,!-\/:-@[-\`{-~]|$)`, 'u');
return { inlineRule, blockRule }; return { inlineRule, blockRule };
} }
@@ -54,85 +56,97 @@ const { inlineRule, blockRule } = generateRegexRules(DELIMITER_LIST);
export default function (options = {}) { export default function (options = {}) {
return { return {
extensions: [ extensions: [inlineKatex(options), blockKatex(options)]
inlineKatex(options, createRenderer(options, false)),
blockKatex(options, createRenderer(options, true))
]
}; };
} }
function createRenderer(options, newlineAfter) { function katexStart(src, displayMode: boolean) {
return (token) => let ruleReg = displayMode ? blockRule : inlineRule;
katex.renderToString(token.text, { ...options, displayMode: token.displayMode }) +
(newlineAfter ? '\n' : ''); let indexSrc = src;
while (indexSrc) {
let index = -1;
let startIndex = -1;
let startDelimiter = '';
let endDelimiter = '';
for (let delimiter of DELIMITER_LIST) {
if (delimiter.display !== displayMode) {
continue;
}
startIndex = indexSrc.indexOf(delimiter.left);
if (startIndex === -1) {
continue;
}
index = startIndex;
startDelimiter = delimiter.left;
endDelimiter = delimiter.right;
}
if (index === -1) {
return;
}
// Check if the delimiter is preceded by a special character.
// If it does, then it's potentially a math formula.
const f = index === 0 || indexSrc.charAt(index - 1).match(/[\s?。,!-\/:-@[-`{-~]/);
if (f) {
const possibleKatex = indexSrc.substring(index);
if (possibleKatex.match(ruleReg)) {
return index;
}
}
indexSrc = indexSrc.substring(index + startDelimiter.length).replace(endDelimiter, '');
}
} }
function inlineKatex(options, renderer) { function katexTokenizer(src, tokens, displayMode: boolean) {
const ruleReg = inlineRule; let ruleReg = displayMode ? blockRule : inlineRule;
let type = displayMode ? 'blockKatex' : 'inlineKatex';
const match = src.match(ruleReg);
if (match) {
const text = match
.slice(2)
.filter((item) => item)
.find((item) => item.trim());
return {
type,
raw: match[0],
text: text,
displayMode
};
}
}
function inlineKatex(options) {
return { return {
name: 'inlineKatex', name: 'inlineKatex',
level: 'inline', level: 'inline',
start(src) { start(src) {
let index; return katexStart(src, false);
let indexSrc = src;
while (indexSrc) {
index = indexSrc.indexOf('$');
if (index === -1) {
return;
}
const f = index === 0 || indexSrc.charAt(index - 1) === ' ';
if (f) {
const possibleKatex = indexSrc.substring(index);
if (possibleKatex.match(ruleReg)) {
return index;
}
}
indexSrc = indexSrc.substring(index + 1).replace(/^\$+/, '');
}
}, },
tokenizer(src, tokens) { tokenizer(src, tokens) {
const match = src.match(ruleReg); return katexTokenizer(src, tokens, false);
}
if (match) {
const text = match
.slice(2)
.filter((item) => item)
.find((item) => item.trim());
return {
type: 'inlineKatex',
raw: match[0],
text: text
};
}
},
renderer
}; };
} }
function blockKatex(options, renderer) { function blockKatex(options) {
return { return {
name: 'blockKatex', name: 'blockKatex',
level: 'block', level: 'block',
tokenizer(src, tokens) { start(src) {
const match = src.match(blockRule); return katexStart(src, true);
if (match) {
const text = match
.slice(2)
.filter((item) => item)
.find((item) => item.trim());
return {
type: 'blockKatex',
raw: match[0],
text: text
};
}
}, },
renderer tokenizer(src, tokens) {
return katexTokenizer(src, tokens, true);
}
}; };
} }
+37 -1
View File
@@ -9,7 +9,7 @@
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { getModels as _getModels } from '$lib/apis'; import { getModels as _getModels, getVersionUpdates } from '$lib/apis';
import { getAllChatTags } from '$lib/apis/chats'; import { getAllChatTags } from '$lib/apis/chats';
import { getPrompts } from '$lib/apis/prompts'; import { getPrompts } from '$lib/apis/prompts';
@@ -42,6 +42,11 @@
import AccountPending from '$lib/components/layout/Overlay/AccountPending.svelte'; import AccountPending from '$lib/components/layout/Overlay/AccountPending.svelte';
import { getFunctions } from '$lib/apis/functions'; import { getFunctions } from '$lib/apis/functions';
import { page } from '$app/stores'; import { page } from '$app/stores';
import { WEBUI_VERSION } from '$lib/constants';
import { compareVersion } from '$lib/utils';
import UpdateInfoToast from '$lib/components/layout/UpdateInfoToast.svelte';
import { fade } from 'svelte/transition';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@@ -49,6 +54,8 @@
let DB = null; let DB = null;
let localDBChats = []; let localDBChats = [];
let version;
const getModels = async () => { const getModels = async () => {
return _getModels(localStorage.token); return _getModels(localStorage.token);
}; };
@@ -191,16 +198,45 @@
temporaryChatEnabled.set(true); temporaryChatEnabled.set(true);
} }
// Check for version updates
if ($user.role === 'admin') {
// Check if the user has dismissed the update toast in the last 24 hours
if (localStorage.dismissedUpdateToast) {
const dismissedUpdateToast = new Date(Number(localStorage.dismissedUpdateToast));
const now = new Date();
if (now - dismissedUpdateToast > 24 * 60 * 60 * 1000) {
await checkForVersionUpdates();
}
} else {
await checkForVersionUpdates();
}
}
await tick(); await tick();
} }
loaded = true; loaded = true;
}); });
const checkForVersionUpdates = async () => {
version = await getVersionUpdates(localStorage.token).catch((error) => {
return {
current: WEBUI_VERSION,
latest: WEBUI_VERSION
};
});
};
</script> </script>
<SettingsModal bind:show={$showSettings} /> <SettingsModal bind:show={$showSettings} />
<ChangelogModal bind:show={$showChangelog} /> <ChangelogModal bind:show={$showChangelog} />
{#if version && compareVersion(version.latest, version.current)}
<div class=" absolute bottom-8 right-8 z-50" in:fade={{ duration: 100 }}>
<UpdateInfoToast {version} />
</div>
{/if}
<div class="app relative"> <div class="app relative">
<div <div
class=" text-gray-700 dark:text-gray-100 bg-white dark:bg-gray-900 h-screen max-h-[100dvh] overflow-auto flex flex-row" class=" text-gray-700 dark:text-gray-100 bg-white dark:bg-gray-900 h-screen max-h-[100dvh] overflow-auto flex flex-row"
+11 -1
View File
@@ -209,4 +209,14 @@
<slot /> <slot />
{/if} {/if}
<Toaster richColors position="top-center" /> <Toaster
theme={$theme.includes('dark')
? 'dark'
: $theme === 'system'
? window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light'
: 'light'}
richColors
position="top-center"
/>
+1 -1
View File
@@ -155,7 +155,7 @@
bind:autoScroll bind:autoScroll
bottomPadding={files.length > 0} bottomPadding={files.length > 0}
sendPrompt={() => {}} sendPrompt={() => {}}
continueGeneration={() => {}} continueResponse={() => {}}
regenerateResponse={() => {}} regenerateResponse={() => {}}
/> />
</div> </div>
Generated
+329 -13
View File
@@ -321,6 +321,44 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764 }, { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764 },
] ]
[[package]]
name = "bitarray"
version = "2.9.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/c7/bf/25cf92a83e1fe4948d7935ae3c02f4c9ff9cb9c13e977fba8af11a5f642c/bitarray-2.9.2.tar.gz", hash = "sha256:a8f286a51a32323715d77755ed959f94bef13972e9a2fe71b609e40e6d27957e", size = 132825 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/32/86/a02960105c0a40e7e4cbc74933f070ab476312d20aa25f6959f4abe5095b/bitarray-2.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fe71fd4b76380c2772f96f1e53a524da7063645d647a4fcd3b651bdd80ca0f2e", size = 177175 },
{ url = "https://files.pythonhosted.org/packages/8d/fd/ce16db75d5470f9676089428500ef0d473f4e2ff1dcbcf1f856bcd351ea2/bitarray-2.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d527172919cdea1e13994a66d9708a80c3d33dedcf2f0548e4925e600fef3a3a", size = 128273 },
{ url = "https://files.pythonhosted.org/packages/06/60/c1a419f8abd0c9d2641e3e570fc63ad3a87a63ef88a362900e3254f780bc/bitarray-2.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:052c5073bdcaa9dd10628d99d37a2f33ec09364b86dd1f6281e2d9f8d3db3060", size = 124642 },
{ url = "https://files.pythonhosted.org/packages/9e/af/bba89e6f9499fb9dba04b701c8106a1dcc94b5913f35ed20f089da8bea99/bitarray-2.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e064caa55a6ed493aca1eda06f8b3f689778bc780a75e6ad7724642ba5dc62f7", size = 296283 },
{ url = "https://files.pythonhosted.org/packages/8f/44/19e91ffc42a2ded4f1ee73f7923186cf1606cab1119b1d5df24c9cea763e/bitarray-2.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:508069a04f658210fdeee85a7a0ca84db4bcc110cbb1d21f692caa13210f24a7", size = 311309 },
{ url = "https://files.pythonhosted.org/packages/9f/76/eedaa1fcb60af30536af70f6659e3a86dcfdce3e413b188f7864513e4923/bitarray-2.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4da73ebd537d75fa7bccfc2228fcaedea0803f21dd9d0bf0d3b67fef3c4af294", size = 314220 },
{ url = "https://files.pythonhosted.org/packages/21/fa/9fb7266b28ce1c8778aaea650c75855640ea1ada91a80c47c90376994a59/bitarray-2.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cb378eaa65cd43098f11ff5d27e48ee3b956d2c00d2d6b5bfc2a09fe183be47", size = 296519 },
{ url = "https://files.pythonhosted.org/packages/c4/ee/c9a92c123f9b0438498d0a8f9470439a43bdafbf042cbdceab7968e5bb1c/bitarray-2.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d14c790b91f6cbcd9b718f88ed737c78939980c69ac8c7f03dd7e60040c12951", size = 286784 },
{ url = "https://files.pythonhosted.org/packages/81/7f/0d9c16a7e321f5cb1d6c634acf4f8620513634776ceeee6f8f732b992fae/bitarray-2.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eea9318293bc0ea6447e9ebfba600a62f3428bea7e9c6d42170ae4f481dbab3", size = 328319 },
{ url = "https://files.pythonhosted.org/packages/2e/98/0730518cf071366633dd027e14e3fba91dc91dd8b4e60d6ae249cde3f53f/bitarray-2.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b76ffec27c7450b8a334f967366a9ebadaea66ee43f5b530c12861b1a991f503", size = 315614 },
{ url = "https://files.pythonhosted.org/packages/4c/b3/8f198444cd2312d520e0372f933932fff68b5900eb2dbab91725924aa7a1/bitarray-2.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:76b76a07d4ee611405045c6950a1e24c4362b6b44808d4ad6eea75e0dbc59af4", size = 340143 },
{ url = "https://files.pythonhosted.org/packages/b9/1a/78841fa855ea2dc13d8d61f231bd3a619732738d7d840b4b35d9d8f93e6e/bitarray-2.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c7d16beeaaab15b075990cd26963d6b5b22e8c5becd131781514a00b8bdd04bd", size = 345958 },
{ url = "https://files.pythonhosted.org/packages/b7/9f/aac87cd45cc4d7b7e50dde590327bde525601088e710c8ba00e8743ddb2b/bitarray-2.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60df43e868a615c7e15117a1e1c2e5e11f48f6457280eba6ddf8fbefbec7da99", size = 327122 },
{ url = "https://files.pythonhosted.org/packages/78/3e/5df523037f80cf95f99d0155ec921298f4fa2b1f7be10cb0c4daffb632da/bitarray-2.9.2-cp311-cp311-win32.whl", hash = "sha256:e788608ed7767b7b3bbde6d49058bccdf94df0de9ca75d13aa99020cc7e68095", size = 118627 },
{ url = "https://files.pythonhosted.org/packages/9c/0e/af070131ed7a4fd15cadc84e018d3c6d3b58070513934462b48a5ff9eb1e/bitarray-2.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:a23397da092ef0a8cfe729571da64c2fc30ac18243caa82ac7c4f965087506ff", size = 126013 },
{ url = "https://files.pythonhosted.org/packages/ef/7d/f489f2136cf5ea1af201be12d55bfc57b45731c4b7e3cc6e001efe62effb/bitarray-2.9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:90e3a281ffe3897991091b7c46fca38c2675bfd4399ffe79dfeded6c52715436", size = 176636 },
{ url = "https://files.pythonhosted.org/packages/b8/b6/3e64b19e45b52837e0c4ec1c220bf24dd70dcbcd27e073e07837973f8c16/bitarray-2.9.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bed637b674db5e6c8a97a4a321e3e4d73e72d50b5c6b29950008a93069cc64cd", size = 127916 },
{ url = "https://files.pythonhosted.org/packages/23/c7/12b1e5cdd8678a6a47610a013fafdbe80d62226d49b73185619bd7361c53/bitarray-2.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e49066d251dbbe4e6e3a5c3937d85b589e40e2669ad0eef41a00f82ec17d844b", size = 124475 },
{ url = "https://files.pythonhosted.org/packages/77/e1/02dc3f03348808a77b26556a6c299f68dbbf0c4a27f340a69d574d2d2432/bitarray-2.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4344e96642e2211fb3a50558feff682c31563a4c64529a931769d40832ca79", size = 299121 },
{ url = "https://files.pythonhosted.org/packages/ea/f1/9cdb006c352b47b26532e7ee7798bd2dacf42774eb75e4a353a38a3ff2b3/bitarray-2.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aeb60962ec4813c539a59fbd4f383509c7222b62c3fb1faa76b54943a613e33a", size = 313486 },
{ url = "https://files.pythonhosted.org/packages/bb/79/98bdfea0f390d313fa04546578a3eee3c3a6dbba94973246438ea8c880aa/bitarray-2.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f7982f10581bb16553719e5e8f933e003f5b22f7d25a68bdb30fac630a6ff", size = 317527 },
{ url = "https://files.pythonhosted.org/packages/58/02/21a2038ee856649f03738828e3bc6c4cd9bfd31125a250c6e30d378067ff/bitarray-2.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71d1cabdeee0cdda4669168618f0e46b7dace207b29da7b63aaa1adc2b54081", size = 299885 },
{ url = "https://files.pythonhosted.org/packages/49/97/82c350256a22689fb50ed86af1a3a5509410332cfe55d644fd7ff5e46dbf/bitarray-2.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0ef2d0a6f1502d38d911d25609b44c6cc27bee0a4363dd295df78b075041b60", size = 289796 },
{ url = "https://files.pythonhosted.org/packages/09/69/ca799419b576d015331b19b42c70086b1208ba363f744c8bb7dc31a0bb6a/bitarray-2.9.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6f71d92f533770fb027388b35b6e11988ab89242b883f48a6fe7202d238c61f8", size = 334912 },
{ url = "https://files.pythonhosted.org/packages/fb/8a/dad9d48c72367f76b117957e3d718de07254667f33838d061856b238b576/bitarray-2.9.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba0734aa300757c924f3faf8148e1b8c247176a0ac8e16aefdf9c1eb19e868f7", size = 322790 },
{ url = "https://files.pythonhosted.org/packages/b7/f1/a4f723153e6b4c56a90275a1d6ad04860bd72d9966196eb331cd18b50a12/bitarray-2.9.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:d91406f413ccbf4af6ab5ae7bc78f772a95609f9ddd14123db36ef8c37116d95", size = 346212 },
{ url = "https://files.pythonhosted.org/packages/7f/4f/55301544e90df8a7b798959bffa94e5694b29c964ed9e9e2a52d6cfac9c7/bitarray-2.9.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:87abb7f80c0a042f3fe8e5264da1a2756267450bb602110d5327b8eaff7682e7", size = 353044 },
{ url = "https://files.pythonhosted.org/packages/16/8b/363fdc21aff37ac99dba4ed41c0d535c37b416cd002351a9848173c738f1/bitarray-2.9.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b558ce85579b51a2e38703877d1e93b7728a7af664dd45a34e833534f0b755d", size = 334380 },
{ url = "https://files.pythonhosted.org/packages/66/58/f57a6420b363d2f0517d79b9af9fd608360ef174eb5d1d82cc5a26dbdbde/bitarray-2.9.2-cp312-cp312-win32.whl", hash = "sha256:dac2399ee2889fbdd3472bfc2ede74c34cceb1ccf29a339964281a16eb1d3188", size = 118738 },
{ url = "https://files.pythonhosted.org/packages/93/a9/b9462e2a3b4ee020c6caa1dccece324d6b0c7643b9f0a43d9ac8cd15c9d9/bitarray-2.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:48a30d718d1a6dfc22a49547450107abe8f4afdf2abdcbe76eb9ed88edc49498", size = 126202 },
]
[[package]] [[package]]
name = "black" name = "black"
version = "24.8.0" version = "24.8.0"
@@ -577,6 +615,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 },
] ]
[[package]]
name = "colbert-ai"
version = "0.2.21"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "bitarray" },
{ name = "datasets" },
{ name = "flask" },
{ name = "git-python" },
{ name = "ninja" },
{ name = "python-dotenv" },
{ name = "scipy" },
{ name = "tqdm" },
{ name = "transformers" },
{ name = "ujson" },
]
sdist = { url = "https://files.pythonhosted.org/packages/bc/dc/7edb06e3bb01326610ecfdfc8e396c6867ba7de6e58cda2356a604419899/colbert_ai-0.2.21.tar.gz", hash = "sha256:a8d6fdb4e2272f2b08ed37f8e5096072160d8415d1e40585751898b77e625bab", size = 87978 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8d/9c/5d847be0f05e5266880fb1c183e642a6c34cd6a101c1d6219dfa74887543/colbert_ai-0.2.21-py3-none-any.whl", hash = "sha256:8c17e7be44e7f3989f2067f1176af4f65f4612d62850586657e8afb8314cb2a6", size = 116142 },
]
[[package]] [[package]]
name = "colorama" name = "colorama"
version = "0.4.6" version = "0.4.6"
@@ -677,6 +736,31 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 },
] ]
[[package]]
name = "datasets"
version = "3.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiohttp" },
{ name = "dill" },
{ name = "filelock" },
{ name = "fsspec", extra = ["http"] },
{ name = "huggingface-hub" },
{ name = "multiprocess" },
{ name = "numpy" },
{ name = "packaging" },
{ name = "pandas" },
{ name = "pyarrow" },
{ name = "pyyaml" },
{ name = "requests" },
{ name = "tqdm" },
{ name = "xxhash" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c8/93/38c0d3c74b5932c4bb7596888c3d3b20adfd563e56552f437f8f57e6377b/datasets-3.0.0.tar.gz", hash = "sha256:592317eb137f0fc5aac068ff283ba13c3c66d10c9c034d44bc8aa584126cf3e2", size = 1876827 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a5/52/45dab187f03d48c765b94db0464f5c10431756e47ae4cc6a8029a7d57a36/datasets-3.0.0-py3-none-any.whl", hash = "sha256:c23fefb6c953dcb1cd5f6deb6c502729c733ef98791e0c3f2d80c7ca2d9a01dd", size = 474265 },
]
[[package]] [[package]]
name = "deepdiff" name = "deepdiff"
version = "7.0.1" version = "7.0.1"
@@ -710,6 +794,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", size = 9561 }, { url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", size = 9561 },
] ]
[[package]]
name = "dill"
version = "0.3.8"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/17/4d/ac7ffa80c69ea1df30a8aa11b3578692a5118e7cd1aa157e3ef73b092d15/dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", size = 184847 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c9/7a/cef76fd8438a42f96db64ddaa85280485a9c395e7df3db8158cfec1eee34/dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7", size = 116252 },
]
[[package]] [[package]]
name = "distro" name = "distro"
version = "1.9.0" version = "1.9.0"
@@ -750,15 +843,15 @@ sdist = { url = "https://files.pythonhosted.org/packages/7d/7d/60ee3f2b16d9bfdfa
[[package]] [[package]]
name = "duckduckgo-search" name = "duckduckgo-search"
version = "6.2.11" version = "6.2.13"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "click" }, { name = "click" },
{ name = "primp" }, { name = "primp" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/11/04/c76cd009653ace8d6a4a2a3d7851f5379911091d5d2104eef4bcb4c46c14/duckduckgo_search-6.2.11.tar.gz", hash = "sha256:6b6ef1b552c5e67f23e252025d2504caf6f9fc14f70e86c6dd512200f386c673", size = 32998 } sdist = { url = "https://files.pythonhosted.org/packages/55/2e/fe93c096b2b2bfcbd0a4f3a1de47d9a1c4b0dd4c7573d9f6c2b5c80ce6dc/duckduckgo_search-6.2.13.tar.gz", hash = "sha256:f89a9782f0f47d18c01a761c83453d0aef7a4335d1b6466fc47709652d5ca791", size = 33075 }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/f5/67/b1eb59a859717043b605eb16d4f3afe46ec3614804ac0fbe594339667866/duckduckgo_search-6.2.11-py3-none-any.whl", hash = "sha256:6fb7069b79e8928f487001de6859034ade19201bdcd257ec198802430e374bfe", size = 27429 }, { url = "https://files.pythonhosted.org/packages/e2/07/c0a6d0b1192790364ee9cf655c72c47ad13d68971570f19401f220cac50d/duckduckgo_search-6.2.13-py3-none-any.whl", hash = "sha256:a6618fb2744fa1d081b1bf2e47ef8051de993276a15c20f4e879a150726472de", size = 27468 },
] ]
[[package]] [[package]]
@@ -790,6 +883,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/00/e7/ed3243b30d1bec41675b6394a1daae46349dc2b855cb83be846a5a918238/ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a", size = 149266 }, { url = "https://files.pythonhosted.org/packages/00/e7/ed3243b30d1bec41675b6394a1daae46349dc2b855cb83be846a5a918238/ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a", size = 149266 },
] ]
[[package]]
name = "einops"
version = "0.8.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/79/ca/9f5dcb8bead39959454c3912266bedc4c315839cee0e0ca9f4328f4588c1/einops-0.8.0.tar.gz", hash = "sha256:63486517fed345712a8385c100cb279108d9d47e6ae59099b07657e983deae85", size = 58861 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/44/5a/f0b9ad6c0a9017e62d4735daaeb11ba3b6c009d69a26141b258cd37b5588/einops-0.8.0-py3-none-any.whl", hash = "sha256:9572fb63046264a862693b0a87088af3bdc8c068fde03de63453cbbde245465f", size = 43223 },
]
[[package]] [[package]]
name = "email-validator" name = "email-validator"
version = "2.2.0" version = "2.2.0"
@@ -815,6 +917,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e6/90/20ad30babfa8f2b5ab46281d8e17bdfdbb3ac294cda14d525b9c2d958846/emoji-2.12.1-py3-none-any.whl", hash = "sha256:a00d62173bdadc2510967a381810101624a2f0986145b8da0cffa42e29430235", size = 431357 }, { url = "https://files.pythonhosted.org/packages/e6/90/20ad30babfa8f2b5ab46281d8e17bdfdbb3ac294cda14d525b9c2d958846/emoji-2.12.1-py3-none-any.whl", hash = "sha256:a00d62173bdadc2510967a381810101624a2f0986145b8da0cffa42e29430235", size = 431357 },
] ]
[[package]]
name = "environs"
version = "9.5.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "marshmallow" },
{ name = "python-dotenv" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d4/e3/c3c6c76f3dbe3e019e9a451b35bf9f44690026a5bb1232f7b77097b72ff5/environs-9.5.0.tar.gz", hash = "sha256:a76307b36fbe856bdca7ee9161e6c466fd7fcffc297109a118c59b54e27e30c9", size = 20795 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ca/5e/f0f217dc393372681bfe05c50f06a212e78d0a3fee907a74ab451ec1dcdb/environs-9.5.0-py2.py3-none-any.whl", hash = "sha256:1e549569a3de49c05f856f40bce86979e7d5ffbbc4398e7f338574c220189124", size = 12548 },
]
[[package]] [[package]]
name = "et-xmlfile" name = "et-xmlfile"
version = "1.1.0" version = "1.1.0"
@@ -1044,6 +1159,47 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/5e/44/73bea497ac69bafde2ee4269292fa3b41f1198f4bb7bbaaabde30ad29d4a/fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", size = 177561 }, { url = "https://files.pythonhosted.org/packages/5e/44/73bea497ac69bafde2ee4269292fa3b41f1198f4bb7bbaaabde30ad29d4a/fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", size = 177561 },
] ]
[package.optional-dependencies]
http = [
{ name = "aiohttp" },
]
[[package]]
name = "git-python"
version = "1.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "gitpython" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5b/3c/f0726fd577517ff8f09e6fe49f153ec9c595f1964c02c209c757d473780a/git-python-1.0.3.zip", hash = "sha256:a7f51d07c7a0b0a15cb4dfa78601196dd20624211153d07c092b811edb6e86fb", size = 4286 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/de/0cc6353a45cdb1e137cffac5383097b300cc578e2e1133eeb847e23a1394/git_python-1.0.3-py2.py3-none-any.whl", hash = "sha256:8820ce93786cd11a76d44c7153708588e8056213e4c512406ea3732871aa9ad6", size = 1888 },
]
[[package]]
name = "gitdb"
version = "4.0.11"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "smmap" },
]
sdist = { url = "https://files.pythonhosted.org/packages/19/0d/bbb5b5ee188dec84647a4664f3e11b06ade2bde568dbd489d9d64adef8ed/gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b", size = 394469 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fd/5b/8f0c4a5bb9fd491c277c21eff7ccae71b47d43c4446c9d0c6cff2fe8c2c4/gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4", size = 62721 },
]
[[package]]
name = "gitpython"
version = "3.1.43"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "gitdb" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b6/a1/106fd9fa2dd989b6fb36e5893961f82992cf676381707253e0bf93eb1662/GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c", size = 214149 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", size = 207337 },
]
[[package]] [[package]]
name = "google-ai-generativelanguage" name = "google-ai-generativelanguage"
version = "0.6.6" version = "0.6.6"
@@ -1762,6 +1918,20 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
] ]
[[package]]
name = "milvus-lite"
version = "2.4.10"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "tqdm" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/7c/0b/262997e63e2eaaf5d9f93d73c9d3e75499c6ec058bd1307864be7efb6704/milvus_lite-2.4.10-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:fc4246d3ed7d1910847afce0c9ba18212e93a6e9b8406048436940578dfad5cb", size = 22281832 },
{ url = "https://files.pythonhosted.org/packages/17/20/9054ace78c61d64a6c24b8e3d6c8a73b23b447028e43c4d1e6c878e8294a/milvus_lite-2.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:74a8e07c5e3b057df17fbb46913388e84df1dc403a200f4e423799a58184c800", size = 19855994 },
{ url = "https://files.pythonhosted.org/packages/34/8e/7858d12d89bf9e84302c6ffd5faf776d7b2de4372a07461f726ce6f9929e/milvus_lite-2.4.10-py3-none-manylinux2014_aarch64.whl", hash = "sha256:240c7386b747bad696ecb5bd1f58d491e86b9d4b92dccee3315ed7256256eddc", size = 39614866 },
{ url = "https://files.pythonhosted.org/packages/84/65/639cb552c892ba5fef73301f878b2e7cabb59c918e0c49c9cf3026d49447/milvus_lite-2.4.10-py3-none-manylinux2014_x86_64.whl", hash = "sha256:211d2e334a043f9282bdd9755f76b9b2d93b23bffa7af240919ffce6a8dfe325", size = 49377774 },
]
[[package]] [[package]]
name = "mmh3" name = "mmh3"
version = "4.1.0" version = "4.1.0"
@@ -1872,6 +2042,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", size = 9729 }, { url = "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", size = 9729 },
] ]
[[package]]
name = "multiprocess"
version = "0.70.16"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "dill" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b5/ae/04f39c5d0d0def03247c2893d6f2b83c136bf3320a2154d7b8858f2ba72d/multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", size = 1772603 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/50/15/b56e50e8debaf439f44befec5b2af11db85f6e0f344c3113ae0be0593a91/multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", size = 143519 },
{ url = "https://files.pythonhosted.org/packages/0a/7d/a988f258104dcd2ccf1ed40fdc97e26c4ac351eeaf81d76e266c52d84e2f/multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e", size = 146741 },
]
[[package]] [[package]]
name = "mypy-extensions" name = "mypy-extensions"
version = "1.0.0" version = "1.0.0"
@@ -1899,6 +2082,28 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/38/e9/5f72929373e1a0e8d142a130f3f97e6ff920070f87f91c4e13e40e0fba5a/networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2", size = 1702396 }, { url = "https://files.pythonhosted.org/packages/38/e9/5f72929373e1a0e8d142a130f3f97e6ff920070f87f91c4e13e40e0fba5a/networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2", size = 1702396 },
] ]
[[package]]
name = "ninja"
version = "1.11.1.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/37/2c/d717d13a413d6f7579cdaa1e28e6e2c98de95461549b08d311c8a5bf4c51/ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c", size = 132392 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3d/6e/04ed11bb244039908f6f212cb5f3e97933e238655248e4ce307c1687ba1f/ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee", size = 270611 },
{ url = "https://files.pythonhosted.org/packages/2c/52/0e5423311eb9939b6f9354059a6d88a6211eb4fa1c7a4ef303ecee1c1fe0/ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877", size = 324256 },
{ url = "https://files.pythonhosted.org/packages/6d/92/8d7aebd4430ab5ff65df2bfee6d5745f95c004284db2d8ca76dcbfd9de47/ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b", size = 307194 },
{ url = "https://files.pythonhosted.org/packages/01/c8/96424839fd127b4492229acf50763ed9940d864ca35d17d151934aef1f6f/ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a", size = 155643 },
{ url = "https://files.pythonhosted.org/packages/6b/fa/5ca8e65a98cdb9a71d4f1e38cac7bd757bbb9555a5aef5a4d293aa890e5c/ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd", size = 179538 },
{ url = "https://files.pythonhosted.org/packages/45/ef/60086f02cbc6882da00a02c81d645cefd8d2d65b01fade41b873d8dd85a2/ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef", size = 156217 },
{ url = "https://files.pythonhosted.org/packages/1c/00/2fd13ac6aafdb566f00d6b541101fca54e58ae58bf96c00f9780df019607/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea", size = 372069 },
{ url = "https://files.pythonhosted.org/packages/ad/5d/6e97c8a25167d4867694c7fb0b9bdbc9b096d6479c8e56c5bd41b49613f6/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249", size = 418859 },
{ url = "https://files.pythonhosted.org/packages/43/78/34af88d753389a9412438d16142c77e587e0d69152faf0bbf99701063dd8/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205", size = 419782 },
{ url = "https://files.pythonhosted.org/packages/3b/74/de0633f8bced3b188942fca64a950e8f2206c60c10c97af465b356ae9b25/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f", size = 415476 },
{ url = "https://files.pythonhosted.org/packages/9a/f3/3e4a56ff77739d1582749b93497bdebf11e003fbc7a66363ef6c772ebd0a/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885", size = 379229 },
{ url = "https://files.pythonhosted.org/packages/c5/ee/53df34fcc9c0b1db62b2f2e2c848e28d9354e1c7f0dce029ee50b16ca157/ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082", size = 265049 },
{ url = "https://files.pythonhosted.org/packages/b6/2f/a3bc50fa63fc4fe9348e15b53dc8c87febfd4e0c660fcf250c4b19a3aa3b/ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1", size = 312958 },
{ url = "https://files.pythonhosted.org/packages/73/2a/f5b7b3b7ecd5cf4e31375580bf5c6a01a328ed1ebdfff90fab463e3f4bc7/ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a", size = 272686 },
]
[[package]] [[package]]
name = "nltk" name = "nltk"
version = "3.9.1" version = "3.9.1"
@@ -2120,7 +2325,7 @@ wheels = [
[[package]] [[package]]
name = "open-webui" name = "open-webui"
version = "0.3.17.dev3" version = "0.3.29"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "aiohttp" }, { name = "aiohttp" },
@@ -2133,9 +2338,11 @@ dependencies = [
{ name = "black" }, { name = "black" },
{ name = "boto3" }, { name = "boto3" },
{ name = "chromadb" }, { name = "chromadb" },
{ name = "colbert-ai" },
{ name = "docker" }, { name = "docker" },
{ name = "docx2txt" }, { name = "docx2txt" },
{ name = "duckduckgo-search" }, { name = "duckduckgo-search" },
{ name = "einops" },
{ name = "extract-msg" }, { name = "extract-msg" },
{ name = "fake-useragent" }, { name = "fake-useragent" },
{ name = "fastapi" }, { name = "fastapi" },
@@ -2162,6 +2369,7 @@ dependencies = [
{ name = "pydantic" }, { name = "pydantic" },
{ name = "pydub" }, { name = "pydub" },
{ name = "pyjwt", extra = ["crypto"] }, { name = "pyjwt", extra = ["crypto"] },
{ name = "pymilvus" },
{ name = "pymongo" }, { name = "pymongo" },
{ name = "pymysql" }, { name = "pymysql" },
{ name = "pypandoc" }, { name = "pypandoc" },
@@ -2200,9 +2408,11 @@ requires-dist = [
{ name = "black", specifier = "==24.8.0" }, { name = "black", specifier = "==24.8.0" },
{ name = "boto3", specifier = "==1.35.0" }, { name = "boto3", specifier = "==1.35.0" },
{ name = "chromadb", specifier = "==0.5.5" }, { name = "chromadb", specifier = "==0.5.5" },
{ name = "colbert-ai", specifier = "==0.2.21" },
{ name = "docker", specifier = "~=7.1.0" }, { name = "docker", specifier = "~=7.1.0" },
{ name = "docx2txt", specifier = "==0.8" }, { name = "docx2txt", specifier = "==0.8" },
{ name = "duckduckgo-search", specifier = "~=6.2.11" }, { name = "duckduckgo-search", specifier = "~=6.2.11" },
{ name = "einops", specifier = "==0.8.0" },
{ name = "extract-msg" }, { name = "extract-msg" },
{ name = "fake-useragent", specifier = "==1.5.1" }, { name = "fake-useragent", specifier = "==1.5.1" },
{ name = "fastapi", specifier = "==0.111.0" }, { name = "fastapi", specifier = "==0.111.0" },
@@ -2229,6 +2439,7 @@ requires-dist = [
{ name = "pydantic", specifier = "==2.8.2" }, { name = "pydantic", specifier = "==2.8.2" },
{ name = "pydub" }, { name = "pydub" },
{ name = "pyjwt", extras = ["crypto"], specifier = "==2.9.0" }, { name = "pyjwt", extras = ["crypto"], specifier = "==2.9.0" },
{ name = "pymilvus", specifier = "==2.4.6" },
{ name = "pymongo" }, { name = "pymongo" },
{ name = "pymysql", specifier = "==1.1.1" }, { name = "pymysql", specifier = "==1.1.1" },
{ name = "pypandoc", specifier = "==1.13" }, { name = "pypandoc", specifier = "==1.13" },
@@ -2678,17 +2889,17 @@ wheels = [
[[package]] [[package]]
name = "primp" name = "primp"
version = "0.6.1" version = "0.6.3"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/30/bf/6c09168d11467cac9104aaa486b916cfab3f3883d812088d59cdec412d2f/primp-0.6.1.tar.gz", hash = "sha256:64b3c12e3d463a887518811c46f3ec37cca02e6af1ddf1287e548342de436301", size = 79231 } sdist = { url = "https://files.pythonhosted.org/packages/63/9c/10d2c7b734228021cf17d92b2872ed53535103d29a38a6ad4eee89a8ae1b/primp-0.6.3.tar.gz", hash = "sha256:17d30ebe26864defad5232dbbe1372e80483940012356e1f68846bb182282039", size = 78662 }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/fc/00/98a0b612613902b4b5139da271786e586701d100f610b2a97b16b45e8783/primp-0.6.1-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:60cfe95e0bdf154b0f9036d38acaddc9aef02d6723ed125839b01449672d3946", size = 2708129 }, { url = "https://files.pythonhosted.org/packages/61/09/96e8327fd8c1224226d9a170daf1dcba7d3f6578edeb9f811803f2a61aba/primp-0.6.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bdbe6a7cdaaf5c9ed863432a941f4a75bd4c6ff626cbc8d32fc232793c70ba06", size = 2719331 },
{ url = "https://files.pythonhosted.org/packages/6e/fc/5894b24c5794a357697fd0d0f789a82ed941571739178ebd6fd93c37fe26/primp-0.6.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:e1e92433ecf32639f9e800bc3a5d58b03792bdec99421b7fb06500e2fae63c85", size = 2500377 }, { url = "https://files.pythonhosted.org/packages/b3/a1/b58ac752b0500208df1be3b762eeaff1a117ec3108e26b38821ae9ac31e0/primp-0.6.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:eeb53eb987bdcbcd85740633470255cab887d921df713ffa12a36a13366c9cdb", size = 2517811 },
{ url = "https://files.pythonhosted.org/packages/06/cc/501c5becc8ebb7d2897e88ea1ba5619516016c9bf9f5e3c766537525ca8a/primp-0.6.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e02353f13f07fb5a6f91df9e2f4d8ec9f41312de95088744dce1c9729a3865d", size = 2806351 }, { url = "https://files.pythonhosted.org/packages/f7/85/ca027d7ec6121346d5927205777ad74bf918f291a538d710b5f9e0957333/primp-0.6.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78da53d3c92a8e3f05bd3286ac76c291f1b6fe5e08ea63b7ba92b0f9141800bb", size = 2826729 },
{ url = "https://files.pythonhosted.org/packages/c5/d4/33cf02d6e343e3d27e79fddb5898d84c26560f86f7b8952af6518be26770/primp-0.6.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:c5a2ccfdf488b17be225a529a31e2b22724b2e22fba8e1ae168a222f857c2dc0", size = 2722920 }, { url = "https://files.pythonhosted.org/packages/3a/45/ff51ccc5dbc82afa6d2dda15bf07b21b6b44708d02934cd7562007d1f719/primp-0.6.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:86337b44deecdac752bd8112909987fc9fa9b894f30191c80a164dc8f895da53", size = 2739692 },
{ url = "https://files.pythonhosted.org/packages/0e/91/ec7aeeb9715bb9a9f355919163b25dde239c43738f2e31653113b52c09c5/primp-0.6.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f335c2ace907800a23bbb7bc6e15acc7fff659b86a2d5858817f6ed79cea07cf", size = 2883301 }, { url = "https://files.pythonhosted.org/packages/74/a1/a626fb8d2f6499d3e05971b2dcd33d770244722ee52f7d2c4ab636c1157f/primp-0.6.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d3cd9a22b97f3eae42b2a5fb99f00480daf4cd6d9b139e05b0ffb03f7cc037f3", size = 2900573 },
{ url = "https://files.pythonhosted.org/packages/e5/dd/262d646a981802035f585b369ee93cc5187d05eb3b0f41e1b81020f56da2/primp-0.6.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5dc15bd9d47ded7bc356fcb5d8321972dcbeba18e7d3b7250e12bb7365447b2b", size = 3037325 }, { url = "https://files.pythonhosted.org/packages/09/55/c96cb510c9f7881fa01bc7b269e446d32635ab9f0adbd36918c69b45a140/primp-0.6.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7732bec917e2d3c48a31cdb92e1250f4ad6203a1aa4f802bd9abd84f2286a1e0", size = 3058818 },
{ url = "https://files.pythonhosted.org/packages/e6/69/c30564f546dc2c1f118526d2f1dc17d8440b2fe2c574018333881450a860/primp-0.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:eebf0412ebba4089547b16b97b765d83f69f1433d811bb02b02cdcdbca20f672", size = 2736167 }, { url = "https://files.pythonhosted.org/packages/98/de/5c1dab24c1bff7933d0e4e8f4d0f46b66fc23531258d8433789c4468cac3/primp-0.6.3-cp38-abi3-win_amd64.whl", hash = "sha256:1e4113c34b86c676ae321af185f03a372caef3ee009f1682c2d62e30ec87348c", size = 2757631 },
] ]
[[package]] [[package]]
@@ -2766,6 +2977,31 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7b/08/9c66c269b0d417a0af9fb969535f0371b8c538633535a7a6a5ca3f9231e2/psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab", size = 1163864 }, { url = "https://files.pythonhosted.org/packages/7b/08/9c66c269b0d417a0af9fb969535f0371b8c538633535a7a6a5ca3f9231e2/psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab", size = 1163864 },
] ]
[[package]]
name = "pyarrow"
version = "17.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
]
sdist = { url = "https://files.pythonhosted.org/packages/27/4e/ea6d43f324169f8aec0e57569443a38bab4b398d09769ca64f7b4d467de3/pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28", size = 1112479 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977", size = 29028748 },
{ url = "https://files.pythonhosted.org/packages/8d/8e/ce2e9b2146de422f6638333c01903140e9ada244a2a477918a368306c64c/pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3", size = 27190965 },
{ url = "https://files.pythonhosted.org/packages/3b/c8/5675719570eb1acd809481c6d64e2136ffb340bc387f4ca62dce79516cea/pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15", size = 39269081 },
{ url = "https://files.pythonhosted.org/packages/5e/78/3931194f16ab681ebb87ad252e7b8d2c8b23dad49706cadc865dff4a1dd3/pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597", size = 39864921 },
{ url = "https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420", size = 38740798 },
{ url = "https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4", size = 39871877 },
{ url = "https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03", size = 25151089 },
{ url = "https://files.pythonhosted.org/packages/d4/62/ce6ac1275a432b4a27c55fe96c58147f111d8ba1ad800a112d31859fae2f/pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22", size = 29019418 },
{ url = "https://files.pythonhosted.org/packages/8e/0a/dbd0c134e7a0c30bea439675cc120012337202e5fac7163ba839aa3691d2/pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053", size = 27152197 },
{ url = "https://files.pythonhosted.org/packages/cb/05/3f4a16498349db79090767620d6dc23c1ec0c658a668d61d76b87706c65d/pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a", size = 39263026 },
{ url = "https://files.pythonhosted.org/packages/c2/0c/ea2107236740be8fa0e0d4a293a095c9f43546a2465bb7df34eee9126b09/pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc", size = 39880798 },
{ url = "https://files.pythonhosted.org/packages/f6/b0/b9164a8bc495083c10c281cc65064553ec87b7537d6f742a89d5953a2a3e/pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a", size = 38715172 },
{ url = "https://files.pythonhosted.org/packages/f1/c4/9625418a1413005e486c006e56675334929fad864347c5ae7c1b2e7fe639/pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b", size = 39874508 },
{ url = "https://files.pythonhosted.org/packages/ae/49/baafe2a964f663413be3bd1cf5c45ed98c5e42e804e2328e18f4570027c1/pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7", size = 25099235 },
]
[[package]] [[package]]
name = "pyasn1" name = "pyasn1"
version = "0.6.0" version = "0.6.0"
@@ -2909,6 +3145,24 @@ crypto = [
{ name = "cryptography" }, { name = "cryptography" },
] ]
[[package]]
name = "pymilvus"
version = "2.4.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "environs" },
{ name = "grpcio" },
{ name = "milvus-lite", marker = "sys_platform != 'win32'" },
{ name = "pandas" },
{ name = "protobuf" },
{ name = "setuptools" },
{ name = "ujson" },
]
sdist = { url = "https://files.pythonhosted.org/packages/40/20/203f77e8c35cac3e462307ba216c00525fd895618921d918fe814d426155/pymilvus-2.4.6.tar.gz", hash = "sha256:6ac3eb91c92cc01bbe444fe83f895f02d7b2546d96ac67998630bf31ac074d66", size = 1214006 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1b/41/af144715fc246ee2232e609bf93ab7cfd4b417e14087606fd6d93cce7336/pymilvus-2.4.6-py3-none-any.whl", hash = "sha256:b4c43472edc313b845d313be50610e19054e6954b2c5c3b515565c596c2d3d97", size = 197837 },
]
[[package]] [[package]]
name = "pymongo" name = "pymongo"
version = "4.8.0" version = "4.8.0"
@@ -3633,6 +3887,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 }, { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 },
] ]
[[package]]
name = "smmap"
version = "5.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/88/04/b5bf6d21dc4041000ccba7eb17dd3055feb237e7ffc2c20d3fae3af62baa/smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62", size = 22291 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/a5/10f97f73544edcdef54409f1d839f6049a0d79df68adbc1ceb24d1aaca42/smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da", size = 24282 },
]
[[package]] [[package]]
name = "sniffio" name = "sniffio"
version = "1.3.1" version = "1.3.1"
@@ -4278,6 +4541,59 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/ea/53d1fe468e63e092cf16e2c18d16f50c29851242f9dd12d6a66e0d7f0d02/XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e", size = 159925 }, { url = "https://files.pythonhosted.org/packages/a7/ea/53d1fe468e63e092cf16e2c18d16f50c29851242f9dd12d6a66e0d7f0d02/XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e", size = 159925 },
] ]
[[package]]
name = "xxhash"
version = "3.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b8/c7/afed0f131fbda960ff15eee7f304fa0eeb2d58770fade99897984852ef23/xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", size = 31969 },
{ url = "https://files.pythonhosted.org/packages/8c/0c/7c3bc6d87e5235672fcc2fb42fd5ad79fe1033925f71bf549ee068c7d1ca/xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", size = 30800 },
{ url = "https://files.pythonhosted.org/packages/04/9e/01067981d98069eec1c20201f8c145367698e9056f8bc295346e4ea32dd1/xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", size = 221566 },
{ url = "https://files.pythonhosted.org/packages/d4/09/d4996de4059c3ce5342b6e1e6a77c9d6c91acce31f6ed979891872dd162b/xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", size = 201214 },
{ url = "https://files.pythonhosted.org/packages/62/f5/6d2dc9f8d55a7ce0f5e7bfef916e67536f01b85d32a9fbf137d4cadbee38/xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", size = 429433 },
{ url = "https://files.pythonhosted.org/packages/d9/72/9256303f10e41ab004799a4aa74b80b3c5977d6383ae4550548b24bd1971/xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", size = 194822 },
{ url = "https://files.pythonhosted.org/packages/34/92/1a3a29acd08248a34b0e6a94f4e0ed9b8379a4ff471f1668e4dce7bdbaa8/xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", size = 208538 },
{ url = "https://files.pythonhosted.org/packages/53/ad/7fa1a109663366de42f724a1cdb8e796a260dbac45047bce153bc1e18abf/xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", size = 216953 },
{ url = "https://files.pythonhosted.org/packages/35/02/137300e24203bf2b2a49b48ce898ecce6fd01789c0fcd9c686c0a002d129/xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", size = 203594 },
{ url = "https://files.pythonhosted.org/packages/23/03/aeceb273933d7eee248c4322b98b8e971f06cc3880e5f7602c94e5578af5/xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", size = 210971 },
{ url = "https://files.pythonhosted.org/packages/e3/64/ed82ec09489474cbb35c716b189ddc1521d8b3de12b1b5ab41ce7f70253c/xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", size = 415050 },
{ url = "https://files.pythonhosted.org/packages/71/43/6db4c02dcb488ad4e03bc86d70506c3d40a384ee73c9b5c93338eb1f3c23/xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", size = 192216 },
{ url = "https://files.pythonhosted.org/packages/22/6d/db4abec29e7a567455344433d095fdb39c97db6955bb4a2c432e486b4d28/xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", size = 30120 },
{ url = "https://files.pythonhosted.org/packages/52/1c/fa3b61c0cf03e1da4767213672efe186b1dfa4fc901a4a694fb184a513d1/xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", size = 30003 },
{ url = "https://files.pythonhosted.org/packages/6b/8e/9e6fc572acf6e1cc7ccb01973c213f895cb8668a9d4c2b58a99350da14b7/xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", size = 26777 },
{ url = "https://files.pythonhosted.org/packages/07/0e/1bfce2502c57d7e2e787600b31c83535af83746885aa1a5f153d8c8059d6/xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", size = 31969 },
{ url = "https://files.pythonhosted.org/packages/3f/d6/8ca450d6fe5b71ce521b4e5db69622383d039e2b253e9b2f24f93265b52c/xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", size = 30787 },
{ url = "https://files.pythonhosted.org/packages/5b/84/de7c89bc6ef63d750159086a6ada6416cc4349eab23f76ab870407178b93/xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", size = 220959 },
{ url = "https://files.pythonhosted.org/packages/fe/86/51258d3e8a8545ff26468c977101964c14d56a8a37f5835bc0082426c672/xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", size = 200006 },
{ url = "https://files.pythonhosted.org/packages/02/0a/96973bd325412feccf23cf3680fd2246aebf4b789122f938d5557c54a6b2/xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", size = 428326 },
{ url = "https://files.pythonhosted.org/packages/11/a7/81dba5010f7e733de88af9555725146fc133be97ce36533867f4c7e75066/xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", size = 194380 },
{ url = "https://files.pythonhosted.org/packages/fb/7d/f29006ab398a173f4501c0e4977ba288f1c621d878ec217b4ff516810c04/xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", size = 207934 },
{ url = "https://files.pythonhosted.org/packages/8a/6e/6e88b8f24612510e73d4d70d9b0c7dff62a2e78451b9f0d042a5462c8d03/xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", size = 216301 },
{ url = "https://files.pythonhosted.org/packages/af/51/7862f4fa4b75a25c3b4163c8a873f070532fe5f2d3f9b3fc869c8337a398/xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", size = 203351 },
{ url = "https://files.pythonhosted.org/packages/22/61/8d6a40f288f791cf79ed5bb113159abf0c81d6efb86e734334f698eb4c59/xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", size = 210294 },
{ url = "https://files.pythonhosted.org/packages/17/02/215c4698955762d45a8158117190261b2dbefe9ae7e5b906768c09d8bc74/xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", size = 414674 },
{ url = "https://files.pythonhosted.org/packages/31/5c/b7a8db8a3237cff3d535261325d95de509f6a8ae439a5a7a4ffcff478189/xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", size = 192022 },
{ url = "https://files.pythonhosted.org/packages/78/e3/dd76659b2811b3fd06892a8beb850e1996b63e9235af5a86ea348f053e9e/xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", size = 30170 },
{ url = "https://files.pythonhosted.org/packages/d9/6b/1c443fe6cfeb4ad1dcf231cdec96eb94fb43d6498b4469ed8b51f8b59a37/xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", size = 30040 },
{ url = "https://files.pythonhosted.org/packages/0f/eb/04405305f290173acc0350eba6d2f1a794b57925df0398861a20fbafa415/xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", size = 26796 },
{ url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795 },
{ url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792 },
{ url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950 },
{ url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980 },
{ url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324 },
{ url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370 },
{ url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911 },
{ url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352 },
{ url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410 },
{ url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322 },
{ url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725 },
{ url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070 },
{ url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 },
{ url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 },
{ url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 },
]
[[package]] [[package]]
name = "yarl" name = "yarl"
version = "1.9.4" version = "1.9.4"