Compare commits
183 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| aff7263afd | |||
| 77269fe4b4 | |||
| 89afded87e | |||
| 3b70cd64d7 | |||
| 1173459eee | |||
| c0ecff9d70 | |||
| d4fca9dabf | |||
| aaaebfabbe | |||
| 6eccf8668e | |||
| 5e78a5c510 | |||
| dce24225e0 | |||
| f9b44c6bf2 | |||
| f573a90a56 | |||
| 23bb0d927f | |||
| 6b0af942db | |||
| f95a482c24 | |||
| edf94d732b | |||
| 73a77abd20 | |||
| a8f205213c | |||
| 4770285c04 | |||
| 1639fbb544 | |||
| 2dc5f3c30c | |||
| 1a51584fe0 | |||
| 976c94ba5a | |||
| 4df74690e1 | |||
| e2d60bd92e | |||
| c2eada36f1 | |||
| 0ce6975ec8 | |||
| 1ddc56fcf8 | |||
| 7f7365db4f | |||
| c9e2ba56c6 | |||
| b01c9184c2 | |||
| 3ee1ae8c95 | |||
| 8ce6c8cf78 | |||
| fbf4f5eb30 | |||
| 6c77e6fdb3 | |||
| 3b74431ea3 | |||
| 53fe7c460b | |||
| f39556b933 | |||
| cffd02defe | |||
| bdc6088159 | |||
| 2a75a85556 | |||
| 94c025c6d7 | |||
| 8961bc2453 | |||
| cb82c7062a | |||
| b15814c42f | |||
| 023c8bb5b4 | |||
| 500440ebec | |||
| b94de4f002 | |||
| 039a1e1f14 | |||
| 14a6c1f496 | |||
| 0a295ff56d | |||
| 36ffa9824b | |||
| e3769c1073 | |||
| d78fe4decc | |||
| 7b442e4be0 | |||
| d17ac95f95 | |||
| 59c3203990 | |||
| a4747c88e0 | |||
| 39ea59edc8 | |||
| 67ed61d022 | |||
| b8f3abda5a | |||
| 8697f72068 | |||
| 3e7077bb73 | |||
| 5f89c1b137 | |||
| 811e1f92b1 | |||
| 15cbccc8f5 | |||
| 1cfa491179 | |||
| 35e7e07821 | |||
| 9ff54288ef | |||
| baca6db680 | |||
| 6bd2bc5683 | |||
| 029625ec4e | |||
| 7e65f7fa4d | |||
| 80f5573cf3 | |||
| 1236157800 | |||
| e628bfe6ff | |||
| bb2bd7d721 | |||
| 9c107f9d2d | |||
| fafd847f18 | |||
| 3a7e5a5f31 | |||
| 613d278afc | |||
| 96e0c4d7b8 | |||
| 46cea1f904 | |||
| d844fc7edb | |||
| 3468dda556 | |||
| e6ff4169e1 | |||
| 6f8c1a8f0d | |||
| d529be86fe | |||
| 3ad4b10470 | |||
| 376fce273e | |||
| c19960002b | |||
| dc2b8fd327 | |||
| 737dfd2763 | |||
| 3fa323d1a1 | |||
| a01ef6cfa0 | |||
| c7d4d2e41f | |||
| 744ffbb1fb | |||
| 4d6132b9de | |||
| 7a31ff6a2f | |||
| 516f1cf67b | |||
| 3d6e48b05e | |||
| 3dd492627e | |||
| 66210b95fc | |||
| 6e58d99920 | |||
| 6471f12668 | |||
| f3c4c2b8e3 | |||
| a73b6448c5 | |||
| 3238981202 | |||
| 59ddce1ea3 | |||
| 2b025b267a | |||
| efe8c4ca69 | |||
| d7088efe73 | |||
| 05c5e73304 | |||
| 08a5ff700e | |||
| edf57900dc | |||
| f00f518abe | |||
| 639f4a44e0 | |||
| 92e1c654ce | |||
| 81d2df4df9 | |||
| 65949dbcbc | |||
| eb97e30b0a | |||
| 84518490c5 | |||
| dd73ecbdc9 | |||
| 588a179b7f | |||
| 244915cd1e | |||
| 094d777e55 | |||
| b430deab15 | |||
| fe44e4d344 | |||
| 88c02d5a14 | |||
| b75b891de1 | |||
| f1ce653830 | |||
| c06484297b | |||
| 331caad5b8 | |||
| 8b3fcfea13 | |||
| 05599e1bb5 | |||
| bcdbc4fb8a | |||
| 41a2b86e70 | |||
| f9292ab4d2 | |||
| f4bd094128 | |||
| 90aa29528c | |||
| 34e3cb6881 | |||
| d0ddb0637e | |||
| 2405809f92 | |||
| 77579f5509 | |||
| 5e33955566 | |||
| 73c0262345 | |||
| a3ea924f0a | |||
| 01435997b9 | |||
| 90fe437e29 | |||
| 43077b82b7 | |||
| 1b56a8f3cb | |||
| 1d27402dd0 | |||
| 6f7161acf8 | |||
| 54e3ca8e6c | |||
| 95cadaca72 | |||
| e26c443815 | |||
| 046f1fb30a | |||
| 63d825692e | |||
| 70667d5cc8 | |||
| 2ac0eae99e | |||
| 1dd442f38b | |||
| 94c19f73b0 | |||
| ed0b9be4e3 | |||
| 866d02bbae | |||
| f7c5cd486b | |||
| 660a44c918 | |||
| b6873153c1 | |||
| 24a2e84692 | |||
| 5e873bc643 | |||
| f643182eb0 | |||
| c5cfcc1229 | |||
| 203dfdedf1 | |||
| febc9ab885 | |||
| 38fb9d5fd8 | |||
| d7b18b662b | |||
| b061775932 | |||
| 126045318f | |||
| f865a23a18 | |||
| 8aa6415500 | |||
| 4a2a12fd21 | |||
| a381ffc585 | |||
| cdc13e9960 |
@@ -1,80 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
# Bug Report
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Before submitting a bug report**: Please check the Issues or Discussions section to see if a similar issue or feature request has already been posted. It's likely we're already tracking it! If you’re unsure, start a discussion post first. This will help us efficiently focus on improving the project.
|
||||
|
||||
- **Collaborate respectfully**: We value a constructive attitude, so please be mindful of your communication. If negativity is part of your approach, our capacity to engage may be limited. We’re here to help if you’re open to learning and communicating positively. Remember, Open WebUI is a volunteer-driven project managed by a single maintainer and supported by contributors who also have full-time jobs. We appreciate your time and ask that you respect ours.
|
||||
|
||||
- **Contributing**: If you encounter an issue, we highly encourage you to submit a pull request or fork the project. We actively work to prevent contributor burnout to maintain the quality and continuity of Open WebUI.
|
||||
|
||||
- **Bug reproducibility**: If a bug cannot be reproduced with a `:main` or `:dev` Docker setup, or a pip install with Python 3.11, it may require additional help from the community. In such cases, we will move it to the "issues" Discussions section due to our limited resources. We encourage the community to assist with these issues. Remember, it’s not that the issue doesn’t exist; we need your help!
|
||||
|
||||
Note: Please remove the notes above when submitting your post. Thank you for your understanding and support!
|
||||
|
||||
---
|
||||
|
||||
## Installation Method
|
||||
|
||||
[Describe the method you used to install the project, e.g., git clone, Docker, pip, etc.]
|
||||
|
||||
## Environment
|
||||
|
||||
- **Open WebUI Version:** [e.g., v0.3.11]
|
||||
- **Ollama (if applicable):** [e.g., v0.2.0, v0.1.32-rc1]
|
||||
|
||||
- **Operating System:** [e.g., Windows 10, macOS Big Sur, Ubuntu 20.04]
|
||||
- **Browser (if applicable):** [e.g., Chrome 100.0, Firefox 98.0]
|
||||
|
||||
**Confirmation:**
|
||||
|
||||
- [ ] I have read and followed all the instructions provided in the README.md.
|
||||
- [ ] I am on the latest version of both Open WebUI and Ollama.
|
||||
- [ ] I have included the browser console logs.
|
||||
- [ ] I have included the Docker container logs.
|
||||
- [ ] I have provided the exact steps to reproduce the bug in the "Steps to Reproduce" section below.
|
||||
|
||||
## Expected Behavior:
|
||||
|
||||
[Describe what you expected to happen.]
|
||||
|
||||
## Actual Behavior:
|
||||
|
||||
[Describe what actually happened.]
|
||||
|
||||
## Description
|
||||
|
||||
**Bug Summary:**
|
||||
[Provide a brief but clear summary of the bug]
|
||||
|
||||
## Reproduction Details
|
||||
|
||||
**Steps to Reproduce:**
|
||||
[Outline the steps to reproduce the bug. Be as detailed as possible.]
|
||||
|
||||
## Logs and Screenshots
|
||||
|
||||
**Browser Console Logs:**
|
||||
[Include relevant browser console logs, if applicable]
|
||||
|
||||
**Docker Container Logs:**
|
||||
[Include relevant Docker container logs, if applicable]
|
||||
|
||||
**Screenshots/Screen Recordings (if applicable):**
|
||||
[Attach any relevant screenshots to help illustrate the issue]
|
||||
|
||||
## Additional Information
|
||||
|
||||
[Include any additional details that may help in understanding and reproducing the issue. This could include specific configurations, error messages, or anything else relevant to the bug.]
|
||||
|
||||
## Note
|
||||
|
||||
If the bug report is incomplete or does not follow the provided instructions, it may not be addressed. Please ensure that you have followed the steps outlined in the README.md and troubleshooting.md documents, and provide all necessary information for us to reproduce and address the issue. Thank you!
|
||||
@@ -0,0 +1,144 @@
|
||||
name: Bug Report
|
||||
description: Create a detailed bug report to help us improve Open WebUI.
|
||||
title: 'issue: '
|
||||
labels: ['bug', 'triage']
|
||||
assignees: []
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
# Bug Report
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Before submitting a bug report**: Please check the [Issues](https://github.com/open-webui/open-webui/issues) or [Discussions](https://github.com/open-webui/open-webui/discussions) sections to see if a similar issue has already been reported. If unsure, start a discussion first, as this helps us efficiently focus on improving the project.
|
||||
|
||||
- **Respectful collaboration**: Open WebUI is a volunteer-driven project with a single maintainer and contributors who also have full-time jobs. Please be constructive and respectful in your communication.
|
||||
|
||||
- **Contributing**: If you encounter an issue, consider submitting a pull request or forking the project. We prioritize preventing contributor burnout to maintain Open WebUI's quality.
|
||||
|
||||
- **Bug Reproducibility**: If a bug cannot be reproduced using a `:main` or `:dev` Docker setup or with `pip install` on Python 3.11, community assistance may be required. In such cases, we will move it to the "[Issues](https://github.com/open-webui/open-webui/discussions/categories/issues)" Discussions section. Your help is appreciated!
|
||||
|
||||
- type: checkboxes
|
||||
id: issue-check
|
||||
attributes:
|
||||
label: Check Existing Issues
|
||||
description: Confirm that you’ve checked for existing reports before submitting a new one.
|
||||
options:
|
||||
- label: I have searched the existing issues and discussions.
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: installation-method
|
||||
attributes:
|
||||
label: Installation Method
|
||||
description: How did you install Open WebUI?
|
||||
options:
|
||||
- Git Clone
|
||||
- Pip Install
|
||||
- Docker
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: open-webui-version
|
||||
attributes:
|
||||
label: Open WebUI Version
|
||||
description: Specify the version (e.g., v0.3.11)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: ollama-version
|
||||
attributes:
|
||||
label: Ollama Version (if applicable)
|
||||
description: Specify the version (e.g., v0.2.0, or v0.1.32-rc1)
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
id: operating-system
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: Specify the OS (e.g., Windows 10, macOS Sonoma, Ubuntu 22.04)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: browser
|
||||
attributes:
|
||||
label: Browser (if applicable)
|
||||
description: Specify the browser/version (e.g., Chrome 100.0, Firefox 98.0)
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: checkboxes
|
||||
id: confirmation
|
||||
attributes:
|
||||
label: Confirmation
|
||||
description: Ensure the following prerequisites have been met.
|
||||
options:
|
||||
- label: I have read and followed all instructions in `README.md`.
|
||||
required: true
|
||||
- label: I am using the latest version of **both** Open WebUI and Ollama.
|
||||
required: true
|
||||
- label: I have checked the browser console logs.
|
||||
required: true
|
||||
- label: I have checked the Docker container logs.
|
||||
required: true
|
||||
- label: I have listed steps to reproduce the bug in detail.
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: Describe what should have happened.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: actual-behavior
|
||||
attributes:
|
||||
label: Actual Behavior
|
||||
description: Describe what actually happened.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduction-steps
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: Provide step-by-step instructions to reproduce the issue.
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '...'
|
||||
3. Scroll down to '...'
|
||||
4. See the error message '...'
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs-screenshots
|
||||
attributes:
|
||||
label: Logs & Screenshots
|
||||
description: Include relevant logs, errors, or screenshots to help diagnose the issue.
|
||||
placeholder: 'Attach logs from the browser console, Docker logs, or error messages.'
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional-info
|
||||
attributes:
|
||||
label: Additional Information
|
||||
description: Provide any extra details that may assist in understanding the issue.
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## Note
|
||||
If the bug report is incomplete or does not follow instructions, it may not be addressed. Ensure that you've followed all the **README.md** and **troubleshooting.md** guidelines, and provide all necessary information for us to reproduce the issue.
|
||||
Thank you for contributing to Open WebUI!
|
||||
@@ -1,35 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
# Feature Request
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Before submitting a report**: Please check the Issues or Discussions section to see if a similar issue or feature request has already been posted. It's likely we're already tracking it! If you’re unsure, start a discussion post first. This will help us efficiently focus on improving the project.
|
||||
|
||||
- **Collaborate respectfully**: We value a constructive attitude, so please be mindful of your communication. If negativity is part of your approach, our capacity to engage may be limited. We’re here to help if you’re open to learning and communicating positively. Remember, Open WebUI is a volunteer-driven project managed by a single maintainer and supported by contributors who also have full-time jobs. We appreciate your time and ask that you respect ours.
|
||||
|
||||
- **Contributing**: If you encounter an issue, we highly encourage you to submit a pull request or fork the project. We actively work to prevent contributor burnout to maintain the quality and continuity of Open WebUI.
|
||||
|
||||
- **Bug reproducibility**: If a bug cannot be reproduced with a `:main` or `:dev` Docker setup, or a pip install with Python 3.11, it may require additional help from the community. In such cases, we will move it to the "issues" Discussions section due to our limited resources. We encourage the community to assist with these issues. Remember, it’s not that the issue doesn’t exist; we need your help!
|
||||
|
||||
Note: Please remove the notes above when submitting your post. Thank you for your understanding and support!
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@@ -0,0 +1,64 @@
|
||||
name: Feature Request
|
||||
description: Suggest an idea for this project
|
||||
title: 'feat: '
|
||||
labels: ['triage']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## Important Notes
|
||||
### Before submitting
|
||||
Please check the [Issues](https://github.com/open-webui/open-webui/issues) or [Discussions](https://github.com/open-webui/open-webui/discussions) to see if a similar request has been posted.
|
||||
It's likely we're already tracking it! If you’re unsure, start a discussion post first.
|
||||
This will help us efficiently focus on improving the project.
|
||||
|
||||
### Collaborate respectfully
|
||||
We value a **constructive attitude**, so please be mindful of your communication. If negativity is part of your approach, our capacity to engage may be limited. We're here to help if you're **open to learning** and **communicating positively**.
|
||||
|
||||
Remember:
|
||||
- Open WebUI is a **volunteer-driven project**
|
||||
- It's managed by a **single maintainer**
|
||||
- It's supported by contributors who also have **full-time jobs**
|
||||
|
||||
We appreciate your time and ask that you **respect ours**.
|
||||
|
||||
|
||||
### Contributing
|
||||
If you encounter an issue, we highly encourage you to submit a pull request or fork the project. We actively work to prevent contributor burnout to maintain the quality and continuity of Open WebUI.
|
||||
|
||||
### Bug reproducibility
|
||||
If a bug cannot be reproduced with a `:main` or `:dev` Docker setup, or a `pip install` with Python 3.11, it may require additional help from the community. In such cases, we will move it to the "[issues](https://github.com/open-webui/open-webui/discussions/categories/issues)" Discussions section due to our limited resources. We encourage the community to assist with these issues. Remember, it’s not that the issue doesn’t exist; we need your help!
|
||||
|
||||
- type: checkboxes
|
||||
id: existing-issue
|
||||
attributes:
|
||||
label: Check Existing Issues
|
||||
description: Please confirm that you've checked for existing similar requests
|
||||
options:
|
||||
- label: I have searched the existing issues and discussions.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: problem-description
|
||||
attributes:
|
||||
label: Problem Description
|
||||
description: Is your feature request related to a problem? Please provide a clear and concise description of what the problem is.
|
||||
placeholder: "Ex. I'm always frustrated when..."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: solution-description
|
||||
attributes:
|
||||
label: Desired Solution you'd like
|
||||
description: Clearly describe what you want to happen.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: alternatives-considered
|
||||
attributes:
|
||||
label: Alternatives Considered
|
||||
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: Add any other context or screenshots about the feature request here.
|
||||
@@ -14,7 +14,7 @@ env:
|
||||
|
||||
jobs:
|
||||
build-main-image:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ matrix.platform == 'linux/arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
@@ -111,7 +111,7 @@ jobs:
|
||||
retention-days: 1
|
||||
|
||||
build-cuda-image:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ matrix.platform == 'linux/arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
@@ -211,7 +211,7 @@ jobs:
|
||||
retention-days: 1
|
||||
|
||||
build-ollama-image:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ${{ matrix.platform == 'linux/arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
@@ -5,6 +5,44 @@ 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/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.5.20] - 2025-03-05
|
||||
|
||||
### Added
|
||||
|
||||
- **⚡ Toggle Code Execution On/Off**: You can now enable or disable code execution, providing more control over security, ensuring a safer and more customizable experience.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **📜 Pinyin Keyboard Enter Key Now Works Properly**: Resolved an issue where the Enter key for Pinyin keyboards was not functioning as expected, ensuring seamless input for Chinese users.
|
||||
- **🖼️ Web Manifest Loading Issue Fixed**: Addressed inconsistencies with 'site.webmanifest', guaranteeing proper loading and representation of the app across different browsers and devices.
|
||||
- **📦 Non-Root Container Issue Resolved**: Fixed a critical issue where the UI failed to load correctly in non-root containers, ensuring reliable deployment in various environments.
|
||||
|
||||
## [0.5.19] - 2025-03-04
|
||||
|
||||
### Added
|
||||
|
||||
- **📊 Logit Bias Parameter Support**: Fine-tune conversation dynamics by adjusting the Logit Bias parameter directly in chat settings, giving you more control over model responses.
|
||||
- **⌨️ Customizable Enter Behavior**: You can now configure Enter to send messages only when combined with Ctrl (Ctrl+Enter) via Settings > Interface, preventing accidental message sends.
|
||||
- **📝 Collapsible Code Blocks**: Easily collapse long code blocks to declutter your chat, making it easier to focus on important details.
|
||||
- **🏷️ Tag Selector in Model Selector**: Quickly find and categorize models with the new tag filtering system in the Model Selector, streamlining model discovery.
|
||||
- **📈 Experimental Elasticsearch Vector DB Support**: Now supports Elasticsearch as a vector database, offering more flexibility for data retrieval in Retrieval-Augmented Generation (RAG) workflows.
|
||||
- **⚙️ General Reliability Enhancements**: Various stability improvements across the WebUI, ensuring a smoother, more consistent experience.
|
||||
- **🌍 Updated Translations**: Refined multilingual support for better localization and accuracy across various languages.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🔄 "Stream" Hook Activation**: Fixed an issue where the "Stream" hook only worked when globally enabled, ensuring reliable real-time filtering.
|
||||
- **📧 LDAP Email Case Sensitivity**: Resolved an issue where LDAP login failed due to email case sensitivity mismatches, improving authentication reliability.
|
||||
- **💬 WebSocket Chat Event Registration**: Fixed a bug preventing chat event listeners from being registered upon sign-in, ensuring real-time updates work properly.
|
||||
|
||||
## [0.5.18] - 2025-02-27
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🌐 Open WebUI Now Works Over LAN in Insecure Context**: Resolved an issue preventing Open WebUI from functioning when accessed over a local network in an insecure context, ensuring seamless connectivity.
|
||||
- **🔄 UI Now Reflects Deleted Connections Instantly**: Fixed an issue where deleting a connection did not update the UI in real time, ensuring accurate system state visibility.
|
||||
- **🛠️ Models Now Display Correctly with ENABLE_FORWARD_USER_INFO_HEADERS**: Addressed a bug where models were not visible when ENABLE_FORWARD_USER_INFO_HEADERS was set, restoring proper model listing.
|
||||
|
||||
## [0.5.17] - 2025-02-27
|
||||
|
||||
### Added
|
||||
|
||||
@@ -587,6 +587,17 @@ load_oauth_providers()
|
||||
|
||||
STATIC_DIR = Path(os.getenv("STATIC_DIR", OPEN_WEBUI_DIR / "static")).resolve()
|
||||
|
||||
for file_path in (FRONTEND_BUILD_DIR / "static").glob("**/*"):
|
||||
if file_path.is_file():
|
||||
target_path = STATIC_DIR / file_path.relative_to(
|
||||
(FRONTEND_BUILD_DIR / "static")
|
||||
)
|
||||
target_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
try:
|
||||
shutil.copyfile(file_path, target_path)
|
||||
except Exception as e:
|
||||
logging.error(f"An error occurred: {e}")
|
||||
|
||||
frontend_favicon = FRONTEND_BUILD_DIR / "static" / "favicon.png"
|
||||
|
||||
if frontend_favicon.exists():
|
||||
@@ -659,11 +670,7 @@ if CUSTOM_NAME:
|
||||
# LICENSE_KEY
|
||||
####################################
|
||||
|
||||
LICENSE_KEY = PersistentConfig(
|
||||
"LICENSE_KEY",
|
||||
"license.key",
|
||||
os.environ.get("LICENSE_KEY", ""),
|
||||
)
|
||||
LICENSE_KEY = os.environ.get("LICENSE_KEY", "")
|
||||
|
||||
####################################
|
||||
# STORAGE PROVIDER
|
||||
@@ -695,16 +702,16 @@ AZURE_STORAGE_KEY = os.environ.get("AZURE_STORAGE_KEY", None)
|
||||
# File Upload DIR
|
||||
####################################
|
||||
|
||||
UPLOAD_DIR = f"{DATA_DIR}/uploads"
|
||||
Path(UPLOAD_DIR).mkdir(parents=True, exist_ok=True)
|
||||
UPLOAD_DIR = DATA_DIR / "uploads"
|
||||
UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
####################################
|
||||
# Cache DIR
|
||||
####################################
|
||||
|
||||
CACHE_DIR = f"{DATA_DIR}/cache"
|
||||
Path(CACHE_DIR).mkdir(parents=True, exist_ok=True)
|
||||
CACHE_DIR = DATA_DIR / "cache"
|
||||
CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
####################################
|
||||
@@ -1373,6 +1380,11 @@ Responses from models: {{responses}}"""
|
||||
# Code Interpreter
|
||||
####################################
|
||||
|
||||
ENABLE_CODE_EXECUTION = PersistentConfig(
|
||||
"ENABLE_CODE_EXECUTION",
|
||||
"code_execution.enable",
|
||||
os.environ.get("ENABLE_CODE_EXECUTION", "True").lower() == "true",
|
||||
)
|
||||
|
||||
CODE_EXECUTION_ENGINE = PersistentConfig(
|
||||
"CODE_EXECUTION_ENGINE",
|
||||
@@ -1500,10 +1512,11 @@ Ensure that the tools are effectively utilized to achieve the highest-quality an
|
||||
VECTOR_DB = os.environ.get("VECTOR_DB", "chroma")
|
||||
|
||||
# Chroma
|
||||
CHROMA_DATA_PATH = f"{DATA_DIR}/vector_db"
|
||||
|
||||
if VECTOR_DB == "chroma":
|
||||
import chromadb
|
||||
|
||||
CHROMA_DATA_PATH = f"{DATA_DIR}/vector_db"
|
||||
CHROMA_TENANT = os.environ.get("CHROMA_TENANT", chromadb.DEFAULT_TENANT)
|
||||
CHROMA_DATABASE = os.environ.get("CHROMA_DATABASE", chromadb.DEFAULT_DATABASE)
|
||||
CHROMA_HTTP_HOST = os.environ.get("CHROMA_HTTP_HOST", "")
|
||||
@@ -1540,6 +1553,17 @@ OPENSEARCH_CERT_VERIFY = os.environ.get("OPENSEARCH_CERT_VERIFY", False)
|
||||
OPENSEARCH_USERNAME = os.environ.get("OPENSEARCH_USERNAME", None)
|
||||
OPENSEARCH_PASSWORD = os.environ.get("OPENSEARCH_PASSWORD", None)
|
||||
|
||||
# ElasticSearch
|
||||
ELASTICSEARCH_URL = os.environ.get("ELASTICSEARCH_URL", "https://localhost:9200")
|
||||
ELASTICSEARCH_CA_CERTS = os.environ.get("ELASTICSEARCH_CA_CERTS", None)
|
||||
ELASTICSEARCH_API_KEY = os.environ.get("ELASTICSEARCH_API_KEY", None)
|
||||
ELASTICSEARCH_USERNAME = os.environ.get("ELASTICSEARCH_USERNAME", None)
|
||||
ELASTICSEARCH_PASSWORD = os.environ.get("ELASTICSEARCH_PASSWORD", None)
|
||||
ELASTICSEARCH_CLOUD_ID = os.environ.get("ELASTICSEARCH_CLOUD_ID", None)
|
||||
SSL_ASSERT_FINGERPRINT = os.environ.get("SSL_ASSERT_FINGERPRINT", None)
|
||||
ELASTICSEARCH_INDEX_PREFIX = os.environ.get(
|
||||
"ELASTICSEARCH_INDEX_PREFIX", "open_webui_collections"
|
||||
)
|
||||
# Pgvector
|
||||
PGVECTOR_DB_URL = os.environ.get("PGVECTOR_DB_URL", DATABASE_URL)
|
||||
if VECTOR_DB == "pgvector" and not PGVECTOR_DB_URL.startswith("postgres"):
|
||||
@@ -1976,6 +2000,12 @@ EXA_API_KEY = PersistentConfig(
|
||||
os.getenv("EXA_API_KEY", ""),
|
||||
)
|
||||
|
||||
PERPLEXITY_API_KEY = PersistentConfig(
|
||||
"PERPLEXITY_API_KEY",
|
||||
"rag.web.search.perplexity_api_key",
|
||||
os.getenv("PERPLEXITY_API_KEY", ""),
|
||||
)
|
||||
|
||||
RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig(
|
||||
"RAG_WEB_SEARCH_RESULT_COUNT",
|
||||
"rag.web.search.result_count",
|
||||
@@ -2415,7 +2445,7 @@ LDAP_SEARCH_BASE = PersistentConfig(
|
||||
LDAP_SEARCH_FILTERS = PersistentConfig(
|
||||
"LDAP_SEARCH_FILTER",
|
||||
"ldap.server.search_filter",
|
||||
os.environ.get("LDAP_SEARCH_FILTER", ""),
|
||||
os.environ.get("LDAP_SEARCH_FILTER", os.environ.get("LDAP_SEARCH_FILTERS", "")),
|
||||
)
|
||||
|
||||
LDAP_USE_TLS = PersistentConfig(
|
||||
|
||||
@@ -65,10 +65,8 @@ except Exception:
|
||||
# LOGGING
|
||||
####################################
|
||||
|
||||
log_levels = ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"]
|
||||
|
||||
GLOBAL_LOG_LEVEL = os.environ.get("GLOBAL_LOG_LEVEL", "").upper()
|
||||
if GLOBAL_LOG_LEVEL in log_levels:
|
||||
if GLOBAL_LOG_LEVEL in logging.getLevelNamesMapping():
|
||||
logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True)
|
||||
else:
|
||||
GLOBAL_LOG_LEVEL = "INFO"
|
||||
@@ -78,6 +76,7 @@ log.info(f"GLOBAL_LOG_LEVEL: {GLOBAL_LOG_LEVEL}")
|
||||
|
||||
if "cuda_error" in locals():
|
||||
log.exception(cuda_error)
|
||||
del cuda_error
|
||||
|
||||
log_sources = [
|
||||
"AUDIO",
|
||||
@@ -100,7 +99,7 @@ SRC_LOG_LEVELS = {}
|
||||
for source in log_sources:
|
||||
log_env_var = source + "_LOG_LEVEL"
|
||||
SRC_LOG_LEVELS[source] = os.environ.get(log_env_var, "").upper()
|
||||
if SRC_LOG_LEVELS[source] not in log_levels:
|
||||
if SRC_LOG_LEVELS[source] not in logging.getLevelNamesMapping():
|
||||
SRC_LOG_LEVELS[source] = GLOBAL_LOG_LEVEL
|
||||
log.info(f"{log_env_var}: {SRC_LOG_LEVELS[source]}")
|
||||
|
||||
@@ -386,6 +385,7 @@ ENABLE_WEBSOCKET_SUPPORT = (
|
||||
WEBSOCKET_MANAGER = os.environ.get("WEBSOCKET_MANAGER", "")
|
||||
|
||||
WEBSOCKET_REDIS_URL = os.environ.get("WEBSOCKET_REDIS_URL", REDIS_URL)
|
||||
WEBSOCKET_REDIS_LOCK_TIMEOUT = os.environ.get("WEBSOCKET_REDIS_LOCK_TIMEOUT", 60)
|
||||
|
||||
AIOHTTP_CLIENT_TIMEOUT = os.environ.get("AIOHTTP_CLIENT_TIMEOUT", "")
|
||||
|
||||
@@ -397,19 +397,20 @@ else:
|
||||
except Exception:
|
||||
AIOHTTP_CLIENT_TIMEOUT = 300
|
||||
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = os.environ.get(
|
||||
"AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST", ""
|
||||
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = os.environ.get(
|
||||
"AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST",
|
||||
os.environ.get("AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST", ""),
|
||||
)
|
||||
|
||||
if AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST == "":
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = None
|
||||
|
||||
if AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST == "":
|
||||
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = None
|
||||
else:
|
||||
try:
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = int(
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST
|
||||
)
|
||||
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = int(AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
|
||||
except Exception:
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST = 5
|
||||
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = 5
|
||||
|
||||
|
||||
####################################
|
||||
# OFFLINE_MODE
|
||||
|
||||
@@ -105,6 +105,7 @@ from open_webui.config import (
|
||||
# Direct Connections
|
||||
ENABLE_DIRECT_CONNECTIONS,
|
||||
# Code Execution
|
||||
ENABLE_CODE_EXECUTION,
|
||||
CODE_EXECUTION_ENGINE,
|
||||
CODE_EXECUTION_JUPYTER_URL,
|
||||
CODE_EXECUTION_JUPYTER_AUTH,
|
||||
@@ -215,6 +216,7 @@ from open_webui.config import (
|
||||
BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
||||
BRAVE_SEARCH_API_KEY,
|
||||
EXA_API_KEY,
|
||||
PERPLEXITY_API_KEY,
|
||||
KAGI_SEARCH_API_KEY,
|
||||
MOJEEK_SEARCH_API_KEY,
|
||||
BOCHA_SEARCH_API_KEY,
|
||||
@@ -400,8 +402,8 @@ async def lifespan(app: FastAPI):
|
||||
if RESET_CONFIG_ON_START:
|
||||
reset_config()
|
||||
|
||||
if app.state.config.LICENSE_KEY:
|
||||
get_license_data(app, app.state.config.LICENSE_KEY)
|
||||
if LICENSE_KEY:
|
||||
get_license_data(app, LICENSE_KEY)
|
||||
|
||||
asyncio.create_task(periodic_usage_pool_cleanup())
|
||||
yield
|
||||
@@ -419,7 +421,7 @@ oauth_manager = OAuthManager(app)
|
||||
app.state.config = AppConfig()
|
||||
|
||||
app.state.WEBUI_NAME = WEBUI_NAME
|
||||
app.state.config.LICENSE_KEY = LICENSE_KEY
|
||||
app.state.LICENSE_METADATA = None
|
||||
|
||||
########################################
|
||||
#
|
||||
@@ -603,6 +605,7 @@ app.state.config.JINA_API_KEY = JINA_API_KEY
|
||||
app.state.config.BING_SEARCH_V7_ENDPOINT = BING_SEARCH_V7_ENDPOINT
|
||||
app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY
|
||||
app.state.config.EXA_API_KEY = EXA_API_KEY
|
||||
app.state.config.PERPLEXITY_API_KEY = PERPLEXITY_API_KEY
|
||||
|
||||
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT
|
||||
app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS
|
||||
@@ -658,6 +661,7 @@ app.state.EMBEDDING_FUNCTION = get_embedding_function(
|
||||
#
|
||||
########################################
|
||||
|
||||
app.state.config.ENABLE_CODE_EXECUTION = ENABLE_CODE_EXECUTION
|
||||
app.state.config.CODE_EXECUTION_ENGINE = CODE_EXECUTION_ENGINE
|
||||
app.state.config.CODE_EXECUTION_JUPYTER_URL = CODE_EXECUTION_JUPYTER_URL
|
||||
app.state.config.CODE_EXECUTION_JUPYTER_AUTH = CODE_EXECUTION_JUPYTER_AUTH
|
||||
@@ -972,7 +976,7 @@ async def get_models(request: Request, user=Depends(get_verified_user)):
|
||||
|
||||
@app.get("/api/models/base")
|
||||
async def get_base_models(request: Request, user=Depends(get_admin_user)):
|
||||
models = await get_all_base_models(request)
|
||||
models = await get_all_base_models(request, user=user)
|
||||
return {"data": models}
|
||||
|
||||
|
||||
@@ -1019,7 +1023,7 @@ async def chat_completion(
|
||||
"files": form_data.get("files", None),
|
||||
"features": form_data.get("features", None),
|
||||
"variables": form_data.get("variables", None),
|
||||
"model": model_info.model_dump() if model_info else model,
|
||||
"model": model,
|
||||
"direct": model_item.get("direct", False),
|
||||
**(
|
||||
{"function_calling": "native"}
|
||||
@@ -1037,7 +1041,7 @@ async def chat_completion(
|
||||
form_data["metadata"] = metadata
|
||||
|
||||
form_data, metadata, events = await process_chat_payload(
|
||||
request, form_data, metadata, user, model
|
||||
request, form_data, user, metadata, model
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
@@ -1051,7 +1055,7 @@ async def chat_completion(
|
||||
response = await chat_completion_handler(request, form_data, user)
|
||||
|
||||
return await process_chat_response(
|
||||
request, response, form_data, user, events, metadata, tasks
|
||||
request, response, form_data, user, metadata, model, events, tasks
|
||||
)
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
@@ -1140,9 +1144,10 @@ async def get_app_config(request: Request):
|
||||
if data is not None and "id" in data:
|
||||
user = Users.get_user_by_id(data["id"])
|
||||
|
||||
user_count = Users.get_num_users()
|
||||
onboarding = False
|
||||
|
||||
if user is None:
|
||||
user_count = Users.get_num_users()
|
||||
onboarding = user_count == 0
|
||||
|
||||
return {
|
||||
@@ -1170,6 +1175,7 @@ async def get_app_config(request: Request):
|
||||
"enable_direct_connections": app.state.config.ENABLE_DIRECT_CONNECTIONS,
|
||||
"enable_channels": app.state.config.ENABLE_CHANNELS,
|
||||
"enable_web_search": app.state.config.ENABLE_RAG_WEB_SEARCH,
|
||||
"enable_code_execution": app.state.config.ENABLE_CODE_EXECUTION,
|
||||
"enable_code_interpreter": app.state.config.ENABLE_CODE_INTERPRETER,
|
||||
"enable_image_generation": app.state.config.ENABLE_IMAGE_GENERATION,
|
||||
"enable_autocomplete_generation": app.state.config.ENABLE_AUTOCOMPLETE_GENERATION,
|
||||
@@ -1188,6 +1194,7 @@ async def get_app_config(request: Request):
|
||||
{
|
||||
"default_models": app.state.config.DEFAULT_MODELS,
|
||||
"default_prompt_suggestions": app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
|
||||
"user_count": user_count,
|
||||
"code": {
|
||||
"engine": app.state.config.CODE_EXECUTION_ENGINE,
|
||||
},
|
||||
@@ -1211,6 +1218,14 @@ async def get_app_config(request: Request):
|
||||
"api_key": GOOGLE_DRIVE_API_KEY.value,
|
||||
},
|
||||
"onedrive": {"client_id": ONEDRIVE_CLIENT_ID.value},
|
||||
"license_metadata": app.state.LICENSE_METADATA,
|
||||
**(
|
||||
{
|
||||
"active_entries": app.state.USER_COUNT,
|
||||
}
|
||||
if user.role == "admin"
|
||||
else {}
|
||||
),
|
||||
}
|
||||
if user is not None
|
||||
else {}
|
||||
|
||||
@@ -414,6 +414,13 @@ def get_sources_from_files(
|
||||
]
|
||||
],
|
||||
}
|
||||
elif file.get("file").get("data"):
|
||||
context = {
|
||||
"documents": [[file.get("file").get("data", {}).get("content")]],
|
||||
"metadatas": [
|
||||
[file.get("file").get("data", {}).get("metadata", {})]
|
||||
],
|
||||
}
|
||||
else:
|
||||
collection_names = []
|
||||
if file.get("type") == "collection":
|
||||
|
||||
@@ -16,6 +16,10 @@ elif VECTOR_DB == "pgvector":
|
||||
from open_webui.retrieval.vector.dbs.pgvector import PgvectorClient
|
||||
|
||||
VECTOR_DB_CLIENT = PgvectorClient()
|
||||
elif VECTOR_DB == "elasticsearch":
|
||||
from open_webui.retrieval.vector.dbs.elasticsearch import ElasticsearchClient
|
||||
|
||||
VECTOR_DB_CLIENT = ElasticsearchClient()
|
||||
else:
|
||||
from open_webui.retrieval.vector.dbs.chroma import ChromaClient
|
||||
|
||||
|
||||
@@ -0,0 +1,295 @@
|
||||
from elasticsearch import Elasticsearch, BadRequestError
|
||||
from typing import Optional
|
||||
import ssl
|
||||
from elasticsearch.helpers import bulk, scan
|
||||
from open_webui.retrieval.vector.main import VectorItem, SearchResult, GetResult
|
||||
from open_webui.config import (
|
||||
ELASTICSEARCH_URL,
|
||||
ELASTICSEARCH_CA_CERTS,
|
||||
ELASTICSEARCH_API_KEY,
|
||||
ELASTICSEARCH_USERNAME,
|
||||
ELASTICSEARCH_PASSWORD,
|
||||
ELASTICSEARCH_CLOUD_ID,
|
||||
ELASTICSEARCH_INDEX_PREFIX,
|
||||
SSL_ASSERT_FINGERPRINT,
|
||||
)
|
||||
|
||||
|
||||
class ElasticsearchClient:
|
||||
"""
|
||||
Important:
|
||||
in order to reduce the number of indexes and since the embedding vector length is fixed, we avoid creating
|
||||
an index for each file but store it as a text field, while seperating to different index
|
||||
baesd on the embedding length.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.index_prefix = ELASTICSEARCH_INDEX_PREFIX
|
||||
self.client = Elasticsearch(
|
||||
hosts=[ELASTICSEARCH_URL],
|
||||
ca_certs=ELASTICSEARCH_CA_CERTS,
|
||||
api_key=ELASTICSEARCH_API_KEY,
|
||||
cloud_id=ELASTICSEARCH_CLOUD_ID,
|
||||
basic_auth=(
|
||||
(ELASTICSEARCH_USERNAME, ELASTICSEARCH_PASSWORD)
|
||||
if ELASTICSEARCH_USERNAME and ELASTICSEARCH_PASSWORD
|
||||
else None
|
||||
),
|
||||
ssl_assert_fingerprint=SSL_ASSERT_FINGERPRINT,
|
||||
)
|
||||
|
||||
# Status: works
|
||||
def _get_index_name(self, dimension: int) -> str:
|
||||
return f"{self.index_prefix}_d{str(dimension)}"
|
||||
|
||||
# Status: works
|
||||
def _scan_result_to_get_result(self, result) -> GetResult:
|
||||
if not result:
|
||||
return None
|
||||
ids = []
|
||||
documents = []
|
||||
metadatas = []
|
||||
|
||||
for hit in result:
|
||||
ids.append(hit["_id"])
|
||||
documents.append(hit["_source"].get("text"))
|
||||
metadatas.append(hit["_source"].get("metadata"))
|
||||
|
||||
return GetResult(ids=[ids], documents=[documents], metadatas=[metadatas])
|
||||
|
||||
# Status: works
|
||||
def _result_to_get_result(self, result) -> GetResult:
|
||||
if not result["hits"]["hits"]:
|
||||
return None
|
||||
ids = []
|
||||
documents = []
|
||||
metadatas = []
|
||||
|
||||
for hit in result["hits"]["hits"]:
|
||||
ids.append(hit["_id"])
|
||||
documents.append(hit["_source"].get("text"))
|
||||
metadatas.append(hit["_source"].get("metadata"))
|
||||
|
||||
return GetResult(ids=[ids], documents=[documents], metadatas=[metadatas])
|
||||
|
||||
# Status: works
|
||||
def _result_to_search_result(self, result) -> SearchResult:
|
||||
ids = []
|
||||
distances = []
|
||||
documents = []
|
||||
metadatas = []
|
||||
|
||||
for hit in result["hits"]["hits"]:
|
||||
ids.append(hit["_id"])
|
||||
distances.append(hit["_score"])
|
||||
documents.append(hit["_source"].get("text"))
|
||||
metadatas.append(hit["_source"].get("metadata"))
|
||||
|
||||
return SearchResult(
|
||||
ids=[ids],
|
||||
distances=[distances],
|
||||
documents=[documents],
|
||||
metadatas=[metadatas],
|
||||
)
|
||||
|
||||
# Status: works
|
||||
def _create_index(self, dimension: int):
|
||||
body = {
|
||||
"mappings": {
|
||||
"dynamic_templates": [
|
||||
{
|
||||
"strings": {
|
||||
"match_mapping_type": "string",
|
||||
"mapping": {"type": "keyword"},
|
||||
}
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"collection": {"type": "keyword"},
|
||||
"id": {"type": "keyword"},
|
||||
"vector": {
|
||||
"type": "dense_vector",
|
||||
"dims": dimension, # Adjust based on your vector dimensions
|
||||
"index": True,
|
||||
"similarity": "cosine",
|
||||
},
|
||||
"text": {"type": "text"},
|
||||
"metadata": {"type": "object"},
|
||||
},
|
||||
}
|
||||
}
|
||||
self.client.indices.create(index=self._get_index_name(dimension), body=body)
|
||||
|
||||
# Status: works
|
||||
|
||||
def _create_batches(self, items: list[VectorItem], batch_size=100):
|
||||
for i in range(0, len(items), batch_size):
|
||||
yield items[i : min(i + batch_size, len(items))]
|
||||
|
||||
# Status: works
|
||||
def has_collection(self, collection_name) -> bool:
|
||||
query_body = {"query": {"bool": {"filter": []}}}
|
||||
query_body["query"]["bool"]["filter"].append(
|
||||
{"term": {"collection": collection_name}}
|
||||
)
|
||||
|
||||
try:
|
||||
result = self.client.count(index=f"{self.index_prefix}*", body=query_body)
|
||||
|
||||
return result.body["count"] > 0
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
def delete_collection(self, collection_name: str):
|
||||
query = {"query": {"term": {"collection": collection_name}}}
|
||||
self.client.delete_by_query(index=f"{self.index_prefix}*", body=query)
|
||||
|
||||
# Status: works
|
||||
def search(
|
||||
self, collection_name: str, vectors: list[list[float]], limit: int
|
||||
) -> Optional[SearchResult]:
|
||||
query = {
|
||||
"size": limit,
|
||||
"_source": ["text", "metadata"],
|
||||
"query": {
|
||||
"script_score": {
|
||||
"query": {
|
||||
"bool": {"filter": [{"term": {"collection": collection_name}}]}
|
||||
},
|
||||
"script": {
|
||||
"source": "cosineSimilarity(params.vector, 'vector') + 1.0",
|
||||
"params": {
|
||||
"vector": vectors[0]
|
||||
}, # Assuming single query vector
|
||||
},
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
result = self.client.search(
|
||||
index=self._get_index_name(len(vectors[0])), body=query
|
||||
)
|
||||
|
||||
return self._result_to_search_result(result)
|
||||
|
||||
# Status: only tested halfwat
|
||||
def query(
|
||||
self, collection_name: str, filter: dict, limit: Optional[int] = None
|
||||
) -> Optional[GetResult]:
|
||||
if not self.has_collection(collection_name):
|
||||
return None
|
||||
|
||||
query_body = {
|
||||
"query": {"bool": {"filter": []}},
|
||||
"_source": ["text", "metadata"],
|
||||
}
|
||||
|
||||
for field, value in filter.items():
|
||||
query_body["query"]["bool"]["filter"].append({"term": {field: value}})
|
||||
query_body["query"]["bool"]["filter"].append(
|
||||
{"term": {"collection": collection_name}}
|
||||
)
|
||||
size = limit if limit else 10
|
||||
|
||||
try:
|
||||
result = self.client.search(
|
||||
index=f"{self.index_prefix}*",
|
||||
body=query_body,
|
||||
size=size,
|
||||
)
|
||||
|
||||
return self._result_to_get_result(result)
|
||||
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
# Status: works
|
||||
def _has_index(self, dimension: int):
|
||||
return self.client.indices.exists(
|
||||
index=self._get_index_name(dimension=dimension)
|
||||
)
|
||||
|
||||
def get_or_create_index(self, dimension: int):
|
||||
if not self._has_index(dimension=dimension):
|
||||
self._create_index(dimension=dimension)
|
||||
|
||||
# Status: works
|
||||
def get(self, collection_name: str) -> Optional[GetResult]:
|
||||
# Get all the items in the collection.
|
||||
query = {
|
||||
"query": {"bool": {"filter": [{"term": {"collection": collection_name}}]}},
|
||||
"_source": ["text", "metadata"],
|
||||
}
|
||||
results = list(scan(self.client, index=f"{self.index_prefix}*", query=query))
|
||||
|
||||
return self._scan_result_to_get_result(results)
|
||||
|
||||
# Status: works
|
||||
def insert(self, collection_name: str, items: list[VectorItem]):
|
||||
if not self._has_index(dimension=len(items[0]["vector"])):
|
||||
self._create_index(dimension=len(items[0]["vector"]))
|
||||
|
||||
for batch in self._create_batches(items):
|
||||
actions = [
|
||||
{
|
||||
"_index": self._get_index_name(dimension=len(items[0]["vector"])),
|
||||
"_id": item["id"],
|
||||
"_source": {
|
||||
"collection": collection_name,
|
||||
"vector": item["vector"],
|
||||
"text": item["text"],
|
||||
"metadata": item["metadata"],
|
||||
},
|
||||
}
|
||||
for item in batch
|
||||
]
|
||||
bulk(self.client, actions)
|
||||
|
||||
# Upsert documents using the update API with doc_as_upsert=True.
|
||||
def upsert(self, collection_name: str, items: list[VectorItem]):
|
||||
if not self._has_index(dimension=len(items[0]["vector"])):
|
||||
self._create_index(dimension=len(items[0]["vector"]))
|
||||
for batch in self._create_batches(items):
|
||||
actions = [
|
||||
{
|
||||
"_op_type": "update",
|
||||
"_index": self._get_index_name(dimension=len(item["vector"])),
|
||||
"_id": item["id"],
|
||||
"doc": {
|
||||
"collection": collection_name,
|
||||
"vector": item["vector"],
|
||||
"text": item["text"],
|
||||
"metadata": item["metadata"],
|
||||
},
|
||||
"doc_as_upsert": True,
|
||||
}
|
||||
for item in batch
|
||||
]
|
||||
bulk(self.client, actions)
|
||||
|
||||
# Delete specific documents from a collection by filtering on both collection and document IDs.
|
||||
def delete(
|
||||
self,
|
||||
collection_name: str,
|
||||
ids: Optional[list[str]] = None,
|
||||
filter: Optional[dict] = None,
|
||||
):
|
||||
|
||||
query = {
|
||||
"query": {"bool": {"filter": [{"term": {"collection": collection_name}}]}}
|
||||
}
|
||||
# logic based on chromaDB
|
||||
if ids:
|
||||
query["query"]["bool"]["filter"].append({"terms": {"_id": ids}})
|
||||
elif filter:
|
||||
for field, value in filter.items():
|
||||
query["query"]["bool"]["filter"].append(
|
||||
{"term": {f"metadata.{field}": value}}
|
||||
)
|
||||
|
||||
self.client.delete_by_query(index=f"{self.index_prefix}*", body=query)
|
||||
|
||||
def reset(self):
|
||||
indices = self.client.indices.get(index=f"{self.index_prefix}*")
|
||||
for index in indices:
|
||||
self.client.indices.delete(index=index)
|
||||
@@ -20,9 +20,9 @@ class MilvusClient:
|
||||
def __init__(self):
|
||||
self.collection_prefix = "open_webui"
|
||||
if MILVUS_TOKEN is None:
|
||||
self.client = Client(uri=MILVUS_URI, database=MILVUS_DB)
|
||||
self.client = Client(uri=MILVUS_URI, db_name=MILVUS_DB)
|
||||
else:
|
||||
self.client = Client(uri=MILVUS_URI, database=MILVUS_DB, token=MILVUS_TOKEN)
|
||||
self.client = Client(uri=MILVUS_URI, db_name=MILVUS_DB, token=MILVUS_TOKEN)
|
||||
|
||||
def _result_to_get_result(self, result) -> GetResult:
|
||||
ids = []
|
||||
|
||||
@@ -49,7 +49,7 @@ class OpenSearchClient:
|
||||
ids=ids, distances=distances, documents=documents, metadatas=metadatas
|
||||
)
|
||||
|
||||
def _create_index(self, index_name: str, dimension: int):
|
||||
def _create_index(self, collection_name: str, dimension: int):
|
||||
body = {
|
||||
"mappings": {
|
||||
"properties": {
|
||||
@@ -72,24 +72,28 @@ class OpenSearchClient:
|
||||
}
|
||||
}
|
||||
}
|
||||
self.client.indices.create(index=f"{self.index_prefix}_{index_name}", body=body)
|
||||
self.client.indices.create(
|
||||
index=f"{self.index_prefix}_{collection_name}", body=body
|
||||
)
|
||||
|
||||
def _create_batches(self, items: list[VectorItem], batch_size=100):
|
||||
for i in range(0, len(items), batch_size):
|
||||
yield items[i : i + batch_size]
|
||||
|
||||
def has_collection(self, index_name: str) -> bool:
|
||||
def has_collection(self, collection_name: str) -> bool:
|
||||
# has_collection here means has index.
|
||||
# We are simply adapting to the norms of the other DBs.
|
||||
return self.client.indices.exists(index=f"{self.index_prefix}_{index_name}")
|
||||
return self.client.indices.exists(
|
||||
index=f"{self.index_prefix}_{collection_name}"
|
||||
)
|
||||
|
||||
def delete_colleciton(self, index_name: str):
|
||||
def delete_colleciton(self, collection_name: str):
|
||||
# delete_collection here means delete index.
|
||||
# We are simply adapting to the norms of the other DBs.
|
||||
self.client.indices.delete(index=f"{self.index_prefix}_{index_name}")
|
||||
self.client.indices.delete(index=f"{self.index_prefix}_{collection_name}")
|
||||
|
||||
def search(
|
||||
self, index_name: str, vectors: list[list[float]], limit: int
|
||||
self, collection_name: str, vectors: list[list[float]], limit: int
|
||||
) -> Optional[SearchResult]:
|
||||
query = {
|
||||
"size": limit,
|
||||
@@ -108,7 +112,7 @@ class OpenSearchClient:
|
||||
}
|
||||
|
||||
result = self.client.search(
|
||||
index=f"{self.index_prefix}_{index_name}", body=query
|
||||
index=f"{self.index_prefix}_{collection_name}", body=query
|
||||
)
|
||||
|
||||
return self._result_to_search_result(result)
|
||||
@@ -141,21 +145,22 @@ class OpenSearchClient:
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
def get_or_create_index(self, index_name: str, dimension: int):
|
||||
if not self.has_index(index_name):
|
||||
self._create_index(index_name, dimension)
|
||||
def _create_index_if_not_exists(self, collection_name: str, dimension: int):
|
||||
if not self.has_index(collection_name):
|
||||
self._create_index(collection_name, dimension)
|
||||
|
||||
def get(self, index_name: str) -> Optional[GetResult]:
|
||||
def get(self, collection_name: str) -> Optional[GetResult]:
|
||||
query = {"query": {"match_all": {}}, "_source": ["text", "metadata"]}
|
||||
|
||||
result = self.client.search(
|
||||
index=f"{self.index_prefix}_{index_name}", body=query
|
||||
index=f"{self.index_prefix}_{collection_name}", body=query
|
||||
)
|
||||
return self._result_to_get_result(result)
|
||||
|
||||
def insert(self, index_name: str, items: list[VectorItem]):
|
||||
if not self.has_index(index_name):
|
||||
self._create_index(index_name, dimension=len(items[0]["vector"]))
|
||||
def insert(self, collection_name: str, items: list[VectorItem]):
|
||||
self._create_index_if_not_exists(
|
||||
collection_name=collection_name, dimension=len(items[0]["vector"])
|
||||
)
|
||||
|
||||
for batch in self._create_batches(items):
|
||||
actions = [
|
||||
@@ -173,15 +178,17 @@ class OpenSearchClient:
|
||||
]
|
||||
self.client.bulk(actions)
|
||||
|
||||
def upsert(self, index_name: str, items: list[VectorItem]):
|
||||
if not self.has_index(index_name):
|
||||
self._create_index(index_name, dimension=len(items[0]["vector"]))
|
||||
def upsert(self, collection_name: str, items: list[VectorItem]):
|
||||
self._create_index_if_not_exists(
|
||||
collection_name=collection_name, dimension=len(items[0]["vector"])
|
||||
)
|
||||
|
||||
for batch in self._create_batches(items):
|
||||
actions = [
|
||||
{
|
||||
"index": {
|
||||
"_id": item["id"],
|
||||
"_index": f"{self.index_prefix}_{collection_name}",
|
||||
"_source": {
|
||||
"vector": item["vector"],
|
||||
"text": item["text"],
|
||||
@@ -193,9 +200,9 @@ class OpenSearchClient:
|
||||
]
|
||||
self.client.bulk(actions)
|
||||
|
||||
def delete(self, index_name: str, ids: list[str]):
|
||||
def delete(self, collection_name: str, ids: list[str]):
|
||||
actions = [
|
||||
{"delete": {"_index": f"{self.index_prefix}_{index_name}", "_id": id}}
|
||||
{"delete": {"_index": f"{self.index_prefix}_{collection_name}", "_id": id}}
|
||||
for id in ids
|
||||
]
|
||||
self.client.bulk(body=actions)
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
import logging
|
||||
from typing import Optional, List
|
||||
import requests
|
||||
|
||||
from open_webui.retrieval.web.main import SearchResult, get_filtered_results
|
||||
from open_webui.env import SRC_LOG_LEVELS
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["RAG"])
|
||||
|
||||
|
||||
def search_perplexity(
|
||||
api_key: str,
|
||||
query: str,
|
||||
count: int,
|
||||
filter_list: Optional[list[str]] = None,
|
||||
) -> list[SearchResult]:
|
||||
"""Search using Perplexity API and return the results as a list of SearchResult objects.
|
||||
|
||||
Args:
|
||||
api_key (str): A Perplexity API key
|
||||
query (str): The query to search for
|
||||
count (int): Maximum number of results to return
|
||||
|
||||
"""
|
||||
|
||||
# Handle PersistentConfig object
|
||||
if hasattr(api_key, "__str__"):
|
||||
api_key = str(api_key)
|
||||
|
||||
try:
|
||||
url = "https://api.perplexity.ai/chat/completions"
|
||||
|
||||
# Create payload for the API call
|
||||
payload = {
|
||||
"model": "sonar",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a search assistant. Provide factual information with citations.",
|
||||
},
|
||||
{"role": "user", "content": query},
|
||||
],
|
||||
"temperature": 0.2, # Lower temperature for more factual responses
|
||||
"stream": False,
|
||||
}
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {api_key}",
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
# Make the API request
|
||||
response = requests.request("POST", url, json=payload, headers=headers)
|
||||
|
||||
# Parse the JSON response
|
||||
json_response = response.json()
|
||||
|
||||
# Extract citations from the response
|
||||
citations = json_response.get("citations", [])
|
||||
|
||||
# Create search results from citations
|
||||
results = []
|
||||
for i, citation in enumerate(citations[:count]):
|
||||
# Extract content from the response to use as snippet
|
||||
content = ""
|
||||
if "choices" in json_response and json_response["choices"]:
|
||||
if i == 0:
|
||||
content = json_response["choices"][0]["message"]["content"]
|
||||
|
||||
result = {"link": citation, "title": f"Source {i+1}", "snippet": content}
|
||||
results.append(result)
|
||||
|
||||
if filter_list:
|
||||
|
||||
results = get_filtered_results(results, filter_list)
|
||||
|
||||
return [
|
||||
SearchResult(
|
||||
link=result["link"], title=result["title"], snippet=result["snippet"]
|
||||
)
|
||||
for result in results[:count]
|
||||
]
|
||||
|
||||
except Exception as e:
|
||||
log.error(f"Error searching with Perplexity API: {e}")
|
||||
return []
|
||||
@@ -54,7 +54,7 @@ MAX_FILE_SIZE = MAX_FILE_SIZE_MB * 1024 * 1024 # Convert MB to bytes
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["AUDIO"])
|
||||
|
||||
SPEECH_CACHE_DIR = Path(CACHE_DIR).joinpath("./audio/speech/")
|
||||
SPEECH_CACHE_DIR = CACHE_DIR / "audio" / "speech"
|
||||
SPEECH_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
|
||||
@@ -230,9 +230,12 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
|
||||
|
||||
entry = connection_app.entries[0]
|
||||
username = str(entry[f"{LDAP_ATTRIBUTE_FOR_USERNAME}"]).lower()
|
||||
mail = str(entry[f"{LDAP_ATTRIBUTE_FOR_MAIL}"])
|
||||
if not mail or mail == "" or mail == "[]":
|
||||
raise HTTPException(400, f"User {form_data.user} does not have mail.")
|
||||
email = str(entry[f"{LDAP_ATTRIBUTE_FOR_MAIL}"])
|
||||
if not email or email == "" or email == "[]":
|
||||
raise HTTPException(400, f"User {form_data.user} does not have email.")
|
||||
else:
|
||||
email = email.lower()
|
||||
|
||||
cn = str(entry["cn"])
|
||||
user_dn = entry.entry_dn
|
||||
|
||||
@@ -247,7 +250,7 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
|
||||
if not connection_user.bind():
|
||||
raise HTTPException(400, f"Authentication failed for {form_data.user}")
|
||||
|
||||
user = Users.get_user_by_email(mail)
|
||||
user = Users.get_user_by_email(email)
|
||||
if not user:
|
||||
try:
|
||||
user_count = Users.get_num_users()
|
||||
@@ -259,7 +262,10 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
|
||||
)
|
||||
|
||||
user = Auths.insert_new_auth(
|
||||
email=mail, password=str(uuid.uuid4()), name=cn, role=role
|
||||
email=email,
|
||||
password=str(uuid.uuid4()),
|
||||
name=cn,
|
||||
role=role,
|
||||
)
|
||||
|
||||
if not user:
|
||||
@@ -272,7 +278,7 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
|
||||
except Exception as err:
|
||||
raise HTTPException(500, detail=ERROR_MESSAGES.DEFAULT(err))
|
||||
|
||||
user = Auths.authenticate_user_by_trusted_header(mail)
|
||||
user = Auths.authenticate_user_by_trusted_header(email)
|
||||
|
||||
if user:
|
||||
token = create_token(
|
||||
|
||||
@@ -70,6 +70,7 @@ async def set_direct_connections_config(
|
||||
# CodeInterpreterConfig
|
||||
############################
|
||||
class CodeInterpreterConfigForm(BaseModel):
|
||||
ENABLE_CODE_EXECUTION: bool
|
||||
CODE_EXECUTION_ENGINE: str
|
||||
CODE_EXECUTION_JUPYTER_URL: Optional[str]
|
||||
CODE_EXECUTION_JUPYTER_AUTH: Optional[str]
|
||||
@@ -89,6 +90,7 @@ class CodeInterpreterConfigForm(BaseModel):
|
||||
@router.get("/code_execution", response_model=CodeInterpreterConfigForm)
|
||||
async def get_code_execution_config(request: Request, user=Depends(get_admin_user)):
|
||||
return {
|
||||
"ENABLE_CODE_EXECUTION": request.app.state.config.ENABLE_CODE_EXECUTION,
|
||||
"CODE_EXECUTION_ENGINE": request.app.state.config.CODE_EXECUTION_ENGINE,
|
||||
"CODE_EXECUTION_JUPYTER_URL": request.app.state.config.CODE_EXECUTION_JUPYTER_URL,
|
||||
"CODE_EXECUTION_JUPYTER_AUTH": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH,
|
||||
@@ -111,6 +113,8 @@ async def set_code_execution_config(
|
||||
request: Request, form_data: CodeInterpreterConfigForm, user=Depends(get_admin_user)
|
||||
):
|
||||
|
||||
request.app.state.config.ENABLE_CODE_EXECUTION = form_data.ENABLE_CODE_EXECUTION
|
||||
|
||||
request.app.state.config.CODE_EXECUTION_ENGINE = form_data.CODE_EXECUTION_ENGINE
|
||||
request.app.state.config.CODE_EXECUTION_JUPYTER_URL = (
|
||||
form_data.CODE_EXECUTION_JUPYTER_URL
|
||||
@@ -153,6 +157,7 @@ async def set_code_execution_config(
|
||||
)
|
||||
|
||||
return {
|
||||
"ENABLE_CODE_EXECUTION": request.app.state.config.ENABLE_CODE_EXECUTION,
|
||||
"CODE_EXECUTION_ENGINE": request.app.state.config.CODE_EXECUTION_ENGINE,
|
||||
"CODE_EXECUTION_JUPYTER_URL": request.app.state.config.CODE_EXECUTION_JUPYTER_URL,
|
||||
"CODE_EXECUTION_JUPYTER_AUTH": request.app.state.config.CODE_EXECUTION_JUPYTER_AUTH,
|
||||
|
||||
@@ -74,7 +74,7 @@ async def create_new_function(
|
||||
|
||||
function = Functions.insert_new_function(user.id, function_type, form_data)
|
||||
|
||||
function_cache_dir = Path(CACHE_DIR) / "functions" / form_data.id
|
||||
function_cache_dir = CACHE_DIR / "functions" / form_data.id
|
||||
function_cache_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if function:
|
||||
|
||||
@@ -25,7 +25,7 @@ from pydantic import BaseModel
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["IMAGES"])
|
||||
|
||||
IMAGE_CACHE_DIR = Path(CACHE_DIR).joinpath("./image/generations/")
|
||||
IMAGE_CACHE_DIR = CACHE_DIR / "image" / "generations"
|
||||
IMAGE_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
@@ -517,7 +517,13 @@ async def image_generations(
|
||||
images = []
|
||||
|
||||
for image in res["data"]:
|
||||
image_data, content_type = load_b64_image_data(image["b64_json"])
|
||||
if "url" in image:
|
||||
image_data, content_type = load_url_image_data(
|
||||
image["url"], headers
|
||||
)
|
||||
else:
|
||||
image_data, content_type = load_b64_image_data(image["b64_json"])
|
||||
|
||||
url = upload_image(request, data, image_data, content_type, user)
|
||||
images.append({"url": url})
|
||||
return images
|
||||
|
||||
@@ -55,7 +55,7 @@ from open_webui.env import (
|
||||
ENV,
|
||||
SRC_LOG_LEVELS,
|
||||
AIOHTTP_CLIENT_TIMEOUT,
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST,
|
||||
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST,
|
||||
BYPASS_MODEL_ACCESS_CONTROL,
|
||||
)
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
@@ -72,7 +72,7 @@ log.setLevel(SRC_LOG_LEVELS["OLLAMA"])
|
||||
|
||||
|
||||
async def send_get_request(url, key=None, user: UserModel = None):
|
||||
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST)
|
||||
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
|
||||
try:
|
||||
async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session:
|
||||
async with session.get(
|
||||
@@ -216,7 +216,7 @@ async def verify_connection(
|
||||
key = form_data.key
|
||||
|
||||
async with aiohttp.ClientSession(
|
||||
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST)
|
||||
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
|
||||
) as session:
|
||||
try:
|
||||
async with session.get(
|
||||
|
||||
@@ -22,7 +22,7 @@ from open_webui.config import (
|
||||
)
|
||||
from open_webui.env import (
|
||||
AIOHTTP_CLIENT_TIMEOUT,
|
||||
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST,
|
||||
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST,
|
||||
ENABLE_FORWARD_USER_INFO_HEADERS,
|
||||
BYPASS_MODEL_ACCESS_CONTROL,
|
||||
)
|
||||
@@ -53,7 +53,7 @@ log.setLevel(SRC_LOG_LEVELS["OPENAI"])
|
||||
|
||||
|
||||
async def send_get_request(url, key=None, user: UserModel = None):
|
||||
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST)
|
||||
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
|
||||
try:
|
||||
async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session:
|
||||
async with session.get(
|
||||
@@ -67,7 +67,7 @@ async def send_get_request(url, key=None, user: UserModel = None):
|
||||
"X-OpenWebUI-User-Email": user.email,
|
||||
"X-OpenWebUI-User-Role": user.role,
|
||||
}
|
||||
if ENABLE_FORWARD_USER_INFO_HEADERS
|
||||
if ENABLE_FORWARD_USER_INFO_HEADERS and user
|
||||
else {}
|
||||
),
|
||||
},
|
||||
@@ -192,7 +192,7 @@ async def speech(request: Request, user=Depends(get_verified_user)):
|
||||
body = await request.body()
|
||||
name = hashlib.sha256(body).hexdigest()
|
||||
|
||||
SPEECH_CACHE_DIR = Path(CACHE_DIR).joinpath("./audio/speech/")
|
||||
SPEECH_CACHE_DIR = CACHE_DIR / "audio" / "speech"
|
||||
SPEECH_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
file_path = SPEECH_CACHE_DIR.joinpath(f"{name}.mp3")
|
||||
file_body_path = SPEECH_CACHE_DIR.joinpath(f"{name}.json")
|
||||
@@ -448,9 +448,7 @@ async def get_models(
|
||||
|
||||
r = None
|
||||
async with aiohttp.ClientSession(
|
||||
timeout=aiohttp.ClientTimeout(
|
||||
total=AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST
|
||||
)
|
||||
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
|
||||
) as session:
|
||||
try:
|
||||
async with session.get(
|
||||
@@ -530,7 +528,7 @@ async def verify_connection(
|
||||
key = form_data.key
|
||||
|
||||
async with aiohttp.ClientSession(
|
||||
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST)
|
||||
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
|
||||
) as session:
|
||||
try:
|
||||
async with session.get(
|
||||
|
||||
@@ -59,7 +59,7 @@ from open_webui.retrieval.web.serpstack import search_serpstack
|
||||
from open_webui.retrieval.web.tavily import search_tavily
|
||||
from open_webui.retrieval.web.bing import search_bing
|
||||
from open_webui.retrieval.web.exa import search_exa
|
||||
|
||||
from open_webui.retrieval.web.perplexity import search_perplexity
|
||||
|
||||
from open_webui.retrieval.utils import (
|
||||
get_embedding_function,
|
||||
@@ -405,6 +405,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)):
|
||||
"bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
|
||||
"bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
||||
"exa_api_key": request.app.state.config.EXA_API_KEY,
|
||||
"perplexity_api_key": request.app.state.config.PERPLEXITY_API_KEY,
|
||||
"result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
"trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV,
|
||||
"concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
@@ -465,6 +466,7 @@ class WebSearchConfig(BaseModel):
|
||||
bing_search_v7_endpoint: Optional[str] = None
|
||||
bing_search_v7_subscription_key: Optional[str] = None
|
||||
exa_api_key: Optional[str] = None
|
||||
perplexity_api_key: Optional[str] = None
|
||||
result_count: Optional[int] = None
|
||||
concurrent_requests: Optional[int] = None
|
||||
trust_env: Optional[bool] = None
|
||||
@@ -617,6 +619,10 @@ async def update_rag_config(
|
||||
|
||||
request.app.state.config.EXA_API_KEY = form_data.web.search.exa_api_key
|
||||
|
||||
request.app.state.config.PERPLEXITY_API_KEY = (
|
||||
form_data.web.search.perplexity_api_key
|
||||
)
|
||||
|
||||
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = (
|
||||
form_data.web.search.result_count
|
||||
)
|
||||
@@ -683,6 +689,7 @@ async def update_rag_config(
|
||||
"bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
|
||||
"bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
||||
"exa_api_key": request.app.state.config.EXA_API_KEY,
|
||||
"perplexity_api_key": request.app.state.config.PERPLEXITY_API_KEY,
|
||||
"result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
"concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
"trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV,
|
||||
@@ -1182,9 +1189,13 @@ def process_web(
|
||||
content = " ".join([doc.page_content for doc in docs])
|
||||
|
||||
log.debug(f"text_content: {content}")
|
||||
save_docs_to_vector_db(
|
||||
request, docs, collection_name, overwrite=True, user=user
|
||||
)
|
||||
|
||||
if not request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL:
|
||||
save_docs_to_vector_db(
|
||||
request, docs, collection_name, overwrite=True, user=user
|
||||
)
|
||||
else:
|
||||
collection_name = None
|
||||
|
||||
return {
|
||||
"status": True,
|
||||
@@ -1196,6 +1207,7 @@ def process_web(
|
||||
},
|
||||
"meta": {
|
||||
"name": form_data.url,
|
||||
"source": form_data.url,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1221,6 +1233,7 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
|
||||
- SERPLY_API_KEY
|
||||
- TAVILY_API_KEY
|
||||
- EXA_API_KEY
|
||||
- PERPLEXITY_API_KEY
|
||||
- SEARCHAPI_API_KEY + SEARCHAPI_ENGINE (by default `google`)
|
||||
- SERPAPI_API_KEY + SERPAPI_ENGINE (by default `google`)
|
||||
Args:
|
||||
@@ -1385,6 +1398,13 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
|
||||
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
|
||||
)
|
||||
elif engine == "perplexity":
|
||||
return search_perplexity(
|
||||
request.app.state.config.PERPLEXITY_API_KEY,
|
||||
query,
|
||||
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
|
||||
)
|
||||
else:
|
||||
raise Exception("No search engine API key found in environment variables")
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ async def create_new_tools(
|
||||
specs = get_tools_specs(TOOLS[form_data.id])
|
||||
tools = Tools.insert_new_tool(user.id, form_data, specs)
|
||||
|
||||
tool_cache_dir = Path(CACHE_DIR) / "tools" / form_data.id
|
||||
tool_cache_dir = CACHE_DIR / "tools" / form_data.id
|
||||
tool_cache_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if tools:
|
||||
|
||||
@@ -12,6 +12,7 @@ from open_webui.env import (
|
||||
ENABLE_WEBSOCKET_SUPPORT,
|
||||
WEBSOCKET_MANAGER,
|
||||
WEBSOCKET_REDIS_URL,
|
||||
WEBSOCKET_REDIS_LOCK_TIMEOUT,
|
||||
)
|
||||
from open_webui.utils.auth import decode_token
|
||||
from open_webui.socket.utils import RedisDict, RedisLock
|
||||
@@ -61,7 +62,7 @@ if WEBSOCKET_MANAGER == "redis":
|
||||
clean_up_lock = RedisLock(
|
||||
redis_url=WEBSOCKET_REDIS_URL,
|
||||
lock_name="usage_cleanup_lock",
|
||||
timeout_secs=TIMEOUT_DURATION * 2,
|
||||
timeout_secs=WEBSOCKET_REDIS_LOCK_TIMEOUT,
|
||||
)
|
||||
aquire_func = clean_up_lock.aquire_lock
|
||||
renew_func = clean_up_lock.renew_lock
|
||||
|
||||
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 306 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 303 KiB |
@@ -3,13 +3,13 @@
|
||||
"short_name": "WebUI",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/favicon/web-app-manifest-192x192.png",
|
||||
"src": "/static/web-app-manifest-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/favicon/web-app-manifest-512x512.png",
|
||||
"src": "/static/web-app-manifest-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
After Width: | Height: | Size: 335 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 306 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 312 KiB |
@@ -101,19 +101,33 @@ class LocalStorageProvider(StorageProvider):
|
||||
|
||||
class S3StorageProvider(StorageProvider):
|
||||
def __init__(self):
|
||||
self.s3_client = boto3.client(
|
||||
"s3",
|
||||
region_name=S3_REGION_NAME,
|
||||
endpoint_url=S3_ENDPOINT_URL,
|
||||
aws_access_key_id=S3_ACCESS_KEY_ID,
|
||||
aws_secret_access_key=S3_SECRET_ACCESS_KEY,
|
||||
config=Config(
|
||||
s3={
|
||||
"use_accelerate_endpoint": S3_USE_ACCELERATE_ENDPOINT,
|
||||
"addressing_style": S3_ADDRESSING_STYLE,
|
||||
},
|
||||
),
|
||||
config = Config(
|
||||
s3={
|
||||
"use_accelerate_endpoint": S3_USE_ACCELERATE_ENDPOINT,
|
||||
"addressing_style": S3_ADDRESSING_STYLE,
|
||||
},
|
||||
)
|
||||
|
||||
# If access key and secret are provided, use them for authentication
|
||||
if S3_ACCESS_KEY_ID and S3_SECRET_ACCESS_KEY:
|
||||
self.s3_client = boto3.client(
|
||||
"s3",
|
||||
region_name=S3_REGION_NAME,
|
||||
endpoint_url=S3_ENDPOINT_URL,
|
||||
aws_access_key_id=S3_ACCESS_KEY_ID,
|
||||
aws_secret_access_key=S3_SECRET_ACCESS_KEY,
|
||||
config=config,
|
||||
)
|
||||
else:
|
||||
# If no explicit credentials are provided, fall back to default AWS credentials
|
||||
# This supports workload identity (IAM roles for EC2, EKS, etc.)
|
||||
self.s3_client = boto3.client(
|
||||
"s3",
|
||||
region_name=S3_REGION_NAME,
|
||||
endpoint_url=S3_ENDPOINT_URL,
|
||||
config=config,
|
||||
)
|
||||
|
||||
self.bucket_name = S3_BUCKET_NAME
|
||||
self.key_prefix = S3_KEY_PREFIX if S3_KEY_PREFIX else ""
|
||||
|
||||
|
||||
@@ -187,6 +187,17 @@ class TestS3StorageProvider:
|
||||
assert not (upload_dir / self.filename).exists()
|
||||
assert not (upload_dir / self.filename_extra).exists()
|
||||
|
||||
def test_init_without_credentials(self, monkeypatch):
|
||||
"""Test that S3StorageProvider can initialize without explicit credentials."""
|
||||
# Temporarily unset the environment variables
|
||||
monkeypatch.setattr(provider, "S3_ACCESS_KEY_ID", None)
|
||||
monkeypatch.setattr(provider, "S3_SECRET_ACCESS_KEY", None)
|
||||
|
||||
# Should not raise an exception
|
||||
storage = provider.S3StorageProvider()
|
||||
assert storage.s3_client is not None
|
||||
assert storage.bucket_name == provider.S3_BUCKET_NAME
|
||||
|
||||
|
||||
class TestGCSStorageProvider:
|
||||
Storage = provider.GCSStorageProvider()
|
||||
|
||||
@@ -72,7 +72,7 @@ def get_license_data(app, key):
|
||||
if key:
|
||||
try:
|
||||
res = requests.post(
|
||||
"https://api.openwebui.com/api/v1/license",
|
||||
"https://api.openwebui.com/api/v1/license/",
|
||||
json={"key": key, "version": "1"},
|
||||
timeout=5,
|
||||
)
|
||||
@@ -83,11 +83,12 @@ def get_license_data(app, key):
|
||||
if k == "resources":
|
||||
for p, c in v.items():
|
||||
globals().get("override_static", lambda a, b: None)(p, c)
|
||||
elif k == "user_count":
|
||||
elif k == "count":
|
||||
setattr(app.state, "USER_COUNT", v)
|
||||
elif k == "webui_name":
|
||||
elif k == "name":
|
||||
setattr(app.state, "WEBUI_NAME", v)
|
||||
|
||||
elif k == "metadata":
|
||||
setattr(app.state, "LICENSE_METADATA", v)
|
||||
return True
|
||||
else:
|
||||
log.error(
|
||||
|
||||
@@ -149,7 +149,7 @@ async def generate_direct_chat_completion(
|
||||
}
|
||||
)
|
||||
|
||||
if "error" in res:
|
||||
if "error" in res and res["error"]:
|
||||
raise Exception(res["error"])
|
||||
|
||||
return res
|
||||
@@ -328,9 +328,14 @@ async def chat_completed(request: Request, form_data: dict, user: Any):
|
||||
}
|
||||
|
||||
try:
|
||||
filter_functions = [
|
||||
Functions.get_function_by_id(filter_id)
|
||||
for filter_id in get_sorted_filter_ids(model)
|
||||
]
|
||||
|
||||
result, _ = await process_filter_functions(
|
||||
request=request,
|
||||
filter_ids=get_sorted_filter_ids(model),
|
||||
filter_functions=filter_functions,
|
||||
filter_type="outlet",
|
||||
form_data=data,
|
||||
extra_params=extra_params,
|
||||
|
||||
@@ -1,148 +1,210 @@
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
import uuid
|
||||
from typing import Optional
|
||||
|
||||
import aiohttp
|
||||
import websockets
|
||||
import requests
|
||||
from urllib.parse import urljoin
|
||||
from pydantic import BaseModel
|
||||
|
||||
from open_webui.env import SRC_LOG_LEVELS
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(SRC_LOG_LEVELS["MAIN"])
|
||||
|
||||
|
||||
async def execute_code_jupyter(
|
||||
jupyter_url, code, token=None, password=None, timeout=10
|
||||
):
|
||||
class ResultModel(BaseModel):
|
||||
"""
|
||||
Executes Python code in a Jupyter kernel.
|
||||
Supports authentication with a token or password.
|
||||
:param jupyter_url: Jupyter server URL (e.g., "http://localhost:8888")
|
||||
:param code: Code to execute
|
||||
:param token: Jupyter authentication token (optional)
|
||||
:param password: Jupyter password (optional)
|
||||
:param timeout: WebSocket timeout in seconds (default: 10s)
|
||||
:return: Dictionary with stdout, stderr, and result
|
||||
- Images are prefixed with "base64:image/png," and separated by newlines if multiple.
|
||||
Execute Code Result Model
|
||||
"""
|
||||
session = requests.Session() # Maintain cookies
|
||||
headers = {} # Headers for requests
|
||||
|
||||
# Authenticate using password
|
||||
if password and not token:
|
||||
stdout: Optional[str] = ""
|
||||
stderr: Optional[str] = ""
|
||||
result: Optional[str] = ""
|
||||
|
||||
|
||||
class JupyterCodeExecuter:
|
||||
"""
|
||||
Execute code in jupyter notebook
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
base_url: str,
|
||||
code: str,
|
||||
token: str = "",
|
||||
password: str = "",
|
||||
timeout: int = 60,
|
||||
):
|
||||
"""
|
||||
:param base_url: Jupyter server URL (e.g., "http://localhost:8888")
|
||||
:param code: Code to execute
|
||||
:param token: Jupyter authentication token (optional)
|
||||
:param password: Jupyter password (optional)
|
||||
:param timeout: WebSocket timeout in seconds (default: 60s)
|
||||
"""
|
||||
self.base_url = base_url.rstrip("/")
|
||||
self.code = code
|
||||
self.token = token
|
||||
self.password = password
|
||||
self.timeout = timeout
|
||||
self.kernel_id = ""
|
||||
self.session = aiohttp.ClientSession(base_url=self.base_url)
|
||||
self.params = {}
|
||||
self.result = ResultModel()
|
||||
|
||||
async def __aenter__(self):
|
||||
return self
|
||||
|
||||
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
||||
if self.kernel_id:
|
||||
try:
|
||||
async with self.session.delete(
|
||||
f"/api/kernels/{self.kernel_id}", params=self.params
|
||||
) as response:
|
||||
response.raise_for_status()
|
||||
except Exception as err:
|
||||
logger.exception("close kernel failed, %s", err)
|
||||
await self.session.close()
|
||||
|
||||
async def run(self) -> ResultModel:
|
||||
try:
|
||||
login_url = urljoin(jupyter_url, "/login")
|
||||
response = session.get(login_url)
|
||||
await self.sign_in()
|
||||
await self.init_kernel()
|
||||
await self.execute_code()
|
||||
except Exception as err:
|
||||
logger.exception("execute code failed, %s", err)
|
||||
self.result.stderr = f"Error: {err}"
|
||||
return self.result
|
||||
|
||||
async def sign_in(self) -> None:
|
||||
# password authentication
|
||||
if self.password and not self.token:
|
||||
async with self.session.get("/login") as response:
|
||||
response.raise_for_status()
|
||||
xsrf_token = response.cookies["_xsrf"].value
|
||||
if not xsrf_token:
|
||||
raise ValueError("_xsrf token not found")
|
||||
self.session.cookie_jar.update_cookies(response.cookies)
|
||||
self.session.headers.update({"X-XSRFToken": xsrf_token})
|
||||
async with self.session.post(
|
||||
"/login",
|
||||
data={"_xsrf": xsrf_token, "password": self.password},
|
||||
allow_redirects=False,
|
||||
) as response:
|
||||
response.raise_for_status()
|
||||
self.session.cookie_jar.update_cookies(response.cookies)
|
||||
|
||||
# token authentication
|
||||
if self.token:
|
||||
self.params.update({"token": self.token})
|
||||
|
||||
async def init_kernel(self) -> None:
|
||||
async with self.session.post(
|
||||
url="/api/kernels", params=self.params
|
||||
) as response:
|
||||
response.raise_for_status()
|
||||
xsrf_token = session.cookies.get("_xsrf")
|
||||
if not xsrf_token:
|
||||
raise ValueError("Failed to fetch _xsrf token")
|
||||
|
||||
login_data = {"_xsrf": xsrf_token, "password": password}
|
||||
login_response = session.post(
|
||||
login_url, data=login_data, cookies=session.cookies
|
||||
)
|
||||
login_response.raise_for_status()
|
||||
headers["X-XSRFToken"] = xsrf_token
|
||||
except Exception as e:
|
||||
return {
|
||||
"stdout": "",
|
||||
"stderr": f"Authentication Error: {str(e)}",
|
||||
"result": "",
|
||||
}
|
||||
|
||||
# Construct API URLs with authentication token if provided
|
||||
params = f"?token={token}" if token else ""
|
||||
kernel_url = urljoin(jupyter_url, f"/api/kernels{params}")
|
||||
|
||||
try:
|
||||
response = session.post(kernel_url, headers=headers, cookies=session.cookies)
|
||||
response.raise_for_status()
|
||||
kernel_id = response.json()["id"]
|
||||
|
||||
websocket_url = urljoin(
|
||||
jupyter_url.replace("http", "ws"),
|
||||
f"/api/kernels/{kernel_id}/channels{params}",
|
||||
)
|
||||
kernel_data = await response.json()
|
||||
self.kernel_id = kernel_data["id"]
|
||||
|
||||
def init_ws(self) -> (str, dict):
|
||||
ws_base = self.base_url.replace("http", "ws")
|
||||
ws_params = "?" + "&".join([f"{key}={val}" for key, val in self.params.items()])
|
||||
websocket_url = f"{ws_base}/api/kernels/{self.kernel_id}/channels{ws_params if len(ws_params) > 1 else ''}"
|
||||
ws_headers = {}
|
||||
if password and not token:
|
||||
ws_headers["X-XSRFToken"] = session.cookies.get("_xsrf")
|
||||
cookies = {name: value for name, value in session.cookies.items()}
|
||||
ws_headers["Cookie"] = "; ".join(
|
||||
[f"{name}={value}" for name, value in cookies.items()]
|
||||
)
|
||||
if self.password and not self.token:
|
||||
ws_headers = {
|
||||
"Cookie": "; ".join(
|
||||
[
|
||||
f"{cookie.key}={cookie.value}"
|
||||
for cookie in self.session.cookie_jar
|
||||
]
|
||||
),
|
||||
**self.session.headers,
|
||||
}
|
||||
return websocket_url, ws_headers
|
||||
|
||||
async def execute_code(self) -> None:
|
||||
# initialize ws
|
||||
websocket_url, ws_headers = self.init_ws()
|
||||
# execute
|
||||
async with websockets.connect(
|
||||
websocket_url, additional_headers=ws_headers
|
||||
) as ws:
|
||||
msg_id = str(uuid.uuid4())
|
||||
execute_request = {
|
||||
"header": {
|
||||
"msg_id": msg_id,
|
||||
"msg_type": "execute_request",
|
||||
"username": "user",
|
||||
"session": str(uuid.uuid4()),
|
||||
"date": "",
|
||||
"version": "5.3",
|
||||
},
|
||||
"parent_header": {},
|
||||
"metadata": {},
|
||||
"content": {
|
||||
"code": code,
|
||||
"silent": False,
|
||||
"store_history": True,
|
||||
"user_expressions": {},
|
||||
"allow_stdin": False,
|
||||
"stop_on_error": True,
|
||||
},
|
||||
"channel": "shell",
|
||||
}
|
||||
await ws.send(json.dumps(execute_request))
|
||||
await self.execute_in_jupyter(ws)
|
||||
|
||||
stdout, stderr, result = "", "", []
|
||||
|
||||
while True:
|
||||
try:
|
||||
message = await asyncio.wait_for(ws.recv(), timeout)
|
||||
message_data = json.loads(message)
|
||||
if message_data.get("parent_header", {}).get("msg_id") == msg_id:
|
||||
msg_type = message_data.get("msg_type")
|
||||
|
||||
if msg_type == "stream":
|
||||
if message_data["content"]["name"] == "stdout":
|
||||
stdout += message_data["content"]["text"]
|
||||
elif message_data["content"]["name"] == "stderr":
|
||||
stderr += message_data["content"]["text"]
|
||||
|
||||
elif msg_type in ("execute_result", "display_data"):
|
||||
data = message_data["content"]["data"]
|
||||
if "image/png" in data:
|
||||
result.append(
|
||||
f"data:image/png;base64,{data['image/png']}"
|
||||
)
|
||||
elif "text/plain" in data:
|
||||
result.append(data["text/plain"])
|
||||
|
||||
elif msg_type == "error":
|
||||
stderr += "\n".join(message_data["content"]["traceback"])
|
||||
|
||||
elif (
|
||||
msg_type == "status"
|
||||
and message_data["content"]["execution_state"] == "idle"
|
||||
):
|
||||
async def execute_in_jupyter(self, ws) -> None:
|
||||
# send message
|
||||
msg_id = uuid.uuid4().hex
|
||||
await ws.send(
|
||||
json.dumps(
|
||||
{
|
||||
"header": {
|
||||
"msg_id": msg_id,
|
||||
"msg_type": "execute_request",
|
||||
"username": "user",
|
||||
"session": uuid.uuid4().hex,
|
||||
"date": "",
|
||||
"version": "5.3",
|
||||
},
|
||||
"parent_header": {},
|
||||
"metadata": {},
|
||||
"content": {
|
||||
"code": self.code,
|
||||
"silent": False,
|
||||
"store_history": True,
|
||||
"user_expressions": {},
|
||||
"allow_stdin": False,
|
||||
"stop_on_error": True,
|
||||
},
|
||||
"channel": "shell",
|
||||
}
|
||||
)
|
||||
)
|
||||
# parse message
|
||||
stdout, stderr, result = "", "", []
|
||||
while True:
|
||||
try:
|
||||
# wait for message
|
||||
message = await asyncio.wait_for(ws.recv(), self.timeout)
|
||||
message_data = json.loads(message)
|
||||
# msg id not match, skip
|
||||
if message_data.get("parent_header", {}).get("msg_id") != msg_id:
|
||||
continue
|
||||
# check message type
|
||||
msg_type = message_data.get("msg_type")
|
||||
match msg_type:
|
||||
case "stream":
|
||||
if message_data["content"]["name"] == "stdout":
|
||||
stdout += message_data["content"]["text"]
|
||||
elif message_data["content"]["name"] == "stderr":
|
||||
stderr += message_data["content"]["text"]
|
||||
case "execute_result" | "display_data":
|
||||
data = message_data["content"]["data"]
|
||||
if "image/png" in data:
|
||||
result.append(f"data:image/png;base64,{data['image/png']}")
|
||||
elif "text/plain" in data:
|
||||
result.append(data["text/plain"])
|
||||
case "error":
|
||||
stderr += "\n".join(message_data["content"]["traceback"])
|
||||
case "status":
|
||||
if message_data["content"]["execution_state"] == "idle":
|
||||
break
|
||||
|
||||
except asyncio.TimeoutError:
|
||||
stderr += "\nExecution timed out."
|
||||
break
|
||||
except asyncio.TimeoutError:
|
||||
stderr += "\nExecution timed out."
|
||||
break
|
||||
self.result.stdout = stdout.strip()
|
||||
self.result.stderr = stderr.strip()
|
||||
self.result.result = "\n".join(result).strip() if result else ""
|
||||
|
||||
except Exception as e:
|
||||
return {"stdout": "", "stderr": f"Error: {str(e)}", "result": ""}
|
||||
|
||||
finally:
|
||||
if kernel_id:
|
||||
requests.delete(
|
||||
f"{kernel_url}/{kernel_id}", headers=headers, cookies=session.cookies
|
||||
)
|
||||
|
||||
return {
|
||||
"stdout": stdout.strip(),
|
||||
"stderr": stderr.strip(),
|
||||
"result": "\n".join(result).strip() if result else "",
|
||||
}
|
||||
async def execute_code_jupyter(
|
||||
base_url: str, code: str, token: str = "", password: str = "", timeout: int = 60
|
||||
) -> dict:
|
||||
async with JupyterCodeExecuter(
|
||||
base_url, code, token, password, timeout
|
||||
) as executor:
|
||||
result = await executor.run()
|
||||
return result.model_dump()
|
||||
|
||||
@@ -9,7 +9,7 @@ log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["MAIN"])
|
||||
|
||||
|
||||
def get_sorted_filter_ids(model):
|
||||
def get_sorted_filter_ids(model: dict):
|
||||
def get_priority(function_id):
|
||||
function = Functions.get_function_by_id(function_id)
|
||||
if function is not None and hasattr(function, "valves"):
|
||||
@@ -33,12 +33,13 @@ def get_sorted_filter_ids(model):
|
||||
|
||||
|
||||
async def process_filter_functions(
|
||||
request, filter_ids, filter_type, form_data, extra_params
|
||||
request, filter_functions, filter_type, form_data, extra_params
|
||||
):
|
||||
skip_files = None
|
||||
|
||||
for filter_id in filter_ids:
|
||||
filter = Functions.get_function_by_id(filter_id)
|
||||
for function in filter_functions:
|
||||
filter = function
|
||||
filter_id = function.id
|
||||
if not filter:
|
||||
continue
|
||||
|
||||
@@ -48,6 +49,11 @@ async def process_filter_functions(
|
||||
function_module, _, _ = load_function_module_by_id(filter_id)
|
||||
request.app.state.FUNCTIONS[filter_id] = function_module
|
||||
|
||||
# Prepare handler function
|
||||
handler = getattr(function_module, filter_type, None)
|
||||
if not handler:
|
||||
continue
|
||||
|
||||
# Check if the function has a file_handler variable
|
||||
if filter_type == "inlet" and hasattr(function_module, "file_handler"):
|
||||
skip_files = function_module.file_handler
|
||||
@@ -59,11 +65,6 @@ async def process_filter_functions(
|
||||
**(valves if valves else {})
|
||||
)
|
||||
|
||||
# Prepare handler function
|
||||
handler = getattr(function_module, filter_type, None)
|
||||
if not handler:
|
||||
continue
|
||||
|
||||
try:
|
||||
# Prepare parameters
|
||||
sig = inspect.signature(handler)
|
||||
|
||||
@@ -68,6 +68,7 @@ from open_webui.utils.misc import (
|
||||
get_last_user_message,
|
||||
get_last_assistant_message,
|
||||
prepend_to_first_user_message_content,
|
||||
convert_logit_bias_input_to_json,
|
||||
)
|
||||
from open_webui.utils.tools import get_tools
|
||||
from open_webui.utils.plugin import load_function_module_by_id
|
||||
@@ -610,11 +611,18 @@ def apply_params_to_form_data(form_data, model):
|
||||
|
||||
if "reasoning_effort" in params:
|
||||
form_data["reasoning_effort"] = params["reasoning_effort"]
|
||||
if "logit_bias" in params:
|
||||
try:
|
||||
form_data["logit_bias"] = json.loads(
|
||||
convert_logit_bias_input_to_json(params["logit_bias"])
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Error parsing logit_bias: {e}")
|
||||
|
||||
return form_data
|
||||
|
||||
|
||||
async def process_chat_payload(request, form_data, metadata, user, model):
|
||||
async def process_chat_payload(request, form_data, user, metadata, model):
|
||||
|
||||
form_data = apply_params_to_form_data(form_data, model)
|
||||
log.debug(f"form_data: {form_data}")
|
||||
@@ -707,9 +715,14 @@ async def process_chat_payload(request, form_data, metadata, user, model):
|
||||
raise e
|
||||
|
||||
try:
|
||||
filter_functions = [
|
||||
Functions.get_function_by_id(filter_id)
|
||||
for filter_id in get_sorted_filter_ids(model)
|
||||
]
|
||||
|
||||
form_data, flags = await process_filter_functions(
|
||||
request=request,
|
||||
filter_ids=get_sorted_filter_ids(model),
|
||||
filter_functions=filter_functions,
|
||||
filter_type="inlet",
|
||||
form_data=form_data,
|
||||
extra_params=extra_params,
|
||||
@@ -856,7 +869,7 @@ async def process_chat_payload(request, form_data, metadata, user, model):
|
||||
|
||||
|
||||
async def process_chat_response(
|
||||
request, response, form_data, user, events, metadata, tasks
|
||||
request, response, form_data, user, metadata, model, events, tasks
|
||||
):
|
||||
async def background_tasks_handler():
|
||||
message_map = Chats.get_messages_by_chat_id(metadata["chat_id"])
|
||||
@@ -1061,9 +1074,14 @@ async def process_chat_response(
|
||||
},
|
||||
"__metadata__": metadata,
|
||||
"__request__": request,
|
||||
"__model__": metadata.get("model"),
|
||||
"__model__": model,
|
||||
}
|
||||
filter_ids = get_sorted_filter_ids(form_data.get("model"))
|
||||
filter_functions = [
|
||||
Functions.get_function_by_id(filter_id)
|
||||
for filter_id in get_sorted_filter_ids(model)
|
||||
]
|
||||
|
||||
print(f"{filter_functions=}")
|
||||
|
||||
# Streaming response
|
||||
if event_emitter and event_caller:
|
||||
@@ -1470,7 +1488,7 @@ async def process_chat_response(
|
||||
|
||||
data, _ = await process_filter_functions(
|
||||
request=request,
|
||||
filter_ids=filter_ids,
|
||||
filter_functions=filter_functions,
|
||||
filter_type="stream",
|
||||
form_data=data,
|
||||
extra_params=extra_params,
|
||||
@@ -1544,9 +1562,59 @@ async def process_chat_response(
|
||||
|
||||
value = delta.get("content")
|
||||
|
||||
if value:
|
||||
content = f"{content}{value}"
|
||||
reasoning_content = delta.get("reasoning_content")
|
||||
if reasoning_content:
|
||||
if (
|
||||
not content_blocks
|
||||
or content_blocks[-1]["type"] != "reasoning"
|
||||
):
|
||||
reasoning_block = {
|
||||
"type": "reasoning",
|
||||
"start_tag": "think",
|
||||
"end_tag": "/think",
|
||||
"attributes": {
|
||||
"type": "reasoning_content"
|
||||
},
|
||||
"content": "",
|
||||
"started_at": time.time(),
|
||||
}
|
||||
content_blocks.append(reasoning_block)
|
||||
else:
|
||||
reasoning_block = content_blocks[-1]
|
||||
|
||||
reasoning_block["content"] += reasoning_content
|
||||
|
||||
data = {
|
||||
"content": serialize_content_blocks(
|
||||
content_blocks
|
||||
)
|
||||
}
|
||||
|
||||
if value:
|
||||
if (
|
||||
content_blocks
|
||||
and content_blocks[-1]["type"]
|
||||
== "reasoning"
|
||||
and content_blocks[-1]
|
||||
.get("attributes", {})
|
||||
.get("type")
|
||||
== "reasoning_content"
|
||||
):
|
||||
reasoning_block = content_blocks[-1]
|
||||
reasoning_block["ended_at"] = time.time()
|
||||
reasoning_block["duration"] = int(
|
||||
reasoning_block["ended_at"]
|
||||
- reasoning_block["started_at"]
|
||||
)
|
||||
|
||||
content_blocks.append(
|
||||
{
|
||||
"type": "text",
|
||||
"content": "",
|
||||
}
|
||||
)
|
||||
|
||||
content = f"{content}{value}"
|
||||
if not content_blocks:
|
||||
content_blocks.append(
|
||||
{
|
||||
@@ -2017,7 +2085,7 @@ async def process_chat_response(
|
||||
for event in events:
|
||||
event, _ = await process_filter_functions(
|
||||
request=request,
|
||||
filter_ids=filter_ids,
|
||||
filter_functions=filter_functions,
|
||||
filter_type="stream",
|
||||
form_data=event,
|
||||
extra_params=extra_params,
|
||||
@@ -2029,7 +2097,7 @@ async def process_chat_response(
|
||||
async for data in original_generator:
|
||||
data, _ = await process_filter_functions(
|
||||
request=request,
|
||||
filter_ids=filter_ids,
|
||||
filter_functions=filter_functions,
|
||||
filter_type="stream",
|
||||
form_data=data,
|
||||
extra_params=extra_params,
|
||||
|
||||
@@ -6,6 +6,7 @@ import logging
|
||||
from datetime import timedelta
|
||||
from pathlib import Path
|
||||
from typing import Callable, Optional
|
||||
import json
|
||||
|
||||
|
||||
import collections.abc
|
||||
@@ -450,3 +451,15 @@ def parse_ollama_modelfile(model_text):
|
||||
data["params"]["messages"] = messages
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def convert_logit_bias_input_to_json(user_input):
|
||||
logit_bias_pairs = user_input.split(",")
|
||||
logit_bias_json = {}
|
||||
for pair in logit_bias_pairs:
|
||||
token, bias = pair.split(":")
|
||||
token = str(token.strip())
|
||||
bias = int(bias.strip())
|
||||
bias = 100 if bias > 100 else -100 if bias < -100 else bias
|
||||
logit_bias_json[token] = bias
|
||||
return json.dumps(logit_bias_json)
|
||||
|
||||
@@ -234,7 +234,7 @@ class OAuthManager:
|
||||
log.warning(f"OAuth callback error: {e}")
|
||||
raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
|
||||
user_data: UserInfo = token.get("userinfo")
|
||||
if not user_data or "email" not in user_data:
|
||||
if not user_data or auth_manager_config.OAUTH_EMAIL_CLAIM not in user_data:
|
||||
user_data: UserInfo = await client.userinfo(token=token)
|
||||
if not user_data:
|
||||
log.warning(f"OAuth callback failed, user data is missing: {token}")
|
||||
|
||||
@@ -62,6 +62,7 @@ def apply_model_params_to_body_openai(params: dict, form_data: dict) -> dict:
|
||||
"reasoning_effort": str,
|
||||
"seed": lambda x: x,
|
||||
"stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x],
|
||||
"logit_bias": lambda x: x,
|
||||
}
|
||||
return apply_model_params_to_body(params, form_data, mappings)
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ class PDFGenerator:
|
||||
# When running using `pip install -e .` the static directory is in the site packages.
|
||||
# This path only works if `open-webui serve` is run from the root of this project.
|
||||
if not FONTS_DIR.exists():
|
||||
FONTS_DIR = Path("./backend/static/fonts")
|
||||
FONTS_DIR = Path(".") / "backend" / "static" / "fonts"
|
||||
|
||||
pdf.add_font("NotoSans", "", f"{FONTS_DIR}/NotoSans-Regular.ttf")
|
||||
pdf.add_font("NotoSans", "b", f"{FONTS_DIR}/NotoSans-Bold.ttf")
|
||||
|
||||
@@ -104,7 +104,7 @@ def replace_prompt_variable(template: str, prompt: str) -> str:
|
||||
|
||||
|
||||
def replace_messages_variable(
|
||||
template: str, messages: Optional[list[str]] = None
|
||||
template: str, messages: Optional[list[dict]] = None
|
||||
) -> str:
|
||||
def replacement_function(match):
|
||||
full_match = match.group(0)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fastapi==0.115.7
|
||||
uvicorn[standard]==0.30.6
|
||||
uvicorn[standard]==0.34.0
|
||||
pydantic==2.10.6
|
||||
python-multipart==0.0.18
|
||||
|
||||
@@ -13,14 +13,14 @@ async-timeout
|
||||
aiocache
|
||||
aiofiles
|
||||
|
||||
sqlalchemy==2.0.32
|
||||
sqlalchemy==2.0.38
|
||||
alembic==1.14.0
|
||||
peewee==3.17.8
|
||||
peewee==3.17.9
|
||||
peewee-migrate==1.12.2
|
||||
psycopg2-binary==2.9.9
|
||||
pgvector==0.3.5
|
||||
PyMySQL==1.1.1
|
||||
bcrypt==4.2.0
|
||||
bcrypt==4.3.0
|
||||
|
||||
pymongo
|
||||
redis
|
||||
@@ -40,8 +40,8 @@ anthropic
|
||||
google-generativeai==0.7.2
|
||||
tiktoken
|
||||
|
||||
langchain==0.3.7
|
||||
langchain-community==0.3.7
|
||||
langchain==0.3.19
|
||||
langchain-community==0.3.18
|
||||
|
||||
fake-useragent==1.5.1
|
||||
chromadb==0.6.2
|
||||
@@ -49,6 +49,8 @@ pymilvus==2.5.0
|
||||
qdrant-client~=1.12.0
|
||||
opensearch-py==2.8.0
|
||||
playwright==1.49.1 # Caution: version must match docker-compose.playwright.yaml
|
||||
elasticsearch==8.17.1
|
||||
|
||||
|
||||
transformers
|
||||
sentence-transformers==3.3.1
|
||||
@@ -85,7 +87,7 @@ faster-whisper==1.1.1
|
||||
PyJWT[crypto]==2.10.1
|
||||
authlib==1.4.1
|
||||
|
||||
black==24.8.0
|
||||
black==25.1.0
|
||||
langfuse==2.44.0
|
||||
youtube-transcript-api==0.6.3
|
||||
pytube==15.0.0
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<script>
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
let containerStatus = '';
|
||||
let error = '';
|
||||
|
||||
onMount(async () => {
|
||||
try {
|
||||
const response = await fetch('/api/container/status');
|
||||
const data = await response.json();
|
||||
containerStatus = data.status;
|
||||
} catch (err) {
|
||||
error = 'Failed to fetch container status';
|
||||
console.error(err);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="container-status">
|
||||
{#if error}
|
||||
<p class="error">{error}</p>
|
||||
{:else}
|
||||
<p>Container Status: {containerStatus}</p>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.container-status {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.error {
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,77 @@
|
||||
# OpenWebUI Container Management Plugin
|
||||
|
||||
This plugin adds container management capabilities to OpenWebUI, allowing you to monitor, update, and restart the container directly from the web interface.
|
||||
|
||||
## Features
|
||||
|
||||
- View container status and version
|
||||
- Update container to the latest version
|
||||
- Restart container when needed
|
||||
- User-friendly interface integrated into OpenWebUI settings
|
||||
|
||||
## Installation
|
||||
|
||||
### Installing in Docker-based OpenWebUI
|
||||
|
||||
1. If your OpenWebUI is running in Docker, mount the plugin directory into the container by adding this volume to your docker-compose.yml:
|
||||
```yaml
|
||||
services:
|
||||
openwebui:
|
||||
volumes:
|
||||
- ./custom:/app/custom # Mount the plugin directory
|
||||
```
|
||||
|
||||
2. Copy the `custom` directory to your OpenWebUI installation directory (where your docker-compose.yml is located)
|
||||
|
||||
3. Restart your OpenWebUI container:
|
||||
```bash
|
||||
docker-compose restart openwebui
|
||||
```
|
||||
|
||||
The plugin will be automatically detected and loaded by OpenWebUI when it starts.
|
||||
|
||||
### Dependencies
|
||||
|
||||
The plugin requires the following Python packages which are already included in the OpenWebUI Docker image:
|
||||
- fastapi
|
||||
- docker-py
|
||||
|
||||
## Usage
|
||||
|
||||
1. Navigate to the OpenWebUI settings page
|
||||
2. Look for the "Container Management" section
|
||||
3. You can:
|
||||
- View the current container status and version
|
||||
- Click "Update Container" to update to the latest version
|
||||
- Click "Restart Container" to restart the container
|
||||
|
||||
## API Endpoints
|
||||
|
||||
The plugin exposes the following API endpoints:
|
||||
|
||||
- `GET /api/container/status` - Get container status and version
|
||||
- `POST /api/container/update` - Update the container
|
||||
- `POST /api/container/restart` - Restart the container
|
||||
|
||||
## Development
|
||||
|
||||
To modify or extend the plugin:
|
||||
|
||||
1. Frontend components are in `custom/components/`
|
||||
2. Backend API routes are in `custom/api/`
|
||||
3. Container management logic is in `custom/container_manager.py`
|
||||
4. Plugin registration is handled in `custom/plugin.py`
|
||||
|
||||
### Development Workflow
|
||||
|
||||
1. Make changes to the plugin code
|
||||
2. The changes will be reflected immediately in the OpenWebUI container due to the volume mount
|
||||
3. If you modify Python files, you'll need to restart the OpenWebUI container:
|
||||
```bash
|
||||
docker-compose restart openwebui
|
||||
```
|
||||
4. Frontend changes (Svelte components) will be hot-reloaded automatically
|
||||
|
||||
## Contributing
|
||||
|
||||
Feel free to submit issues and pull requests to improve the plugin.
|
||||
@@ -0,0 +1,43 @@
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from typing import Dict
|
||||
from ..container_manager import ContainerManager
|
||||
|
||||
router = APIRouter()
|
||||
container_manager = ContainerManager()
|
||||
|
||||
@router.get("/status")
|
||||
async def get_container_status() -> Dict:
|
||||
"""Get the current status and version of the container."""
|
||||
try:
|
||||
status = container_manager.get_status()
|
||||
version = container_manager.get_version()
|
||||
return {
|
||||
"status": status,
|
||||
"version": version
|
||||
}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/update")
|
||||
async def update_container() -> Dict:
|
||||
"""Update the container to the latest version."""
|
||||
try:
|
||||
success = container_manager.update()
|
||||
return {
|
||||
"success": success,
|
||||
"message": "Container updated successfully" if success else "Update failed"
|
||||
}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/restart")
|
||||
async def restart_container() -> Dict:
|
||||
"""Restart the container."""
|
||||
try:
|
||||
success = container_manager.restart()
|
||||
return {
|
||||
"success": success,
|
||||
"message": "Container restarted successfully" if success else "Restart failed"
|
||||
}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
@@ -0,0 +1,121 @@
|
||||
{/* ContainerSettings.svelte */}
|
||||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
import { Button } from '$lib/components/ui/button';
|
||||
import { Input } from '$lib/components/ui/input';
|
||||
import { Label } from '$lib/components/ui/label';
|
||||
import { Card } from '$lib/components/ui/card';
|
||||
import { toast } from '$lib/components/ui/toaster';
|
||||
|
||||
let containerStatus = '';
|
||||
let containerVersion = '';
|
||||
let isUpdating = false;
|
||||
let isRestarting = false;
|
||||
|
||||
async function fetchContainerStatus() {
|
||||
try {
|
||||
const response = await fetch('/api/container/status');
|
||||
const data = await response.json();
|
||||
containerStatus = data.status;
|
||||
containerVersion = data.version;
|
||||
} catch (error) {
|
||||
toast({
|
||||
title: 'Error',
|
||||
description: 'Failed to fetch container status',
|
||||
variant: 'destructive'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function handleUpdate() {
|
||||
isUpdating = true;
|
||||
try {
|
||||
const response = await fetch('/api/container/update', {
|
||||
method: 'POST'
|
||||
});
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
toast({
|
||||
title: 'Success',
|
||||
description: 'Container updated successfully'
|
||||
});
|
||||
await fetchContainerStatus();
|
||||
} else {
|
||||
throw new Error(data.message);
|
||||
}
|
||||
} catch (error) {
|
||||
toast({
|
||||
title: 'Error',
|
||||
description: 'Failed to update container',
|
||||
variant: 'destructive'
|
||||
});
|
||||
} finally {
|
||||
isUpdating = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function handleRestart() {
|
||||
isRestarting = true;
|
||||
try {
|
||||
const response = await fetch('/api/container/restart', {
|
||||
method: 'POST'
|
||||
});
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
toast({
|
||||
title: 'Success',
|
||||
description: 'Container restarted successfully'
|
||||
});
|
||||
await fetchContainerStatus();
|
||||
} else {
|
||||
throw new Error(data.message);
|
||||
}
|
||||
} catch (error) {
|
||||
toast({
|
||||
title: 'Error',
|
||||
description: 'Failed to restart container',
|
||||
variant: 'destructive'
|
||||
});
|
||||
} finally {
|
||||
isRestarting = false;
|
||||
}
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
fetchContainerStatus();
|
||||
});
|
||||
</script>
|
||||
|
||||
<Card class="p-6">
|
||||
<h2 class="text-2xl font-bold mb-4">Container Management</h2>
|
||||
|
||||
<div class="space-y-4">
|
||||
<div class="flex flex-col gap-2">
|
||||
<Label>Status</Label>
|
||||
<Input value={containerStatus} readonly />
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2">
|
||||
<Label>Version</Label>
|
||||
<Input value={containerVersion} readonly />
|
||||
</div>
|
||||
|
||||
<div class="flex gap-4 mt-4">
|
||||
<Button
|
||||
variant="primary"
|
||||
disabled={isUpdating}
|
||||
on:click={handleUpdate}
|
||||
>
|
||||
{isUpdating ? 'Updating...' : 'Update Container'}
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
variant="secondary"
|
||||
disabled={isRestarting}
|
||||
on:click={handleRestart}
|
||||
>
|
||||
{isRestarting ? 'Restarting...' : 'Restart Container'}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
@@ -0,0 +1,228 @@
|
||||
"""
|
||||
type: action
|
||||
name: Container Manager
|
||||
description: Manage chat.Sami container updates
|
||||
version: 1.0.0
|
||||
author: chat.Sami
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
import requests
|
||||
from typing import Dict, Any
|
||||
|
||||
class Action:
|
||||
def __init__(self):
|
||||
self.actions = [
|
||||
{
|
||||
"id": "update_container",
|
||||
"name": "Update Container",
|
||||
"description": "Update chat.Sami to the latest version"
|
||||
},
|
||||
{
|
||||
"id": "container_status",
|
||||
"name": "Container Status",
|
||||
"description": "Get current container status and version"
|
||||
},
|
||||
{
|
||||
"id": "check_updates",
|
||||
"name": "Check Updates",
|
||||
"description": "Check for available updates"
|
||||
}
|
||||
]
|
||||
|
||||
def execute(self, action_id: str, params: Dict[str, Any] = None) -> Dict[str, Any]:
|
||||
if action_id == "update_container":
|
||||
return self._update_container()
|
||||
elif action_id == "container_status":
|
||||
return self._get_container_status()
|
||||
elif action_id == "check_updates":
|
||||
return self._check_updates()
|
||||
else:
|
||||
raise ValueError(f"Unknown action: {action_id}")
|
||||
|
||||
def _get_container_config(self) -> Dict[str, Any]:
|
||||
"""Get current container configuration"""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["docker", "inspect", "chat-sami"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True
|
||||
)
|
||||
container_info = json.loads(result.stdout)[0]
|
||||
|
||||
# Extract current configuration
|
||||
config = {
|
||||
"port": None,
|
||||
"volumes": [],
|
||||
"env": {}
|
||||
}
|
||||
|
||||
# Get port mapping
|
||||
ports = container_info["HostConfig"]["PortBindings"]
|
||||
if "8080/tcp" in ports:
|
||||
port_info = ports["8080/tcp"][0]
|
||||
config["port"] = port_info["HostPort"]
|
||||
|
||||
# Get volume mappings
|
||||
mounts = container_info["HostConfig"]["Mounts"]
|
||||
for mount in mounts:
|
||||
config["volumes"].append({
|
||||
"source": mount["Source"],
|
||||
"target": mount["Target"]
|
||||
})
|
||||
|
||||
# Get environment variables
|
||||
env_list = container_info["Config"]["Env"]
|
||||
for env in env_list:
|
||||
if "=" in env:
|
||||
key, value = env.split("=", 1)
|
||||
config["env"][key] = value
|
||||
|
||||
return config
|
||||
except Exception as e:
|
||||
return None
|
||||
|
||||
def _get_current_version(self) -> str:
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["docker", "inspect", "chat-sami"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True
|
||||
)
|
||||
container_info = json.loads(result.stdout)[0]
|
||||
image_tag = container_info["Config"]["Image"].split(":")[-1]
|
||||
return image_tag
|
||||
except:
|
||||
return "unknown"
|
||||
|
||||
def _get_latest_version(self) -> str:
|
||||
try:
|
||||
response = requests.get(
|
||||
"https://api.github.com/repos/open-webui/open-webui/releases/latest",
|
||||
timeout=5
|
||||
)
|
||||
if response.status_code == 200:
|
||||
return response.json()["tag_name"].lstrip('v')
|
||||
return "unknown"
|
||||
except:
|
||||
return "unknown"
|
||||
|
||||
def _check_updates(self) -> Dict[str, Any]:
|
||||
current = self._get_current_version()
|
||||
latest = self._get_latest_version()
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": {
|
||||
"current_version": current,
|
||||
"latest_version": latest,
|
||||
"update_available": latest != "unknown" and current != latest
|
||||
}
|
||||
}
|
||||
|
||||
def _update_container(self) -> Dict[str, Any]:
|
||||
try:
|
||||
# Get current container configuration
|
||||
config = self._get_container_config()
|
||||
if not config:
|
||||
raise Exception("Failed to get current container configuration")
|
||||
|
||||
# Pull the latest image
|
||||
subprocess.run(
|
||||
["docker", "pull", "ghcr.io/open-webui/open-webui:main"],
|
||||
check=True,
|
||||
capture_output=True
|
||||
)
|
||||
|
||||
# Stop the current container
|
||||
subprocess.run(
|
||||
["docker", "stop", "chat-sami"],
|
||||
check=True,
|
||||
capture_output=True
|
||||
)
|
||||
|
||||
# Remove the old container but keep the volumes
|
||||
subprocess.run(
|
||||
["docker", "rm", "chat-sami"],
|
||||
check=True,
|
||||
capture_output=True
|
||||
)
|
||||
|
||||
# Create new container with same configuration
|
||||
cmd = ["docker", "run", "-d", "--name", "chat-sami"]
|
||||
|
||||
# Add port mapping
|
||||
if config["port"]:
|
||||
cmd.extend(["-p", f"{config['port']}:8080"])
|
||||
|
||||
# Add volume mappings
|
||||
for volume in config["volumes"]:
|
||||
cmd.extend(["-v", f"{volume['source']}:{volume['target']}"])
|
||||
|
||||
# Add environment variables
|
||||
for key, value in config["env"].items():
|
||||
cmd.extend(["-e", f"{key}={value}"])
|
||||
|
||||
# Add image name
|
||||
cmd.append("ghcr.io/open-webui/open-webui:main")
|
||||
|
||||
# Run the new container
|
||||
subprocess.run(cmd, check=True, capture_output=True)
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"message": "Updated to latest version. The page will refresh in a few moments."
|
||||
}
|
||||
except subprocess.CalledProcessError as e:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"Update failed: {e.stderr.decode() if e.stderr else str(e)}"
|
||||
}
|
||||
except Exception as e:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"Error during update: {str(e)}"
|
||||
}
|
||||
|
||||
def _get_container_status(self) -> Dict[str, Any]:
|
||||
try:
|
||||
# Get container info
|
||||
result = subprocess.run(
|
||||
["docker", "inspect", "chat-sami"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True
|
||||
)
|
||||
container_info = json.loads(result.stdout)[0]
|
||||
|
||||
# Get update status
|
||||
update_info = self._check_updates()
|
||||
current_version = update_info["data"]["current_version"]
|
||||
latest_version = update_info["data"]["latest_version"]
|
||||
update_available = update_info["data"]["update_available"]
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"data": {
|
||||
"status": container_info["State"]["Status"],
|
||||
"health": container_info["State"]["Health"]["Status"] if "Health" in container_info["State"] else "N/A",
|
||||
"current_version": current_version,
|
||||
"latest_version": latest_version,
|
||||
"update_available": update_available,
|
||||
"created": container_info["Created"]
|
||||
}
|
||||
}
|
||||
except subprocess.CalledProcessError as e:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"Failed to get container status: {e.stderr.decode() if e.stderr else str(e)}"
|
||||
}
|
||||
except Exception as e:
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"Error: {str(e)}"
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
"""
|
||||
type: settings
|
||||
name: Container Settings
|
||||
description: Manage chat.Sami container settings
|
||||
version: 1.0.0
|
||||
author: chat.Sami
|
||||
"""
|
||||
|
||||
from typing import Dict, Any
|
||||
import json
|
||||
from fastapi import APIRouter
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
class ContainerSettings(BaseModel):
|
||||
"""Container management settings."""
|
||||
enabled: bool = True
|
||||
|
||||
@router.get("/settings/container")
|
||||
async def get_container_settings() -> Dict[str, Any]:
|
||||
"""Get container management settings."""
|
||||
return {
|
||||
"id": "container",
|
||||
"title": "Container Management",
|
||||
"description": "Manage the chat.Sami container",
|
||||
"component": "ContainerStatus",
|
||||
"settings": ContainerSettings().dict()
|
||||
}
|
||||
|
||||
class Settings:
|
||||
def __init__(self):
|
||||
self.settings = {
|
||||
"container": {
|
||||
"title": "Container Management",
|
||||
"description": "Manage your chat.Sami container",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"status": {
|
||||
"type": "custom",
|
||||
"component": "ContainerStatus",
|
||||
"action": "container_status",
|
||||
"refresh_interval": 30, # Refresh every 30 seconds
|
||||
"title": "Container Status"
|
||||
},
|
||||
"update": {
|
||||
"type": "button",
|
||||
"title": "Update Container",
|
||||
"description": "Update chat.Sami to the latest version",
|
||||
"action": "update_container",
|
||||
"buttonText": "Update Now",
|
||||
"confirmText": "Are you sure you want to update the container? The service will restart briefly."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def get_settings(self) -> Dict[str, Any]:
|
||||
return self.settings
|
||||
|
||||
def update_settings(self, settings: Dict[str, Any]) -> Dict[str, Any]:
|
||||
# This is a read-only settings panel
|
||||
return {
|
||||
"success": True,
|
||||
"message": "Settings updated"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
export async function executeAction<T>(actionId: string, params?: Record<string, unknown>): Promise<T> {
|
||||
// This is a mock implementation for testing
|
||||
const mockResponses = {
|
||||
container_status: {
|
||||
success: true,
|
||||
data: {
|
||||
status: "running",
|
||||
health: "healthy",
|
||||
current_version: "1.0.0",
|
||||
latest_version: "1.1.0",
|
||||
update_available: true,
|
||||
created: new Date().toISOString()
|
||||
}
|
||||
},
|
||||
update_container: {
|
||||
success: true,
|
||||
message: "Update initiated"
|
||||
}
|
||||
};
|
||||
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve(mockResponses[actionId as keyof typeof mockResponses] as T);
|
||||
}, 500);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
from fastapi import FastAPI
|
||||
from .api.container_routes import router as container_router
|
||||
|
||||
def register_plugin(app: FastAPI) -> None:
|
||||
"""Register the container management plugin with OpenWebUI."""
|
||||
# Register API routes
|
||||
app.include_router(
|
||||
container_router,
|
||||
prefix="/api/container",
|
||||
tags=["container"]
|
||||
)
|
||||
|
||||
# Register frontend components
|
||||
app.state.plugin_components = app.state.plugin_components or {}
|
||||
app.state.plugin_components["container_settings"] = {
|
||||
"name": "ContainerSettings",
|
||||
"path": "custom/components/ContainerSettings.svelte",
|
||||
"settings": {
|
||||
"title": "Container Management",
|
||||
"icon": "container",
|
||||
"description": "Manage container updates and status"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
export interface ContainerStatus {
|
||||
status: string;
|
||||
health: string;
|
||||
current_version: string;
|
||||
latest_version: string;
|
||||
update_available: boolean;
|
||||
created: string;
|
||||
}
|
||||
|
||||
export interface ContainerResponse {
|
||||
success: boolean;
|
||||
data?: ContainerStatus;
|
||||
message?: string;
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.5.17",
|
||||
"version": "0.5.20",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "open-webui",
|
||||
"version": "0.5.17",
|
||||
"version": "0.5.20",
|
||||
"dependencies": {
|
||||
"@azure/msal-browser": "^4.5.0",
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
"@codemirror/language-data": "^6.5.1",
|
||||
@@ -41,6 +42,7 @@
|
||||
"i18next-resources-to-backend": "^1.2.0",
|
||||
"idb": "^7.1.1",
|
||||
"js-sha256": "^0.10.1",
|
||||
"jspdf": "^3.0.0",
|
||||
"katex": "^0.16.21",
|
||||
"kokoro-js": "^1.1.1",
|
||||
"marked": "^9.1.0",
|
||||
@@ -134,10 +136,32 @@
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@azure/msal-browser": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.5.0.tgz",
|
||||
"integrity": "sha512-H7mWmu8yI0n0XxhJobrgncXI6IU5h8DKMiWDHL5y+Dc58cdg26GbmaMUehbUkdKAQV2OTiFa4FUa6Fdu/wIxBg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@azure/msal-common": "15.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@azure/msal-common": {
|
||||
"version": "15.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.2.0.tgz",
|
||||
"integrity": "sha512-HiYfGAKthisUYqHG1nImCf/uzcyS31wng3o+CycWLIM9chnYJ9Lk6jZ30Y6YiYYpTQ9+z/FGUpiKKekd3Arc0A==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.24.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz",
|
||||
"integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==",
|
||||
"version": "7.26.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
|
||||
"integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
@@ -3170,6 +3194,13 @@
|
||||
"integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/raf": {
|
||||
"version": "3.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz",
|
||||
"integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@types/resolve": {
|
||||
"version": "1.20.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
|
||||
@@ -3199,6 +3230,13 @@
|
||||
"integrity": "sha512-MQ1AnmTLOncwEf9IVU+B2e4Hchrku5N67NkgcAHW0p3sdzPe0FNMANxEm6OJUzPniEQGkeT3OROLlCwZJLWFZA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/trusted-types": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
|
||||
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@types/unist": {
|
||||
"version": "2.0.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
|
||||
@@ -3794,6 +3832,18 @@
|
||||
"node": ">= 4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/atob": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
|
||||
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
|
||||
"license": "(MIT OR Apache-2.0)",
|
||||
"bin": {
|
||||
"atob": "bin/atob.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 4.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/aws-sign2": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||
@@ -3829,6 +3879,16 @@
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/base64-arraybuffer": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
|
||||
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">= 0.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
@@ -4033,6 +4093,18 @@
|
||||
"node": "10.* || >= 12.*"
|
||||
}
|
||||
},
|
||||
"node_modules/btoa": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
|
||||
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
|
||||
"license": "(MIT OR Apache-2.0)",
|
||||
"bin": {
|
||||
"btoa": "bin/btoa.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer": {
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
|
||||
@@ -4131,6 +4203,33 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/canvg": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz",
|
||||
"integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@types/raf": "^3.4.0",
|
||||
"core-js": "^3.8.3",
|
||||
"raf": "^3.4.1",
|
||||
"regenerator-runtime": "^0.13.7",
|
||||
"rgbcolor": "^1.0.1",
|
||||
"stackblur-canvas": "^2.0.0",
|
||||
"svg-pathdata": "^6.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/canvg/node_modules/regenerator-runtime": {
|
||||
"version": "0.13.11",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
|
||||
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/caseless": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
@@ -4599,6 +4698,18 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/core-js": {
|
||||
"version": "3.40.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz",
|
||||
"integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/core-js"
|
||||
}
|
||||
},
|
||||
"node_modules/core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
@@ -4643,6 +4754,16 @@
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/css-line-break": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
|
||||
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"utrie": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/css-select": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
|
||||
@@ -6106,6 +6227,12 @@
|
||||
"pend": "~1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fflate": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
|
||||
"integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/figures": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
|
||||
@@ -6701,6 +6828,20 @@
|
||||
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz",
|
||||
"integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="
|
||||
},
|
||||
"node_modules/html2canvas": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
|
||||
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"css-line-break": "^2.1.0",
|
||||
"text-segmentation": "^1.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/htmlparser2": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
|
||||
@@ -7213,6 +7354,34 @@
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/jspdf": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.0.tgz",
|
||||
"integrity": "sha512-QvuQZvOI8CjfjVgtajdL0ihrDYif1cN5gXiF9lb9Pd9JOpmocvnNyFO9sdiJ/8RA5Bu8zyGOUjJLj5kiku16ug==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.26.0",
|
||||
"atob": "^2.1.2",
|
||||
"btoa": "^1.2.1",
|
||||
"fflate": "^0.8.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"canvg": "^3.0.6",
|
||||
"core-js": "^3.6.0",
|
||||
"dompurify": "^3.2.4",
|
||||
"html2canvas": "^1.0.0-rc.5"
|
||||
}
|
||||
},
|
||||
"node_modules/jspdf/node_modules/dompurify": {
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz",
|
||||
"integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
|
||||
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||
"optional": true,
|
||||
"optionalDependencies": {
|
||||
"@types/trusted-types": "^2.0.7"
|
||||
}
|
||||
},
|
||||
"node_modules/jsprim": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
|
||||
@@ -9029,7 +9198,7 @@
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
||||
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
|
||||
"dev": true
|
||||
"devOptional": true
|
||||
},
|
||||
"node_modules/periscopic": {
|
||||
"version": "3.1.0",
|
||||
@@ -9755,6 +9924,16 @@
|
||||
"rimraf": "bin.js"
|
||||
}
|
||||
},
|
||||
"node_modules/raf": {
|
||||
"version": "3.4.1",
|
||||
"resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
|
||||
"integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"performance-now": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-is": {
|
||||
"version": "18.3.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
|
||||
@@ -9894,6 +10073,16 @@
|
||||
"integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/rgbcolor": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
|
||||
"integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
|
||||
"license": "MIT OR SEE LICENSE IN FEEL-FREE.md",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">= 0.8.15"
|
||||
}
|
||||
},
|
||||
"node_modules/rimraf": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
||||
@@ -10785,6 +10974,16 @@
|
||||
"integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/stackblur-canvas": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
|
||||
"integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.1.14"
|
||||
}
|
||||
},
|
||||
"node_modules/std-env": {
|
||||
"version": "3.7.0",
|
||||
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
|
||||
@@ -11166,6 +11365,16 @@
|
||||
"@types/estree": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/svg-pathdata": {
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
|
||||
"integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/symlink-or-copy": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz",
|
||||
@@ -11258,6 +11467,16 @@
|
||||
"streamx": "^2.12.5"
|
||||
}
|
||||
},
|
||||
"node_modules/text-segmentation": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
|
||||
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"utrie": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/text-table": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
||||
@@ -11597,6 +11816,16 @@
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/utrie": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
|
||||
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"base64-arraybuffer": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "9.0.1",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.5.17",
|
||||
"version": "0.5.20",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||
@@ -51,6 +51,7 @@
|
||||
},
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@azure/msal-browser": "^4.5.0",
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
"@codemirror/language-data": "^6.5.1",
|
||||
@@ -84,6 +85,7 @@
|
||||
"i18next-resources-to-backend": "^1.2.0",
|
||||
"idb": "^7.1.1",
|
||||
"js-sha256": "^0.10.1",
|
||||
"jspdf": "^3.0.0",
|
||||
"katex": "^0.16.21",
|
||||
"kokoro-js": "^1.1.1",
|
||||
"marked": "^9.1.0",
|
||||
|
||||
@@ -7,7 +7,7 @@ authors = [
|
||||
license = { file = "LICENSE" }
|
||||
dependencies = [
|
||||
"fastapi==0.115.7",
|
||||
"uvicorn[standard]==0.30.6",
|
||||
"uvicorn[standard]==0.34.0",
|
||||
"pydantic==2.10.6",
|
||||
"python-multipart==0.0.18",
|
||||
|
||||
@@ -21,14 +21,14 @@ dependencies = [
|
||||
"aiocache",
|
||||
"aiofiles",
|
||||
|
||||
"sqlalchemy==2.0.32",
|
||||
"sqlalchemy==2.0.38",
|
||||
"alembic==1.14.0",
|
||||
"peewee==3.17.8",
|
||||
"peewee==3.17.9",
|
||||
"peewee-migrate==1.12.2",
|
||||
"psycopg2-binary==2.9.9",
|
||||
"pgvector==0.3.5",
|
||||
"PyMySQL==1.1.1",
|
||||
"bcrypt==4.2.0",
|
||||
"bcrypt==4.3.0",
|
||||
|
||||
"pymongo",
|
||||
"redis",
|
||||
@@ -48,8 +48,8 @@ dependencies = [
|
||||
"google-generativeai==0.7.2",
|
||||
"tiktoken",
|
||||
|
||||
"langchain==0.3.7",
|
||||
"langchain-community==0.3.7",
|
||||
"langchain==0.3.19",
|
||||
"langchain-community==0.3.18",
|
||||
|
||||
"fake-useragent==1.5.1",
|
||||
"chromadb==0.6.2",
|
||||
@@ -57,6 +57,7 @@ dependencies = [
|
||||
"qdrant-client~=1.12.0",
|
||||
"opensearch-py==2.8.0",
|
||||
"playwright==1.49.1",
|
||||
"elasticsearch==8.17.1",
|
||||
|
||||
"transformers",
|
||||
"sentence-transformers==3.3.1",
|
||||
@@ -92,7 +93,7 @@ dependencies = [
|
||||
"PyJWT[crypto]==2.10.1",
|
||||
"authlib==1.4.1",
|
||||
|
||||
"black==24.8.0",
|
||||
"black==25.1.0",
|
||||
"langfuse==2.44.0",
|
||||
"youtube-transcript-api==0.6.3",
|
||||
"pytube==15.0.0",
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" href="/static/favicon.png" />
|
||||
<link rel="icon" type="image/png" href="/static/favicon-96x96.png" sizes="96x96" />
|
||||
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/static/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png" />
|
||||
<meta name="apple-mobile-web-app-title" content="Open WebUI" />
|
||||
<link rel="manifest" href="/favicon/site.webmanifest" />
|
||||
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"
|
||||
@@ -74,6 +76,28 @@
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function setSplashImage() {
|
||||
const logo = document.getElementById('logo');
|
||||
const isDarkMode = document.documentElement.classList.contains('dark');
|
||||
|
||||
if (isDarkMode) {
|
||||
const darkImage = new Image();
|
||||
darkImage.src = '/static/splash-dark.png';
|
||||
|
||||
darkImage.onload = () => {
|
||||
logo.src = '/static/splash-dark.png';
|
||||
logo.style.filter = ''; // Ensure no inversion is applied if splash-dark.png exists
|
||||
};
|
||||
|
||||
darkImage.onerror = () => {
|
||||
logo.style.filter = 'invert(1)'; // Invert image if splash-dark.png is missing
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Runs after classes are assigned
|
||||
window.onload = setSplashImage;
|
||||
})();
|
||||
</script>
|
||||
|
||||
@@ -176,10 +200,6 @@
|
||||
background: #000;
|
||||
}
|
||||
|
||||
html.dark #splash-screen img {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
html.her #splash-screen {
|
||||
background: #983724;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script>
|
||||
import { getContext } from 'svelte';
|
||||
import { getContext, onMount } from 'svelte';
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||
@@ -10,6 +10,32 @@
|
||||
|
||||
export let show = true;
|
||||
export let getStartedHandler = () => {};
|
||||
|
||||
function setLogoImage() {
|
||||
const logo = document.getElementById('logo');
|
||||
|
||||
if (logo) {
|
||||
const isDarkMode = document.documentElement.classList.contains('dark');
|
||||
|
||||
if (isDarkMode) {
|
||||
const darkImage = new Image();
|
||||
darkImage.src = '/static/favicon-dark.png';
|
||||
|
||||
darkImage.onload = () => {
|
||||
logo.src = '/static/favicon-dark.png';
|
||||
logo.style.filter = ''; // Ensure no inversion is applied if splash-dark.png exists
|
||||
};
|
||||
|
||||
darkImage.onerror = () => {
|
||||
logo.style.filter = 'invert(1)'; // Invert image if splash-dark.png is missing
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$: if (show) {
|
||||
setLogoImage();
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if show}
|
||||
@@ -18,6 +44,7 @@
|
||||
<div class="flex space-x-2">
|
||||
<div class=" self-center">
|
||||
<img
|
||||
id="logo"
|
||||
crossorigin="anonymous"
|
||||
src="{WEBUI_BASE_URL}/static/favicon.png"
|
||||
class=" w-6 rounded-full"
|
||||
|
||||
@@ -45,6 +45,16 @@
|
||||
|
||||
<hr class=" border-gray-100 dark:border-gray-850 my-2" />
|
||||
|
||||
<div class="mb-2.5">
|
||||
<div class=" flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Enable Code Execution')}
|
||||
</div>
|
||||
|
||||
<Switch bind:state={config.ENABLE_CODE_EXECUTION} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-2.5">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Code Execution Engine')}</div>
|
||||
|
||||
@@ -274,6 +274,7 @@
|
||||
newConfig[newIdx] = OPENAI_API_CONFIGS[newIdx < idx ? newIdx : newIdx + 1];
|
||||
});
|
||||
OPENAI_API_CONFIGS = newConfig;
|
||||
updateOpenAIHandler();
|
||||
}}
|
||||
/>
|
||||
{/each}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<script lang="ts">
|
||||
import DOMPurify from 'dompurify';
|
||||
|
||||
import { getBackendConfig, getVersionUpdates, getWebhookUrl, updateWebhookUrl } from '$lib/apis';
|
||||
import {
|
||||
getAdminConfig,
|
||||
@@ -220,15 +222,44 @@
|
||||
<div class="">
|
||||
{$i18n.t('License')}
|
||||
</div>
|
||||
<a
|
||||
class=" text-xs text-gray-500 hover:underline"
|
||||
href="https://docs.openwebui.com/enterprise"
|
||||
target="_blank"
|
||||
>
|
||||
{$i18n.t(
|
||||
'Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.'
|
||||
)}
|
||||
</a>
|
||||
|
||||
{#if $config?.license_metadata}
|
||||
<a
|
||||
href="https://docs.openwebui.com/enterprise"
|
||||
target="_blank"
|
||||
class="text-gray-500 mt-0.5"
|
||||
>
|
||||
<span class=" capitalize text-black dark:text-white"
|
||||
>{$config?.license_metadata?.type}
|
||||
license</span
|
||||
>
|
||||
registered to
|
||||
<span class=" capitalize text-black dark:text-white"
|
||||
>{$config?.license_metadata?.organization_name}</span
|
||||
>
|
||||
for
|
||||
<span class=" font-medium text-black dark:text-white"
|
||||
>{$config?.license_metadata?.seats ?? 'Unlimited'} users.</span
|
||||
>
|
||||
</a>
|
||||
{#if $config?.license_metadata?.html}
|
||||
<div class="mt-0.5">
|
||||
{@html DOMPurify.sanitize($config?.license_metadata?.html)}
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<a
|
||||
class=" text-xs hover:underline"
|
||||
href="https://docs.openwebui.com/enterprise"
|
||||
target="_blank"
|
||||
>
|
||||
<span class="text-gray-500">
|
||||
{$i18n.t(
|
||||
'Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.'
|
||||
)}
|
||||
</span>
|
||||
</a>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- <button
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
'tavily',
|
||||
'jina',
|
||||
'bing',
|
||||
'exa'
|
||||
'exa',
|
||||
'perplexity'
|
||||
];
|
||||
|
||||
let youtubeLanguage = 'en';
|
||||
@@ -361,6 +362,17 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'perplexity'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Perplexity API Key')}
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
placeholder={$i18n.t('Enter Perplexity API Key')}
|
||||
bind:value={webConfig.search.perplexity_api_key}
|
||||
/>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'bing'}
|
||||
<div class="mb-2.5 flex w-full flex-col">
|
||||
<div>
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
|
||||
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
|
||||
import About from '$lib/components/chat/Settings/About.svelte';
|
||||
import Banner from '$lib/components/common/Banner.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -124,12 +125,43 @@
|
||||
/>
|
||||
<UserChatsModal bind:show={showUserChatsModal} user={selectedUser} />
|
||||
|
||||
{#if ($config?.license_metadata?.seats ?? null) !== null && users.length > $config?.license_metadata?.seats}
|
||||
<div class=" mt-1 mb-2 text-xs text-red-500">
|
||||
<Banner
|
||||
className="mx-0"
|
||||
banner={{
|
||||
type: 'error',
|
||||
title: 'License Error',
|
||||
content:
|
||||
'Exceeded the number of seats in your license. Please contact support to increase the number of seats.',
|
||||
dismissable: true
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="mt-0.5 mb-2 gap-1 flex flex-col md:flex-row justify-between">
|
||||
<div class="flex md:self-center text-lg font-medium px-0.5">
|
||||
{$i18n.t('Users')}
|
||||
<div class="flex-shrink-0">
|
||||
{$i18n.t('Users')}
|
||||
</div>
|
||||
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" />
|
||||
|
||||
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
|
||||
{#if ($config?.license_metadata?.seats ?? null) !== null}
|
||||
{#if users.length > $config?.license_metadata?.seats}
|
||||
<span class="text-lg font-medium text-red-500"
|
||||
>{users.length} of {$config?.license_metadata?.seats}
|
||||
<span class="text-sm font-normal">available users</span></span
|
||||
>
|
||||
{:else}
|
||||
<span class="text-lg font-medium text-gray-500 dark:text-gray-300"
|
||||
>{users.length} of {$config?.license_metadata?.seats}
|
||||
<span class="text-sm font-normal">available users</span></span
|
||||
>
|
||||
{/if}
|
||||
{:else}
|
||||
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex gap-1">
|
||||
|
||||
@@ -123,8 +123,6 @@
|
||||
if (contents.length === 0) {
|
||||
showControls.set(false);
|
||||
showArtifacts.set(false);
|
||||
|
||||
toast.error($i18n.t('No HTML, CSS, or JavaScript content found.'));
|
||||
}
|
||||
|
||||
selectedContentIdx = contents ? contents.length - 1 : 0;
|
||||
|
||||
@@ -1937,9 +1937,33 @@
|
||||
|
||||
<PaneGroup direction="horizontal" class="w-full h-full">
|
||||
<Pane defaultSize={50} class="h-full flex w-full relative">
|
||||
{#if $banners.length > 0 && !history.currentId && !$chatId && selectedModels.length <= 1}
|
||||
{#if !history.currentId && !$chatId && selectedModels.length <= 1 && ($banners.length > 0 || ($config?.license_metadata?.type ?? null) === 'trial' || (($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats))}
|
||||
<div class="absolute top-12 left-0 right-0 w-full z-30">
|
||||
<div class=" flex flex-col gap-1 w-full">
|
||||
{#if ($config?.license_metadata?.type ?? null) === 'trial'}
|
||||
<Banner
|
||||
banner={{
|
||||
type: 'info',
|
||||
title: 'Trial License',
|
||||
content: $i18n.t(
|
||||
'You are currently using a trial license. Please contact support to upgrade your license.'
|
||||
)
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
|
||||
{#if ($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats}
|
||||
<Banner
|
||||
banner={{
|
||||
type: 'error',
|
||||
title: 'License Error',
|
||||
content: $i18n.t(
|
||||
'Exceeded the number of seats in your license. Please contact support to increase the number of seats.'
|
||||
)
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
|
||||
{#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner}
|
||||
<Banner
|
||||
{banner}
|
||||
|
||||
@@ -121,7 +121,8 @@
|
||||
toast.error('Model not selected');
|
||||
return;
|
||||
}
|
||||
prompt = `Explain this section to me in more detail\n\n\`\`\`\n${selectedText}\n\`\`\``;
|
||||
const explainText = $i18n.t('Explain this section to me in more detail');
|
||||
prompt = `${explainText}\n\n\`\`\`\n${selectedText}\n\`\`\``;
|
||||
|
||||
responseContent = '';
|
||||
const [res, controller] = await chatCompletion(localStorage.token, {
|
||||
@@ -246,7 +247,7 @@
|
||||
>
|
||||
<ChatBubble className="size-3 shrink-0" />
|
||||
|
||||
<div class="shrink-0">Ask</div>
|
||||
<div class="shrink-0">{$i18n.t('Ask')}</div>
|
||||
</button>
|
||||
<button
|
||||
class="px-1 hover:bg-gray-50 dark:hover:bg-gray-800 rounded-sm flex items-center gap-1 min-w-fit"
|
||||
@@ -257,7 +258,7 @@
|
||||
>
|
||||
<LightBlub className="size-3 shrink-0" />
|
||||
|
||||
<div class="shrink-0">Explain</div>
|
||||
<div class="shrink-0">{$i18n.t('Explain')}</div>
|
||||
</button>
|
||||
</div>
|
||||
{:else}
|
||||
|
||||
@@ -85,6 +85,8 @@
|
||||
let loaded = false;
|
||||
let recording = false;
|
||||
|
||||
let isComposing = false;
|
||||
|
||||
let chatInputContainerElement;
|
||||
let chatInputElement;
|
||||
|
||||
@@ -676,12 +678,13 @@
|
||||
bind:value={prompt}
|
||||
id="chat-input"
|
||||
messageInput={true}
|
||||
shiftEnter={!$mobile ||
|
||||
!(
|
||||
'ontouchstart' in window ||
|
||||
navigator.maxTouchPoints > 0 ||
|
||||
navigator.msMaxTouchPoints > 0
|
||||
)}
|
||||
shiftEnter={!($settings?.ctrlEnterToSend ?? false) &&
|
||||
(!$mobile ||
|
||||
!(
|
||||
'ontouchstart' in window ||
|
||||
navigator.maxTouchPoints > 0 ||
|
||||
navigator.msMaxTouchPoints > 0
|
||||
))}
|
||||
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
|
||||
largeTextAsFile={$settings?.largeTextAsFile ?? false}
|
||||
autocomplete={$config?.features.enable_autocomplete_generation}
|
||||
@@ -706,6 +709,8 @@
|
||||
console.log(res);
|
||||
return res;
|
||||
}}
|
||||
oncompositionstart={() => (isComposing = true)}
|
||||
oncompositionend={() => (isComposing = false)}
|
||||
on:keydown={async (e) => {
|
||||
e = e.detail.event;
|
||||
|
||||
@@ -805,19 +810,24 @@
|
||||
navigator.msMaxTouchPoints > 0
|
||||
)
|
||||
) {
|
||||
// Prevent Enter key from creating a new line
|
||||
// Uses keyCode '13' for Enter key for chinese/japanese keyboards
|
||||
if (e.keyCode === 13 && !e.shiftKey) {
|
||||
e.preventDefault();
|
||||
if (isComposing) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Submit the prompt when Enter key is pressed
|
||||
if (
|
||||
(prompt !== '' || files.length > 0) &&
|
||||
e.keyCode === 13 &&
|
||||
!e.shiftKey
|
||||
) {
|
||||
dispatch('submit', prompt);
|
||||
// Uses keyCode '13' for Enter key for chinese/japanese keyboards.
|
||||
//
|
||||
// Depending on the user's settings, it will send the message
|
||||
// either when Enter is pressed or when Ctrl+Enter is pressed.
|
||||
const enterPressed =
|
||||
($settings?.ctrlEnterToSend ?? false)
|
||||
? (e.key === 'Enter' || e.keyCode === 13) && isCtrlPressed
|
||||
: (e.key === 'Enter' || e.keyCode === 13) && !e.shiftKey;
|
||||
|
||||
if (enterPressed) {
|
||||
e.preventDefault();
|
||||
if (prompt !== '' || files.length > 0) {
|
||||
dispatch('submit', prompt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -880,38 +890,19 @@
|
||||
class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-hidden w-full pt-3 px-1 resize-none"
|
||||
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
|
||||
bind:value={prompt}
|
||||
on:keypress={(e) => {
|
||||
if (
|
||||
!$mobile ||
|
||||
!(
|
||||
'ontouchstart' in window ||
|
||||
navigator.maxTouchPoints > 0 ||
|
||||
navigator.msMaxTouchPoints > 0
|
||||
)
|
||||
) {
|
||||
// Prevent Enter key from creating a new line
|
||||
if (e.key === 'Enter' && !e.shiftKey) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
// Submit the prompt when Enter key is pressed
|
||||
if (
|
||||
(prompt !== '' || files.length > 0) &&
|
||||
e.key === 'Enter' &&
|
||||
!e.shiftKey
|
||||
) {
|
||||
dispatch('submit', prompt);
|
||||
}
|
||||
}
|
||||
}}
|
||||
on:compositionstart={() => (isComposing = true)}
|
||||
on:compositionend={() => (isComposing = false)}
|
||||
on:keydown={async (e) => {
|
||||
const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac
|
||||
|
||||
console.log('keydown', e);
|
||||
const commandsContainerElement =
|
||||
document.getElementById('commands-container');
|
||||
|
||||
if (e.key === 'Escape') {
|
||||
stopResponse();
|
||||
}
|
||||
|
||||
// Command/Ctrl + Shift + Enter to submit a message pair
|
||||
if (isCtrlPressed && e.key === 'Enter' && e.shiftKey) {
|
||||
e.preventDefault();
|
||||
@@ -947,51 +938,87 @@
|
||||
editButton?.click();
|
||||
}
|
||||
|
||||
if (commandsContainerElement && e.key === 'ArrowUp') {
|
||||
e.preventDefault();
|
||||
commandsElement.selectUp();
|
||||
if (commandsContainerElement) {
|
||||
if (commandsContainerElement && e.key === 'ArrowUp') {
|
||||
e.preventDefault();
|
||||
commandsElement.selectUp();
|
||||
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
commandOptionButton.scrollIntoView({ block: 'center' });
|
||||
}
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
commandOptionButton.scrollIntoView({ block: 'center' });
|
||||
}
|
||||
|
||||
if (commandsContainerElement && e.key === 'ArrowDown') {
|
||||
e.preventDefault();
|
||||
commandsElement.selectDown();
|
||||
if (commandsContainerElement && e.key === 'ArrowDown') {
|
||||
e.preventDefault();
|
||||
commandsElement.selectDown();
|
||||
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
commandOptionButton.scrollIntoView({ block: 'center' });
|
||||
}
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
commandOptionButton.scrollIntoView({ block: 'center' });
|
||||
}
|
||||
|
||||
if (commandsContainerElement && e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
if (commandsContainerElement && e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
|
||||
if (e.shiftKey) {
|
||||
prompt = `${prompt}\n`;
|
||||
} else if (commandOptionButton) {
|
||||
commandOptionButton?.click();
|
||||
} else {
|
||||
document.getElementById('send-message-button')?.click();
|
||||
}
|
||||
}
|
||||
|
||||
if (commandsContainerElement && e.key === 'Tab') {
|
||||
e.preventDefault();
|
||||
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
|
||||
if (e.shiftKey) {
|
||||
prompt = `${prompt}\n`;
|
||||
} else if (commandOptionButton) {
|
||||
commandOptionButton?.click();
|
||||
} else {
|
||||
document.getElementById('send-message-button')?.click();
|
||||
}
|
||||
} else {
|
||||
if (
|
||||
!$mobile ||
|
||||
!(
|
||||
'ontouchstart' in window ||
|
||||
navigator.maxTouchPoints > 0 ||
|
||||
navigator.msMaxTouchPoints > 0
|
||||
)
|
||||
) {
|
||||
if (isComposing) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('keypress', e);
|
||||
// Prevent Enter key from creating a new line
|
||||
const isCtrlPressed = e.ctrlKey || e.metaKey;
|
||||
const enterPressed =
|
||||
($settings?.ctrlEnterToSend ?? false)
|
||||
? (e.key === 'Enter' || e.keyCode === 13) && isCtrlPressed
|
||||
: (e.key === 'Enter' || e.keyCode === 13) && !e.shiftKey;
|
||||
|
||||
console.log('Enter pressed:', enterPressed);
|
||||
|
||||
if (enterPressed) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
// Submit the prompt when Enter key is pressed
|
||||
if ((prompt !== '' || files.length > 0) && enterPressed) {
|
||||
dispatch('submit', prompt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commandsContainerElement && e.key === 'Tab') {
|
||||
e.preventDefault();
|
||||
|
||||
const commandOptionButton = [
|
||||
...document.getElementsByClassName('selected-command-option-button')
|
||||
]?.at(-1);
|
||||
|
||||
commandOptionButton?.click();
|
||||
} else if (e.key === 'Tab') {
|
||||
if (e.key === 'Tab') {
|
||||
const words = findWordIndices(prompt);
|
||||
|
||||
if (words.length > 0) {
|
||||
|
||||
@@ -231,7 +231,6 @@
|
||||
mediaRecorder.onstart = () => {
|
||||
console.log('Recording started');
|
||||
audioChunks = [];
|
||||
analyseAudio(audioStream);
|
||||
};
|
||||
|
||||
mediaRecorder.ondataavailable = (event) => {
|
||||
@@ -245,7 +244,7 @@
|
||||
stopRecordingCallback();
|
||||
};
|
||||
|
||||
mediaRecorder.start();
|
||||
analyseAudio(audioStream);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -321,6 +320,9 @@
|
||||
if (hasSound) {
|
||||
// BIG RED TEXT
|
||||
console.log('%c%s', 'color: red; font-size: 20px;', '🔊 Sound detected');
|
||||
if (mediaRecorder && mediaRecorder.state !== 'recording') {
|
||||
mediaRecorder.start();
|
||||
}
|
||||
|
||||
if (!hasStartedSpeaking) {
|
||||
hasStartedSpeaking = true;
|
||||
|
||||
@@ -228,7 +228,8 @@
|
||||
role: 'user',
|
||||
content: userPrompt,
|
||||
...(history.messages[messageId].files && { files: history.messages[messageId].files }),
|
||||
models: selectedModels
|
||||
models: selectedModels,
|
||||
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
|
||||
};
|
||||
|
||||
let messageParentId = history.messages[messageId].parentId;
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
import { config } from '$lib/stores';
|
||||
import { executeCode } from '$lib/apis/utils';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
|
||||
import ChevronUpDown from '$lib/components/icons/ChevronUpDown.svelte';
|
||||
import CommandLine from '$lib/components/icons/CommandLine.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -57,9 +60,14 @@
|
||||
let result = null;
|
||||
let files = null;
|
||||
|
||||
let collapsed = false;
|
||||
let copied = false;
|
||||
let saved = false;
|
||||
|
||||
const collapseCodeBlock = () => {
|
||||
collapsed = !collapsed;
|
||||
};
|
||||
|
||||
const saveCode = () => {
|
||||
saved = true;
|
||||
|
||||
@@ -418,18 +426,39 @@
|
||||
class="sticky {stickyButtonsClassName} mb-1 py-1 pr-2.5 flex items-center justify-end z-10 text-xs text-black dark:text-white"
|
||||
>
|
||||
<div class="flex items-center gap-0.5 translate-y-[1px]">
|
||||
{#if lang.toLowerCase() === 'python' || lang.toLowerCase() === 'py' || (lang === '' && checkPythonCode(code))}
|
||||
<button
|
||||
class="flex gap-1 items-center bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5"
|
||||
on:click={collapseCodeBlock}
|
||||
>
|
||||
<div>
|
||||
<ChevronUpDown className="size-3" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{collapsed ? $i18n.t('Expand') : $i18n.t('Collapse')}
|
||||
</div>
|
||||
</button>
|
||||
|
||||
{#if ($config?.features?.enable_code_execution ?? true) && (lang.toLowerCase() === 'python' || lang.toLowerCase() === 'py' || (lang === '' && checkPythonCode(code)))}
|
||||
{#if executing}
|
||||
<div class="run-code-button bg-none border-none p-1 cursor-not-allowed">Running</div>
|
||||
{:else if run}
|
||||
<button
|
||||
class="run-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5"
|
||||
class="flex gap-1 items-center run-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5"
|
||||
on:click={async () => {
|
||||
code = _code;
|
||||
await tick();
|
||||
executePython(code);
|
||||
}}>{$i18n.t('Run')}</button
|
||||
}}
|
||||
>
|
||||
<div>
|
||||
<CommandLine className="size-3" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{$i18n.t('Run')}
|
||||
</div>
|
||||
</button>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
@@ -457,65 +486,80 @@
|
||||
: 'rounded-b-lg'} overflow-hidden"
|
||||
>
|
||||
<div class=" pt-7 bg-gray-50 dark:bg-gray-850"></div>
|
||||
<CodeEditor
|
||||
value={code}
|
||||
{id}
|
||||
{lang}
|
||||
onSave={() => {
|
||||
saveCode();
|
||||
}}
|
||||
onChange={(value) => {
|
||||
_code = value;
|
||||
}}
|
||||
/>
|
||||
|
||||
{#if !collapsed}
|
||||
<CodeEditor
|
||||
value={code}
|
||||
{id}
|
||||
{lang}
|
||||
onSave={() => {
|
||||
saveCode();
|
||||
}}
|
||||
onChange={(value) => {
|
||||
_code = value;
|
||||
}}
|
||||
/>
|
||||
{:else}
|
||||
<div
|
||||
class="bg-gray-50 dark:bg-black dark:text-white rounded-b-lg! pt-2 pb-2 px-4 flex flex-col gap-2 text-xs"
|
||||
>
|
||||
<span class="text-gray-500 italic">
|
||||
{$i18n.t('{{COUNT}} hidden lines', {
|
||||
COUNT: code.split('\n').length
|
||||
})}
|
||||
</span>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div
|
||||
id="plt-canvas-{id}"
|
||||
class="bg-gray-50 dark:bg-[#202123] dark:text-white max-w-full overflow-x-auto scrollbar-hidden"
|
||||
/>
|
||||
|
||||
{#if executing || stdout || stderr || result || files}
|
||||
{#if !collapsed}
|
||||
<div
|
||||
class="bg-gray-50 dark:bg-[#202123] dark:text-white rounded-b-lg! py-4 px-4 flex flex-col gap-2"
|
||||
>
|
||||
{#if executing}
|
||||
<div class=" ">
|
||||
<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
|
||||
<div class="text-sm">Running...</div>
|
||||
</div>
|
||||
{:else}
|
||||
{#if stdout || stderr}
|
||||
id="plt-canvas-{id}"
|
||||
class="bg-gray-50 dark:bg-[#202123] dark:text-white max-w-full overflow-x-auto scrollbar-hidden"
|
||||
/>
|
||||
|
||||
{#if executing || stdout || stderr || result || files}
|
||||
<div
|
||||
class="bg-gray-50 dark:bg-[#202123] dark:text-white rounded-b-lg! py-4 px-4 flex flex-col gap-2"
|
||||
>
|
||||
{#if executing}
|
||||
<div class=" ">
|
||||
<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
|
||||
<div
|
||||
class="text-sm {stdout?.split('\n')?.length > 100
|
||||
? `max-h-96`
|
||||
: ''} overflow-y-auto"
|
||||
>
|
||||
{stdout || stderr}
|
||||
</div>
|
||||
<div class="text-sm">Running...</div>
|
||||
</div>
|
||||
{/if}
|
||||
{#if result || files}
|
||||
<div class=" ">
|
||||
<div class=" text-gray-500 text-xs mb-1">RESULT</div>
|
||||
{#if result}
|
||||
<div class="text-sm">{`${JSON.stringify(result)}`}</div>
|
||||
{/if}
|
||||
{#if files}
|
||||
<div class="flex flex-col gap-2">
|
||||
{#each files as file}
|
||||
{#if file.type.startsWith('image')}
|
||||
<img src={file.data} alt="Output" class=" w-full max-w-[36rem]" />
|
||||
{/if}
|
||||
{/each}
|
||||
{:else}
|
||||
{#if stdout || stderr}
|
||||
<div class=" ">
|
||||
<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
|
||||
<div
|
||||
class="text-sm {stdout?.split('\n')?.length > 100
|
||||
? `max-h-96`
|
||||
: ''} overflow-y-auto"
|
||||
>
|
||||
{stdout || stderr}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{#if result || files}
|
||||
<div class=" ">
|
||||
<div class=" text-gray-500 text-xs mb-1">RESULT</div>
|
||||
{#if result}
|
||||
<div class="text-sm">{`${JSON.stringify(result)}`}</div>
|
||||
{/if}
|
||||
{#if files}
|
||||
<div class="flex flex-col gap-2">
|
||||
{#each files as file}
|
||||
{#if file.type.startsWith('image')}
|
||||
<img src={file.data} alt="Output" class=" w-full max-w-[36rem]" />
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
import Collapsible from '$lib/components/common/Collapsible.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import ArrowDownTray from '$lib/components/icons/ArrowDownTray.svelte';
|
||||
import Source from './Source.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
@@ -91,7 +92,7 @@
|
||||
onCode={(value) => {
|
||||
dispatch('code', value);
|
||||
}}
|
||||
onSave={(e) => {
|
||||
onSave={(value) => {
|
||||
dispatch('update', {
|
||||
raw: token.raw,
|
||||
oldContent: token.text,
|
||||
@@ -261,6 +262,8 @@
|
||||
{@html html}
|
||||
{:else if token.text.includes(`<iframe src="${WEBUI_BASE_URL}/api/v1/files/`)}
|
||||
{@html `${token.text}`}
|
||||
{:else if token.text.includes(`<source_id`)}
|
||||
<Source {id} {token} onClick={onSourceClick} />
|
||||
{:else}
|
||||
{token.text}
|
||||
{/if}
|
||||
|
||||
@@ -52,12 +52,17 @@
|
||||
export let className = 'w-[32rem]';
|
||||
export let triggerClassName = 'text-lg';
|
||||
|
||||
let tagsContainerElement;
|
||||
|
||||
let show = false;
|
||||
let tags = [];
|
||||
|
||||
let selectedModel = '';
|
||||
$: selectedModel = items.find((item) => item.value === value) ?? '';
|
||||
|
||||
let searchValue = '';
|
||||
let selectedTag = '';
|
||||
|
||||
let ollamaVersion = null;
|
||||
|
||||
let selectedModelIdx = 0;
|
||||
@@ -79,10 +84,23 @@
|
||||
);
|
||||
|
||||
$: filteredItems = searchValue
|
||||
? fuse.search(searchValue).map((e) => {
|
||||
return e.item;
|
||||
})
|
||||
: items;
|
||||
? fuse
|
||||
.search(searchValue)
|
||||
.map((e) => {
|
||||
return e.item;
|
||||
})
|
||||
.filter((item) => {
|
||||
if (selectedTag === '') {
|
||||
return true;
|
||||
}
|
||||
return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag);
|
||||
})
|
||||
: items.filter((item) => {
|
||||
if (selectedTag === '') {
|
||||
return true;
|
||||
}
|
||||
return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag);
|
||||
});
|
||||
|
||||
const pullModelHandler = async () => {
|
||||
const sanitizedModelTag = searchValue.trim().replace(/^ollama\s+(run|pull)\s+/, '');
|
||||
@@ -214,6 +232,13 @@
|
||||
|
||||
onMount(async () => {
|
||||
ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
|
||||
|
||||
if (items) {
|
||||
tags = items.flatMap((item) => item.model?.info?.meta?.tags ?? []).map((tag) => tag.name);
|
||||
|
||||
// Remove duplicates and sort
|
||||
tags = Array.from(new Set(tags)).sort((a, b) => a.localeCompare(b));
|
||||
}
|
||||
});
|
||||
|
||||
const cancelModelPullHandler = async (model: string) => {
|
||||
@@ -269,7 +294,7 @@
|
||||
>
|
||||
<slot>
|
||||
{#if searchEnabled}
|
||||
<div class="flex items-center gap-2.5 px-5 mt-3.5 mb-3">
|
||||
<div class="flex items-center gap-2.5 px-5 mt-3.5 mb-1.5">
|
||||
<Search className="size-4" strokeWidth="2.5" />
|
||||
|
||||
<input
|
||||
@@ -297,11 +322,42 @@
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-100 dark:border-gray-850" />
|
||||
{/if}
|
||||
|
||||
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group">
|
||||
<div class="px-3 mb-2 max-h-64 overflow-y-auto scrollbar-hidden group relative">
|
||||
{#if tags}
|
||||
<div class=" flex w-full sticky">
|
||||
<div
|
||||
class="flex gap-1 scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-full bg-transparent px-1.5 pb-0.5"
|
||||
bind:this={tagsContainerElement}
|
||||
>
|
||||
<button
|
||||
class="min-w-fit outline-none p-1.5 {selectedTag === ''
|
||||
? ''
|
||||
: 'text-gray-300 dark:text-gray-600 hover:text-gray-700 dark:hover:text-white'} transition capitalize"
|
||||
on:click={() => {
|
||||
selectedTag = '';
|
||||
}}
|
||||
>
|
||||
{$i18n.t('All')}
|
||||
</button>
|
||||
|
||||
{#each tags as tag}
|
||||
<button
|
||||
class="min-w-fit outline-none p-1.5 {selectedTag === tag
|
||||
? ''
|
||||
: 'text-gray-300 dark:text-gray-600 hover:text-gray-700 dark:hover:text-white'} transition capitalize"
|
||||
on:click={() => {
|
||||
selectedTag = tag;
|
||||
}}
|
||||
>
|
||||
{tag}
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#each filteredItems as item, index}
|
||||
<button
|
||||
aria-label="model-item"
|
||||
@@ -441,11 +497,13 @@
|
||||
{/if}
|
||||
|
||||
{#if !$mobile && (item?.model?.info?.meta?.tags ?? []).length > 0}
|
||||
<div class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px]">
|
||||
<div
|
||||
class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px] overflow-x-auto scrollbar-none"
|
||||
>
|
||||
{#each item.model?.info?.meta.tags as tag}
|
||||
<Tooltip content={tag.name}>
|
||||
<Tooltip content={tag.name} className="flex-shrink-0">
|
||||
<div
|
||||
class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
class=" text-xs font-bold px-1 rounded-sm uppercase bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||
>
|
||||
{tag.name}
|
||||
</div>
|
||||
@@ -575,7 +633,7 @@
|
||||
</div>
|
||||
|
||||
{#if showTemporaryChatControl}
|
||||
<hr class="border-gray-100 dark:border-gray-850" />
|
||||
<hr class="border-gray-100 dark:border-gray-800" />
|
||||
|
||||
<div class="flex items-center mx-2 my-2">
|
||||
<button
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class="w-full text-3xl text-gray-800 dark:text-gray-100 font-medium text-center flex items-center gap-4 font-primary"
|
||||
class="w-full text-3xl text-gray-800 dark:text-gray-100 text-center flex items-center gap-4 font-primary"
|
||||
>
|
||||
<div class="w-full flex flex-col justify-center items-center">
|
||||
<div class="flex flex-row justify-center gap-3 @sm:gap-3.5 w-fit px-5">
|
||||
@@ -126,7 +126,7 @@
|
||||
($i18n.language === 'dg-DG'
|
||||
? `/doge.png`
|
||||
: `${WEBUI_BASE_URL}/static/favicon.png`)}
|
||||
class=" size-9 @sm:size-10 rounded-full border-[1px] border-gray-200 dark:border-none"
|
||||
class=" size-9 @sm:size-10 rounded-full border-[1px] border-gray-100 dark:border-none"
|
||||
alt="logo"
|
||||
draggable="false"
|
||||
/>
|
||||
|
||||
@@ -106,35 +106,46 @@
|
||||
|
||||
<hr class=" border-gray-100 dark:border-gray-850" />
|
||||
|
||||
{#if $config?.license_metadata}
|
||||
<div class="mb-2 text-xs">
|
||||
{#if !$WEBUI_NAME.includes('Open WebUI')}
|
||||
<span class=" text-gray-500 dark:text-gray-300 font-medium">{$WEBUI_NAME}</span> -
|
||||
{/if}
|
||||
|
||||
<span class=" capitalize">{$config?.license_metadata?.type}</span> license purchased by
|
||||
<span class=" capitalize">{$config?.license_metadata?.organization_name}</span>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="flex space-x-1">
|
||||
<a href="https://discord.gg/5rJgQTnV4s" target="_blank">
|
||||
<img
|
||||
alt="Discord"
|
||||
src="https://img.shields.io/badge/Discord-Open_WebUI-blue?logo=discord&logoColor=white"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a href="https://twitter.com/OpenWebUI" target="_blank">
|
||||
<img
|
||||
alt="X (formerly Twitter) Follow"
|
||||
src="https://img.shields.io/twitter/follow/OpenWebUI"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/open-webui/open-webui" target="_blank">
|
||||
<img
|
||||
alt="Github Repo"
|
||||
src="https://img.shields.io/github/stars/open-webui/open-webui?style=social&label=Star us on Github"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
||||
Emoji graphics provided by
|
||||
<a href="https://github.com/jdecked/twemoji" target="_blank">Twemoji</a>, licensed under
|
||||
<a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">CC-BY 4.0</a>.
|
||||
</div>
|
||||
|
||||
<div class="flex space-x-1">
|
||||
<a href="https://discord.gg/5rJgQTnV4s" target="_blank">
|
||||
<img
|
||||
alt="Discord"
|
||||
src="https://img.shields.io/badge/Discord-Open_WebUI-blue?logo=discord&logoColor=white"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a href="https://twitter.com/OpenWebUI" target="_blank">
|
||||
<img
|
||||
alt="X (formerly Twitter) Follow"
|
||||
src="https://img.shields.io/twitter/follow/OpenWebUI"
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/open-webui/open-webui" target="_blank">
|
||||
<img
|
||||
alt="Github Repo"
|
||||
src="https://img.shields.io/github/stars/open-webui/open-webui?style=social&label=Star us on Github"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<pre
|
||||
class="text-xs text-gray-400 dark:text-gray-500">Copyright (c) {new Date().getFullYear()} <a
|
||||
@@ -172,9 +183,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
</div>
|
||||
|
||||
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
||||
{#if !$WEBUI_NAME.includes('Open WebUI')}
|
||||
<span class=" text-gray-500 dark:text-gray-300 font-medium">{$WEBUI_NAME}</span> -
|
||||
{/if}
|
||||
{$i18n.t('Created by')}
|
||||
<a
|
||||
class=" text-gray-500 dark:text-gray-300 font-medium"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
stop: null,
|
||||
temperature: null,
|
||||
reasoning_effort: null,
|
||||
logit_bias: null,
|
||||
frequency_penalty: null,
|
||||
repeat_last_n: null,
|
||||
mirostat: null,
|
||||
@@ -114,7 +115,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)'
|
||||
'Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -203,7 +204,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)'
|
||||
'The temperature of the model. Increasing the temperature will make the model answer more creatively.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -258,7 +259,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)'
|
||||
'Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -301,10 +302,53 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)'
|
||||
'Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
>
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Logit Bias')}
|
||||
</div>
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded-sm transition shrink-0 outline-hidden"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.logit_bias = (params?.logit_bias ?? null) === null ? '' : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.logit_bias ?? null) === null}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
{#if (params?.logit_bias ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg pl-2 py-2 px-1 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden"
|
||||
type="text"
|
||||
placeholder={$i18n.t(
|
||||
'Enter comma-seperated "token:bias_value" pairs (example: 5432:100, 413:-100)'
|
||||
)}
|
||||
bind:value={params.logit_bias}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t('Enable Mirostat sampling for controlling perplexity.')}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
>
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
@@ -356,7 +400,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)'
|
||||
'Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -411,7 +455,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)'
|
||||
'Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -467,7 +511,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)'
|
||||
'Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -522,7 +566,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)'
|
||||
'Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -578,7 +622,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)'
|
||||
'Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -633,7 +677,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)'
|
||||
'Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -689,7 +733,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)'
|
||||
'Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -745,7 +789,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)'
|
||||
'Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -800,9 +844,7 @@
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)'
|
||||
)}
|
||||
content={$i18n.t('Sets how far back for the model to look back to prevent repetition.')}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
>
|
||||
@@ -857,7 +899,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)'
|
||||
'Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -912,9 +954,7 @@
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'Sets the size of the context window used to generate the next token. (Default: 2048)'
|
||||
)}
|
||||
content={$i18n.t('Sets the size of the context window used to generate the next token.')}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
>
|
||||
@@ -968,7 +1008,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)'
|
||||
'The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -1023,7 +1063,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)'
|
||||
'This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
@@ -1078,7 +1118,7 @@
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
'This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)'
|
||||
'This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="inline-tooltip"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||
import { getLanguages } from '$lib/i18n';
|
||||
import { getLanguages, changeLanguage } from '$lib/i18n';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import { models, settings, theme, user } from '$lib/stores';
|
||||
@@ -50,6 +50,7 @@
|
||||
seed: null,
|
||||
temperature: null,
|
||||
reasoning_effort: null,
|
||||
logit_bias: null,
|
||||
frequency_penalty: null,
|
||||
presence_penalty: null,
|
||||
repeat_penalty: null,
|
||||
@@ -198,7 +199,7 @@
|
||||
bind:value={lang}
|
||||
placeholder="Select a language"
|
||||
on:change={(e) => {
|
||||
$i18n.changeLanguage(lang);
|
||||
changeLanguage(lang);
|
||||
}}
|
||||
>
|
||||
{#each languages as language}
|
||||
@@ -348,6 +349,7 @@
|
||||
temperature: params.temperature !== null ? params.temperature : undefined,
|
||||
reasoning_effort:
|
||||
params.reasoning_effort !== null ? params.reasoning_effort : undefined,
|
||||
logit_bias: params.logit_bias !== null ? params.logit_bias : undefined,
|
||||
frequency_penalty:
|
||||
params.frequency_penalty !== null ? params.frequency_penalty : undefined,
|
||||
presence_penalty:
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
let landingPageMode = '';
|
||||
let chatBubble = true;
|
||||
let chatDirection: 'LTR' | 'RTL' = 'LTR';
|
||||
let ctrlEnterToSend = false;
|
||||
|
||||
let imageCompression = false;
|
||||
let imageCompressionSize = {
|
||||
@@ -193,6 +194,11 @@
|
||||
saveSettings({ chatDirection });
|
||||
};
|
||||
|
||||
const togglectrlEnterToSend = async () => {
|
||||
ctrlEnterToSend = !ctrlEnterToSend;
|
||||
saveSettings({ ctrlEnterToSend });
|
||||
};
|
||||
|
||||
const updateInterfaceHandler = async () => {
|
||||
saveSettings({
|
||||
models: [defaultModelId],
|
||||
@@ -232,6 +238,7 @@
|
||||
notificationSound = $settings.notificationSound ?? true;
|
||||
|
||||
hapticFeedback = $settings.hapticFeedback ?? false;
|
||||
ctrlEnterToSend = $settings.ctrlEnterToSend ?? false;
|
||||
|
||||
imageCompression = $settings.imageCompression ?? false;
|
||||
imageCompressionSize = $settings.imageCompressionSize ?? { width: '', height: '' };
|
||||
@@ -652,6 +659,28 @@
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs">
|
||||
{$i18n.t('Enter Key Behavior')}
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
on:click={() => {
|
||||
togglectrlEnterToSend();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
{#if ctrlEnterToSend === true}
|
||||
<span class="ml-2 self-center">{$i18n.t('Ctrl+Enter to Send')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Enter to Send')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class=" py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs">
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
dismissable: true,
|
||||
timestamp: Math.floor(Date.now() / 1000)
|
||||
};
|
||||
export let className = 'mx-4';
|
||||
|
||||
export let dismissed = false;
|
||||
|
||||
@@ -41,7 +42,7 @@
|
||||
{#if !dismissed}
|
||||
{#if mounted}
|
||||
<div
|
||||
class=" top-0 left-0 right-0 p-2 mx-4 px-3 flex justify-center items-center relative rounded-xl border border-gray-100 dark:border-gray-850 text-gray-800 dark:text-gary-100 bg-white dark:bg-gray-900 backdrop-blur-xl z-30"
|
||||
class="{className} top-0 left-0 right-0 p-2 px-3 flex justify-center items-center relative rounded-xl border border-gray-100 dark:border-gray-850 text-gray-800 dark:text-gary-100 bg-white dark:bg-gray-900 backdrop-blur-xl z-30"
|
||||
transition:fade={{ delay: 100, duration: 300 }}
|
||||
>
|
||||
<div class=" flex flex-col md:flex-row md:items-center flex-1 text-sm w-fit gap-1.5">
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
|
||||
import { PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
|
||||
|
||||
export let oncompositionstart = (e) => {};
|
||||
export let oncompositionend = (e) => {};
|
||||
|
||||
// create a lowlight instance with all languages loaded
|
||||
const lowlight = createLowlight(all);
|
||||
|
||||
@@ -226,6 +229,14 @@
|
||||
editorProps: {
|
||||
attributes: { id },
|
||||
handleDOMEvents: {
|
||||
compositionstart: (view, event) => {
|
||||
oncompositionstart(event);
|
||||
return false;
|
||||
},
|
||||
compositionend: (view, event) => {
|
||||
oncompositionend(event);
|
||||
return false;
|
||||
},
|
||||
focus: (view, event) => {
|
||||
eventDispatch('focus', { event });
|
||||
return false;
|
||||
|
||||
@@ -227,7 +227,11 @@
|
||||
</DragGhost>
|
||||
{/if}
|
||||
|
||||
<div bind:this={itemElement} class=" w-full {className} relative group" {draggable}>
|
||||
<div
|
||||
bind:this={itemElement}
|
||||
class=" w-full {className} relative group"
|
||||
draggable={draggable && !confirmEdit}
|
||||
>
|
||||
{#if confirmEdit}
|
||||
<div
|
||||
class=" w-full flex justify-between rounded-lg px-[11px] py-[6px] {id === $chatId ||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
import { goto } from '$app/navigation';
|
||||
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
|
||||
import { showSettings, activeUserIds, USAGE_POOL, mobile, showSidebar } from '$lib/stores';
|
||||
import { showSettings, activeUserIds, USAGE_POOL, mobile, showSidebar, user } from '$lib/stores';
|
||||
import { fade, slide } from 'svelte/transition';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import { userSignOut } from '$lib/apis/auths';
|
||||
@@ -157,8 +157,11 @@
|
||||
class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
|
||||
on:click={async () => {
|
||||
await userSignOut();
|
||||
user.set(null);
|
||||
|
||||
localStorage.removeItem('token');
|
||||
location.href = '/auth';
|
||||
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -198,7 +198,7 @@ class Tools:
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="flex flex-col flex-1 overflow-auto h-0">
|
||||
<div class="flex flex-col flex-1 overflow-auto h-0 rounded-lg">
|
||||
<div class="w-full mb-2 flex flex-col gap-0.5">
|
||||
<div class="flex w-full items-center">
|
||||
<div class=" shrink-0 mr-2">
|
||||
@@ -218,7 +218,7 @@ class Tools:
|
||||
<div class="flex-1">
|
||||
<Tooltip content={$i18n.t('e.g. My Tools')} placement="top-start">
|
||||
<input
|
||||
class="w-full text-2xl font-semibold bg-transparent outline-hidden"
|
||||
class="w-full text-2xl font-medium bg-transparent outline-hidden font-primary"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Tool Name')}
|
||||
bind:value={name}
|
||||
@@ -282,12 +282,12 @@ class Tools:
|
||||
<CodeEditor
|
||||
bind:this={codeEditor}
|
||||
value={content}
|
||||
{boilerplate}
|
||||
lang="python"
|
||||
{boilerplate}
|
||||
onChange={(e) => {
|
||||
_content = e;
|
||||
}}
|
||||
onSave={() => {
|
||||
onSave={async () => {
|
||||
if (formElement) {
|
||||
formElement.requestSubmit();
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ const createIsLoadingStore = (i18n: i18nType) => {
|
||||
return isLoading;
|
||||
};
|
||||
|
||||
export const initI18n = (defaultLocale: string | undefined) => {
|
||||
export const initI18n = (defaultLocale?: string | undefined) => {
|
||||
let detectionOrder = defaultLocale
|
||||
? ['querystring', 'localStorage']
|
||||
: ['querystring', 'localStorage', 'navigator'];
|
||||
@@ -66,6 +66,9 @@ export const initI18n = (defaultLocale: string | undefined) => {
|
||||
escapeValue: false // not needed for svelte as it escapes by default
|
||||
}
|
||||
});
|
||||
|
||||
const lang = i18next?.language || defaultLocale || 'en-US';
|
||||
document.documentElement.setAttribute('lang', lang);
|
||||
};
|
||||
|
||||
const i18n = createI18nStore(i18next);
|
||||
@@ -75,5 +78,10 @@ export const getLanguages = async () => {
|
||||
const languages = (await import(`./locales/languages.json`)).default;
|
||||
return languages;
|
||||
};
|
||||
export const changeLanguage = (lang: string) => {
|
||||
document.documentElement.setAttribute('lang', lang);
|
||||
i18next.changeLanguage(lang);
|
||||
};
|
||||
|
||||
export default i18n;
|
||||
export const isLoading = isLoadingStore;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "( `sh webui.sh --api`مثال)",
|
||||
"(latest)": "(الأخير)",
|
||||
"{{ models }}": "{{ نماذج }}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "دردشات {{user}}",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} مطلوب",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "التعليمات المتقدمة",
|
||||
"Advanced Params": "المعلمات المتقدمة",
|
||||
"All": "",
|
||||
"All Documents": "جميع الملفات",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "هل تملك حساب ؟",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "مساعد",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "هل أنت متأكد ؟",
|
||||
"Arena Models": "",
|
||||
"Artifacts": "",
|
||||
"Ask": "",
|
||||
"Ask a question": "",
|
||||
"Assistant": "",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "مجموعة",
|
||||
"Color": "",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "اتصالات",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "الاتصال",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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 the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "",
|
||||
"Copied shared chat URL to clipboard!": "تم نسخ عنوان URL للدردشة المشتركة إلى الحافظة",
|
||||
"Copied to clipboard": "",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "أنشئت من",
|
||||
"Created by": "",
|
||||
"CSV Import": "",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "الموديل المختار",
|
||||
"Current Password": "كلمة السر الحالية",
|
||||
"Custom": "مخصص",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "تمكين مشاركة المجتمع",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
|
||||
"Enabled": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "",
|
||||
"Enter Chunk Overlap": "أدخل الChunk Overlap",
|
||||
"Enter Chunk Size": "أدخل Chunk الحجم",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "أدخل كود اللغة",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "(e.g. {{modelTag}}) أدخل الموديل تاق",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "أدخل Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "الرابط (e.g. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "تجريبي",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "تصدير",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "معلومات",
|
||||
"Input commands": "إدخال الأوامر",
|
||||
"Install from Github URL": "التثبيت من عنوان URL لجيثب",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "",
|
||||
"LTR": "من جهة اليسار إلى اليمين",
|
||||
"Made by Open WebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "التخصيص",
|
||||
"Pin": "",
|
||||
"Pinned": "",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "سجل صوت",
|
||||
"Redirecting you to Open WebUI Community": "OpenWebUI إعادة توجيهك إلى مجتمع ",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"References from": "",
|
||||
"Refused when it shouldn't have": "رفض عندما لا ينبغي أن يكون",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "ضبط الصوت",
|
||||
"Set whisper model": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "الاعدادات",
|
||||
"Settings saved successfully!": "تم حفظ الاعدادات بنجاح",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "محادثة النظام",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "شكرا لملاحظاتك!",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file 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.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "يجب أن تكون النتيجة قيمة تتراوح بين 0.0 (0%) و1.0 (100%).",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "الثيم",
|
||||
"Thinking...": "",
|
||||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "وهذا يضمن حفظ محادثاتك القيمة بشكل آمن في قاعدة بياناتك الخلفية. شكرًا لك!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "مساحة العمل",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "أمس",
|
||||
"You": "انت",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot upload an empty file.": "",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(напр. `sh webui.sh --api`)",
|
||||
"(latest)": "(последна)",
|
||||
"{{ models }}": "{{ models }}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "{{COUNT}} Отговори",
|
||||
"{{user}}'s Chats": "{{user}}'s чатове",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Администраторите имат достъп до всички инструменти по всяко време; потребителите се нуждаят от инструменти, присвоени за всеки модел в работното пространство.",
|
||||
"Advanced Parameters": "Разширени Параметри",
|
||||
"Advanced Params": "Разширени параметри",
|
||||
"All": "",
|
||||
"All Documents": "Всички Документи",
|
||||
"All models deleted successfully": "Всички модели са изтрити успешно",
|
||||
"Allow Chat Controls": "Разреши контроли на чата",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "Разреши прекъсване на гласа по време на разговор",
|
||||
"Allowed Endpoints": "Разрешени крайни точки",
|
||||
"Already have an account?": "Вече имате акаунт?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Алтернатива на top_p, която цели да осигури баланс между качество и разнообразие. Параметърът p представлява минималната вероятност за разглеждане на токен, спрямо вероятността на най-вероятния токен. Например, при p=0.05 и най-вероятен токен с вероятност 0.9, логитите със стойност по-малка от 0.045 се филтрират. (По подразбиране: 0.0)",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "Винаги",
|
||||
"Amazing": "Невероятно",
|
||||
"an assistant": "асистент",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "Сигурни ли сте?",
|
||||
"Arena Models": "Arena Модели",
|
||||
"Artifacts": "Артефакти",
|
||||
"Ask": "",
|
||||
"Ask a question": "Задайте въпрос",
|
||||
"Assistant": "Асистент",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "Крайна точка за Bing Search V7",
|
||||
"Bing Search V7 Subscription Key": "Абонаментен ключ за Bing Search V7",
|
||||
"Bocha Search API Key": "API ключ за Bocha Search",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "API ключ за Brave Search",
|
||||
"By {{name}}": "От {{name}}",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "Интерпретатор на код",
|
||||
"Code Interpreter Engine": "Двигател на интерпретатора на код",
|
||||
"Code Interpreter Prompt Template": "Шаблон за промпт на интерпретатора на код",
|
||||
"Collapse": "",
|
||||
"Collection": "Колекция",
|
||||
"Color": "Цвят",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "Потвърдете новата си парола",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "Свържете се със собствени крайни точки на API, съвместими с OpenAI.",
|
||||
"Connections": "Връзки",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Ограничава усилията за разсъждение при модели за разсъждение. Приложимо само за модели за разсъждение от конкретни доставчици, които поддържат усилия за разсъждение. (По подразбиране: средно)",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "Свържете се с администратор за достъп до WebUI",
|
||||
"Content": "Съдържание",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "Продължете с имейл",
|
||||
"Continue with LDAP": "Продължете с LDAP",
|
||||
"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.": "Контролирайте как текстът на съобщението се разделя за TTS заявки. 'Пунктуация' разделя на изречения, 'параграфи' разделя на параграфи, а 'нищо' запазва съобщението като един низ.",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "Контролирайте повторението на последователности от токени в генерирания текст. По-висока стойност (напр. 1.5) ще наказва повторенията по-силно, докато по-ниска стойност (напр. 1.1) ще бъде по-снизходителна. При 1 е изключено. (По подразбиране: 1.1)",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "Контроли",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Контролира баланса между съгласуваност и разнообразие на изхода. По-ниска стойност ще доведе до по-фокусиран и съгласуван текст. (По подразбиране: 5.0)",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "Копирано",
|
||||
"Copied shared chat URL to clipboard!": "Копирана е връзката за споделен чат в клипборда!",
|
||||
"Copied to clipboard": "Копирано в клипборда",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "Създадено на",
|
||||
"Created by": "Създадено от",
|
||||
"CSV Import": "Импортиране на CSV",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Текущ модел",
|
||||
"Current Password": "Текуща Парола",
|
||||
"Custom": "Персонализиран",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"",
|
||||
"Enable API Key": "Активиране на API ключ",
|
||||
"Enable autocomplete generation for chat messages": "Активиране на автоматично довършване за съобщения в чата",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "Активиране на интерпретатор на код",
|
||||
"Enable Community Sharing": "Разрешаване на споделяне в общност",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Активиране на заключване на паметта (mlock), за да се предотврати изваждането на данните на модела от RAM. Тази опция заключва работния набор от страници на модела в RAM, гарантирайки, че няма да бъдат изхвърлени на диска. Това може да помогне за поддържане на производителността, като се избягват грешки в страниците и се осигурява бърз достъп до данните.",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Активиране на мапиране на паметта (mmap) за зареждане на данни на модела. Тази опция позволява на системата да използва дисковото пространство като разширение на RAM, третирайки дисковите файлове, сякаш са в RAM. Това може да подобри производителността на модела, като позволява по-бърз достъп до данните. Въпреки това, може да не работи правилно с всички системи и може да консумира значително количество дисково пространство.",
|
||||
"Enable Message Rating": "Активиране на оценяване на съобщения",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Активиране на Mirostat семплиране за контрол на перплексията. (По подразбиране: 0, 0 = Деактивирано, 1 = Mirostat, 2 = Mirostat 2.0)",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "Включване на нови регистрации",
|
||||
"Enabled": "Активирано",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "Въведете CFG Scale (напр. 7.0)",
|
||||
"Enter Chunk Overlap": "Въведете припокриване на чънкове",
|
||||
"Enter Chunk Size": "Въведете размер на чънк",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "Въведете описание",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "Въведете токен за Jupyter",
|
||||
"Enter Jupyter URL": "Въведете URL адрес за Jupyter",
|
||||
"Enter Kagi Search API Key": "Въведете API ключ за Kagi Search",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "Въведете кодове на езика",
|
||||
"Enter Model ID": "Въведете ID на модела",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "Въведете API ключ за Mojeek Search",
|
||||
"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "Въведете URL адрес на прокси (напр. https://потребител:парола@хост:порт)",
|
||||
"Enter reasoning effort": "Въведете усилие за разсъждение",
|
||||
"Enter Sampler (e.g. Euler a)": "Въведете семплер (напр. Euler a)",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Въведете публичния URL адрес на вашия WebUI. Този URL адрес ще бъде използван за генериране на връзки в известията.",
|
||||
"Enter Tika Server URL": "Въведете URL адрес на Tika сървър",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Въведете Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Въведете URL (напр. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "Пример: поща",
|
||||
"Example: ou=users,dc=foo,dc=example": "Пример: ou=users,dc=foo,dc=example",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "Пример: sAMAccountName или uid или userPrincipalName",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "Изключи",
|
||||
"Execute code for analysis": "Изпълнете код за анализ",
|
||||
"Expand": "",
|
||||
"Experimental": "Експериментално",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "Изследвайте космоса",
|
||||
"Export": "Износ",
|
||||
"Export All Archived Chats": "Износ на всички архивирани чатове",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "Включи",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Влияе върху това колко бързо алгоритъмът реагира на обратната връзка от генерирания текст. По-ниска скорост на обучение ще доведе до по-бавни корекции, докато по-висока скорост на обучение ще направи алгоритъма по-отзивчив. (По подразбиране: 0.1)",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "Информация",
|
||||
"Input commands": "Въведете команди",
|
||||
"Install from Github URL": "Инсталиране от URL адреса на Github",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "Локално",
|
||||
"Local Models": "Локални модели",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "Изгубено",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "Направено от OpenWebUI общността",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "Отказан достъп при опит за достъп до микрофона",
|
||||
"Permission denied when accessing microphone: {{error}}": "Отказан достъп при опит за достъп до микрофона: {{error}}",
|
||||
"Permissions": "Разрешения",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "Персонализация",
|
||||
"Pin": "Закачи",
|
||||
"Pinned": "Закачено",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "Усилие за разсъждение",
|
||||
"Record voice": "Записване на глас",
|
||||
"Redirecting you to Open WebUI Community": "Пренасочване към OpenWebUI общността",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Намалява вероятността за генериране на безсмислици. По-висока стойност (напр. 100) ще даде по-разнообразни отговори, докато по-ниска стойност (напр. 10) ще бъде по-консервативна. (По подразбиране: 40)",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Отнасяйте се към себе си като \"Потребител\" (напр. \"Потребителят учи испански\")",
|
||||
"References from": "Препратки от",
|
||||
"Refused when it shouldn't have": "Отказано, когато не трябва да бъде",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Задайте броя работни нишки, използвани за изчисления. Тази опция контролира колко нишки се използват за едновременна обработка на входящи заявки. Увеличаването на тази стойност може да подобри производителността при високи натоварвания с паралелизъм, но може също да консумира повече CPU ресурси.",
|
||||
"Set Voice": "Задай Глас",
|
||||
"Set whisper model": "Задай модел на шепот",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "Задава плоско отклонение срещу токени, които са се появили поне веднъж. По-висока стойност (напр. 1.5) ще наказва повторенията по-силно, докато по-ниска стойност (напр. 0.9) ще бъде по-снизходителна. При 0 е деактивирано. (По подразбиране: 0)",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "Задава мащабиращо отклонение срещу токени за наказване на повторения, базирано на това колко пъти са се появили. По-висока стойност (напр. 1.5) ще наказва повторенията по-силно, докато по-ниска стойност (напр. 0.9) ще бъде по-снизходителна. При 0 е деактивирано. (По подразбиране: 1.1)",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Задава колко назад моделът да гледа, за да предотврати повторение. (По подразбиране: 64, 0 = деактивирано, -1 = num_ctx)",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Задава семето на случайното число, което да се използва за генериране. Задаването на конкретно число ще накара модела да генерира същия текст за същата подкана. (По подразбиране: случайно)",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "Задава размера на контекстния прозорец, използван за генериране на следващия токен. (По подразбиране: 2048)",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Задава последователностите за спиране, които да се използват. Когато се срещне този модел, LLM ще спре да генерира текст и ще се върне. Множество модели за спиране могат да бъдат зададени чрез определяне на множество отделни параметри за спиране в моделния файл.",
|
||||
"Settings": "Настройки",
|
||||
"Settings saved successfully!": "Настройките са запазени успешно!",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "Системен Промпт",
|
||||
"Tags Generation": "Генериране на тагове",
|
||||
"Tags Generation Prompt": "Промпт за генериране на тагове",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Безопашковото семплиране се използва за намаляване на влиянието на по-малко вероятните токени от изхода. По-висока стойност (напр. 2.0) ще намали влиянието повече, докато стойност 1.0 деактивира тази настройка. (по подразбиране: 1)",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "Докоснете за прекъсване",
|
||||
"Tasks": "Задачи",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "Благодарим ви за вашия отзив!",
|
||||
"The Application Account DN you bind with for search": "DN на акаунта на приложението, с който се свързвате за търсене",
|
||||
"The base to search for users": "Базата за търсене на потребители",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Разработчиците зад този плъгин са страстни доброволци от общността. Ако намирате този плъгин полезен, моля, обмислете да допринесете за неговото развитие.",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Класацията за оценка се базира на рейтинговата система Elo и се обновява в реално време.",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "LDAP атрибутът, който съответства на имейла, който потребителите използват за вписване.",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Максималният размер на файла в MB. Ако размерът на файла надвишава този лимит, файлът няма да бъде качен.",
|
||||
"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 score should be a value between 0.0 (0%) and 1.0 (100%).": "Резултатът трябва да бъде стойност между 0.0 (0%) и 1.0 (100%).",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Температурата на модела. Увеличаването на температурата ще накара модела да отговаря по-креативно. (По подразбиране: 0.8)",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Тема",
|
||||
"Thinking...": "Мисля...",
|
||||
"This action cannot be undone. Do you wish to continue?": "Това действие не може да бъде отменено. Желаете ли да продължите?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Това гарантира, че ценните ви разговори се запазват сигурно във вашата бекенд база данни. Благодарим ви!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Това е експериментална функция, може да не работи според очакванията и подлежи на промяна по всяко време.",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Тази опция контролира колко токена се запазват при обновяване на контекста. Например, ако е зададено на 2, последните 2 токена от контекста на разговора ще бъдат запазени. Запазването на контекста може да помогне за поддържане на непрекъснатостта на разговора, но може да намали способността за отговор на нови теми. (По подразбиране: 24)",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Тази опция ще изтрие всички съществуващи файлове в колекцията и ще ги замени с новокачени файлове.",
|
||||
"This response was generated by \"{{model}}\"": "Този отговор беше генериран от \"{{model}}\"",
|
||||
"This will delete": "Това ще изтрие",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "Защо?",
|
||||
"Widescreen Mode": "Широкоекранен режим",
|
||||
"Won": "Спечелено",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Работи заедно с top-k. По-висока стойност (напр. 0.95) ще доведе до по-разнообразен текст, докато по-ниска стойност (напр. 0.5) ще генерира по-фокусиран и консервативен текст. (По подразбиране: 0.9)",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "Работно пространство",
|
||||
"Workspace Permissions": "Разрешения за работното пространство",
|
||||
"Write": "Напиши",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "Напишете съдържанието на вашия шаблон за модел тук",
|
||||
"Yesterday": "вчера",
|
||||
"You": "Вие",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Можете да чатите с максимум {{maxCount}} файл(а) наведнъж.",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Можете да персонализирате взаимодействията си с LLM-и, като добавите спомени чрез бутона 'Управление' по-долу, правейки ги по-полезни и съобразени с вас.",
|
||||
"You cannot upload an empty file.": "Не можете да качите празен файл.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(যেমন `sh webui.sh --api`)",
|
||||
"(latest)": "(সর্বশেষ)",
|
||||
"{{ models }}": "{{ মডেল}}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "{{user}}র চ্যাটস",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "এডভান্সড প্যারামিটার্স",
|
||||
"Advanced Params": "অ্যাডভান্সড প্যারাম",
|
||||
"All": "",
|
||||
"All Documents": "সব ডকুমেন্ট",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "আগে থেকেই একাউন্ট আছে?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "একটা এসিস্ট্যান্ট",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "আপনি নিশ্চিত?",
|
||||
"Arena Models": "",
|
||||
"Artifacts": "",
|
||||
"Ask": "",
|
||||
"Ask a question": "",
|
||||
"Assistant": "",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "সাহসী অনুসন্ধান API কী",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "সংগ্রহ",
|
||||
"Color": "",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "কানেকশনগুলো",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "বিষয়বস্তু",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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 the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "",
|
||||
"Copied shared chat URL to clipboard!": "শেয়ারকৃত কথা-ব্যবহারের URL ক্লিপবোর্ডে কপি করা হয়েছে!",
|
||||
"Copied to clipboard": "",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "নির্মানকাল",
|
||||
"Created by": "",
|
||||
"CSV Import": "",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "বর্তমান মডেল",
|
||||
"Current Password": "বর্তমান পাসওয়ার্ড",
|
||||
"Custom": "কাস্টম",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "ইমেজ ইমেবডিং মডেল সেট করা হয়েছে - \"{{embedding_model}}\"",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
|
||||
"Enabled": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "",
|
||||
"Enter Chunk Overlap": "চাঙ্ক ওভারল্যাপ লিখুন",
|
||||
"Enter Chunk Size": "চাংক সাইজ লিখুন",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "ল্যাঙ্গুয়েজ কোড লিখুন",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "মডেল ট্যাগ লিখুন (e.g. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Top K লিখুন",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "ইউআরএল দিন (যেমন http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "পরিক্ষামূলক",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "রপ্তানি",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "তথ্য",
|
||||
"Input commands": "ইনপুট কমান্ডস",
|
||||
"Install from Github URL": "Github URL থেকে ইনস্টল করুন",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "ডিজিটাল বাংলা",
|
||||
"Pin": "",
|
||||
"Pinned": "",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "ভয়েস রেকর্ড করুন",
|
||||
"Redirecting you to Open WebUI Community": "আপনাকে OpenWebUI কমিউনিটিতে পাঠানো হচ্ছে",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"References from": "",
|
||||
"Refused when it shouldn't have": "যদি উপযুক্ত নয়, তবে রেজিগেনেট করা হচ্ছে",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "কন্ঠস্বর নির্ধারণ করুন",
|
||||
"Set whisper model": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "সেটিংসমূহ",
|
||||
"Settings saved successfully!": "সেটিংগুলো সফলভাবে সংরক্ষিত হয়েছে",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "সিস্টেম প্রম্পট",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "আপনার মতামত ধন্যবাদ!",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file 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.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "স্কোর একটি 0.0 (0%) এবং 1.0 (100%) এর মধ্যে একটি মান হওয়া উচিত।",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "থিম",
|
||||
"Thinking...": "",
|
||||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "এটা নিশ্চিত করে যে, আপনার গুরুত্বপূর্ণ আলোচনা নিরাপদে আপনার ব্যাকএন্ড ডেটাবেজে সংরক্ষিত আছে। ধন্যবাদ!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "ওয়ার্কস্পেস",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "আগামী",
|
||||
"You": "আপনি",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot upload an empty file.": "",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
|
||||
"(latest)": "(últim)",
|
||||
"{{ models }}": "{{ models }}",
|
||||
"{{COUNT}} hidden lines": "{{COUNT}} línies ocultes",
|
||||
"{{COUNT}} Replies": "{{COUNT}} respostes",
|
||||
"{{user}}'s Chats": "Els xats de {{user}}",
|
||||
"{{webUIName}} Backend Required": "El Backend de {{webUIName}} és necessari",
|
||||
@@ -13,7 +14,7 @@
|
||||
"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",
|
||||
"About": "Sobre",
|
||||
"Accept autocomplete generation / Jump to prompt variable": "",
|
||||
"Accept autocomplete generation / Jump to prompt variable": "Acceptar la generació autocompletada / Saltar a la variable d'indicació",
|
||||
"Access": "Accés",
|
||||
"Access Control": "Control d'accés",
|
||||
"Accessible to all users": "Accessible a tots els usuaris",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Els administradors tenen accés a totes les eines en tot moment; els usuaris necessiten eines assignades per model a l'espai de treball.",
|
||||
"Advanced Parameters": "Paràmetres avançats",
|
||||
"Advanced Params": "Paràmetres avançats",
|
||||
"All": "Tots",
|
||||
"All Documents": "Tots els documents",
|
||||
"All models deleted successfully": "Tots els models s'han eliminat correctament",
|
||||
"Allow Chat Controls": "Permetre els controls de xat",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "Permetre la interrupció de la veu en una trucada",
|
||||
"Allowed Endpoints": "Punts d'accés permesos",
|
||||
"Already have an account?": "Ja tens un compte?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativa al top_p, i pretén garantir un equilibri de qualitat i varietat. El paràmetre p representa la probabilitat mínima que es consideri un token, en relació amb la probabilitat del token més probable. Per exemple, amb p=0,05 i el token més probable amb una probabilitat de 0,9, es filtren els logits amb un valor inferior a 0,045. (Per defecte: 0.0)",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Alternativa al top_p, i pretén garantir un equilibri de qualitat i varietat. El paràmetre p representa la probabilitat mínima que es consideri un token, en relació amb la probabilitat del token més probable. Per exemple, amb p=0,05 i el token més probable amb una probabilitat de 0,9, es filtren els logits amb un valor inferior a 0,045.",
|
||||
"Always": "Sempre",
|
||||
"Amazing": "Al·lucinant",
|
||||
"an assistant": "un assistent",
|
||||
@@ -86,16 +88,17 @@
|
||||
"Archive All Chats": "Arxiva tots els xats",
|
||||
"Archived Chats": "Xats arxivats",
|
||||
"archived-chat-export": "archived-chat-export",
|
||||
"Are you sure you want to clear all memories? This action cannot be undone.": "",
|
||||
"Are you sure you want to clear all memories? This action cannot be undone.": "Estàs segur que vols netejar totes les memòries? Aquesta acció no es pot desfer.",
|
||||
"Are you sure you want to delete this channel?": "Estàs segur que vols eliminar aquest canal?",
|
||||
"Are you sure you want to delete this message?": "Estàs segur que vols eliminar aquest missatge?",
|
||||
"Are you sure you want to unarchive all archived chats?": "Estàs segur que vols desarxivar tots els xats arxivats?",
|
||||
"Are you sure?": "Estàs segur?",
|
||||
"Arena Models": "Models de l'Arena",
|
||||
"Artifacts": "Artefactes",
|
||||
"Ask": "Preguntar",
|
||||
"Ask a question": "Fer una pregunta",
|
||||
"Assistant": "Assistent",
|
||||
"Attach file from knowledge": "",
|
||||
"Attach file from knowledge": "Associar arxiu del coneixement",
|
||||
"Attention to detail": "Atenció al detall",
|
||||
"Attribute for Mail": "Atribut per al Correu",
|
||||
"Attribute for Username": "Atribut per al Nom d'usuari",
|
||||
@@ -127,9 +130,10 @@
|
||||
"Bing Search V7 Endpoint": "Punt de connexió a Bing Search V7",
|
||||
"Bing Search V7 Subscription Key": "Clau de subscripció a Bing Search V7",
|
||||
"Bocha Search API Key": "Clau API de Bocha Search",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Potenciar o penalitzar tokens específics per a respostes limitades. Els valors de biaix es fixaran entre -100 i 100 (inclosos). (Per defecte: cap)",
|
||||
"Brave Search API Key": "Clau API de Brave Search",
|
||||
"By {{name}}": "Per {{name}}",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
"Bypass Embedding and Retrieval": "Desactivar l'Embedding i el Retrieval",
|
||||
"Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a Internet",
|
||||
"Calendar": "Calendari",
|
||||
"Call": "Trucada",
|
||||
@@ -163,7 +167,7 @@
|
||||
"Ciphers": "Xifradors",
|
||||
"Citation": "Cita",
|
||||
"Clear memory": "Esborrar la memòria",
|
||||
"Clear Memory": "",
|
||||
"Clear Memory": "Esborrar la memòria",
|
||||
"click here": "prem aquí",
|
||||
"Click here for filter guides.": "Clica aquí per filtrar les guies.",
|
||||
"Click here for help.": "Clica aquí per obtenir ajuda.",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "Intèrpret de codi",
|
||||
"Code Interpreter Engine": "Motor de l'intèrpret de codi",
|
||||
"Code Interpreter Prompt Template": "Plantilla de la indicació de l'intèrpret de codi",
|
||||
"Collapse": "Col·lapsar",
|
||||
"Collection": "Col·lecció",
|
||||
"Color": "Color",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -208,19 +213,19 @@
|
||||
"Confirm your new password": "Confirma la teva nova contrasenya",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "Connecta als teus propis punts de connexió de l'API compatible amb OpenAI",
|
||||
"Connections": "Connexions",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Restringeix l'esforç de raonament dels models de raonament. Només aplicable a models de raonament de proveïdors específics que donen suport a l'esforç de raonament. (Per defecte: mitjà)",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Restringeix l'esforç de raonament dels models de raonament. Només aplicable a models de raonament de proveïdors específics que donen suport a l'esforç de raonament.",
|
||||
"Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI",
|
||||
"Content": "Contingut",
|
||||
"Content Extraction Engine": "",
|
||||
"Content Extraction Engine": "Motor d'extracció de contingut",
|
||||
"Context Length": "Mida del context",
|
||||
"Continue Response": "Continuar la resposta",
|
||||
"Continue with {{provider}}": "Continuar amb {{provider}}",
|
||||
"Continue with Email": "Continuar amb el correu",
|
||||
"Continue with LDAP": "Continuar amb LDAP",
|
||||
"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.": "Controlar com es divideix el text del missatge per a les sol·licituds TTS. 'Puntuació' divideix en frases, 'paràgrafs' divideix en paràgrafs i 'cap' manté el missatge com una cadena única.",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "Controlar la repetició de seqüències de tokens en el text generat. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 1,1) serà més indulgent. A l'1, està desactivat. (Per defecte: 1.1)",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "Controlar la repetició de seqüències de tokens en el text generat. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 1,1) serà més indulgent. A l'1, està desactivat.",
|
||||
"Controls": "Controls",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Controlar l'equilibri entre la coherència i la diversitat de la sortida. Un valor més baix donarà lloc a un text més enfocat i coherent. (Per defecte: 5.0)",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Controla l'equilibri entre la coherència i la diversitat de la sortida. Un valor més baix donarà lloc a un text més enfocat i coherent.",
|
||||
"Copied": "Copiat",
|
||||
"Copied shared chat URL to clipboard!": "S'ha copiat l'URL compartida al porta-retalls!",
|
||||
"Copied to clipboard": "Copiat al porta-retalls",
|
||||
@@ -245,10 +250,11 @@
|
||||
"Created At": "Creat el",
|
||||
"Created by": "Creat per",
|
||||
"CSV Import": "Importar CSV",
|
||||
"Ctrl+Enter to Send": "Ctrl+Enter per enviar",
|
||||
"Current Model": "Model actual",
|
||||
"Current Password": "Contrasenya actual",
|
||||
"Custom": "Personalitzat",
|
||||
"Danger Zone": "",
|
||||
"Danger Zone": "Zona de perill",
|
||||
"Dark": "Fosc",
|
||||
"Database": "Base de dades",
|
||||
"December": "Desembre",
|
||||
@@ -309,8 +315,8 @@
|
||||
"Do not install functions from sources you do not fully trust.": "No instal·lis funcions de fonts en què no confiïs plenament.",
|
||||
"Do not install tools from sources you do not fully trust.": "No instal·lis eines de fonts en què no confiïs plenament.",
|
||||
"Document": "Document",
|
||||
"Document Intelligence": "",
|
||||
"Document Intelligence endpoint and key required.": "",
|
||||
"Document Intelligence": "Document Intelligence",
|
||||
"Document Intelligence endpoint and key required.": "Fa falta un punt de connexió i una clau per a Document Intelligence.",
|
||||
"Documentation": "Documentació",
|
||||
"Documents": "Documents",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realitza connexions externes, i les teves dades romanen segures al teu servidor allotjat localment.",
|
||||
@@ -346,19 +352,20 @@
|
||||
"ElevenLabs": "ElevenLabs",
|
||||
"Email": "Correu electrònic",
|
||||
"Embark on adventures": "Embarcar en aventures",
|
||||
"Embedding": "",
|
||||
"Embedding": "Incrustació",
|
||||
"Embedding Batch Size": "Mida del lot d'incrustació",
|
||||
"Embedding Model": "Model d'incrustació",
|
||||
"Embedding Model Engine": "Motor de model d'incrustació",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"",
|
||||
"Enable API Key": "Activar la Clau API",
|
||||
"Enable autocomplete generation for chat messages": "Activar la generació automàtica per als missatges del xat",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "Activar l'intèrpret de codi",
|
||||
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Activar el bloqueig de memòria (mlock) per evitar que les dades del model s'intercanviïn fora de la memòria RAM. Aquesta opció bloqueja el conjunt de pàgines de treball del model a la memòria RAM, assegurant-se que no s'intercanviaran al disc. Això pot ajudar a mantenir el rendiment evitant errors de pàgina i garantint un accés ràpid a les dades.",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Activar l'assignació de memòria (mmap) per carregar les dades del model. Aquesta opció permet que el sistema utilitzi l'emmagatzematge en disc com a extensió de la memòria RAM tractant els fitxers de disc com si estiguessin a la memòria RAM. Això pot millorar el rendiment del model permetent un accés més ràpid a les dades. Tanmateix, és possible que no funcioni correctament amb tots els sistemes i pot consumir una quantitat important d'espai en disc.",
|
||||
"Enable Message Rating": "Permetre la qualificació de missatges",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Activar el mostreig de Mirostat per controlar la perplexitat. (Per defecte: 0, 0 = Inhabilitat, 1 = Mirostat, 2 = Mirostat 2.0)",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "Permetre el mostreig de Mirostat per controlar la perplexitat",
|
||||
"Enable New Sign Ups": "Permetre nous registres",
|
||||
"Enabled": "Habilitat",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.",
|
||||
@@ -375,9 +382,10 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "Entra l'escala CFG (p.ex. 7.0)",
|
||||
"Enter Chunk Overlap": "Introdueix la mida de solapament de blocs",
|
||||
"Enter Chunk Size": "Introdueix la mida del bloc",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Introdueix parelles de \"token:valor de biaix\" separats per comes (exemple: 5432:100, 413:-100)",
|
||||
"Enter description": "Introdueix la descripció",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
"Enter Document Intelligence Endpoint": "Introdueix el punt de connexió de Document Intelligence",
|
||||
"Enter Document Intelligence Key": "Introdueix la clau de Document Intelligence",
|
||||
"Enter domains separated by commas (e.g., example.com,site.org)": "Introdueix els dominis separats per comes (p. ex. example.com,site.org)",
|
||||
"Enter Exa API Key": "Introdueix la clau API de d'EXA",
|
||||
"Enter Github Raw URL": "Introdueix l'URL en brut de Github",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "Introdueix el token de Jupyter",
|
||||
"Enter Jupyter URL": "Introdueix la URL de Jupyter",
|
||||
"Enter Kagi Search API Key": "Introdueix la clau API de Kagi Search",
|
||||
"Enter Key Behavior": "Introdueix el comportament de clau",
|
||||
"Enter language codes": "Introdueix els codis de llenguatge",
|
||||
"Enter Model ID": "Introdueix l'identificador del model",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "Introdueix la clau API de Mojeek Search",
|
||||
"Enter Number of Steps (e.g. 50)": "Introdueix el nombre de passos (p. ex. 50)",
|
||||
"Enter Perplexity API Key": "Introdueix la clau API de Perplexity",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "Entra l'URL (p. ex. https://user:password@host:port)",
|
||||
"Enter reasoning effort": "Introdueix l'esforç de raonament",
|
||||
"Enter Sampler (e.g. Euler a)": "Introdueix el mostrejador (p.ex. Euler a)",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Entra la URL pública de WebUI. Aquesta URL s'utilitzarà per generar els enllaços en les notificacions.",
|
||||
"Enter Tika Server URL": "Introdueix l'URL del servidor Tika",
|
||||
"Enter timeout in seconds": "Entra el temps màxim en segons",
|
||||
"Enter to Send": "Enter per enviar",
|
||||
"Enter Top K": "Introdueix Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "Exemple: mail",
|
||||
"Example: ou=users,dc=foo,dc=example": "Exemple: ou=users,dc=foo,dc=example",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "Exemple: sAMAccountName o uid o userPrincipalName",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "S'ha superat el nombre de places a la vostra llicència. Poseu-vos en contacte amb el servei d'assistència per augmentar el nombre de places.",
|
||||
"Exclude": "Excloure",
|
||||
"Execute code for analysis": "Executa el codi per analitzar-lo",
|
||||
"Execute code for analysis": "Executar el codi per analitzar-lo",
|
||||
"Expand": "Expandir",
|
||||
"Experimental": "Experimental",
|
||||
"Explain": "Explicar",
|
||||
"Explain this section to me in more detail": "Explica'm aquesta secció amb més detall",
|
||||
"Explore the cosmos": "Explorar el cosmos",
|
||||
"Export": "Exportar",
|
||||
"Export All Archived Chats": "Exportar tots els xats arxivats",
|
||||
@@ -515,7 +530,7 @@
|
||||
"General": "General",
|
||||
"Generate an image": "Generar una imatge",
|
||||
"Generate Image": "Generar imatge",
|
||||
"Generate prompt pair": "",
|
||||
"Generate prompt pair": "Generar parella d'indicació",
|
||||
"Generating search query": "Generant consulta",
|
||||
"Get started": "Començar",
|
||||
"Get started with {{WEBUI_NAME}}": "Començar amb {{WEBUI_NAME}}",
|
||||
@@ -566,12 +581,12 @@
|
||||
"Include": "Incloure",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "Inclou `--api-auth` quan executis stable-diffusion-webui",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclou `--api` quan executis stable-diffusion-webui",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Influeix amb la rapidesa amb què l'algoritme respon als comentaris del text generat. Una taxa d'aprenentatge més baixa donarà lloc a ajustos més lents, mentre que una taxa d'aprenentatge més alta farà que l'algorisme sigui més sensible. (Per defecte: 0,1)",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Influeix amb la rapidesa amb què l'algoritme respon als comentaris del text generat. Una taxa d'aprenentatge més baixa donarà lloc a ajustos més lents, mentre que una taxa d'aprenentatge més alta farà que l'algorisme sigui més sensible.",
|
||||
"Info": "Informació",
|
||||
"Input commands": "Entra comandes",
|
||||
"Install from Github URL": "Instal·lar des de l'URL de Github",
|
||||
"Instant Auto-Send After Voice Transcription": "Enviament automàtic després de la transcripció de veu",
|
||||
"Integration": "",
|
||||
"Integration": "Integració",
|
||||
"Interface": "Interfície",
|
||||
"Invalid file format.": "Format d'arxiu no vàlid.",
|
||||
"Invalid Tag": "Etiqueta no vàlida",
|
||||
@@ -619,11 +634,12 @@
|
||||
"Listening...": "Escoltant...",
|
||||
"Llama.cpp": "Llama.cpp",
|
||||
"LLMs can make mistakes. Verify important information.": "Els models de llenguatge poden cometre errors. Verifica la informació important.",
|
||||
"Loader": "",
|
||||
"Loader": "Carregador",
|
||||
"Loading Kokoro.js...": "Carregant Kokoro.js",
|
||||
"Local": "Local",
|
||||
"Local Models": "Models locals",
|
||||
"Location access not allowed": "",
|
||||
"Location access not allowed": "Accés a la ubicació no permesa",
|
||||
"Logit Bias": "Biaix Logit",
|
||||
"Lost": "Perdut",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "Creat per la Comunitat OpenWebUI",
|
||||
@@ -697,7 +713,7 @@
|
||||
"No HTML, CSS, or JavaScript content found.": "No s'ha trobat contingut HTML, CSS o JavaScript.",
|
||||
"No inference engine with management support found": "No s'ha trobat un motor d'inferència amb suport de gestió",
|
||||
"No knowledge found": "No s'ha trobat Coneixement",
|
||||
"No memories to clear": "",
|
||||
"No memories to clear": "No hi ha memòries per netejar",
|
||||
"No model IDs": "No hi ha IDs de model",
|
||||
"No models found": "No s'han trobat models",
|
||||
"No models selected": "No s'ha seleccionat cap model",
|
||||
@@ -727,7 +743,7 @@
|
||||
"Ollama API settings updated": "La configuració de l'API d'Ollama s'ha actualitzat",
|
||||
"Ollama Version": "Versió d'Ollama",
|
||||
"On": "Activat",
|
||||
"OneDrive": "",
|
||||
"OneDrive": "OneDrive",
|
||||
"Only alphanumeric characters and hyphens are allowed": "Només es permeten caràcters alfanumèrics i guions",
|
||||
"Only alphanumeric characters and hyphens are allowed in the command string.": "Només es permeten caràcters alfanumèrics i guions en la comanda.",
|
||||
"Only collections can be edited, create a new knowledge base to edit/add documents.": "Només es poden editar col·leccions, crea una nova base de coneixement per editar/afegir documents.",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "Permís denegat en accedir al micròfon",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
|
||||
"Permissions": "Permisos",
|
||||
"Perplexity API Key": "Clau API de Perplexity",
|
||||
"Personalization": "Personalització",
|
||||
"Pin": "Fixar",
|
||||
"Pinned": "Fixat",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "Esforç de raonament",
|
||||
"Record voice": "Enregistrar la veu",
|
||||
"Redirecting you to Open WebUI Community": "Redirigint-te a la comunitat OpenWebUI",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Redueix la probabilitat de generar ximpleries. Un valor més alt (p. ex. 100) donarà respostes més diverses, mentre que un valor més baix (p. ex. 10) serà més conservador. (Per defecte: 40)",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Redueix la probabilitat de generar ximpleries. Un valor més alt (p. ex. 100) donarà respostes més diverses, mentre que un valor més baix (p. ex. 10) serà més conservador.",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Fes referència a tu mateix com a \"Usuari\" (p. ex., \"L'usuari està aprenent espanyol\")",
|
||||
"References from": "Referències de",
|
||||
"Refused when it shouldn't have": "Refusat quan no hauria d'haver estat",
|
||||
@@ -835,7 +852,7 @@
|
||||
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications de resposta no es poden activar perquè els permisos del lloc web han estat rebutjats. Comprova les preferències del navegador per donar l'accés necessari.",
|
||||
"Response splitting": "Divisió de la resposta",
|
||||
"Result": "Resultat",
|
||||
"Retrieval": "",
|
||||
"Retrieval": "Retrieval",
|
||||
"Retrieval Query Generation": "Generació de consultes Retrieval",
|
||||
"Rich Text Input for Chat": "Entrada de text ric per al xat",
|
||||
"RK": "RK",
|
||||
@@ -866,7 +883,7 @@
|
||||
"Search options": "Opcions de cerca",
|
||||
"Search Prompts": "Cercar indicacions",
|
||||
"Search Result Count": "Recompte de resultats de cerca",
|
||||
"Search the internet": "Cerca a internet",
|
||||
"Search the internet": "Cercar a internet",
|
||||
"Search Tools": "Cercar eines",
|
||||
"SearchApi API Key": "Clau API de SearchApi",
|
||||
"SearchApi Engine": "Motor de SearchApi",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Establir el nombre de fils de treball utilitzats per al càlcul. Aquesta opció controla quants fils s'utilitzen per processar les sol·licituds entrants simultàniament. Augmentar aquest valor pot millorar el rendiment amb càrregues de treball de concurrència elevada, però també pot consumir més recursos de CPU.",
|
||||
"Set Voice": "Establir la veu",
|
||||
"Set whisper model": "Establir el model whisper",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "Estableix un biaix pla contra tokens que han aparegut almenys una vegada. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 0,9) serà més indulgent. A 0, està desactivat. (Per defecte: 0)",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "Estableix un biaix d'escala contra tokens per penalitzar les repeticions, en funció de quantes vegades han aparegut. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 0,9) serà més indulgent. A 0, està desactivat. (Per defecte: 1.1)",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Establir fins a quin punt el model mira enrere per evitar la repetició. (Per defecte: 64, 0 = desactivat, -1 = num_ctx)",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Establir la llavor del nombre aleatori que s'utilitzarà per a la generació. Establir-ho a un número específic farà que el model generi el mateix text per a la mateixa sol·licitud. (Per defecte: aleatori)",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "Estableix la mida de la finestra de context utilitzada per generar el següent token. (Per defecte: 2048)",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Estableix un biaix pla contra tokens que han aparegut almenys una vegada. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 0,9) serà més indulgent. A 0, està desactivat.",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Estableix un biaix d'escala contra tokens per penalitzar les repeticions, en funció de quantes vegades han aparegut. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 0,9) serà més indulgent. A 0, està desactivat.",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "Estableix fins a quin punt el model mira enrere per evitar la repetició.",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "Estableix la llavor del nombre aleatori que s'utilitzarà per a la generació. Establir-ho a un número específic farà que el model generi el mateix text per a la mateixa sol·licitud.",
|
||||
"Sets the size of the context window used to generate the next token.": "Estableix la mida de la finestra de context utilitzada per generar el següent token.",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Establir les seqüències d'aturada a utilitzar. Quan es trobi aquest patró, el LLM deixarà de generar text. Es poden establir diversos patrons de parada especificant diversos paràmetres de parada separats en un fitxer model.",
|
||||
"Settings": "Preferències",
|
||||
"Settings saved successfully!": "Les preferències s'han desat correctament",
|
||||
@@ -964,8 +981,8 @@
|
||||
"System Prompt": "Indicació del Sistema",
|
||||
"Tags Generation": "Generació d'etiquetes",
|
||||
"Tags Generation Prompt": "Indicació per a la generació d'etiquetes",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "El mostreig sense cua s'utilitza per reduir l'impacte de tokens menys probables de la sortida. Un valor més alt (p. ex., 2,0) reduirà més l'impacte, mentre que un valor d'1,0 desactiva aquesta configuració. (per defecte: 1)",
|
||||
"Talk to model": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "El mostreig sense cua s'utilitza per reduir l'impacte de tokens menys probables de la sortida. Un valor més alt (p. ex., 2,0) reduirà més l'impacte, mentre que un valor d'1,0 desactiva aquesta configuració.",
|
||||
"Talk to model": "Parlar amb el model",
|
||||
"Tap to interrupt": "Prem per interrompre",
|
||||
"Tasks": "Tasques",
|
||||
"Tavily API Key": "Clau API de Tavily",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "Gràcies pel teu comentari!",
|
||||
"The Application Account DN you bind with for search": "El DN del compte d'aplicació per realitzar la cerca",
|
||||
"The base to search for users": "La base per cercar usuaris",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "La mida del lot determina quantes sol·licituds de text es processen alhora. Una mida de lot més gran pot augmentar el rendiment i la velocitat del model, però també requereix més memòria. (Per defecte: 512)",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "La mida del lot determina quantes sol·licituds de text es processen alhora. Una mida de lot més gran pot augmentar el rendiment i la velocitat del model, però també requereix més memòria.",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Els desenvolupadors d'aquest complement són voluntaris apassionats de la comunitat. Si trobeu útil aquest complement, considereu contribuir al seu desenvolupament.",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La classificació d'avaluació es basa en el sistema de qualificació Elo i s'actualitza en temps real.",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "L'atribut LDAP que s'associa al correu que els usuaris utilitzen per iniciar la sessió.",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "La mida màxima del fitxer en MB. Si la mida del fitxer supera aquest límit, el fitxer no es carregarà.",
|
||||
"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.": "El nombre màxim de fitxers que es poden utilitzar alhora al xat. Si el nombre de fitxers supera aquest límit, els fitxers no es penjaran.",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El valor de puntuació hauria de ser entre 0.0 (0%) i 1.0 (100%).",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "La temperatura del model. Augmentar la temperatura farà que el model respongui de manera més creativa. (Per defecte: 0,8)",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "La temperatura del model. Augmentar la temperatura farà que el model respongui de manera més creativa.",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Pensant...",
|
||||
"This action cannot be undone. Do you wish to continue?": "Aquesta acció no es pot desfer. Vols continuar?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Això assegura que les teves converses valuoses queden desades de manera segura a la teva base de dades. Gràcies!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Aquesta és una funció experimental, és possible que no funcioni com s'espera i està subjecta a canvis en qualsevol moment.",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Aquesta opció controla quants tokens es conserven en actualitzar el context. Per exemple, si s'estableix en 2, es conservaran els darrers 2 tokens del context de conversa. Preservar el context pot ajudar a mantenir la continuïtat d'una conversa, però pot reduir la capacitat de respondre a nous temes. (Per defecte: 24)",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "Aquesta opció estableix el nombre màxim de tokens que el model pot generar en la seva resposta. Augmentar aquest límit permet que el model proporcioni respostes més llargues, però també pot augmentar la probabilitat que es generi contingut poc útil o irrellevant. (Per defecte: 128)",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Aquesta opció controla quants tokens es conserven en actualitzar el context. Per exemple, si s'estableix en 2, es conservaran els darrers 2 tokens del context de conversa. Preservar el context pot ajudar a mantenir la continuïtat d'una conversa, però pot reduir la capacitat de respondre a nous temes.",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Aquesta opció estableix el nombre màxim de tokens que el model pot generar en la seva resposta. Augmentar aquest límit permet que el model proporcioni respostes més llargues, però també pot augmentar la probabilitat que es generi contingut poc útil o irrellevant.",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Aquesta opció eliminarà tots els fitxers existents de la col·lecció i els substituirà per fitxers recentment penjats.",
|
||||
"This response was generated by \"{{model}}\"": "Aquesta resposta l'ha generat el model \"{{model}}\"",
|
||||
"This will delete": "Això eliminarà",
|
||||
@@ -1050,7 +1067,7 @@
|
||||
"Top P": "Top P",
|
||||
"Transformers": "Transformadors",
|
||||
"Trouble accessing Ollama?": "Problemes en accedir a Ollama?",
|
||||
"Trust Proxy Environment": "",
|
||||
"Trust Proxy Environment": "Confiar en l'entorn proxy",
|
||||
"TTS Model": "Model TTS",
|
||||
"TTS Settings": "Preferències de TTS",
|
||||
"TTS Voice": "Veu TTS",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "Per què?",
|
||||
"Widescreen Mode": "Mode de pantalla ampla",
|
||||
"Won": "Ha guanyat",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Funciona juntament amb top-k. Un valor més alt (p. ex., 0,95) donarà lloc a un text més divers, mentre que un valor més baix (p. ex., 0,5) generarà un text més concentrat i conservador. (Per defecte: 0,9)",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Funciona juntament amb top-k. Un valor més alt (p. ex., 0,95) donarà lloc a un text més divers, mentre que un valor més baix (p. ex., 0,5) generarà un text més concentrat i conservador.",
|
||||
"Workspace": "Espai de treball",
|
||||
"Workspace Permissions": "Permisos de l'espai de treball",
|
||||
"Write": "Escriure",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "Introdueix el contingut de la plantilla del teu model aquí",
|
||||
"Yesterday": "Ahir",
|
||||
"You": "Tu",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "Actualment esteu utilitzant una llicència de prova. Poseu-vos en contacte amb el servei d'assistència per actualitzar la vostra llicència.",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Només pots xatejar amb un màxim de {{maxCount}} fitxers alhora.",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Pots personalitzar les teves interaccions amb els models de llenguatge afegint memòries mitjançant el botó 'Gestiona' que hi ha a continuació, fent-les més útils i adaptades a tu.",
|
||||
"You cannot upload an empty file.": "No es pot pujar un ariux buit.",
|
||||
@@ -1155,6 +1173,6 @@
|
||||
"Your account status is currently pending activation.": "El compte està actualment pendent d'activació",
|
||||
"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.": "Tota la teva contribució anirà directament al desenvolupador del complement; Open WebUI no se'n queda cap percentatge. Tanmateix, la plataforma de finançament escollida pot tenir les seves pròpies comissions.",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Language": "",
|
||||
"Youtube Language": "Idioma de YouTube",
|
||||
"Youtube Proxy URL": ""
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(pananglitan `sh webui.sh --api`)",
|
||||
"(latest)": "",
|
||||
"{{ models }}": "",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "",
|
||||
"{{webUIName}} Backend Required": "Backend {{webUIName}} gikinahanglan",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "advanced settings",
|
||||
"Advanced Params": "",
|
||||
"All": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "Naa na kay account ?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "usa ka katabang",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "Sigurado ka ?",
|
||||
"Arena Models": "",
|
||||
"Artifacts": "",
|
||||
"Ask": "",
|
||||
"Ask a question": "",
|
||||
"Assistant": "",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "Koleksyon",
|
||||
"Color": "",
|
||||
"ComfyUI": "",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "Mga koneksyon",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Kontento",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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 the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copied to clipboard": "",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "",
|
||||
"Created by": "",
|
||||
"CSV Import": "",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Kasamtangang modelo",
|
||||
"Current Password": "Kasamtangang Password",
|
||||
"Custom": "Custom",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
|
||||
"Enabled": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "",
|
||||
"Enter Chunk Overlap": "Pagsulod sa block overlap",
|
||||
"Enter Chunk Size": "Isulod ang block size",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Pagsulod sa template tag (e.g. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "Pagsulod sa gidaghanon sa mga lakang (e.g. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Pagsulod sa Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Pagsulod sa URL (e.g. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "Eksperimento",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Iapil ang `--api` nga bandila kung nagdagan nga stable-diffusion-webui",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "",
|
||||
"Input commands": "Pagsulod sa input commands",
|
||||
"Install from Github URL": "",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "",
|
||||
"LTR": "",
|
||||
"Made by Open WebUI Community": "Gihimo sa komunidad sa OpenWebUI",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Gidili ang pagtugot sa dihang nag-access sa mikropono: {{error}}",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "",
|
||||
"Pin": "",
|
||||
"Pinned": "",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "Irekord ang tingog",
|
||||
"Redirecting you to Open WebUI Community": "Gi-redirect ka sa komunidad sa OpenWebUI",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"References from": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "Ibutang ang tingog",
|
||||
"Set whisper model": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "Mga setting",
|
||||
"Settings saved successfully!": "Malampuson nga na-save ang mga setting!",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "Madasig nga Sistema",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file 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.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Kini nagsiguro nga ang imong bililhon nga mga panag-istoryahanay luwas nga natipig sa imong backend database. ",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot upload an empty file.": "",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(např. `sh webui.sh --api`)",
|
||||
"(latest)": "Nejnovější",
|
||||
"{{ models }}": "{{ models }}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "{{user}}'s konverzace",
|
||||
"{{webUIName}} Backend Required": "Požadován {{webUIName}} Backend",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administrátoři mají přístup ke všem nástrojům kdykoliv; uživatelé potřebují mít nástroje přiřazené podle modelu ve workspace.",
|
||||
"Advanced Parameters": "Pokročilé parametry",
|
||||
"Advanced Params": "Pokročilé parametry",
|
||||
"All": "",
|
||||
"All Documents": "Všechny dokumenty",
|
||||
"All models deleted successfully": "Všechny modely úspěšně odstráněny",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "Povolit přerušení hlasu při hovoru",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "Už máte účet?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "asistent",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "Jste si jistý?",
|
||||
"Arena Models": "Arena modely",
|
||||
"Artifacts": "Artefakty",
|
||||
"Ask": "",
|
||||
"Ask a question": "Zeptejte se na otázku",
|
||||
"Assistant": "Ano, jak vám mohu pomoci?",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "Klíč API pro Brave Search",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "",
|
||||
"Color": "Barva",
|
||||
"ComfyUI": "ComfyUI.",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "Připojení",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "Kontaktujte administrátora pro přístup k webovému rozhraní.",
|
||||
"Content": "Obsah",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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.": "Řízení, jak se text zprávy rozděluje pro požadavky TTS. 'Punctuation' rozděluje text na věty, 'paragraphs' rozděluje text na odstavce a 'none' udržuje zprávu jako jeden celý řetězec.",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "Ovládací prvky",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "Zkopírováno",
|
||||
"Copied shared chat URL to clipboard!": "URL sdíleného chatu zkopírován do schránky!",
|
||||
"Copied to clipboard": "Zkopírováno do schránky",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "Vytvořeno dne",
|
||||
"Created by": "Vytvořeno uživatelem",
|
||||
"CSV Import": "CSV import",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Aktuální model",
|
||||
"Current Password": "Aktuální heslo",
|
||||
"Custom": "Na míru",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Model vkládání nastaven na \"{{embedding_model}}\"",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "Povolit sdílení komunity",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Povolit hodnocení zpráv",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "Povolit nové registrace",
|
||||
"Enabled": "Povoleno",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ujistěte se, že váš CSV soubor obsahuje 4 sloupce v tomto pořadí: Name, Email, Password, Role.",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "Zadejte měřítko CFG (např. 7.0)",
|
||||
"Enter Chunk Overlap": "Zadejte překryv části",
|
||||
"Enter Chunk Size": "Zadejte velikost bloku",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "Zadejte popis",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "Zadejte kódy jazyků",
|
||||
"Enter Model ID": "Zadejte ID modelu",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Zadejte označení modelu (např. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "Zadejte počet kroků (např. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "Zadejte vzorkovač (např. Euler a)",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "Zadejte URL serveru Tika",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Zadejte horní K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Zadejte URL (např. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Zadejte URL (např. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "Vyloučit",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "Experimentální",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "Exportovat",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "Zahrnout",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "Zahrňte přepínač `--api-auth` při spuštění stable-diffusion-webui.",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Při spuštění stable-diffusion-webui zahrňte příznak `--api`.",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "Info",
|
||||
"Input commands": "Vstupní příkazy",
|
||||
"Install from Github URL": "Instalace z URL adresy Githubu",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "Lokální modely",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "Ztracený",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "Vytvořeno komunitou OpenWebUI",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "Přístup k mikrofonu byl odepřen",
|
||||
"Permission denied when accessing microphone: {{error}}": "Oprávnění zamítnuto při přístupu k mikrofonu: {{error}}",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "Personalizace",
|
||||
"Pin": "",
|
||||
"Pinned": "",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "Nahrát hlas",
|
||||
"Redirecting you to Open WebUI Community": "Přesměrování na komunitu OpenWebUI",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Odkazujte na sebe jako na \"uživatele\" (např. \"Uživatel se učí španělsky\").",
|
||||
"References from": "Reference z",
|
||||
"Refused when it shouldn't have": "Odmítnuto, když nemělo být.",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "Nastavit hlas",
|
||||
"Set whisper model": "Nastavit model whisper",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "Nastavení",
|
||||
"Settings saved successfully!": "Nastavení byla úspěšně uložena!",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "Systémový prompt",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "Prompt pro generování značek",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "Klepněte pro přerušení",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "Děkujeme za vaši zpětnou vazbu!",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Vývojáři stojící za tímto pluginem jsou zapálení dobrovolníci z komunity. Pokud považujete tento plugin za užitečný, zvažte příspěvek k jeho vývoji.",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Hodnotící žebříček je založen na systému hodnocení Elo a je aktualizován v reálném čase.",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Maximální velikost souboru v MB. Pokud velikost souboru překročí tento limit, soubor nebude nahrán.",
|
||||
"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.": "Maximální počet souborů, které mohou být použity najednou v chatu. Pokud počet souborů překročí tento limit, soubory nebudou nahrány.",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Skóre by mělo být hodnotou mezi 0,0 (0%) a 1,0 (100%).",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Téma",
|
||||
"Thinking...": "Přemýšlím...",
|
||||
"This action cannot be undone. Do you wish to continue?": "Tuto akci nelze vrátit zpět. Přejete si pokračovat?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "To zajišťuje, že vaše cenné konverzace jsou bezpečně uloženy ve vaší backendové databázi. Děkujeme!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Jedná se o experimentální funkci, nemusí fungovat podle očekávání a může být kdykoliv změněna.",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tato volba odstraní všechny existující soubory ve sbírce a nahradí je nově nahranými soubory.",
|
||||
"This response was generated by \"{{model}}\"": "Tato odpověď byla vygenerována pomocí \"{{model}}\"",
|
||||
"This will delete": "Tohle odstraní",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "Proč?",
|
||||
"Widescreen Mode": "Režim širokoúhlého zobrazení",
|
||||
"Won": "Vyhrál",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "Včera",
|
||||
"You": "Vy",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Můžete komunikovat pouze s maximálně {{maxCount}} soubor(y) najednou.",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Můžete personalizovat své interakce s LLM pomocí přidávání vzpomínek prostřednictvím tlačítka 'Spravovat' níže, což je učiní pro vás užitečnějšími a lépe přizpůsobenými.",
|
||||
"You cannot upload an empty file.": "Nemůžete nahrát prázdný soubor.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
|
||||
"(latest)": "(seneste)",
|
||||
"{{ models }}": "{{ modeller }}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "{{user}}s chats",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Backend kræves",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratorer har adgang til alle værktøjer altid; brugere skal tilføjes værktøjer pr. model i hvert workspace.",
|
||||
"Advanced Parameters": "Advancerede indstillinger",
|
||||
"Advanced Params": "Advancerede indstillinger",
|
||||
"All": "",
|
||||
"All Documents": "Alle dokumenter",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "Tillad afbrydelser i stemme i opkald",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "Har du allerede en profil?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "en assistent",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "Er du sikker?",
|
||||
"Arena Models": "",
|
||||
"Artifacts": "Artifakter",
|
||||
"Ask": "",
|
||||
"Ask a question": "Stil et spørgsmål",
|
||||
"Assistant": "",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "Brave Search API nøgle",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "Samling",
|
||||
"Color": "",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "Forbindelser",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "Kontakt din administrator for adgang til WebUI",
|
||||
"Content": "Indhold",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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.": "Kontroller hvordan beskedens tekst bliver splittet til TTS requests. 'Punctuation' (tegnsætning) splitter i sætninger, 'paragraphs' splitter i paragraffer, og 'none' beholder beskeden som en samlet streng.",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "Indstillinger",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "Kopieret",
|
||||
"Copied shared chat URL to clipboard!": "Link til deling kopieret til udklipsholder",
|
||||
"Copied to clipboard": "Kopieret til udklipsholder",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "Oprettet",
|
||||
"Created by": "Oprettet af",
|
||||
"CSV Import": "Importer CSV",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Nuværende model",
|
||||
"Current Password": "Nuværende password",
|
||||
"Custom": "Custom",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model sat til \"{{embedding_model}}\"",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "Aktiver deling til Community",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "Aktiver rating af besked",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "Aktiver nye signups",
|
||||
"Enabled": "Aktiveret",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner in denne rækkefølge: Name, Email, Password, Role.",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "Indtast CFG-skala (f.eks. 7.0)",
|
||||
"Enter Chunk Overlap": "Indtast overlapning af tekststykker",
|
||||
"Enter Chunk Size": "Indtast størrelse af tekststykker",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "Indtast sprogkoder",
|
||||
"Enter Model ID": "Indtast model-ID",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Indtast modelmærke (f.eks. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "Indtast antal trin (f.eks. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "Indtast sampler (f.eks. Euler a)",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "Indtast Tika Server URL",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Indtast Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Indtast URL (f.eks. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Indtast URL (f.eks. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "Eksperimentel",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "Eksportér",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "Inkluder `--api-auth` flag, når du kører stable-diffusion-webui",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api` flag, når du kører stable-diffusion-webui",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "Info",
|
||||
"Input commands": "Inputkommandoer",
|
||||
"Install from Github URL": "Installer fra Github URL",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "Lokale modeller",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "Lavet af OpenWebUI Community",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "Tilladelse nægtet ved adgang til mikrofon",
|
||||
"Permission denied when accessing microphone: {{error}}": "Tilladelse nægtet ved adgang til mikrofon: {{error}}",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "Personalisering",
|
||||
"Pin": "Fastgør",
|
||||
"Pinned": "Fastgjort",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "Optag stemme",
|
||||
"Redirecting you to Open WebUI Community": "Omdirigerer dig til OpenWebUI Community",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Referer til dig selv som \"Bruger\" (f.eks. \"Bruger lærer spansk\")",
|
||||
"References from": "",
|
||||
"Refused when it shouldn't have": "Afvist, når den ikke burde have været det",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "Indstil stemme",
|
||||
"Set whisper model": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "Indstillinger",
|
||||
"Settings saved successfully!": "Indstillinger gemt!",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "Systemprompt",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "Tryk for at afbryde",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "Tak for din feedback!",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Udviklerne bag dette plugin er passionerede frivillige fra fællesskabet. Hvis du finder dette plugin nyttigt, kan du overveje at bidrage til dets udvikling.",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Den maksimale filstørrelse i MB. Hvis filstørrelsen overstiger denne grænse, uploades filen ikke.",
|
||||
"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.": "Det maksimale antal filer, der kan bruges på én gang i chatten. Hvis antallet af filer overstiger denne grænse, uploades filerne ikke.",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Scoren skal være en værdi mellem 0,0 (0%) og 1,0 (100%).",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "Tænker...",
|
||||
"This action cannot be undone. Do you wish to continue?": "Denne handling kan ikke fortrydes. Vil du fortsætte?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dette sikrer, at dine værdifulde samtaler gemmes sikkert i din backend-database. Tak!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dette er en eksperimentel funktion, den fungerer muligvis ikke som forventet og kan ændres når som helst.",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Denne indstilling sletter alle eksisterende filer i samlingen og erstatter dem med nyligt uploadede filer.",
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "Dette vil slette",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "Widescreen-tilstand",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "Arbejdsområde",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "I går",
|
||||
"You": "Du",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Du kan kun chatte med maksimalt {{maxCount}} fil(er) ad gangen.",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Du kan personliggøre dine interaktioner med LLM'er ved at tilføje minder via knappen 'Administrer' nedenfor, hvilket gør dem mere nyttige og skræddersyet til dig.",
|
||||
"You cannot upload an empty file.": "",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)",
|
||||
"(latest)": "(neueste)",
|
||||
"{{ models }}": "{{ Modelle }}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "{{COUNT}} Antworten",
|
||||
"{{user}}'s Chats": "{{user}}s Unterhaltungen",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
|
||||
@@ -13,7 +14,7 @@
|
||||
"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",
|
||||
"About": "Über",
|
||||
"Accept autocomplete generation / Jump to prompt variable": "",
|
||||
"Accept autocomplete generation / Jump to prompt variable": "Automatische Vervollständigung akzeptieren / Zur Prompt-Variable springen",
|
||||
"Access": "Zugang",
|
||||
"Access Control": "Zugangskontrolle",
|
||||
"Accessible to all users": "Für alle Benutzer zugänglich",
|
||||
@@ -21,7 +22,7 @@
|
||||
"Account Activation Pending": "Kontoaktivierung ausstehend",
|
||||
"Accurate information": "Präzise Information(en)",
|
||||
"Actions": "Aktionen",
|
||||
"Activate": "",
|
||||
"Activate": "Aktivieren",
|
||||
"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktivieren Sie diesen Befehl, indem Sie \"/{{COMMAND}}\" in die Chat-Eingabe eingeben.",
|
||||
"Active Users": "Aktive Benutzer",
|
||||
"Add": "Hinzufügen",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratoren haben jederzeit Zugriff auf alle Werkzeuge. Benutzer können im Arbeitsbereich zugewiesen.",
|
||||
"Advanced Parameters": "Erweiterte Parameter",
|
||||
"Advanced Params": "Erweiterte Parameter",
|
||||
"All": "",
|
||||
"All Documents": "Alle Dokumente",
|
||||
"All models deleted successfully": "Alle Modelle erfolgreich gelöscht",
|
||||
"Allow Chat Controls": "Chat-Steuerung erlauben",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen",
|
||||
"Allowed Endpoints": "Erlaubte Endpunkte",
|
||||
"Already have an account?": "Haben Sie bereits einen Account?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternative zu top_p und zielt darauf ab, ein Gleichgewicht zwischen Qualität und Vielfalt zu gewährleisten. Der Parameter p repräsentiert die Mindestwahrscheinlichkeit für ein Token, um berücksichtigt zu werden, relativ zur Wahrscheinlichkeit des wahrscheinlichsten Tokens. Zum Beispiel, bei p=0.05 und das wahrscheinlichste Token hat eine Wahrscheinlichkeit von 0.9, werden Logits mit einem Wert von weniger als 0.045 herausgefiltert. (Standard: 0.0)",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "Immer",
|
||||
"Amazing": "Fantastisch",
|
||||
"an assistant": "ein Assistent",
|
||||
@@ -86,23 +88,24 @@
|
||||
"Archive All Chats": "Alle Unterhaltungen archivieren",
|
||||
"Archived Chats": "Archivierte Unterhaltungen",
|
||||
"archived-chat-export": "archivierter-chat-export",
|
||||
"Are you sure you want to clear all memories? This action cannot be undone.": "",
|
||||
"Are you sure you want to clear all memories? This action cannot be undone.": "Sind Sie sicher, dass Sie alle Erinnerungen löschen möchten? Diese Handlung kann nicht rückgängig gemacht werden.",
|
||||
"Are you sure you want to delete this channel?": "Sind Sie sicher, dass Sie diesen Kanal löschen möchten?",
|
||||
"Are you sure you want to delete this message?": "Sind Sie sicher, dass Sie diese Nachricht löschen möchten?",
|
||||
"Are you sure you want to unarchive all archived chats?": "Sind Sie sicher, dass Sie alle archivierten Unterhaltungen wiederherstellen möchten?",
|
||||
"Are you sure?": "Sind Sie sicher?",
|
||||
"Arena Models": "Arena-Modelle",
|
||||
"Artifacts": "Artefakte",
|
||||
"Ask": "",
|
||||
"Ask a question": "Stellen Sie eine Frage",
|
||||
"Assistant": "Assistent",
|
||||
"Attach file from knowledge": "",
|
||||
"Attach file from knowledge": "Datei aus Wissensspeicher anhängen",
|
||||
"Attention to detail": "Aufmerksamkeit für Details",
|
||||
"Attribute for Mail": "Attribut für E-Mail",
|
||||
"Attribute for Username": "Attribut für Benutzername",
|
||||
"Audio": "Audio",
|
||||
"August": "August",
|
||||
"Authenticate": "Authentifizieren",
|
||||
"Authentication": "",
|
||||
"Authentication": "Authentifizierung",
|
||||
"Auto-Copy Response to Clipboard": "Antwort automatisch in die Zwischenablage kopieren",
|
||||
"Auto-playback response": "Antwort automatisch abspielen",
|
||||
"Autocomplete Generation": "Automatische Vervollständigung",
|
||||
@@ -127,11 +130,12 @@
|
||||
"Bing Search V7 Endpoint": "Bing Search V7-Endpunkt",
|
||||
"Bing Search V7 Subscription Key": "Bing Search V7-Abonnement-Schlüssel",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "Brave Search API-Schlüssel",
|
||||
"By {{name}}": "Von {{name}}",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
"Bypass Embedding and Retrieval": "Embedding und Retrieval umgehen",
|
||||
"Bypass SSL verification for Websites": "SSL-Überprüfung für Webseiten umgehen",
|
||||
"Calendar": "",
|
||||
"Calendar": "Kalender",
|
||||
"Call": "Anrufen",
|
||||
"Call feature is not supported when using Web STT engine": "Die Anruffunktion wird nicht unterstützt, wenn die Web-STT-Engine verwendet wird.",
|
||||
"Camera": "Kamera",
|
||||
@@ -170,7 +174,7 @@
|
||||
"Click here to": "Klicken Sie hier, um",
|
||||
"Click here to download user import template file.": "Klicken Sie hier, um die Vorlage für den Benutzerimport herunterzuladen.",
|
||||
"Click here to learn more about faster-whisper and see the available models.": "Klicken Sie hier, um mehr über faster-whisper zu erfahren und die verfügbaren Modelle zu sehen.",
|
||||
"Click here to see available models.": "",
|
||||
"Click here to see available models.": "Klicken Sie hier, um die verfügbaren Modelle anzuzeigen.",
|
||||
"Click here to select": "Klicke Sie zum Auswählen hier",
|
||||
"Click here to select a csv file.": "Klicken Sie zum Auswählen einer CSV-Datei hier.",
|
||||
"Click here to select a py file.": "Klicken Sie zum Auswählen einer py-Datei hier.",
|
||||
@@ -183,13 +187,14 @@
|
||||
"Clone of {{TITLE}}": "Klon von {{TITLE}}",
|
||||
"Close": "Schließen",
|
||||
"Code execution": "Codeausführung",
|
||||
"Code Execution": "",
|
||||
"Code Execution": "Codeausführung",
|
||||
"Code Execution Engine": "",
|
||||
"Code Execution Timeout": "",
|
||||
"Code formatted successfully": "Code erfolgreich formatiert",
|
||||
"Code Interpreter": "Code-Interpreter",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "Kollektion",
|
||||
"Color": "Farbe",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -206,9 +211,9 @@
|
||||
"Confirm Password": "Passwort bestätigen",
|
||||
"Confirm your action": "Bestätigen Sie Ihre Aktion.",
|
||||
"Confirm your new password": "Neues Passwort bestätigen",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "Verbinden Sie sich zu Ihren OpenAI-kompatiblen Endpunkten.",
|
||||
"Connections": "Verbindungen",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Beschränkt den Aufwand für das Schlussfolgern bei Schlussfolgerungsmodellen. Nur anwendbar auf Schlussfolgerungsmodelle von spezifischen Anbietern, die den Schlussfolgerungsaufwand unterstützen. (Standard: medium)",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "Kontaktieren Sie den Administrator für den Zugriff auf die Weboberfläche",
|
||||
"Content": "Info",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "Mit Email fortfahren",
|
||||
"Continue with LDAP": "Mit LDAP fortfahren",
|
||||
"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.": "Kontrollieren Sie, wie Nachrichtentext für TTS-Anfragen aufgeteilt wird. 'Punctuation' teilt in Sätze auf, 'paragraphs' teilt in Absätze auf und 'none' behält die Nachricht als einzelnen String.",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "Steuerung",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Kontrolliert das Gleichgewicht zwischen Kohärenz und Vielfalt des Ausgabetextes. Ein niedrigerer Wert führt zu fokussierterem und kohärenterem Text. (Standard: 5.0)",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "Kopiert",
|
||||
"Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!",
|
||||
"Copied to clipboard": "In die Zwischenablage kopiert",
|
||||
@@ -230,7 +235,7 @@
|
||||
"Copy Link": "Link kopieren",
|
||||
"Copy to clipboard": "In die Zwischenablage kopieren",
|
||||
"Copying to clipboard was successful!": "Das Kopieren in die Zwischenablage war erfolgreich!",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS muss vom Anbieter korrekt konfiguriert werden, um Anfragen von Open WebUI zuzulassen.",
|
||||
"Create": "Erstellen",
|
||||
"Create a knowledge base": "Wissensspeicher erstellen",
|
||||
"Create a model": "Modell erstellen",
|
||||
@@ -245,10 +250,11 @@
|
||||
"Created At": "Erstellt am",
|
||||
"Created by": "Erstellt von",
|
||||
"CSV Import": "CSV-Import",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Aktuelles Modell",
|
||||
"Current Password": "Aktuelles Passwort",
|
||||
"Custom": "Benutzerdefiniert",
|
||||
"Danger Zone": "",
|
||||
"Danger Zone": "Gefahrenzone",
|
||||
"Dark": "Dunkel",
|
||||
"Database": "Datenbank",
|
||||
"December": "Dezember",
|
||||
@@ -286,9 +292,9 @@
|
||||
"Describe your knowledge base and objectives": "Beschreibe deinen Wissensspeicher und deine Ziele",
|
||||
"Description": "Beschreibung",
|
||||
"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
|
||||
"Direct Connections": "",
|
||||
"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "",
|
||||
"Direct Connections settings updated": "",
|
||||
"Direct Connections": "Direktverbindungen",
|
||||
"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Direktverbindungen ermöglichen es Benutzern, sich mit ihren eigenen OpenAI-kompatiblen API-Endpunkten zu verbinden.",
|
||||
"Direct Connections settings updated": "Direktverbindungs-Einstellungen aktualisiert",
|
||||
"Disabled": "Deaktiviert",
|
||||
"Discover a function": "Entdecken Sie weitere Funktionen",
|
||||
"Discover a model": "Entdecken Sie weitere Modelle",
|
||||
@@ -321,14 +327,14 @@
|
||||
"Don't like the style": "schlechter Schreibstil",
|
||||
"Done": "Erledigt",
|
||||
"Download": "Exportieren",
|
||||
"Download as SVG": "",
|
||||
"Download as SVG": "Exportieren als SVG",
|
||||
"Download canceled": "Exportierung abgebrochen",
|
||||
"Download Database": "Datenbank exportieren",
|
||||
"Drag and drop a file to upload or select a file to view": "Ziehen Sie eine Datei zum Hochladen oder wählen Sie eine Datei zum Anzeigen aus",
|
||||
"Draw": "Zeichnen",
|
||||
"Drop any files here to add to the conversation": "Ziehen Sie beliebige Dateien hierher, um sie der Unterhaltung hinzuzufügen",
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z. B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.",
|
||||
"e.g. 60": "",
|
||||
"e.g. 60": "z. B. 60",
|
||||
"e.g. A filter to remove profanity from text": "z. B. Ein Filter, um Schimpfwörter aus Text zu entfernen",
|
||||
"e.g. My Filter": "z. B. Mein Filter",
|
||||
"e.g. My Tools": "z. B. Meine Werkzeuge",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
|
||||
"Enable API Key": "API-Schlüssel aktivieren",
|
||||
"Enable autocomplete generation for chat messages": "Automatische Vervollständigung für Chat-Nachrichten aktivieren",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "Community-Freigabe aktivieren",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktiviere Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.",
|
||||
"Enable Message Rating": "Nachrichtenbewertung aktivieren",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Mirostat Sampling zur Steuerung der Perplexität aktivieren. (Standard: 0, 0 = Deaktiviert, 1 = Mirostat, 2 = Mirostat 2.0)",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "Registrierung erlauben",
|
||||
"Enabled": "Aktiviert",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.",
|
||||
@@ -375,10 +382,11 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "Geben Sie die CFG-Skala ein (z. B. 7.0)",
|
||||
"Enter Chunk Overlap": "Geben Sie die Blocküberlappung ein",
|
||||
"Enter Chunk Size": "Geben Sie die Blockgröße ein",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "Geben Sie eine Beschreibung ein",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
"Enter domains separated by commas (e.g., example.com,site.org)": "",
|
||||
"Enter domains separated by commas (e.g., example.com,site.org)": "Geben Sie die Domains durch Kommas separiert ein (z.B. example.com,site.org)",
|
||||
"Enter Exa API Key": "Geben Sie den Exa-API-Schlüssel ein",
|
||||
"Enter Github Raw URL": "Geben Sie die Github Raw-URL ein",
|
||||
"Enter Google PSE API Key": "Geben Sie den Google PSE-API-Schlüssel ein",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "Geben sie den Kagi Search API-Schlüssel ein",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "Geben Sie die Sprachcodes ein",
|
||||
"Enter Model ID": "Geben Sie die Modell-ID ein",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Geben Sie den Model-Tag ein",
|
||||
"Enter Mojeek Search API Key": "Geben Sie den Mojeek Search API-Schlüssel ein",
|
||||
"Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "Geben sie die Proxy-URL ein (z. B. https://user:password@host:port)",
|
||||
"Enter reasoning effort": "Geben Sie den Schlussfolgerungsaufwand ein",
|
||||
"Enter Sampler (e.g. Euler a)": "Geben Sie den Sampler ein (z. B. Euler a)",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Geben sie die öffentliche URL Ihrer WebUI ein. Diese URL wird verwendet, um Links in den Benachrichtigungen zu generieren.",
|
||||
"Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Geben Sie Top K ein",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Geben Sie die URL ein (z. B. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "Beispiel: mail",
|
||||
"Example: ou=users,dc=foo,dc=example": "Beispiel: ou=users,dc=foo,dc=example",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "Beispiel: sAMAccountName or uid or userPrincipalName",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "Ausschließen",
|
||||
"Execute code for analysis": "Code für Analyse ausführen",
|
||||
"Expand": "",
|
||||
"Experimental": "Experimentell",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "Erforschen Sie das Universum",
|
||||
"Export": "Exportieren",
|
||||
"Export All Archived Chats": "Alle archivierten Unterhaltungen exportieren",
|
||||
@@ -464,7 +479,7 @@
|
||||
"Failed to save models configuration": "Fehler beim Speichern der Modellkonfiguration",
|
||||
"Failed to update settings": "Fehler beim Aktualisieren der Einstellungen",
|
||||
"Failed to upload file.": "Fehler beim Hochladen der Datei.",
|
||||
"Features": "",
|
||||
"Features": "Funktionalitäten",
|
||||
"Features Permissions": "Funktionen-Berechtigungen",
|
||||
"February": "Februar",
|
||||
"Feedback History": "Feedback-Verlauf",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "Einschließen",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "Fügen Sie beim Ausführen von stable-diffusion-webui die Option `--api-auth` hinzu",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Fügen Sie beim Ausführen von stable-diffusion-webui die Option `--api` hinzu",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Beeinflusst, wie schnell der Algorithmus auf Feedback aus dem generierten Text reagiert. Eine niedrigere Lernrate führt zu langsameren Anpassungen, während eine höhere Lernrate den Algorithmus reaktionsschneller macht. (Standard: 0.1)",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "Info",
|
||||
"Input commands": "Eingabebefehle",
|
||||
"Install from Github URL": "Installiere von der Github-URL",
|
||||
@@ -613,24 +628,25 @@
|
||||
"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Leer lassen, um alle Modelle vom \"{{URL}}/models\"-Endpunkt einzuschließen",
|
||||
"Leave empty to include all models or select specific models": "Leer lassen, um alle Modelle einzuschließen oder spezifische Modelle auszuwählen",
|
||||
"Leave empty to use the default prompt, or enter a custom prompt": "Leer lassen, um den Standardprompt zu verwenden, oder geben Sie einen benutzerdefinierten Prompt ein",
|
||||
"Leave model field empty to use the default model.": "",
|
||||
"License": "",
|
||||
"Leave model field empty to use the default model.": "Leer lassen, um das Standardmodell zu verwenden.",
|
||||
"License": "Lizenz",
|
||||
"Light": "Hell",
|
||||
"Listening...": "Höre zu...",
|
||||
"Llama.cpp": "Llama.cpp",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.",
|
||||
"Loader": "",
|
||||
"Loading Kokoro.js...": "",
|
||||
"Loading Kokoro.js...": "Lade Kokoro.js...",
|
||||
"Local": "Lokal",
|
||||
"Local Models": "Lokale Modelle",
|
||||
"Location access not allowed": "",
|
||||
"Location access not allowed": "Standortzugriff nicht erlaub",
|
||||
"Logit Bias": "",
|
||||
"Lost": "Verloren",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "Von der OpenWebUI-Community",
|
||||
"Make sure to enclose them with": "Umschließe Variablen mit",
|
||||
"Make sure to export a workflow.json file as API format from ComfyUI.": "Stellen Sie sicher, dass sie eine workflow.json-Datei im API-Format von ComfyUI exportieren.",
|
||||
"Manage": "Verwalten",
|
||||
"Manage Direct Connections": "",
|
||||
"Manage Direct Connections": "Direkte Verbindungen verwalten",
|
||||
"Manage Models": "Modelle verwalten",
|
||||
"Manage Ollama": "Ollama verwalten",
|
||||
"Manage Ollama API Connections": "Ollama-API-Verbindungen verwalten",
|
||||
@@ -697,7 +713,7 @@
|
||||
"No HTML, CSS, or JavaScript content found.": "Keine HTML-, CSS- oder JavaScript-Inhalte gefunden.",
|
||||
"No inference engine with management support found": "Keine Inferenz-Engine mit Management-Unterstützung gefunden",
|
||||
"No knowledge found": "Kein Wissen gefunden",
|
||||
"No memories to clear": "",
|
||||
"No memories to clear": "Keine Erinnerungen zum Entfernen",
|
||||
"No model IDs": "Keine Modell-IDs",
|
||||
"No models found": "Keine Modelle gefunden",
|
||||
"No models selected": "Keine Modelle ausgewählt",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "Zugriff auf das Mikrofon verweigert",
|
||||
"Permission denied when accessing microphone: {{error}}": "Zugriff auf das Mikrofon verweigert: {{error}}",
|
||||
"Permissions": "Berechtigungen",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "Personalisierung",
|
||||
"Pin": "Anheften",
|
||||
"Pinned": "Angeheftet",
|
||||
@@ -776,7 +793,7 @@
|
||||
"Plain text (.txt)": "Nur Text (.txt)",
|
||||
"Playground": "Testumgebung",
|
||||
"Please carefully review the following warnings:": "Bitte überprüfen Sie die folgenden Warnungen sorgfältig:",
|
||||
"Please do not close the settings page while loading the model.": "",
|
||||
"Please do not close the settings page while loading the model.": "Bitte schließen die Einstellungen-Seite nicht, während das Modell lädt.",
|
||||
"Please enter a prompt": "Bitte geben Sie einen Prompt ein",
|
||||
"Please fill in all fields.": "Bitte füllen Sie alle Felder aus.",
|
||||
"Please select a model first.": "Bitte wählen Sie zuerst ein Modell aus.",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "Schlussfolgerungsaufwand",
|
||||
"Record voice": "Stimme aufnehmen",
|
||||
"Redirecting you to Open WebUI Community": "Sie werden zur OpenWebUI-Community weitergeleitet",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Reduziert die Wahrscheinlichkeit, Unsinn zu generieren. Ein höherer Wert (z.B. 100) liefert vielfältigere Antworten, während ein niedrigerer Wert (z.B. 10) konservativer ist. (Standard: 40)",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Beziehen Sie sich auf sich selbst als \"Benutzer\" (z. B. \"Benutzer lernt Spanisch\")",
|
||||
"References from": "Referenzen aus",
|
||||
"Refused when it shouldn't have": "Abgelehnt, obwohl es nicht hätte abgelehnt werden sollen",
|
||||
@@ -821,7 +838,7 @@
|
||||
"Rename": "Umbenennen",
|
||||
"Reorder Models": "Modelle neu anordnen",
|
||||
"Repeat Last N": "Wiederhole die letzten N",
|
||||
"Repeat Penalty (Ollama)": "",
|
||||
"Repeat Penalty (Ollama)": "Wiederholungsstrafe (Ollama)",
|
||||
"Reply in Thread": "Im Thread antworten",
|
||||
"Request Mode": "Anforderungsmodus",
|
||||
"Reranking Model": "Reranking-Modell",
|
||||
@@ -885,7 +902,7 @@
|
||||
"Select a pipeline": "Wählen Sie eine Pipeline",
|
||||
"Select a pipeline url": "Wählen Sie eine Pipeline-URL",
|
||||
"Select a tool": "Wählen Sie ein Werkzeug",
|
||||
"Select an auth method": "",
|
||||
"Select an auth method": "Wählen Sie eine Authentifizierungsmethode",
|
||||
"Select an Ollama instance": "Wählen Sie eine Ollama-Instanz",
|
||||
"Select Engine": "Engine auswählen",
|
||||
"Select Knowledge": "Wissensdatenbank auswählen",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Legt die Anzahl der für die Berechnung verwendeten GPU-Geräte fest. Diese Option steuert, wie viele GPU-Geräte (falls verfügbar) zur Verarbeitung eingehender Anfragen verwendet werden. Eine Erhöhung dieses Wertes kann die Leistung für Modelle, die für GPU-Beschleunigung optimiert sind, erheblich verbessern, kann jedoch auch mehr Strom und GPU-Ressourcen verbrauchen.",
|
||||
"Set Voice": "Stimme festlegen",
|
||||
"Set whisper model": "Whisper-Modell festlegen",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Legt fest, wie weit das Modell zurückblicken soll, um Wiederholungen zu verhindern. (Standard: 64, 0 = deaktiviert, -1 = num_ctx)",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Legt den Zufallszahlengenerator-Seed für die Generierung fest. Wenn dieser auf eine bestimmte Zahl gesetzt wird, erzeugt das Modell denselben Text für denselben Prompt. (Standard: zufällig)",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "Legt die Größe des Kontextfensters fest, das zur Generierung des nächsten Tokens verwendet wird. (Standard: 2048)",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Legt die zu verwendenden Stoppsequenzen fest. Wenn dieses Muster erkannt wird, stoppt das LLM die Textgenerierung und gibt zurück. Mehrere Stoppmuster können festgelegt werden, indem mehrere separate Stopp-Parameter in einer Modelldatei angegeben werden.",
|
||||
"Settings": "Einstellungen",
|
||||
"Settings saved successfully!": "Einstellungen erfolgreich gespeichert!",
|
||||
@@ -964,10 +981,10 @@
|
||||
"System Prompt": "System-Prompt",
|
||||
"Tags Generation": "Tag-Generierung",
|
||||
"Tags Generation Prompt": "Prompt für Tag-Generierung",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Tail-Free Sampling wird verwendet, um den Einfluss weniger wahrscheinlicher Tokens auf die Ausgabe zu reduzieren. Ein höherer Wert (z.B. 2.0) reduziert den Einfluss stärker, während ein Wert von 1.0 diese Einstellung deaktiviert. (Standard: 1)",
|
||||
"Talk to model": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail-Free Sampling wird verwendet, um den Einfluss weniger wahrscheinlicher Tokens auf die Ausgabe zu reduzieren. Ein höherer Wert (z.B. 2.0) reduziert den Einfluss stärker, während ein Wert von 1.0 diese Einstellung deaktiviert. (Standard: 1)",
|
||||
"Talk to model": "Zu einem Modell sprechen",
|
||||
"Tap to interrupt": "Zum Unterbrechen tippen",
|
||||
"Tasks": "",
|
||||
"Tasks": "Aufgaben",
|
||||
"Tavily API Key": "Tavily-API-Schlüssel",
|
||||
"Tell us more:": "Erzähl uns mehr",
|
||||
"Temperature": "Temperatur",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "Danke für Ihr Feedback!",
|
||||
"The Application Account DN you bind with for search": "Der Anwendungs-Konto-DN, mit dem Sie für die Suche binden",
|
||||
"The base to search for users": "Die Basis, in der nach Benutzern gesucht wird",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "Die Batch-Größe bestimmt, wie viele Textanfragen gleichzeitig verarbeitet werden. Eine größere Batch-Größe kann die Leistung und Geschwindigkeit des Modells erhöhen, erfordert jedoch auch mehr Speicher. (Standard: 512)",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Die Entwickler hinter diesem Plugin sind leidenschaftliche Freiwillige aus der Community. Wenn Sie dieses Plugin hilfreich finden, erwägen Sie bitte, zu seiner Entwicklung beizutragen.",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Die Bewertungs-Bestenliste basiert auf dem Elo-Bewertungssystem und wird in Echtzeit aktualisiert.",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "Das LDAP-Attribut, das der Mail zugeordnet ist, die Benutzer zum Anmelden verwenden.",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Die maximale Dateigröße in MB. Wenn die Dateigröße dieses Limit überschreitet, wird die Datei nicht hochgeladen.",
|
||||
"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.": "Die maximale Anzahl von Dateien, die gleichzeitig in der Unterhaltung verwendet werden können. Wenn die Anzahl der Dateien dieses Limit überschreitet, werden die Dateien nicht hochgeladen.",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Die Temperatur des Modells. Eine Erhöhung der Temperatur führt dazu, dass das Modell kreativer antwortet. (Standard: 0,8)",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Design",
|
||||
"Thinking...": "Denke nach...",
|
||||
"This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Unterhaltungen sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion, sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Diese Option steuert, wie viele Tokens beim Aktualisieren des Kontexts beibehalten werden. Wenn sie beispielsweise auf 2 gesetzt ist, werden die letzten 2 Tokens des Gesprächskontexts beibehalten. Das Beibehalten des Kontexts kann helfen, die Kontinuität eines Gesprächs aufrechtzuerhalten, kann jedoch die Fähigkeit verringern, auf neue Themen zu reagieren. (Standard: 24)",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "Diese Option legt die maximale Anzahl von Tokens fest, die das Modell in seiner Antwort generieren kann. Eine Erhöhung dieses Limits ermöglicht es dem Modell, längere Antworten zu geben, kann jedoch auch die Wahrscheinlichkeit erhöhen, dass unhilfreicher oder irrelevanter Inhalt generiert wird. (Standard: 128)",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Diese Option löscht alle vorhandenen Dateien in der Sammlung und ersetzt sie durch neu hochgeladene Dateien.",
|
||||
"This response was generated by \"{{model}}\"": "Diese Antwort wurde von \"{{model}}\" generiert",
|
||||
"This will delete": "Dies löscht",
|
||||
@@ -1005,7 +1022,7 @@
|
||||
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dadurch wird die Wissensdatenbank zurückgesetzt und alle Dateien synchronisiert. Möchten Sie fortfahren?",
|
||||
"Thorough explanation": "Ausführliche Erklärung",
|
||||
"Thought for {{DURATION}}": "Nachgedacht für {{DURATION}}",
|
||||
"Thought for {{DURATION}} seconds": "",
|
||||
"Thought for {{DURATION}} seconds": "Nachgedacht für {{DURATION}} Sekunden",
|
||||
"Tika": "Tika",
|
||||
"Tika Server URL required.": "Tika-Server-URL erforderlich.",
|
||||
"Tiktoken": "Tiktoken",
|
||||
@@ -1014,7 +1031,7 @@
|
||||
"Title (e.g. Tell me a fun fact)": "Titel (z. B. Erzähl mir einen lustigen Fakt)",
|
||||
"Title Auto-Generation": "Unterhaltungstitel automatisch generieren",
|
||||
"Title cannot be an empty string.": "Titel darf nicht leer sein.",
|
||||
"Title Generation": "",
|
||||
"Title Generation": "Titelgenerierung",
|
||||
"Title Generation Prompt": "Prompt für Titelgenerierung",
|
||||
"TLS": "TLS",
|
||||
"To access the available model names for downloading,": "Um auf die verfügbaren Modellnamen zuzugreifen,",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "Warum?",
|
||||
"Widescreen Mode": "Breitbildmodus",
|
||||
"Won": "Gewonnen",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Funktioniert zusammen mit top-k. Ein höherer Wert (z.B. 0,95) führt zu vielfältigerem Text, während ein niedrigerer Wert (z.B. 0,5) fokussierteren und konservativeren Text erzeugt. (Standard: 0,9)",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "Arbeitsbereich",
|
||||
"Workspace Permissions": "Arbeitsbereichsberechtigungen",
|
||||
"Write": "Schreiben",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "Schreiben Sie hier Ihren Modellvorlageninhalt",
|
||||
"Yesterday": "Gestern",
|
||||
"You": "Sie",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Sie können nur mit maximal {{maxCount}} Datei(en) gleichzeitig chatten.",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Personalisieren Sie Interaktionen mit LLMs, indem Sie über die Schaltfläche \"Verwalten\" Erinnerungen hinzufügen.",
|
||||
"You cannot upload an empty file.": "Sie können keine leere Datei hochladen.",
|
||||
@@ -1155,6 +1173,6 @@
|
||||
"Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.",
|
||||
"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.": "Ihr gesamter Beitrag geht direkt an den Plugin-Entwickler; Open WebUI behält keinen Prozentsatz ein. Die gewählte Finanzierungsplattform kann jedoch eigene Gebühren haben.",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Language": "",
|
||||
"Youtube Language": "YouTube Sprache",
|
||||
"Youtube Proxy URL": ""
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(such e.g. `sh webui.sh --api`)",
|
||||
"(latest)": "(much latest)",
|
||||
"{{ models }}": "",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Advanced Parameters",
|
||||
"Advanced Params": "",
|
||||
"All": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "Such account exists?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "such assistant",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "Such certainty?",
|
||||
"Arena Models": "",
|
||||
"Artifacts": "",
|
||||
"Ask": "",
|
||||
"Ask a question": "",
|
||||
"Assistant": "",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "Collection",
|
||||
"Color": "",
|
||||
"ComfyUI": "",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "Connections",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "Content",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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 the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copied to clipboard": "",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "",
|
||||
"Created by": "",
|
||||
"CSV Import": "",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Current Model",
|
||||
"Current Password": "Current Password",
|
||||
"Custom": "Custom",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "Enable New Bark Ups",
|
||||
"Enabled": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "",
|
||||
"Enter Chunk Overlap": "Enter Overlap of Chunks",
|
||||
"Enter Chunk Size": "Enter Size of Chunk",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Enter model doge tag (e.g. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "Enter Number of Steps (e.g. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Enter Top Wow",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Enter URL (e.g. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "Much Experiment",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "",
|
||||
"Input commands": "Input commands",
|
||||
"Install from Github URL": "",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "",
|
||||
"LTR": "",
|
||||
"Made by Open WebUI Community": "Made by Open WebUI Community",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "Personalization",
|
||||
"Pin": "",
|
||||
"Pinned": "",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "Record Bark",
|
||||
"Redirecting you to Open WebUI Community": "Redirecting you to Open WebUI Community",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"References from": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "Set Voice so speak",
|
||||
"Set whisper model": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "Settings much settings",
|
||||
"Settings saved successfully!": "Settings saved successfully! Very success!",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "System Prompt much prompt",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file 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.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Theme much theme",
|
||||
"Thinking...": "",
|
||||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "This ensures that your valuable conversations are securely saved to your backend database. Thank you! Much secure!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot upload an empty file.": "",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(π.χ. `sh webui.sh --api`)",
|
||||
"(latest)": "(τελευταίο)",
|
||||
"{{ models }}": "{{ models }}",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "Συνομιλίες του {{user}}",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Απαιτείται Backend",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Οι διαχειριστές έχουν πρόσβαση σε όλα τα εργαλεία ανά πάσα στιγμή· οι χρήστες χρειάζονται εργαλεία ανά μοντέλο στον χώρο εργασίας.",
|
||||
"Advanced Parameters": "Προηγμένοι Παράμετροι",
|
||||
"Advanced Params": "Προηγμένα Παράμετροι",
|
||||
"All": "",
|
||||
"All Documents": "Όλα τα Έγγραφα",
|
||||
"All models deleted successfully": "Όλα τα μοντέλα διαγράφηκαν με επιτυχία",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "Επιτρέπεται η Παύση Φωνής στην Κλήση",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "Έχετε ήδη λογαριασμό;",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Εναλλακτικό στο top_p, και στοχεύει στη διασφάλιση μιας ισορροπίας μεταξύ ποιότητας και ποικιλίας. Η παράμετρος p αντιπροσωπεύει την ελάχιστη πιθανότητα για ένα token να θεωρηθεί, σε σχέση με την πιθανότητα του πιο πιθανού token. Για παράδειγμα, με p=0.05 και το πιο πιθανό token να έχει πιθανότητα 0.9, τα logits με τιμή μικρότερη από 0.045 φιλτράρονται. (Προεπιλογή: 0.0)",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "Καταπληκτικό",
|
||||
"an assistant": "ένας βοηθός",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "Είστε σίγουροι;",
|
||||
"Arena Models": "Μοντέλα Arena",
|
||||
"Artifacts": "Αρχεία",
|
||||
"Ask": "",
|
||||
"Ask a question": "Ρωτήστε μια ερώτηση",
|
||||
"Assistant": "Βοηθός",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "Τέλος Bing Search V7",
|
||||
"Bing Search V7 Subscription Key": "Κλειδί Συνδρομής Bing Search V7",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "Κλειδί API Brave Search",
|
||||
"By {{name}}": "Από {{name}}",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "Συλλογή",
|
||||
"Color": "Χρώμα",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "Συνδέσεις",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "Επικοινωνήστε με τον Διαχειριστή για Πρόσβαση στο WebUI",
|
||||
"Content": "Περιεχόμενο",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "Συνέχεια με Email",
|
||||
"Continue with LDAP": "Συνέχεια με LDAP",
|
||||
"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.": "Έλεγχος πώς διαχωρίζεται το κείμενο του μηνύματος για αιτήματα TTS. Το 'Στίξη' διαχωρίζει σε προτάσεις, οι 'παραγράφοι' σε παραγράφους, και το 'κανένα' κρατά το μήνυμα ως μια αλυσίδα.",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "Έλεγχοι",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Διαχειρίζεται την ισορροπία μεταξύ συνεκτικότητας και ποικιλίας της εξόδου. Μια χαμηλότερη τιμή θα έχει ως αποτέλεσμα πιο εστιασμένο και συνεκτικό κείμενο. (Προεπιλογή: 5.0)",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "Αντιγράφηκε",
|
||||
"Copied shared chat URL to clipboard!": "Αντιγράφηκε το URL της κοινόχρηστης συνομιλίας στο πρόχειρο!",
|
||||
"Copied to clipboard": "Αντιγράφηκε στο πρόχειρο",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "Δημιουργήθηκε στις",
|
||||
"Created by": "Δημιουργήθηκε από",
|
||||
"CSV Import": "Εισαγωγή CSV",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "Τρέχον Μοντέλο",
|
||||
"Current Password": "Τρέχων Κωδικός",
|
||||
"Custom": "Προσαρμοσμένο",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Το μοντέλο ενσωμάτωσης έχει οριστεί σε \"{{embedding_model}}\"",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "Ενεργοποίηση Κοινοτικής Κοινής Χρήσης",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Ενεργοποίηση Κλείδωσης Μνήμης (mlock) για την αποτροπή της ανταλλαγής δεδομένων του μοντέλου από τη μνήμη RAM. Αυτή η επιλογή κλειδώνει το σύνολο εργασίας των σελίδων του μοντέλου στη μνήμη RAM, διασφαλίζοντας ότι δεν θα ανταλλαχθούν στο δίσκο. Αυτό μπορεί να βοηθήσει στη διατήρηση της απόδοσης αποφεύγοντας σφάλματα σελίδων και διασφαλίζοντας γρήγορη πρόσβαση στα δεδομένα.",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Ενεργοποίηση Χαρτογράφησης Μνήμης (mmap) για φόρτωση δεδομένων μοντέλου. Αυτή η επιλογή επιτρέπει στο σύστημα να χρησιμοποιεί αποθήκευση δίσκου ως επέκταση της μνήμης RAM, αντιμετωπίζοντας αρχεία δίσκου σαν να ήταν στη μνήμη RAM. Αυτό μπορεί να βελτιώσει την απόδοση του μοντέλου επιτρέποντας γρηγορότερη πρόσβαση στα δεδομένα. Ωστόσο, μπορεί να μην λειτουργεί σωστά με όλα τα συστήματα και να καταναλώνει σημαντικό χώρο στο δίσκο.",
|
||||
"Enable Message Rating": "Ενεργοποίηση Αξιολόγησης Μηνυμάτων",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "Ενεργοποίηση δειγματοληψίας Mirostat για έλεγχο της περιπλοκότητας. (Προεπιλογή: 0, 0 = Απενεργοποιημένο, 1 = Mirostat, 2 = Mirostat 2.0)",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "Ενεργοποίηση Νέων Εγγραφών",
|
||||
"Enabled": "Ενεργοποιημένο",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Βεβαιωθείτε ότι το αρχείο CSV σας περιλαμβάνει 4 στήλες με αυτή τη σειρά: Όνομα, Email, Κωδικός, Ρόλος.",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "Εισάγετε το CFG Scale (π.χ. 7.0)",
|
||||
"Enter Chunk Overlap": "Εισάγετε την Επικάλυψη Τμημάτων",
|
||||
"Enter Chunk Size": "Εισάγετε το Μέγεθος Τμημάτων",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "Εισάγετε την περιγραφή",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "Εισάγετε κωδικούς γλώσσας",
|
||||
"Enter Model ID": "Εισάγετε το ID Μοντέλου",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Εισάγετε την ετικέτα μοντέλου (π.χ. {{modelTag}})",
|
||||
"Enter Mojeek Search API Key": "Εισάγετε το Κλειδί API Mojeek Search",
|
||||
"Enter Number of Steps (e.g. 50)": "Εισάγετε τον Αριθμό Βημάτων (π.χ. 50)",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "Εισάγετε τον Sampler (π.χ. Euler a)",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "Εισάγετε το URL διακομιστή Tika",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "Εισάγετε το Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Εισάγετε το URL (π.χ. http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Εισάγετε το URL (π.χ. http://localhost:11434)",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "Παράδειγμα: ou=users,dc=foo,dc=example",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "Παράδειγμα: sAMAccountName ή uid ή userPrincipalName",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "Εξαίρεση",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "Πειραματικό",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "Εξερευνήστε το σύμπαν",
|
||||
"Export": "Εξαγωγή",
|
||||
"Export All Archived Chats": "Εξαγωγή Όλων των Αρχειοθετημένων Συνομιλιών",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "Συμπερίληψη",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "Συμπεριλάβετε το flag `--api-auth` όταν τρέχετε το stable-diffusion-webui",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Συμπεριλάβετε το flag `--api` όταν τρέχετε το stable-diffusion-webui",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "Επηρεάζει πόσο γρήγορα ανταποκρίνεται ο αλγόριθμος στην ανατροφοδότηση από το παραγόμενο κείμενο. Μια χαμηλότερη ταχύτητα μάθησης θα έχει ως αποτέλεσμα πιο αργές προσαρμογές, ενώ μια υψηλότερη ταχύτητα μάθησης θα κάνει τον αλγόριθμο πιο ανταποκρινόμενο. (Προεπιλογή: 0.1)",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "Πληροφορίες",
|
||||
"Input commands": "Εισαγωγή εντολών",
|
||||
"Install from Github URL": "Εγκατάσταση από URL Github",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "Τοπικό",
|
||||
"Local Models": "Τοπικά Μοντέλα",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "Χαμένος",
|
||||
"LTR": "LTR",
|
||||
"Made by Open WebUI Community": "Δημιουργήθηκε από την Κοινότητα OpenWebUI",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "Άρνηση δικαιώματος κατά την πρόσβαση σε μικρόφωνο",
|
||||
"Permission denied when accessing microphone: {{error}}": "Άρνηση δικαιώματος κατά την πρόσβαση σε μικρόφωνο: {{error}}",
|
||||
"Permissions": "Δικαιώματα",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "Προσωποποίηση",
|
||||
"Pin": "Καρφίτσωμα",
|
||||
"Pinned": "Καρφιτσωμένο",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "Εγγραφή φωνής",
|
||||
"Redirecting you to Open WebUI Community": "Μετακατεύθυνση στην Κοινότητα OpenWebUI",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "Μειώνει την πιθανότητα δημιουργίας ανοησιών. Μια υψηλότερη τιμή (π.χ. 100) θα δώσει πιο ποικίλες απαντήσεις, ενώ μια χαμηλότερη τιμή (π.χ. 10) θα δημιουργήσει πιο συντηρητικές απαντήσεις. (Προεπιλογή: 40)",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Αναφέρεστε στον εαυτό σας ως \"User\" (π.χ., \"User μαθαίνει Ισπανικά\")",
|
||||
"References from": "Αναφορές από",
|
||||
"Refused when it shouldn't have": "Αρνήθηκε όταν δεν έπρεπε",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Ορισμός του αριθμού των νημάτων εργασίας που χρησιμοποιούνται για υπολογισμούς. Αυτή η επιλογή ελέγχει πόσα νήματα χρησιμοποιούνται για την επεξεργασία των εισερχόμενων αιτημάτων ταυτόχρονα. Η αύξηση αυτής της τιμής μπορεί να βελτιώσει την απόδοση σε εργασίες υψηλής συγχρονισμένης φόρτωσης αλλά μπορεί επίσης να καταναλώσει περισσότερους πόρους CPU.",
|
||||
"Set Voice": "Ορισμός Φωνής",
|
||||
"Set whisper model": "Ορισμός μοντέλου whisper",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Ορίζει πόσο πίσω θα κοιτάξει το μοντέλο για να αποτρέψει την επανάληψη. (Προεπιλογή: 64, 0 = απενεργοποιημένο, -1 = num_ctx)",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Ορίζει τον τυχαίο σπόρο αριθμού που θα χρησιμοποιηθεί για τη δημιουργία. Ορισμός αυτού σε έναν συγκεκριμένο αριθμό θα κάνει το μοντέλο να δημιουργεί το ίδιο κείμενο για την ίδια προτροπή. (Προεπιλογή: τυχαίο)",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "Ορίζει το μέγεθος του παραθύρου πλαισίου που χρησιμοποιείται για τη δημιουργία του επόμενου token. (Προεπιλογή: 2048)",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Ορίζει τις σειρές παύσης που θα χρησιμοποιηθούν. Όταν εντοπιστεί αυτό το μοτίβο, το LLM θα σταματήσει να δημιουργεί κείμενο και θα επιστρέψει. Πολλαπλά μοτίβα παύσης μπορούν να οριστούν καθορίζοντας πολλαπλές ξεχωριστές παραμέτρους παύσης σε ένα αρχείο μοντέλου.",
|
||||
"Settings": "Ρυθμίσεις",
|
||||
"Settings saved successfully!": "Οι Ρυθμίσεις αποθηκεύτηκαν με επιτυχία!",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "Προτροπή Συστήματος",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "Προτροπή Γενιάς Ετικετών",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "Η δειγματοληψία Tail free χρησιμοποιείται για να μειώσει την επίδραση των λιγότερο πιθανών tokens από την έξοδο. Μια υψηλότερη τιμή (π.χ., 2.0) θα μειώσει την επίδραση περισσότερο, ενώ μια τιμή 1.0 απενεργοποιεί αυτή τη ρύθμιση. (προεπιλογή: 1)",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "Πατήστε για παύση",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "Ευχαριστούμε για την ανατροφοδότησή σας!",
|
||||
"The Application Account DN you bind with for search": "Το DN του Λογαριασμού Εφαρμογής που συνδέετε για αναζήτηση",
|
||||
"The base to search for users": "Η βάση για αναζήτηση χρηστών",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "Το μέγεθος παρτίδας καθορίζει πόσες αιτήσεις κειμένου επεξεργάζονται μαζί ταυτόχρονα. Ένα μεγαλύτερο μέγεθος παρτίδας μπορεί να αυξήσει την απόδοση και την ταχύτητα του μοντέλου, αλλά απαιτεί επίσης περισσότερη μνήμη. (Προεπιλογή: 512)",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Οι προγραμματιστές πίσω από αυτό το plugin είναι παθιασμένοι εθελοντές από την κοινότητα. Αν βρείτε αυτό το plugin χρήσιμο, παρακαλώ σκεφτείτε να συνεισφέρετε στην ανάπτυξή του.",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Η κατάταξη αξιολόγησης βασίζεται στο σύστημα βαθμολόγησης Elo και ενημερώνεται σε πραγματικό χρόνο.",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Το μέγιστο μέγεθος αρχείου σε MB. Αν το μέγεθος του αρχείου υπερβαίνει αυτό το όριο, το αρχείο δεν θα ανεβεί.",
|
||||
"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 score should be a value between 0.0 (0%) and 1.0 (100%).": "Η βαθμολογία θα πρέπει να είναι μια τιμή μεταξύ 0.0 (0%) και 1.0 (100%).",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Η θερμοκρασία του μοντέλου. Η αύξηση της θερμοκρασίας θα κάνει το μοντέλο να απαντά πιο δημιουργικά. (Προεπιλογή: 0.8)",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "Θέμα",
|
||||
"Thinking...": "Σκέφτομαι...",
|
||||
"This action cannot be undone. Do you wish to continue?": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε να συνεχίσετε;",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Αυτό διασφαλίζει ότι οι πολύτιμες συνομιλίες σας αποθηκεύονται με ασφάλεια στη βάση δεδομένων backend σας. Ευχαριστούμε!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Αυτή είναι μια πειραματική λειτουργία, μπορεί να μην λειτουργεί όπως αναμένεται και υπόκειται σε αλλαγές οποιαδήποτε στιγμή.",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "Αυτή η επιλογή ελέγχει πόσα tokens διατηρούνται κατά την ανανέωση του πλαισίου. Για παράδειγμα, αν οριστεί σε 2, τα τελευταία 2 tokens του πλαισίου συνομιλίας θα διατηρηθούν. Η διατήρηση του πλαισίου μπορεί να βοηθήσει στη διατήρηση της συνέχειας μιας συνομιλίας, αλλά μπορεί να μειώσει την ικανότητα ανταπόκρισης σε νέα θέματα. (Προεπιλογή: 24)",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "Αυτή η επιλογή ορίζει τον μέγιστο αριθμό tokens που μπορεί να δημιουργήσει το μοντέλο στην απάντησή του. Η αύξηση αυτού του ορίου επιτρέπει στο μοντέλο να παρέχει μεγαλύτερες απαντήσεις, αλλά μπορεί επίσης να αυξήσει την πιθανότητα δημιουργίας αχρήσιμου ή άσχετου περιεχομένου. (Προεπιλογή: 128)",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "Αυτή η επιλογή θα διαγράψει όλα τα υπάρχοντα αρχεία στη συλλογή και θα τα αντικαταστήσει με νέα ανεβασμένα αρχεία.",
|
||||
"This response was generated by \"{{model}}\"": "Αυτή η απάντηση δημιουργήθηκε από \"{{model}}\"",
|
||||
"This will delete": "Αυτό θα διαγράψει",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "Γιατί?",
|
||||
"Widescreen Mode": "Λειτουργία Οθόνης Ευρείας",
|
||||
"Won": "Κέρδισε",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "Συνεργάζεται μαζί με top-k. Μια υψηλότερη τιμή (π.χ., 0.95) θα οδηγήσει σε πιο ποικίλο κείμενο, ενώ μια χαμηλότερη τιμή (π.χ., 0.5) θα δημιουργήσει πιο εστιασμένο και συντηρητικό κείμενο. (Προεπιλογή: 0.9)",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "Χώρος Εργασίας",
|
||||
"Workspace Permissions": "Δικαιώματα Χώρου Εργασίας",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "Γράψτε το περιεχόμενο του προτύπου μοντέλου σας εδώ",
|
||||
"Yesterday": "Εχθές",
|
||||
"You": "Εσείς",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Μπορείτε να συνομιλήσετε μόνο με μέγιστο αριθμό {{maxCount}} αρχείου(-ων) ταυτόχρονα.",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Μπορείτε να προσωποποιήσετε τις αλληλεπιδράσεις σας με τα LLMs προσθέτοντας αναμνήσεις μέσω του κουμπιού 'Διαχείριση' παρακάτω, κάνοντάς τα πιο χρήσιμα και προσαρμοσμένα σε εσάς.",
|
||||
"You cannot upload an empty file.": "Δεν μπορείτε να ανεβάσετε ένα κενό αρχείο.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "",
|
||||
"(latest)": "",
|
||||
"{{ models }}": "",
|
||||
"{{COUNT}} hidden lines": "",
|
||||
"{{COUNT}} Replies": "",
|
||||
"{{user}}'s Chats": "",
|
||||
"{{webUIName}} Backend Required": "",
|
||||
@@ -51,6 +52,7 @@
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "",
|
||||
"Advanced Params": "",
|
||||
"All": "",
|
||||
"All Documents": "",
|
||||
"All models deleted successfully": "",
|
||||
"Allow Chat Controls": "",
|
||||
@@ -64,7 +66,7 @@
|
||||
"Allow Voice Interruption in Call": "",
|
||||
"Allowed Endpoints": "",
|
||||
"Already have an account?": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "",
|
||||
"Always": "",
|
||||
"Amazing": "",
|
||||
"an assistant": "",
|
||||
@@ -93,6 +95,7 @@
|
||||
"Are you sure?": "",
|
||||
"Arena Models": "",
|
||||
"Artifacts": "",
|
||||
"Ask": "",
|
||||
"Ask a question": "",
|
||||
"Assistant": "",
|
||||
"Attach file from knowledge": "",
|
||||
@@ -127,6 +130,7 @@
|
||||
"Bing Search V7 Endpoint": "",
|
||||
"Bing Search V7 Subscription Key": "",
|
||||
"Bocha Search API Key": "",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "",
|
||||
"Brave Search API Key": "",
|
||||
"By {{name}}": "",
|
||||
"Bypass Embedding and Retrieval": "",
|
||||
@@ -190,6 +194,7 @@
|
||||
"Code Interpreter": "",
|
||||
"Code Interpreter Engine": "",
|
||||
"Code Interpreter Prompt Template": "",
|
||||
"Collapse": "",
|
||||
"Collection": "",
|
||||
"Color": "",
|
||||
"ComfyUI": "",
|
||||
@@ -208,7 +213,7 @@
|
||||
"Confirm your new password": "",
|
||||
"Connect to your own OpenAI compatible API endpoints.": "",
|
||||
"Connections": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
|
||||
"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Content": "",
|
||||
"Content Extraction Engine": "",
|
||||
@@ -218,9 +223,9 @@
|
||||
"Continue with Email": "",
|
||||
"Continue with LDAP": "",
|
||||
"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 the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
|
||||
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "",
|
||||
"Controls": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
|
||||
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "",
|
||||
"Copied": "",
|
||||
"Copied shared chat URL to clipboard!": "",
|
||||
"Copied to clipboard": "",
|
||||
@@ -245,6 +250,7 @@
|
||||
"Created At": "",
|
||||
"Created by": "",
|
||||
"CSV Import": "",
|
||||
"Ctrl+Enter to Send": "",
|
||||
"Current Model": "",
|
||||
"Current Password": "",
|
||||
"Custom": "",
|
||||
@@ -353,12 +359,13 @@
|
||||
"Embedding model set to \"{{embedding_model}}\"": "",
|
||||
"Enable API Key": "",
|
||||
"Enable autocomplete generation for chat messages": "",
|
||||
"Enable Code Execution": "",
|
||||
"Enable Code Interpreter": "",
|
||||
"Enable Community Sharing": "",
|
||||
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "",
|
||||
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "",
|
||||
"Enable Message Rating": "",
|
||||
"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
|
||||
"Enable Mirostat sampling for controlling perplexity.": "",
|
||||
"Enable New Sign Ups": "",
|
||||
"Enabled": "",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
|
||||
@@ -375,6 +382,7 @@
|
||||
"Enter CFG Scale (e.g. 7.0)": "",
|
||||
"Enter Chunk Overlap": "",
|
||||
"Enter Chunk Size": "",
|
||||
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "",
|
||||
"Enter description": "",
|
||||
"Enter Document Intelligence Endpoint": "",
|
||||
"Enter Document Intelligence Key": "",
|
||||
@@ -389,11 +397,13 @@
|
||||
"Enter Jupyter Token": "",
|
||||
"Enter Jupyter URL": "",
|
||||
"Enter Kagi Search API Key": "",
|
||||
"Enter Key Behavior": "",
|
||||
"Enter language codes": "",
|
||||
"Enter Model ID": "",
|
||||
"Enter model tag (e.g. {{modelTag}})": "",
|
||||
"Enter Mojeek Search API Key": "",
|
||||
"Enter Number of Steps (e.g. 50)": "",
|
||||
"Enter Perplexity API Key": "",
|
||||
"Enter proxy URL (e.g. https://user:password@host:port)": "",
|
||||
"Enter reasoning effort": "",
|
||||
"Enter Sampler (e.g. Euler a)": "",
|
||||
@@ -417,6 +427,7 @@
|
||||
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "",
|
||||
"Enter Tika Server URL": "",
|
||||
"Enter timeout in seconds": "",
|
||||
"Enter to Send": "",
|
||||
"Enter Top K": "",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
|
||||
"Enter URL (e.g. http://localhost:11434)": "",
|
||||
@@ -440,9 +451,13 @@
|
||||
"Example: mail": "",
|
||||
"Example: ou=users,dc=foo,dc=example": "",
|
||||
"Example: sAMAccountName or uid or userPrincipalName": "",
|
||||
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
|
||||
"Exclude": "",
|
||||
"Execute code for analysis": "",
|
||||
"Expand": "",
|
||||
"Experimental": "",
|
||||
"Explain": "",
|
||||
"Explain this section to me in more detail": "",
|
||||
"Explore the cosmos": "",
|
||||
"Export": "",
|
||||
"Export All Archived Chats": "",
|
||||
@@ -566,7 +581,7 @@
|
||||
"Include": "",
|
||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1)": "",
|
||||
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "",
|
||||
"Info": "",
|
||||
"Input commands": "",
|
||||
"Install from Github URL": "",
|
||||
@@ -624,6 +639,7 @@
|
||||
"Local": "",
|
||||
"Local Models": "",
|
||||
"Location access not allowed": "",
|
||||
"Logit Bias": "",
|
||||
"Lost": "",
|
||||
"LTR": "",
|
||||
"Made by Open WebUI Community": "",
|
||||
@@ -764,6 +780,7 @@
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "",
|
||||
"Permissions": "",
|
||||
"Perplexity API Key": "",
|
||||
"Personalization": "",
|
||||
"Pin": "",
|
||||
"Pinned": "",
|
||||
@@ -809,7 +826,7 @@
|
||||
"Reasoning Effort": "",
|
||||
"Record voice": "",
|
||||
"Redirecting you to Open WebUI Community": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
|
||||
"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"References from": "",
|
||||
"Refused when it shouldn't have": "",
|
||||
@@ -918,11 +935,11 @@
|
||||
"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "",
|
||||
"Set Voice": "",
|
||||
"Set whisper model": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
|
||||
"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "",
|
||||
"Sets the size of the context window used to generate the next token. (Default: 2048)": "",
|
||||
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "",
|
||||
"Sets how far back for the model to look back to prevent repetition.": "",
|
||||
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "",
|
||||
"Sets the size of the context window used to generate the next token.": "",
|
||||
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "",
|
||||
"Settings": "",
|
||||
"Settings saved successfully!": "",
|
||||
@@ -964,7 +981,7 @@
|
||||
"System Prompt": "",
|
||||
"Tags Generation": "",
|
||||
"Tags Generation Prompt": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "",
|
||||
"Talk to model": "",
|
||||
"Tap to interrupt": "",
|
||||
"Tasks": "",
|
||||
@@ -979,7 +996,7 @@
|
||||
"Thanks for your feedback!": "",
|
||||
"The Application Account DN you bind with for search": "",
|
||||
"The base to search for users": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory. (Default: 512)": "",
|
||||
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "",
|
||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
||||
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "",
|
||||
"The LDAP attribute that maps to the mail that users use to sign in.": "",
|
||||
@@ -988,14 +1005,14 @@
|
||||
"The maximum file size in MB. If the file size exceeds this limit, the file 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.": "",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
|
||||
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
|
||||
"Theme": "",
|
||||
"Thinking...": "",
|
||||
"This action cannot be undone. Do you wish to continue?": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated. (Default: 128)": "",
|
||||
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
|
||||
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
|
||||
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
|
||||
"This response was generated by \"{{model}}\"": "",
|
||||
"This will delete": "",
|
||||
@@ -1132,7 +1149,7 @@
|
||||
"Why?": "",
|
||||
"Widescreen Mode": "",
|
||||
"Won": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "",
|
||||
"Workspace": "",
|
||||
"Workspace Permissions": "",
|
||||
"Write": "",
|
||||
@@ -1142,6 +1159,7 @@
|
||||
"Write your model template content here": "",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
"You are currently using a trial license. Please contact support to upgrade your license.": "",
|
||||
"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You cannot upload an empty file.": "",
|
||||
|
||||